简介:
TCP_Wrappers工作在第四层(传输层)的安全工具,对有状态连接的特定服务进行安全检测并实现访问控制,对包含有libwrap.so库文件的程序就可以受TCP_Wrappers的安全控制。可以控制谁可以访问,常见的程序有rpcbind、vsftpd、sshd、telnet。
1、说明
Tcp_wrappers是红帽RHEL7系统中默认已经启用的一款流量监控程序、它能够根据来访主机地址与本机目标服务程序做允许或拒绝操作。换句话说,Linux系统中其实有两个层面的防火墙,第一种是前面讲到的基于TCP/IP协议的流量过滤防护工具,而Tcp_wrappers服务则是能够对系统服务进行允许和禁止的防火墙,从而在更高层面保护了Linux系统的安全运行。
2、工作原理
TCP_Wrappers有TCP的守护进程为tcpd,以ssh为例,当有ssh请求连接时,tcpd会截获请求,先读取系统管理员所设置的访问控制文件,符合要求,则会把这次连接请求转给真正的ssh进程,ssh进程完成后续工作,如果这次连接发起的ip不符合访问控制文件中的设置,则会中断连接请求,并拒绝提供ssh服务。
3、使用TCP Wrappers服务访问控制列表生效的前提
sshd服务没有libwrap库文件,就无法实现tcp_wrapper控制,检查是否能支持tcp_wrapper控制关键是需要有libwrap库文件。
查询是否有libwrap库文件:
①若版本号支持,使用ldd $(which sshd)命令,查看sshd有无支持TCP Wrappers提供的libwrap.so函数库文件,查找执行结果里是否有libwrap.so.0=>/usr/lib64/libwrap.so.0这一行,通常应该没有
②ldd查看服务是否支持libwrap:
ldd `which sshd` |grep libwrap
ldd `which vsftpd` |grep libwrap
③strings命令列出服务是否支持libwrap:
strings `which sshd` |grep libwrap
strings `which vsftpd` |grep libwrap
④ldd /usr/bin/sshd |grep libwrap
如果没有就无法实现tcp_wrapper控制,原因是取决于它在编译的时候是否对libwrap库进行了编译,一般是安装的openssh版本太高了导致,openssh 6.7以后版本不再支持TCP Wrappers,可以使用rpm -qa openssh命令查看版本号,如果版本过高,建议卸载后安装较低的版本。网上也可以找支持TCP Wrappers的第三方补丁包。
解决方法:
卸载openssh,卸载命令yum remove openssh。卸载前最好先把openssh的rpm安装包事先放在服务器本地,几低于openssh6.7版本的rpm安装包,否则一旦卸载完并断开连接后,ssh无法使用,会比较麻烦。
先卸载原来高版本的openssh,但是要注意的是在生产环境中否确认卸载高版本,安装低版本,是否存在生产环境中依赖高版本的ssh服务。
rpm -e openssh-6.xp1-1.el7.x86_64.rpm --nodeps
rpm -e openssh-clients-6.xp1-1.el7.x86_64.rpm --nodeps
rpm -e openssh-server-6.xp1-1.el7.x86_64.rpm --nodeps
使用rpm -ivh命令重新安装openssh低于6.7版本的软件。然后使用systemctl sshd start命令启动sshd服务
rpm -ivh openssh-6.xp1-1.el7.x86_64.rpm openssh-clients-6.xp1-1.el7.x86_64.rpm openssh-server-6.xp1-1.el7.x86_64.rpm --nodeps --force
再次查找sshd是否支持libwrap
ldd `which sshd` |grep libwrap
ldd `which vsftpd` |grep libwrap
ldd /usr/bin/sshd |grep libwrap
ldd $(which sshd)
重启sshd服务,查看ssh的版本
systemctl restart sshd
ssh -V
4、控制列表文件(/etc/hosts.allow、/etc/hosts.deny)修改后会立即生效,系统将会先检查允许策略规则文件(/etc/hosts.allow),如果匹配到相应的允许策略则直接放行请求,如果没有匹配则会去进一步匹配拒绝策略规则文件(/etc/hosts.deny)的内容,有匹配到相应的拒绝策略就会直接拒绝该请求流量,如果两个文件全都没有匹配到的话也会默认放行这次的请求流量。
示例系统服务 | 客户端类型 | 示例 | 满足示例的客户端列表 |
sshd | 单一主机 | 192.168.8.1 | ip地址为192.168.8.1的主机 |
sshd | 指定网段 | 192.169.8. | ip段为192.168.8.0/24的主机 |
sshd | 指定网段 | 192.168.8.0/255.255.255.0 | ip段为192.168.8.0/24的主机 |
指定DNS后缀 | .baidu.com | 所有DNS后缀为.baidu.com的主机 | |
指定主机名称 | www.baidu.com | 主机名称为www.baidu.com的主机 | |
sshd | 指定所有客户端 | ALL | 所有主机全部包括在内 |
注意!!!
在配置Tcp_wrappers服务前需要注意:
1.在写禁止项目时候一定要写上服务名称,而不是某种协议名称
2.建议先写拒绝规则(/etc/hosts.deny),再编写允许规则(/etc/hosts.allow)
5.TCP_Wrappers使用
TCP_Wrappers使用主要是两个配置文件/etc/hosts.allow、/etc/hosts.deny用于接收和拒绝TCP_Wrapers控制全的程序,可使用man帮助查看(man 5 hosts_access, man 5 hosts_options)
配置/etc/hosts.allow、/etc/hosts.deny两个文件
语法为:daemon_list@host: client_list [:options :options....]
deamon_list:是程序的列表,可以是多个,是多个时,用,隔开
@host:可以没有,是我们的限制的网卡访问接口(自己的),设置允许或禁止别人从自己那个网口进入。这项不写,代表全部。
clients_list:访问者地址,如果需要控制用户很多,可以私用空格或,隔开
基于IP地址:192.168.8.1 192.168.8.
基于主机名:www.hedge.com .hedge.com较少用
基于网络/掩码:192.168.0.0/255.255.255.0
基于net/prefixlen:192.168.8.0/24(CentOS7)
基于网络组(NIS域):@mynetwork
内置ACL:ALL,LOCAL,KNOWN,UNKNOWN、PARANOID
ALL:所有主机
LOCAL:本地主机
KNOWN:主机名可解析为IP的
UNKNOWN:主机名无法解析为IP的
PARANOID:正向解析与反向解析不对应的主机
如:三台虚拟机示例:
CentOS7:192.168.1.1
CentOS6:192.168.1.2
CentOS5:192.168.1.3
示例1:
CentOS6拒绝CentOS7的ssh访问:
在centos6中可在/etc/hosts.deny中配置:
sshd@192.168.1.2:192.168.1.1
这样配置后,CnetOS7就无法ssh连接CentOS6了
示例2:
或者可以在centos6这样写(hosts.deny),即使用ssh,或者telnetd访问这个机器都是无法访问的,然后,我们就可以在hosts.allow中添加如下一行:
/etc/hosts.deny配置
in.telnetd,sshd:ALL
/etc/hosts.allow配置
sshd:192.168.1.2
这样配置后,CnetOS7就可以ssh连接CentOS6了
连接过程中,对方机器会按照顺序先检查/etc/hosts.allow,再检查/etc/hosts.deny。如果在allow中允许连接,就可以连接,即便是又在deny中添加了也可以连接,但是在allow中没有添加你的机器,在deny中设置了你的主机无法连接,那是无法连接上对方主机的。
示例3:
可以禁止后允许某个网段进行连接,以禁止为例:在centos6中的hosts.deny配置
即192.168.36.网段所有机器无法通过sshd这个连接程序访问到我的机器
in.telnetd,sshd@192.168.1.2:192.168.36.
示例4:
使用一个关键连词,EXCEPT,hosts.deny文件配置:
in.telnetd,sshd:ALL
hosts.allow文件配置如下:
sshd:192.168.1. EXCEPT 192.168.1.1
此时,cnetos7是不能访问centos6的,因为虽然在hosts.allow文件中设置了整个192.168.1.这个网段可以访问,但是使用了EXCEPT关键字将192.168.1.1排除了,所以centos7是不能访问centos6的
重写写一下hosts.allow文件:
sshd:192.168.1. EXCEPT 192.168.1.
再使用CentOS5和CentOS7连接CentOS6,是无法连接的,因为允许里面虽然允许了192.168.1.但是也排除了192.168.1.所以无法连接。
一些选项:
man 5 hosts_options查看更多使用方法
deny用在/etc/hosts/allow定义'拒绝'规则
如:vsftpd:192.168.:deny
allow用在/etc/hosts/deny定义'允许规则'
如:vsftpd:192.168.:allow
spawn启动一个外部程序完成执行的操作
twist实际动作是拒绝访问,使用指定的操作替换当前服务,标准I/O和ERROR发送到客户端默认至/dev/null
示例1:
在hosts.allow拒绝连接:
sshd:192.168.1.2:deny
虽然在hosts.allow文件中添加可用规则,但是使用了:deny,即将该地址拒绝掉。CentOS7访问不了CentOS6
示例2:
在hosts.deny拒绝连接:
sshd:192.168.1.2:allow
虽然在hosts.deny文件中添加可用规则,但是使用了:allow,即允许该地址访问ssh服务。CentOS7可以访问CentOS6
示例3:
使用spawn启用外部命令,就可以使用外部命令写日志文件
在hosts.allow中:
sshd,in.telnetd:192.168.111.:spawn echo "`date +'%%F %%T'` login from client\: %c to %d">>/var/log/tcpwrap.log
使用CentOS7访问CentOS6后,查看日志
tail /var/log/tcpwrap.log
在/etc/hosts.allow中添加,允许登录,并记录日志
在/etc/hosts.deny中添加,拒绝登录, 并记录日志
%c 客户端信息
%s 服务器端信息
%d 服务名
%p 守护进程的PID
%% 代表%
: 符号转译
示例4:
使用twist拒绝用户访问,并返回一个信息
sshd,in.telnetd:192.168.111.:twist echo "Hello I am T_T !"
输入命令ssh -V 192.168.1.1可以查看
调试工具:
tcpdmatch [-d] daemon[@host] client -d 测试当前目录下的 hosts.allow和hosts.deny,在别人没连接时候,可以知道我们设置的那些IP是否可以连接我们的主机
如:tcpdmatch -d ssh 192.168.1.2