共计 2690 个字符,预计需要花费 7 分钟才能阅读完成。
一、常用的主机访问控制工具
独立 (stand alone) 守护进程 (httpd,vsftpd)、瞬时(transient) 守护进程(rsync,tftp,telnet), 这两类守护进程都支持基于 iptables 进行控制。哪一端口运行客户端访问,哪一端口不允许客户端访问,基于主机做防火墙时,都能进行控制。
做主机防火墙时,有些瞬时守护进程,甚至是某些独立独立守护进程,还能够接受另一种方式,tcp_wrapper,来控制。
在众多的基于主机的安全访问控制中,tcp-wrapper 是简单而易于配置的一种。
在 linux 下能实现基于主机访问控制的常用工具有三个:iptables、tcp_wrapper、xinetd(超级守护进程)。
二、tcp_wrapper 简介
显而易见,只能控制 tcp 协议下的软件。
一般翻译为 tcp 包装器,能够实现监听在某一 tcp 服务上,对于进出某本主机区访问某一套接字的应用做检查,而且能够实现所谓授权访问。
简单来说,tcpwrapper 本身是一个守护进程,工作于 tcp 协议上。iptables 工作于内核的 tcp/ip 协议栈上,而 tcp_wrapper 工作于内核的 tcp/ip 协议栈的 tcp 协议上,而且是在 tcp 的入口处启动一个进程,监视每一个 tcp 服务的相关请求,同时把这个报文本身跟 tcp_wrapper 的配置文件中的放行规则或拒绝规则中的规则进行对比。若果一旦匹配,则给予放行或拒绝访问。
工作进程为:tcpd
工作在 tcp 包文所要经过的位置上,有且只有一个位置。工作于 tcp 协议层,比工作在网络层的 iptables 更高一层,因此可以和 iptables 结合使用。但 tcp_wrapper 的控制完成之后,iptables 就无需控制了,同理,iptables 控制完成之后,tcp_wrapper 也就无需控制了。二者可以有一个能完成控制就可以了。
iptables 既然能完成工作,为什么还需要 tcp_wrapper 呢?因为 tcp_wrapper 的配置非常简单。
配置文件:/etc/hosts.allow,/etc/hosts.deny
但是并非所有服务都能接受 tcp_wrapper 的控制,事实上,tcp_wrapper 与其说是一个服务,不如说是一个库更合适。因为所有的守护进程,都是工作在用户空间的,所以与其说 tcp_wrapper 是一个守护进程,不如说是一个库更合适。
所有的服务都能接受 iptables 控制,但并非所有都接受 tcp_wrapper 控制。只有用户在开发某个程序时,如果链接到这个库上,或者说依赖于这个库,就意味着他他是接受 tcp_wrapper 控制的。
三、使用 tcp_wrapper 控制
a). 只需将受控制程序名写入配置文件即可实现控制:
允许访问:/etc/hosts.allow
拒绝访问:/etc/hosts.deny
b). 控制原理
程序链接的库文件,会自动在用户访问服务时,基于 tcpd 检测
/etc/hosts.allow、/etc/hosts.deny 两个配置文件,并判断某一主机是否能够访问服务。
c). 匹配机制
1. 先检查 /etc/hosts.allow, 如果被允许,则直接放行;
2. 如果 /etc/hosts.allow 没有匹配项,则检查 /etc/hosts.deny;如果有匹配项则禁止访问;
3. 如果均无匹配,则默认放行。
d). 配置文件语法格式
daemo_list:client_list [:options]
daemon_list:
一定是应用程序名,不是进程名;
如果有多个,则用逗号隔开;
如果匹配所有,则用 ALL;
client_list:
IP 地址:172.16.100.100
主机名称:www.linuxmi.com
网络地址 / 子网掩码:(子网掩码只能使用长格式)
简短格式:
如:172.16. 表示 172.16.0.0/255.255.0.0
[:options]
deny 使在 hosts.allow 中选项 deny
allow 使在 hosts.deny 中选项 allow
这样的机制可以让我们只需写一个配置文件就可以将所有配置搞定
例:vim /etc/hosts.allow
in.telnetd: ALL EXCEPT 172.16.251.105 :deny
spawn 发起执行一条命令,比如:如果有人访问访问服务器,别拒绝了,这通常是一种恶意访问,或非正常访问,就可以使用 spawn echo 一些命令保存至日志中
vim /etc/hosts.allow
in.telnetd: 172.16 EXCEPT 172.16.251.105
vim /etc/hosts.deny
in.telnetd: ALL : spawn echo `date` login attempt from %c to %s >> /var/log/tcp_wrapper.log
%c:user@host
%s:server@host
%h: 客户端主机名
%p: 服务器上的进程 PID
获取完整帮助信息:man 5 hosts_access
注意:echo 的信息无需加引号,否则命令替换不会进行
e).tcp_wrapper 有几个内置的宏(Macro)
用于 client_list 的有:ALL,NONE,UNKNOW(主机名无法解析的地址),
PARANOID(正反向解析不匹配的地址)
用于 daemon_list 的有:ALL
两者都可以都可以用:EXCEPT(排除)
例:vim /etc/hosts.allow
in.telnetd: 172.16. EXCEPT 172.16.251.105
f). 事例
如果我们要定义仅放行某一网段,则定义 /etc/hosts.allow 放行网段,在 /etc/hosts.deny 定义拒绝所有主机。
演示控制:telnet
yum install telnet-server
ldd `which in.telnetd` 没有显示
ldd `which xinetd` 显示有,telnet 自己本身不监听程序,而是由 xinetd 监听,所有它是接受 tcp_wrapper 控制的。
chkconfig telnet on
service xinetd start
ss -tnl | grep 23
仅放行 172.16 网段:
vim /etc/hosts.allow
in.telnetd: 172.16.
vim /etc/hosts.deny
in.telnetd: ALL
不用重启,立即生效,因为工作在内核中的,和 iptables 一样立即生效
总结:
tcp_wrapper 确实非常简单而又易于配置。尤其是控制 ftp 服务时,强烈推荐,因为基于 iptables 的访问控制与 tcp_wrapper 相比,真的太复杂了。