twbsd.org
 
  Select Language: Home  SmbFTPD Forum 

書籍資料

ch00 序.htm

ch01 FreeBSD 簡介.htm

ch02 安裝 FreeBSD.htm

ch03 UNIX 系統入門.htm

ch04 使用者管理.htm

ch05 網路設定.htm

ch06 檔案系統管理.htm

ch07 系統安全.htm

ch08 編譯核心.htm

ch09 系統調校.htm

ch10 軟體安裝.htm

ch11 X Window 的使用.htm

ch12 NAT 及防火牆.htm

ch13 網頁伺服器.htm

ch14 網頁伺服器進階應用.htm

ch15 FTP 伺服器.htm

ch16 郵件伺服器.htm

ch17 郵件伺服器進階應用.htm

ch18 DHCP伺服器.htm

ch19 資料庫系統.htm

ch20 Samba 網路芳鄰.htm

ch21 NFS.htm

ch22 DNS 伺服器.htm

ch23 指令應用.htm

ch24 Shell Script.htm

cha1 附錄A etc目錄下的檔案介紹.htm

cha2 附錄B 製作 FreeBSD 安裝光碟.htm

cha3 附錄C 版權宣告.htm

 


View printable page

第七章 系統安全

系統安全是每個管理者都必須注重的課題。 有人說:「沒有不安全的系統,只有懶惰的管理者。」每個系統都有可能會出現漏洞,而有安全性的漏洞產生時,發行的單位都會立即發佈通告及修補的方式,而系統管理者的職責便是要隨時注意是否需要更新漏洞、隨時注意系統是否有異常的訊息。

本章將針對 FreeBSD 系統安全做詳細的說明,讀完本章後,您將可以了解下列主題:

  • 基本系統管理應注重的安全項目。
  • 如果安全的管理帳號。
  • 網路安全管理。
  • 如何進行漏洞修補。

7.1 概論

FreeBSD 相對而言雖然是比較安全的作業系統,但是有時候問題不是在作業系統本身,而是所安裝的軟體。在 FreeBSD 中常見的情形是安裝非 FreeBSD 內定的軟體,但該軟體被收錄在 ports 中,FreeBSD 也會提出警告。因此,我們必須到 FreeBSD 的網站上查看是否有系統安全的消息,網址是 http://www.freebsd.org/security/index.html 。當發現問題時,可以依照發佈的文件中所提供的修正方式來進行修補。

基本上只要電腦電源打開,系統就沒有安全的一天,更何況要連上網路提供服務。系統安全的範圍很廣,從硬體設備的保全、人員管理、網路規劃、到系統本身的管理,我們並不打算說明如何制定一個安全性政策 ,也無法在這裡說明所有系統安全的相關議題,我們所提及的只是筆者在 FreeBSD 使用上的建議。如果想要更多 FreeBSD Security 的資訊,可以參考 FreeBSD Handbook,我們在安裝 FreeBSD 時己經將 doc 安裝在 /usr/share/doc 中,你可以使用 lynx 來觀看 FreeBSD 的文件。例如:

# lynx /usr/share/doc/en_US.ISO8859-1/books/handbook/security.html
小提示

lynx 並非 FreeBSD 內附的軟體,您必須先到 /usr/ports/www/lynx 中進行安裝後才可以使用喔。

系統安全並不侷限在如何防止他人入侵,對於防止系統內部問題的產生一樣重要。主要的概念就是要讓我們的系統能正常的提供服務,並且對於我們不想讓他人取得的資訊加以保護。然而,為了系統安全往往必須限制某些功能的使用,而犧牲了便利性。身為系統管理者往往因為對於系統限制太多而受到來自使用者的抱怨,在取捨上本來就不是件容易的事。正因為如此,一個盡責的管理者在行事上必須具有高度的抗壓性及對安全性的偏執。

由於系統安全十分重要,我們在開始說明各種軟體安裝、伺服器架設之前,先說明系統安全應注意的事項,希望讀者在讀完本章之後,能對系統安全更有概念。

7.2 系統管理

7.2.1 執行程式的路徑

有沒有注意到當我們要執行所在目錄中的某一個程式時,例如,在執行所在目錄中的 myscript.sh,我們必須要打 ./myscript.sh。預設的 PATH 中,並沒有將所在目錄 "." 加入路徑中。如果把 "." 加入 PATH 的設定中,可能會產生安全性的問題。例如,如果使用者在 /tmp 中加入一個名為 ls 的 shell script,內容為 rm -rf /usr,而我們又將 "." 加入路徑中,當以 root 在 /tmp 中執行 ls 指令時,後果可想而知。因此,我們在執行指令時,最好能指定路徑名稱,如 /bin/ls,並檢查在 shell 設定中是否有將 "." 加入路徑中:

