關於網絡安全的研究分析中,防火牆(Firewall)是被經常強調的重點,它基本功能是過濾並可能阻擋本地網絡或者網絡的某個部分與Internet之間的數據傳送(數據包)。數據包其實就是一段段的數據,其中同時包括了用來把它們發送到各自的目的地所必須的信息。你可以把數據包想象成一個郵包:數據包本身就是郵包中的數據,而信封上則是所有用來把這些信息發送到正確的機器和正確的程序中去的書信抬頭,它同時還包含著回信地址等方面的信息。在其具體的過濾工作過程中,防火牆將接管在此之前從網絡內部存取Internet和從Internet存取該內部網絡的路由設置。
我們的感覺是以前的防火牆專門用來過濾一些非法的數據包,要麼為什麼其中的一種類型稱為包過濾型防火牆呢?發展到現在,它的功能是日益增多,不僅能夠過濾數據包,還能夠作網絡地址轉換,作代理等等。Linux內核2.4中防火牆實現NetFilter就是這樣的。
先來看看防火牆所處的位置,我的理解是要麼它裝在一台機器上作個人防火牆,要麼裝在一台機器上為一個局域網提供網關的功能,而後種情況則如下圖所示:
這副圖概括了裝在網關上的NetFilter的框架結構圖,從圖中可以看到一個數據包可能經過的路徑,其中用[]擴起來的東東,稱為檢查點,當數據包到達這個點時,就要停下來進行一些檢查。這裡檢查點的名稱使用的是iptables中名稱,具體到NetFilter中可能就要改為那些所謂的鉤子 (Hook)函數了。
NetFilter概括起來說,它有下面的三個基本功能:
1、數據過濾(filter表)2、網絡地址轉換(nat表)3、數據包處理(mangle表)
根據這三個功能,將上面的五個檢查點按功能進行了分類。由於每個功能在NetFilter中對應一個表,而每個檢查點又有若干個匹配規則,這些規則組成一個鏈,所以就有下面的說法:“NetFilter是表的容器,表是鏈的容器,鏈是規則的容器”
一個鏈(chain)其實就是眾多規則(rules)中的一個檢查清單(checklist)。每一條鏈中可以有一條或數條規則,每一條規則都是這樣定義的“如果數據包頭符合這樣的條件,就這樣處理這個數據包”。當一個數據包到達一個鏈時,系統就會從第一條規則開始檢查,看是否符合該規則所定義的條件: 如果滿足,系統將根據該條規則所定義的方法處理該數據包;如果不滿足則繼續檢查下一條規則。最後,如果該數據包不符合該鏈中任一條規則的話,系統就會根據該鏈預先定義的策略(policy)來處理該數據包。
而一個iptables命令基本上包含如下五部分:希望工作在哪個表上、希望使用該表的哪個鏈、進行的操作(插入,添加,刪除,修改)、對特定規則的目標動作和匹配數據包條件。
基本的語法為:iptables -t table -Operation chain -j target match(es)(系統缺省的表為"filter")
基本操作如下:
-A 在鏈尾添加一條規則-I 插入規則-D 刪除規則-R 替代一條規則-L 列出規則
基本目標動作,適用於所有的鏈:
ACCEPT 接收該數據包DROP 丟棄該數據包QUEUE 排隊該數據包到用戶空間RETURN 返回到前面調用的鏈Foobar 用戶自定義鏈
基本匹配條件,適用於所有的鏈:
-p 指定協議(tcp/icmp/udp/...)-s 源地址(ip address/masklen)-d 目的地址(ip address/masklen)-i 數據包輸入接口-o 數據包輸出接口
匹配條件擴展:
TCP-----匹配源端口,目的端口,及tcp標記的任意組合,tcp選項等。UPD-----匹配源端口和目的端口ICMP----匹配ICMP類型MAC-----匹配接收到的數據的mac地址MARK----匹配nfmarkOWNE----(僅僅應用於本地產生的數據包)來匹配用戶ID,組ID,進程ID及會話IDLIMIT---匹配特定時間段內的數據包限制。這個擴展匹配對於限制dos攻擊數據流非常有用。STATE---匹配特定狀態下的數據包(由連接跟蹤子系統來決定狀態),可能的狀態包括:INVALID (不匹配於任何連接)ESTABLISHED (屬於某個已經建立的鏈接的數據包)NEW (建立連接的數據包)RELATED (和某個已經建立的連接有一定相關的數據包,例如一個ICMP錯誤消息或FTP數據連接)TOS——匹配IP頭的TOS字段的值。
目標動作擴展:
LOG 將匹配的數據包傳遞給syslog()進行記錄ULOG 將匹配的數據適用用戶空間的log進程進行記錄REJECT 不僅僅丟棄數據包,同時返回給發送者一個可配置的錯誤信息MIRROR 互換源和目的地址以後重新傳輸該數據包
Ipchains是一種Linux下使用比較廣泛的工具軟件,可以實現數據包過濾的防火牆功能(Linux的內核為2.1及以上的內核版本都能夠支持這個軟件包)。這個軟件包管理著對Linux操作系統內核本身極為重要的那些IP帳戶和防火牆功能。用戶使用的內核必須已經在編譯時激活 ipchains功能;如果想掌握ipchains運行在哪一個層次,就必須在數據包級別上精通TCP/IP網絡的數據傳輸情況。ipchains是一個數據包過濾器,即是一個用來檢查數據包的信封內容的程序;同時,根據用戶設定的一系列規則,還可以決定是否允許某些數據包通過和把它們發送到什麼地方。
安裝ipchains:首先下載或在光盤上找到它的rpm包,然後以root身份登錄進入系統,敲入“rpm -ivh ipchains*”的命令來安裝ipchains軟件包。
配置ipchains的數據包過濾功能:首先依然以root用戶身份登錄進入系統,接著輸入“ipchains-L”命令,查看當前已經存在的鏈。如果你還沒有對這些選項進行過配置的話,應該會看到下面這樣的幾行:
>chaininput(policyACCEPT);>chainforward(policyACCEPT);>chainoutput(policyACCEPT);>
選擇打算配置的鏈:一個鏈就是一系列加在一組數據包類型上的規則。inputchain(輸入鏈)指的是進入到防火牆機器中的數據包。 forwardchain(轉發鏈)指的是進入到防火牆機器中而現在又需要發送到網絡中的另外一台機器上的數據包。outputchain(輸出鏈)指的是要向外發送的數據包。
然後輸入“ipchains -L chain”命令,列出打算編輯的鏈中當前已經存在的規則。在缺省的情況下,所有的鏈中的規則都是空白的。再輸入“ipchain-Achain”,告訴 ipchains程序需要針對哪個鏈建立一個新的數據包過濾規則。舉例來說,用戶可能想對輸入鏈建立些新規則,那麼就輸入“ipchains -A input”。現在還不能按回車鍵,還有事情要做。現在需要鍵入規則本身的內容。我們假定用戶想做的設置是:除了從某一台特定的遠程工作站點之外,人們沒有辦法遠程登錄連接到防火牆後面的任何機器。在你正在建立的那個規則的格式中使用-s(source)標志設置地址(或地址范圍),如下:
(1)單個完整的IP地址,比如:192.168.152.24。(2)整個一類的IP地址范圍,比如:192.168.152.0/255.255.255.0—它表示從192.168.152.0到192.168.152.255范圍內的地址。(3)主機名,比如:blue。(4)完整的域名,比如:blue.cdors.org。(5)某個IP地址范圍,要使用IP地址和網絡屏蔽碼(netmask)認真地構造之。
我們這個示例的目標是只允許從三台特定的機器上接入遠程登錄服務,它們的IP地址是192.156.12.1到192.156.12.3。表示這個地址范圍的IP地址和網絡屏蔽碼組合是192.156.12.1/255.255.255.252。現在用戶的規則語句看起來應該是這個樣子的: ipchains-Ainput-s192.156.12.1/255.255.255.252還是不能按回車鍵,你還有事情要做。
除了來自這三台機器以外,還可以繼續細化,告訴ipchains程序允許通過防火牆進入的接收程序必須要使用哪一種協議。用戶可以使用-p(protocol,協議)標志。遠程登錄進程使用的是TCP協議。現在這條規則看起來像是:ipchains- Ainput-s192.156.12.1/255.255.255.252-pTCP還是不要按回車鍵。
圍繞某個特定的協議建立一條規則的選擇太多了,但是用戶可以為你選定的進程指定其端口(port)來細化那條規則。用戶可以把端口的名稱加到規則的末尾,也可以用一個冒號引導該端口的端口號。從/etc/services文件中可以查到任何網絡服務所使用的端口號。現在這條規則看起來是下列這兩行文字中的某個樣子:
ipchains-Ainput-s192.156.12.1/255.255.255.252-pTCP:23ALLOWipchains-Ainput-s192.156.12.1/255.255.255.252-pTCPTelnetALLOW
現在可以按下回車鍵了。用戶在確實屏蔽了其他接入類型之前,這條規則實際上還是沒有什麼用處的。最好的解決方法(因為我們的目的是為用戶所有希望允許的東西建立規則)是使用-P(policy)標志(注意是大寫字母)屏蔽所有的輸入,然後ipchains就會去檢查特定的規則看看到底什麼才能被允許進入。這樣的一個策略語句如下所示:ipchains-PinputDENY
在重啟動/關機之前保存數據包過濾規則:沒有哪個配置文件是用來自動保存數據包過濾規則供你下次啟動機器的時候使用的。因此,選擇某種方法自己來完成這項工作就十分重要,否則下一次你就還得從頭一點一滴地重新寫出所有的規則。下面介紹一個保存數據包過濾規則的方法:先以root身份登錄進入系統,再使用ipchains-save腳本程序把用戶已經編寫好的規則設置保存到一個文件中去,比如/root/ipchains-settings文件。輸入“ipchains-save>/root/ipchains-settings”。
開機引導後恢復數據包過濾規則:用戶在計算機重啟動之後,必須恢復數據包過濾規則。請按照下面的方法完成這項任務:先以root身份登錄進入系統,再使用ipchains-restore腳本程序在某個文件中檢索用戶已經編寫好的規則,比如從文件/root/ipchains-settings 中恢復數據包過濾規則。如下所示,輸入“ipchains-restore<>
如果要想實現代理防火牆功能,需要安裝能夠控制用戶從某個網絡的外部可以使用和不可以使用什麼樣的網絡服務功能的軟件。代理防火牆不允許有任何連接接入到它後面的機器上(當然也不是絕對的),不存在任何數據包過濾的效果,從接入連接的角度考慮,它就是一堵密不透風的磚牆。可以如下設置:
首先在/etc/inetd.conf文件中禁用任何你不打算使用的服務功能,方法是把它們改為注釋語句(即在那些語句開頭加上一個#符號)。任何一種服務都會為試圖進入系統的那些人多打開一條通路,因此應該只使用你確實需要的服務。
接著編輯/etc/issue.net文件,刪除其中關於在你的機器上運行的特定硬件和Linux發行版本的介紹信息。這些信息會在諸如Telnet之類的遠程登錄任務操作過程中顯示在登錄端的屏幕上。如果他們對屏幕上顯示的安裝方式熟悉的話,任何暴露了你機器上這些特殊信息的東西都會使那些試圖闖入的人們了解應該去攻擊哪些薄弱環節(如Sendmail8.7-8.8.2 for Linux這個漏洞)。
再接著把某些特殊的用戶們分配到console用戶組中,這樣就是這幫人實際坐在服務器計算機前面時確實可以執行命令,但同時要禁止任何其他人調用這些命令。舉例來說,如果需要強調安全性,那就應該只允許console用戶組的成員可以掛裝磁盤。
然後查看/etc/securetty文件,確定其中列出的設備都是真實存在的物理ttys(比如tty1到tty8)端口。這個文件限制了人們能夠以根用戶身份登錄進入系統的位置。允許任何遠端用戶以根用戶身份登錄進入系統是極其危險的,因為這樣做就為潛在的侵入者縮短了侵入超級用戶帳戶的過程。
最後是最好不設匿名帳戶或來賓帳戶(anonymouse & guest)如果一定要設,請在/etc/passwd中將其shell設為/bin/failure,使其不能訪問任何shell。(注意:Linux 中是設為/bin/false)。打開chroot(如chroot -s),使其訪問的文件限定在一定目錄下。一定要保證在FTP服務器上唯一允許匿名用戶進行寫入操作的部分是/incoming目錄。列出成功登錄的記錄清單如果想查看都有哪些人最近成功地登錄進入了系統,可以使用last命令。如果想列出比缺省數目更多的記錄,可以使用格式“last -nnumber”告訴last命令需要顯示多少登錄記錄。如果這個命令執行失敗,說明登錄操作還沒有被記錄下來。為了確保它們能夠被記錄下來,請以根用戶身份執行“toUCh/sar/log/wtmp”命令來建立日志記錄文件。列出不成功登錄的記錄清單如果想查看都有哪些人最近沒有成功地登錄進入系統,可以使用lastb命令。和last命令相類似,如果你想列出比缺省數目更多的不成功嘗試記錄的話,可以使用“lastb -nnumber”格式。如果這個命令執行失敗,說明不成功登錄操作還沒有被記錄下來。為了確保它們能夠被記錄下來,請以根用戶身份執行 “touch/var/log/BTmp”命令來建立日志記錄文件。
如果安全出現了漏洞,或者你認為已經出現了漏洞的話,就可以抓住這個機會從系統登錄記錄或者其他地方查找蛛絲馬跡。系統會記錄下每一次成功的登錄操作和不成功的登錄嘗試操作。特別是那個“列出不成功的嘗試登錄記錄清單”,它能夠讓你很快地查找出是否有人在千方百計地獲取根用戶權限或者猜試某個用戶的口令字。
如果你使用的是shadow隱藏口令字軟件,請檢查/etc/passwd文件,看看其中是否禁用了 shadow隱藏口令字功能——如果是這樣,口令字將會被保存在/etc/passwd文件裡。Linux系統中的/etc/passwd文件是整個系統中最重要的文件,它包含了每個用戶的信息(加密後的口令也可能存與/etc/shadow文件中)。它每一行分為7個部分,依次為用戶登錄名,加密過的口令,用戶號,用戶組號,用戶全名,用戶主目錄和用戶所用的Shell程序,其中用戶號(UID)和用戶組號(GID)用於Unix系統唯一地標識用戶和同組用戶及用戶的訪問權限。這個文件是用DES不可逆算法加密的,只能用John之類的軟件窮舉,因此,此文件成為入侵者的首要目標。通常黑客用FTP匿名登錄後將passwd Get回去,就用John開始跑了。所以一定要把此文件設為不可讀不可寫。另注意,opasswd或passwd.old是passwd的備份,它們可能存在,如果存在,一定也要設為不可讀不可寫修改。進行以上設置必須root用戶的權限,所以如果情況真的如上面所說的這樣,你就應該知道在這台機器上黑客已經獲得了root的操作權限。
檢查是否有不熟悉的用戶帳戶擁有特殊的優先權:一個擁有高級工具和豐富經驗的黑客能夠替換某些重要的系統功能。用一台獨立的計算機或者一台你相信沒有遭到攻擊的機器把諸如ls之類的命令備份到一張軟盤上去,當然最好是將安裝光盤再刻錄一張,然後檢查程序ls、find、ps和所有網絡守護進程的系統版本中的日期與它們生成時的日期數據是否一致。
最後你應該經常到下面的地方去查看是否有提高安全性方面的建議和那些修補最新發現的系統漏洞的網站:如Root Shell (http://www.rootshell.com)、Computer Emergency Response Team(計算機緊急情況快速反應組——http://www.cert.com)和你機器上安裝的Linux版本的軟件服務商網頁,並最好訂閱一些最新系統漏洞的電子雜志。
檢查是否有不熟悉的用戶帳戶擁有特殊的優先權:一個擁有高級工具和豐富經驗的黑客能夠替換某些重要的系統功能。用一台獨立的計算機或者一台你相信沒有遭到攻擊的機器把諸如ls之類的命令備份到一張軟盤上去,當然最好是將安裝光盤再刻錄一張,然後檢查程序ls、find、ps和所有網絡守護進程的系統版本中的日期與它們生成時的日期數據是否一致。
最後你應該經常到下面的地方去查看是否有提高安全性方面的建議和那些修補最新發現的系統漏洞的網站:如Root Shell (http://www.rootshell.com)、Computer Emergency Response Team(計算機緊急情況快速反應組——http://www.cert.com)和你機器上安裝的Linux版本的軟件服務商網頁,並最好訂閱一些最新系統漏洞的電子雜志。