TCP Wrappers 使用訪問控制列表 (ACL) 來防止欺騙。ACL 是 /etc/hosts.allow 和 /etc/hosts.deny 檔案中的系統列表。在配置為驗證主機名到 IP 地址映射,以及拒絕使用 IP 源路由的軟體包時,TCP Wrappers 提供某些防止 IP 欺騙的保護。
簡介
通常做法是在作業系統層面上安裝防火牆來處理網路連線。然而雖然防火牆有非常廣泛的用途,但他卻不是萬能的,例如它無法處理類似的向連線發起者傳送一些文本這樣的任務。而TCP Wrappers能夠完成它以及更多的其他事情。TCP Wrappers擴展了inetd為受其控制的服務程式實施控制的能力。通過使用這種方法,它能夠提供日誌支持、返回訊息給聯入的連線、使得服務程式只接受內部連線,等等。儘管防火牆也能夠完成其中的某些功能,這不僅增加了一層額外的保護,也提供了防火牆無法提供的功能。
然而,由TCP Wrappers提供的一些額外的安全功能,不應被視為好的防火牆的替代品。TCP Wrappers 應結合防火牆或其他安全加強設施一併使用,為系統多提供一層安全防護。
初始配置及簡單設定
使用TCP Wrappers的唯一要求是確保inetd在從rc.conf中啟動時包含了-Ww選項。當然,還需要對/etc/hosts.allow進行適當的配置,但syslogd在配置不當時會在系統日誌中記錄相關訊息。注意:使用hosts.deny在現在被認為是不推薦和過時的做法。所有的配置選項應放到/etc/hosts.allow中。
在最簡單的配置中,服務程式連線策略是根據/etc/hosts.allow允許或阻止。FreeBSD這樣的作業系統中的默認配置是允許一切發到由inetd所啟動的服務的連線請求。
基本配置的形式通常是:
服務:地址:動作
服務---從inetd啟動的服務程式名字
地址---可以是任何有效的主機名、一個IP或由方括弧([ ])括起來的IPv6地址
動作---欄位可以使allow或deny,分別用於允許和禁止相應的訪問。
在配置時需要注意所有的配置都是按照第一個匹配的規則運轉的,這表示配置檔案將按照順序查找匹配規則,而一旦找到匹配,則搜尋也就停止了。
例如:允許POP3連線通過mail/qpopper服務,應把下面的行添加到hosts.allow
# This line is required for POP3 connections:
qpopper:ALL:allow
增加這樣之後,需要重新啟動inetd。可以通過使用kill命令來完成這項工作,或使用/etc/rc.d/inetd的restart parameter參數。
高級配置
TCP Wrappers 也有一些高級的配置選項,用來對如何處理連線實施更多的控制。一些時候,返回一個說明到特定的主機或請求服務的連線可能是更好的辦法。其他情況下,記錄日誌或者傳送郵件給管理員可能更為適合。另外,一些服務可能只希望為本機提供。這些需求都可以通過使用通配符,擴展字元以及外部命令來實現。
外部命令
假設由於發生了某種狀況,而導致連線應該被拒絕掉,而將其原因傳送給發起連線的人。如何完成這樣的任務呢?這樣的動作可以通過使用twist選項來實現。當發起了連線請求時,twist將調用一個命令或腳本。在hosts.allow檔案中已經給出了一個例子:
# The rest of the daemons are protected.
ALL : ALL \
: severity auth.info \
: twist /bin/echo "You are not welcome to use %d from %h."
這個例子將把訊息“You are not allowed to use daemon from hostname.” 返回給訪問先前沒有配置過允許訪問的服務客戶。對於希望把訊息反饋給連線發起者,然後立即切斷這樣的需求來說,這樣的配置非常有用。請注意所有反饋信息必須被引號包圍,這一規則是沒有例外的。
警告:如果攻擊者向服務程式傳送大量的連線請求,則可能發動一次成功的拒絕服務攻擊。
另一種可能是針對這種情況使用spawn。類似twist,spawn也暗含拒絕連線,並可以用來執行外部命令或服務。與twist不同的是,spawn 不會向連線發起者傳送回應。考慮下面的配置:
# We do not allow connections from example.com:
ALL :.example.com \
:spawn (/bin/echo %a from %h attempted to access %d >> \
/var/log/connections.log) \
:deny
這將拒絕來自 *.example.com 域的所有連線;同時還將記錄主機名,IP 地址,以及對方所嘗試連線的服務名字到/var/log/connections.log檔案中。
除了前面已經介紹過的轉義字元,例如 %a 之外, 還有一些其它的轉義符。參考hosts_access在線上手冊可以獲得完整的列表。
通配符選項
前面的例子都使用了ALL。其它選項能夠將功能擴展到更遠。例如,ALL可以被用來匹配每一個服務、域,或IP位址。另一些可用的通配符包括PARANOID,它可以用來匹配任何來自可能被偽造的IP位址的主機。換言之,paranoid可以被用來定義來自IP與其主機名不符的客戶。
# Block possibly spoofed requests to sendmail:
sendmail:PARANOID:deny
在這個例子中,所有連線sendmail的IP位址與其主機名不符的主機都將被拒絕。
小心:如果伺服器和客戶機有一方的DNS配置不正確,使用PARANOID可能會嚴重地削弱服務。在設定之前,管理員應該謹慎地考慮。