# echo $PATH
/sbin:/bin:/usr/sbin:/usr/bin:/usr/games:/usr/local/sbin

為了避免 /bin/sbin 等重要執行檔遭到修改,我們可以為這些檔案設定禁止修改的 schg flag:

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

當然,設定了 schg 之後,我們要將 Kernel Security Level 調高到 1 以上,這樣連 root 都不可以移除 flags。不過設了 schg 之後,我們可能不能執行一些指令,如 make world 等。

7.2.2 降低安裝軟體的風險

我們可以在網路上找到許多免費的軟體,這些軟體固然可以讓我們在系統的使用上更加便利,但卻難保它們不會對系統安全造成任何危害。有的軟體可能存在某些漏洞,即使在我們安裝前尚無任何安全性的問題,日後還是有可能會被人發現軟體的缺陷。因此,我們應該盡可能不要安裝一些雜七雜八的軟體,而安裝之後,一發現有安全性問題也要隨時更新。 基本上,要下載軟體時,最好到該軟體的官方網站下載,以確保安全。

並非所有軟體都是正確無誤的,請不要直接在重要的伺服器上安裝一套新的軟體,最好先在較不重要的電腦上測試,沒問題後再安裝。另外,在安裝軟體時,應注意軟體取得來源是否可靠。如果軟體提供 MD5 或 PGP 的檢查,最好下載後先檢查,再解壓縮。而安裝軟體時,最好取得軟體的原始碼來編譯 (或使用 port 安裝),我們可以瀏覽程式碼,以了解其架構。閱讀 Makefile 的內容,了解軟體將安裝的確認位置,先確保程式不會在不該出現的地方產生。

7.2.3 kernel Security Level

FreeBSD 中有所謂的 Security Level,它掌控了系統核心的行為運作。只有超級使用者可以使用指令提高 Secruity Level,但不能降低它。如果要降低它必須在 rc.conf 中設定,並重開機。以下為各 Secruity Level 的意義:

  • -1:永遠不安全模式。這是預設值,如果設為 -1,它將永遠以 level 0 的模式執行。
  • 0:不安全模式。使用者或 root 可以使用 chflags 來移除「不可更動 ( immutable)」及 「只能附加 (append-only)」的 flags。所有的裝置只能依其權限來存取。
  • 1:安全模式。不可以移除「不可更動 ( immutable)」及 「只能附加 (append-only)」的 flags。不可以手動載入或移除 LKM,使用, /dev/mem, and /dev/kmem 只能為唯讀,且不能 newfs 已掛上的檔案系統。
  • 2:高度安全模式。除了和安全模式同樣的限制外,不管硬碟是否掛上,都不可以 newfs。另外,kernel time 的改變限制在一秒內,如果超過,會記錄 "Time adjustment clamped to +1 second"。
  • 3:網路安全模式。除了和安全模式同樣的限制外,還有 IP 封包過濾的規則 (參考 ipfw 及 ipfirewall),而且不可以調整 dummynet 的設定。

我們可以使用 sysctl 來顯示或設定 Security Level:

# sysctl kern.securelevel

如果要將 Security Level 設為 1:

# sysctl -w kern.securelevel=1

當我們將 Security Level 設為 1 以上時,我們會發現沒有辦法安裝新的 kernel (因為不能移除 schg flag),也沒有辦法使用 big5con 、X Window 等軟體。如果我們的 FreeBSD 只作為伺服器,而不使用 big5con 或 X Window 的話,可以將 Security Level 的值調高一點。

如果要在開機時設定 Security Level,可以在 /etc/rc.conf 中以下面二行來設定:

kern_securelevel_enable="YES" # 是否啟動 Security Level
kern_securelevel="1" # level 從 -1 到 3

7.2.4 檢視系統記錄

/var/log 中,記錄了許多系統的資訊,我們應該要時常檢視它們。這些檔案如下表:

檔案 用途
adduser 使用 adduser 的記錄。
cron 定時排程的記錄。
maillog 郵件記錄。
messages 系統訊息記錄。
security 安全性記錄,如防火牆。

除了系統的記錄外,如果有提供其他服務,會有更多的 log 資料。

如果我們有其他程式為留下 log 檔,最好在 /etc/newsyslog.conf 中設定定時備份壓縮,以免檔案過大。另外,這些備份的 log 檔在 newsyslog.conf 中設定權限 (mode) 時,最好設為 600,以避免其他使用者可以讀取。

