FreeBSD連載(76):設置基本系統

2000年1月17日 13:00 王波

  FreeBSD系統是一種安全性非常好的通用操作系統,在Internet上很少發生FreeBSD系統被攻 擊的報告,事實上最近一端時間內CERT的安全報告中幾乎沒有發生在FreeBSD系統上的安全報告。一方面是因為 FreeBSD安全性很好,另一方面也是由於FreeBSD用戶對於系統安全比較了解的緣故。

  與其他Unix系統相比,FreeBSD系統的傳統味道更足一些,設計者以追求完美的態度去完成每一種設計, 穩定性和安全性就是其中的重要因素。因此,初始安裝好的FreeBSD系統已經具備比較高的安全性,一般用戶不需要特 別設置,便具備了相當高的安全性。而且經過一些簡單的設置之後,安全性可以更高。一些商業操作系統軟體聲稱經過了某個 安全認証,其實這些認証也只是保証最基本的安全性。目前的各種Unix版本(不包括較老的版本)經過一些設置工作,同 樣也能達到通過測試目的,只是包括FreeBSD在內的自由軟體系統,沒有資金、也沒有必要去參加這類測試。

  對系統安全要求更高,而又不打算自己調整系統設置的使用者,可以選擇另一種BSD Unix──OpenBSD ,它使用最大安全性的策略,其預設設置中應用了大量的系統安全措施,也因為如此,它稍微難用一些。

  • 設置基本系統

  增強FreeBSD的安全性可以從兩個方面出發,一個為使用FreeBSD提供的安全措施,這些安全措施可能 在預設情況下可能並沒有打開,但能夠提供額外的安全性。另一種為安裝其他輔助的安全軟體,這些額外的軟體可以在特定方 面增加系統安全,或幫助檢查系統安全的工具。

  • 用戶登錄控制

  為了提高系統的安全性,一個重要的方面就是區分不同的用戶,對於要使用不同服務的用戶區別對待。有些用戶只使 用遠程登錄服務的就不必具備控制台訪問的權限,有些用戶只在某些子網上使用系統的就不必允許在任何位置進行登錄,有些 帳戶只是用於系統維護目的,沒有任何使用者需要使用相應帳戶登錄,就不必允許登錄請求。

  當區分不同用戶的情況,最大限度的提供了登錄限制之後,就能對入侵者利用竊取的帳戶從其他位置進行攻擊設置了 障礙,提供更大的安全性。

  • 控制台安全控制

  系統的控制台是一個非常重要的安全弱點所在的位置,因為一個使用者能接觸控制台,那麼就表示他得到管理人員的 特殊信任。系統預設賦予了控制台終端以較大的安全信任。此外,接觸控制台還能從物理上訪問系統硬體,包括重新啟動系統 、將硬碟竊取分析其中的數據等等。然而,物理安全等措施不是在這裡要討論的內容。

  為了避免偶然的非法訪問控制台造成的安全問題,所需要設置的第一件任務就是取消控制台的信任設置,這個設置 位於/etc/ttys中。

console none     unknown off secure

  初始設置為secure表示root用戶可以在控制台登錄,另外,它還表示系統重新啟動之後,如果管理員要求 進入單用戶狀態,將不詢問root的密碼進行驗証,這是一個重要的安全漏洞。將secure更改為insecure可 以使得進入單用戶狀態時首先驗証root密碼,它帶來的後果是,一旦系統損壞了passwd檔案(主要是master.passwd 檔案),root密碼無法認証,就沒有辦法進入單用戶狀態進行修復工作,此時使用安裝碟啟動fixit 系統進行才能進行修正。

  使用另外一個運行在軟碟上的小FreeBSD系統也能完成修復系統的任務,後面將介紹定制單軟碟FreeBSD 系統的方法,這種小系統被稱為PICOBSD,可以用於設置網關或防火牆,以及可以用作專有系統的嵌入式操作系統。

  此外,為了防止用戶無意中重新啟動系統,還需要取消Ctrl-Alt-Del熱鍵的重新啟動能力,這需要重新 定制核心時使用以下選項。

options		SC_DISABLE_REBOOT

  注意,這是針對使用標準控制台syscon的系統才有效果。

  當屏蔽了系統的熱啟動能力,那麼重新啟動或關閉系統便需要使用系統命令來完成,此時能啟動系統的使用者便需要 root權限。而root密碼知道的人越多,系統越不安全。此時可以使用軟體包sudo來幫助解決這個問題,sudo 能限制某些特定用戶使用root權限完成指定的操作,它使用用戶本身的密碼,而非root密碼驗証用戶。

  即使屏蔽了熱啟動能力,並且重新啟動進入單用戶狀態也需要詢問密碼,系統仍然存在安全性問題。非法使用者可以 首先切斷電源,然後使用安裝碟或其他不使用現有檔案系統的FreeBSD系統碟啟動系統,獲得相關數據,或更改pas swd檔案,以便在重新啟動之後獲得root權限。保護這些攻擊,需要其他手段,例如設置電腦的啟動密碼,拆除系統 上的軟碟驅動器、光碟驅動器等。然而,對於能進行物理攻擊的入侵者,他的行為就如同一個正常系統管理員修復系統的行為 一樣,沒有絕對的辦法能杜絕這樣大膽妄為的舉動。

  如果管理員不能信任電腦系統的物理安全,為了防止信息外瀉,唯一的方法是進行加密,可以通過Unix命令crypt 對具備敏感信息的檔案加密。然而更簡便的方法是使用一種加密檔案系統,這類加密檔案系統對於正常操作就如同標 準檔案系統一樣,對任何應用程序的檔案操作完全透明,然而數據是以加密方式保存到物理設備中。而且在網路中傳送的也都 是加密後的密鑰,不必擔心泄露密鑰。FreeBSD下可以使用的加密檔案系統為TCFS,但它這不是FreeBSD的 標準配置,需要從http:// tcfs.dia.unisa.it/中單獨獲得。

  • 登錄控制

  為了加強控制台的安全,還應該阻止一般用戶在控制台上登錄入系統。為了達到這個目的,需要設置登錄訪問限制文 件/etc/login.access。該檔案由login程序讀取,限制用戶的登錄位置,該檔案中具備下面語句將屏 蔽除了wheel組、admin之外的用戶在console登錄的權力。

