TCP wrappers
1. 实验介绍
1.1 实验内容
TCP wrappers 作为 Linux 安全系统中的第二层防御措施,为网络安全提供了强大的访问控制的服务,通过本节实验的学习,可以对 TCP wrappers 有全面的认识,也会掌握其中重要的配置文件内容,以及尝试对 TCP wrappers 这个应用层工具的使用。
1.2 实验知识点
- TCP_wrappers 的认识
- TCP_wrappers 的工作原理
- TCP_wrappers 的配置
- TCP_wrappers 的实现
2. TCP_wrappers 的认识
2.1 简介
TCP_wrappers 主要是工作在应用层的一个安全工具,使用访问控制列表(ACL)来防止主机名和主机地址的欺骗,用于过滤对类 Unix 系统的网络访问。
2.2 Linux 安全防火墙
在一个安全的系统中,Linux 自身具有两层安全的防火墙。第一层是通过 IP 过滤机制的 iptables 来实现(后面的实验会着重讲解,iptables 防火墙主要是通过直观地监视系统的运行情况来阻挡网络中的一些恶意攻击,从而保护整个系统的正常运行,保证系统免遭攻击和破坏)。若通过第一层防火墙到达第二层,也就是 TCP_wrappers 了,它主要是通过对系统中的某些服务进行开放与关闭,允许和禁止来有效保证系统安全运行。
可以简单了解下 Linux 系统访问控制的流程:
Client -> iptables -> TCP_wrappers -> Server 的访问控制
说明:
- iptables :基于源 IP/端口、目的 IP/端口进行访问控制
- TCP_wrappers:基于服务自身运行情况进行访问控制
- Server:基于服务器本身行为包括文件、目录等权限进行访问控制
3. TCP_wrappers 的工作原理
3.1 工作原理
TCP_wrappers 通过访问控制列表来提供保护机制,同时依赖 /etc/hosts.allow 和 /etc/hosts.deny 配置文件所设定的规则转交给相应的守护进程进行处理,同时记录请求过程。
TCP_wrappers 在对报文做过滤操作的过程中,会链接到 TCP_wrappers 的函数库,因为 TCP_wrappers 的主要功能就是来自于 libwrap.a 这个静态库。
可以通过下面的命令来确定要过滤的服务是否已经链接到了 libwrap 这个函数库中。
# 下面的 /path 并不是指具体的路径
$ ldd /path/service_name |grep libwrap
# 例如
$ ldd /usr/sbin/sshd | grep libwrap
# 若不知道程序的所在位置可以这样书写
$ ldd $(which sshd) | grep libwrap
3.2 工作流程图
当客户端的 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 中规则的更改是立即生效的。
4. TCP_wrappers 的配置
TCP_wrappers 实现防火墙的功能主要是依靠 /etc/hosts.allow 和 /etc/hosts.deny 这两个文件的。/etc/hosts.allow 主要是定义允许访问,/etc/hosts.deny 用来定义拒绝访问。
可以通过 less 命令先来查看下 /etc/hosts.allow 的配置文件内容。
$ less /etc/hosts.allow
从配置文件中可看到注释中的一个例子(Example),可以看出每条规则中都有一个基本的格式如下,来对网络服务的访问进行控制。
<daemon list>:<client list>:<action>
说明:
- daemon list:服务名,例如:sshd、vsftpd、sendmail 等。
- client list:IP 或 IP 段或主机名。(列表中存在多个服务或者主机的时候用 , 逗号分隔开)
- action:allow 或 deny(这个可以忽略不写)。
5. TCP_wrappers 的实现
例如,通过 TCP_wrappers 来监测主机向 ssh 的守护进程发出连接。验证 TCP_wrappers 在安全系统中的作用。
5.1 验证环境
- 查看本地的 ssh 服务是否开启,保证实验中能够正常使用。
$ ps -ef | grep sshd
可以看到 ssh 守护进程是正在进行的。
- 尝试连接本地 22 号端口。
$ telnet localhost 22
也能成功连接上 22 端口。
- 验证 ssh,密码在旁边工具栏中的 ssh 直连得到。
$ ssh shiyanlou@localhost
- 然后通过 top 命令验证,如果在第一栏出现当前用户是两个,则说明登录成功。
$ top
5.2 修改配置,写入规则
通过上面的验证,保证了 ssh 是没有问题的,那么就可以通过命令来将规则写入到 hosts.deny 文件中。
$ sudo vim /etc/hosts.deny
写入如下的规则
sshd:localhost
保存退出后,可以通过上面的方法再次连接 ssh 服务来验证。
$ ps -ef | grep sshd
$ telnet localhost 22
$ ssh shiyanlou@localhost
可以看出 sshd 没有停止服务,而 telnet 和 ssh 都无法连接了。
5.3 配置文件中的常用通配符
通配符 | 作用 |
---|---|
ALL | 完全匹配,可以用在守护进程列表和客户列表中 |
LOCAL | 名字里不带的主机 |
KNOWN | 与任何带有已知主机名和主机地址匹配 |
UNKNOWN | 与任何带有未知主机名和主机地址匹配 |
PARANOID | 与任何主机名和主机地址不相匹配的主机匹配 |
举例
- 在 /etc/hosts.deny 中加入 sshd:ALL
- 在 /etc/hosts.allow 中加入 sshd:LOCAL
- 验证
可以验证发现 ssh 会成功,而之前在 hosts.deny 中的规则无效,这就是之前提到的 TCP_wrappers 工作流程的顺序原因。
5.4 其他
- 点(.)
+ 主机名以点(.)开始,如果在一个主机名的开始放置一个点,那么就与所有共享这个主机名中列出的相同组成部分的主机匹配。如: `.simplecloud.com` 适用于匹配 `simplecloud.com` 域名内的所有主机。
+ IP 地址以点(.)结束,如果在一个 IP 地址的末尾放置一个点,那么就与最后一个点前同一个网段的所有主机匹配。如:`192.168.` 适用于 `192.168.x.x` 网络内的任何主机。
- 星号(*)
和 shell 中的通配符作用相同,可以使用星号代替 0 个或多个字符。
- IP 地址/子网掩码
控制某个网段的地址的访问。如:192.168.1.0 /255.255.255.0 适用于地址区间从 192.168.1.0 到 192.168.1.255 的所有主机。
- 动作(action)
动作 | 作用 |
---|---|
spwan | 开启一个 shell 执行你指定的命令 |
twist | 替换访问者的请求成我们指定的命令 |
- 尝试动作 spwan
在 hosts.deny 中,可以了解到是谁在试图攻击,想登陆我们的主机,然后可以封掉他的 IP。
常用参数
参数 | 作用 |
---|---|
%a | 客户端的 IP 地址 |
%A | 服务端的 IP 地址 |
%d | 守护进程的名字 |
%h | 客户端的主机名 |
%H | 服务端的主机名 |
%p | 守护进程的 pid |
%u | 客户端的用户名 |
注:在开始下面实验前记得将 /etc/hosts.allow 里面我们前面写的内容注释掉,否则会根据流程顺序使 hosts.deny 中的规则无效。
$ sudo vim /etc/hosts.deny
ALL : localhost \
: spawn (/bin/echo %a from %h attempted to access %d >> \
/var/log/connetions.log) \
: deny
注:spawn 中表示来自主机的客户端 ip 尝试去连接某个守护进程。然后将信息记录到一个日志文件中。
验证
可以看到再次尝试会被阻挡,而日志里会记录攻击信息。
- 尝试动作 twist
sshd:localhost:twist /bin/echo "Hello,attacker! You are prohibited from accessing this service!!"
twist 替换访问者的请求成我们制定的命令
然后通过 telnet 命令来尝试连接:
从输出可以看到已经替换成我们事先设定的内容了。
TCP Wrappers 服务的操作视频:
6. 总结
通过本实验可以初步了解到 TCP wrappers 服务的内容和常用用法,帮助我们更好地理解防火墙的用处。