FreeBSD 預設每天定時執行一些分析的工作,並將結果寄給 root,建議你最好每天閱讀它們。我們可以在 /etc/mail/aliases 的開頭中加入下面這一行:

root: me@my.domain.com

將 me@my.domain 改成你的 email,設定完後,請執行 newaliases 來讓設定生效。如此一來,所有寄給 root 的信件,都會自動轉給所設定的信箱。root 每天會收到 "daily run output" 及 "security check output" 這二封信,這是依照我們在 /etc/defaults/periodic.conf 中所設定的定時執行工作輸出的結果。在 daily 執行的任務中,預設並沒有設定定期清除 /tmp,原則上,在開機時系統會清理 /tmp。如果我們不常重開機,可以在 periodic.conf 中設定每天清理 /tmp

7.2.5 資料的保全

UNIX 系統的安全防護中,第一道防線是電腦實體的安全防護,防止不相干的人接觸電腦及周邊設施。如果很不幸的,外人可接近系統時,第二道防線是系統密碼保護,我們將在下一章說明帳號的防護。然而,如果密碼洩露或被破解,還有第三道防線,就是在 UNIX 系統中的使用者權限及檔案權限控制。如果某一個使用者帳號遭到入侵,我們能限制其活動範圍及資源的存取。而第四道防線就是將重要的資料加以編碼保護,即使資料被使用者竊取,至少還多一道防護措施。而最後一首防線就是資料備份了,我們平時應該有完善的備份計畫,一旦系統發生錯誤或是被摧毀,至少還可以復原。

我們先來談談資料編碼加密的方法,我們可以使用 crypt 這個指令來為我們的檔案加密。例如,有一個檔名為 myfile.txt 的檔案,我們使用的金鑰 (key)是 mykey 這個字串,加密後的檔案名為 myfile.cyp,可以使用下列指令:

# crypt mykey < myfile.txt > myfile.cyp

加密後,就可以將 myfile.txt 刪除。如果日後要解密,只要執行下列指令:

# crypt mykey < myfile.cyp > myfile.out

crypt 是一個歷史悠久的編碼軟體,實際上並非十分安全,不過我們可以多加密幾次,讓檔案加密後再加密,只要記得所使用的 key 就好了:

# crypt mykey1< myfile.txt | crypt mykey2 | crypt mykey3 > myfile.cyp

如果要解密,只要再反過來即可:

# crypt mykey3 < myfile.cyp | crypt mykey2 | crypt mykey1 > myfile.out

除了 crypt 外,我們也可以使用其他比較好的編碼程式,例如 pgp。pgp 並非 FreeBSD 內附的軟體,但我們可以使用 ports 來安裝它:

# cd /usr/ports/security/pgp
# make install

安裝完 pgp 之後,我們必須先產生 key pair。請執行 pgpk -g

首先請在自己的家目錄中建立一個存放 pgp 金鑰的目錄。
$ mkdir ~/.pgp
$ pgp -kg
Pretty Good Privacy(tm) 2.6.3ia - Public-key encryption for the masses.
(c) 1990-96 Philip Zimmermann, Phil's Pretty Good Software. 1996-03-04
International version - not for use in the USA. Does not use RSAREF.
Current time: 2004/04/27 18:05 GMT

Pick your RSA key size:
1) 512 bits- Low commercial grade, fast but less secure
2) 768 bits- High commercial grade, medium speed, good security
3) 1024 bits- "Military" grade, slow, highest security
Choose 1, 2, or 3, or enter desired number of bits: 3 (輸入金鑰的長度)

Generating an RSA key with a 1024-bit modulus.

You need a user ID for your public key. The desired form for this
user ID is your name, followed by your E-mail address enclosed in
<angle brackets>, if you have an E-mail address.
For example: John Q. Smith <12345.6789@compuserve.com>
Enter a user ID for your public key: (輸入使用者名稱)
John Chung <john@mydomain.com>

You need a pass phrase to protect your RSA secret key.
Your pass phrase can be any sentence or phrase and may have many
words, spaces, punctuation, or any other printable characters.

Enter pass phrase: (輸入密碼)
Enter same pass phrase again: (再輸入一次密碼,以確認無誤)
Note that key generation is a lengthy process.

We need to generate 944 random bits. This is done by measuring the
time intervals between your keystrokes. Please enter some random text
on your keyboard until you hear the beep: 
(隨機在鍵盤上輸入一些字,直到數字為零)
0 * -Enough, thank you.
..........................**** ..****
Pass phrase is good. Just a moment....
Key signature certificate added.
Key generation completed.

