简介
- 作者:Wieste Venema,IBM,Google
- 工作在第四层(传输层)的TCP协议
- 对有状态连接的特定服务进行安全检测并实现访问控制以库文件形式实现
- 某进程是否接受libwrap的控制取决于发起此进程的程序在编译时是否针对libwrap进行编译的
- 判断服务程序是否能够由tcp_wrapper进行访问控制的方法:ldd /usr/sbin/rpcbind
工作原理
TCP_Wrappers有一个TCP的守护进程叫作tcpd。以ssh为例,每当有ssh的连接请求时,tcpd即会截获请求,
先读取系统管理员所设置的访问控制文件,符合要求,则会把这次连接原封不动的转给真正的ssh进程,由ssh完成后续工作;
如果这次连接发起的ip不符合访问控制文件中的设置,则会中断连接请求,拒绝提供ssh服务。
TCP_Wrappers的使用
- 配置文件:/etc/hosts.allow(白名单), /etc/hosts.deny(黑名单)
- 帮助参考:man 5 hosts_access,man 5 hosts_options
- 检查顺序:hosts.allow,hosts.deny(默认允许)
- 注意:一旦前面规则匹配,直接生效,将不再继续
- 基本语法:
- daemon_list@host: client_list [ :options :option… ]
- Daemon_list@host格式
- 单个应用程序的二进制文件名,而非服务名,例如vsftpd
- 以逗号或空格分隔的应用程序文件名列表,如:sshd,vsftpd
- ALL表示所有接受tcp_wrapper控制的服务程序,如sshd:ALL
- 主机有多个IP,可用@hostIP来实现控制
如:in.telnetd@192.168.0.254
客户端Client_list格式
- 以逗号或空格分隔的客户端列表
- 基于IP地址:192.168.10.1 192.168.1.
- 基于网络/掩码:192.168.0.0/255.255.255.0(centos6)
- 基于net/prefixlen: 192.168.1.0/24(centos7)
- 基于网络组(NIS 域):@mynetwork
- 内置ACL:ALL,LOCAL,KNOWN,UNKNOWN,PARANOID
EXCEPT用法:
示例:
vsftpd: 172.16. EXCEPT 172.16.100.0/24 EXCEPT 172.16.100.1
帮助:man 5 hosts_options
deny 主要用在/etc/hosts.allow定义“拒绝”规则
如:vsftpd: 172.16. :deny
allow 主要用在/etc/hosts.deny定义“允许”规则
如:vsftpd:172.16. :allow
spawn 启动一个外部程序完成执行的操作
sshd: ALL :spawn echo "$(date +"%%F %%T") login attempt from %c to%s,%d" >>/var/log/tcpwrapper.log
twist 实际动作是拒绝访问,使用指定操作替换当前服务,标准输出和ERROR发送到客户端,默认至/dev/null
在/etc/hosts.allow中添加,允许登录,并记录日志
在/etc/hosts.deny中添加,拒绝登录,并记录日志
%c 客户端信息
%s 服务器端信息
%d 服务名
%p 守护进程的PID
%% 表示%
注意:如果/etc/hosts.deny(黑名单)和/etc/hosts.allow(白名单) 两个文件中都有同一个IP地址,allow配置文件优先级高,会允许当前的文件访问,两个配置文件中输入IP地址后,通过ssh连接的IP地址会先在allow文件中查看,如果有,就会连接,没有,然后去再deny去查,如果有,会被拒绝,如果没有,也会通过ssh连接。
示例一:
在/etc/hosts.deny 输入对方的IP地址,会ssh连接时就会被拒绝连接。
[root@centos6aide]#ssh 192.168.34.101 连接过程会被拒绝
ssh_exchange_identification: Connection closed by remote host
示例二:
在/etc/hosts.deny配置文件中写入:
也可以输入一个网段,将一个网段进行禁止ssh远程连接,centos6格式必须写成:192.168.34.0/255.255.255.0(必须输入写成子网掩码形式)
而centos7上可以写成192.168.34.0/24(可以写成CIDR表示法)
可以通过man hosts_access 帮助查看具体使用细节.
示例三:
hosts.deny文件里边还可以设置一些特定的连接方式拒绝登陆:
in.telnetd,sshd:192.168.34.100 含义用telnet连接的IP地址为100的用户被拒绝。
示例四:
在/etc/hosts.deny配置文件中写入:
in.telnetd,sshd@192.168.34.100: 192.168.34.200 含义就是通过192.168.34.100地址来访问200IP的地址被禁止,可以单独设置一个IP被禁止访问当前的IP地址。
[root@centos6aide]#telnet 192.168.34.101
Trying 192.168.34.101...
telnet: connect to address 192.168.34.101: Connection refused
示例五:
EXCEPT使用方法:
在/etc/hosts.deny配置里边写入:
禁止192.168.0.0网段的地址,不禁止192.168.34.0的网段,但禁止192.168.34.100的IP地址。
in.telnetd,sshd:192.16. EXCEPT 192.168.34.0 EXCEPT 192.168.34.100
示例六:
在/etc/hosts.allow输入以下IP地址:
in.telnetd: 192.168.34. 连接telnet的IP地址在此IP地址网段的才能连接,其他地址都无法连接。
示例七:
spawn 启动一个外部程序完成执行的操作
sshd: ALL :spawn echo "$(date +"%%F %%T") login attempt from %c to%s,%d" >>/var/log/tcpwrapper.log 在/etc/hosts.allow配置文件中修改,系统各外部服务器执行的动作结果,然后存放到tcpwrapper.log文件中
ssh 192.168.34.100
[root@centos6aide]#tail /var/log/tcpwrapper.log
2019-10-25 22:12:40 login attempt from 192.168.34.101 tosshd@192.168.34.100,sshd
示例八:
在 /etc/hosts.deny配置文件中写入:
sshd: 192.168.34.100 :allow 相当于是允许连接当前IP地址
在/etc/hosts.deny配置文件中写入:
sshd: 192.168.34.101: deny 相当于是拒绝此IP地址的连接
示例九:
twis使用方法:
centos6输入:sshd: 192.168.34. :twis /bin/echo "403 forbidden" 在被拒绝登陆后会在客户端提示拒绝登陆信息。
[root@centos7~]#telnet 192.168.34.100 centos7进行连接
Trying 192.168.34.100...
Connected to 192.168.34.100.
Escape character is ‘^]‘.
403 forbidden 被拒绝提示结果
Connection closed by foreign host.
测试工具:
tcpdmatch [-d] daemon[@host] client
-d 测试当前目录下的hosts.allow和hosts.deny
mkdir /data/test 新建一个文件夹,
然后在hosts.allow和hosts.deny两个配置文件中分别写入数据进行测试验证是否存在问题。
cd test
vim host.deny
sshd: ALL
vim hosts.allow
sshd: 192.168.34.101
开始测试,最终结果就是允许连接:
[root@centos6test]#tcpdmatch -d sshd 192.168.34.100
client: address 192.168.34.100
server: process sshd
access: granted