另一種訪問控制機制TCP Wrappers
TCP Wrappers
在之前的文章中我們介紹過iptables,iptables也是一種訪問控制機制。由於iptables中的引數過多,對於初學者要想完全掌握iptables有一定的難度。因此,在這裡我們介紹另一種簡單的訪問控制機制,就是TCP Wrappers。
TCP Wrappers的工作原理主要是分析TCP的報頭資訊,並與/etc/hosts.allow和/etc/hosts.deny中的規則進行匹配,從而決定哪些主機可以訪問系統服務或資源。
TCP Wrappers雖然能對TCP協議的報文做過濾動作,但是並不是所有的TCP協議報文TCP Wrappers都可以過濾掉。只有某個服務連結到TCP Wrappers的函式庫(這個函式庫叫做libwrap.so)才可以使用TCP Wrappers進行報文過濾。
檢視某個服務是否連結到libwrap.so這個動態函式庫,使用如下命令檢視即可:
ldd $(which 服務名稱)或ldd `which 服務名稱`
例如:檢視sshd這個服務是否連結到了libwrap.so這個服務,可以使用如下命令:
ldd $(which sshd) | grep 'libwrap'
當然有些服務沒有連結到這個動態函式庫,TCP Wrappers也可以對它們進行匹配處理。原因是TCP Wrappers的這個函式庫被直接編譯到這個服務或程式裡面去了。所以有些服務也支援TCP Wrappers。
要檢視TCP Wrappers的函式庫是否被直接編譯進某個程式,使用如下命令即可:
string `which 服務名稱` | grep hosts
如果出現如下兩行,表示TCP Wrappers函式庫被直接編譯進某個程式裡了。
/etc/hosts.allow
/etc/hosts.deny
這兩個檔案就是TCP Wrappers匹配規則時用到的檔案,出現這兩個檔案表示該服務支援TCP Wrappers。
TCP Wrappers匹配TCP報文的流程:
1、當客戶端訪問伺服器端的某個服務時,TCP Wrappers會將該請求報文與/etc/hosts.allow中定義的規則進行匹配;匹配成功,則允許訪問伺服器的某個服務;
2、如果匹配不成功,在與/etc/hosts.deny中定義的規則進行匹配;如果匹配成功,則拒絕訪問某服務。
3、如果匹配沒有成功,則執行預設策略,就是允許該客戶端訪問某服務
/etc/hosts.allow和/etc/hosts.deny的語法格式:
這兩個檔案的語法格式是一樣的,語法格式為:
daemon_list: client_list [:options]
這裡的daemon_list可以是某一個服務的可執行程式的二進位制檔名稱或其服務列表,或者使用ALL也可以。
其中ALL是一個巨集變數,表示所有的服務或程序
client_list:可以是單個IP,NETWORK/MASK、HOSTNAME、巨集變數
IP:表示某一個具體的地址
NETWORK/MASK中的掩碼必須不能使用長度的格式,例如10.0.0.0/8是不正確的,必須是10.0.0.0/255.0.0.0
如果某個網段是標準的A,B,C類網段,可以這麼寫,以B類地址為例:172.16.
HOSTNAME:可以是符合FQDN格式的主機名,也可以是domain,域名前面要加'.',例如:.baidu.com
巨集變數:
ALL:表示所有的ip或主機
LOCAL:表示與本機IP在同一個網段內的主機
UNKOWN:表示FQDN格式的主機不能被正向解析
KNOWN:表示FQDN格式的主機名可以被正向解析
PARANOID:表示主機名正向解析和反向解析無法匹配
EXCEPT:除了,不包含的意思。
options:這個欄位可以省略,options的選項有如下幾個:
allow:表示允許,如果這個選項出現在/etc/host.deny檔案中也表示允許的意思
deny:表示拒絕,如果這個選項出現在/etc/hosts.allow檔案中,也表示是拒絕的意思。
spawn:表示立即執行其後的語句,通常用來記錄某個客戶端訪問某服務的資訊
這些規則如果寫入到/etc/hosts.allow表示允許訪問的意思;寫在/etc/hosts.deny中的表示拒絕訪問的意思。預設策略為允許訪問。
例項一:僅允許sshd這個服務被192.168.108.251訪問,並將訪問的資訊記錄下來
解決方法:
#vim /etc/hosts.allow
sshd: 192.168.108.251: spawn echo "%c want to access to %s,`date`" >> /var/log/tcp_wrappers.log
在編輯/etc/hosts.deny
#vim /etc/hosts.deny
sshd:ALL
###當192,168.108.251使用sshd服務時,日誌資訊如下:
[[email protected] ~]# tail /var/log/tcp_wrappers.log
192.168.108.15 want to access [email protected] ,Wed Nov 5 07:24:43 CST 2014
例項二:除了192.168.108.251不使用telnet服務外,其他主機都可以訪問
解決方法:
#vim /etc/hosts.allow
in.telnetd: EXCEPT 192.168.108.251: spawn echo "%h want to access to %p ,`date`"
#vim /etc/hosts.deny
in.telnetd: ALL
在這裡注意的是這裡的服務名稱是該服務的二進位制檔名稱,telnet-server的二進位制可執行檔案為/usr/sbin/in.telnetd,因此這裡的服務名稱為in.telnetd
在這裡還要說明一點:in.telnetd這個服務是瞬時守護程序,瞬時守護程序是由超級守護程序(xinetd)代為管理的,由於超級守護程序接受TCP Wrappers的控制,因此瞬時守護程序也接受TCP Wrappers的控制。
在這裡介紹幾個TCP Wrappers中的巨集變數:
%c和%h:顯示客戶端的ip地址
%s:顯示服務名稱和ip,以[email protected]的形式顯示
%p:顯示daemon的PID
更多的TCP Wrappers巨集變數可以使用如下命令檢視:
#man 5 hosts_access
轉載於:https://blog.51cto.com/xslwahaha/1571793