產生了 pgp key 之後,我們就可以使用 pgp 來編碼了。

指令 用途
pgp -kx user -o outfile 取出 user 的公開金鑰至outfile 中
pgp -ka keyfile 將公開鑰匙 keyfile 加入鑰匙環中
pgp -kvc user 印出 user 的公開金鑰
pgp -e textfile -o outfile user 加密 txtfile 至 outfile
pgp -s textfile -o outfile user 加簽 txtfile 至 outfile
pgp -d cypfile -o outfile 解密 cypfile 至 outfile

例如,我們要將 myfile.txt 加密,輸出檔為 myfile.cyp

# pgp -e myfile.txt -o myfile.cyp john

這裡的使用者是 john,他的全名是 John Chung <john@mydomain.com>,我們只要輸入名字的部份關鍵字即可。而解密可以使用:

# pgp -d myfile.cyp -o myfile.out

上面的指令會問你通行碼,輸入後即完成解密。目前 PGP 的主要應用是在於網路傳輸文件的加密,我們可以使用它來為 E-mail 加密,PGP 的用法很多,請自行 man pgp

不過,即使加密也無法對抗資料的損毀,對於放在電腦中的重要資料,必須維持完整的備份。就算系統都沒有問題,我們永遠不知道哪天會因為我們自己失手刪除重要資料,或是資料遭到破壞。需要備份的不只是程式所產生的資料,自己開發的程式也應該備份。否則即便有了資料可以復原,而沒有程式可以執行。

舉例而言,一個 BBS 站應該要備份的除了使用者資料、精華區及看版文章外,BBS 本身運作的程式也要備份,畢竟那是我們精心撰寫或修改的結晶。備份的資料不應該和運作的系統放在一起,不僅不應放在同一台電腦中,最好不要放在同一個房間、同一棟大樓、同一個城市,甚至同一個國家。

7.3 帳號管理

7.3.1 慎選合宜的密碼

對於系統安全的維護,密碼可以說是最基礎的防線,因此慎選密碼絕對是必要的。不管是超級使用者或是一般的使用者,在設定密碼時,都應該注意一些原則:

  • 不要使用和帳號相同的密碼。
  • 不要使用字典中找得到的單字,也不要把單字反轉後當成密碼。
  • 最好大小寫混用,英文及數字混合,並加入特殊符號。
  • 不要使用自己、老婆、小孩的生日、身份証字號等。
  • 不要使用鍵盤上連續的字母,如 asdf。
  • 不要把密碼寫下來。

