linux tcp_wrappers 详解
环境信息
- Centos 7
TCP_wrappers
主要是工作在应用层的一个安全工具,使用访问控制列表(ACL
)来防止主机名和主机地址的欺骗,用于过滤对 类 Unix
系统的网络访问。
在一个安全的系统中,Linux
自身具有两层安全的防火墙。第一层是通过 IP/Port 过滤机制的 iptables
来实现,第二层,也就是 TCP_wrappers
了,它主要是通过对系统中的某些服务进行开放与关闭,允许和禁止来有效保证系统安全运行。
可以简单理解为 Linux
系统访问控制的流程:
Client -> iptables -> TCP_wrappers -> Server 的访问控制
- iptables :基于源 IP/端口、目的 IP/端口进行访问控制
- TCP_wrappers:基于服务自身运行情况进行访问控制
- Server:基于服务器本身行为包括文件、目录等权限进行访问控制
TCP_wrappers 的工作原理
TCP_wrappers
通过访问控制列表来提供保护机制,同时依赖 /etc/hosts.allow
和 /etc/hosts.deny
配置文件所设定的规则转交给相应的守护进程进行处理,同时记录请求过程。
TCP_wrappers
在对报文做过滤操作的过程中,会链接到 TCP_wrappers
的函数库, TCP_wrappers
的主要功能是来自于 libwrap.a
这个静态库。
服务是否可以使用 TCP_wrappers
进行安全防护,取决于服务程序在编译时是否针对 libwrap
进行编译,如果库文件中有 libwrap.so
文件,就可以实现访问控制
可以通过下面的命令来确定要过滤的服务是否已经链接到了 libwrap
这个函数库中
ldd /usr/sbin/sshd | grep libwrap |
当客户端的 IP 通过了安全系统中第一层(iptables 防火墙),想要进一步访问服务器资源时,系统就会由 TCP_wrappers
来对请求进行分析处理,根据服务设定的规则来查看这个请求是否存在于 /etc/hosts.allow
列表中,如果存在就接受;如果不存在就继续对比 /etc/hosts/deny
列表,如果存在于 hosts.deny
中就拒绝 IP 请求,反之则接受请求。
判断规则的文件顺序必须严格按照先 hosts.allow
再 hosts.deny
的顺序进行判断。同时,TCP_wrappers
不会缓存 hosts.allow
和 hosts.deny
中的规则,所以针对 hosts.allow
和 hosts.deny
中规则的更改是立即生效的。
TCP_wrappers 的配置
TCP_wrappers
实现防火墙的功能主要是依靠 /etc/hosts.allow
和 /etc/hosts.deny
这两个文件的。/etc/hosts.allow
主要是定义允许访问,/etc/hosts.deny
用来定义拒绝访问。
配置文件中的配置格式如下,格式说明可以参考 man 5 hosts_options
daemon_list[@host] : client_list : option : option ... |
其中:
daemon_list
: 服务名,例如:sshd、vsftpd、sendmail 等,多个服务之间使用逗号分割。client_list
: IP 或 IP 段或主机名。(列表中存在多个服务或者主机的时候用 , 逗号分隔开)option
: 包括对匹配规则的action
, 最主要的有allow
或deny
(这个可以忽略不写)
例如,配置限制 192.168.0.0/16
网段不能 ssh
到本机的 sshd
服务
sshd:192.168. |
如上配置后,指定网段不能 ssh
到本机
配置后有问题,可以查看日志文件 /var/log/secure
,如配置有问题,日志中会记录相关日志
cat /var/log/secure |
配置文件中 daemon_list 常用格式
格式 | 说明 | 示例 |
---|---|---|
ALL |
完全匹配,适配所有接受 TCP_wrappers 防护的服务 |
|
service1 service1,service2 service1@172.16.1.2 |
指定服务 多个服务使用逗号分割 针对本机的某个 ip 做限制 |
sshd,vsftpd:192.168.1.:allow |
配置文件中 client_list 常用格式
格式 | 说明 | 示例 |
---|---|---|
ALL |
完全匹配,适配所有客户端 | |
.HOSTNAME |
适配整个域 | sshd:.csms.tech:allow ,允许 csms.tech 内的所有主机访问 |
192.168. 192.168.0.0/255.255.0.0 192.168.0.0/16 |
适配整个网段,会匹配到 192.168.0.0/16 网段 |
|
172.16. EXCEPT 172.16.100.0/24 |
排除部分客户端 | 172.16. EXCEPT 172.16.100.0/24 EXCEPT 172.16.10.1 |
配置文件中 option 常用格式
格式 | 说明 | 示例 |
---|---|---|
allow |
主要用在 /etc/hosts.deny 定义 允许 规则 |
|
deny |
主要用在 /etc/hosts.allow 定义 拒绝 规则 |
|
spawn |
启动一个外部程序(shell )完成指定的命令 |
|
twist |
替换客户端的请求成我们指定的命令,会导致服务拒绝,即使写在 /etc/hosts.allow |
spawn 示例
在 /etc/hosts.allow
中添加以下内容
sshd: ALL :\ |
以上配置,会在客户端 ssh 登录时记录日志
其中,可以变量包含以下
变量 | 说明 |
---|---|
%a |
客户端的 IP 地址 |
%A |
服务端的 IP 地址 |
%d |
守护进程的名字 |
%h |
客户端的主机名 |
%H |
服务端的主机名 |
%p |
守护进程的 pid |
%u |
客户端的用户名 |
twist 示例
在 /etc/hosts.allow
中添加以下内容
vsftpd: 172.16.0.1 :twist /bin/echo “connection prohibited” |
以上配置会将客户端的请求替换成 twist
指定的命令,因此客户端无法使用指定的服务,即使配置在 /etc/hosts.allow
中