-:ALL EXCEPT wheel admin:console

  第一個字符“-“號,用於指明該句是用於屏蔽,相反,“+“用於打開登錄許可,由於這個檔案主要用於控制登錄 位置的目的,所以打開登錄許可的方式很少用得到。此後用冒號分隔的第二部分為帳號域,可以使用用戶名和組名,以及使用 login.access的關鍵字All、ALL EXCEPT等定義用戶。第三部分為登錄位置,這裡僅僅用於限制console。

  這個檔案不但能用來限制在控制台登錄,也能用來限制從其他位置登錄入系統,還可以限制一些帳戶在所有的位置都 不能登錄,這樣就能更好的保証安全性。

-:wheel:ALL EXCEPT LOCAL .local.net

  這句設置了對管理員組wheel的登錄位置限制,只能在本地或者本地的local.net域內電腦上建立登錄連接。設置 對能執行特定操作管理員的登錄限制也能增強系統安全性。

-:daemon bin lpd nobody nogroup:ALL

  這個設置限制一些特殊的系統用戶在所有節點上都不能登錄,系統中的很多帳戶事實上是用於系統維護的目的,並沒 有任何用戶需要使用他們登錄,顯然這也能增加安全性。

  然而,使用login.access並不能表示該帳戶就無法被非法使用了,很多網路服務不使用這個檔案進行用 戶限制,而是使用自己的用戶限制方式,因此入侵者可以通過這些網路服務攻擊相關帳戶。入侵者也可以通過先以其他用戶身 份登錄,再使用su命令繞過這個限制。所以使用這個限制檔案並不是一勞永逸的做法,事實上在保証網路安全方面,不存在 百分之百的解決方案,只能通過各個方面配置,盡量提高安全性。

  即使提供了有效的登錄控制,對於某些不必要的預設帳戶或長期不再使用的帳戶,最好還是將其刪除,以最大可能的 避免安全問題。例如用於UUCP的帳戶uucp,只有很少的系統需要這個帳戶。可以放心的是,FreeBSD系統中不 存在沒有密碼保護的預設帳戶,這將滿足一般用戶的安全需要。

  • 安全認証方式

  由於FreeBSD是一個多用戶系統,不但能由控制台用戶使用,還可以通過網路,提供其他用戶使用。而允許其他用戶 通過網路使用系統的時候,必須要對用戶進行驗証。此時的一個重要的安全問題就是密碼以明文形式在網路中傳輸的問題。

  • S/key和Kerberos

  為了避免密碼被竊聽,有很多解決方法可以避免這個問題。一個很有意思的解決方法是使用一次性的密碼系統,如 S/key,即使密碼被竊聽也不會對安全造成影響。FreeBSD預設就支持S/key系統,每個用戶都可以選擇是否使 用這個系統保証自己的密碼安全性。為了使用S/key系統,首先需要使用keyinit初始化針對這個用戶的密碼串。

bash-2.02$ keyinit
Updating wb:
Old key: de415501
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 wb s/key is 99 de415502
GAS SAM RUSK BASH NEWS WAIT

  由於這個命令是用於初始化S/key系統,要輸入一個S/key密碼短語(這個密碼可以設置的非常長,通常建 議使用一個句子以保証安全性),這個密碼將影響以後產生的一次性密碼,因此這個命令應該在一個安全連接的終端上(如控 制台)執行,而不應該在通過普通telnet絨N舋董s接的登錄會話上執行。在兩次輸入S/key的密碼之後,keyinit 將產生第一個一次性密碼,keyinit輸出的最後一行就是這個一次性密碼,上面的ID行中的99指一次性密碼 的序列號,de415502是這個一次性密碼對應的 “種子” 。密碼的 “種子” ,和S/key密碼短語相結合就 用於產生不同的一次性密碼序列。

  當使用了keyinit初始化S/key之後,就可以立即使用S/key一次性密碼登錄了。也可以使用key 命令產生其他一次性密碼,這需要指定一次性密碼的序列號和種子。

bash-2.02$ key 99 de415502
Reminder - Do not use this program while logged in via telnet or rlogin.
Enter secret password:
GAS SAM RUSK BASH NEWS WAIT

  key將提示用戶輸入密碼短語,因此這個命令也不應該通過網路來使用,只能用於直接連接的時候。然而不必為此 擔心,因為無論在那台電腦上,使用同樣的序列號、種子和密碼短語產生的密碼序列都是同樣的,因此可以在本地電腦上 ,產生用於遠程FreeBSD電腦登錄的一次性密碼。

  注意,S/key系統用於產生一次性密碼使用的單向Hash函數可能不同,最常用的有MD4、MD5和DES 算法,使用不同算法產生的一次性密碼序列不會相同。FreeBSD的S/key系統使用MD4算法,因此如果要在客戶 電腦為FreeBSD伺服器產生S/key一次性密碼,需要使用採用MD4算法的key程序。

  這樣當系統進行認証時,將提示skey序列號和種子。這樣用戶就能使用正確的一次性密碼登錄了。一旦一個密碼 用過,這個密碼就不再被使用,而使用下一個序列號的密碼。

Login: wb
s/key 99 de415502
Password:

  由於每次使用過的密碼將不再使用,而通過S/key認証的連接本身是不安全的連接,不應該用於再次產生新密碼 。那麼如果僅通過本地電腦產生S/key密碼,就限制了客戶機上必須安裝有S/key系統。事實上可以在建立安全連 接的時候,一次可以產生多個S/key一次性密碼,將這些密碼記錄或打印在密碼本上,隨用隨查,只要密碼本不丟失,就 沒有密碼泄露的問題。產生多個S/key一次性密碼需要使用-n參數執行key:

bash-2.02$ key -n 5 80 de415503
Reminder - Do not use this program while logged in via telnet or rlogin.
Enter secret password:
76: FIR SIGH BABE SUNG FUSS BAY
77: SOCK HOME WAGE CAN BALL WORE
78: DORA JUNO JAY YET HEAD SLUR
79: COWL TROY HURT SLAB SCAR GAGE
80: TOE BAKE FRAU PEG DOE I

  這將產生5個一次性密碼的序列,80為密碼序列的結束序號。此後需要經常更新所使用的密碼序列,即更改 S/key的種子,以產生新的密碼序列。

  更改S/key種子仍然還需要使用keyinit命令,然而此時有了一次性密碼,就不需要在安全的終端上進行 了,需要使用-s參數,使得keyinit使用一次性密碼來獲得S/key密碼短語,而不必直接輸入S/key密碼短 語。只要保証S/key密碼短語的安全,就能保証整個S/key一次性密碼序列不會被再現。

bash-2.02$ keyinit -s
Updating wb:
Old key: de415502
Reminder you need the 6 english words from the key command.
Enter sequence count from 1 to 9999: 100
Enter new key [default de415503]:
s/key 100 de415503
s/key access password: GAS SAM RUSK BASH NEWS WAIT

ID wb s/key is 100 de415503
GAS SAM RUSK BASH NEWS WAIT

  keyinit -s命令中,需要輸入一次性密碼序列中密碼的數量,以及新種子的值。而用於認証的S/key 一次性密碼為提示的一次性密碼,這裡為de415503,序列號為100。

  需要注意的是,預設情況下即使使用S/key認証,原有的Unix密碼認証方式仍然有效,如果S/key認証 不成功,系統就接下來使用原有的老Unix密碼認証方式。對於一些圖形界面的應用程序,不能提示S/key密碼的序列 號,那麼用戶也無法輸入正確的一次性密碼,此時使用老密碼就有必要了。

  然而,也能限制用戶必須使用S/key密碼,不能使用普通Unix明文密碼,以更大程度上增強安全性。為了強 制用戶使用S/key密碼,需要創建一個/etc/skey.access檔案。

# touch /etc/skey.access

  當存在這個檔案時,S/key認証系統就不再調用標準Unix認証系統。然而這個檔案中可以設置一些例外的情 況,允許使用Unix認証系統,例如在內部網路中允許使用Unix明文認証系統,等等。針對IP地址、用戶和終端來設 置可以使用Unix明文認証系統的權力。針對用戶打開這個設置的情況一般是因為該用戶不需要特別安全的情況,針 對終端打開這個設置的情況通常發生在撥號訪問FreeBSD系統的情況,由於認証密碼不通過網路,因此也不需要 S/key加密。

permit internet 198.162.0.0 255.255.0.0
permit user aaa
permit port ttyd0

  對於一些需要自動進行認証的應用程序,需要將密碼暫時保存起來,定時自動進行認証工作,但由於S/key的口 令是一次性方式的,而客戶軟體不能根據S/key的提示,輸入正確的密碼,此時使用老密碼也是必要的。如有些使用POP3 協議的客戶端能定時從郵件伺服器中下載郵件,這樣就必須使用標準Unix密碼。顯然這明顯是一個非常嚴重的安全漏 洞,特別是明文密碼不但是在網路上傳輸,而且是定時、多次傳輸的時候,問題更為明顯。對於這樣的情況,最好立即轉換為 支持加密密碼的協議,對POP3來講可以使用APOP協議。

  FreeBSD下使用的另一種安全認証方式為Kerberos方式,這是一種安全的認証模式,然而它需要客戶 和伺服器都支持這個認証方式才行。目前流行的Kerberos為Kerberos V,而FreeBSD下使用的為Kerberos IV ,因此與其他Kerberos客戶存在兼容的問題,使得這個認証系統大部分情況下用於多台FreeBSD 系統之間進行認証。這裡就不再介紹其使用方法了,需要使用這個能力的用戶可以查看FreeBSD Handbook ,以獲得相關的內容。

  FreeBSD下也可以安裝Kerberos V認証系統,它位於Posts Collecion中的sec urity部分中。

  • 可加載認証模塊PAM

  3.1-release之後的FreeBSD版本支持可加載的認証方式模塊PAM,這種機制能使得系統能非常靈活的支持多種 認証方式,具備非常大的可擴展性。PAM的設置檔案為/etc/pam.conf,這裡定義了各種條件下使用的認証方式。

# Configuration file for Pluggable Authentication Modules (PAM).
#
# This file controls the authentication methods that login and other
# utilities use.  See pam(8) for a description of its format.
#
# Note: the final entry must say "required" -- otherwise, things don't
# work quite right.  If you delete the final entry, be sure to change
# "sufficient" to "required" in the entry before it.
#
# $FreeBSD: src/etc/pam.conf,v 1.1 1998/11/20 23:20:01 jdp Exp $

# If the user can authenticate with S/Key, that's sufficient.
login	auth	sufficient	pam_skey.so

# Check skey.access to make sure it is OK to let the user type in
# a cleartext password.  If not, then fail right here.
login	auth	requisite	pam_cleartext_pass_ok.so

# If you want KerberosIV authentication, uncomment the next line:
#login	auth	sufficient	pam_kerberosIV.so		try_first_pass