一個好的密碼應該是容易記憶,不必另外以紙筆記下的。例如,Gohiy!m (Get out here if you aren't me),或 ru4@xj4# (以注音輸入法輸入「記錄」)。總之就是要讓別人意想不到,這裡提到的密碼也不要使用。

我們可以使用一些工具來找出系統中密碼太簡單的使用者,例如位於 /usr/ports/security/crack 這套軟體。

7.3.2 控制 root 的使用

在 FreeBSD 中,如果要使用指令 su 來取得 root 的權限,必須將該使用者加入 wheel 群組中。但是 su 並未對使用者執行過的指令留下記錄,如果系統中有許多使用者,我們要針對不同使用者給予不同的權限,也不是 su 所能做到的,因此我們可以使用 sudo。關於 sudo 的使用,請參考第「使用者管理」一章中的「控制 root 的使用」。

root 帳號不應該可以使用 telnet、ssh、或 ftp 的方式登入,在 /etc/ftpuser 中應該有 root 的帳號來限制 root 使用 ftp 登入。而在 /etc/ssh/sshd_config 中,應該有 PermitRootLogin no 的字樣來限制 root 使用 ssh 登入。我們注意的就是避免 root 能從網路上直接登入,以減少安全性的問題。在 /etc/ttys 中,預設了 root 只能有某些 tty 登入系統,這種允許 root 直接登入的 tty 設定中有 secure 的字樣。例如,ttyv0 指的是 console,該行設定最後有 secure,表示 root 可以從該 tty 登入。而 ttyp* 等是遠端登入的 tty,所以禁止 root 直接登入。

7.3.3 限制系統資源的使用

如果使用者登入系統後,執行大量消耗 CPU、記憶體或磁碟的程式,我們的系統將無法正常提供服務,因此,限制使用者對於系統資源的存取是必要的。針對系統所提供的服務,來限制系統的資源,並避免提供不必要的服務。例如,以一台單純的網頁伺服器、DNS 伺服器而言,並不需要開放使用者遠端登入的服務。遠端登入提供使用者對系統有直接的操作,而往往也是漏洞開放的起點。一般使用者對於安全的要求不一定和系統管理者的期望相符,他可能會將密碼寫在自己辦公桌上、或是登入系統執行一些不必要的程式。如果迫不得已一定要為使用者在系統上開一個帳號,也應該視情況限制其使用遠端登入。如果只要為使用者開一個 FTP 帳號或是郵件帳號,只要設定使用者所用的 shell 為 /sbin/nologin 即可。例如,在 /etc/master.passwd 中,使用者 jack 的帳號資料如下:

jack:Bk5AI4MiRKDJ4:1000:1000::0:0:Tom Chang:/home/tom:/sbin/nologin

就算使用者不能登入,但能使用磁碟空間,所以還是要為使用者設定磁碟配額。雖說現在硬體價格便宜,但若每個使用者都有數百 MB 的郵件,集合起來也十分驚人。關於磁碟配額的設定,請參考「使用者管理」一章中的「磁碟配額」。在限制使用者郵件容量方面,最簡單的方式就是將使用者的郵件從 /var/mail 中搬移到使用者的目錄中,再對使用者目錄做磁碟配額的限制。例如,使用者 jack 的家目錄位於 /home/jack,我們可以:

# cd /var/mail
# mkdir /home/jack/mail
# mv /var/mail/jack /home/jack/mail/
# ln -s /home/jack/mail/jack

如此就可以將使用者原本的郵件放在其家目錄下,我們只要將該檔案再鏈結到 /var/mail 中,如此就可以不必更動郵件軟體的設定,而達到限制空間的效果了。

如果你堅持要讓使用者登入的話,除了磁碟配額外,應該要再為他們設定其他系統資源的使用限制,例名 CPU 的使用量、記憶體等。我們可以經由設定 /etc/login.conf 來做到。而 login.conf 的設定,請參考「使用者管理」一章中的說明。。

7.3.4 限制 crontab 及 at 的使用

使用者可以用 crontab 和 at 指令來安排自己定時執行的工作。一般的使用者並不需要擁有 crontab 或 at 的執行權,我們可以為這個指令設限,只允許必要的使用者執行。如果要限制使用 crontab,只需要在 /var/cron 目錄中,加入 allow 或是 deny 這個檔即可。例如,我們只允許少數幾個使用者執行 crontab,我們可以新增 /var/cron/allow 這個檔,內容為該使用者的名稱。相對的,如果我們要限制少數幾個使用者執行 crontab,只要編輯 /var/cron/deny 這個檔即可。而指令 at 的限制也是一樣,不同的只是允許執行 at 指令的名單是 /var/at/at.allow,而拒絕的名單是 /var/at/at.deny

7.4 網路管理

7.4.1 關閉不必要的服務

一台電腦可以提供的服務很多,我們要做的是在許可的範圍內,盡量減少所提供的服務。許多安全性的問題來自於非第三者 (Third Party) 所提供的軟體,如果沒有必要就停止這些服務吧。

我們先來看一下目前系統提供哪些服務:

# netstat -a|grep LISTEN
tcp4       0      0  *.http                 *.*                    LISTEN
tcp4       0      0  *.https                *.*                    LISTEN
tcp6       0      0  *.telnet               *.*                    LISTEN
tcp4       0      0  *.telnet               *.*                    LISTEN
tcp6       0      0  *.ftp                  *.*                    LISTEN
tcp4       0      0  *.ftp                  *.*                    LISTEN
tcp4       0      0  *.imaps                *.*                    LISTEN
tcp4       0      0  *.pop3s                *.*                    LISTEN
tcp4       0      0  *.imap                 *.*                    LISTEN
tcp4       0      0  *.pop3                 *.*                    LISTEN
tcp4       0      0  *.smtp                 *.*                    LISTEN
tcp4       0      0  *.ssh                  *.*                    LISTEN
tcp6       0      0  *.ssh                  *.*                    LISTEN

這裡所看到的就是目前系統中所提供的服務。我們可以檢視一下有沒有不必要的服務,並將它移除。最明顯的例子是 sendmail,如果我們的系統不提供郵件處理,就將它停掉吧。即使我們要提供郵件服務,也應該限制寄信者的身份或來源位址。一台沒有設限的郵件伺服器,最後的結果是惡名昭彰,再也沒有機器會願意轉送我們發送的信件。如果我們要停止 sendmail,只要在 /etc/rc.conf 中加入下面這一行:

sendmail_enable="NONE"

我們可以使用 sysctl 來設定當外部機器要使用我們沒有提供的服務時便記錄下來,例如有人嘗試掃我們的 port,或者我們沒有開放 telnet,卻有人嘗試從 port 23 連接,在 /var/log/messages 中便會留下記錄。這個設定只要執行下列指令:

# sysctl -w net.inet.tcp.log_in_vain=1
# sysctl -w net.inet.udp.log_in_vain=1

如果要在開機時就啟動這個設定,可以將上面二行指令加到 /etc/rc.local 或是在 /etc/sysctl.conf 中加入下面二行:

net.inet.tcp.log_in_vain=1
net.inet.udp.log_in_vain=1

另外,FreeBSD 自從 4.4-Release 起,預設將 telnet 及 ftp 的服務也停止了。原因除了 telnet 本身有漏洞外(己修補),就是這些以明碼方式在網路上傳送使者帳號及密碼的服務其實是系統安全的另一個潛在危險。我們可以檢視一下 /etc/inetd.conf,發現每一行前面都有註解符號 "#",也就是說目前根本沒有任何經由 inetd 啟動的服務,我們可以經由 /etc/rc.conf 加入下列這一行來停止 inetd 服務:

inetd_enable="NO"

如果我們必須使用遠端登入來管理系統,不要使用 telnet,請使用 ssh。ssh 對於在網路上流動的資料有加密保護,比起 telnet 安全多了。如果真的有必要使用 inetd 來啟動某些服務,例如 ftp,建議將使用情形記錄下來 。

FreeBSD 安裝後,預設會將所有登入成功及失敗的記錄都寫在 /var/log/xferlog 中。因為我們在 /etc/syslog.conf 有下列這一行:

ftp.info                                     /var/log/xferlog

如果您使用的是 FreeBSD 之 4.x 版,您可能要自行編輯 /etc/syslog.conf 並在該檔案的最後加入下面這二行:

!ftpd
*.*                                /var/log/xferlog

這個設定會讓所有登入成功及失敗的記錄都寫在 /var/log/xferlog 這個檔案中,我們必需先手動建立 xferlog 這個檔案:

# touch /var/log/xferlog

因為我們已經修改了 /etc/syslog.conf ,所以必須重新啟動 syslogd。syslogd 是 FreeBSD 專門記錄系統資訊的 daemon,您可以使用下列指令重跑 syslogd:

# kill -1 `cat /var/run/syslog.pid`

由於每次使用 ftp 的情形都會被記錄下來,為了避免 log 檔肥大,我們在 newsyslog.conf 中加入 ftpd.log 的備份移轉:

/var/log/xferlog       600  7  100  *  J

另外,對於 ftpd 還有一個小建議,為了避免使用者 ftp 登入後可以到系統所有資料夾,我們最好將使用者的活動範圍限制在自己的家目錄中,這就叫做 chroot。方法很簡單,只要建立一個檔案 /etc/ftpchroot,內容為使用 chroot 的使用者名稱即可 ,我們會在「FTP 伺服器」一章中做更詳細的說明。

其他的 inetd 服務,能不用就不要用,尤其是 telnet。如果要管理電腦,我們可以使用 ssh。

除此之外,為了防止一些 DoS (Deny of Service),建議最好把 ICMP 重導向 (redirect) 的封包丟棄,我們可以在 /etc/rc.conf 中加入以下的設定:

icmp_drop_redirect="YES"  # YES 表示丟棄 ICMP REDIRECT 封包
icmp_log_redirect="YES"    # YES 表示將丟棄的封包記錄下來

7.4.2 使用 ssh

ssh 是一個好用的軟體,FreeBSD 安裝預設啟動 sshd。我們可以檢查一下它是否己啟動:

# netstat -a | grep ssh

如果沒有,請在 /etc/rc.conf 中加入下面這一行:

sshd_enable="YES"

sshd 預設並未將使用者登入的資料記錄下來,不過我們可以修改 /etc/syslog.conf 來記錄,請找到 security 的項目,並將它修改成下面這樣:

security.*;auth.info                /var/log/security

如此一來,當使用者利用 ssh 登入時,便會記錄在 /var/log/security 中。

我們知道 ssh 類似一個加密的 telnet,使用 ssh 以取代 telnet 是一定要的。然而 ssh 還有一個比較少人知道的功能,就是提供加密的 ftp 連線,稱為 sftp。

當您啟動 ssh 時,預設就已經有提供 sftp 的功能。如果您要在 FreeBSD 中使用 sftp 連到另一台開於 ssh 的機器,可以使用下列指令:

# sftp alex@192.168.0.1

接下來的所有操作就好像一般的 ftp client 一樣,您可以任意上傳下載檔案,而且都是以加密傳輸喔。如果您要在 Windows 中使用 sftp,您可以下載 Filezilla (http://filezilla.sourceforge.net/)。

7.4.3 TCP Wrapper

對於 inetd 所提供的服務,我們可以使用 TCP Wrapper 來限制 TCP 協定連線來源。讓我們來檢視一下 /etc/hosts.allow 這個檔案:

ALL : ALL : allow

ftpd : localhost : allow
ftpd : .nice.guy.example.com : allow
ftpd : .evil.cracker.example.com : deny
ftpd : ALL : allow

語法:

daemon_list : client_list : option

其中 daemon_list 是我們在 /etc/services 中定義的服務名稱,client_list 是來源位址,option 則是我們要給的權限,簡單的設定如 allow(允許)、deny(拒絕)。ALL 可以代表所有服務或來源。這個檔案的設定是以先入為主 (first match wins) 的方式,也就是以先設定的項目為優先。

在檔案開頭的地方有一行是 ALL : ALL : allow,表示預設所有服務允許所有來源使用。如果我們要使用 TCP Wrapped,必須先將該行註解,再針對每一個服務來設定開放的權限。以 ftpd 為例,假設除了 bad.cracker.com 以外,其他人都可以使用 ftpd 服務,我們可以這樣設定:

ftpd : bad.cracker.com : deny
ftpd : ALL : allow

又如,假設我們的 telnet 只要讓 192.168.0.1 及 mydomain.com 網域下的電腦可以使用:

telnetd : 192.168.0.1 .mydomain.com : allow
telnetd : ALL : deny

TCP Wrapped 只針對 TCP 服務,如果我們要功能更強大的防火牆,可以使用 ipfw。

7.4.4 ipfw

ipfw 是 FreeBSD 內附的防火牆軟體,它直接針對 IP Layer 來做網路控制,因此可以說是最有效的方法。在使用 ipfw 之前,我們必須先重編核心。關於防火牆的設定,請參考「NAT 及防火牆」一章的說明。

7.5 漏洞修補

FreeBSD 總部會不定期公佈己知的安全漏洞,並提供修補方式,我們必須時常到 FreeBSD 的網站注意關於安全性的消息,該網站的位置是 http://www.freebsd.org/security/index.html

連到上述頁面後,我們可以看到在 FreeBSD Security Advisories 區段中,有下列項目:

Advisories are always signed using the FreeBSD Security Officer PGP key and are archived, along with their associated patches, at our FTP CERT repository. At the time of this writing, the following advisories are currently available (note that this list may be a few days out of date - for the very latest advisories please check the FTP site):

  • FreeBSD-SA-05:17.devfs.asc
  • FreeBSD-SA-05:16.zlib.asc
  • FreeBSD-SA-05:15.tcp.asc
  • FreeBSD-SA-05:14.bzip2.asc
  • FreeBSD-SA-05:13.ipfw.asc
  • FreeBSD-SA-05:12.bind9.asc
  • FreeBSD-SA-05:11.gzip.asc
  • FreeBSD-SA-05:10.tcpdump.asc
  • FreeBSD-SA-05:09.htt.asc

FreeBSD 5.4-RELEASE released.

  • FreeBSD-SA-05:08.kmem.asc
  • FreeBSD-SA-05:07.ldt.asc
  • FreeBSD-SA-05:06.iir.asc
  • FreeBSD-SA-05:05.cvs.asc
  • FreeBSD-SA-05:04.ifconf.asc

我們可以看到自從 FreeBSD 5.4 release 之後,FreeBSD 公佈了 9 個安全性修補,我們可以打開這些連結,並了解這些修補的用途。例如 FreeBSD-SA-05:17.devfs.asc,顧名思義是用來修補 FreeBSD devfs 裝置虛擬的檔案系統。

我們現在以 FreeBSD-SA-05:17.devfs.asc 來做修補的範例。首先看到這個公告一開頭的部份:

FreeBSD-SA-05:17.devfs                              Security Advisory
                                                    The FreeBSD Project

Topic:          devfs ruleset bypass

Category:       core
Module:         devfs
Announced:      2005-07-20
Credits:        Robert Watson
Affects:        All FreeBSD 5.x releases
Corrected:      2005-07-20 13:35:44 UTC (RELENG_5, 5.4-STABLE)
                2005-07-20 13:36:32 UTC (RELENG_5_4, 5.4-RELEASE-p5)
                2005-07-20 13:37:27 UTC (RELENG_5_3, 5.3-RELEASE-p19)
CVE Name:       CAN-2005-2218

For general information regarding FreeBSD Security Advisories,
including descriptions of the fields above, security branches, and the
following sections, please visit
<URL:http://www.freebsd.org/security/>.

這裡的資訊包含了主旨 (Topic)、分類 (Category)、影響的模組名稱 (Module)、公佈時間 (Announced)、發現者(Credits)、受到影響的版本(Affects)、已修正的版本(Corrected)、漏洞編號(CVE Name, Common Vulnerabilities and Exposures)。

如果我們的系統是受影響的版本之一,我們必須進行漏洞修補。在上述開頭資訊之後,會有一些說明,包含這個模組的背景(Background)、問題描述(Problem Description)、所產生的影響(Impact)。我們可以先讀一下這個部份,以了解這個漏實際上所帶來的影響。

接下來會有避免發生的方法(Workaround)、及解決之道(Solution)。Workaround 的意思是如果不進行修補,我們是否有方法可以避掉這個問題。例如當 CVS 伺服器有漏洞時,可能的 workaround 方式是停止 CVS 的運作,而 Solution 是告訴我們下載修補程式的方式及修補方式。以下我們就以這個範例來說明如何進行漏洞修補:

V.   Solution

Perform one of the following:

1) Upgrade your vulnerable system to 5-STABLE, or to the RELENG_5_4,
or RELENG_5_3 security branch dated after the correction date.

2) To patch your present system:

