TCP_Wrappers 基於TCP的安全控制
TCP_Wrappers全稱:Transmission Control Protocol(TCP)Wrappers
是一個基於主機的網絡訪問控制表系統,用於過濾對類Unix系統(如Linux或BSD)的網絡訪問。
其能將主機或子網IP地址、名稱及ident查詢回復作為篩選標記,實現訪問控制。
Tcp_Wrappers主要特點
? 工作在第四層(傳輸層)的TCP協議
? 對有狀態連接的特定服務進行安全檢測並實現訪問控制
? 以庫文件形式實現
? 某進程是否接受libwrap的控制取決於發起此進程的程序在編譯時是否針對libwrap進行編譯的
判斷程序是否支持tcp_wrapper
程序如果調用了libwrap.so庫,表示支持。
ldd 程序路徑|grep libwrap.so strings 程序路徑|grep libwrap.so #ldd /usr/sbin/sshd|grep libwrap.so libwrap.so.0 => /lib64/libwrap.so.0 (0x00007f9851678000) #ldd /usr/sbin/vsftpd |grep libwrap.so libwrap.so.0 => /lib64/libwrap.so.0 (0x00007f802ef50000) #strings `which sshd`|grep libwrap.so libwrap.so.0
TCP_Wrappers的使用
TCP Wrappers是通過/etc/hosts.allow和/etc/hosts.deny這兩個配置文件來實現一個類似防火墻的機制。
配置文件
幫助參考:man 5 hosts_access,man 5 hosts_options
配置文件 | 規則定義 |
---|---|
/etc/hosts.allow | 允許訪問規則 |
/etc/hosts.deny | 拒絕訪問規則 |
註意:說明文檔中表示此文件也可以實現拒絕的規則,本著見名知義和管理清晰化的指引,這種寫法不是討論的重點。
語法
daemon_list : client_list [ : shell_command ] daemon_list 單個應用程序的二進制文件名,而不是服務名,如果有多個,用逗號或空格分隔。如sshd,vsftpd 或 sshd vsftpd 可以綁定服務地址,如,[email protected]:ALL ALL表示所有接受tcp_wrapper控制的服務程序 支持通配符 client_list 客戶端列表 ? 基於單個IP地址:192.168.10.1 ? 基於網段IP地址:192.168.1. 註意,192.168.1.0這個寫法是錯誤的。 ? 基於主機名:www.hunk.tech .hunk.tech較少用 ? 基於網絡/掩碼:192.168.0.0/255.255.255.0 ? 基於net/prefixlen: 192.168.1.0/24(僅CentOS7) ? 基於網絡組(NIS 域):@mynetwork ? 內置ACL: ALL 所有(進程或者主機) LOCAL 名稱中不帶點的主機 KNOWN 可以解析的主機名 UNKNOWN 無法解析的主機名 PARANOID 正、反向查詢不匹配或無法解析 支持通配符 shell_command 執行指令 如:sshd:all:spawn echo "`date +%%F-%%T` from %a pid=%p to %s" >> /app/sshd.log EXCEPT是排除的意思,一行規則裏可以有多個,後面的是對前面的結果集進行排除。 vsftpd:172.16. EXCEPT 172.16.100.0/24 EXCEPT 172.16.100.1 匹配整個172.16網段,但是把172.16.100的網段排除,在排除172.16.100網段中又把172.16.100.1的IP給排除。 spawn 啟動一個外部程序完成執行的操作,可以支持內置變量。內置變量請man ,找%的選項 %a (%A) 客戶端IP %c 客戶端信息,可以是IP或主機名(如果能解析) %p 服務器進程信息 (PID) %s 連接的服務端的信息 %% 當規則中包含%時,使用雙%轉義 twist 特殊擴展 以指定的命令執行,執行後立即結束該連接。需在spawn之後使用。
示例
使用的2臺測試主機網絡IP配置如下:
本文中簡稱 | 主機 | IP 1 | IP 2 |
---|---|---|---|
6A | 6-web-1.hunk.tech | 192.168.7.201 | 192.168.5.102 |
7B | 7-web-2.hunk.tech | 192.168.7.202 | 192.168.5.103 |
默認hosts.allow和hosts.deny 配置文件為空,表示全部允許。
#ssh 192.168.7.202
Last login: Thu Feb 8 11:04:58 2018 from 192.168.7.201
拒絕某個IP訪問:
7B:
vim /etc/hosts.deny
sshd:192.168.7.201
6A:
#ssh 192.168.7.202
ssh_exchange_identification: Connection closed by remote host
配置規則保存後,立即生效
7B:日誌會明確記錄
#tail -n1 /var/log/secure
Feb 8 11:18:29 7-web-2 sshd[1811]: refused connect from 192.168.7.201 (192.168.7.201)
那如果一個client_list同時存在於2個文件呢
7B:
tail -n1 /etc/hosts.deny >> /etc/hosts.allow
6A:
#ssh 192.168.7.202
Last login: Thu Feb 8 11:05:33 2018 from 192.168.7.201
看到了吧,是可以允許訪問的,這就涉及到了執行處理機制了。
因此,上面的結果就是允許訪問了。因為在hosts.allow已經匹配了。
僅允許內網IP訪問
假設192.168.7.202是7B的肉網卡地址,那麽規則應該為:
#vim /etc/hosts.deny
[email protected]:ALL
#ssh -b 192.168.7.201 192.168.7.202 > -b 是使用源地址為X.X.X.X訪問
bind: 192.168.7.201: Cannot assign requested address
ssh: connect to host 192.168.7.202 port 22: Cannot assign requested address
把每個ssh登錄日誌記錄到文件
#vim /etc/hosts.allow
sshd:all:spawn echo "`date +%%F-%%T` from %a pid=%p to %s" >> /app/sshd.log
#cat /app/sshd.log
2018-02-08-15:59:53 from 192.168.7.202 pid=2565 to [email protected]
#ps aux |grep 2565
root 2565 0.0 2.3 145696 5328 ? Ss 15:59 0:00 sshd: root@pts/2
應用實例
編寫腳本/root/bin/checkip.sh,每5分鐘檢查一次,如果發現通過ssh登錄失敗次數超過10次,自動將此遠程IP放入Tcp_Wrapper的黑名單中予以禁止防問
#!/bin/bash
#定義 休眠時間
sleeptime=300
#定義 通過ssh登錄失敗次數
num=10
#定義 黑名單文件
file=/etc/hosts.deny
#無限循環
while true;do
#將失敗登錄的記錄逐行讀入變量
lastb | grep ssh|awk -F "[ ]+" ‘{print $3}‘|uniq -c | while read conn ip;do
#判斷失敗次數
if [ "$conn" -ge "$num" ];then
#判斷記錄的IP是否存在
egrep -q ^sshd.*$ip $file
#如果不存在記錄,將追加記錄至指定黑名單文件
[ $? -ne 0 ] && echo "sshd:$ip" >> $file
fi
done
sleep $sleeptime
done
使用watch -n1 cat /etc/hosts.deny來觀察動態文件
總結:TCP_Wrappers
適用於需求簡單的應用場景,並且受到監控軟件的是否支持libwrap.so庫局限。
TCP_Wrappers 基於TCP的安全控制