目錄
10 安全
10.1 概要
10.2 介紹
10.3 確保FreeBSD 的安全特性
10.4 DES, md5 和Crypt
10.5 S/Key
10.6 Kerberos
10.7 防火墻
10.8 OpenSSL
10.9 ipsec
10.10 openSSH
=============================================================
第10 章安全
=============================================================
(翻譯中出現(xiàn)的任何問題或錯誤,請廣大讀者及時反饋給我:freebsdhandbook@163.com)
10.1 概要
這章將對系統(tǒng)安全概念作一個的基本介紹,還有一些通用的好的規(guī)則,和一些在
FreeBSD 下的高級主題。這兒提到的許多主題已經(jīng)很好地應(yīng)用于系統(tǒng)和Internet 的安全。
確保你的系統(tǒng)安全將保護(hù)你的數(shù)據(jù),不至于被黑客所竊取。
FreeBSD 提供了許多工具和機制來確保你的系統(tǒng)和網(wǎng)絡(luò)的安全。
讀完這章,你將了解到這些:
. FreeBSD 的基本系統(tǒng)安全概念。
. FreeBSD 中可用的如DES 和MD5 這樣的加密(crypt)機制。
. 如何設(shè)置S/Key,一種一次性的密碼驗證機制。
. 如何設(shè)置Kerberos,另一種密碼驗證機制。
. 如何使用IPFW 來創(chuàng)建防火墻。
. 如何配置IPSec。
. 如何配置和使用OpenSSH,F(xiàn)reeBSD 的SSH 執(zhí)行方式。
在閱讀這章之前,你必須了解:
. 了解基本的FreeBSD 和internet 概念。
10.2 介紹
安全是系統(tǒng)管理至始至終最基本的要求。所有的BSD UNIX 系統(tǒng)都有它自身內(nèi)在的安
全性,建構(gòu)和維護(hù)額外的安全機制,確保用戶的“誠實”大概是系統(tǒng)管理最艱巨的工作之一。
機器僅保持著建構(gòu)時最原始的安全性,而安全性必須要考慮到用戶使用的便利性。通常
UNIX 系統(tǒng)能夠支持巨大的并發(fā)用戶處理,而這些處理中絕大部分是以服務(wù)器形式處理的----
這意味著外部的實體能夠連接和互相交談。昨天的小型電腦和主機變成了今天的桌面機,電
腦已連到局域網(wǎng)和互聯(lián)網(wǎng),安全就成了一個非常嚴(yán)峻的問題。
第1 頁FreeBSD 使用手冊
通過一個分層的方法,安全能夠很好地實現(xiàn)。你所要做的就是創(chuàng)建很多的安全層,然后
仔細(xì)地監(jiān)視系統(tǒng)以防入侵。你不要過多地創(chuàng)建安全層,否則你將會影響檢測面。檢測是許多
安全機制中最重要的方法。例如,在每一個二進(jìn)制程序中,很難判斷schg 標(biāo)記,因為這樣
會臨時地保護(hù)二進(jìn)制,它會妨礙對一個已經(jīng)侵入的攻擊者作一個很容易的檢測,以至最終你
的安全機制根本檢測不到攻擊者。
系統(tǒng)安全也涉及到攻擊的許多方面,包括試圖摧毀或使一個系統(tǒng)無法使用。安全問題主
要被分成幾類:
1, 拒絕服務(wù)的攻擊;
2, 竊取用戶的帳戶;
3, 通過最近的服務(wù)器竊取root 帳戶;
4, 通過用戶帳戶竊取root 帳戶;
5, 創(chuàng)建后門;
拒絕式服務(wù)攻擊是侵占機器所需資源的一種方法。有代表性的,D.O.S 攻擊,是非常殘
忍的攻擊機制,它通過壓倒性的流量來破壞服務(wù)器和網(wǎng)絡(luò)堆棧,試圖摧毀機器或使機器無法
使用。一些D.O.S 攻擊利用在網(wǎng)絡(luò)堆棧中的錯誤,僅用一個簡單的信息包就可以摧毀一臺機
器。這可以向內(nèi)核添加一個錯誤補丁來修復(fù)。在一些不利的條件下,對服務(wù)器的攻擊能夠被
修復(fù),只要適當(dāng)?shù)匦薷囊幌孪到y(tǒng)的選項來限制系統(tǒng)對服務(wù)器的負(fù)荷。頑強的網(wǎng)絡(luò)攻擊是很難
對付的。例如,一個欺騙性信息包的攻擊,無法阻止入侵者切斷你的系統(tǒng)與internet 的連接。
它不會使你的機器死掉,但它會把internet 管道塞滿。
竊取用戶帳戶要比D.O.S 攻擊更加普遍。許多系統(tǒng)管理員仍然在它們的服務(wù)器上運行著
基本的telnetd,rlogind,rshd,ftpd 服務(wù)。這些服務(wù)器默認(rèn)情況下,不會通過加密連接來操作。
結(jié)果是如果你的系統(tǒng)有中等規(guī)模大小的用戶,在通過遠(yuǎn)程登陸的方式登陸到你系統(tǒng)的用戶
中,一些人的密碼會被人竊取。仔細(xì)的系統(tǒng)管理員會從那些成功登陸系統(tǒng)的遠(yuǎn)程訪問日志中
尋找可疑的資源地址。
假定,一個入侵者已經(jīng)訪問到了一個用戶的帳戶,入侵者就會使超級用戶失效。然而,
事實是在一個安全的系統(tǒng)中,訪問用戶的帳戶不應(yīng)該給入侵者訪問root 的權(quán)限。這個區(qū)別
是很重要的,因為沒有訪問root 的權(quán)限,入侵者是無法隱藏它的軌跡的,但可能不需要做
什么,就可以把用戶的文件弄亂或使機器崩潰。竊取用戶帳戶是很普遍的事情,因為用戶往
第2 頁FreeBSD 使用手冊
往不會對系統(tǒng)管理員的警告采取措施。
系統(tǒng)管理員應(yīng)該牢牢記住,可能有許多潛在的方法會使root 失效。入侵者可能知道root
的密碼,可以在一個以root 權(quán)限運行的服務(wù)器上找到一個錯誤(bug),就可以通過網(wǎng)絡(luò)連
接到那臺服務(wù)器上使root 失效,或者一旦入侵者已經(jīng)侵入了一個用戶的帳戶,可以在自己
的機器上運行一個程序來發(fā)現(xiàn)服務(wù)器的漏洞,從而讓他侵入到服務(wù)器使root 失效。如果入
侵者已經(jīng)找到了方法使root 失效,入侵者就不需要安裝一個后門。許多root 漏洞被找到之
后,入侵者會想盡辦法去刪除日期來清除自己的訪問痕跡,所以很多入侵者會安裝后門。后
門能給入侵者提供一個簡單的重新獲取訪問系統(tǒng)的root 權(quán)限,但它也會給聰明的系統(tǒng)管理
員一個探測入侵的簡便方法。認(rèn)為入侵者不可能安裝了后門,這種思想事實上對你的系統(tǒng)安
全是有害的,因為這樣他就不會隔離從一開始就侵入系統(tǒng)的黑客發(fā)現(xiàn)的漏洞。
安全的管理方法應(yīng)當(dāng)使用象剝洋蔥皮一樣多層次,層層逼近的方法來實現(xiàn),可以按下面
的方式進(jìn)行分類:
1, 確保root 用戶和其它用戶帳戶的安全;
2, 確保root 用戶---以root 用戶權(quán)限運行的服務(wù)器和suid/sgid 二進(jìn)制程序的安全;
3, 確保用戶帳戶的安全;
4, 確保密碼文件的安全;
5, 確保內(nèi)核中內(nèi)核設(shè)備和文件系統(tǒng)的安全;
6, 快速檢測系統(tǒng)中發(fā)生的不適當(dāng)?shù)淖兓?nbsp;
7, 偏執(zhí)狂;
這一章的下一節(jié)將比較深入地講述上面提到的每一個條目。
10.3 確保FreeBSD 的安全
下面這節(jié)將講述確保系統(tǒng)安全的方法。
10.3.1 確保root 用戶和其它用戶帳戶的安全
首先,如果你沒有確保root 帳戶的安全,請不要為確保其它用戶的安全而煩惱。絕大
多數(shù)系統(tǒng)都會指派一個密碼給root 用戶帳戶。第一件事是假定密碼總是不安全。這并不意
味著你要把密碼刪掉。密碼通常對用控制臺訪問機器是必須的。也就是說,你不應(yīng)當(dāng)讓它用
到控制臺以外的密碼,即使是使用su 命令。例如,確信你的pty’s 作為不安全的因素已經(jīng)被
第3 頁FreeBSD 使用手冊
記錄在/etc/ttys 文件中,以至直接通過telnet 或rlogin 登陸root 會不被接受。如果使用(如sshd)
其它的登陸服務(wù),確認(rèn)直接登陸root 根本不行。考慮到每一種訪問方法--(如FTP 服務(wù))通
過cracks 經(jīng)常失敗。直接登陸root 應(yīng)當(dāng)只有通過系統(tǒng)控制臺被允許。
當(dāng)然,作為一個系統(tǒng)管理員,你應(yīng)當(dāng)獲得root 權(quán)限,所以我們公開幾個漏洞。但我們
確信這些漏洞需要額外的密碼確認(rèn)才能操作。一種成為root 訪問的是增加適當(dāng)用戶的帳戶
到wheel 組(在/etc/group 中)。Wheel 組中的用戶可以使用su 命令來訪問root。在它們的密
碼登陸口,通過把它們放置在wheel 組中,你就永遠(yuǎn)不會給用戶成員訪問本地wheel 的權(quán)限。
用戶帳戶應(yīng)當(dāng)被放置在staff 組中,然后通過/etc/group 文件加入到wheel 組。事實上,那些
需要訪問root 的用戶成員將會被放置在wheel 組中。當(dāng)然也會有可能,用一個如kerberos
的認(rèn)證方法。在root 帳戶中使用kerberos 的.k5login 文件,可以不需要把任何人放置在wheel
組中就允許ksu 訪問root.如果入侵者已經(jīng)獲得了密碼文件,或者已侵入了一個用戶帳戶,這
可能是一個比較好的解決方法,因為wheel 機制仍然可能會使入侵者break root。雖然wheel
機制要什么都沒有要好得多,但它也不是最安全的選擇。
確保超級用戶帳戶安全的間接方法是通過使用一個有選擇性的登陸訪問方法確保你的
用戶帳戶的安全。這樣做,入侵者可能會偷竊到密碼文件,但不會侵入任何用戶帳戶。用戶
成員通過使用一對私有或公共密匙(如kerberos 或ssh)的安全機制來進(jìn)入它們的帳戶。當(dāng)
你使用kerberos 時,你必須確保使用kerberos 的服務(wù)器或工作站的安全。當(dāng)你使用一對ssh
的公共/私有密匙系統(tǒng),你必須確保你所登陸的那臺機器的安全,但當(dāng)你用ssh-keygen 創(chuàng)建
它時,你可以添加一個額外的保護(hù)層到你的鑰匙對中。你可以強制所有的用戶成員使用加密
的方法連接它們的活動,這樣就可以關(guān)閉可能會被入侵者使用的一個重要漏洞:將一個毫無
關(guān)系,很不安全的機器與網(wǎng)絡(luò)隔離。
更多間接的安全機制能夠被實現(xiàn)。你可以從一個帶有限制性的服務(wù)器到一個毫無限制性
的服務(wù)器進(jìn)行登陸。例如,如果你的主郵箱運行在所有種類的服務(wù)器上,那你的工作站就無
法運行任何東西。為了確保你工作站的安全,盡可能少運行服務(wù)器,直到根本就沒有服務(wù)器
運行,然后運行一個受密碼保護(hù)的屏保。當(dāng)然,一個入侵者強行訪問你的工作站,它就會把
你所設(shè)置的所有安全特性都破壞掉。有一個問題必須明確,你必須考慮到這樣一個事實,絕
大多數(shù)入侵是從那些沒有物理訪問工作站或服務(wù)器權(quán)限的人那里,通過一個網(wǎng)絡(luò)來侵入的。
使用象kerberos 這樣的技術(shù),也會讓你無法使用系統(tǒng),或者改變用戶帳戶的密碼,從而影響
到擁有一個帳戶的所有用戶成員。如果一個用戶成員的帳戶已經(jīng)失去安全,應(yīng)當(dāng)改變它在所
有機器上的密碼。對于不連續(xù)的密碼,在n 臺機器上改變一個密碼可能是很亂的。你可能要
第4 頁FreeBSD 使用手冊
用kerberos 重建密碼的限制:一張kerberos 的許可證可能一段時間后會過期,但kerberos 系
統(tǒng)可能要求用戶在一段時間以后選擇一個新密碼(一般是一個月)。
10.3.2 確保以root 權(quán)限運行的服務(wù)器和suid/sgid 二進(jìn)制程序的安全
謹(jǐn)慎的系統(tǒng)管理員只運行他需要的服務(wù)器,不多也不少。要清醒地認(rèn)識到第三方的服
務(wù)器經(jīng)常有很多的錯誤。例如,運行一個老版本的imapd 或popper,就象是給出了一個通用
的root 帳號來訪問外部世界。運行每一個服務(wù)器,你都要仔細(xì)地檢查。許多服務(wù)器不一定
需要用root 來運行。例如,ntalk, comsat, 和finger 守護(hù)程序可能運行在一個特殊的用
戶sandboxes 上。一個sandbox 是不完全的,除非你遇到了許多問題,但安全的層級模式
仍然支持:如果能夠通過運行在一個sandbox 上的一個服務(wù)器侵入,他們?nèi)匀槐仨氁テ?
sandbox。攻擊者必須通過很多的安全層,這樣他侵入的可能性就很小了。過去已經(jīng)找到了
很多root 的安全漏洞,包括基本的系統(tǒng)服務(wù)器。如果你運行著用戶通過sshd 來登陸而從
不用telnetd 或rshd 或rlogind 來登陸的服務(wù)器,你最好把這些服務(wù)器關(guān)掉。
現(xiàn)在,F(xiàn)reeBSD 默認(rèn)在sandbox 中運行ntalkd, comsat,和finger。還有一個叫做named
的程序。/etc/defaults/rc.conf中包含了運行named 的選項,但被注意掉了。無論你是在
安裝一個新的系統(tǒng),還是升級一個已存在的系統(tǒng),被這些sandboxes 使用的特殊用戶帳號
可能沒有被安裝。謹(jǐn)慎的系統(tǒng)管理員無論何時都要認(rèn)真研究和執(zhí)行sandboxes。
有許多其他的服務(wù)器通常不能運行在sandboxes 中:sendmail, popper, imapd, ftpd,
和其他一些。你可以選一些,但安裝它們可能需要你做很多工作。你可能必須以root 來運
行這些服務(wù)器,然后依靠其他的機制來檢測可能通過他們進(jìn)行的侵入活動。
其他比較大的潛在的root 漏洞是安裝在系統(tǒng)中的suid-root 和sgid 程序。這些程序,
象rlogin,都放在/bin, /sbin, /usr/bin,或/usr/sbin 中。當(dāng)然,世上沒有100%的安全,
系統(tǒng)默認(rèn)的suid 和sgid 程序可能認(rèn)為是比較安全的。
另外,root 漏洞有時候能在這些程序中找到。在1998 年在xterm 的Xlib 中的一個root
漏洞被發(fā)現(xiàn)。謹(jǐn)慎的系統(tǒng)管理員需要限制suid 的程序,只有指定的人可以運行,指定人所
在的特殊組可以訪問,其他人都不能使用。一臺沒有顯示器的服務(wù)器通常不需要一個xterm
程序。
Sgid 程序可能也會有危險。如果一個入侵者能夠攻破sgid-kmem 程序,入侵者就可以
第5 頁FreeBSD 使用手冊
讀到/dev/kmem,因而可以讀到crypted 密碼文件,從而危及到受密碼保護(hù)的帳戶的安全。
另外,一個侵入組kmem 的入侵者可以通過pty’s 來監(jiān)測到擊鍵的情況,包括通過安全方
法登陸的用戶的情況。一個侵入tty 組的入侵者可以寫入幾乎任何用戶的tty。如果用戶正
在運行一個終端程序或帶有鍵盤模擬特性的模擬器,入侵者可以偷偷地發(fā)送一個數(shù)據(jù)流來
使用戶的終端顯示一個命令,然后就以那個用戶的身份來運行。
10.3.3 確保用戶帳戶的安全
用戶的帳戶通常是很難確保安全的。當(dāng)你用嚴(yán)格的訪問限制來約束你的用戶時,你不
可以使用你有的普通用戶帳戶來這樣做。如果你有充分的控制,那你可以確保用戶帳戶的
安全。如果沒有,你必須時刻警惕地監(jiān)視那些帳戶。為用戶的帳戶使用ssh 和kerberos 可
能會有問題,需要額外的管理和技術(shù)支持,但與crypted 密碼文件相比仍是一個比較好解決
方案。
10.3.4 確保密碼文件的安全
唯一的確保安全的方法是用*號來代替輸入的密碼,使用ssh 或kerberos 來訪問那些帳
戶。即使crypted 密碼文件(/etc/spwd.db)只能被root 讀取,入侵者可能無法獲得root 寫
的權(quán)限,但也可能會獲得讀的權(quán)限。
你的安全腳本必須經(jīng)常檢查和報告密碼文件的修改情況。
10.3.5 確保內(nèi)核核心,Raw 設(shè)備和文件系統(tǒng)的安全
如果一個入侵者攻破root,他就可以做任何事情。例如,絕大多數(shù)現(xiàn)代內(nèi)核都有一個
包來探測內(nèi)建的設(shè)備啟動器。在FreeBSD 下,它被叫做bpf 設(shè)備。一個入侵者通常會試圖
在一臺不安全的機器上運行一個包探測器。所以,絕大多數(shù)系統(tǒng)都不把bpf 設(shè)備編譯進(jìn)內(nèi)
核。
但即使你關(guān)閉了bpf 設(shè)備,你仍然可能會對/dev/mem 和/dev/kmem 擔(dān)心。因為,入侵
者仍可以寫到raw 磁盤設(shè)備。另外,還有另一個叫做module loader 的內(nèi)核特性,kldload。
一個入侵者可以在運行內(nèi)核時使用一個KLD module 來安裝它自己的bpf 設(shè)備,或其他檢測
設(shè)備。
第6 頁FreeBSD 使用手冊
要避免這些問題,你必須在更高安全級別上運行內(nèi)核,至少在securelevel 1 上。
Securelevel 可以在kern.securelevel 變量上用sysctl 來設(shè)置。一旦你把securelevel 設(shè)
置成1,對raw 設(shè)備的寫入操作將被拒絕,特殊的chflags 標(biāo)記如schg 將被強迫執(zhí)行。你
必須保證schg 標(biāo)記被設(shè)置在特定的啟動程序,目錄和腳本文件上。這樣做可能有點夸大了。
當(dāng)你在一個安全性比較高的水平上操作時,升級系統(tǒng)可能比較困難。
你可以折中一下,將系統(tǒng)運行在一個安全性更高的水平上,但不對每個系統(tǒng)文件和目
錄設(shè)置schg 標(biāo)記。另外一個方法是簡單地將/ 和/usr 設(shè)為只讀。這樣就可以阻止所有重要
的侵入檢測了。
10.3.6 檢查文件的完整性:程序,配置文件等
你需要保護(hù)你的核心系統(tǒng)配置和控制文件。例如,在/和/usr 中的絕大多數(shù)文件上使用
chflag 來設(shè)置schg 位可能達(dá)不到預(yù)期的目標(biāo),因為當(dāng)它保護(hù)文件的時候,它也會關(guān)閉一個
檢測窗口。你安全層的最后一層也許是最重要的檢測層。如果你不能檢測到潛在的入侵,
你安全層的其余部分可能就沒有用了。你的工作是要讓入侵者慢下來,而不是阻止它,以
便尋找時機抓住它。
檢測入侵的最好方法是尋找有沒有修改,丟失或不需要的文件。尋找修改文件的最好
方法是來自另一個訪問受限制的系統(tǒng)。在一個特別的訪問受到限制的系統(tǒng)上寫上你的安全
腳本使得入侵者不可見,這一點很重要。為了集中優(yōu)勢,你通常必須使用有限訪問的機器
來訪問其他機器,通常是執(zhí)行一個其他機器的只讀NFS 輸出到有限訪問的機器,或通過設(shè)
置ssh 鑰匙對來允許有限訪問的機器ssh 到其他機器。除了它的網(wǎng)絡(luò)傳輸,NFS 是很少用的
方法---允許你監(jiān)視每個客戶機的文件系統(tǒng)。
如果你的有限訪問服務(wù)器通過一個switch 來連接到客戶機,NFS 方法是比較好的選擇。
如果你的有限訪問服務(wù)器是通過一個hub 或通過幾層的路由連接到客戶機,NFS 方法可能很
不安全,使用ssh 可能是更好的選擇。
一旦你使用一個訪問受限制的機器,至少需要能讀取客戶系統(tǒng),你必須寫一些腳本來
執(zhí)行實時的檢測。掛上NFS 之后,你可以用find 和md5 這樣的工具。至少每天一次物理地
md5 客戶機文件。當(dāng)發(fā)現(xiàn)匹配錯誤時,會發(fā)出“尖叫聲”提示系統(tǒng)管理員去檢查。一個安全
腳本也會檢查不適當(dāng)?shù)膕uid 程序和系統(tǒng)分區(qū)上新增或刪除的文件。
第7 頁FreeBSD 使用手冊
當(dāng)使用ssh 而不是NFS 時,寫入安全腳本是很困難的。為了運行它們,你必須scp 腳
本到客戶機上,使它們看得見,為了安全你也必須scp 那些腳本使用的程序。在客戶機上
的ssh 程序已經(jīng)有安全問題了。總的來講,當(dāng)通過不安全的連接運行時,使用ssh 可能是
必須的,但它也比較難處理。
一個好的安全腳本將通過訪問配置文件來檢查用戶的變
化:.rhosts, .shosts, .ssh/authorized_keys。它已經(jīng)超出了MD5 檢查的范圍。
如果你有一個巨大的磁盤空間,它可能需要花很長時間來檢查每個文件。在這種情況
下,設(shè)置掛載標(biāo)記來不接受suid 程序和設(shè)備在那些分區(qū)上是一個好主意。nodev 選項nosuid
選項正是你所看到的。你可以把它們掃描一下,至少一個星期一次。
處理帳戶是操作系統(tǒng)的一個相關(guān)特性,它可以作為一個post-break-in 的評價機制。
它在跟蹤入侵者是如何侵入系統(tǒng)的時候特別有用.
最后,安全腳本應(yīng)當(dāng)處理日志文件。一個入侵者設(shè)法掩蓋自己的蹤跡,日志文件可以
指示系統(tǒng)管理員設(shè)法追蹤到最初侵入的時間和方法。確保日志文件持久記錄的日志文件的
一個方法是運行系統(tǒng)控制臺到一個串行口,通過持續(xù)不斷地檢測控制臺來收集信息。
10.3.7 偏執(zhí)狂
帶點偏執(zhí)可能不會有傷害。作為一個慣例,一個系統(tǒng)管理員需要添加許多安全特性,
并且盡可能地不影響到使用的便利性。更重要的是一個安全系統(tǒng)管理員應(yīng)當(dāng)經(jīng)常修復(fù)漏洞。
10.3.8 拒絕式服務(wù)攻擊(DoS)
這節(jié)將介紹拒絕式服務(wù)攻擊。一個DoS 攻擊通常是一個包攻擊,它可以使你的網(wǎng)絡(luò)癱
瘓。你應(yīng)當(dāng)做一些限制,讓攻擊不會癱瘓你的服務(wù)器。
1. 限制服務(wù)器的forks.
2. 限制跳板sPRingboard 攻擊(ICMP response attacks, ping broadcast, etc.)。
3. 內(nèi)核通道的緩存。
一個普通的DoS 攻擊通常試圖讓服務(wù)器吃掉所有進(jìn)程,文件描述和內(nèi)存,直到機器死
機。inetd 有好幾個選項可以來限制這種攻擊。需要注意的是當(dāng)無法阻止一個服務(wù)被攻擊所
打斷時,可以阻止一臺機器當(dāng)機。閱讀一下inetd 的聯(lián)機手冊,特別需要注意-c, -C, 和
第8 頁FreeBSD 使用手冊
-R 選項。注意,哄騙式的IP 攻擊可以饒過inetd 的-C 選項。所以,最好一起使用這些選
項。
Sendmail 有一個-OMaxDaemonChildren 選項,它往往要比sendmail 的負(fù)載限制選項工
作得好。你必須指定一個MaxDaemonChildren 參數(shù),當(dāng)你啟動sendmail 時,可能你期望有
很高的負(fù)載,但電腦無法處理這么高的負(fù)載。在隊列模式運行sendmail 時要非常謹(jǐn)慎
(-ODeliveryMode=queued)。如果你在一個很短的時間間隔內(nèi)實時分發(fā)你運行的隊列,如
-q1m,一定要為sendmail 指定一個合適的MaxDaemonChildren 選項以免發(fā)生錯誤。
Syslogd 可能會被直接攻擊,強烈建議你使用-s 選項,或-a 選項。你也應(yīng)當(dāng)注意象
tcpwrapper 的reverse-identd 這樣的后臺連接服務(wù),它可以被直接攻擊。因為這個原因,
你通常不要使用tcpwrappers 的reverse-ident 特性。
在你的路由器上設(shè)置一道防火墻來隔離內(nèi)部網(wǎng)絡(luò)與外部網(wǎng)絡(luò)之間的連接是非常好的安
全方法。這樣可以阻止你的內(nèi)部網(wǎng)絡(luò)受到來自外部網(wǎng)絡(luò)的攻擊。
這個方法可以阻斷除了你指定的如named, ntalkd, sendmail 這樣的服務(wù)以外的低級
端口。如果你設(shè)法使用其他方法來配置防火墻,你可能會忘記關(guān)閉一對服務(wù),或你添加了
一個新的內(nèi)部服務(wù)而忘記了升級防火墻。
你也可以在防火墻上打開比較高的端口范圍,允許有許可性質(zhì)的操作,而不會危及你
的低級端口的安全。FreeBSD 允許你控制用來動態(tài)綁定的端口號碼的范圍,通過不同的
net.inet.ip.portrange sysctl's(sysctl -a | fgrep portrange),將會減輕你的防火墻
配置的復(fù)雜性。例如,你可以使用普通的4000 到5000 端口范圍,以及更高的49152 到
65535 端口范圍,然后隔斷4000 以下的端口。
另一個普通的DoS 攻擊叫做springboard 攻擊—它會讓服務(wù)器不斷產(chǎn)生回應(yīng),最終導(dǎo)
致服務(wù)器,本地網(wǎng)絡(luò)或其他機器超載。最普通的攻擊是ICMP ping broadcast attack。
攻擊者欺騙性地用源IP 地址向你的LAN 廣播地址發(fā)送ping 數(shù)據(jù)包到他們希望攻擊的
實際機器。如果你的路由器無法阻止他們ping 廣播地址,你的LAN 就會對每個欺騙性的請
求產(chǎn)生回應(yīng),從而侵占大量的網(wǎng)絡(luò)資源,特別是當(dāng)攻擊者使用同樣的欺騙手段用幾十個廣
播地址從幾十個不同的網(wǎng)絡(luò)進(jìn)攻時。
第9 頁FreeBSD 使用手冊
超過120MB 的廣播攻擊是常用的。另外一個普通的攻擊是針對ICMP 錯誤報告系統(tǒng)的。
通過產(chǎn)生數(shù)據(jù)包來形成ICMP 錯誤請求,一個攻擊者可以侵占一個個服務(wù)器的輸入網(wǎng)絡(luò),使
得服務(wù)器用ICMP 請求占滿它的輸出網(wǎng)絡(luò)。如果服務(wù)器不能很快地處理ICMP 請求的話,這
種類型的攻擊也可以使服務(wù)器癱瘓。FreeBSD 內(nèi)核有一個叫做ICMP_BANDLIM 的新的內(nèi)核選
項,它可以限制這些端口攻擊的效率。這種跳板類的攻擊是與象這樣的udp echo 服務(wù)的某
個內(nèi)部inetd 服務(wù)有關(guān)的。
一個攻擊者只要簡單地用成為服務(wù)器A 的echo 端口的源地址和成為服務(wù)器B 的echo
端口的目的地址來哄騙一個UDP 數(shù)據(jù)包。兩個服務(wù)器就來回地彈發(fā)數(shù)據(jù)包。攻擊者只要發(fā)
送幾個這種類型的數(shù)據(jù)包就可以使服務(wù)器和內(nèi)部網(wǎng)癱瘓。類似的問題也存在于內(nèi)部chargen
端口。一個熟練的系統(tǒng)管理員會關(guān)閉所有這些內(nèi)部的inetd 測試服務(wù)。
哄騙式數(shù)據(jù)包攻擊也可以被用來是內(nèi)核路由緩存超載??梢詤⒖家幌?
net.inet.ip.rtexpire, rtminexpire, 和rtmaxcache sysctl 參數(shù)。隨意使用一個源IP
進(jìn)行的哄騙式的數(shù)據(jù)包攻擊將使內(nèi)核在路由表中產(chǎn)生一個臨時的高速緩沖路由,可以用
netstat -rna | fgrep W3 檢查一下。這些路由大約會超時1600 秒。如果內(nèi)核檢測到緩沖
路由表太大,它將動態(tài)地減少rtexpire,但不會小于rtminexpire。有兩個問題:
1. 當(dāng)一個負(fù)載量很小的服務(wù)器突然受到攻擊時,內(nèi)核沒有很快地響應(yīng)。
2. 由于rtminexpire 太小而無法抵抗住一個持續(xù)不斷的攻擊。
如果你的服務(wù)器通過T3 或更高速度的線路連接到internet,可能需要通過使用sysctl
來手動地調(diào)整rtexpire 和rtminexpire。千萬不要把參數(shù)設(shè)為0(除非你想要摧毀機器)。
把參數(shù)設(shè)為2 秒對于保護(hù)路由表免受攻擊是非常好的。
10.3.9 用Kerberos 和SSH 的訪問問題
如果你打算使用它們的話,在kerberos 和ssh 之間有好幾個問題需要記住。Kerberos
V 是一個非常卓越的驗證協(xié)議,但在加密telnet 和rlogin 應(yīng)用程序時會有一些錯誤,可能
會使它們不太適合處理二進(jìn)制數(shù)據(jù)流。另外,默認(rèn)的kerberos 也無法加密一個會話,除非
你使用-x 選項。ssh 默認(rèn)能加密任何東西。
我們建議無論用戶什么時候登陸系統(tǒng),你都可以結(jié)合kerberos 來使用ssh。ssh 可以在
編譯時加入對kerberos 的支持。我們也建議你在ssh 配置中關(guān)閉key-forwarding,或者在它
第10 頁FreeBSD 使用手冊
的authorized_keys 文件中使用from=IP/DOMAIN 選項使得只有用作實體的密匙可以從特殊
機器登陸進(jìn)系統(tǒng)。
10.4 DES, MD5 和Crypt
在unix 系統(tǒng)上的每個用戶有一個與他們的帳號相關(guān)聯(lián)的密碼??雌饋磉@些密碼只有用
戶和操作系統(tǒng)知道。為了確保這些密碼的秘密,他們通過一種叫做one-way hash 的方式來
加密,它們能被很容易地加密,但不能解密。換句話說,以前我們告訴你的通常不是真的:
操作系統(tǒng)通常并不真正知道密碼。它只知道密碼的加密形式。
加密密碼的唯一安全方式是以DES 為基礎(chǔ)的數(shù)據(jù)加密標(biāo)準(zhǔn)。這對于US 用戶來說沒有什
么問題,但DES 的源代碼不允許被輸出到US 以外的國家,F(xiàn)reeBSD 必須找到一個既遵守US
法律,又要與其他使用DES 的unix 兼容的方法。
解決方法是分解加密庫以至于US 用戶可以安裝DES 庫和使用DES,而國際用戶也有一
個加密方法。這就是FreeBSD 為什么使用MD5 來作為默認(rèn)的加密方法。MD5 被認(rèn)為要比DES
更安全,所以使用DES 主要是為了兼容性的原因。
10.4.1 重新配置你的Crypt 機制
可以很容易地設(shè)置FreeBSD 使用哪種加密方法。檢查/etc/master.passwd 文件中的加
密密碼是一種方法。用MD5 加密的密碼通常要比用DES 加密的密碼長,通常以$1$字符作為
起始。DES 密碼字符沒有任何鑒別特征,但它們要比MD5 密碼短,通常是以64 位字符的字
母表來編碼的,它不包括$字符,所以通常一個不以$符號開始的很可能是DES 密碼。
也可以通過區(qū)別庫來鑒別密碼。DES 庫能夠鑒別MD5 密碼,使用MD5 來檢查用哪種方法
加密的密碼,然后用DES 加密剩下的。之所以可以這樣做,是因為DES 庫也包括MD5。但是,
倒過來就不行了,所以MD5 庫不能鑒別用DES 加密的密碼。
鑒別你當(dāng)前系統(tǒng)使用的是哪個庫也是很容易的。任何使用crypt 的程序是與libcrypt
連接在一起的,每一種類型的庫是與適當(dāng)?shù)膱?zhí)行程序有一個符號連接的。例如,在使用DES
的系統(tǒng)上:
% ls -l /usr/lib/libcrypt*
lrwxr-xr-x 1 root wheel 13 Mar 19 06:56 libcrypt.a -> libdescrypt.a
第11 頁FreeBSD 使用手冊
lrwxr-xr-x 1 root wheel 18 Mar 19 06:56 libcrypt.so.2.0 ->
libdescrypt.so.2.0
lrwxr-xr-x 1 root wheel 15 Mar 19 06:56 libcrypt_p.a -> libdescrypt_p.a
在使用MD5 庫的系統(tǒng)上,同樣的連接也會出現(xiàn),但目標(biāo)庫是libscrypt 而不是
libdescrypt。如果你安裝了DES 用的crypt 庫libdescrypt,哪個密碼格式將被用作新的密
碼可以通過在/etc/login.conf 中設(shè)置passwd_format 來控制,要么使用DES,要么使用MD5。
看看login.conf 的聯(lián)機手冊了解更多信息。
10.5 S/Key
S/key 是基于單向hash 功能的一次性密碼管理方式。FreeBSD 為了考慮兼容性,就使
用MD4 hash 函數(shù),但其它系統(tǒng)則使用MD5 和DES-MAC。從1.1.5 版開始,S/key 已經(jīng)成為
FreeBSD 的基本系統(tǒng),同時也廣泛應(yīng)用于其他操作系統(tǒng)。S/key 是Bell Communications
Research, Inc 的注冊商標(biāo)。
下面將討論三種不同的密碼形式。第一種是你通常使用的Unix 風(fēng)格或Kerberos 密碼;
我們把它叫做Unix passWord。第二種是由S/key 程序產(chǎn)生,然后被keyinit 程序和登陸命
令接受的一次性密碼;我們把它叫做one-time password。最后一種密碼是由專門的密碼生
成程序生成的秘密密碼;我們把它叫做secret password 或絕對password。
秘密密碼與unix password 毫無關(guān)系;他們也可能是一樣的,但并不推薦使用。S/key
秘密密碼不象unix 密碼需要限制在8 位以內(nèi),它們可能會更長。一般都使用6 到7 位的長
度。另外,S/key 系統(tǒng)操作完全獨立于unix password 系統(tǒng)。
除了密碼,對于S/key 有兩個數(shù)據(jù)很重要。一個是以seed 或key 出名,包含兩個字母
和五個數(shù)字。其他的被叫做iteration count,在1 到100 之間。S/key 通過連接“種子”
(seed)和秘密密碼來生成一次性密碼,然后通過反復(fù)計算多次應(yīng)用MD4 hash,再把結(jié)果
變成六個英文字。這六個英文字就是你的一次性密碼。如果用戶提供的密碼的hash 值與先
前的密碼相一致,那用戶就通過了認(rèn)證;每個成功的登陸確保用戶和登陸程序保持同步之
后,計算的次數(shù)就不斷減少。當(dāng)反復(fù)計算的降到1 時,S/key 必須被重新初始化。
有四個程序被包含在S/key 系統(tǒng)中,我們下面會談到。密碼程序接受一個反復(fù)計算數(shù),
一個種子,和一個秘密密碼,然后產(chǎn)生一個一次性密碼。Keyinit 程序被用來初始化S/key,
第12 頁FreeBSD 使用手冊
然后改變密碼,反復(fù)計算數(shù)或種子;它不是接受一個秘密密碼,就是一個反復(fù)計算數(shù),種
子和一次性密碼。Keyinfo 程序會檢查文件,然后打印出被調(diào)用的當(dāng)前反復(fù)計算數(shù)和種子。
最后,login 和su 程序包含了用于認(rèn)證S/key 一次性密碼的必需的邏輯性。login 程序也
可以不使用unix 密碼。
我們將講述四種不同的操作。第一種是首先通過一個安全連接設(shè)置S/key 使用keyinit
程序,或改變你的密碼或種子。第二種操作是通過一個不安全的連接使用keyinit 程序,
通過一個安全的連接與密碼程序相關(guān)聯(lián),同樣能達(dá)到目的。第三種是使用密碼程序產(chǎn)生許
多key,它可以被記錄或打印出來。
10.5.1 安全連接的初始化
首先是當(dāng)通過一個安全連接登陸時,初始化S/key,改變你的密碼,或改變你的種子,
當(dāng)你自己登陸時,使用不帶任何參數(shù)的keyinit 程序:
% keyinit
Adding unfurl:
Reminder - Only use this method if you are directly connected.
If you are using telnet or rlogin exit with no password and use keyinit -s.
Enter secret password:
Again secret password:
ID unfurl s/key is 99 to17757
DEFY CLUB PRO NASH LACE SOFT
在鍵入秘密密碼時:你必須鍵入一個密碼或短語。記住,這不是你用來登陸的密碼,
它只是用來產(chǎn)生一次性登陸密碼。ID 行給出了你特定的S/key 實例的參數(shù);你的登陸名,
反復(fù)計算數(shù),和種子。當(dāng)用S/key 登陸系統(tǒng)時,系統(tǒng)將記住這些參數(shù),然后把它們返回給
你,所以你不必記住它們。最后一行給出了與那些參數(shù)和你的秘密密碼相一致的特定的一
次性密碼;如果你需要立刻重新登陸,這個一次性密碼就是你使用的。
第13 頁FreeBSD 使用手冊
10.5.2 不安全連接初始化
通過一個不安全的連接來初始化S/key 或改變你的秘密密碼,你必須已經(jīng)有連接到可
以運行密碼程序的地方的安全連接。這可以是在Macintosh 上桌面訪問的方式,或是在你
信任的機器上的一個shell 命令。你也必須指定一個反復(fù)計算數(shù)(通常是100),你可以使
用你自己的種子,或使用一個隨機產(chǎn)生的值。在一個不安全的連接上,可以使用keyinit -s
命令:
% keyinit -s
Updating unfurl:
Old key: to17758
Reminder you need the 6 English words from the key command.
Enter sequence count from 1 to 9999: 100
Enter new key [default to17759]:
s/key 100 to 17759
s/key access password:
要接受默認(rèn)的種子,鍵入return。然后鍵入一個訪問密碼,轉(zhuǎn)移到你的安全連接或S/key
桌面程序,給它指定一樣的參數(shù):
% key 100 to17759
Reminder - Do not use this program while logged in via telnet or rlogin.
Enter secret password: <secret password>
CURE MIKE BANE HIM RACY GORE
現(xiàn)在,切換到不安全的連接,拷貝一次性通過密碼程序產(chǎn)生的一次性密碼給keyinit
程序:
s/key access password:CURE MIKE BANE HIM RACY GORE
第14 頁ID unfurl s/key is 100 to17759
CURE MIKE BANE HIM RACY GORE
10.5.3 產(chǎn)生一個簡單的一次性密碼
一旦你初始化你S/key,當(dāng)你登陸時,你會看到下面的命令行:
% telnet example.com
Trying 10.0.0.1...
Connected to example.com
Escape character is '^]'.
FreeBSD/i386 (example.com) (ttypa)
login: <username>
s/key 97 fw13894
Password:
另外,S/key 有一個很有用的特性:如果你在密碼行鍵入return 鍵,登陸程序?qū)?
鍵入的密碼顯示出來,所以你可以看到你鍵入的密碼。如果你試圖手工鍵入一個S/key,這
個非常有用。如果這臺機器被配置成通過一個來自源機器的連接不接受unix 密碼,命令行
也將包括注意(S/key 必須),指出只有s/key 一次性密碼將被接受。
基于這點,你必須產(chǎn)生你的一次性密碼來回答這個登陸命令。這必須在一個可以運行密
碼命令的可信任的系統(tǒng)上做。密碼程序既需要反復(fù)計算數(shù)和種子,也需要命令行選項。你可
以從你登陸的機器的命令行剪切和粘貼這些選項。
在可信任的系統(tǒng)上:
% key 97 fw13894
FreeBSD 使用手冊
第15 頁FreeBSD 使用手冊
Reminder - Do not use this program while logged in via telnet or rlogin.
Enter secret password:
WELD LIP ACTS ENDS ME HAAG
現(xiàn)在,你已經(jīng)有了可以繼續(xù)登陸的一次性密碼:
login: <username>
s/key 97 fw13894
Password: <return to enable echo>
s/key 97 fw13894
Password [echo on]: WELD LIP ACTS ENDS ME HAAG
Last login: Tue Mar 21 11:56:41 from 10.0.0.2 ...
如果你有一個可信任的系統(tǒng),這是最容易的機制。有一個java S/key 密碼小程序,The
Java OTP Calculator,你可以下載和在本地支持java 的瀏覽器中運行。
10.5.4 產(chǎn)生多個一次性密碼
有時,你會來到你不能訪問一個可信任的機器或安全連接的地方。在這個例子中,可以
使用密碼命令來產(chǎn)生許多一次性密碼,例如:
% key -n 5 30 zz99999
Reminder - Do not use this program while logged in via telnet or rlogin.
Enter secret password: <secret password>
26: SODA RUDE LEA LIND BUDD SILT
27: JILT SPY DUTY GLOW COWL ROT
28: THEM OW COLA RUNT BONG SCOT
29: COT MASH BARR BRIM NAN FLAG
第16 頁FreeBSD 使用手冊
30: CAN KNEE CAST NAME FOLK BILK
-n 5 按順序請求5 個密匙,30 指定了最后的反復(fù)計算的號碼是什么。注意這些將按與
實際相反的順序打印出來。如果你是一個偏執(zhí)狂,你可以手工寫下這些結(jié)果;否則你可以打
印出來。注意,每一行都顯示了重復(fù)計算數(shù)和一次性的密碼。
10.5.5 Unix 密碼的限制使用
這種限制可能是基于主機名,用戶名,終端口,或登陸時的IP 地址的unix 密碼的使用。
這些限制可以在配置文件/etc/skey.access 中找到。skey.access 的聯(lián)機手冊中,有這個文
件的完整格式和細(xì)節(jié)。
如果沒有/etc/skey.access 文件(這是FreeBSD 默認(rèn)的),那所有的用戶將被允許使
用unix 密碼。如果文件存在,那所有的用戶將被要求使用s/key,除非明確地允許這樣做。
在所有的案例中,unix 密碼是允許用在控制臺的。
這兒是一個配置文件的例子,下面舉三種普通使用的配置例子:
permit internet 192.168.0.0 255.255.0.0
permit user fnord
permit port ttyd0
第一行允許他的Ip 源地址與指定的值和掩碼相配的用戶使用unix 密碼。這不應(yīng)當(dāng)被認(rèn)
為是一種安全的機制,但應(yīng)當(dāng)提醒那些使用不安全連接的網(wǎng)絡(luò)的用戶必須使用s/key 驗證。
第二行允許指定用戶名在任何時候使用unix 密碼,在這個例子中是fnord。一般來講,
這將被那些不能使用密碼程序的人或不可教育的人來使用。
第三行允許所有的通過指定的終端行登陸的用戶使用unix 密碼;這將被用在撥號中。
10.6 Kerberos
Kerberos 是一個網(wǎng)絡(luò)附加系統(tǒng)/協(xié)議,可以允許用戶通過一個安全服務(wù)器的服務(wù)來驗證
他們自己。象遠(yuǎn)程登陸,遠(yuǎn)程拷貝,系統(tǒng)間的相互文件拷貝和其他高風(fēng)險任務(wù)的服務(wù)將被變
得相當(dāng)安全和可控制。
下面的文章將用來指導(dǎo)你如何為FreeBSD 設(shè)置Kerberos。你也可以參考相關(guān)的聯(lián)機手冊
第17 頁FreeBSD 使用手冊
了解更詳細(xì)的說明。
在FreeBSD 中,Kerberos 不是來自最初的4.4BSD-Lite,而是eBones,來自于USA/Canada
以外的地區(qū),那些受到美國加密代碼出口限制的國家就可以使用它。
10.6.1 創(chuàng)建最初的數(shù)據(jù)庫
這只可以由Kerberos 服務(wù)器來做。首先確定你沒有舊的Kerberos 數(shù)據(jù)庫。你必須改變
/etc/kerberosIV 的目錄,然后只檢查下面出現(xiàn)的文件:
# cd /etc/kerberosIV
# ls
README krb.conf krb.realms
如果任何其他文件(如principal.* 或master_key)存在,那使用kdb_destroy 命令就
可以破壞舊的Kerberos 數(shù)據(jù)庫,或者如果Kerberos 不在運行,只要刪除其他的文件。
你現(xiàn)在必須編輯krb.conf 和krb.realms 文件來定義你的Kerberos 規(guī)則。在這個例子
中,規(guī)則將是GRONDAR.ZA,服務(wù)器是grunt.grondar.za。我們可以編輯或創(chuàng)建krb.conf
文件:
# cat krb.conf
GRONDAR.ZA
GRONDAR.ZA grunt.grondar.za admin server
CS.BERKELEY.EDU okeeffe.berkeley.edu
ATHENA.MIT.EDU kerberos.mit.edu
ATHENA.MIT.EDU kerberos-1.mit.edu
ATHENA.MIT.EDU kerberos-2.mit.edu
ATHENA.MIT.EDU kerberos-3.mit.edu
LCS.MIT.EDU kerberos.lcs.mit.edu
第18 頁FreeBSD 使用手冊
TELECOM.MIT.EDU bitsy.mit.edu
ARC.NASA.GOV trident.arc.nasa.gov
在這個例子中,其他規(guī)則沒有出現(xiàn)。他們在這兒作為一個機器如何應(yīng)用多種規(guī)則的例子。
你可能希望不要簡單地包括它們。
第一行命名了這個系統(tǒng)工作的規(guī)則。其它行包含了規(guī)則/主機的記錄。每行的第一項就
是一個規(guī)則,第二個是充當(dāng)一個key distribution center 的規(guī)則中的一臺主機。接在一個
主機名后面的管理服務(wù)器的命令意味著主機也要提供一個管理數(shù)據(jù)庫服務(wù)器。更多信息,可
以參考Kerberos 的聯(lián)機手冊。
現(xiàn)在,我們必須添加grunt.grondar.za 到GRONDAR.ZA,然后添加一個記錄把所有主機
放在.grondar.za 域中。krb.realms 文件將被升級:
# cat krb.realms
grunt.grondar.za GRONDAR.ZA
.grondar.za GRONDAR.ZA
.berkeley.edu CS.BERKELEY.EDU
.MIT.EDU ATHENA.MIT.EDU
.mit.edu ATHENA.MIT.EDU
它們在這兒作為一個例子來指出一臺機器如何可以知道多個領(lǐng)域。你也可以簡單地把它
們刪除。
第一行把指定的系統(tǒng)放在已命名的域中。其他行顯示了如何把一個特殊子域的系統(tǒng)默認(rèn)
設(shè)為一個命名的域。
現(xiàn)在我們已經(jīng)準(zhǔn)備創(chuàng)建數(shù)據(jù)庫。這將需要運行Kerberos 服務(wù)器。執(zhí)行命令kdb_init:
# kdb_init
Realm name [default ATHENA.MIT.EDU ]: GRONDAR.ZA
You will be prompted for the database Master Password.
第19 頁FreeBSD 使用手冊
It is important that you NOT FORGET this password.
Enter Kerberos master key:
現(xiàn)在我們必須保存密匙,以便本地機器的服務(wù)器能夠得到加速。使用kstash 命令:
# kstash
Enter Kerberos master key:
Current Kerberos master key version is 1.
Master key entered. BEWARE!
這保存加密過的主密碼在/etc/kerberosIV/master_key。
10.6.2 使它完全運行
有兩個主要的東西需要被添加到要用Kerberos 確保安全的每個系統(tǒng)的數(shù)據(jù)庫中。它們
的名稱是kpasswd 和rcmd。這些程序允許其他系統(tǒng)改變Kerberos 的密碼,然后象rcp, rlogin
和rsh 一樣運行命令。
現(xiàn)在,讓我們添加這些記錄:
# kdb_edit
Opening database...
Enter Kerberos master key:
第20 頁FreeBSD 使用手冊
Current Kerberos master key version is 1.
Master key entered. BEWARE!
Previous or default values are in [brackets] ,
enter return to leave the same, or new value.
Principal name: passwd
Instance: grunt
<Not found>, Create [y] ? y
Principal: passwd, Instance: grunt, kdc_key_ver: 1
New Password: <---- enter RANDOM here
Verifying password
New Password: <---- enter RANDOM here
Random password [y] ? y
Principal's new key version = 1
Expiration date (enter yyyy-mm-dd) [ 2000-01-01 ] ?
第21 頁FreeBSD 使用手冊
Max ticket lifetime (*5 minutes) [ 255 ] ?
Attributes [ 0 ] ?
Edit O.K.
Principal name: rcmd
Instance: grunt
<Not found>, Create [y] ?
Principal: rcmd, Instance: grunt, kdc_key_ver: 1
New Password: <---- enter RANDOM here
Verifying password
New Password: <---- enter RANDOM here
Random password [y] ?
Principal's new key version = 1
Expiration date (enter yyyy-mm-dd) [ 2000-01-01 ] ?
Max ticket lifetime (*5 minutes) [ 255 ] ?
Attributes [ 0 ] ?
Edit O.K.
第22 頁FreeBSD 使用手冊
Principal name: <---- null entry here will cause an exit
10.6.3 創(chuàng)建新的服務(wù)器文件
我們現(xiàn)在必須分析在每臺機器上定義的服務(wù)的所有情況。我們使用ext_srvtab 命令。
這將創(chuàng)建一個文件,它必須通過安全方式被拷貝或移動到每個Kerberos 客戶端的
/etc/kerberosIV 目錄。這個文件必須在每個服務(wù)器和客戶機上出現(xiàn),這對Kerberos 的操
作是很重要的。
# ext_srvtab grunt
Enter Kerberos master key:
Current Kerberos master key version is 1.
Master key entered. BEWARE!
Generating 'grunt-new-srvtab'....
現(xiàn)在,這個命令只產(chǎn)生一個臨時文件,它必須被重命名為srvtab,以便所有的服務(wù)可
以得到加速。使用mv 命令把它移到最初的系統(tǒng)上:
# mv grunt-new-srvtab srvtab
如果文件是針對客戶系統(tǒng)的,那網(wǎng)絡(luò)可能就會不安全,拷貝client-new-srvtab 到可抽
取式設(shè)備上,然后通過安全的物理方式進(jìn)行傳輸。確信在客戶機的/etc/kerberosIV 目錄中
把它重命名為srvtab,確定它是mode 600:
# mv grumble-new-srvtab srvtab
# chmod 600 srvtab
10.6.4 定位數(shù)據(jù)庫
第23 頁FreeBSD 使用手冊
我們現(xiàn)在添加一些用戶記錄到數(shù)據(jù)庫。首先,讓我們?yōu)橛脩鬸ane 創(chuàng)建一個記錄。使用
kdb_edit 命令來完成:
# kdb_edit
Opening database...
Enter Kerberos master key:
Current Kerberos master key version is 1.
Master key entered. BEWARE!
Previous or default values are in [brackets] ,
enter return to leave the same, or new value.
Principal name: jane
Instance:
<Not found>, Create [y] ? y
Principal: jane, Instance: , kdc_key_ver: 1
New Password: <---- enter a secure password here
Verifying password
第24 頁FreeBSD 使用手冊
New Password: <---- re-enter the password here
Principal's new key version = 1
Expiration date (enter yyyy-mm-dd) [ 2000-01-01 ] ?
Max ticket lifetime (*5 minutes) [ 255 ] ?
Attributes [ 0 ] ?
Edit O.K.
Principal name: <---- null entry here will cause an exit
10.6.5 測試所有的
首先我們必須啟動Kerberos 守護(hù)程序。注意如果你沒有正確地編輯你的/etc/rc.conf
文件,那這將在你重啟系統(tǒng)的時候自動發(fā)生。這只有在Kerberos 服務(wù)器上是必須的。
Kerberos 客戶機將從/etc/kerberosIV 目錄自動獲得他們所需要的。
# kerberos &
Kerberos server starting
Sleep forever on error
Log file is /var/log/kerberos.log
Current Kerberos master key version is 1.
Master key entered. BEWARE!
Current Kerberos master key version is 1
Local realm: GRONDAR.ZA
# kadmind -n &
第25 頁FreeBSD 使用手冊
KADM Server KADM0.0A initializing
Please do not use 'kill -9' to kill this job, use a
regular kill instead
Current Kerberos master key version is 1.
Master key entered. BEWARE!
現(xiàn)在,我們可以使用命令kinit 得到一個id 為jane 的“入場券”:
% kinit jane
MIT Project Athena (grunt.grondar.za)
Kerberos Initialization for "jane"
Password:
如果我們正的有它們,使用klist 設(shè)法列出記號:
% klist
Ticket file: /tmp/tkt245
Principal: jane@GRONDAR.ZA
Issued Expires Principal
Apr 30 11:23:22 Apr 30 19:23:22 krbtgt.GRONDAR.ZA@GRONDAR.ZA
現(xiàn)在,如果kpasswd 程序可以得到數(shù)據(jù)庫的驗證,可以使用passwd 來檢查正在修改的
密碼:
% passwd
第26 頁FreeBSD 使用手冊
realm GRONDAR.ZA
Old password for jane:
New Password for jane:
Verifying password
New Password for jane:
Password changed.
10.6.6 添加su 特權(quán)
Kerberos 允許我們給每個需要root 權(quán)限的用戶他們自己的分離supassword。我們現(xiàn)在
可以添加一個被用來驗證su 到root 的id。使用kdb_edit,我們可以在Kerberos 數(shù)據(jù)庫中
創(chuàng)建一個記錄jane.root:
# kdb_edit
Opening database...
Enter Kerberos master key:
Current Kerberos master key version is 1.
Master key entered. BEWARE!
Previous or default values are in [brackets] ,
enter return to leave the same, or new value.
Principal name: jane
第27 頁FreeBSD 使用手冊
Instance: root
<Not found>, Create [y] ? y
Principal: jane, Instance: root, kdc_key_ver: 1
New Password: <---- enter a SECURE password here
Verifying password
New Password: <---- re-enter the password here
Principal's new key version = 1
Expiration date (enter yyyy-mm-dd) [ 2000-01-01 ] ?
Max ticket lifetime (*5 minutes) [ 255 ] ? 12 <--- Keep this short!
Attributes [ 0 ] ?
Edit O.K.
Principal name: <---- null entry here will cause an exit
現(xiàn)在設(shè)法獲得一些記號來確定它在做什么:
# kinit jane.root
MIT Project Athena (grunt.grondar.za)
Kerberos Initialization for "jane.root"
Password:
第28 頁FreeBSD 使用手冊
現(xiàn)在,我們必須添加用戶到root 的.klogin 文件:
# cat /root/.klogin
jane.root@GRONDAR.ZA
現(xiàn)在設(shè)法執(zhí)行su:
% su
Password:
看看我們有些什么符號:
# klist
Ticket file: /tmp/tkt_root_245
Principal: jane.root@GRONDAR.ZA
Issued Expires Principal
May 2 20:43:12 May 3 04:43:12 krbtgt.GRONDAR.ZA@GRONDAR.ZA
10.6.7 使用其他命令
在一個早期的例子中,我們創(chuàng)建了一個叫做jane 的用戶作為一個root。這里就以這個
用戶為例,這是Kerberos 默認(rèn)的;如果必須的記錄在.klogin 文件中,那形式
<username>.root 的<principal>.<instance>將允許<username> su 到root:
# cat /root/.klogin
jane.root@GRONDAR.ZA
同樣的,如果一個用戶已在它們自己的home 目錄行中:
% cat ~/.klogin
jane@GRONDAR.ZA
第29 頁FreeBSD 使用手冊
jack@GRONDAR.ZA
這允許在GRONDAR.ZA 中的已通過jane 或jack 驗證的任何人通過rlogin, rsh 或rcp
訪問并登陸到j(luò)ane 的在這個系統(tǒng)上的帳戶或文件。
例如,jane 現(xiàn)在登陸進(jìn)另一個系統(tǒng),使用Kerberos:
% kinit
MIT Project Athena (grunt.grondar.za)
Password:
% rlogin grunt
Last login: Mon May 1 21:14:47 from grumble
Copyright (c) 1980, 1983, 1986, 1988, 1990, 1991, 1993, 1994
The Regents of the University of California. All rights reserved.
FreeBSD BUILT-19950429 (GR386) #0: Sat Apr 29 17:50:09 SAT 1995
或者jack 登陸進(jìn)在同一機器上的jane 的帳戶。
% kinit
% rlogin grunt -l jane
MIT Project Athena (grunt.grondar.za)
Password:
Last login: Mon May 1 21:16:55 from grumble
Copyright (c) 1980, 1983, 1986, 1988, 1990, 1991, 1993, 1994
The Regents of the University of California. All rights reserved.
FreeBSD BUILT-19950429 (GR386) #0: Sat Apr 29 17:50:09 SAT 1995
第30 頁FreeBSD 使用手冊
10.7 防火墻
防火墻是提高人們訪問互聯(lián)網(wǎng)的興趣的一個工具,它能夠提高私有網(wǎng)絡(luò)的安全性。這節(jié)
將介紹防火墻是什么,如何使用它們,和如何使用內(nèi)核中提供的工具來實現(xiàn)它們。
注意:人們經(jīng)常認(rèn)為在你的內(nèi)部網(wǎng)絡(luò)與外部網(wǎng)絡(luò)之間建立一個防火墻能夠解決所有的安
全問題。但是一個糟糕的防火墻設(shè)置要比沒有防火墻可能更加危險。一個防火墻可以為你的
系統(tǒng)增加另一個安全層,但它不可能完全阻止一些黑客高手侵入你的系統(tǒng)。如果你覺得你的
防火墻能夠完全阻止黑客入侵而放松了安全設(shè)置,那你可能會讓黑客侵入你的系統(tǒng)變得更加
容易。
10.7.1 什么是防火墻?
今天,經(jīng)常使用的防火墻主要有兩種類型。第一種類型是叫做packet filtering
router,它主要是通過設(shè)置一定的規(guī)則來轉(zhuǎn)發(fā)或阻止數(shù)據(jù)包的傳輸。第二種是proxy server,
依靠守護(hù)程序來提供驗證,然后轉(zhuǎn)發(fā)數(shù)據(jù)包。
有時,有些站點同時使用兩種類型的防火墻,以至只有某臺機器(主要是bastion host)
才能被允許發(fā)送數(shù)據(jù)包到內(nèi)部網(wǎng)絡(luò)。代理服務(wù)運行在bastion host上,通常它要比普通的
驗證機制安全。
FreeBSD 有一個內(nèi)核數(shù)據(jù)包過濾程序(IPFW),在這節(jié)的余下部分將詳細(xì)講到,但由于有
很多的代理服務(wù)器可以使用,所以在這篇文檔中無法一一講到。
10.7.1.1 數(shù)據(jù)包過濾路由
路由器是負(fù)責(zé)在網(wǎng)絡(luò)之間轉(zhuǎn)發(fā)數(shù)據(jù)的機器。一個數(shù)據(jù)包過濾路由器在它的內(nèi)核中有額外
一部分代碼,它們在決定數(shù)據(jù)包是被轉(zhuǎn)發(fā)還是被阻止之前,會根據(jù)給出的規(guī)則比較每個數(shù)據(jù)
包。絕大多數(shù)現(xiàn)代的IP 路由軟件都有數(shù)據(jù)包過濾代碼。要啟用這些過濾器,你必須定義一
些過濾代碼的規(guī)則,以便它能決定數(shù)據(jù)包是否被允許轉(zhuǎn)發(fā)或阻止。
過濾代碼會檢查所設(shè)定的匹配一個數(shù)據(jù)包頭部內(nèi)容的規(guī)則來決定這個數(shù)據(jù)包是否被通
過。一旦一個匹配找到了,這個規(guī)則動作就啟用了。這個規(guī)則可能會減慢數(shù)據(jù)包以便傳輸數(shù)
據(jù),或是發(fā)送一個ICMP 信息給這個數(shù)據(jù)包的發(fā)送者。只有第一個匹配會計數(shù),以便按順序
來查找到這些規(guī)則。因此,這些規(guī)則的列表可以被看作是規(guī)則鏈。
第31 頁FreeBSD 使用手冊
數(shù)據(jù)包匹配標(biāo)準(zhǔn)的變化依賴于使用的軟件,但典型的你可以指定依賴于數(shù)據(jù)包的源IP
地址,目的IP 地址,源端口號,目的端口號,或是數(shù)據(jù)包類型(UDP, TCP, ICMP 等)的規(guī)則,
10.7.1.2 代理型服務(wù)器
代理型服務(wù)器是把普通系統(tǒng)守護(hù)程序(telnetd, ftpd 等)用作特殊服務(wù)器的機器。這些
服務(wù)器被叫做proxy servers。這個可以在你的防火墻主機上運行一個代理telnet 服務(wù)器,
人們可以從外部telnet 進(jìn)入你的防火墻, 通過一些驗證機制,然后獲得訪問內(nèi)部網(wǎng)絡(luò)的權(quán)
利。
代理型服務(wù)器通常要比普通的服務(wù)器更安全,可以提供更廣泛的驗證機制,包括
one-shot 口令系統(tǒng),所以即使有人設(shè)法尋找了你使用的密碼,他們也不能使用它獲得訪問你
的系統(tǒng)的權(quán)利,因為密碼會立即失效。由于他們不能給用戶訪問主機的權(quán)利,所以它使得想
要在的系統(tǒng)上安裝后門變得困難得多。
代理型服務(wù)器有很多種限制訪問的方法,所以只有某個主機獲得了訪問服務(wù)器的權(quán)利,
他們才可以被設(shè)置,以至你可以限制哪個用戶可以跟哪個機器交談。另外,要使用哪個完全
取決于你選擇的代理軟件哪個更強大。
10.7.2 IPFW 允許你做些什么?
IPFW,由FreeBSD 提供的軟件,是一個位于內(nèi)核中的數(shù)據(jù)包過濾和結(jié)算系統(tǒng),有一個用
戶水平的控制工具,ipfw。他們允許你定義和查詢內(nèi)核正在使用的規(guī)則。
IPFW 有兩個相關(guān)的部分。防火墻那節(jié)允許你執(zhí)行數(shù)據(jù)包過濾。也有一個IP 結(jié)算章節(jié)允
許你追蹤你的路由器的情況。這將允許你看到你的路由器從某個機器得到了多少的傳輸量,
或有多少的WWW 數(shù)據(jù)被轉(zhuǎn)發(fā)。
你可以使用在沒有路由的機器上在輸入與輸出的連接之間,使用IPFW 來執(zhí)行數(shù)據(jù)包
過濾。這是IPFW 一個比較特殊的用法,同樣的命令和技術(shù)也可以被用到。
10.7.3 在FreeBSD 上啟用IPFW
由于IPFW 的主要部分被捆綁在內(nèi)核中,你必須要在你的內(nèi)核配置文件中添加一個或多
個選項,這取決于你要使用哪個工具,然后重新編譯內(nèi)核。
與IPFW 相關(guān)的有三種內(nèi)核配置選項:
第32 頁FreeBSD 使用手冊
options IPFIREWALL
將數(shù)據(jù)包過濾編譯進(jìn)內(nèi)核。
options IPFIREWALL_VERBOSE
通過syslogd 啟用代碼來允許記錄數(shù)據(jù)包的日志。沒有這個選項,即使你指定了,數(shù)據(jù)
包也不在過濾規(guī)則中被記錄進(jìn)日志。
options IPFIREWALL_VERBOSE_LIMIT=10
通過syslogd 限制數(shù)據(jù)包日志的記錄。你可以使用這個選項記錄防火墻的活動,但不要
過多地使用syslogd,否則會給拒絕式服務(wù)攻擊提供機會。當(dāng)一個數(shù)據(jù)鏈記錄到達(dá)指定的受
限制的數(shù)據(jù)包時,日志會在那個特殊的記錄被關(guān)閉.要繼續(xù)進(jìn)行日志,你必須使用ipfw 工具
刷新相關(guān)的記數(shù)器:
# ipfw zero 4500
這兒的4500 是你希望繼續(xù)日志的數(shù)據(jù)鏈記錄。
先前的FreeBSD 版本已經(jīng)包含了IPFIREWALL_ACCT 選項。現(xiàn)在,現(xiàn)在把它作為防火墻代
碼已經(jīng)變得很陳舊了。
10.7.4 配置IPFW
IPFW 的配置可以通過使用ipfw 工具來完成。這個命令的語法看起來很復(fù)雜,但一旦
你理解個它的結(jié)構(gòu)就會變得很簡單。
當(dāng)前,這個工具可以使用四種不同的命令:addition/deletion, listing, flushing 和clearing。
Addition/deletion 被用來建構(gòu)控制數(shù)據(jù)包如何被接受,拒絕,和日志的控制規(guī)則。Listing 被
用來檢查你規(guī)則設(shè)置的內(nèi)容和數(shù)據(jù)包記數(shù)器。Flushing 被用來刪除所有記錄鏈的記錄。
Clearing 被用來對一個或多個記數(shù)記錄進(jìn)行清零。
10.7.4.1 改變IPFW 的規(guī)則
這種形式的命令語法是:
ipfw [-N] command [index] action [log] protocol addresses [options]
第33 頁FreeBSD 使用手冊
當(dāng)使用這種形式的命令時,會有一個正確的標(biāo)記:
-N
在輸出中解決地址和服務(wù)的名稱。
給出的命令可以被縮短到最短的獨特形式。正確的命令是這樣的:
add
添加一個記錄到firewall/accounting 規(guī)則列表
delete
從firewall/accounting 規(guī)則列表中刪除一個記錄
先前使用的IPFW 可以分離firewall 和accounting 記錄?,F(xiàn)在的版本提供了與每個防
火墻記錄數(shù)據(jù)包accounting。
如果提供一個索引值,它會被放置在數(shù)據(jù)鏈中的一個指定點的記錄。否則,記錄會被放
置在超過上次數(shù)據(jù)鏈記錄的索引值100 的數(shù)據(jù)鏈的結(jié)尾(這不包括默認(rèn)的策略,一般是
65535,deny)。
如果內(nèi)核編譯進(jìn)IPFIREWALL_VERBOSE,日志選項會把匹配規(guī)則輸出到系統(tǒng)控制臺。
正確的指令是:
reject
阻止數(shù)據(jù)包,然后發(fā)送一個ICMP 主機或無法到達(dá)數(shù)據(jù)包端口給數(shù)據(jù)源。
allow
通過數(shù)據(jù)包。(別名:pass and accept)
deny
阻止數(shù)據(jù)包。數(shù)據(jù)源沒有得到ICMP 消息的通報。
count
升級數(shù)據(jù)包記數(shù)器,但不允許/阻止以這個規(guī)則為基礎(chǔ)的數(shù)據(jù)包。會繼續(xù)對下一個數(shù)據(jù)
鏈記錄進(jìn)行搜索。
第34 頁FreeBSD 使用手冊
每個動作會通過加上一個簡短明確的前綴來驗證。
可能被指定的協(xié)議是:
all
匹配所有的IP 數(shù)據(jù)包
icmp
匹配ICMP 數(shù)據(jù)包
tcp
匹配TCP 數(shù)據(jù)包
udp
匹配UDP 數(shù)據(jù)包
地址的規(guī)則:
from address/mask [ port] to address/mask [ port] [via interface]
你可以只指定與支持端口的協(xié)議相關(guān)聯(lián)的端口(UDP 和TCP)。
所通過的路徑是可選擇的,可以指定一個本地IP 接口的IP 地址或域名,或是一個只與
來自這個接口的數(shù)據(jù)包匹配的接口名(如:ed0).接口單位數(shù)目可以用一個可選擇的通配符
來表示。例如,ppp*將匹配所有內(nèi)核PPP 接口。
指定一個address/mask的語法:
address
或
address/ mask-bits
或
address: mask-pattern
第35 頁FreeBSD 使用手冊
一個正確的主機名可以被指定用來代替IP 地址。mask-bits是一個十進(jìn)制的數(shù),可以
用來表示地址將被設(shè)置成多少位。例如,指定192.216.222.1/24 將創(chuàng)建一個允許與在C 類
子網(wǎng)中所有的地址相匹配的地址范圍。(在這個例子中是,192.216.222)。mask-pattern
是一個將與給定的地址想邏輯聯(lián)系的IP 地址。任何關(guān)鍵字都可以被用來指定“任何IP 地址”。
指定將被阻止的端口號碼:
port [, port [, port [...]]]
指定一個簡單的端口或端口列表,
port- port
指定一個端口范圍。你也可以結(jié)合一個簡單的列表范圍,但范圍必須先被指定。
可用的選項是:
frag
匹配數(shù)據(jù)包中第一個片段。
in
匹配進(jìn)入的數(shù)據(jù)包
out
匹配輸出的數(shù)據(jù)包
ipoptions spec
匹配IP 頭包含用逗號分割的用spec指定的選項列表。IP 選項的支持列表是:ssrr (嚴(yán)
格源代碼路由), lsrr (寬松源代碼路由), rr (記錄數(shù)據(jù)包路由),和ts (時間標(biāo)記)。
established
匹配已經(jīng)建立TCP 連接的部分?jǐn)?shù)據(jù)包。你可以通過在數(shù)據(jù)鏈中通過放置一個建立的規(guī)則
來調(diào)整防火墻的性能。
setup
匹配試圖建立一個TCP 連接的數(shù)據(jù)包。
第36 頁FreeBSD 使用手冊
tcpflags flags
匹配包含flags標(biāo)記的用逗號分割的TCP 頭。支持的標(biāo)記是fin, syn, rst, psh, ack,
和urg。
icmptypes types
匹配在types列表中出現(xiàn)的ICMP 類型。列表可以用一個以逗號隔開的聯(lián)合或分離的排
列形式。通常使用的ICMP 類型是:0 echo reply (ping reply), 3 destination unreachable, 5 redirect,
8 echo request (ping request), 和11 time exceeded
10.7.4.2 列出IPFW 規(guī)則
這種形式的命令的語法是:
ipfw [-a] [-t] [-N] l
當(dāng)使用這種命令時,有三種正確的標(biāo)記:
-a
當(dāng)列條目時,顯示計數(shù)器的值。這個選項是唯一可以看到計數(shù)器值的方法。
-t
顯示每個數(shù)據(jù)鏈記錄的最后匹配次數(shù)。定時的列表與用ipfw 工具輸入的語法是不兼容
的。
-N
試圖分解給定的地址和服務(wù)名稱。
10.7.4.3 提高IPFW 規(guī)則
語法是:
ipfw flush
這將把防火墻鏈中的所有記錄都刪除,除了內(nèi)核中指定的可修復(fù)的默認(rèn)策略(索引
65535)。當(dāng)提高規(guī)則時可以使用警告,默認(rèn)的阻止策略將迫使你的系統(tǒng)斷開網(wǎng)絡(luò),知道允許
記錄被添加到鏈中。
第37 頁FreeBSD 使用手冊
10.7.4.4 刷新IPFW 數(shù)據(jù)包記數(shù)器
刷新一個或多個數(shù)據(jù)包記數(shù)器的方法:
ipfw zero [ index]
當(dāng)使用不帶索引值選項時,所有的數(shù)據(jù)包計數(shù)器將被刷新。如果一個索引被啟用,那刷
新操作將只影響一個指定的數(shù)據(jù)鏈記錄。
10.7.5 使用ipfw 命令的例子
這個命令會阻止所有從主機evil.crackers.org 到主機nice.people.org 的telnet 端
口的數(shù)據(jù)包:
# ipfw add deny tcp from evil.crackers.org to nice.people.org 23
下一個例子會阻止和日志任何從crackers.org 網(wǎng)絡(luò)(c 類地址)記錄到機器
nice.people.org 的TCP 傳輸(任何端口)。
# ipfw add deny log tcp from evil.crackers.org/24 to nice.people.org
如果你不要任何人發(fā)送X 會話給你的內(nèi)部網(wǎng)絡(luò)(C 類子網(wǎng)),下面的命令將會作必要的
過濾:
# ipfw add deny tcp from any to my.org/28 6000 setup
看看計算記錄:
# ipfw -a list
或用一個簡短的形式:
# ipfw -a l
你也可以看看上次相配的數(shù)據(jù)鏈記錄:
# ipfw -at l
第38 頁FreeBSD 使用手冊
10.7.6 建構(gòu)一個數(shù)據(jù)包過濾防火墻
注意:下面的建議僅僅是建議。每個防火墻的要求是不同的,我們不能告訴你如何建構(gòu)
一個符合你特殊要求的防火墻。
當(dāng)一開始設(shè)置你的防火墻時,除非你有一個可測試的設(shè)置,可以在一個可控的環(huán)境中配
置你的防火墻,否則強烈建議你使用命令的日志版本,和在內(nèi)核中啟用日志。這將允許你快
速地確定問題所在,以便不需要太久就可以修復(fù)。即使初始安裝已經(jīng)完成,還是建議你使用
日志來“阻止”有可能的攻擊,或根據(jù)你的要求修改防火墻的規(guī)則。
注意:如果你使用接受命令的日志版本,它可以產(chǎn)生巨大的日志數(shù)據(jù),所以巨大的
FTP/http 傳輸將使系統(tǒng)的性能大大下降。在數(shù)據(jù)包通過之前它會要求內(nèi)核做更多的工作。
syslogd 將開始使用更多的處理時鐘,以至有許多額外的日志被記錄到磁盤上,不久就會填
滿/var/log 分區(qū)。
你可以從/etc/rc.conf.local 或/etc/rc.conf 啟用你的防火墻。相關(guān)的聯(lián)機手冊會解
釋如何列出當(dāng)前的防火墻配置。如果你不使用當(dāng)前的配置,ipfw 列表將輸出當(dāng)前的規(guī)則設(shè)
置到一個文件rc.conf。如果你不使用/etc/rc.conf.local 或/etc/rc.conf 來啟用防火墻,
在任何接口被配置之前,確認(rèn)你的防火墻被啟用是很重要的。
下一個問題是你的防火墻實際上做了些什么!這主要依賴于你允許什么從外部訪問你的
網(wǎng)絡(luò),和允許多少訪問外部網(wǎng)絡(luò)。一些通常的規(guī)則是:
. 阻止所有TCP 端口小于1024 的訪問。這是安全服務(wù)最敏感的地方,象finger, SMTP
(mail) 和telnet。
. 阻止所有進(jìn)入的UDP 傳輸。通過UDP 傳輸?shù)挠泻芏嘤杏玫姆?wù),有什么有用的傳輸
服務(wù),就會有什么安全問題。(如Suns RPC 和NFS 協(xié)議)。這也是它的缺點,既然UDP
是一個無連接協(xié)議,阻止進(jìn)入的UDP 傳輸也會阻止對輸出UDP 傳輸?shù)幕貞?yīng)。這可能會對
使用外部archie 服務(wù)的人們帶來麻煩。如果你要允許訪問archie,你將必須允許來自端
口191 和1525 的數(shù)據(jù)包能夠通過防火墻進(jìn)入內(nèi)部UDP 端口。ntp 是另一個你可以允許
訪問通過的服務(wù),它使用端口123。
第39 頁FreeBSD 使用手冊
. 阻止端口6000 與外部的傳輸服務(wù)。端口6000 被用來訪問X11 服務(wù)器,可能會帶來
一個潛在的安全問題。X11 實際上可以使用以6000 開始的端口范圍,上面的限制取決于
你可以在機器上運行多少個X 顯示程序。上面的限制通過RFC 1700 定義的是6063。
. 檢查內(nèi)部服務(wù)器使用什么服務(wù)器(如SQL servers 等)。阻止這些服務(wù)可能是一個好
主意,因為它們分布于上面指定的1-1024 的范圍之內(nèi)。
另外可以到下面這個網(wǎng)站去查看一下防火墻配置的列表
http://www.cert.org/tech_tips/packet_filtering.html
就象上面提到的,這些只是guidelines (建議/ 指導(dǎo)原則)。你必須根據(jù)你的具體情況決
定使用什么過濾規(guī)則。如果有人侵入了你的網(wǎng)絡(luò),我們不承擔(dān)任何責(zé)任,即使你按照了上面
提到的方法做了。
10.8 OpenSSL
自從FreeBSD 4.0 以來,OpenSSL 工具包已經(jīng)成為基本系統(tǒng)的一部分了。OpenSSL 提供
了一個普通的密碼庫,就象安全套接層v2/v3 (SSLv2/SSLv3),和傳輸層安全v1(TLSv1)網(wǎng)
絡(luò)安全協(xié)議。
然而,包含在openssl 中的某些加密算法(特別是IDEA)被USA 加以限制了,它不能不
受限制地使用。在FreeBSD 中,IDEA 被包含在openssl 的源代碼中,但它默認(rèn)情況下沒有
被構(gòu)建。如果你想使用,你需要照著許可條款來操作,在/etc/make.conf 中啟用MAKE_IDEA,
然后重新建構(gòu)整個系統(tǒng)。
今天,RSA 算法被自由使用在美國和其他國家。在過去它是受保護(hù)的。
10.8.1 源代碼安裝
OpenSSL 是src-crypto 和src-secure cvsup collections 的一部分??梢钥纯传@得
FreeBSD 那節(jié)了解更多有關(guān)獲得和升級FreeBSD 源代碼的信息。
10.9 IPsec
IPsec 機制提供了IP 層與socket 層之間安全的通訊方式。這節(jié)將介紹如何使用它們。
有關(guān)執(zhí)行細(xì)節(jié),請參考開發(fā)人員手冊。
第40 頁FreeBSD 使用手冊
當(dāng)前的IPsec 執(zhí)行模式既支持傳輸模式也支持隧道模式。但隧道模式有一些限制。在
http://www.kame.net/newsletter/上有比較詳細(xì)的例子:
為了使用這個功能,請保持清醒,你必須將下面這些選項編譯進(jìn)內(nèi)核:
options IPSEC #IP security
options IPSEC_ESP #IP security (crypto; define w/IPSEC)
10.9.1 基于IPv4 的傳輸模式例子
讓我們設(shè)置一個安全的連接以便在主機A (10.2.3.4)和主機B (10.6.7.8)之間配置一
個安全的通道。這兒列出了幾個復(fù)雜的例子。從主機A 到主機B ,只有老的AH 可以被使用。
從主機B 到主機A,新的AH 和新的ESP 將被結(jié)合起來。
現(xiàn)在,我們必須選擇一個算法以用來適應(yīng)"AH"/"new AH"/"ESP"/"new ESP"。請參考
setkey 的聯(lián)機手冊了解算法的命名。我們的選擇是對AH 用MD5,對新AH 用new-HMAC-SHA1,
對新ESP 用帶有8 位的new-DES-expIV。
關(guān)鍵字的長度依賴于每個算法。例如,關(guān)鍵字的長度對于MD5 需要用16 位,對于
new-HMAC-SHA1 需要用20 位,對于new-DES-expIV 需要用8 位。現(xiàn)在我們分別選擇
"MYSECRETMYSECRET", "KAMEKAMEKAMEKAMEKAME", "PASSWORD"。
好的,讓我們?yōu)槊總€協(xié)議分派一個SPI(Security Parameter Index)。請注意我們需要
為這個安全通道設(shè)計3 個SPIs,因為產(chǎn)生了三個安全headers。(one for from HOST A to HOST
B, two for from HOST B to HOST A)。另外,你也要注意SPI 必須要超過或等于256。我
們依次選擇1000, 2000 和3000。
(1)
HOST A ------> HOST B
(1)PROTO=AH
ALG=MD5(RFC1826)
KEY=MYSECRETMYSECRET
第41 頁SPI=1000
(2.1)
HOST A <------ HOST B
<------
(2.2)
(2.1)
PROTO=AH
ALG=new-HMAC-SHA1(new AH)
KEY=KAMEKAMEKAMEKAMEKAME
SPI=2000
(2.2)
PROTO=ESP
ALG=new-DES-expIV(new ESP)