Linux安全之TCP_Wrappers


纸上得来终觉浅,绝知此事要躬行。

TCP_Wrappers 是一个工作在应用层的安全工具,它只能针对某些具体的应用或者服务起到一定的防护作用。比如说 sshtelnetFTP 等服务的请求,都会先受到 TCP_Wrappers 的拦截。TCP_Wrappers 是基于库调用实现的,包名为 tcp_wrappers-lib

Linux安全之TCP_Wrappers

[root@blog ~]# rpm -ql tcp_wrappers-libs
/usr/lib64/libwrap.so.0
/usr/lib64/libwrap.so.0.7.6

[root@blog ~]# ll /usr/lib64/libwrap.so.0*
lrwxrwxrwx. 1 root root    16 Jul 10 20:22 /usr/lib64/libwrap.so.0 -> libwrap.so.0.7.6
-rwxr-xr-x. 1 root root 42520 Jun 10  2014 /usr/lib64/libwrap.so.0.7.6

1. 机制介绍

了解该功能的实际释放范围和对应配置文件!

TCP WrappersRHEL7 系统中默认启用的一款流量监控程序,它能够根据来访主机的地址与本机的目标服务程序作出允许或拒绝的操作。换句话说,Linux 系统中其实有两个层面的防火墙,第一种是前面讲到的基于 TCP/IP 协议的流量过滤工具,而 TCP Wrappers 服务则是能允许或禁止 Linux 系统提供服务的防火墙,从而在更高层面保护了 Linux 系统的安全运行。

Linux 上防火墙分为,封包过滤机制的 Netfilter程序管控机制的 TCP Wrappers。简单来说,TCP Wrappers 就是通过调整和修改 /etc/hosts.allow/etc/hosts.deny 这两个配置文件来管理控制服务的,但并非所有软件都可以使用。

TCP Wrappers 服务的防火墙策略由两个控制列表文件所控制,用户可以编辑允许控制列表文件来放行对服务的请求流量,也可以编辑拒绝控制列表文件来阻止对服务的请求流量。控制列表文件修改后会立即生效,系统将会先检查允许控制列表文件(/etc/hosts.allow),如果匹配到相应的允许策略则放行流量;如果没有匹配,则去进一步匹配拒绝控制列表文件(/etc/hosts.deny),若找到匹配项则拒绝该流量。如果这两个文件全都没有匹配到,则默认放行流量。

  • 封包过滤机制: 主要是设置软件的防火墙
  • 程序管控机制: 并不是所有的服务都是受 tcp_wrappers 管理的,只用采用 libwrap 库的服务才受管理
# 检查服务是否受管理
$ sudo ldd $(which domainname) | grep libwrap
domainname=sshd httpd smb xinetd
......
# sshd
[root@blog ~]# ldd `which sshd` | grep libwrap.so.0
    libwrap.so.0 => /lib64/libwrap.so.0 (0x00007fc777586000)

# vsftpd
[root@blog ~]# ldd `which vsftpd` | grep libwrap.so.0
    libwrap.so.0 => /lib64/libwrap.so.0 (0x00007fdb8d276000)

# xinetd
[root@blog ~]# ldd `which xinetd` |grep libwrap.so.0
    libwrap.so.0 => /lib64/libwrap.so.0 (0x00007f4ae8036000)

2. 工作原理

大致了解一下,其工作原理和使用技巧!

  • [1] 当有请求从远程到达本机的时候

首先检查 /etc/hosts.allow 文件的规则
如有匹配到的话,就默认允许访问,跳过 /etc/hosts.deny 这个文件的检查
如果没有匹配到,则去匹配 /etc/hosts.deny 文件,如果有匹配的,那么就拒绝这个访问

  • [2] 两个文件均为匹配到

如果在这两个文件中,都没有匹配到,默认是允许访问的

Linux安全之TCP_Wrappers


3. 配置文件

注意介绍,配置文件的编写格式和特点!

  • 文件编写格式
