天天看點

如何讓你的FreeBSD更安全(Securing FreeBSD)

前幾天我整理了過去的一些筆記,以及近幾年收集的一些安全建議。我認為這可能對您有幫助,是以本周我就暫停文檔系列的文章,寫一點關于使你的FreeBSD系統更安全的内容。 很明顯,在這個領域我不可能用一篇文章全面地介紹所有的事情。另外,也不可能給出一個防止四海皆準的,保證任何系統都安全的方案。

在我整理筆記的過程中,我注意到很多都是關于如何讓FreeBSD伺服器(如,Web伺服器,郵件伺服器,等等)更安全的方法。如果你用FreeBSD做為個人系統,并希望完全的桌面功能的話,這就不太夠用了。你肯定不願意因為某些強化安全的設定,造成某些功能無法使用,并在此後的一周内孤立無援地與計算機進行搏鬥,直到找到問題的所在。 是以,你将注意到,和許多其它安全教程不同,這份文檔并不建議你修改FreeBSD系統中檔案的權限。

這是有意的。除非你正在強化一台生産伺服器的安全性,并且十分明白自己在做什麼,否則絕不要修改檔案的權限。(如果你一定要做做實驗的話,請在自己的home檔案夾中作)。不然的話,一些東西可能就會停止工作,例如,電子郵件,X Window系統,聲音。怪事會在不經意的時刻發生,讓你頭疼良久之後才意識到可能是一周前的某個權限設定造成的問題。 我們都知道Internet并不總是一個友好的地方,而且你可能也不想讓另一個地方的人擁有與你一樣的通路許可權限。這意味着你可能不希望在沒有某種防火牆的前提下通路Internet。

幸運的是,你的FreeBSD系統支援良種防火牆:ipfw 和 ipfilter。更令人振奮的是,通俗易懂的文檔正在迅速增加。如果你不在防火牆後面,那麼請花一個周六下午的時間讀一讀如何在你的系統上配置防火牆的文章,并操練一把。你将為此感到愉快,以下是一部分可用的資源: man ipfw FreeBSD Handbook: Section 10.7 — Firewalls Setting Up a Dual-Homed Host using IPFW and NATD man ipf IPFilter and PF resources 好的安全總是“層層設防”,這意味着如果一個機制失效了,仍然有備用的機制。即使你的系統已經受到了防火牆的保護,你仍然需要禁用所有服務,除了那些絕對需要的。在桌面系統中,不需要很多的服務。 用下面的指令可以檢視哪些服務正在試圖監聽連接配接你的系統: sockstat -4 輸出的差别可能很大,這取決于在安裝的最後階段選擇的軟體,以及之後自行安裝的port和package。

端口6000(X Window伺服器)是輸出中非常常見的;如果沒看到它的話,啟動一個X Window會話,然後重新運作 sockstat -4。不幸的是,在過去的幾年中有很多針對X Window的攻擊。幸運的是,使用X并不需要打開6000端口,不必擔心,即使關閉了這個端口,仍然可以使用圖形界面! 許多方法可以關掉這個端口。

我發現的最簡單的方法是成為超級使用者,并編輯 /usr/X11R6/bin/startx。找到 serverargs 那一行,并把它改為類似下面的樣子: serverargs="-nolisten tcp" 儲存修改之後,以普通使用者身份運作X并執行 sockstat -4。如果沒有打字錯誤,那麼X會像往常那樣啟動,但 sockstat -4 輸出中不會再出現端口6000。

如果想了解6000端口打開的後果,請閱讀 Crash Course in X Window Security。 好了,現在 sockstat -4 輸出中的服務少了一個。我們還需要處理一下郵件:端口 25 (smtp) 和 587 (submission)。收發郵件并不需要 587 端口,為了關閉它,我們需要修改 /etc/mail/sendmail.cf。查找這一行: O DaemonPortOptions=Port=587, Name=MSA, M=E 然後在前面加上 # ,并告訴 sendmail 變化: killall -HUP sendmail -HUP 不會殺掉 sendmail,但他會告訴sendmail重新處理 /etc/mail/sendmail.cf。重複sockstat -4 ,它将不再顯示 587。

那麼端口25呢?你可能需要,也可能不需要打開這個端口,這取決于使用什麼樣的郵件程式來收發郵件。對于運作 FreeBSD 4.6-RELEASE 或更高版本的系統, 在/etc/rc.conf中增加下面的行: sendmail_enable="NO" 将告訴 sendmail 隻監聽 localhost,這允許所有的郵件客戶程式發送郵件。如果你知道你的郵件客戶程式帶有内置的SMTP代理,或者喜歡冒險,那麼可以嘗試一下: sendmail_enable="NONE" 這将徹底關閉25端口。

