邁向 RHCE 之路 (Day21) - 主機基礎安全防護 TCP Wrappers


前言

在 CentOS 主機中,我們可以利用許多機制來保護主機服務。IPTables 防火牆功能強大,是安全防護選項之一,但本文中並不打算講解有關 IPTables 防火牆設定,而是要介紹另一個設定簡單,有一定保護程度的安全機制 「TCP Wrappers」達到保護 SSH 遠端連線服務的效果。此服務與系統內的 xinetd 服務有很深的關聯, RedHat 官網 Security Guide - 2.3. TCP Wrappers and xinetd 中示意圖便清楚表達了當網路封包進入 CentOS 主機時,Firewall、TCP Wrappers 及 xinetd 服務的封包走向關係圖。




圖片來源: RedHat 官網 Security Guide - 2.3. TCP Wrappers and xinetd

預設情況下,TCP Wrappers 在安裝 CentOS 主機過程中便已安裝完成。而顧名思義,此安全防護機制僅能保護 TCP daemon 而無法保護 UDP daemon(除此之外仍有例外狀況)。相信您會接著問,那 TCP Wrappers 能夠保護主機上哪些服務項目呢? 答案是,只要該 服務中含有 libwrap 函式庫 (Library),即可受到 TCP Wrappers 保護。經由下列操作,我們便可了解如何檢查該服務內是否含有 libwrap 函式庫。如下所示,我們可以看到 SSH 服務 (sshd) 含有 libwrap 函式庫,而 Apache 服務 (httpd) 則沒有包含 libwrap 函式庫。所以雖然都是 TCP daemon ,但 TCP Wrappers 可以保護 SSH 服務,而無法保護 Apache 服務。
#ldd /usr/sbin/sshd | grep libwrap            //查詢 SSH 服務是否含有 libwrap 函式庫
  libwrap.so.0 => /lib/libwrap.so.0 (0x0020c000)  //SSH 服務可被 TCP Wrappers 保護
#ldd /usr/sbin/httpd | grep libwrap          //查詢 Apache 服務是否含有 libwrap 函式庫
#                                                 //查詢到 libwrap 函式庫 Apache 服務無法被保護

接著要說明的是 TCP Wrappers 的保護規則。在安全防護設定上,TCP Wrappers 非常簡單易懂,不像防火牆設定那麼複雜。其安全防護規則採用 First Match 方式,意即先讀取到的規則直接套用執行後,便不需要理會後面的規則。

TCP Wrappers 的防護規則分為 「/etc/hosts.allow」 及 「/etc/hosts.deny」 二個設定檔。這二個設定檔中,首先讀取的設定檔為 hosts.allow,若此設定檔中有設定服務名稱,則允許封包通過,接著讀取 hosts.deny 則為禁止封包通過。筆者建議僅設定 「/etc/hosts.allow」 設定檔便可達到防護效果。

在修改 TCP Wrappers 保護規則設定檔 (/etc/hosts.allow) 以前,我們先了解設定檔的內容及相關參數的意義。設定檔內容可以分成三個小區段來看,分別是「服務名稱 (deamon)、來源 IP 位址或網域名稱 FQDN、連線回應為允許 (allow) 或拒絕 (deny)」。每個小區段之間使用冒號 (:) 作為分隔符號,在前面二個小區段中並支援相關進階參數,使保護規則運作更靈活。但是,若使用 KNOWN、UNKNOWN、PARANOID 參數時,請注意此三個參數是依靠 DNS 名稱解析服務,因此必須要注意主機上的 DNS 名稱解析是否運作正常,相關進階參數說明如下:
  • ALL: 表示 「全部 」,用於第一個小區段(服務名稱欄位)表示全部服務,用於第二個小區段(連線來源)表示全部的 IP 位址或網域名稱 FQDN。
  • LOCAL: 表示「本機」,也就是不含點 (.) 的主機名稱例如 localhost。
  • KNOWN: 表示「可解析主機」,也就是可以解析其 IP 位址及網域名稱 FQDN。
  • UNKNOWN: 表示「無法解析主機」,也就是無法解析其 IP 位址及網域名稱 FQDN。
  • PARANOID: 表示「正反解析必須一致」,也就是 DNS 正解(FQDN 解析 IP 位址)及 DNS 反解(IP 位址解析 FQDN)二者的解析記錄必須一致。
  • EXCEPT: 表示「排除」的意思,例如允許 192.168.1.0 這個網段的所有主機,但排除 192.168.1.99 這個 IP 位址。