# Traditional getpwnam() authentication.
login	auth	required	pam_unix.so			try_first_pass

  這是系統預設的pam.conf檔案,這裡定義了三個認証過程,按照順序系統將首先使用pam_skey.so ,然後pam_cleartext_pass_ok.so,最後是標準unix認証pam_unix.so。第一個 是用於使用S/key系統認証,第二個不是一個認証,而是用於限制用戶訪問的,它檢查/etc/skey.access ,以禁止非許可的節點、用戶登錄,因此其第三個參數為requisite,而非pam_skey.so對應的sufficient ,如果第二個設置許可,才能進入第三項定義的標準Unix認証方式。

  注意,如果存在/etc/pam.d目錄,PAM將在這個目錄中尋找設置信息,而忽略pam.conf。

  這些認証系統的動態連接庫均位於系統中的/usr/lib/目錄下,如果需要,可以增加其他認証方式。

# ls -l /usr/lib/*pam*
-r--r--r--  1 root  wheel  59938 Feb 15 18:41 /usr/lib/libpam.a
lrwxrwxrwx  1 root  wheel     11 Apr 14 16:24 /usr/lib/libpam.so -> libpam.so.1
-r--r--r--  1 root  wheel  33451 Feb 15 18:41 /usr/lib/libpam.so.1
-r--r--r--  1 root  wheel   2895 Feb 15 18:41 /usr/lib/pam_cleartext_pass_ok.so
-r--r--r--  1 root  wheel   6587 Feb 15 18:41 /usr/lib/pam_radius.so
-r--r--r--  1 root  wheel   3798 Feb 15 18:41 /usr/lib/pam_skey.so
-r--r--r--  1 root  wheel   6497 Feb 15 18:41 /usr/lib/pam_tacplus.so
-r--r--r--  1 root  wheel   3333 Feb 15 18:41 /usr/lib/pam_unix.so

  其中每個以pam_開頭的庫均對應一種認証方式,可以看出系統中還能提供其他幾種認証方式,如RADUIS、 TACPLUS等方式。使用libpam能幫助用戶開發其他PAM認証程序。

  PAM是一種新的、更為靈活的認証機制,以前的FreeBSD版本並不支持這種方式。PAM雖然更為靈活,但 對於一般目的,預設的支持s/key和標準認証方式的設置就能滿足需要了,一般不必改動配置檔案。然而有些時候,譬如 ISP,通常使用RADUIS伺服器來保存用戶的認証數據,此時使用RADUIS進行認証就能帶來非常大的益處。因為 PAM涉及系統認証,因而對安全性非常重要,不能輕易加入一個非信任的認証模塊,因為除了模塊本身的問題之外,認証模 塊中很容易加入後門。建議經常檢查/etc/pam.conf,/etc/pam.d/目錄,以及/usr/lib/*pam* 檔案是否被非法改動,以保証系統安全。

  • 網路服務與應用程序安全

  由於提供服務與保障系統安全性是有衝突的,提供的服務越多,就會存在越多的潛在的危險性。因此為了增加系統安 全,就要盡量減少系統提供的服務。

  提供網路服務的守護進程主要有兩種啟動方式,一種為從系統啟動檔案中啟動,另一種為通過inetd超級守護進 程啟動應用程序。

  • 系統rc檔案

  通常的系統啟動檔案啟動的守護進程有sendmail、syslogd、lpd等,要改變系統啟動的服務進程 ,需要更改的檔案包括/etc/rc.conf、/etc/rc.local,以及/usr/local/etc/rc.d 與/usr/X11R6/etc/rc.d目錄下的以.sh結尾的啟動檔案(這兩個啟動腳本目錄是由rc.conf 中的local_startup定義,因此也有可能被設置為了其他的值)。除非特殊情況,其他的rc檔案不應該被 改動,如果其他的rc檔案被非法更改,很可能是入侵行為。

  特別需要注意/etc/default/rc.conf,/etc/rc.conf.local檔案,因為這 些檔案也能用於設置啟動服務,而不被管理員所注意,因此可能是入侵者用於放置後門程序的位置。

  為了減少守護進程,就需要將rc.conf中相關選項設置為NO,例如要屏蔽sendmail,就可以設置 sendmail_enable=”NO”。此外,預設的rc.local檔案中沒有內容,因此在這裡也不應該有降低系 統安全的設置,/usr/local/etc/rc.d/和/usr/X11R6/etc/rc.d/目錄下的執行腳 本為安裝其他軟體包時所安裝的,對於不希望提供的網路服務,應該將執行腳本更改為以其他後綴結尾的檔案,只有以 .sh結尾的執行腳本才會在啟動時自動執行。

  一個安全的FreeBSD系統,應該具有干淨的rc.local檔案,/usr/local/etc/rc.d 與/usr/X11R6/etc/rc.d目錄,以及盡量減少基本啟動進程的rc.conf檔案。

  守護進程直接放在rc檔案中啟動,將具備root的權限,危險性較大。如果能使用用戶的身份可以執行守護進程 的相應操作,就應該使用用戶的身份執行它。這可以通過使用su命令啟動服務進程的方式,代替直接啟動服務進程的命令。

su user services_process

  • inetd伺服器

  然而,Unix系統中絕大多數服務進程還是通過超級伺服器進程inetd來啟動的。它的設置檔案為/etc/inetd.conf ,以下為這個檔案的一部分。

#
#	$Id: inetd.conf,v 1.30 1998/09/30 16:12:40 wosch Exp $
#
# Internet server configuration database
#
#	@(#)inetd.conf	5.4 (Berkeley) 6/30/90
#
ftp	stream	tcp	nowait	root	/usr/libexec/ftpd	ftpd -l
telnet	stream	tcp	nowait	root	/usr/libexec/telnetd	telnetd
shell	stream	tcp	nowait	root	/usr/libexec/rshd	rshd
login	stream	tcp	nowait	root	/usr/libexec/rlogind	rlogind
finger	stream	tcp	nowait/3/10 nobody /usr/libexec/fingerd	fingerd -s
#exec	stream	tcp	nowait	root	/usr/libexec/rexecd	rexecd
#uucpd	stream	tcp	nowait	root	/usr/libexec/uucpd	uucpd
#nntp	stream	tcp	nowait	usenet	/usr/libexec/nntpd	nntpd
comsat	dgram	udp	wait	root	/usr/libexec/comsat	comsat
ntalk	dgram	udp	wait	root	/usr/libexec/ntalkd	ntalkd

  這個檔案中的每一行對應一個服務程序。為了增強系統安全,建議除了必要的服務,如telnetd、ftpd之 外,其他比如rshd、rlogind等r命令服務程序,fingerd等守護進程都應該加以注釋。telnet和ftp 也應該與S/key等認証方式相結合,來保証密碼的安全性。除非需要,不要提供匿名ftp服務。

  當使用rlogin,rsh等r命令的時候,/etc/hosts.equiv檔案和用戶個人目錄下的.rhosts 檔案中的設置將對系統安全有嚴重的影響。

  如果要求更安全的系統,甚至可以屏蔽inetd,不使用inetd來提供任何服務,通過其他安全途徑來完成遠 程訪問FreeBSD。要屏蔽inetd,需要在rc.conf中改變inetd_enable變量的值為NO。即使 使用inetd的時候,最好讓inetd記錄相關日誌,這需要使用參數-l啟動inetd,在rc.conf中可以設 置inetd_flags為”-l”。

  當需要啟動某個守護進程的時候,inetd.conf中的第五列參數對安全性有重要影響,這個參數設置啟動這 個進程的用戶標識,應該盡量不要使用root用戶,以減少具備root身份的進程。

  為了避免服務程序出現問題,還要經常更新軟體的版本,或應用補丁程序,以堵上可能出現的漏洞,因此有些服務程 序的老版本存在已經發現的安全問題,如果不及時彌補,入侵者就能利用這些漏洞達到入侵系統的目的。雖然每個FreeBSD 版本使用的都是最新版本的服務軟體,但伺服器軟體是不斷升級的,因此就需要及時升級伺服器軟體。

  在inetd啟動的服務中,telnetd和ftpd是最重要的兩個,它們提供最基本的網路服務。telnetd 本身的安全問題較少,與它相關的安全問題有訪問認証問題,可以通過S/key,login.access等方式加 以保護,而ftpd則的安全問題就更為敏感一些。

  如果需要啟動ftp服務,雖然在inetd.conf中啟動ftpd已經使用了-l參數,使ftpd將日誌記 錄發送給syslogd,但是還需要配置syslogd才能接收ftpd發送的記錄。如果/etc/syslog.conf 檔案中沒有下面的設置行用於記錄ftp的日誌,請修改syslog.conf加入。

ftp.*           /var/log/ftpd

  然後還需要執行下列命令,使得syslogd重新啟動,使其能開始記錄下ftpd發送的記錄信息。

# touch /var/log/ftpd
# killall -HUP syslogd

  ftp對訪問進行了種種限制,這些限制對於網路安全都是非常重要的,當用戶的shell不在/etc/shells 中的時候,ftp拒絕提供服務,當用戶的用戶名位於/etc/ftpusers檔案中時,或者是/etc/ftpusers 中記錄的組的成員,ftp同樣也拒絕提供服務,這樣就對使用ftp的用戶進行了限制,尤其對於安全敏感的 用戶。如果/var/run/nologin檔案存在時,ftp將拒絕一切用戶訪問。

  ftp認証是通過標準認証過程進行的,因此也可以使用S/key等安全認証的方式。同樣,/etc/ftphosts 可以設置對來自不同位置的主機訪問ftp服務的限制。

  很多情況下需要FreeBSD伺服器提供匿名ftp服務功能,如果此時普通用戶能通過更安全的方法訪問系統, 就應該屏蔽普通用戶使用ftp服務的權力,而只允許匿名ftp,可以使用-A選項啟動ftp伺服器,此時ftp將拒絕 正常用戶登錄,避免ftp伺服器出現安全問題的可能性及減少安全問題的影響。當使用-S選項時,ftp將所有匿名訪問 的傳輸日誌也記錄在/var/log/ftpd檔案中。這兩個選項對於提供匿名ftp服務非常有用。對於提供匿名ftp 的伺服器,還可以不再使用FreeBSD提供的ftpd伺服器,而使用wuftpd或ncftpd等其他種類的ftp 伺服器,同樣也需要針對這些伺服器設置其安全性。

  • 改變程序的根檔案系統

  當不得不提供一些服務的時候,為了增加安全性,可以考慮提供chroot的服務。chroot意味著改變運行 程序的根檔案系統,當一個程序運行在chroot的環境下時,它所了解的檔案系統只是chroot設置給它的某級目錄 開始,它就不能訪問這個目錄之外檔案系統中的內容,使得即使這個程序出現安全問題,也不會影響檔案系統中的其他重要數 據的安全性。顯然不是每種服務都適合這種形式,有的服務提供訪問的檔案資源不固定在某個目錄下,就不能使用這個形式。

  由於設置一個服務程序使用chroot的時候,它就以為給它指定的目錄就是它的根目錄,因此它無論訪問哪個文 件,都將在相對的目錄中查找,包括它要訪問的重要系統檔案。這樣就必須為這個chroot程序建立一個小的,但完全滿 足其要求的系統目錄結構,這個目錄將和系統目錄結構類似,也具有/etc/、/usr/、/var/、/dev/、/tmp/、/usr/lib/ 等等,並具備應用程序要訪問的相應檔案。

  如果程序是動態連接的,就需要/usr/lib目錄中存在動態連接庫,應用程序還可能會訪問/etc目錄下的 配置檔案,/dev目錄下的設備檔案,以及其他可能的檔案。必須在應用程序的新的根目錄下設置所有必須的目錄結構和復 制需要訪問的檔案。當然檔案內容可以是系統原來檔案的一個子集,而非原有的整個檔案,以盡可能的保障安全。例如服務程 序要訪問的passwd檔案只是系統passwd檔案的一部分,等等。

  當chroot的程序需要訪問某個用戶的密碼數據時,就需要將/etc/passwd檔案中有關這個用戶的內 容復制到用戶chroot目錄下etc子目錄下,然而密碼檔案並不止passwd一個檔案,將包括master.passwd,pwd.db 及spwd.db。由於pwd.db和spwd.db使用了數據庫形式,就使得復制部分用戶數 據變得比較困難。

  改變根檔案系統的服務程序有兩種類型,一種為本身不具備改變根檔案系統的能力,但由於不訪問過多的檔案,能使 用系統的chroot命令來啟動程序,使其運行在某個目錄下。另一種類型為程序本身就支持這個能力,這樣就不需要使用 手工使用chroot命令,系統在特定條件下或使用一定參數啟動時就自動進行chroot操作。然而這些類型進行目錄 設置時需要進行的操作是相同的。而要設置網路服務所使用的檔案環境,就要對該服務程序有詳細的了解,這才是最為困難的 問題。

  這裡以配置改變根檔案系統的namd為例,簡介設置改變根檔案系統的網路服務的步驟,這個設置步驟的原始文檔 為http://www.psionic.com/papers/dns.html(這個適用於OpenBSD和Fr eeBSD,沒有使用Ports Collection,但給了較詳細的解釋),和http://www.antisocial.net/~modred/papers/named.html (使用了FreeBSD的Ports Collection,給出了詳細的步驟)。以下只著重介紹操作過程,並沒有詳細給出操作步驟,需要 設置chroot named的使用者可以參閱這些相關網頁的內容。

  

  • 編譯靜態連接的named和namd-xfer,這需要增加編譯連接標志-static,重新編譯bind8 軟體。這個過程也可以使用Ports Collecion來完成,然而要注意的是使用Ports Collection 編譯的named和直接編譯的named對目錄結構的處理有所不同,這將影響後面建立目錄結構的處理過程。 使用靜態連接的執行程序的好處是不必考慮為chroot環境復制對應的動態連接庫,簡化了chroot檔案系統設置。
  •   

  • 建立chroot目錄結構,首先在根目錄下建立/chroot/named目錄,作 為這個服務的根目錄,然後在這個目錄中建立dev,etc,etc/namedb,usr,usr/libexec, var, var/run等目錄,注意這些目錄結構是與應用軟體中的設置相關的,如果使用Ports Collection 定制的named和named-xfer,它使用目錄結構是與Bind8的預設設置不同的,需要建立/usr/local/libexec 而非/usr/libexec目錄。
  •   

  • 然後向新的檔案系統中復制相應的檔案、建立相關的設備。如果是動態連接的程序,還需 要考慮復制/usr/lib下的動態連接庫和相關的ld程序。可以通過ldd命令查詢程序需要的動態連接庫。然而增加 檔案就降低了系統安全性,因此一般應該使用靜態連接的程序,新的環境中應具備盡可能少的檔案。
  •   

  • 設置環境,包括增加程序執行的用戶和組,目錄結構的屬主和權限設置等等。可以為named 添加用戶named和組named。
  •   

  • 手工執行chroot的named,執行命令為”/chroot/named -unamed -g named -t /chroot/named” ,-t參數指出named應該使用/chroot/named作根目錄執行chroot操作,一切正確之後,再更改啟動腳本。
  •   

  • 更改啟動腳本,屏蔽原有的named的執行權限,使得新named成為系統的網路服 務程序,並設置正確的啟動參數。
    • 用戶相關的安全問題

      系統管理員有時也不希望用戶占用太多的系統資源,在有些Unix系統中入侵者能通過普通帳戶,啟動大量的進程 或產生大量的檔案,從而使系統死掉或不能提供正常操作,而FreeBSD下則不必有此擔憂,因為可以通過login.conf 和用戶的密碼數據來設置用戶類別,限制用戶對系統資源的占用,同樣占用的硬碟資源可以通過quota來限制。

      at和cron機制能幫助用戶自動啟動應用程序和服務進程,如果必要,可以屏蔽用戶使用at和cron的權限 。也要注意檢查root用戶的at和cron設置,這裡也是入侵者可能用於設置後門程序的一個位置。

      系統中,除了服務進程可能具備root身份之外,再就是具備SetUID身份的程序能進入root身份。由於 SetUID和SetGID與系統安全息息相關,因此系統中也應該具備盡量少的SetUID和SetGID程序。要不 定期使用find命令查找,或者檢查/var/log下的日誌檔案,了解系統中這些程序檔案的更改情況。

      實際上很多SetUID程序不會被使用的,例如很少有人使用uucp,如果使用的是局域網也很少使用ppp和 pppd,因此對於這些不常用到的SetUID程序,應該取消其SetUID位,甚至取消執行屬性,以避免用戶來執行它。

      為了避免不必要的SetUID程序,一個辦法是可以在安裝一個檔案系統時就設定不承認這個檔案系統中的SetUID 程序。安裝檔案系統時可以使用nosuid選項,就能讓檔案屬性中的SetUID和SetGID位失效。因此為 了利用這個優點,可以創建使用使用nosuid位的/home檔案系統,讓所有的用戶使用,而其他可以存在SetUID 程序的檔案系統,如/usr,則不允許用戶寫入。同樣也要創建一個/var/tmp檔案系統,將系統的/tmp目錄 指向這個目錄,/var/tmp也應該是nosuid的,以避免用戶在/tmp目錄中保存SetUID程序。其他的文 件系統,如使用NFS裝載的檔案系統,也要使用nosuid安裝選項。

      劃分多個磁碟分區、安裝到不同目錄上也能防止入侵者企圖填滿磁碟空間的阻塞攻擊。同樣,對於用戶使用的磁碟文 件系統,應該使用qutoa來限制用戶個人占用的磁碟空間。

      這個nosuid安全選項應該加入到/etc/fstab檔案中,一使得每次都能生效。需要注意的是nosuid 安裝選項不能影響一些解釋性語言程序的這個屬性,如perl程序,當解釋性語言程序具備SetUID屬性,語言解 釋器為其設置身份,由於真正的setuid()調用是由語言解釋器執行的,因此如果語言解釋器具備root權限(具備 SetUID屬性),那麼就能使解釋器將具備SetUID位的程序設置入root權限。這不是系統的問題,而是語言解 釋器的問題,屏蔽語言解釋器本身的SetUID屬性可以避免這個問題。

      當系統作為NFS伺服器,設置共享出去的NFS檔案系統時,應該使用maproot或mapall參數,以便 隔離危險,使得即使在遠程系統被侵入的情況下,防止從這個允許安裝檔案系統的客戶上對本機的入侵。還可以考慮使用安全 的NFS協議,使用DES算法進行伺服器和客戶機的認証。如果系統不使用NFS及其他RPC服務時,最好屏蔽相關的選 項,如portmap_enable選項。

    • 安全日誌記錄

      Unix系統使用Syslog記錄應用軟體發送的日誌記錄,日誌記錄對於安全管理非常重要,因為管理員可以從 這些日誌中發現系統遭受攻擊的痕跡及証據。然而syslogd本身也是一個服務程序,能接收網路上的消息,因此其本身 也存在安全問題。

      這樣,syslog就存在兩個矛盾的問題,為了安全起見syslogd不應該接收網路上的其他電腦發送的日 志記錄。由於接收消息是通過UDP傳送並且沒有加密保護,因此syslog消息可能是偽造的,即便攻擊者不使用偽造信 息進行欺騙,僅僅使用服務阻塞的方法,就能導致正常的日誌記錄系統不能正常使用,此後攻擊者就能放心進行入侵操作而無 需擔心留下蹤跡。那麼即使syslogd沒有因為這種阻塞攻擊而崩潰,大量無意義的syslog記錄,也使得其他有用 的日誌記錄被迅速淹沒或清除(為了防止日誌檔案占用過多的磁碟空間,系統中預設情況下會自動進行日誌的清理工作)。

      為了使得syslogd不理會其他電腦的記錄,可以使用-s參數重新啟動syslogd。在rc.conf 中更改syslogd_flags的值為"-s"。

      FreeBSD系統中用於管理syslog日誌檔案的程序為newsyslog,它由crontab來啟動, 它檢查由newsyslog.conf中指定的日誌檔案,當這些檔案達到一定大小時,就截斷原檔案,重新啟動syslogd ,並壓縮保存原有記錄。為了避免占用太多的磁碟空間,newsyslog保存的日誌備份檔案有數量的限制,因此 就使得阻塞攻擊清除日誌的攻擊方式成為了可能。可以增加newsyslog保存的日誌備份檔案的數量,和進行備份時文 件的大小,增大系統日誌檔案的容量。

      然而,當一台電腦僅僅使用自己硬碟來記錄日誌的話,那麼一旦入侵者成功入侵這台電腦,他就能按照syslogd 的配置檔案syslog.conf的設置,清除相關的日誌記錄,以便為以後繼續潛伏在系統中做打算。甚至可以直 接刪除/var/log目錄下檔案以及其他syslog.conf中指明的檔案,消滅入侵蹤跡及証據。這樣,將syslog 日誌記錄保留在其他電腦系統中也是一個有效增強安全審計的重要因素。

      因此,可以設定一台用於記錄日誌的電腦,其syslogd屏蔽外部電腦的日誌請求,只記錄本地可信任的計 算機系統的日誌。這樣,就需要在使用"-s"參數屏蔽任意電腦請求的同時,使用"-a"加上信任的電腦主機名,或 者子網號,域名等,這樣就只會記錄這些電腦的日誌記錄。為了安全起見,這台電腦最好是專用於這一項服務,不執行任 何服務程序,以避免遭受入侵。然而由於syslogd對系統要求不高,因此這台電腦可以不必使用很高的硬體配置,除 了需要足夠的硬碟空間以容納大量日誌記錄。

      此外,還可以通過將特別重要的syslog的記錄直接發送到行式印表機的方式,避免入侵者清除日誌記錄。

      由於日誌記錄會迅速增加,特別是在遭受攻擊的時候更為顯著,因此需要使用一些日誌分析工具來幫助分析這些日誌 檔案,以快速定位發生的安全問題,否則面臨龐大的日誌檔案,很難找到有用的日誌記錄。logcheck或其他具備相似 功能的程序就用來完成這個任務。http://www.psionic.com/abacus/abacus_logcheck.html為logcheck的主頁。

    • 其他服務程序問題

      有些軟體本身很可能存在安全問題,應該盡量使用該軟體的最新穩定版本並及時進行打補丁,或者使用具備同樣功能 ,但更安全的軟體來代替這種軟體,例如使用qmail或postfix來代替sendmail。

      有時候軟體的新版本由於增加了新功能,會變得更不穩定或具備其他的安全漏洞,對於這種情況就不能盲目升級軟體。

      X Window也對網路安全有一定影響,特別是X伺服器的認証問題,不要為了方便起見而直接使用xhost+ 命令,這樣就會其他使用者能窺視用戶正在進行的操作。除了上面提到的措施之外,還可以將FreeBSD系統放置到防 火牆之內,或者直接利用FreeBSD系統的包過濾能力,屏蔽一些不友好節點的訪問,或者屏蔽所有的外部連接請求,而 不影響本機對外部的訪問。將FreeBSD設置為防火牆是一個重要的安全措施,因為這不但能對本機提供保護,也能對網 絡內其他客戶電腦提供保護。毫無疑問,FreeBSD系統的包過濾能力非常優秀,結合FreeBSD具備的網路地址 翻譯的能力,就使得它能構建僅次於硬體防火牆的防火牆系統。本章的後續部分中將詳細討論將FreeBSD設置為防火牆 系統的各種方法。

    • 核心安全級別

      FreeBSD核心有一個安全級別(securelevel)的概念,這是指系統核心運行使用的安全等級,不 同的等級具備不同的保護和檢查機制。因為這是核心的檢查機制,因此相當嚴格,沒有辦法能繞過這個機制提供的保護,因此 就對保護FreeBSD的安全性十分有用。

      核心的安全級別按照提供安全保護的程度分為-1、0、1、2共分為四個級別,安全級別能提供的保護有:

      系統檔案:系統檔案可以設置保護標志 “ 不可更改 “ 和 “ 只能附加 “ ,具有這些保護標志的檔案在 系統的檔案屬性之外,還受這些保護標志的保護。安全級別可以規定這些標志能否取消。

      磁碟設備檔案:磁碟設備檔案具備兩種訪問方式,隨機訪問的方式對應的塊設備檔案和順序訪問方式對應的字符設備 檔案,其中字符設備檔案可以直接讀取硬體設備,因此對於安全至關重要。核心安全級別可以決定是否允許以直接讀取硬體的 方式操作硬碟設備檔案。

      直接內存訪問:/dev/mem和/dev/kmem是系統內存的映射檔案,訪問它們就能直接訪問系統內存, 一些需要獲取系統信息和需要進程間共享內存機制的程序需要訪問這兩個設備檔案以直接訪問內存,然而訪問內存空間顯然也 影響系統的安全運行。核心安全級別可以決定是否允許訪問系統內存。

      安全級別-1為一種永久性的不安全級別,系統核心不提供任何額外的保護。系統預設就處於這個級別,此時系統文 件的保護標志能被root用戶取消,所有的設備,包括磁碟設備和內存映射設備,均能按照其屬性來訪問。

      安全級別0為不安全的級別,它和等級-1一樣沒有對系統提供額外的安全保護,但它影響到核心進程init的行 為。當核心處於級別-1時,核心init程序不會自動更改運行級別,因此一直到進入能夠登錄的狀態,系統安全級別仍然 為-1。這是系統的預設行為,沒有打開安全級別保護機制。但如果安全級別不為-1,init在進入單用戶狀態時將改變 為0級別,在進入多用戶模式時改變為安全級別1。因此安全級別0為設置了安全級別保護之後,單用戶狀態下的安全級別。

      安全級別1為安全的級別,提供了對系統的保護能力。此時系統檔案的那兩個保護標志不能被取消,已安裝檔案系統 對應的磁碟設備,以及/dev/mem,/dev/kmem不可以用寫入模式打開。

      安全級別2與級別1類似,只是進一步增加了對磁碟設備低級操作的限制,不管該磁碟設備是否安裝,都不允許直接 以寫入方式訪問,這樣就無法進行fdisk、disklabel以及newfs等操作。

      可以使用sysctl來查看目前系統的安全級別,但如果沒有經過特別設置,FreeBSD的預設安全級別應該 為-1:

    # sysctl kern.securelevel
    kern.securelevel: -1

      安全級別中最重要的一點是,除了核心的init進程之外,即使是root用戶,也只能不斷提高安全級別,沒有 辦法將安全級別降低。這樣就基本上保証遠程入侵者在沒有重新啟動電腦的情況下,無法降低系統運行級別。如果root 想提高系統運行的安全級別,也需要使用sysctl命令。

    # sysctl -w kern.securelevel=0
    kern.securelevel: -1 -> 0

      安全級別的意義就在於對檔案和設備的保護,如果要對檔案提供保護,就需要對檔案設置保護標志schg。 設置這個標志需要使用chflags命令,系統檔案如/kernel,系統安全的時候就具備這個保護標志。即使在非安全級 別下要更改這些檔案的時候,也要首先取消保護標志才能進行正常操作。

    # mv /kernel /kernel.bak
    mv: rename /kernel to /kernel.bak: Operation not permitted 
    # chflags noschg /kernel
    # mv /kernel /kernel.bak
    # mv /kernel.bak /kernel
    # chflags schg /kernel

      上面操作先取消了kernel檔案的不可更改標志schg,顯然這是在非安全級別下的操作。當安全級別處於 1或2時,就不能使用chflags改變檔案的保護標志了。

    # chflags noschg /kernel

    chflags: /kernel: Operation not permitted

      可以使用帶-o參數的ls來查看檔案具備的標志。

    # ls -lo /kernel 

    -r-xr-xr-x 1 root wheel schg 1061679 Jun 30 01:27 /kernel

      因此可以將系統安全相關的很多程序都設置保護標志,這樣入侵者就不能輕易更改這些檔案了。建 議將/bin,/sbin下的檔案都設置這個標志。

    # chflags schg /bin
    # chflags schg /bin/* 
    # chflags schg /sbin 
    # chflags schg /sbin/*

      這裡首先將相關目錄本身設置保護標志,這樣入侵者就不能通過將目錄更改名字的方法創造一個新的/sbin或 /bin目錄。

      當檔案具備了保護標志,並且安全級別高於1時,保護標志就無法取消,這些檔案就不能更改,因此就帶來一些必要 的操作無法進行,例如重新生成核心的操作等。此時就必須再重新啟動系統進入單用戶狀態執行這些操作。

      通常情況下,如果FreeBSD系統只提供網路服務,那麼使用安全級別1或2毫無問題。然而如果要運行X Server ,由於X Server使用了共享內存機制,需要訪問/dev/mem和/dev/kmem,這樣就會帶來 問題。這時的一種解決辦法是在啟動X Server之後(例如使用Xdm),再升高安全級別,以避開這個問題,但此時 X Server已經打開了/dev/mem和/dev/kmem,安全級別的保護就不再是完美無缺的了。

      如果不使用X Server之類的程序,那麼就可以將設置安全級別的命令直接放入系統的啟動rc檔案中,以便 自動提高安全級別。這需要在rc.conf檔案中設置兩個變量:kern_securelevel_enable和kern_securelevel。

    kern_securelevel_enable=”YES”
    kern_securelevel=0

      上面將安全級別設置為0,那麼在啟動之後將自動更改為1,這是一種標準的做法。