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
libwrap.so.0 => /lib64/libwrap.so.0 (0x00007f283cdf1000)

当客户端的 IP 通过了安全系统中第一层(iptables 防火墙),想要进一步访问服务器资源时,系统就会由 TCP_wrappers 来对请求进行分析处理,根据服务设定的规则来查看这个请求是否存在于 /etc/hosts.allow 列表中,如果存在就接受;如果不存在就继续对比 /etc/hosts/deny 列表,如果存在于 hosts.deny 中就拒绝 IP 请求,反之则接受请求。

判断规则的文件顺序必须严格按照先 hosts.allowhosts.deny 的顺序进行判断。同时,TCP_wrappers 不会缓存 hosts.allowhosts.deny 中的规则,所以针对 hosts.allowhosts.deny 中规则的更改是立即生效的。

TCP_wrappers 的配置

TCP_wrappers 实现防火墙的功能主要是依靠 /etc/hosts.allow/etc/hosts.deny 这两个文件的。/etc/hosts.allow 主要是定义允许访问,/etc/hosts.deny 用来定义拒绝访问。

配置文件中的配置格式如下,格式说明可以参考 man 5 hosts_options

/etc/hosts.allow
daemon_list[@host] : client_list : option : option ...

其中:

  • daemon_list : 服务名,例如:sshd、vsftpd、sendmail 等,多个服务之间使用逗号分割。
  • client_list : IP 或 IP 段或主机名。(列表中存在多个服务或者主机的时候用 , 逗号分隔开)
  • option : 包括对匹配规则的 action, 最主要的有 allowdeny(这个可以忽略不写)

例如,配置限制 192.168.0.0/16 网段不能 ssh 到本机的 sshd 服务

/etc/hosts.deny
sshd:192.168.

如上配置后,指定网段不能 ssh 到本机

配置后有问题,可以查看日志文件 /var/log/secure,如配置有问题,日志中会记录相关日志

$ cat /var/log/secure
sshd[7699]: error: /etc/hosts.allow, line 12: bad option name: "%d""

配置文件中 daemon_list 常用格式

格式 说明 示例
ALL 完全匹配,适配所有接受 TCP_wrappers 防护的服务
service1
service1,service2
[email protected]
指定服务
多个服务使用逗号分割
针对本机的某个 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 中添加以下内容

/etc/hosts.allow
sshd: ALL :\
spawn echo $(date +%%F) login attempt from %c to %s,%d >>/var/log/sshd.log

以上配置,会在客户端 ssh 登录时记录日志

其中,可以变量包含以下

变量 说明
%a 客户端的 IP 地址
%A 服务端的 IP 地址
%d 守护进程的名字
%h 客户端的主机名
%H 服务端的主机名
%p 守护进程的 pid
%u 客户端的用户名
twist 示例

/etc/hosts.allow 中添加以下内容

/etc/hosts.allow
vsftpd: 172.16.0.1 :twist /bin/echo “connection prohibited”

以上配置会将客户端的请求替换成 twist 指定的命令,因此客户端无法使用指定的服务,即使配置在 /etc/hosts.allow

参考链接

TCP wrappers

TCP_Wrappers