前言
互聯網上有許多企業公司和組織采用Linux作為服務器平台。當這些服務器與互聯網連接以提供應用服務時,不可避免地會成為攻擊目標。本文討論Linux系統安全配置的一些關鍵步驟,以幫助你保護Linux系統。雖然在這裡以Red Hat 6.0為例子,但也應該適用於其它Linux發行版本。
安裝
配置系統安全的頭一步最好是在系統的開始——操作系統的安全。因為配置的是防火牆,所以你絕對不能信任任何以前的系統安裝和配置,而應該從全新安裝開始,才能真正保證系統安全的完整性。
使你的系統處於單獨(或隔離)的網絡中。決不要讓未受保護的系統連接到其它網絡或互聯網中受到可能的攻擊。按我個人的經驗,一個連接到互聯網的新安裝系統可以在15分鐘內被掃描和入侵取得完全控制權。你可能需要另一台機器從互聯網獲取重要工具和安全補丁等等,然後再從這些機器將其傳送到單獨的“配置網絡”中。
當把將要作為未來防火牆的機器放置於隔離的網絡中時,就可以開始下一步了。第一步是選擇操作系統將要安裝的軟件包。對於Red Hat 6.0,提供了三種安裝選擇:Workstation(工作站)、Server(服務器)、Custom(定制,缺省選項)。我個人強烈推薦“定制”,因為這允許你選擇添加哪些服務和硬盤如何分區。安裝策略是在維持最大化效率時進行“最小化”安裝。系統中的軟件越少,潛在的安全漏洞就會越少。例如,如果你不需要News或Real Audio Server,就不要安裝它。Linux系統有一個好處就是如果你後來改變了想法,也是很容易添加所需軟件包的。不管選擇了哪種安裝方式,手冊頁和HOWTO文檔都應該是必不可缺的。雖然可能會使系統增加一點點風險,但它們有時確實特別有用。
如果選擇了“定制”安裝,會被提示進行硬盤分區。我個人通常喜歡使根分區盡可能地大,並且把所有東西都放在那裡。然後,我們確實需要創建幾個分區以保護根分區。因為如果根分區被例如系統日志或電子郵件等數據塞滿的話,就會出現拒絕服務,甚至有可能使系統崩潰。
因此,我總是推薦為/var設置一個單獨的分區。/var是用於存放系統所有日志和電子郵件的地方,將/var分區獨立出來,就能夠有效地保護根分區被這些數據塞滿。對於許多網絡環境,為/var分區設置不少於400MB基本上就足夠了。另外可以考慮為某些特定的服務或應用創建或保留單獨的分區,特別是敏感的日志記錄。如果系統中存在不可完全信任的用戶,也許應該為/home創建單獨的分區,這樣可以避免惡意用戶輕易攻擊/根分區。對於一台獨立服務器以下是一個分區實例:
/ - everything else /var - 400 MB swap - (I normally go with 256 MB)
當系統安裝完成並重啟後,務必要安裝必需的安全補丁。對於Red Hat,可以到http://www.redhat.com/apps/support/updates.html找到它的所有安全補丁程序。安全補丁對於維持一個安全的防火牆是至關重要的,應該經常保持更新。[email protected]或[email protected]是獲取最新安全漏洞信息的最佳資源。如果不安裝這些補丁,你的系統可能會輕易入侵。記住,從上面提及的另一台機器獲取這些補丁,防火牆機器應該仍處於隔離網絡中。對於Red Hat系統,下載RPM包會使系統更新變得更簡單。例如是對wu-ftpd進行安全升級的實例:
rpm -Uvh wu-ftpd-2.6.0-14.6x.i386.rpm
如果系統早已處於互聯網上,可以直接從互聯網上安裝:
rpm -Uvh ftp://updates.redhat.com/6.1/i386/wu-ftpd-2.6.0-14.6x.i386.rpm
推薦使用autorpm工具保持對RPM軟件包的補丁更新。這個命令行工具分析確定哪些。rpm包需要升級,並會自動(如果你願意的話)從Red Hat的網站上下載並安裝升級文件。這個工具的使用非常靈活簡單,可以讓其在cron中運行,這樣你的系統就會定期自動檢查升級更新,並可以向管理員發送提醒系統需要升級的電子郵件。
關閉服務
一旦安裝完系統的安裝包、補丁,重啟後,我們現在就可以開始對操作系統進行安全增強配置了。安全增強配置主要包括關閉服務、增加日志、調整幾個文件和配置TCP Wrappers.首先從關閉服務開始。
缺省情況下,Solaris是一個提供許多有用服務的高性能操作系統。然而,對於防火牆來說,其中的大多數服務是不需要,且可能是安全風險。首先需要修改/etc/inetd.conf文件。這個文件定義了由/usr/sbin/inetd超級守護進程需要監聽的服務。缺省情況下,/etc/inetd.conf會啟動35個服務,然而最多僅需要兩項:ftp和telnet.其余服務都不是必需的,可以將它們注釋(關閉)。這是很重要的,因為inetd監聽的許多服務存在嚴重的安全威脅,例如popd、imapd和rsh.以下命令列出inetd守護進程會監聽的服務,請確認將其中不必要的服務的所在行注釋(行首加"#"號):
grep -v "^#" /etc/inetd.conf
下一步要修改的是/etc/rc2.d和/etc/rc3.d目錄下的文件。在這裡你能夠找到被init進程執行的啟動腳本。其中也有許多是不需要的。要取消在啟動過程中執行一個腳本,只需將對應文件名的起始大寫S改為小寫s即可。此外,Red Hat系統中帶有一個好工具用以關閉服務。只要在命令行輸入"/usr/sbin/setup",然後選擇"System Services",接著再選擇在系統啟動時需要執行的腳本。另外還有一種方法就是在大多數發行版本中都帶有的chkconfig工具。以下啟動腳本是系統缺省安裝,但通常卻不是必需的。如果確定不需要它們,應該將禁止其啟動。注意其中的數字用於決定執行的順序,在不同的發行版本中可能會有所變化。以大寫K開始的腳本用於kill已經在運行中的服務。
S05apmd (僅有筆記本電腦才需要)S10xntpd (網絡時間協議)S11portmap (如果運行RPC服務則必需打開)S15sound (保存聲卡設置)S15netfs (NFS客戶端,用於從NFS服務器安裝文件系統)S20rstatd (向遠程用戶洩露過多信息)S20rusersd S20rwhod S20rwalld S20bootparamd (用於無盤客戶端,通常都不需要)S25squid (代理服務器)S34yppasswdd (如果系統運行NIS服務器,則必需此服務)S35ypserv (如果系統運行NIS服務器,則必需此服務)S35dhcpd (啟動DHCP服務器守護進程)S40atd (at服務,類似cron服務,但系統通常不需要)S45pcmcia (僅有筆記本電腦才需要)S50snmpd (SNMP守護進程,向遠程用戶洩露過多信息)S55named (DNS服務器。如果需要運行DNS,請升級到最新版本)S55routed (RIP,僅在必需時才應該啟動)S60lpd (打印服務)S60mars-nwe (Netware文件和打印服務器)S60nfs (用於NFS服務器。除非必須,此服務不應運行)S72amd (AutoMount守護進程,用於自動安裝遠程文件系統)S75gated (用於運行其它路由協議,例如OSPF)S80sendmail (如果不需要接收或轉發電子郵件應關閉。此時仍可發送電子郵件)S85httpd (Apache服務器,建議升級到最新版本)S87ypbind (僅有NIS客戶端才需要)S90xfs (X Windows系統字體服務器S95innd (News服務器)S99linuxconf (通過浏覽器遠程配置Linux系統)
要想在修改啟動腳本前了解有多少服務正在運行,輸入:
ps aux | wc -l
然後修改啟動腳本後,重啟系統,再次輸入上面的命令,就可計算出減少了多少項服務。越少服務在運行,安全性就越好。另外運行以下命令可以了解還有多少服務在運行:
netstat -na ——ip
日志和系統調整
在盡可能多地取消服務後,下一步就是配置系統日志了。所有的系統日志存放在/var/log目錄下。缺省時,Linux有不錯的日志設置,除了ftp.有兩種方法記錄ftp的日志,配置/etc/ftpaccess文件或編輯/etc/inetd.conf.建議采用相對簡單的編輯/etc/inetd.conf文件的方法。通過編輯/etc/inetd.conf文件如下,可以記錄所有FTP會話的所有日志。
ftp stream tcp nowait root /usr/sbin/tcpd in.ftpd -l -L -i -o
以下選自ftp手冊頁:
如果指定-l參數,syslog會記錄每一個ftp會話。如果指定-L參數,缺省時一旦ftp服務器被調用,命令日志就會激活。這將使服務器記錄下所有的USER命令。注意,此時如果一個用戶偶然性地在用戶名輸入時輸入了口令,該口令會被syslog記錄下來!如果指定-i參數,ftpd服務器接收到的文件都會被記錄到xferlog.如果指定-o參數,ftpd服務器發送的文件都會被記錄到xferlog.
snip
下一步配置是系統調整。這包括了多個文件的管理。第一件事情是確保/etc/passwd文件的安全。首先要確認系統使用了/etc/shadow文件,此保存了所有用戶口令密文的文件僅允許root根用戶訪問,這可以阻止用戶口令輕易地被訪問和破解。Red Hat 6.0缺省時使用了shadow口令系統,但務必要檢查確定。只要運行以下命令,就會將口令系統自動轉換到/etc/shadow口令系統:
pwconv
第二步是刪除/etc/passwd文件中許多缺省的系統帳號。Linux提供這些帳號主要是用於許多其實極少需要的系統操作。如果不需要這些帳號,刪除它們。帳號越多,系統被入侵的可能性就越大。例如"news"帳號,如果不運行nntp新聞組服務器,就不需要該帳號(注意要更新/etc/cron.hourly文件,因為腳本中涉及到了"news"用戶)。另外,一定要刪除"ftp"帳號,因為該帳號僅用於匿名FTP訪問。
我們還要修改/etc/ftpusers文件。任何被列入該文件的帳號將不能ftp到本系統。通常用於限制系統帳號,例如root和bin等,禁止這些帳號的FTP會話。缺省時Linux已創建了該文件。一定要確保root根用戶被包含在該文件中,以禁止root與系統的ftp會話。檢查並確認需要FTP到該防火牆的所有帳號**不**在/etc/ftpusers文件中。
另外,確保根用戶root不能telnet到系統。這強迫用戶用其普通帳號登錄到系統,然後再su成為root./etc/securetty文件列出了root所能連接的tty終端。將tty1、tty2等列入該文件中,使root用戶只能從本地登錄到系統中。ttyp1、ttyp2等是pseudo(虛擬)終端,它們允許root遠程telnet到系統中。
最後,創建/etc/issue文件。該ASCII文本文件用於在所有telnet登錄時顯示的信息。當試圖登錄到系統中時,該文件中的警告信息將被顯示。在Linux系統中要修改/etc/rc.d/init.d/S99local腳本文件,以生成固定的/etc/issue文件。因為缺省時Linux在每次啟動時都生成新的/etc/issue文件。
連接到防火牆
通過安全可控的途徑連接到防火牆也是非常重要的。通常,我們需要遠程訪問防火牆以進行管理或上載文件。這些通訊需要考慮安全性。在這裡我們主要討論兩種方式:ssh和TCP Wrappers.
我個人推薦ssh,因為它使在我們和防火牆之間的通訊都是經過加密的。TCP Wrappers不能保證網絡通訊不被竊聽,使用戶仍然有可能捕獲通過網絡傳送的明文口令。如果你擔心被其它用戶竊聽你和防火牆之間的通訊,推薦用ssh替代telnet/ftp.ssh會話對其所有網絡通訊進行加密,使在防火牆上的管理和文件上載變得更安全。ssh和TCP Wrappers的相似之處是有自己的日志文件功能,並能限制哪些系統可以創建網絡連接。要獲取更多關於ssh的信息和下載ssh客戶端和服務器端源代碼,請訪問http://www.ssh.org網站。建議使用1.2.x版本的ssh,因為2.x版本有版權限制。對於Windows 95/NT用戶,推薦用SecureCRT作為ssh客戶端。
TCP Wrappers,雖然不支持加密,但它提供日志功能和控制何人能訪問系統。它通常用於為inetd中的服務,例如telnet或ftp,添加一層限制。當使用TCP Wrappers時,系統通過它來監視inetd進程創建的連接,記錄所有連接請求,然後對照一個訪問控制列表(ACL)檢驗該請求。如果該連接是允許的,TCP Wrappers將此連接請求傳遞給相應的真正守護進程,例如telnet.如果該連接是禁止的,則TCP Wrappers會丟棄此連接請求。對於Linux系統,TCP Wrappers缺省時就被安裝到系統中,我們只需編輯/etc/hosts.allow和/etc/hosts.deny文件即可。這些文件用於確定什麼人能和不能訪問系統。TCP Wrappers的語法比較簡單,將被允許網絡連接的IP地址或網絡添加到/etc/hosts.allow文件,將被禁止網絡連接的IP地址或網絡添加到/etc/hosts.deny文件。缺省時,Linux允許所有連接,所以需要對這兩個文件進行修改。對於TCP Wrappers有以下兩點建議:
* 使用IP地址而不是系統名字或域名。* 設置/etc/hosts.deny文件禁止所有連接(ALL),然後在/etc/hosts.allow文件中指定僅允許特定主機和網絡。
更嚴格的安全配置
以上討論的內容包括了所有的要點。通過執行以上操作,你就可以顯著增強系統的安全性。然後不幸的是,你的系統並不是100%安全,而且永遠也不會是。因此,這裡提供幾個更嚴格的安全配置方法和步驟。
首先是創建whell用戶組。wheel用戶組包含了允許執行一些功能強大命令(例如/usr/bin/su)的用戶帳號列表。通過限制有權限訪問這些命令的用戶帳號,就能夠增強系統的安全性。要創建wheel組,用vi編輯文件/etc/group,創建wheel組並為其增加系統管理員帳號。然後確定重要的系統程序,例如/usr/bin/su.把這些程序文件的組用戶設置為wheel,並只允許程序的屬主和組用戶執行(注意要保留必需的suid或guid位)。例如對於/usr/bin/su,使用如下命令:
/usr/bin/chgrp wheel /usr/bin/su /usr/bin/chmod 4750 /usr/bin/su
然後,我們需要限制。rhosts、。netrc和/etc/hosts.equiv文件的使用。r系列命令使用這些文件來訪問系統。要為這些文件加鎖,先創建它們,然後修改其屬性為零即可。這樣除了root用戶就沒有其它用戶能創建或修改它們了。例如:
/usr/bin/touch /.rhosts /.netrc /etc/hosts.equiv /usr/bin/chmod 0 /.rhosts /.netrc /etc/hosts.equiv
第三,配置/etc/shadow使用MD5哈希函數而不用crypt函數作為加密算法。這可以使被加密的口令文件更難以破解。這可以通過修改PAM模塊配置完成。PAM(Pluggable Authentication Modules)是一個共享庫套件,可用於選擇應用程序如何對用戶進行認證等。要了解PAM更多知識,請訪問:ftp://ftp.us.kernel.org/pub/linu ... -PAM-html/pam.html.
在以前的舊版本中,必須手工修改PAM模塊以使用MD5哈希函數。然而在Red Hat 6.0及更高版本中,可用setup工具選擇MD5哈希。在命令行輸入"setup"然後選擇"authentication configuration",從那裡就能夠選擇使用MD5哈希。然而,MD5哈希在用戶再次輸入其口令前並未真正生效。如果因為某些原因不使用setup工具,手工修改PAM模塊也是可以的。
作為bash用戶,我不大願意使用。bash_history文件,因為不希望別人(包括root)知道我曾經運行了哪些命令。所以,在。bash_profile文件裡,我添加了一行,這樣命令就不會被記錄到。bash_history文件。:HISTFILESIZE=0最後一件事情是保護系統不被攻擊者物理訪問。一是要為BIOS設置口令,二是通過在/etc/lilo.conf文件中配置口令保護(password=xxx)系統的啟動過程。然而記住,一旦系統被入侵者能夠完全物理接觸,則沒有任何方法能保證系統的絕對安全了。
IPChains
討論Linux安全性,不可能不討論IPChains.IPChains是集成到2.2.x內核中的包過濾防火牆軟件。只要運行了Red Hat 6.0或更高版本,IPChains已在Linux的安裝包中。IPChains與Cisco Access Control Lists(訪問控制列表)相似,它能夠控制什麼數據包能夠進出Linux系統。作為一個防火牆軟件,IPChains能夠用於保護Linux系統。要保護一台獨立服務器系統,可以配置IPChains僅允許出站的TCP連接。如果外部主機試圖發起任何TCP連接,都會被禁止創建連接。由於IPChains不是基於狀態過濾的,因此通常允許所有的UDP和ICMP連接。最後,應該記錄下所有的被禁止連接,這樣可以發現可能的攻擊企圖。然而,對於廣播和多播數據包,應該將其丟棄,因為這些數據包可能會很快地填滿系統日志。以下是一個IPChains配置例子(保護獨立服務器系統):
bash# ipchains -L Chain input (policy DENY): target prot opt source destination ports DENY all —— 0.0.0.0 anywhere n/a DENY all —— anywhere 255.255.255.255 n/a DENY all —— anywhere BASE-ADDRESS.MCAST.NET/8 n/a ACCEPT tcp ! y anywhere anywhere any -> any ACCEPT udp l- anywhere anywhere any -> any ACCEPT icmp l- anywhere anywhere any -> any DENY all l- anywhere anywhere n/a Chain forward (policy ACCEPT): Chain output (policy ACCEPT):
結論
我們在本文中討論了如何安全配置一台Linux系統(Red Hat發行版本)的一些主要步驟。使一個系統安全的關鍵是最小化安裝,使用TCP Wrappers、IPChains等軟件、用shadow口令增加安全防護。此外還有一些附加步驟,例如tripwire(監視系統文件的改動)和swatch(日志監視和報警工具)。另外向Linux初學者推薦一個能夠自動對新安裝的Linux系統進行安全配置的PERL腳本:Bastille.記住,沒有系統是真正100%安全的。然而,通過以上列出的操作步驟,可以較大幅度地減少安全風險。