新浪網

  新浪首頁 > 科技時代 > FreeBSD使用大全連載 > FreeBSD連載(76):設置基本系統
 


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

http://www.sina.com.cn 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等網絡連接的登錄會話上執行。在兩次輸入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,這是一種標准的做法。

    未完,待續。。。  



     
      新浪首頁 > 科技時代 > FreeBSD使用大全連載 > FreeBSD連載(76):設置基本系統


    網站簡介 | 網站導航 | 廣告服務 | 中文閱讀 | 聯系方式 | 招聘信息 | 幫助信息

    Copyright(C) 1999 SINA.com, Stone Rich Sight. All Rights Reserved

    版權所有  四通利方 新浪網