使用tcp_wrapper或xinetd對服務的訪問控制
tcp_wrapper及xinetd簡介
我們知道對服務的訪問控制可以使用iptables,這是因為iptables是工作在內核狀態的,它利用幾個控制模塊來控制訪問策略(比如netfilter、nat等)。而tcp_wrapper是一個訪問控制庫,其工作在內核和應用服務之間,也就是說系統在沒有iptables控制的情況下,用戶要想訪問一個加載tcp_wrapper庫的應用服務的話,首先要通過tcp_wrapper來驗證此用戶合不合法,如果不合法則tcp_wrapper會主動禁止此用戶的訪問。
一個服務要起作用,首先要運行此服務對應的二進制程序,運行成功後就在系統中產生一個進程,而進程分為:1、獨立守護進程 2、非獨立守護進程。非獨立守護進程又稱為瞬時守護進程,而瞬時守護進程是需要xinetd的超級守護進程管理才能開啟或關閉。
tcp_wrapper實戰
查看一個應用服務是否受tcp_wrapper來控制用戶對其訪問,可以使用ldd命令來查看,例如產看sshd服務,可以查出其是加載了tcp_wrapper的庫文件libwrap.so,而且是動態鏈接加載這個庫文件。如果一個應用服務在編譯的時候指定加載libwrap.so庫文件的話,用ldd是看不到的,但是這個編譯的應用服務事實上就被tcp_wrapper控制用戶對其訪問了。
[root@linux-node1 ~]# ldd `which sshd` libwrap.so.0 => /lib64/libwrap.so.0 (0x00007fd55061e000)
再比如說xinetd服務也是加載libwrap.so庫文件的,在centos6上安裝telnet-server的話是依賴xinetd,所以安裝telnet-server的時候一並安裝了xinetd,但在centos7上安裝telnet-server的話,默認是不安裝xinetd的,要獨立安裝xinetd服務。下面以centos6為例安裝telnet-server
[root@linux-node1 ~]# yum install telnet-server Installed: telnet-server.x86_64 1:0.17-48.el6 Dependency Installed: xinetd.x86_64 2:2.3.14-40.el6 [root@linux-node1 ~]# ldd `which xinetd` libwrap.so.0 => /lib64/libwrap.so.0 (0x00007f0045a13000)
那麽tcp_wrapper是如何控制加載libwrap.so庫文件的應用服務呢,主要受到下面兩個文件的控制,一個是/etc/hosts.allow,另一個是/etc/hosts.deny
[root@linux-node1 ~]# ll /etc/host* -rw-r--r--. 1 root root 370 Jan 12 2010 /etc/hosts.allow -rw-r--r--. 1 root root 460 Jan 12 2010 /etc/hosts.deny
下面實戰tcp_wrapper來控制用戶訪問telnet服務。啟動telnet服務的話,首先啟動xinetd服務,因為telnet服務這個瞬時進程是受超級守護進程xinetd管理的
[root@linux-node1 ~]# /etc/init.d/xinetd start Starting xinetd: [ OK ] [root@linux-node1 ~]# chkconfig telnet on [root@linux-node1 ~]# netstat -lntup tcp 0 0 :::23 :::* LISTEN 2825/xinetd
要讓tcp_wrapper來控制telnet的訪問,就要配置hosts.allow和hosts.deny文件,編寫格式為:deamon_list: host_list 例如允許192.168.0.0/16網段的主機可以訪問telnet,其他主機訪問拒絕
[root@linux-node1 ~]# vim /etc/hosts.allow in.telnetd: 192.168. [root@linux-node1 ~]# vim /etc/hosts.deny in.telnetd: ALL
還可以對規則上加except參數來排除個別主機。比如允許192.168.0.0/16網段的主機訪問telnet,除了這個網段中的192.168.1.180主機訪問telnet,並且拒絕其他網段的主機訪問。這時候在192.168.1.180主機上使用telnet訪問192.168.1.120主機上的telnet服務將被拒絕。
[root@linux-node1 ~]# vim /etc/hosts.allow in.telnetd: 192.168. expect 192.168.1.180 [root@linux-node1 ~]# vim /etc/hosts.deny in.telnetd: ALL
當然我們還可以在規則中使用spawn參數,這個參數的意思為啟動,可以在這個參數後面跟上一個命令,比如讓用戶登錄telnet成功或失敗後記錄日誌到一個日誌文件中
[root@linux-node1 ~]# vim /etc/hosts.allow in.telnetd: 192.168. except 192.168.1.180 : spawn echo "`date`,login attempt fro m %c to %s" >> /var/log/tcpwrapper.log [root@linux-node1 ~]# vim /etc/hosts.deny in.telnetd:ALL : spawn echo "`date`,login attempt from %h" >>/var/log/tcpwrappe r.log
當客戶端訪問telnet服務後,產生的日誌如下:
[root@linux-node1 ~]# tail /var/log/tcpwrapper.log Thu Mar 15 15:23:00 CST 2018,login attempt from 192.168.1.180 Thu Mar 15 15:23:39 CST 2018,login attempt from 192.168.1.190 to [email protected]
上面訪問控制文件中的參數 %c %s %h這個tcp_wrapper宏定義使用man 5 hosts_access可以查看其含義,還有一些tcp_wrapper可以對hosts.allow hosts.deny文件參數的定義
[root@linux-node1 ~]# man 5 hosts_access %c Client information: user@host, user@address, a host name, or just an address, depending on how much information is available. %h (%H) The client (server) host name or address, if the host name is unavailable. %s Server information: daemon@host, daemon@address, or just a daemon name, depending on how much information is available.
使用tcp_wrapper或xinetd對服務的訪問控制