在設定之前,還有三個小地方要提醒讀者注意。首先是來源 IP 網段的遮罩設定值,TCP Wrappers 支援的網路遮罩 為 255.255.255.0 這種型式,而不是 /24 這種 CIDR 表示方法。若您設定 /24 這種網路遮罩,則該行防護設定規則將無法運作(但若是來源位址使用 IPv6 位址則支援此種表示方法)。第二點要注意的是,修改 TCP Wrappers 設定檔內容後,當您存檔離開的那一剎那,所設定的防護內容便 立刻生效(不需要重新啟動或載入 xinetd 服務)。最後要注意的是,防護規則僅套用於 「新進 Session」,也就是說,設定阻擋規則時主機上若已經存在有舊的連線 Session,並不會自動斷線離開,而是新進來的 Session 才會阻擋。

CentOS 在預設情況下並不會安裝 xinetd 套件,我們可以透過前一篇介紹的 yum 指令來安裝 xinetd 套件。此次我們以防護主機上的 SSH 服務為例,設定只有允許的 IP 網段可以使用 SSH 遠端登入此台 CentOS 主機(允許連線後接著才進行使用者帳號及密碼驗證),並且拒絕允許的 IP 網段中,其中一台主機的連線要求。最後,其餘的 IP 位址欲嘗試使用 SSH 遠端登入主機時,則拒絕其連線要求。由於已經拒絕連線要求封包,因此主機自然就不需要回應使用者帳號及密碼的驗證動作,此舉能夠有效減低 CentOS 主機被進行密碼暴力測試工具攻擊的機會,提升主機整體安全性。

下列操作步驟包含利用 yum 套件管理工具安裝 xinetd 套件,查看 xinetd 服務是否在 CentOS 主機啟動時自動啟動 xinetd 服務,確認無誤後啟動 xinetd 服務。接著設定 TCP Wrappers 設定檔 (/etc/hosts.allow),其內容為 允許 192.168.1.0 整個 C Class 網段主機 SSH 遠端連線至此台 CentOS 主機,除了 192.168.1.99 禁止 連接。最後,其餘 IP 網段若發出 SSH 遠端連線要求時,則直接拒絕該連線封包。
#yum -y install xinetd         //安裝 xinetd 套件
#chkconfig xinetd --list       //檢查 xinetd 服務在 RunLevel 的啟動狀態
   xinetd          0:off   1:off   2:off   3:on    4:on    5:on    6:off
#service xinetd start          //啟動 xinetd 服務
   Starting xinetd:                                           [  OK  ]
#cat /etc/hosts.allow          //TCP Wrappers 安全防護規則
   sshd: 192.168.1.0/255.255.255.0 EXCEPT 192.168.1.99 : allow
   sshd: ALL : deny

上述 TCP Wrappers 防護規則設定完成後,我們可以進行驗證,檢查剛才設定是否生效。我們由 192.168.1.99 主機對目前 CentOS 主機 (192.168.1.50) 發出 SSH 遠端連線要求,並得到 Connection closed 的連線拒絕回應。在 CentOS 主機上,我們查看 secure 記錄檔也可看到 192.168.1.99 主機嘗試 SSH 遠端連線此台主機,並遭到拒絕連線 (refused connect) 的回應。而 192.168.1.0 網段中的其它主機發出 SSH 連線要求時,則會出現驗證帳號密碼的動作。
 >ssh 192.168.1.50                   //由 192.168.1.99 發出 SSH 遠端連線要求
   ssh_exchange_identification:
   Connection closed by remote host    //拒絕連線要求
#tail /var/log/secure               //查看 CentOS 主機安全記錄檔
  Oct 24 16:27:16 Centos6 sshd[3778]: Connection closed by 192.168.1.99
  Oct 24 16:27:33 Centos6 sshd[3781]: refused connect from 192.168.1.99 (192.168.1.99)
 >ssh weithenn@192.168.1.50        //由 192.168.1.0 網段中其它主機發出 SSH 連線要求
   Password:                           //允許 SSH 連線並且進入使用者密碼驗證階段

經過上述實作驗證後,相信讀者已經了解如何用簡單的 TCP Wrappers 安全防護規則,來保護 CentOS 主機。若您認為 TCP Wrappers 只有這些功能的話,那您就大錯特錯了。TCP Wrappers 支援更進階的安全防護規則內容,例如嘗試連線記錄、結合 Shell 指令等功能。但是在這些進階的防護功能中, 嘗試連線記錄必須要搭配系統的日誌服務 (syslogd) 才得以運作,而結合 Shell 指令功能,除了必須對系統指令有一定程度了解之外,還必須了解如何搭配相關的參數,才得以發揮強大效果。建議有興趣更深入的讀者,可以參考官方文件 Security Guide - 2.3. TCP Wrappers and xinetd 內有進階設定的詳細說明。