Javi Polo 作者簡介: 我今年十八歲, 在九月之前, 仍然是 Catalan 學校裡「煎熬中」的中學生。 最大的興趣是電腦科學, 我希望申請 UIB 通過, 以輔修電傳通訊, 並主修電腦科學。 我喜歡硬蕊音樂, 並且加入了一個叫做 Niko-Chan's Kingdom 的樂團。 我有個很好的女朋友叫做 Xiska, 大概就這樣, 沒其他好說的了 0:) 與作者聯繫 |
TCPD 與使用 IPFWADM 來設定防火牆內容摘要: 本文扼要地介紹, 在系統裡設定 inetd 服務, 以增進系統安全的方法, 我們把焦點放在 IPFWADM 這個系統管理工具, 以及 inetd 服務的設定上面。 首先, 我們必須釐清什麼是 inetd。 簡單地說, inetd 是一個伺服程式, 用以控制主機連上網路時, 所提供的各項服務。 您有可能會遇到一部電腦, 其預設狀況並未設定好 inetd 來控制所有的服務, 因此, 第一件事, 便是找出 /etc/inetd.conf 檔案, 並檢查有哪些現存的服務由它控制 ( 也就是沒有 "#" 符號開頭的那幾行內容 )。 給您的第一個忠告就是, 除非真的需要這項服務, 不然千萬別啟動它, 那些從未使用的伺服程式裡, 可能藏有臭虫, 避免有人利用此類漏洞入侵的最好方法, 就是不要用它。 假設讀者手邊有一份 inet.conf 檔案的內容, 接下來我就解譯一下裡頭的意義。 舉例來說, 下面這一行:ftp stream tcp nowait root /usr/sbin/tcpd in.ftpd -l -a 第一個字是所提供的服務名稱 ( 本例中指的是 "ftp", 我們可以另外在 /etc/services 檔案裡, 查出它所連結的是哪一個埠號 )。 第二個欄位是所開啟的 socket 類型,它可以是: stream ( 如本例即是 )、 dgram、 raw、 rdm、 或 seqpacket。 接下來的欄位是所使用的通訊協定, 您必須先在 /etc/protocols 檔案中宣告, 在前例中, 我們假定您已經在此檔裡宣告了 TCP 通訊協定。 在通訊協定之後, 接著是 wait/nowait 的欄位。 除了 datagram (dgram) 類型之外的 socket, 其他都應該是 nowait, 至於 datagram 類型的 socket, 如果伺服程式支援多執行緒, 那麼我們應該設定 nowait, 如果伺服程式僅支援單一執行緒, 那麼請設定為 wait。 原因是多執行緒系統, 當其收到連線要求時, 它會啟動一個新的 process, 然後再把原本的 socket 釋放掉, 讓 inetd 可以繼續 listen 其他的連線要求, 因此要使用 nowait。 在單一執行緒系統的場合, 則需要設定為 wait, 因為伺服程式會一直守著同一個 socket, 而不能另外產生 process 以供連結。 除此之外, 還有一些格式上的變化, 我們可以寫成 nowait.50 -- 代表短時間內, 最多可以啟動 50 個伺服程式 ( 從另一個角度來看, 或者可以說, 是接受這麼多個連線要求 )。 其預設值是 40 個。 第五個欄位, 指明了伺服程式, 是以哪位使用者的名稱來執行, 在這個例子中, ftp 是以 root 這個使用者名稱來執行。 第六個以及接下來的欄位, 便是執行的程式與其所接的參數了。 在我們的例子當中, 伺服程式 tcpd 被啟動, 後頭接了伺服程式 in.ftpd 與 -l -a 為參數。 接下來, 我們就要來談談最有趣的部份, TCPD 的設定問題。 嗯, tcpd 是個用來過濾連線要求的伺服程式, 它會根據哪個伺服程式即將被啟動, 來決定做哪些事, 以向提出這些連線要求的 IP 位址, 做出回應的動作。 而究竟會怎麼做決定, 則視 /etc/hosts.allow 與 /etc/hosts.deny 這兩個檔案如何設定。 原則上, /etc/hosts.deny 檔案是用來指定拒絕向哪些主機提供服務, 而 /etc/hosts.allow 檔案則是用來指定允許向哪些玊機提供服務。 這兩個檔案的設定格式如下:DAEMON: IP[: OPTION1 [: OPTION2 ]] 上述的 DAEMON, 可以是想要啟動的伺服程式名稱, 如前例中所示的 in.ftpd, 或者是 ALL 這個字, 它代表著所有的伺服程式。 IP 可以是某個特定的 IP, 或是某個 URL, 或是某一範圍的 IP ( 或 URL ), 或者是等一下會解釋到的萬用字。 為了能夠指定某一範圍的 IP 位址, 例如說, 我們可以這樣寫: `123.32', 這個表示方式, 代表了 123.32.XXX.XXX 的所有 IP, 同樣地, 像 `.ml.org' 可以用來指定某一範圍的 URL, 它代表所有 ml.org 底下的子網路。 以 IP/MASK 之格式來指定某一範圍的 IP, 則是更為傳統的方法, 舉例來說, 從 127.0.0.0 到 127.0.255.255, 此一範圍的 IP 可被指定為 127.0.0.0/255.255.0.0 前面提到的萬用字有:
前面提到的選項有:
上述的最後兩個選項, 還可以配合適當的擴充字元給 tcpd 使用, 這些擴充字元有:
配合這些擴充字元與選頁, 您已經可以做很多事了, 例如, 我知道有人設定成, 一旦有人想要經由 telnet 連進他的主機, 便自動送出一個 teardrop 攻擊 :)
附註: teardrop 是一種 Dos ( Denial of Service, 會造成系統重新開機,
或重新起始化的攻擊方式 )。 它是因為 TCP 封包重組時的臭虫而起,
多數的作業系統都有這個問題 ( 或者說, 以往的作業系統是如此,
因為許多的核心程式已經針對此問題, 加以修正了 ), 在 InterNet 上的資料,
是透過 TCP/IP 通訊協定來傳送 ( 此一通訊定, 在其他類型的網路上也可以看到,
譬如像 intranet 就是 ), 實際上, 它是兩種通訊協定: TCP 負責將資料,
加以分割成一段段的封包, 然後再把它傳給 IP 通訊協定, 由它送往目的地;
一旦資料送達目的主機後, TCP 通訊協定會檢查, 是否所有封包都完整,
然後再將它們重組成原本的資料。 然而, 上述 ( 以及許多根據此一原理 )
的攻擊方式, 利用多數的作業系統, 在重組封包之前, 不會檢查封包過小的問題,
因此, 這樣的機器在重組封包後, 就會發生錯亂的狀況。
#hosts.allow ALL: 127.0.0.1 # 允許 localhost 進入做所有事 in.ftpd: ALL: spawn (wavplay /usr/share/sounds/intruder.wav & ) # 讓所有人都可以透過 ftp 進入, # 但會啟動一個聲音檔 ( 因此它可以警告我 ) in.telnetd: ALL: twist ( teardrop %h %h ) # 所有人想要透過 telnet 的話, # 送回一個 teardrop 的攻擊 #fin #hosts.deny ALL: `.bsa.org' # 禁止來自 bsa.org 網域的所有連線 in.fingerd: ALL # 禁止所有的 fingerd 服務 :) #fin 關於 tcpd, 我想說的就是這些了, 因為所學有限, 可能講得不夠好。 在下的建議是, 試著去實驗一些設定項目, 並且熟讀線上手冊 ( tcpd, host_acess(5) 的 manual pages ), 相信讀者可以學得比我所教的還要多。 接下來, 讓我們進入 IPFWADM 工具程式的部分。首先, 不可或缺的是, 要把核心程式中, 有關 IP Firewalling 的支援加入 ( Networking -> Network firewalls + IP: firewalling )。 接下來, 重新編譯及系統重新開機後, 我們就準備好可以使用這個工具了。 IPFWADM 可以讓我們管理某些程式 ( 這些應用程式, 並不限於我在本文中所介紹的 ), 其 TCP、 UDP、 ICMP 封包的進出狀況。 簡單地說, 管理員可以規定哪些封包才允許進入, 可以指定的條件包括: 來自於某個 IP、 或某段 IP 範圍的主機, 哪一個特定的埠號, 哪一種特定的通訊協定, 或是上述各種條件的組合... 同樣地, 對於準備送往主機外的封包, 我們也可以具有相同程度的管理控制。 ipfwadm 有幾種主要的參數:
本文中, 我只打算介紹 -I 與 -O 參數, 它們兩者都具有相同的語法。 這些參數的選項有:
原則上, 這些都是最基本的參數, 因此, 想要讓所有從我的電腦發出的封包, 能夠到達我自己的電腦, 可以這樣設定處理方式: ipfwadm -I -i a -S 127.0.0.1還想要擋掉來自於 123.34.22.XXX 的封包, 可以這樣設定: ipfwadm -I -a d -S 123.34.22.0/255.255.255.0接下來, 如果除了 111.222.123.221 這個 IP 之外, 我想要擋掉所有其他對於 netbios 埠號的連線要求, 可以這樣設定: ipfwadm -I -a a -P tcp -S 111.222.123.221 139ipfwadm -I -a d -P tcp -D 0.0.0.0/0 139 好吧, 我想這就是文章的全部了, 寫得有點不好, 所學不精囉 O:) |
主網站由 Miguel Angel Sepulveda 維護 © Javi Polo 1998 LinuxFocus 1998 |