TCP_Wrappers介绍
作者:Wieste Venema,IBM,Google
工作在第四层(传输层)的TCP协议
对有状态连接的特定服务进行安全检测并实现访问控制
以库文件形式实现
- 某进程是否接受libwrap的控制取决于发起此进程的程序在编译时是否针对libwrap进行编译的
- 判断服务程序是否能够由tcp_wrapper进行访问控制的方法:
ldd /PATH/TO/PROGRAM|grep libwrap.so
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… ]
- 先来看看一些简单的示例(注意修改的哪个文件):
#允许192.168.1.0/24的主机访问sshd
[root]$ vim /etc/hosts.allow
sshd: 192.168.1.
#拒绝所有访问
[root]$ vim /etc/hosts.deny
sshd: ALL
#仅仅仅仅允许192.168.1.0/24的主机访问sshd
[root]$ vim /etc/hosts.allow
sshd: 192.168.1.
[root]$ vim /etc/hosts.deny
sshd: ALL
#禁止192.168.1.0/24的主机访问telnet和vsftpd服务
[root]$ vim /etc/hosts.allow
vsftpd,in.telnetd: 192.168.1.
Daemon_list@Host: Client_list [ :Options :Option… ]
-
Daemon_list@Host
格式- 单个应用程序的二进制文件名,而非服务名,例如vsftpd
- 以逗号或空格分隔的应用程序文件名列表,如:sshd,vsftpd
ALL
表示所有接受tcp_wrapper控制的服务程序
主机有多个IP,可用@hostIP来实现控制
如:[email protected]
-
Client_list
格式(以逗号或空格分隔的客户端列表)- 基于IP地址:192.168.10.1
- 网络地址:192.168.1. #相当于192.168.1.0/24(CentOS7)
- 基于网络/掩码:192.168.0.0/255.255.255.0
- 基于主机名:www.magedu.com .magedu.com 较少用
- 基于网络组(NIS域):@mynetwork
- 内置变量:ALL,LOCAL,KNOWN,UNKNOWN,PARANOID
-
[:options]
选项:- 帮助:man 5 hosts_options
- deny 主要用在/etc/hosts.allow定义“拒绝”规则
如:vsftpd: 172.16. :deny - allow 主要用在/etc/hosts.deny定义“允许”规则
如:vsftpd:172.16. :allow - spawn 启动一个外部程序完成执行的操作
- twist 实际动作是拒绝访问,使用指定操作替换当前服务,标准输出和ERROR发送到客户端,默认至/dev/null
- EXCEPT用法示例:排除某些内容
#禁止172.16.0.0/16网络访问我,排除172.16.100.0/24和172.16.100.1之外
vsftpd: 172.16. EXCEPT 172.16.100.0/24 EXCEPT 172.16.100.1
测试工具:
-
tcpdmatch [-d] daemon[@host] client
-d
测试当前目录下的hosts.allow和hosts.deny -
示例
sshd: ALL :spawn echo "$(date +%%F) login attempt from %c to %s,%d" >>/var/log/sshd.log
-
说明:
%c
客户端信息
%s
服务器端信息
%d
服务名
%p
守护进程的PID
%%
表示%
vsftpd: 172.16. :twist /bin/echo “connection prohibited”
实战一下
lastb | awk '!/^btmp|^$/{ip[$3]++}END{for(i in ip){if(ip[i]>=4){system("echo sshd:"i">> /etc/hosts.deny")}}}'
实验:
-
实验环境
主机|IP
-|-
host A| 172.16.10.10
host B| 172.16.10.20 -
实验之前我们还验证下sshd服务是否依赖libwrap库
ldd /usr/sbin/sshd | grep libwrap
host A
- 先来试试host A 能不能连接host B
ssh 172.16.10.20
#连接成功
host B
- 编辑配置文件
/etc/hosts.deny
,
[root]$ vim /etc/hosts.deny
sshd:172.16.10.10
host A
- 然后hostA再连接hostB,就会被拒绝了,2个IP都不行
ssh 172.16.10.20
#或
ssh 182.168.88.77
host B
- 来给host B添加一个ip,再修改下配置文件
/etc/hosts.deny
,实现对某个地址的访问控制
ip a a 172.16.10.200 dev eth1
vim /etc/hosts.deny
[email protected]:172.16.10.10
- 还可以控制多个服务,用逗号隔开
vim /etc/hosts.deny
sshd,in.telnetd:172.16.10.10
- EXPECT的用法,排除内容
sshd:172.16.10. EXCEPT 172.16.10.10
- 还有更多的用法
# 禁止172.20.1.开头的所有ip地址
sshd:172.20.1.
#禁止172.20.1.0/24 网段内的所有主机(cnetos7支持此种写法)
ssh:172.20.1.0/24
#禁止172.20.1.0/255.255.255.0网段内的所有地址
ssh:172.20.1.0/255.255.255.0
#禁止所有ip地址
ssh:ALL
#禁止不包含.号的主机名的主机访问
ssh:LOCAL
#禁止所有主机名可以解析的地址
ssh:KNOW
#禁止不能解析的域名主机
ssh:UNKNOW
#禁止域名解析和反解析不匹配的主机
ssh:PARANOID