1. 程式人生 > >使用tcp_wrapper或xinetd對服務的訪問控制

使用tcp_wrapper或xinetd對服務的訪問控制

ddr exp exce 驗證 動態 xinetd服務 mon sta 主機

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對服務的訪問控制