檢查一下這是否讓你無法發送郵件是很重要的,確定已經關掉了所有應用程式,随後,以超級使用者身份執行: shutdown now 收到提示後按回車、exit。重新登入後給自己發一封郵件,如果收不到,那麼把NONE改回NO。 如果你的"sockstat"顯示端口111打開,那麼把下面幾行加到 /etc/rc.conf (或者,如果已經有這些行,把 YES 改為 NO): nfs_server_enable="NO" nfs_client_enable="NO" portmap_enable="NO" Portmap隻有在運作NFS時才是必需的,而這往往不是FreeBSD桌面系統的需要。

曆史上它有過很多安全問題,是以除非你絕對需要它,否則就别用。 syslog (端口 514) 也可能出現在你的輸出結果中。我們可能并不希望完全關掉 syslog ,因為它提供的消息記錄是我們需要的。但我們并不需要為此打開端口。在 /etc/rc.conf 檔案中增加下面的選項: syslogd_enable="YES" syslogd_flags="-ss" 标志中的ss (确認用了兩個s,而不是一個) 将禁止來自遠端主機的記錄并關閉端口,但仍然允許 localhost 進行日志記錄。

随後,确認 /etc/rc.conf 中inetd_enable不是YES。如果sockstat輸出中有inetd,那麼/etc/inetd.conf中肯定有什麼項目沒有被注釋掉,如果不需要的話,那麼把那一行前面加上#,并 killall inetd。 如果需要使用DHCP自動擷取位址,那麼請保持dhclient (udp 6打開,否則将不能重新整理位址。 如果在 sockstat 輸出中發現了其他東西,那麼請看看 man rc.conf 裡面有沒有關于如何關掉這些東西的提示。如果沒有的話,那麼很可能是某個啟動腳本啟動了一些服務程式,請執行: cd /usr/local/etc/rc.d 來看看你的系統中的啟動腳本。絕大多數 packages/ports 會安裝一個擴充名為sample的示範腳本用于啟動服務,這些腳本并不被執行;也有一些直接安裝能夠執行的腳本,它們會在計算機啟動的時候加載。禁止某個腳本知性最簡單的方法是把它的擴充名改為sample,随後殺掉守護程式,這樣sockstat就不會再說什麼了。

舉例來說,我最近安裝了 ethereal 結果發現 snmpd 出現在 sockstat -4 的輸出中,這個程式在安全方面名聲不佳,是以我把自己更新為root并執行了下面的指令: cd /usr/local/etc/rc.d mv snmpd.sh snmpd.sh.sample killall snmpd 你可能會希望把下面的選項加入 /etc/rc.conf : tcp_drop_synfin="YES" 這個選項可以挫敗諸如OS指紋識别的企圖(譯注:這個選項對最新的nmap無效)。如果你打算開啟這個選項,那麼,還需要在核心編譯配置檔案中加入: options TCP_DROP_SYNFIN 還有兩個相關的選項: icmp_drop_redirect="YES" icmp_log_redirect="YES" ICMP 重定向可以被利用完成DoS攻擊。這篇 ARP and ICMP redirection games article 介紹了具體的一些情況。

在打開 icmp_log_redirect 選項時請務必小心,因為它會記錄每一個ICMP重定向 ,如果你遭到了這樣的攻擊,那麼日志很可能會塞滿記錄。 建好防火牆之後,請考慮加入下面的選項: log_in_vain="YES" 這個選

項會記錄每一個到關閉端口的連接配接企圖。另一個比較有意思的選項是: accounting_enable="YES" 這将打開系統審計功能,如果你不熟悉他們,那麼請閱讀 man sa 和 man lastcomm 。

最後,下面的選項可能非常有用: clear_tmp_enable="YES" 因為它在系統啟動時将清空 /tmp ,這永遠是一件值得去做的事情。 讓我們來研究一下其他能夠加強安全的設定。我比較喜歡把預設的密碼加密算法改為Blowfish,因為它在提供最佳安全性的前提下,也提供了最快的速度。這裡有一份 comparison of algorithms[幾種密碼學算法的比較]。 當然,如果你對這類東西感興趣的話,看看 Cryptogram newsletter ,它是Blowfish作者寫的。 為了啟用 Blowfish 散列,編輯 /etc/login.conf 并把 passwd_format 一行改成下面這樣: :passwd_format=blf:\ 儲存設定,重新建立登入資料庫: cap_mkdb /etc/login.conf 随後需要修改每一個使用者的密碼,以便讓這些密碼都使用 Blowfish 散列值。以超級使用者的身份執行下面的指令: passwd username 需要修改所有使用者的密碼,包括root自己。