The following patches have been verified to apply to FreeBSD 5.3, and
5.4 systems.

a) Download the relevant patch from the location below, and verify the
detached PGP signature using your PGP utility.

# fetch ftp://ftp.FreeBSD.org/pub/FreeBSD/CERT/patches/SA-05:17/devfs.patch
# fetch ftp://ftp.FreeBSD.org/pub/FreeBSD/CERT/patches/SA-05:17/devfs.patch.asc

b) Apply the patch.

# cd /usr/src
# patch < /path/to/patch

c) Recompile your kernel as described in
<URL:http://www.freebsd.org/handbook/kernelconfig.html> and reboot the
system.


我們可以選擇下列二種方式其中之一來進行修補,第一種方式是將您的 FreeBSD 升級至 5-STABLE、RELENG_5_4、或 RELENG_5_3。第二種方式是我們最常用的方法,也就是下載修補的原始碼。通常我們必須依照所使用的 FreeBSD 系統來下載不同版本所使用的補丁。上述範例中,其修補檔分別供 FreeBSD 5.3 及 5.4 使用。

我們以 FreeBSD 5.4 為例,首先,我們必須下載更新檔,請使用下列指令下載:

# cd /usr/src
# fetch ftp://ftp.FreeBSD.org/pub/FreeBSD/CERT/patches/SA-05:17/devfs.patch

