TCP_Wrappers
TCP_Wrappers
事實上,除了使用 xinetd 的設定檔來設定安全機制之外, 我們還可以利用額外的機制來抵擋某些不受歡迎的資料來源喔! 那就是 /etc/hosts.allow 以及 /etc/hosts.deny 這兩個檔案的功能啦! 這兩個檔案可以藉由分析:
* 啟動的服務名稱 (daemon 執(zhí)行檔檔名);
* 用戶端的 IP 來源或網段來源。
來進行用戶端使用者是否能夠登入的判斷呢!不過,雖然這兩個檔案已經被整合到 xinetd 里面去了, 不過,要獲得更多的功能,還是得要安裝 tcp_wrappers 這個套件才行! 因為,這兩個檔案本身就是 tcp_wrappers ( 其實是 /usr/sbin/tcpd 那個檔案而已啦! ) 的設定檔啊! 而他也可以整合到整個系統(tǒng)的服務里頭去,可以算是最最基礎的一個防火墻架構啦! ^_^
其實, /etc/hosts.allow 與 /etc/hosts.deny 是 /usr/sbin/tcpd 的設定檔, 而這個 /usr/bin/tcpd 則是用來分析進入系統(tǒng)的 TCP 封包的一個軟體,他是由 TCP Wrappers 所提供的。 那為什么叫做 TCP_Wrappers 呢?那么 wrappers 有包裹的意思,所以說,這個套件本身的功能就是在分析 TCP 網路資料封包啦!那么剛剛我們稍微提到我們網路的封包資料主要是以 TCP 封包為主,這個 TCP 封包的檔頭至少記錄了來源與目主機的 IP 與 port ,因此,若藉由分析 TCP 封包,就可以比對看我要不要讓這個資料進入到主機里面來啰!所以啦,我們要使用 TCP_Wrappers 來控管的,就是:
1. 來源 IP
2. port (就是服務啦)
TCP_Wrappers 設定 TCP 封包是否可以進入的設定檔在 /etc/hosts.allow 與 /etc/hosts.deny 當中。因此,基本上,如果一個服務是受到 xinetd 或 TCP_Wrappers 的控制時,那么該服務就會受限于 hosts.allow 與 hosts.deny 的管理了!而如果你自己安裝的套件當中( 亦即使用 Tarball 安裝的方式之套件 ),除非有自行定義支援 TCP_Wrappers 的功能 ,否則就無法使用這個玩意啰!嘿嘿!
那么這兩個檔案是干嘛用的?剛剛不是提過哪!他主要是用來規(guī)范 TCP 封包的規(guī)則的,所以呢, 里面記錄的當然就是:‘某些 IP 在特定服務中是否能夠進入主機’!那么要怎么寫? 這兩個檔案的內容基本的語法是:
<service(program_name)> : <IP, domain, hostname> : <action>
所以我們要先找出來那個 service_name 才行,例如以我們剛剛的 telnet 為例,那個 service_name 是什么呢?其實指的就是在 xinetd.conf 設定檔中的 server 這個設定后面接的程式名稱啦!所以, telnet 在 FC4 底下的名稱為 in.telnetd 因此,如果你不想讓 140.116.44.202 這個位址及 140.116.32.0/255.255.255.0 這個 C class 的網域進入你的主機的話,那么可以這樣在 /etc/hosts.deny 里面設定: ( 關于 IP, 網域, 網段, 還有相關的網路知識,在這個基礎篇當中我們不會談到, 詳細的資料請先自行參考伺服器架設篇的內容! )
[root@linux ~]# vi /etc/hosts.deny
in.telnetd : 140.116.44.202 140.116.32.0/255.255.255.0 : deny
當然也可以寫成兩行,亦即是:
[root@linux ~]# vi /etc/hosts.deny
in.telnetd : 140.116.44.202 : deny
in.telnetd : 140.116.32.0/255.255.255.0 : deny
這樣一來,對方就無法以 telnet 進入你的主機啦!方便吧!不過,既然如此,為什么要設定成 /etc/hosts.allow 及 /etc/hosts.deny 兩個檔案呢?其實只要有一個檔案存在就夠了, 不過,為了設定方便起見,我們存在兩個檔案,其中需要注意的是:
* 寫在 hosts.allow 當中的 IP 與網段,為預設‘可通行’的意思,亦即最后一個欄位 allow 可以不用寫;
* 而寫在 hosts.deny 當中的 IP 與網段則預設為 deny ,第三欄的 deny 亦可省略;
* 這兩個檔案的判斷依據是: (1) 以 /etc/hosts.allow 為優(yōu)先,而 (2) 若分析到的 IP 或網段并沒有紀錄在 /etc/hosts.allow ,則以 /etc/hosts.deny 來判斷。
也就是說, /etc/hosts.allow 的設定優(yōu)先于 /etc/hosts.deny 啰!瞭解了嗎?基本上,只要 hosts.allow 也就夠了,因為我們可以將 allow 與 deny 都寫在同一個檔案內, 只是這樣一來似乎顯得有點雜亂無章,因此,通常我們都是:
1. 允許進入的寫在 /etc/hosts.allow 當中;
2. 不許進入的則寫在 /etc/hosts.deny 當中。
此外,我們還可以使用一些特殊參數在第一及第二個欄位喔!內容有:
* ALL:代表全部的 program_name 或者是 IP 都接受的意思,例如 ALL: ALL: deny
* LOCAL:代表來自本機的意思,例如: ALL: LOCAL: allow
* UNKNOWN:代表不知道的 IP 或者是 domain 或者是服務時;
* KNOWN:代表為可解析的 IP, domain 等等資訊時;
再強調一次,那個 service_name 其實是啟動該服務的程式,舉例來說, /etc/init.d/ssh 這個 script 里面, 實際上啟動 ssh 服務的是 sshd 這個程式,所以,你的 service_name 自然就是 sshd 啰! 而 /etc/xinetd.d/telnet 內有個 server 的設定項目, 那個項目指到 in.telnetd 這個程式來啟動的喔!要注意的很!(請分別使用 vi 進這兩支 scripts 查閱) 好了,我們還是以 telnet 為例子來說明好了,現在假設一個比較安全的流程來設定,就是:
1. 只允許 140.116.44.0/255.255.255.0 與 140.116.79.0/255.255.255.0 這兩個網域,及 140.116.141.99 這個主機可以進入我們的 telnet 伺服器;
2. 此外,其他的 IP 全部都擋掉!
這樣的話,我可以這樣設定:
[root@linux ~]# vi /etc/hosts.allow
in.telnetd: 140.116.44.0/255.255.255.0
in.telnetd: 140.116.79.0/255.255.255.0
in.telnetd: 140.116.141.99
in.telnetd: LOCAL
[root@linux ~]# vi /etc/hosts.deny
in.telnetd: ALL
那么有沒有更安全的設定,例如,當當有其他人掃瞄我的 telnet port 時,我就將他的 IP 記?。∫宰鰹槲磥淼牟樵兣c認證之用! 是有的!只是,那就得要有額外的動作參數加在第三欄了。主要的動作有:
* spawn (action)
可以利用后續(xù)接的 shell 來進行額外的工作,且具有變數功能,主要的變數內容為: %h (hostname), %a (address), %d (daemon)等等;
* twist (action)
立刻以后續(xù)的指令進行,且執(zhí)行完后終止該次連線的要求 (DENY)
我們知道 finger 可以反向追蹤網路封包的來源,所以,我希望這樣:
1. 利用 safe_finger 去追蹤出對方主機的資訊;
2. 將該追蹤到的結果以 email 的方式寄給 root ;
3. 在對方螢幕上面顯示不可登入的訊息
此時可以利用 spwan (action1) | (action2) : twist (action3) 來進行, 也就是說,其實在 /etc/hosts.deny 的第三個欄位可以繼續(xù)延伸下去的!整個資訊有如這樣:
[root@linux ~]# vi /etc/hosts.deny
in.telnetd: ALL: spawn (echo "security notice from host `/bin/hostname`" ;\
echo; /usr/sbin/safe_finger @%h ) | \
/bin/mail -s "%d-%h security" root & \
: twist ( /bin/echo -e "\n\nWARNING connection not allowed.\n\n" )
在上面的例子中,第三行的 root 那個賬號,可以寫成你的個人賬號或者其他 e-mail ,以免很少以 root 身份登入 Linux 主機時,容易造成不知道的情況,另外,最后幾行,亦即 :twist 之后的那幾行為同一行。如此一來,當未經允許的電腦嘗試登入你的主機時, 對方的螢幕上就會顯示上面的最后一行,并且將他的 IP 寄到 root ( 或者是你自己的信箱 )那里去! 另外請注意,那個 /usr/sbin/safe_finger 是由 tcp_wrappers 套件所提供的, 所以您必須要安裝該套件才行喔! ^_^
文章出處:飛諾網(www.diybl.com):http://www.diybl.com/course/6_system/linux/Linuxjs/20090307/159060.html