完成了這些操作之後,重新檢查一下确認自己沒有遺漏什麼: more /etc/master.passwd 所有使用者的密碼應該以.開始 最後,重新配置 adduser 程式,讓它在以後使用Blowfish。修改 /etc/auth.conf,找到 crypt_default 一行,改為: crypt_default=blf 你可能已經注意到,每次登入的時候FreeBSD都會提示你,你在用的那個系統是FreeBSD,以及它的版權資訊,包括核心的編譯時間,等等。這些資訊可能有用,但相當煩人,特别是當别人可以登入的時候,它可能會暴露一些你不希望暴露的資訊。 可以通過編輯 /etc/motd 來阻止計算機說出一些不該說的東西,或者宣揚你的一些想法,包括你喜歡看的 sci-fi 文摘,或者其他一些——總之你想寫什麼就寫什麼。

随後,删除版權資訊: touch /etc/COPYRIGHT 随後,還可以修改登入提示,編輯 /etc/gettytab. 找到 default:\ 小節,它以下面的文字開頭: :cb:ce:ck:lc 小心地修改 \r\n\ \r\n\r\nr\n: 之間的文字來适應自己的需要。請仔細檢查 \r 和 \n 的數量,并儲存修改。例如,我的登入提示是這樣的: I’m a node in cyberspace. Who are you? login: 可以在其他終端上嘗試登入,以确認正确性。 最後,即使你已經修改了motd并從中删除了核心版本資訊,預設情況下FreeBSD仍然會在啟動之後把這些東西加入 /etc/motd 。是以需要修改 /etc/rc.conf 并加入下面的設定: update_motd="NO" 這個設定需要重新啟動才會生效。 此外,限制登入也是非常重要的。因為這些變動會改變 login 程式的行為,是以需要非常謹慎。比較好的習慣是保持一個以root身份登入的終端,用其他終端嘗試。這樣如果由于某種原因造成問題,你仍然可以改正。 包括你自己在内的任何人都不應該直接以root身份登入。修改 /etc/ttys。

你将注意到 ttyv0 到 ttyv8的一系列設定。把後面的 secure 改為 insecure。注意,這個檔案肯定是你不希望有任何錯誤的一個檔案,是以請仔細地進行測試。如果設定正确,root登入将收到 "Login incorrect" 。 我個人傾向于使用所有的9個終端。如果你不打算這樣,請把對應的 "on" 改為 "off" ,當然,隻是一部分 ttys 。切記保持至少1個 "on," 否則你會無法登入,這将導緻系統無法使用。ttyv8 預設情況下是 "off" ,這意味着你需要手動打開X,如果希望自動啟動,那麼把它改為"on."。 最後一個我想說的限制是阻止從其他地方登入,這是通過編輯 /etc/login.access 實作的。 你可能希望禁止一切遠端登入(這意味着你必須實體地坐在機器前面),删除下面這一行前面的#号: #-:wheel:ALL EXCEPT LOCAL .win.tue.nl 把 .win.tue.nl 去掉,于是它看起來将像這樣: -:wheel:ALL EXCEPT LOCAL 如果你需要從遠端登入,那麼把.win.tue.nl 替換為相應的IP或域名。如果有多個位址,用空格分開。 如果隻有一兩個使用者的話,那麼可以拒絕其他人登入: -:ALL EXCEPT user1 user2:ttyv0 ttyv1 ttyv2 ttyv3 ttyv4 用具體的使用者名替換掉 user1 user2 。如果需要的話,增加相應的tty。

另外,也可以把使用者組方在這裡。首先,編輯 /etc/group 并增加下面的行: mygroup:*:100:genisis,dlavigne6,biko 當增加組時,需要保證GID的唯一性。 随後,修改 /etc/login.access : -:ALL EXCEPT mygroup:ttyv0 ttyv1 ttyv2 ttyv3 ttyv4 ttyv5 測試它非常重要,一定要留一個終端。測試每一個終端上的登入,确認其效果。 http://www.frontfree.net 找到他過去發表的多數文章。

繼續閱讀