我們將檔案下載到 /usr/src 目錄下,這個檔案是修補的檔案,而 devfs.patch.asc 是用來檢查 pgp 簽名的簽名檔,如果您不使用 pgp 檢查所下載的檔案是否正確,您可以忽略這個檔案。

我們所下載的 patch 檔是將漏洞修補前及修補後的原始碼差異存成一個檔案,接下來我們必須將這個差異和我們系統中的原始碼合併。因此,我們系統中一定要安裝 FreeBSD 的原始碼,也就是 /usr/src 這個目錄下有原始碼的資料,如果您在安裝 FreeBSD 時並未安裝原始碼,您可以使用 sysinstall 來安裝原始碼套件。接下來我們就可以將所下載的檔案合併到系統中:

# cd /usr/src
# patch < /usr/src/devfs.patch

最後,依照這個修補檔的說明,我們必須重新編譯系統核心,請參考「編譯核心」一章,並於安裝新核心之後重新開機即可。並非所有修補都必須重新編譯系統核心,有的修補可能要重新編譯其他非核心程式,甚至整個系統,我們必須按照 Solution 的說明執行適當的步驟。

小提示

常常進行漏洞修補是系統管理者一定一定一定要做的事。所以您一定要常常上 FreeBSD 網站看是否有新的 patch 喔。

 

Top Ths file was last modified: 2007 February 25 10:54:04.

Copyright © 2002-2024 Alex Wang from www.twbsd.org. All rights reserved.