# 服务列表: 如果有多个服务,那么就用逗号隔开
# 地址列表: 标准IP地址(192.168.1.100)、主机名称(www.baidu.com)、利用掩码(只支持长格式)
服务列表:地址列表:选项
daemon_list: client_list1 [EXCEPT client_list2][:options]
  • 【deamon_list】参数

    • 应用程序文件名称 而非服务名
    • 应用程序文件名称列表 彼此间使用逗号或空格分隔
    • All 表示所有服务
  • 【client_list1】参数

    • IP地址
    • 主机名
    • 域名段
      例如.escape.com,即可以匹配db1.escape.com``node1.web.escape.com等。
    • 网络段
      CentOS6 必须使用完整格式的掩码net/mask,如127.16.111.0/255.255.255.0,不能使用net/prefix,如127.16.111.0/24,从 CentOS7 开始,支持使用net/prefix
    • 短格式的网络段
      172.16.,相当于172.16.0.0/255.255.0.0
    • ALL 所有来源主机
    • KNOW 所有能解析到的主机
    • UNKNOW 所有未解析到的主机
    • LOCAL 主机名中不带.
    • PARANOID 正反解析不匹配的地址
  • 【EXCEPT client_list2】参数

    • 除了client_list2的主机之外,client_list1的都匹配
  • 【options】参数

    • deny 拒绝,主要用于hosts.allow文件中,实现 deny 功能
    • allow 允许,主要用在hosts.deny文件中,实现 allow 功能
    • spawn 启动额外应用程序,用的不多
    • twist 无论写在hosts.allow还是hosts.deny都是拒绝,并提示
  • 遵循两个原则

编写拒绝策略规则时,填写的是服务名称,而非协议名称
建议先编写拒绝策略规则,再编写允许策略规则,以便直观地看到相应的效果

  • 配置文件示例
# hosts.allow
sshd:192.168.10.
sshd:192.168.0.1:allow

# hosts.deny
sshd:*
sshd:ALL
  • TCP Wrappers 服务的控制列表文件中常用的参数
客户端类型 示例 满足示例的客户端列表
单一主机 192.168.10.10 IP 地址为 192.168.10.10 的主机
指定网段 192.168.10. IP 段为 192.168.10.0/24 的主机
指定网段 192.168.10.0/255.255.255.0 IP 段为 192.168.10.0/24 的主机
指定 DNS 后缀 .escapelife.site 所有 DNS 后缀为.escapelife.site 的主机
指定主机名称 www.escapelife.site 主机名称为 www.escapelife.site 的主机
指定所有客户端 ALL 所有主机全部包括在内

4. 实例演示

展示常用的服务规则配置!

  • [1] 不允许 172.16.111.100 的 ftp 访问
$ vim /etc/hosts.deny
vsftpd : 172.16.111.100
  • [2] 仅允许 172.16.111.网段的 ftp 访问
$ vim /etc/hosts.allow
vsftpd : 172.16.111.

$ vim /etc/hosts.deny
vsftpd : ALL
  • [3] 仅允许 172.16.111.网段的 ftp 访问,除了 172.16.111.100 外
$ vim /etc/hosts.allow
vsftpd : 172.16.111. EXCEPT 172.16。111.100

$ vim /etc/hosts.deny
vsftpd : ALL
  • [4] 不允许 172.16.111.网段访问 ftp,写在 hosts.allow 里
$ vim /etc/hosts.allow
vsftpd : 172.16.111. : deny
  • [5] 不允许 192.168.111.网段 ssh 来访问,尝试的访问记录,在/var/log/sshd.deny.log 里
$ vim /etc/hosts.deny
sshd: 192.168.111. :spawn echo "`date` login attempt from %c to %s,%d" >> /var/log/sshd.deny.log

# 我们用一台192.168.111.网段的机器ssh访问,可以看到下面结果
$ cat /var/log/sshd.deny.log
Mon Aug 14 17:25:08 CST 2017 login attempt from 192.168.111.100 to [email protected],sshd

# 拒绝192.168.111.网段的ftp访问,并输出提示符。
$ vim /etc/hosts.deny 或者 vim /etc/hosts.allow均可
vsftpd: 192.168.111. :twist /bin/echo "connection refused!!!"

5. 参考链接

送人玫瑰,手有余香!


文章作者: Escape
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Escape !
  目录