FreeBSD 系統安全
確保 root 用戶和所有用戶帳戶的安全
首先,如果沒有確保 root 帳戶的安全,請不要為確保所有用戶的安全而煩惱。絕大 多數系統都會指派一個密碼給 root 用戶帳戶。第一件事是假定密碼總是不方便。這並不意 味著要把密碼刪掉。密碼通常對用控制臺訪問機器是必須的。也就是說,不應當讓所有用戶輕易 到控制臺訪問機器,即使是使用 su 命令。例如,確信 pty's 作為不安全的因素已經被 記錄在 /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 機制要什麼都沒有要好得多,但它也不是最安全的選擇。
員工帳號和 root 帳號的密碼檔案存在 /etc/master.passwd , 而一般沒有設定密碼會出現 * 可以 man vipw 查看這個部份的資料。 使用 vipw 可以修改更新所有相關權限和使用者的資料庫。
一般員工帳號:
foobar:R9DT/Fa1/LV9U:1000:1000::0:0:Foo Bar:/home/foobar:/usr/local/bin/tcsh
可以修改為:
foobar:*:1000:1000::0:0:Foo Bar:/home/foobar:/usr/local/bin/tcsh
確保超級用戶帳戶安全的間接方法是通過使用一個有選擇性的登入訪問方法確保 用戶帳戶的安全。這樣做,入侵者可能會偷竊到密碼檔,但不會侵入任何用戶帳戶。用戶 成員通過使用一對私有或公共密匙(如 kerberos 或 ssh)的安全機制來進入。當 使用kerberos 時,必須確保使用 kerberos 的伺服器或工作站的安全。當使用一對ssh 的公共/私有密匙系統,必須確保所登入的那台機器的安全,但當用 ssh-keygen 創建 時,可以添加一個額外的保護層到鑰匙對中。可以強制所有的用戶成員使用加密 的方法連接活動,這樣就可以關閉可能會被入侵者使用的一個重要漏洞:將一個毫無 關係,很不安全的機器與網路隔離。
更多間接的安全機制能夠被實現。可以從一個帶有限制性的伺服器到一個毫無限制性 的伺服器進行登入。例如,如果主郵箱運行在所有種類的伺服器上,那工作站就無 法運行任何東西。為了確保工作站的安全,盡可能少運行伺服器,直到根本就沒有伺服器 運行,然後運行一個受密碼保護。當然,一個入侵者強行訪問工作站,就會把 所設置的所有安全特性都破壞掉。有一個問題必須明確,必須考慮到這樣一個事實,絕 大多數入侵是從那些沒有物理訪問工作站或伺服器許可權的人那裏,通過一個網路來侵入的。 使用象 kerberos 這樣的技術,也會無法使用系統,或者改變用戶帳戶的密碼,從而影響 到擁有一個帳戶的所有用戶成員。如果一個用戶成員的帳戶已經失去安全,應當改變它在所 有機器上的密碼。對於不連續的密碼,在 n 台機器上改變一個密碼可能是很亂的。可能要 用 kerberos 重建密碼的限制:一張 kerberos 的許可證可能一段時間後會過期,但 kerberos 系 統可能要求用戶在一段時間以後選擇一個新密碼(一般是一個月)。
確保以 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 程式,入侵者就可以 讀到 /dev/kmem,因而可以讀到 crypted 密碼檔,從而危及到受密碼保護的帳戶的安全。 另外,一個侵入組 kmem 的入侵者可以通過 pty's 來監測到擊鍵的情況,包括通過安全方 法登陸的用戶的情況。一個侵入 tty 組的入侵者可以寫入幾乎任何用戶的 tty。如果用戶正 在運行一個終端程式或帶有鍵盤類比特性的模擬器,入侵者可以偷偷地發送一個資料流程來 使用戶的終端顯示一個命令,然後就以那個用戶的身份來運行。
確保用戶帳戶的安全
用戶的帳戶通常是很難確保安全的。當用嚴格的訪問限制來約束用戶時,不 可以使用普通用戶帳戶來這樣做。如果有充分的控制,那可以確保用戶帳戶的 安全。如果沒有,必須時刻警惕地監視那些帳戶。為用戶的帳戶使用 ssh 和 kerberos 可 能會有問題,需要額外的管理和技術支援,但與 crypted 密碼檔相比仍是一個比較好解決 方案。
確保密碼檔的安全
唯一的確保安全的方法是用 * 號來代替輸入的密碼,使用 ssh 或 kerberos 來訪問那些帳 戶。即使 crypted 密碼檔(/etc/spwd.db)只能被 root 讀取,入侵者可能無法獲得 root 寫 的許可權,但也可能會獲得讀的許可權。
安全腳本必須經常檢查和報告密碼檔的修改情況。(看Checking file integrity這裡).
確保內核核心,Raw 設備和檔系統的安全
如果一個入侵者攻破 root,就可以做任何事情。例如,絕大多數現代內核都有一個 包來探測內建的設備啟動器。在 FreeBSD 下,它被叫做 bpf 設備。一個入侵者通常會試圖 在一台不安全的機器上運行一個包探測器。所以,絕大多數系統都不把 bpf 設備編譯進內 核。
但即使關閉了bpf 設備,仍然可能會對 /dev/mem 和 /dev/kmem 擔心。因為,入侵 者仍可以寫到 raw 磁片設備。另外,還有另一個叫做 module loader 的內核特性,kldload。 一個入侵者可以在運行內核時使用一個 KLD module 來安裝它自己的 bpf 設備,或其他檢測設備。 要避免這些問題,必須在更高安全級別上運行內核,至少在 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 程式和系統分區上新增或刪除的檔。
當使用 ssh 而不是 NFS 時,寫入安全腳本是很困難的。為了運行,必須 scp 腳 本到客戶機上,使看得見,為了安全也必須 scp 那些腳本使用的程式。在客戶機上 的 ssh 程式已經有安全問題了。總的來講,當通過不安全的連接運行時,使用 ssh 可能是 必須的,但也比較難處理。
一個好的安全腳本將通過訪問配置檔來檢查用戶的變 化:.rhosts, .shosts, .ssh/authorized_keys。已經超出了 MD5 檢查的範圍。 如果有一個巨大的磁碟空間,可能需要花很長時間來檢查每個檔。在這種情況 下,設置掛載標記來不接受 suid 程式和設備在那些分區上是一個好主意。nodev 選項 nosuid 選項正是所看到的。可以掃描一下,至少一個星期一次。
處理帳戶是作業系統的一個相關特性,可以作為一個 post-break-in 的評價機制。 在跟蹤入侵者是如何侵入系統的時候特別有用.
最後,安全腳本應當處理日誌檔。一個入侵者設法掩蓋自己的蹤跡,日誌檔可以 指示系統管理員設法追蹤到最初侵入的時間和方法。確保日誌檔持久記錄的日誌檔的 一個方法是運行系統控制臺到一個串列口,通過持續不斷地檢測控制臺來收集資訊。
偏執狂
帶點偏執可能不會有傷害。作為一個慣例,一個系統管理員需要添加許多安全特性, 並且盡可能地不影響到使用的便利性。更重要的是一個安全系統管理員應當經常修復漏洞。
拒絕式服務攻擊(DoS)
這節將介紹拒絕式服務攻擊。一個 DoS 攻擊通常是一個包攻擊,它可以使網路癱 瘓。應當做一些限制,讓攻擊不會癱瘓伺服器。
限制伺服器的forks.
限制跳板springboard 攻擊(ICMP response attacks, ping broadcast, etc.)。
內核通道的緩存。
一個普通的 DoS 攻擊通常試圖讓伺服器吃掉所有進程,檔描述和記憶體,直到機器死 當。inetd 有好幾個選項可以來限制這種攻擊。需要注意的是當無法阻止一個服務被攻擊所 打斷時,可以阻止一台機器當機。閱讀一下 inetd 的手冊,特別需要注意 -c, -C, 和 -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 就會對每個欺騙性的請 求產生回應,從而侵佔大量的網路資源,特別是當攻擊者使用同樣的欺騙手段用幾十個廣 播位址從幾十個不同的網路進攻時。
超過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。有兩個問題:
當一個負載量很小的伺服器突然受到攻擊時,內核沒有很快地回應。
由於 rtminexpire 太小而無法抵抗住一個持續不斷的攻擊。
如果你的伺服器通過 T3 或更高速度的線路連接到 internet,可能需要通過使用 sysctl 來手動地調整 rtexpire 和 rtminexpire。千萬不要把參數設為0(除非想要摧毀機器)。 把參數設為 2 秒對於保護路由表免受攻擊是非常好的。
使用 Kerberos 和 SSH 登入問題
如果打算使用的話,在 kerberos 和 ssh 之間有好幾個問題需要記住。Kerberos V 是一個非常卓越的驗證協議,但在加密 telnet 和 rlogin 應用程式時會有一些錯誤,可能 會不太適合處理二進位資料流。另外,默認的 kerberos 也無法加密一個會話,除非 使用-x 選項。ssh 默認能加密任何東西。
建議無論用戶什麼時候登入系統,都可以結合 kerberos 來使用 ssh。ssh 可以在 編譯時加入對 kerberos 的支持。也建議在 ssh 配置中關閉 key-forwarding,或者在 authorized_keys 檔中使用 from=IP/DOMAIN 選項使得只有用作實體的密匙可以從特殊 機器登陸進系統。