目錄
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 章安全
=============================================================
(翻譯中出現的任何問題或錯誤,請廣大讀者及時反饋給我:freebsdhandbook@163.com)
10.1 概要
這章將對系統安全概念作一個的基本介紹,還有一些通用的好的規則,和一些在
FreeBSD 下的高級主題。這兒提到的許多主題已經很好地應用于系統和Internet 的安全。
確保你的系統安全將保護你的數據,不至于被黑客所竊取。
FreeBSD 提供了許多工具和機制來確保你的系統和網絡的安全。
讀完這章,你將了解到這些:
. FreeBSD 的基本系統安全概念。
. FreeBSD 中可用的如DES 和MD5 這樣的加密(crypt)機制。
. 如何設置S/Key,一種一次性的密碼驗證機制。
. 如何設置Kerberos,另一種密碼驗證機制。
. 如何使用IPFW 來創建防火墻。
. 如何配置IPSec。
. 如何配置和使用OpenSSH,FreeBSD 的SSH 執行方式。
在閱讀這章之前,你必須了解:
. 了解基本的FreeBSD 和internet 概念。
10.2 介紹
安全是系統管理至始至終最基本的要求。所有的BSD UNIX 系統都有它自身內在的安
全性,建構和維護額外的安全機制,確保用戶的“誠實”大概是系統管理最艱巨的工作之一。
機器僅保持著建構時最原始的安全性,而安全性必須要考慮到用戶使用的便利性。通常
UNIX 系統能夠支持巨大的并發用戶處理,而這些處理中絕大部分是以服務器形式處理的----
這意味著外部的實體能夠連接和互相交談。昨天的小型電腦和主機變成了今天的桌面機,電
腦已連到局域網和互聯網,安全就成了一個非常嚴峻的問題。
第1 頁FreeBSD 使用手冊
通過一個分層的方法,安全能夠很好地實現。你所要做的就是創建很多的安全層,然后
仔細地監視系統以防入侵。你不要過多地創建安全層,否則你將會影響檢測面。檢測是許多
安全機制中最重要的方法。例如,在每一個二進制程序中,很難判斷schg 標記,因為這樣
會臨時地保護二進制,它會妨礙對一個已經侵入的攻擊者作一個很容易的檢測,以至最終你
的安全機制根本檢測不到攻擊者。
系統安全也涉及到攻擊的許多方面,包括試圖摧毀或使一個系統無法使用。安全問題主
要被分成幾類:
1, 拒絕服務的攻擊;
2, 竊取用戶的帳戶;
3, 通過最近的服務器竊取root 帳戶;
4, 通過用戶帳戶竊取root 帳戶;
5, 創建后門;
拒絕式服務攻擊是侵占機器所需資源的一種方法。有代表性的,D.O.S 攻擊,是非常殘
忍的攻擊機制,它通過壓倒性的流量來破壞服務器和網絡堆棧,試圖摧毀機器或使機器無法
使用。一些D.O.S 攻擊利用在網絡堆棧中的錯誤,僅用一個簡單的信息包就可以摧毀一臺機
器。這可以向內核添加一個錯誤補丁來修復。在一些不利的條件下,對服務器的攻擊能夠被
修復,只要適當地修改一下系統的選項來限制系統對服務器的負荷。頑強的網絡攻擊是很難
對付的。例如,一個欺騙性信息包的攻擊,無法阻止入侵者切斷你的系統與internet 的連接。
它不會使你的機器死掉,但它會把internet 管道塞滿。
竊取用戶帳戶要比D.O.S 攻擊更加普遍。許多系統管理員仍然在它們的服務器上運行著
基本的telnetd,rlogind,rshd,ftpd 服務。這些服務器默認情況下,不會通過加密連接來操作。
結果是如果你的系統有中等規模大小的用戶,在通過遠程登陸的方式登陸到你系統的用戶
中,一些人的密碼會被人竊取。仔細的系統管理員會從那些成功登陸系統的遠程訪問日志中
尋找可疑的資源地址。
假定,一個入侵者已經訪問到了一個用戶的帳戶,入侵者就會使超級用戶失效。然而,
事實是在一個安全的系統中,訪問用戶的帳戶不應該給入侵者訪問root 的權限。這個區別
是很重要的,因為沒有訪問root 的權限,入侵者是無法隱藏它的軌跡的,但可能不需要做
什么,就可以把用戶的文件弄亂或使機器崩潰。竊取用戶帳戶是很普遍的事情,因為用戶往
第2 頁FreeBSD 使用手冊
往不會對系統管理員的警告采取措施。
系統管理員應該牢牢記住,可能有許多潛在的方法會使root 失效。入侵者可能知道root
的密碼,可以在一個以root 權限運行的服務器上找到一個錯誤(bug),就可以通過網絡連
接到那臺服務器上使root 失效,或者一旦入侵者已經侵入了一個用戶的帳戶,可以在自己
的機器上運行一個程序來發現服務器的漏洞,從而讓他侵入到服務器使root 失效。如果入
侵者已經找到了方法使root 失效,入侵者就不需要安裝一個后門。許多root 漏洞被找到之
后,入侵者會想盡辦法去刪除日期來清除自己的訪問痕跡,所以很多入侵者會安裝后門。后
門能給入侵者提供一個簡單的重新獲取訪問系統的root 權限,但它也會給聰明的系統管理
員一個探測入侵的簡便方法。認為入侵者不可能安裝了后門,這種思想事實上對你的系統安
全是有害的,因為這樣他就不會隔離從一開始就侵入系統的黑客發現的漏洞。
安全的管理方法應當使用象剝洋蔥皮一樣多層次,層層逼近的方法來實現,可以按下面
的方式進行分類:
1, 確保root 用戶和其它用戶帳戶的安全;
2, 確保root 用戶---以root 用戶權限運行的服務器和suid/sgid 二進制程序的安全;
3, 確保用戶帳戶的安全;
4, 確保密碼文件的安全;
5, 確保內核中內核設備和文件系統的安全;
6, 快速檢測系統中發生的不適當的變化;
7, 偏執狂;
這一章的下一節將比較深入地講述上面提到的每一個條目。
10.3 確保FreeBSD 的安全
下面這節將講述確保系統安全的方法。
10.3.1 確保root 用戶和其它用戶帳戶的安全
首先,如果你沒有確保root 帳戶的安全,請不要為確保其它用戶的安全而煩惱。絕大
多數系統都會指派一個密碼給root 用戶帳戶。第一件事是假定密碼總是不安全。這并不意
味著你要把密碼刪掉。密碼通常對用控制臺訪問機器是必須的。也就是說,你不應當讓它用
到控制臺以外的密碼,即使是使用su 命令。例如,確信你的pty’s 作為不安全的因素已經被
第3 頁FreeBSD 使用手冊
記錄在/etc/ttys 文件中,以至直接通過telnet 或rlogin 登陸root 會不被接受。如果使用(如sshd)
其它的登陸服務,確認直接登陸root 根本不行??紤]到每一種訪問方法--(如FTP 服務)通
過cracks 經常失敗。直接登陸root 應當只有通過系統控制臺被允許。
當然,作為一個系統管理員,你應當獲得root 權限,所以我們公開幾個漏洞。但我們
確信這些漏洞需要額外的密碼確認才能操作。一種成為root 訪問的是增加適當用戶的帳戶
到wheel 組(在/etc/group 中)。Wheel 組中的用戶可以使用su 命令來訪問root。在它們的密
碼登陸口,通過把它們放置在wheel 組中,你就永遠不會給用戶成員訪問本地wheel 的權限。
用戶帳戶應當被放置在staff 組中,然后通過/etc/group 文件加入到wheel 組。事實上,那些
需要訪問root 的用戶成員將會被放置在wheel 組中。當然也會有可能,用一個如kerberos
的認證方法。在root 帳戶中使用kerberos 的.k5login 文件,可以不需要把任何人放置在wheel
組中就允許ksu 訪問root.如果入侵者已經獲得了密碼文件,或者已侵入了一個用戶帳戶,這
可能是一個比較好的解決方法,因為wheel 機制仍然可能會使入侵者break root。雖然wheel
機制要什么都沒有要好得多,但它也不是最安全的選擇。
確保超級用戶帳戶安全的間接方法是通過使用一個有選擇性的登陸訪問方法確保你的
用戶帳戶的安全。這樣做,入侵者可能會偷竊到密碼文件,但不會侵入任何用戶帳戶。用戶
成員通過使用一對私有或公共密匙(如kerberos 或ssh)的安全機制來進入它們的帳戶。當
你使用kerberos 時,你必須確保使用kerberos 的服務器或工作站的安全。當你使用一對ssh
的公共/私有密匙系統,你必須確保你所登陸的那臺機器的安全,但當你用ssh-keygen 創建
它時,你可以添加一個額外的保護層到你的鑰匙對中。你可以強制所有的用戶成員使用加密
的方法連接它們的活動,這樣就可以關閉可能會被入侵者使用的一個重要漏洞:將一個毫無
關系,很不安全的機器與網絡隔離。
更多間接的安全機制能夠被實現。你可以從一個帶有限制性的服務器到一個毫無限制性
的服務器進行登陸。例如,如果你的主郵箱運行在所有種類的服務器上,那你的工作站就無
法運行任何東西。為了確保你工作站的安全,盡可能少運行服務器,直到根本就沒有服務器
運行,然后運行一個受密碼保護的屏保。當然,一個入侵者強行訪問你的工作站,它就會把
你所設置的所有安全特性都破壞掉。有一個問題必須明確,你必須考慮到這樣一個事實,絕
大多數入侵是從那些沒有物理訪問工作站或服務器權限的人那里,通過一個網絡來侵入的。
使用象kerberos 這樣的技術,也會讓你無法使用系統,或者改變用戶帳戶的密碼,從而影響
到擁有一個帳戶的所有用戶成員。如果一個用戶成員的帳戶已經失去安全,應當改變它在所
有機器上的密碼。對于不連續的密碼,在n 臺機器上改變一個密碼可能是很亂的。你可能要
第4 頁FreeBSD 使用手冊
用kerberos 重建密碼的限制:一張kerberos 的許可證可能一段時間后會過期,但kerberos 系
統可能要求用戶在一段時間以后選擇一個新密碼(一般是一個月)。
10.3.2 確保以root 權限運行的服務器和suid/sgid 二進制程序的安全
謹慎的系統管理員只運行他需要的服務器,不多也不少。要清醒地認識到第三方的服
務器經常有很多的錯誤。例如,運行一個老版本的imapd 或popper,就象是給出了一個通用
的root 帳號來訪問外部世界。運行每一個服務器,你都要仔細地檢查。許多服務器不一定
需要用root 來運行。例如,ntalk, comsat, 和finger 守護程序可能運行在一個特殊的用
戶sandboxes 上。一個sandbox 是不完全的,除非你遇到了許多問題,但安全的層級模式
仍然支持:如果能夠通過運行在一個sandbox 上的一個服務器侵入,他們仍然必須要攻破
sandbox。攻擊者必須通過很多的安全層,這樣他侵入的可能性就很小了。過去已經找到了
很多root 的安全漏洞,包括基本的系統服務器。如果你運行著用戶通過sshd 來登陸而從
不用telnetd 或rshd 或rlogind 來登陸的服務器,你最好把這些服務器關掉。
現在,FreeBSD 默認在sandbox 中運行ntalkd, comsat,和finger。還有一個叫做named
的程序。/etc/defaults/rc.conf中包含了運行named 的選項,但被注意掉了。無論你是在
安裝一個新的系統,還是升級一個已存在的系統,被這些sandboxes 使用的特殊用戶帳號
可能沒有被安裝。謹慎的系統管理員無論何時都要認真研究和執行sandboxes。
有許多其他的服務器通常不能運行在sandboxes 中:sendmail, popper, imapd, ftpd,
和其他一些。你可以選一些,但安裝它們可能需要你做很多工作。你可能必須以root 來運
行這些服務器,然后依靠其他的機制來檢測可能通過他們進行的侵入活動。
其他比較大的潛在的root 漏洞是安裝在系統中的suid-root 和sgid 程序。這些程序,
象rlogin,都放在/bin, /sbin, /usr/bin,或/usr/sbin 中。當然,世上沒有100%的安全,
系統默認的suid 和sgid 程序可能認為是比較安全的。
另外,root 漏洞有時候能在這些程序中找到。在1998 年在xterm 的Xlib 中的一個root
漏洞被發現。謹慎的系統管理員需要限制suid 的程序,只有指定的人可以運行,指定人所
在的特殊組可以訪問,其他人都不能使用。一臺沒有顯示器的服務器通常不需要一個xterm
程序。
Sgid 程序可能也會有危險。如果一個入侵者能夠攻破sgid-kmem 程序,入侵者就可以
第5 頁FreeBSD 使用手冊
讀到/dev/kmem,因而可以讀到crypted 密碼文件,從而危及到受密碼保護的帳戶的安全。
另外,一個侵入組kmem 的入侵者可以通過pty’s 來監測到擊鍵的情況,包括通過安全方
法登陸的用戶的情況。一個侵入tty 組的入侵者可以寫入幾乎任何用戶的tty。如果用戶正
在運行一個終端程序或帶有鍵盤模擬特性的模擬器,入侵者可以偷偷地發送一個數據流來
使用戶的終端顯示一個命令,然后就以那個用戶的身份來運行。
10.3.3 確保用戶帳戶的安全
用戶的帳戶通常是很難確保安全的。當你用嚴格的訪問限制來約束你的用戶時,你不
可以使用你有的普通用戶帳戶來這樣做。如果你有充分的控制,那你可以確保用戶帳戶的
安全。如果沒有,你必須時刻警惕地監視那些帳戶。為用戶的帳戶使用ssh 和kerberos 可
能會有問題,需要額外的管理和技術支持,但與crypted 密碼文件相比仍是一個比較好解決
方案。
10.3.4 確保密碼文件的安全
唯一的確保安全的方法是用*號來代替輸入的密碼,使用ssh 或kerberos 來訪問那些帳
戶。即使crypted 密碼文件(/etc/spwd.db)只能被root 讀取,入侵者可能無法獲得root 寫
的權限,但也可能會獲得讀的權限。
你的安全腳本必須經常檢查和報告密碼文件的修改情況。
10.3.5 確保內核核心,Raw 設備和文件系統的安全
如果一個入侵者攻破root,他就可以做任何事情。例如,絕大多數現代內核都有一個
包來探測內建的設備啟動器。在FreeBSD 下,它被叫做bpf 設備。一個入侵者通常會試圖
在一臺不安全的機器上運行一個包探測器。所以,絕大多數系統都不把bpf 設備編譯進內
核。
但即使你關閉了bpf 設備,你仍然可能會對/dev/mem 和/dev/kmem 擔心。因為,入侵
者仍可以寫到raw 磁盤設備。另外,還有另一個叫做module loader 的內核特性,kldload。
一個入侵者可以在運行內核時使用一個KLD module 來安裝它自己的bpf 設備,或其他檢測
設備。
第6 頁FreeBSD 使用手冊
要避免這些問題,你必須在更高安全級別上運行內核,至少在securelevel 1 上。
Securelevel 可以在kern.securelevel 變量上用sysctl 來設置。一旦你把securelevel 設
置成1,對raw 設備的寫入操作將被拒絕,特殊的chflags 標記如schg 將被強迫執行。你
必須保證schg 標記被設置在特定的啟動程序,目錄和腳本文件上。這樣做可能有點夸大了。
當你在一個安全性比較高的水平上操作時,升級系統可能比較困難。
你可以折中一下,將系統運行在一個安全性更高的水平上,但不對每個系統文件和目
錄設置schg 標記。另外一個方法是簡單地將/ 和/usr 設為只讀。這樣就可以阻止所有重要
的侵入檢測了。
10.3.6 檢查文件的完整性:程序,配置文件等
你需要保護你的核心系統配置和控制文件。例如,在/和/usr 中的絕大多數文件上使用
chflag 來設置schg 位可能達不到預期的目標,因為當它保護文件的時候,它也會關閉一個
檢測窗口。你安全層的最后一層也許是最重要的檢測層。如果你不能檢測到潛在的入侵,
你安全層的其余部分可能就沒有用了。你的工作是要讓入侵者慢下來,而不是阻止它,以
便尋找時機抓住它。
檢測入侵的最好方法是尋找有沒有修改,丟失或不需要的文件。尋找修改文件的最好
方法是來自另一個訪問受限制的系統。在一個特別的訪問受到限制的系統上寫上你的安全
腳本使得入侵者不可見,這一點很重要。為了集中優勢,你通常必須使用有限訪問的機器
來訪問其他機器,通常是執行一個其他機器的只讀NFS 輸出到有限訪問的機器,或通過設
置ssh 鑰匙對來允許有限訪問的機器ssh 到其他機器。除了它的網絡傳輸,NFS 是很少用的
方法---允許你監視每個客戶機的文件系統。
如果你的有限訪問服務器通過一個switch 來連接到客戶機,NFS 方法是比較好的選擇。
如果你的有限訪問服務器是通過一個hub 或通過幾層的路由連接到客戶機,NFS 方法可能很
不安全,使用ssh 可能是更好的選擇。
一旦你使用一個訪問受限制的機器,至少需要能讀取客戶系統,你必須寫一些腳本來
執行實時的檢測。掛上NFS 之后,你可以用find 和md5 這樣的工具。至少每天一次物理地
md5 客戶機文件。當發現匹配錯誤時,會發出“尖叫聲”提示系統管理員去檢查。一個安全
腳本也會檢查不適當的suid 程序和系統分區上新增或刪除的文件。
第7 頁FreeBSD 使用手冊
當使用ssh 而不是NFS 時,寫入安全腳本是很困難的。為了運行它們,你必須scp 腳
本到客戶機上,使它們看得見,為了安全你也必須scp 那些腳本使用的程序。在客戶機上
的ssh 程序已經有安全問題了??偟膩碇v,當通過不安全的連接運行時,使用ssh 可能是
必須的,但它也比較難處理。
一個好的安全腳本將通過訪問配置文件來檢查用戶的變
化:.rhosts, .shosts, .ssh/authorized_keys。它已經超出了MD5 檢查的范圍。
如果你有一個巨大的磁盤空間,它可能需要花很長時間來檢查每個文件。在這種情況
下,設置掛載標記來不接受suid 程序和設備在那些分區上是一個好主意。nodev 選項nosuid
選項正是你所看到的。你可以把它們掃描一下,至少一個星期一次。
處理帳戶是操作系統的一個相關特性,它可以作為一個post-break-in 的評價機制。
它在跟蹤入侵者是如何侵入系統的時候特別有用.
最后,安全腳本應當處理日志文件。一個入侵者設法掩蓋自己的蹤跡,日志文件可以
指示系統管理員設法追蹤到最初侵入的時間和方法。確保日志文件持久記錄的日志文件的
一個方法是運行系統控制臺到一個串行口,通過持續不斷地檢測控制臺來收集信息。
10.3.7 偏執狂
帶點偏執可能不會有傷害。作為一個慣例,一個系統管理員需要添加許多安全特性,
并且盡可能地不影響到使用的便利性。更重要的是一個安全系統管理員應當經常修復漏洞。
10.3.8 拒絕式服務攻擊(DoS)
這節將介紹拒絕式服務攻擊。一個DoS 攻擊通常是一個包攻擊,它可以使你的網絡癱
瘓。你應當做一些限制,讓攻擊不會癱瘓你的服務器。
1. 限制服務器的forks.
2. 限制跳板sPRingboard 攻擊(ICMP response attacks, ping broadcast, etc.)。
3. 內核通道的緩存。
一個普通的DoS 攻擊通常試圖讓服務器吃掉所有進程,文件描述和內存,直到機器死
機。inetd 有好幾個選項可以來限制這種攻擊。需要注意的是當無法阻止一個服務被攻擊所
打斷時,可以阻止一臺機器當機。閱讀一下inetd 的聯機手冊,特別需要注意-c, -C, 和
第8 頁FreeBSD 使用手冊
-R 選項。注意,哄騙式的IP 攻擊可以饒過inetd 的-C 選項。所以,最好一起使用這些選
項。
Sendmail 有一個-OMaxDaemonChildren 選項,它往往要比sendmail 的負載限制選項工
作得好。你必須指定一個MaxDaemonChildren 參數,當你啟動sendmail 時,可能你期望有
很高的負載,但電腦無法處理這么高的負載。在隊列模式運行sendmail 時要非常謹慎
(-ODeliveryMode=queued)。如果你在一個很短的時間間隔內實時分發你運行的隊列,如
-q1m,一定要為sendmail 指定一個合適的MaxDaemonChildren 選項以免發生錯誤。
Syslogd 可能會被直接攻擊,強烈建議你使用-s 選項,或-a 選項。你也應當注意象
tcpwrapper 的reverse-identd 這樣的后臺連接服務,它可以被直接攻擊。因為這個原因,
你通常不要使用tcpwrappers 的reverse-ident 特性。
在你的路由器上設置一道防火墻來隔離內部網絡與外部網絡之間的連接是非常好的安
全方法。這樣可以阻止你的內部網絡受到來自外部網絡的攻擊。
這個方法可以阻斷除了你指定的如named, ntalkd, sendmail 這樣的服務以外的低級
端口。如果你設法使用其他方法來配置防火墻,你可能會忘記關閉一對服務,或你添加了
一個新的內部服務而忘記了升級防火墻。
你也可以在防火墻上打開比較高的端口范圍,允許有許可性質的操作,而不會危及你
的低級端口的安全。FreeBSD 允許你控制用來動態綁定的端口號碼的范圍,通過不同的
net.inet.ip.portrange sysctl's(sysctl -a | fgrep portrange),將會減輕你的防火墻
配置的復雜性。例如,你可以使用普通的4000 到5000 端口范圍,以及更高的49152 到
65535 端口范圍,然后隔斷4000 以下的端口。
另一個普通的DoS 攻擊叫做springboard 攻擊—它會讓服務器不斷產生回應,最終導
致服務器,本地網絡或其他機器超載。最普通的攻擊是ICMP ping broadcast attack。
攻擊者欺騙性地用源IP 地址向你的LAN 廣播地址發送ping 數據包到他們希望攻擊的
實際機器。如果你的路由器無法阻止他們ping 廣播地址,你的LAN 就會對每個欺騙性的請
求產生回應,從而侵占大量的網絡資源,特別是當攻擊者使用同樣的欺騙手段用幾十個廣
播地址從幾十個不同的網絡進攻時。
第9 頁FreeBSD 使用手冊
超過120MB 的廣播攻擊是常用的。另外一個普通的攻擊是針對ICMP 錯誤報告系統的。
通過產生數據包來形成ICMP 錯誤請求,一個攻擊者可以侵占一個個服務器的輸入網絡,使
得服務器用ICMP 請求占滿它的輸出網絡。如果服務器不能很快地處理ICMP 請求的話,這
種類型的攻擊也可以使服務器癱瘓。FreeBSD 內核有一個叫做ICMP_BANDLIM 的新的內核選
項,它可以限制這些端口攻擊的效率。這種跳板類的攻擊是與象這樣的udp echo 服務的某
個內部inetd 服務有關的。
一個攻擊者只要簡單地用成為服務器A 的echo 端口的源地址和成為服務器B 的echo
端口的目的地址來哄騙一個UDP 數據包。兩個服務器就來回地彈發數據包。攻擊者只要發
送幾個這種類型的數據包就可以使服務器和內部網癱瘓。類似的問題也存在于內部chargen
端口。一個熟練的系統管理員會關閉所有這些內部的inetd 測試服務。
哄騙式數據包攻擊也可以被用來是內核路由緩存超載??梢詤⒖家幌?
net.inet.ip.rtexpire, rtminexpire, 和rtmaxcache sysctl 參數。隨意使用一個源IP
進行的哄騙式的數據包攻擊將使內核在路由表中產生一個臨時的高速緩沖路由,可以用
netstat -rna | fgrep W3 檢查一下。這些路由大約會超時1600 秒。如果內核檢測到緩沖
路由表太大,它將動態地減少rtexpire,但不會小于rtminexpire。有兩個問題:
1. 當一個負載量很小的服務器突然受到攻擊時,內核沒有很快地響應。
2. 由于rtminexpire 太小而無法抵抗住一個持續不斷的攻擊。
如果你的服務器通過T3 或更高速度的線路連接到internet,可能需要通過使用sysctl
來手動地調整rtexpire 和rtminexpire。千萬不要把參數設為0(除非你想要摧毀機器)。
把參數設為2 秒對于保護路由表免受攻擊是非常好的。
10.3.9 用Kerberos 和SSH 的訪問問題
如果你打算使用它們的話,在kerberos 和ssh 之間有好幾個問題需要記住。Kerberos
V 是一個非常卓越的驗證協議,但在加密telnet 和rlogin 應用程序時會有一些錯誤,可能
會使它們不太適合處理二進制數據流。另外,默認的kerberos 也無法加密一個會話,除非
你使用-x 選項。ssh 默認能加密任何東西。
我們建議無論用戶什么時候登陸系統,你都可以結合kerberos 來使用ssh。ssh 可以在
編譯時加入對kerberos 的支持。我們也建議你在ssh 配置中關閉key-forwarding,或者在它
第10 頁FreeBSD 使用手冊
的authorized_keys 文件中使用from=IP/DOMAIN 選項使得只有用作實體的密匙可以從特殊
機器登陸進系統。
10.4 DES, MD5 和Crypt
在unix 系統上的每個用戶有一個與他們的帳號相關聯的密碼??雌饋磉@些密碼只有用
戶和操作系統知道。為了確保這些密碼的秘密,他們通過一種叫做one-way hash 的方式來
加密,它們能被很容易地加密,但不能解密。換句話說,以前我們告訴你的通常不是真的:
操作系統通常并不真正知道密碼。它只知道密碼的加密形式。
加密密碼的唯一安全方式是以DES 為基礎的數據加密標準。這對于US 用戶來說沒有什
么問題,但DES 的源代碼不允許被輸出到US 以外的國家,FreeBSD 必須找到一個既遵守US
法律,又要與其他使用DES 的unix 兼容的方法。
解決方法是分解加密庫以至于US 用戶可以安裝DES 庫和使用DES,而國際用戶也有一
個加密方法。這就是FreeBSD 為什么使用MD5 來作為默認的加密方法。MD5 被認為要比DES
更安全,所以使用DES 主要是為了兼容性的原因。
10.4.1 重新配置你的Crypt 機制
可以很容易地設置FreeBSD 使用哪種加密方法。檢查/etc/master.passwd 文件中的加
密密碼是一種方法。用MD5 加密的密碼通常要比用DES 加密的密碼長,通常以$1$字符作為
起始。DES 密碼字符沒有任何鑒別特征,但它們要比MD5 密碼短,通常是以64 位字符的字
母表來編碼的,它不包括$字符,所以通常一個不以$符號開始的很可能是DES 密碼。
也可以通過區別庫來鑒別密碼。DES 庫能夠鑒別MD5 密碼,使用MD5 來檢查用哪種方法
加密的密碼,然后用DES 加密剩下的。之所以可以這樣做,是因為DES 庫也包括MD5。但是,
倒過來就不行了,所以MD5 庫不能鑒別用DES 加密的密碼。
鑒別你當前系統使用的是哪個庫也是很容易的。任何使用crypt 的程序是與libcrypt
連接在一起的,每一種類型的庫是與適當的執行程序有一個符號連接的。例如,在使用DES
的系統上:
% 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 庫的系統上,同樣的連接也會出現,但目標庫是libscrypt 而不是
libdescrypt。如果你安裝了DES 用的crypt 庫libdescrypt,哪個密碼格式將被用作新的密
碼可以通過在/etc/login.conf 中設置passwd_format 來控制,要么使用DES,要么使用MD5。
看看login.conf 的聯機手冊了解更多信息。
10.5 S/Key
S/key 是基于單向hash 功能的一次性密碼管理方式。FreeBSD 為了考慮兼容性,就使
用MD4 hash 函數,但其它系統則使用MD5 和DES-MAC。從1.1.5 版開始,S/key 已經成為
FreeBSD 的基本系統,同時也廣泛應用于其他操作系統。S/key 是Bell Communications
Research, Inc 的注冊商標。
下面將討論三種不同的密碼形式。第一種是你通常使用的Unix 風格或Kerberos 密碼;
我們把它叫做Unix passWord。第二種是由S/key 程序產生,然后被keyinit 程序和登陸命
令接受的一次性密碼;我們把它叫做one-time password。最后一種密碼是由專門的密碼生
成程序生成的秘密密碼;我們把它叫做secret password 或絕對password。
秘密密碼與unix password 毫無關系;他們也可能是一樣的,但并不推薦使用。S/key
秘密密碼不象unix 密碼需要限制在8 位以內,它們可能會更長。一般都使用6 到7 位的長
度。另外,S/key 系統操作完全獨立于unix password 系統。
除了密碼,對于S/key 有兩個數據很重要。一個是以seed 或key 出名,包含兩個字母
和五個數字。其他的被叫做iteration count,在1 到100 之間。S/key 通過連接“種子”
(seed)和秘密密碼來生成一次性密碼,然后通過反復計算多次應用MD4 hash,再把結果
變成六個英文字。這六個英文字就是你的一次性密碼。如果用戶提供的密碼的hash 值與先
前的密碼相一致,那用戶就通過了認證;每個成功的登陸確保用戶和登陸程序保持同步之
后,計算的次數就不斷減少。當反復計算的降到1 時,S/key 必須被重新初始化。
有四個程序被包含在S/key 系統中,我們下面會談到。密碼程序接受一個反復計算數,
一個種子,和一個秘密密碼,然后產生一個一次性密碼。Keyinit 程序被用來初始化S/key,
第12 頁FreeBSD 使用手冊
然后改變密碼,反復計算數或種子;它不是接受一個秘密密碼,就是一個反復計算數,種
子和一次性密碼。Keyinfo 程序會檢查文件,然后打印出被調用的當前反復計算數和種子。
最后,login 和su 程序包含了用于認證S/key 一次性密碼的必需的邏輯性。login 程序也
可以不使用unix 密碼。
我們將講述四種不同的操作。第一種是首先通過一個安全連接設置S/key 使用keyinit
程序,或改變你的密碼或種子。第二種操作是通過一個不安全的連接使用keyinit 程序,
通過一個安全的連接與密碼程序相關聯,同樣能達到目的。第三種是使用密碼程序產生許
多key,它可以被記錄或打印出來。
10.5.1 安全連接的初始化
首先是當通過一個安全連接登陸時,初始化S/key,改變你的密碼,或改變你的種子,
當你自己登陸時,使用不帶任何參數的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
在鍵入秘密密碼時:你必須鍵入一個密碼或短語。記住,這不是你用來登陸的密碼,
它只是用來產生一次性登陸密碼。ID 行給出了你特定的S/key 實例的參數;你的登陸名,
反復計算數,和種子。當用S/key 登陸系統時,系統將記住這些參數,然后把它們返回給
你,所以你不必記住它們。最后一行給出了與那些參數和你的秘密密碼相一致的特定的一
次性密碼;如果你需要立刻重新登陸,這個一次性密碼就是你使用的。
第13 頁FreeBSD 使用手冊
10.5.2 不安全連接初始化
通過一個不安全的連接來初始化S/key 或改變你的秘密密碼,你必須已經有連接到可
以運行密碼程序的地方的安全連接。這可以是在Macintosh 上桌面訪問的方式,或是在你
信任的機器上的一個shell 命令。你也必須指定一個反復計算數(通常是100),你可以使
用你自己的種子,或使用一個隨機產生的值。在一個不安全的連接上,可以使用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:
要接受默認的種子,鍵入return。然后鍵入一個訪問密碼,轉移到你的安全連接或S/key
桌面程序,給它指定一樣的參數:
% 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
現在,切換到不安全的連接,拷貝一次性通過密碼程序產生的一次性密碼給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 產生一個簡單的一次性密碼
一旦你初始化你S/key,當你登陸時,你會看到下面的命令行:
% 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 鍵,登陸程序將會把
鍵入的密碼顯示出來,所以你可以看到你鍵入的密碼。如果你試圖手工鍵入一個S/key,這
個非常有用。如果這臺機器被配置成通過一個來自源機器的連接不接受unix 密碼,命令行
也將包括注意(S/key 必須),指出只有s/key 一次性密碼將被接受。
基于這點,你必須產生你的一次性密碼來回答這個登陸命令。這必須在一個可以運行密
碼命令的可信任的系統上做。密碼程序既需要反復計算數和種子,也需要命令行選項。你可
以從你登陸的機器的命令行剪切和粘貼這些選項。
在可信任的系統上:
% 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
現在,你已經有了可以繼續登陸的一次性密碼:
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 ...
如果你有一個可信任的系統,這是最容易的機制。有一個java S/key 密碼小程序,The
Java OTP Calculator,你可以下載和在本地支持java 的瀏覽器中運行。
10.5.4 產生多個一次性密碼
有時,你會來到你不能訪問一個可信任的機器或安全連接的地方。在這個例子中,可以
使用密碼命令來產生許多一次性密碼,例如:
% 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 指定了最后的反復計算的號碼是什么。注意這些將按與
實際相反的順序打印出來。如果你是一個偏執狂,你可以手工寫下這些結果;否則你可以打
印出來。注意,每一行都顯示了重復計算數和一次性的密碼。
10.5.5 Unix 密碼的限制使用
這種限制可能是基于主機名,用戶名,終端口,或登陸時的IP 地址的unix 密碼的使用。
這些限制可以在配置文件/etc/skey.access 中找到。skey.access 的聯機手冊中,有這個文
件的完整格式和細節。
如果沒有/etc/skey.access 文件(這是FreeBSD 默認的),那所有的用戶將被允許使
用unix 密碼。如果文件存在,那所有的用戶將被要求使用s/key,除非明確地允許這樣做。
在所有的案例中,unix 密碼是允許用在控制臺的。
這兒是一個配置文件的例子,下面舉三種普通使用的配置例子:
permit internet 192.168.0.0 255.255.0.0
permit user fnord
permit port ttyd0
第一行允許他的Ip 源地址與指定的值和掩碼相配的用戶使用unix 密碼。這不應當被認
為是一種安全的機制,但應當提醒那些使用不安全連接的網絡的用戶必須使用s/key 驗證。
第二行允許指定用戶名在任何時候使用unix 密碼,在這個例子中是fnord。一般來講,
這將被那些不能使用密碼程序的人或不可教育的人來使用。
第三行允許所有的通過指定的終端行登陸的用戶使用unix 密碼;這將被用在撥號中。
10.6 Kerberos
Kerberos 是一個網絡附加系統/協議,可以允許用戶通過一個安全服務器的服務來驗證
他們自己。象遠程登陸,遠程拷貝,系統間的相互文件拷貝和其他高風險任務的服務將被變
得相當安全和可控制。
下面的文章將用來指導你如何為FreeBSD 設置Kerberos。你也可以參考相關的聯機手冊
第17 頁FreeBSD 使用手冊
了解更詳細的說明。
在FreeBSD 中,Kerberos 不是來自最初的4.4BSD-Lite,而是eBones,來自于USA/Canada
以外的地區,那些受到美國加密代碼出口限制的國家就可以使用它。
10.6.1 創建最初的數據庫
這只可以由Kerberos 服務器來做。首先確定你沒有舊的Kerberos 數據庫。你必須改變
/etc/kerberosIV 的目錄,然后只檢查下面出現的文件:
# cd /etc/kerberosIV
# ls
README krb.conf krb.realms
如果任何其他文件(如principal.* 或master_key)存在,那使用kdb_destroy 命令就
可以破壞舊的Kerberos 數據庫,或者如果Kerberos 不在運行,只要刪除其他的文件。
你現在必須編輯krb.conf 和krb.realms 文件來定義你的Kerberos 規則。在這個例子
中,規則將是GRONDAR.ZA,服務器是grunt.grondar.za。我們可以編輯或創建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
在這個例子中,其他規則沒有出現。他們在這兒作為一個機器如何應用多種規則的例子。
你可能希望不要簡單地包括它們。
第一行命名了這個系統工作的規則。其它行包含了規則/主機的記錄。每行的第一項就
是一個規則,第二個是充當一個key distribution center 的規則中的一臺主機。接在一個
主機名后面的管理服務器的命令意味著主機也要提供一個管理數據庫服務器。更多信息,可
以參考Kerberos 的聯機手冊。
現在,我們必須添加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
它們在這兒作為一個例子來指出一臺機器如何可以知道多個領域。你也可以簡單地把它
們刪除。
第一行把指定的系統放在已命名的域中。其他行顯示了如何把一個特殊子域的系統默認
設為一個命名的域。
現在我們已經準備創建數據庫。這將需要運行Kerberos 服務器。執行命令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:
現在我們必須保存密匙,以便本地機器的服務器能夠得到加速。使用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 確保安全的每個系統的數據庫中。它們
的名稱是kpasswd 和rcmd。這些程序允許其他系統改變Kerberos 的密碼,然后象rcp, rlogin
和rsh 一樣運行命令。
現在,讓我們添加這些記錄:
# 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 創建新的服務器文件
我們現在必須分析在每臺機器上定義的服務的所有情況。我們使用ext_srvtab 命令。
這將創建一個文件,它必須通過安全方式被拷貝或移動到每個Kerberos 客戶端的
/etc/kerberosIV 目錄。這個文件必須在每個服務器和客戶機上出現,這對Kerberos 的操
作是很重要的。
# ext_srvtab grunt
Enter Kerberos master key:
Current Kerberos master key version is 1.
Master key entered. BEWARE!
Generating 'grunt-new-srvtab'....
現在,這個命令只產生一個臨時文件,它必須被重命名為srvtab,以便所有的服務可
以得到加速。使用mv 命令把它移到最初的系統上:
# mv grunt-new-srvtab srvtab
如果文件是針對客戶系統的,那網絡可能就會不安全,拷貝client-new-srvtab 到可抽
取式設備上,然后通過安全的物理方式進行傳輸。確信在客戶機的/etc/kerberosIV 目錄中
把它重命名為srvtab,確定它是mode 600:
# mv grumble-new-srvtab srvtab
# chmod 600 srvtab
10.6.4 定位數據庫
第23 頁FreeBSD 使用手冊
我們現在添加一些用戶記錄到數據庫。首先,讓我們為用戶jane 創建一個記錄。使用
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 守護程序。注意如果你沒有正確地編輯你的/etc/rc.conf
文件,那這將在你重啟系統的時候自動發生。這只有在Kerberos 服務器上是必須的。
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!
現在,我們可以使用命令kinit 得到一個id 為jane 的“入場券”:
% kinit jane
MIT Project Athena (grunt.grondar.za)
Kerberos Initialization for "jane"
Password:
如果我們正的有它們,使用klist 設法列出記號:
% 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
現在,如果kpasswd 程序可以得到數據庫的驗證,可以使用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 特權
Kerberos 允許我們給每個需要root 權限的用戶他們自己的分離supassword。我們現在
可以添加一個被用來驗證su 到root 的id。使用kdb_edit,我們可以在Kerberos 數據庫中
創建一個記錄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
現在設法獲得一些記號來確定它在做什么:
# kinit jane.root
MIT Project Athena (grunt.grondar.za)
Kerberos Initialization for "jane.root"
Password:
第28 頁FreeBSD 使用手冊
現在,我們必須添加用戶到root 的.klogin 文件:
# cat /root/.klogin
jane.root@GRONDAR.ZA
現在設法執行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 使用其他命令
在一個早期的例子中,我們創建了一個叫做jane 的用戶作為一個root。這里就以這個
用戶為例,這是Kerberos 默認的;如果必須的記錄在.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
訪問并登陸到jane 的在這個系統上的帳戶或文件。
例如,jane 現在登陸進另一個系統,使用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 登陸進在同一機器上的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 防火墻
防火墻是提高人們訪問互聯網的興趣的一個工具,它能夠提高私有網絡的安全性。這節
將介紹防火墻是什么,如何使用它們,和如何使用內核中提供的工具來實現它們。
注意:人們經常認為在你的內部網絡與外部網絡之間建立一個防火墻能夠解決所有的安
全問題。但是一個糟糕的防火墻設置要比沒有防火墻可能更加危險。一個防火墻可以為你的
系統增加另一個安全層,但它不可能完全阻止一些黑客高手侵入你的系統。如果你覺得你的
防火墻能夠完全阻止黑客入侵而放松了安全設置,那你可能會讓黑客侵入你的系統變得更加
容易。
10.7.1 什么是防火墻?
今天,經常使用的防火墻主要有兩種類型。第一種類型是叫做packet filtering
router,它主要是通過設置一定的規則來轉發或阻止數據包的傳輸。第二種是proxy server,
依靠守護程序來提供驗證,然后轉發數據包。
有時,有些站點同時使用兩種類型的防火墻,以至只有某臺機器(主要是bastion host)
才能被允許發送數據包到內部網絡。代理服務運行在bastion host上,通常它要比普通的
驗證機制安全。
FreeBSD 有一個內核數據包過濾程序(IPFW),在這節的余下部分將詳細講到,但由于有
很多的代理服務器可以使用,所以在這篇文檔中無法一一講到。
10.7.1.1 數據包過濾路由
路由器是負責在網絡之間轉發數據的機器。一個數據包過濾路由器在它的內核中有額外
一部分代碼,它們在決定數據包是被轉發還是被阻止之前,會根據給出的規則比較每個數據
包。絕大多數現代的IP 路由軟件都有數據包過濾代碼。要啟用這些過濾器,你必須定義一
些過濾代碼的規則,以便它能決定數據包是否被允許轉發或阻止。
過濾代碼會檢查所設定的匹配一個數據包頭部內容的規則來決定這個數據包是否被通
過。一旦一個匹配找到了,這個規則動作就啟用了。這個規則可能會減慢數據包以便傳輸數
據,或是發送一個ICMP 信息給這個數據包的發送者。只有第一個匹配會計數,以便按順序
來查找到這些規則。因此,這些規則的列表可以被看作是規則鏈。
第31 頁FreeBSD 使用手冊
數據包匹配標準的變化依賴于使用的軟件,但典型的你可以指定依賴于數據包的源IP
地址,目的IP 地址,源端口號,目的端口號,或是數據包類型(UDP, TCP, ICMP 等)的規則,
10.7.1.2 代理型服務器
代理型服務器是把普通系統守護程序(telnetd, ftpd 等)用作特殊服務器的機器。這些
服務器被叫做proxy servers。這個可以在你的防火墻主機上運行一個代理telnet 服務器,
人們可以從外部telnet 進入你的防火墻, 通過一些驗證機制,然后獲得訪問內部網絡的權
利。
代理型服務器通常要比普通的服務器更安全,可以提供更廣泛的驗證機制,包括
one-shot 口令系統,所以即使有人設法尋找了你使用的密碼,他們也不能使用它獲得訪問你
的系統的權利,因為密碼會立即失效。由于他們不能給用戶訪問主機的權利,所以它使得想
要在的系統上安裝后門變得困難得多。
代理型服務器有很多種限制訪問的方法,所以只有某個主機獲得了訪問服務器的權利,
他們才可以被設置,以至你可以限制哪個用戶可以跟哪個機器交談。另外,要使用哪個完全
取決于你選擇的代理軟件哪個更強大。
10.7.2 IPFW 允許你做些什么?
IPFW,由FreeBSD 提供的軟件,是一個位于內核中的數據包過濾和結算系統,有一個用
戶水平的控制工具,ipfw。他們允許你定義和查詢內核正在使用的規則。
IPFW 有兩個相關的部分。防火墻那節允許你執行數據包過濾。也有一個IP 結算章節允
許你追蹤你的路由器的情況。這將允許你看到你的路由器從某個機器得到了多少的傳輸量,
或有多少的WWW 數據被轉發。
你可以使用在沒有路由的機器上在輸入與輸出的連接之間,使用IPFW 來執行數據包
過濾。這是IPFW 一個比較特殊的用法,同樣的命令和技術也可以被用到。
10.7.3 在FreeBSD 上啟用IPFW
由于IPFW 的主要部分被捆綁在內核中,你必須要在你的內核配置文件中添加一個或多
個選項,這取決于你要使用哪個工具,然后重新編譯內核。
與IPFW 相關的有三種內核配置選項:
第32 頁FreeBSD 使用手冊
options IPFIREWALL
將數據包過濾編譯進內核。
options IPFIREWALL_VERBOSE
通過syslogd 啟用代碼來允許記錄數據包的日志。沒有這個選項,即使你指定了,數據
包也不在過濾規則中被記錄進日志。
options IPFIREWALL_VERBOSE_LIMIT=10
通過syslogd 限制數據包日志的記錄。你可以使用這個選項記錄防火墻的活動,但不要
過多地使用syslogd,否則會給拒絕式服務攻擊提供機會。當一個數據鏈記錄到達指定的受
限制的數據包時,日志會在那個特殊的記錄被關閉.要繼續進行日志,你必須使用ipfw 工具
刷新相關的記數器:
# ipfw zero 4500
這兒的4500 是你希望繼續日志的數據鏈記錄。
先前的FreeBSD 版本已經包含了IPFIREWALL_ACCT 選項?,F在,現在把它作為防火墻代
碼已經變得很陳舊了。
10.7.4 配置IPFW
IPFW 的配置可以通過使用ipfw 工具來完成。這個命令的語法看起來很復雜,但一旦
你理解個它的結構就會變得很簡單。
當前,這個工具可以使用四種不同的命令:addition/deletion, listing, flushing 和clearing。
Addition/deletion 被用來建構控制數據包如何被接受,拒絕,和日志的控制規則。Listing 被
用來檢查你規則設置的內容和數據包記數器。Flushing 被用來刪除所有記錄鏈的記錄。
Clearing 被用來對一個或多個記數記錄進行清零。
10.7.4.1 改變IPFW 的規則
這種形式的命令語法是:
ipfw [-N] command [index] action [log] protocol addresses [options]
第33 頁FreeBSD 使用手冊
當使用這種形式的命令時,會有一個正確的標記:
-N
在輸出中解決地址和服務的名稱。
給出的命令可以被縮短到最短的獨特形式。正確的命令是這樣的:
add
添加一個記錄到firewall/accounting 規則列表
delete
從firewall/accounting 規則列表中刪除一個記錄
先前使用的IPFW 可以分離firewall 和accounting 記錄?,F在的版本提供了與每個防
火墻記錄數據包accounting。
如果提供一個索引值,它會被放置在數據鏈中的一個指定點的記錄。否則,記錄會被放
置在超過上次數據鏈記錄的索引值100 的數據鏈的結尾(這不包括默認的策略,一般是
65535,deny)。
如果內核編譯進IPFIREWALL_VERBOSE,日志選項會把匹配規則輸出到系統控制臺。
正確的指令是:
reject
阻止數據包,然后發送一個ICMP 主機或無法到達數據包端口給數據源。
allow
通過數據包。(別名:pass and accept)
deny
阻止數據包。數據源沒有得到ICMP 消息的通報。
count
升級數據包記數器,但不允許/阻止以這個規則為基礎的數據包。會繼續對下一個數據
鏈記錄進行搜索。
第34 頁FreeBSD 使用手冊
每個動作會通過加上一個簡短明確的前綴來驗證。
可能被指定的協議是:
all
匹配所有的IP 數據包
icmp
匹配ICMP 數據包
tcp
匹配TCP 數據包
udp
匹配UDP 數據包
地址的規則:
from address/mask [ port] to address/mask [ port] [via interface]
你可以只指定與支持端口的協議相關聯的端口(UDP 和TCP)。
所通過的路徑是可選擇的,可以指定一個本地IP 接口的IP 地址或域名,或是一個只與
來自這個接口的數據包匹配的接口名(如:ed0).接口單位數目可以用一個可選擇的通配符
來表示。例如,ppp*將匹配所有內核PPP 接口。
指定一個address/mask的語法:
address
或
address/ mask-bits
或
address: mask-pattern
第35 頁FreeBSD 使用手冊
一個正確的主機名可以被指定用來代替IP 地址。mask-bits是一個十進制的數,可以
用來表示地址將被設置成多少位。例如,指定192.216.222.1/24 將創建一個允許與在C 類
子網中所有的地址相匹配的地址范圍。(在這個例子中是,192.216.222)。mask-pattern
是一個將與給定的地址想邏輯聯系的IP 地址。任何關鍵字都可以被用來指定“任何IP 地址”。
指定將被阻止的端口號碼:
port [, port [, port [...]]]
指定一個簡單的端口或端口列表,
port- port
指定一個端口范圍。你也可以結合一個簡單的列表范圍,但范圍必須先被指定。
可用的選項是:
frag
匹配數據包中第一個片段。
in
匹配進入的數據包
out
匹配輸出的數據包
ipoptions spec
匹配IP 頭包含用逗號分割的用spec指定的選項列表。IP 選項的支持列表是:ssrr (嚴
格源代碼路由), lsrr (寬松源代碼路由), rr (記錄數據包路由),和ts (時間標記)。
established
匹配已經建立TCP 連接的部分數據包。你可以通過在數據鏈中通過放置一個建立的規則
來調整防火墻的性能。
setup
匹配試圖建立一個TCP 連接的數據包。
第36 頁FreeBSD 使用手冊
tcpflags flags
匹配包含flags標記的用逗號分割的TCP 頭。支持的標記是fin, syn, rst, psh, ack,
和urg。
icmptypes types
匹配在types列表中出現的ICMP 類型。列表可以用一個以逗號隔開的聯合或分離的排
列形式。通常使用的ICMP 類型是:0 echo reply (ping reply), 3 destination unreachable, 5 redirect,
8 echo request (ping request), 和11 time exceeded
10.7.4.2 列出IPFW 規則
這種形式的命令的語法是:
ipfw [-a] [-t] [-N] l
當使用這種命令時,有三種正確的標記:
-a
當列條目時,顯示計數器的值。這個選項是唯一可以看到計數器值的方法。
-t
顯示每個數據鏈記錄的最后匹配次數。定時的列表與用ipfw 工具輸入的語法是不兼容
的。
-N
試圖分解給定的地址和服務名稱。
10.7.4.3 提高IPFW 規則
語法是:
ipfw flush
這將把防火墻鏈中的所有記錄都刪除,除了內核中指定的可修復的默認策略(索引
65535)。當提高規則時可以使用警告,默認的阻止策略將迫使你的系統斷開網絡,知道允許
記錄被添加到鏈中。
第37 頁FreeBSD 使用手冊
10.7.4.4 刷新IPFW 數據包記數器
刷新一個或多個數據包記數器的方法:
ipfw zero [ index]
當使用不帶索引值選項時,所有的數據包計數器將被刷新。如果一個索引被啟用,那刷
新操作將只影響一個指定的數據鏈記錄。
10.7.5 使用ipfw 命令的例子
這個命令會阻止所有從主機evil.crackers.org 到主機nice.people.org 的telnet 端
口的數據包:
# ipfw add deny tcp from evil.crackers.org to nice.people.org 23
下一個例子會阻止和日志任何從crackers.org 網絡(c 類地址)記錄到機器
nice.people.org 的TCP 傳輸(任何端口)。
# ipfw add deny log tcp from evil.crackers.org/24 to nice.people.org
如果你不要任何人發送X 會話給你的內部網絡(C 類子網),下面的命令將會作必要的
過濾:
# ipfw add deny tcp from any to my.org/28 6000 setup
看看計算記錄:
# ipfw -a list
或用一個簡短的形式:
# ipfw -a l
你也可以看看上次相配的數據鏈記錄:
# ipfw -at l
第38 頁FreeBSD 使用手冊
10.7.6 建構一個數據包過濾防火墻
注意:下面的建議僅僅是建議。每個防火墻的要求是不同的,我們不能告訴你如何建構
一個符合你特殊要求的防火墻。
當一開始設置你的防火墻時,除非你有一個可測試的設置,可以在一個可控的環境中配
置你的防火墻,否則強烈建議你使用命令的日志版本,和在內核中啟用日志。這將允許你快
速地確定問題所在,以便不需要太久就可以修復。即使初始安裝已經完成,還是建議你使用
日志來“阻止”有可能的攻擊,或根據你的要求修改防火墻的規則。
注意:如果你使用接受命令的日志版本,它可以產生巨大的日志數據,所以巨大的
FTP/http 傳輸將使系統的性能大大下降。在數據包通過之前它會要求內核做更多的工作。
syslogd 將開始使用更多的處理時鐘,以至有許多額外的日志被記錄到磁盤上,不久就會填
滿/var/log 分區。
你可以從/etc/rc.conf.local 或/etc/rc.conf 啟用你的防火墻。相關的聯機手冊會解
釋如何列出當前的防火墻配置。如果你不使用當前的配置,ipfw 列表將輸出當前的規則設
置到一個文件rc.conf。如果你不使用/etc/rc.conf.local 或/etc/rc.conf 來啟用防火墻,
在任何接口被配置之前,確認你的防火墻被啟用是很重要的。
下一個問題是你的防火墻實際上做了些什么!這主要依賴于你允許什么從外部訪問你的
網絡,和允許多少訪問外部網絡。一些通常的規則是:
. 阻止所有TCP 端口小于1024 的訪問。這是安全服務最敏感的地方,象finger, SMTP
(mail) 和telnet。
. 阻止所有進入的UDP 傳輸。通過UDP 傳輸的有很多有用的服務,有什么有用的傳輸
服務,就會有什么安全問題。(如Suns RPC 和NFS 協議)。這也是它的缺點,既然UDP
是一個無連接協議,阻止進入的UDP 傳輸也會阻止對輸出UDP 傳輸的回應。這可能會對
使用外部archie 服務的人們帶來麻煩。如果你要允許訪問archie,你將必須允許來自端
口191 和1525 的數據包能夠通過防火墻進入內部UDP 端口。ntp 是另一個你可以允許
訪問通過的服務,它使用端口123。
第39 頁FreeBSD 使用手冊
. 阻止端口6000 與外部的傳輸服務。端口6000 被用來訪問X11 服務器,可能會帶來
一個潛在的安全問題。X11 實際上可以使用以6000 開始的端口范圍,上面的限制取決于
你可以在機器上運行多少個X 顯示程序。上面的限制通過RFC 1700 定義的是6063。
. 檢查內部服務器使用什么服務器(如SQL servers 等)。阻止這些服務可能是一個好
主意,因為它們分布于上面指定的1-1024 的范圍之內。
另外可以到下面這個網站去查看一下防火墻配置的列表
http://www.cert.org/tech_tips/packet_filtering.html
就象上面提到的,這些只是guidelines (建議/ 指導原則)。你必須根據你的具體情況決
定使用什么過濾規則。如果有人侵入了你的網絡,我們不承擔任何責任,即使你按照了上面
提到的方法做了。
10.8 OpenSSL
自從FreeBSD 4.0 以來,OpenSSL 工具包已經成為基本系統的一部分了。OpenSSL 提供
了一個普通的密碼庫,就象安全套接層v2/v3 (SSLv2/SSLv3),和傳輸層安全v1(TLSv1)網
絡安全協議。
然而,包含在openssl 中的某些加密算法(特別是IDEA)被USA 加以限制了,它不能不
受限制地使用。在FreeBSD 中,IDEA 被包含在openssl 的源代碼中,但它默認情況下沒有
被構建。如果你想使用,你需要照著許可條款來操作,在/etc/make.conf 中啟用MAKE_IDEA,
然后重新建構整個系統。
今天,RSA 算法被自由使用在美國和其他國家。在過去它是受保護的。
10.8.1 源代碼安裝
OpenSSL 是src-crypto 和src-secure cvsup collections 的一部分??梢钥纯传@得
FreeBSD 那節了解更多有關獲得和升級FreeBSD 源代碼的信息。
10.9 IPsec
IPsec 機制提供了IP 層與socket 層之間安全的通訊方式。這節將介紹如何使用它們。
有關執行細節,請參考開發人員手冊。
第40 頁FreeBSD 使用手冊
當前的IPsec 執行模式既支持傳輸模式也支持隧道模式。但隧道模式有一些限制。在
http://www.kame.net/newsletter/上有比較詳細的例子:
為了使用這個功能,請保持清醒,你必須將下面這些選項編譯進內核:
options IPSEC #IP security
options IPSEC_ESP #IP security (crypto; define w/IPSEC)
10.9.1 基于IPv4 的傳輸模式例子
讓我們設置一個安全的連接以便在主機A (10.2.3.4)和主機B (10.6.7.8)之間配置一
個安全的通道。這兒列出了幾個復雜的例子。從主機A 到主機B ,只有老的AH 可以被使用。
從主機B 到主機A,新的AH 和新的ESP 將被結合起來。
現在,我們必須選擇一個算法以用來適應"AH"/"new AH"/"ESP"/"new ESP"。請參考
setkey 的聯機手冊了解算法的命名。我們的選擇是對AH 用MD5,對新AH 用new-HMAC-SHA1,
對新ESP 用帶有8 位的new-DES-expIV。
關鍵字的長度依賴于每個算法。例如,關鍵字的長度對于MD5 需要用16 位,對于
new-HMAC-SHA1 需要用20 位,對于new-DES-expIV 需要用8 位?,F在我們分別選擇
"MYSECRETMYSECRET", "KAMEKAMEKAMEKAMEKAME", "PASSWORD"。
好的,讓我們為每個協議分派一個SPI(Security Parameter Index)。請注意我們需要
為這個安全通道設計3 個SPIs,因為產生了三個安全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)