侧边栏壁纸
博主头像
张种恩的技术小栈博主等级

行动起来,活在当下

  • 累计撰写 742 篇文章
  • 累计创建 64 个标签
  • 累计收到 39 条评论

目 录CONTENT

文章目录

使用TCP Wrapper完成基于服务的访问控制

zze
zze
2020-03-02 / 0 评论 / 0 点赞 / 726 阅读 / 4692 字

不定期更新相关视频,抖音点击左上角加号后扫一扫右方侧边栏二维码关注我~正在更新《Shell其实很简单》系列

介绍

TCP Wrapper 是一个为基于 tcp 协议开发并提供服务的应用程序提供的一层访问控制工具,也是一个为 Unix 服务器提供防火墙(firewall)服务的公共领域计算机程序。该程序是由 Wietse Venema 开发的。

TCP Wrapper 程序监视发送进来的包。若外部计算机试图连接,TCP Wrapper就会查看该机器是否具有连接的权限。如果有,那么访问允许。若没有,访问拒绝。该程序可以根据个人用户或网络的需求进行更改。

iptables 与 TCP Wrapper 的对比

这里说到 TCP Wrapper 是一个提供防火墙服务的程序,但它相对 iptables 来说还是有很大不同的:

  • iptables 可以基于 TCP/IP 协议栈中的请求报文进行很精细的控制;
  • TCP Wrapper 是基于库调用实现功能,仅能对基于 tcp 协议开发并调用了相关库提供服务的应用程序提供访问控制;

使用

前面有说到 TCP Wrapper 仅能对调用了相关库并提供服务的应用程序提供访问控制,那么我们怎么判断一个服务程序是否调用了 TCP Wrapper 的相关库呢?

这里的相关库指的是 libwrap.so.0

所以对于动态编译的程序来说,我们可以直接通过 ldd 命令查看它链接的库文件,如果库文件中包含 libwrap.so.0,那么就说明这个程序是可以被 TCP Wrapper 控制的。

而对于静态编译的程序来说,我们需要使用 strings 命令查看其应用程序文件,如果其结果中出现了 hosts.allowhosts.deny 文件,那么就说明这个程序是可以被 TCP Wrapper 进行访问控制的。

因静态编译的程序很少见不好演示,下面我们仅演示一下判断一个动态编译的程序是否可以被 TCP Wrapper 进行访问控制:

$ ldd $(which sshd) | grep libwrap
        libwrap.so.0 => /lib64/libwrap.so.0 (0x00007f6ca4954000)

$ ldd $(which httpd) | grep libwrap

$ ldd $(which vsftpd) | grep libwrap
        libwrap.so.0 => /lib64/libwrap.so.0 (0x00007fd235ccf000)

$ ldd $(which xinetd) | grep libwrap
        libwrap.so.0 => /lib64/libwrap.so.0 (0x00007f7822fc3000)

看如上示例,根据前文所述我们可以判断 sshd、vsftpd、xinetd 服务是可以被 TCP Wrapper 进行访问控制的,而 httpd 不可以。

配置文件

TCP Wrapper 可以在配置文件在为各服务分别定义访问控制规则实现访问控制,有如下两个配置文件:

  • /etc/hosts.allow:定义允许访问的服务;
  • /etc/hosts.deny:定义拒绝访问的服务;

这两个配置文件使用匹配顺序的哦,如下图:

image.png

即先匹配 /etc/hosts.allow 文件,如果匹配到就放行,如果没匹配到就继续匹配 /etc/hosts.deny 文件,如果匹配到就拒绝,如果没匹配到就放行,即如果两个文件的规则都没有匹配到,那么默认就是放行的。

配置文件可有多行,每行定义一条规则语法如下:

daemon_list: client_list [EXCEPT exclude_client_list]... [:option]
	daemon_list:
		可以是应用程序的文件名称,而非服务名哦,如 sshd;
		可以是应用程序文件名称列表,彼此间使用逗号分隔,如 sshd, vsftpd;
		ALL 表示所有服务;

	client_list:
		IP地址;
		主机名;
		网络地址:必须使用完整格式的掩码,不使用前缀格式掩码,所以类似于 10.0.1.0/24 不合法;
		简短格式的网络地址:例如 172.16. 表示 172.16.0.0/255.255.0.0;
		ALL:所有主机;
		KNOWN: 所有可以解析主机名的主机;
		UNKNOWN:所有无法解析主机名的主机;
		PARANOID:所有正反解后的主机名不匹配的主机;

	[EXCEPT exclude_client_list]:
		除了,匹配 client_list 中除 exclude_client_list 以外的主机,可有多个;

	[:options]
		deny:拒绝,用于= hosts.allow 文件,实现 deny 主机的功能;
		allow:允许,用于 hosts.deny 文件,实现 allow 的功能
		spawn command:匹配到访问主机时执行额外命令或启动额外应用程序:
			command 中允许使用宏,常用宏如下:
				%c: 客户端 ip;
				%s: 服务端 ip;
				%d: 应用程序文件名称;

示例

例 1:vsftpd 服务不允许 10.0.1.200 访问。

$ cat /etc/hosts.allow
$ cat /etc/hosts.deny 
vsftpd: 10.0.1.200

例 2:vsftpd 服务仅允许 10.0.1.0/24 网络中主机访问。

$ cat /etc/hosts.allow
vsftpd: 10.0.1.
$ cat /etc/hosts.deny 
vsftpd: ALL

例 3:vsftpd 服务允许除了 10.0.1.210.0.1.0/24 网络中所有主机访问。

$ cat /etc/hosts.allow
vsftpd: 10.0.1. EXCEPT 10.0.1.2
$ cat /etc/hosts.deny 
vsftpd: ALL

例 4:vsftpd 服务仅允许 10.0.1.200 访问。

$ cat /etc/hosts.allow
vsftpd: 10.0.1. EXCEPT 10.0.1.0/24 EXCEPT 10.0.1.200
$ cat /etc/hosts.deny 
vsftpd: ALL

EXCEPT 后的 EXCEPT 会逻辑取反,如上本是不允许 10.0.1.0/24 网络的主机访问,但是后面的一个操作又是对前面范围“除了”的意思,所以 10.0.1.200 就允许访问了。

例 5:vsftpd 服务仅允许 10.0.1.0/24 网络中主机访问。

$ cat /etc/hosts.allow
$ cat /etc/hosts.deny 
vsftpd: ALL EXCEPT 10.0.1.

例 6:vsftpd 服务仅拒绝 10.0.1.200 访问:

$ cat /etc/hosts.allow
vsftpd: 10.0.1.200:deny
$ cat /etc/hosts.deny 

例 7:vsftpd 服务仅允许 10.0.1.200 访问:

$ cat /etc/hosts.allow
$ cat /etc/hosts.deny
vsftpd: 10.0.1.200:allow
vsftpd: ALL

例 8:vsftpd 服务拒绝所有主机访问,将试图访问的信息记录到 /var/log/vsftpd.deny.log

$ cat /etc/hosts.allow
$ cat /etc/hosts.deny
vsftpd: ALL:spawn /bin/echo `date` login attempt from %c to %s, %d >> /var/log/vsftpd.deny.log

# 访问后查看
$ cat /var/log/vsftpd.deny.log
Mon Mar 2 22:49:46 CST 2020 login attempt from 10.0.1.1 to vsftpd@10.0.1.201, vsftpd
0

评论区