介紹
這篇文章集中討論Linux平台上的幾種基於主機的入侵檢測系統。而且,我還會介紹一下如何安裝這些軟件包、它們有什麼用處以及在什麼情況下使用這些軟件包。
系統安全101
這篇文章假定你已經有了一些系統安全的基本知識。而且,為了防止來自Internet的入侵也已經采取了一些基本的安全防范措施。這些措施包括:
l 防火牆,用來防止系統中的TCP和UDP端口不會被黑客利用。例如,用於Web服務器的一組基本的防火牆規則要保證只能通過TCP端口80(通常是HTTP協議的端口號)用TCP/IP協議來訪問這台計算機。
l 禁止不必要的daemon。例如,一個Web服務器在正常情況下只需要一個進程用來處理網頁的請求。與處理網頁請求無關的進程,如:RPC/Portmap服務、NFS服務、X字體服務、DNS域名服務以及其它用不著的程序必須被禁止運行。在Red Hat Linux系統中,通常使用象ntsysv或tksysv這樣的程序來禁止不必要的daemon或服務的。
l 通過編輯“/etc/inetd.conf”,禁止不必要的端口。在一般情況下,系統安裝完之後在“/etc/inetd.conf”文件中許多端口都被設置成有效的。編輯這個文件並把不必要的行刪掉或注釋掉是最基本的安全防范措施,必須在所有的系統中都使用這樣的安全措施。
安全防線
在這篇文章中,我將討論保證系統安全的多層次的解決方案。如果任何一層安全防線被破壞了,其它安全防線也能夠對系統提供保護。多層次的系統安全結構就是如圖表1所示的這個例子。
圖中的每一層為其上面一層提供更多的數據保護。例如,第一層是防火牆。一旦防火牆被攻破,第二層,也就是Port Sentry程序,也還能夠提供保護。
在系統中第三第四層分別是LIDS和LogCheck程序,一旦Port Sentry對入侵者無能為力,它們將提供更進一步的保護。
監控連接請求
在防火牆之後的第一層是用來監控連接請求的軟件包。PortSentry軟件包(http://www.psionic.com/abacus/portsentry/)提供了簡單而有效地完成這項任務的方法。
PortSentry是用來做什麼的?
PortSentry是用來監控TCP/IP端口活動的監控器。被PortSentry監控的端口活動都會被報告出來而且可以設置某些參數,包括根據端口活動的來源禁止其對系統進一步的訪問。這是一個很重要的防御措施,因為黑客在入侵之前都會試圖探查系統的弱點(通過端口掃描)。檢測“探查”或端口掃描,可以徹底地防止潛在的黑客入侵系統,讓黑客不可能在掃描過端口之後發動真正的攻擊。
安裝PortSenty
對Red Hat Linux的用戶,PortSentry的RPM包可以在Red Hat contrib FTP站點找到。這個站點在世界各地都有鏡像,查看www.redhat.com找到離你最近的鏡像站點。我不能確定是否有.deb格式的PortSentry軟件包,但是我想可能會有吧。
對於其它Linux系統,用源代碼來安裝PortSentry相對來說也很容易。
建議配置
PortSentry可以在很多種模式下運行,包括各種各樣的TCP和UDP“秘密”(stealth)模式。我喜歡把PortSentry和一些TCP端口綁定,這些端口是:(a)不在使用的;(b)眾所周知的很容易被攻擊的端口。例如,端口143(imap2),端口111(portmap)和端口23(telnet)都是很容易被攻擊的端口,因此我在自己的系統中都沒有使用這些端口,但是我的Web服務器的這些端口在24小時之內已經都被掃描過來了。
為了讓PortSentry在基本的TCP模式下運行,必須確保系統的啟動腳本中有這麼一行:
portsentry –tcp
而且還要保證在PortSentry的配置文件(portsentry.conf)中包含有讓你需要監控的端口生效的TCP_PORTS行。
反應(response)選項
“portsentry.conf”文件中的“Response Options”部分允許你設定當檢測到端口有異常活動之後PortSentry將采取怎樣的反應。我使用的方法是讓ipchains阻塞更進一步的攻擊。這只要在“portsentry.conf”文件中去掉下面這一行的注釋:
KILL_ROUTE="/sbin/ipchains -I input -s $TARGET$ -j DENY -l"
在端口被掃描的頻率很高的系統中,把上面這一行中末尾的“-l”去掉,可以不記錄連接請求,這樣就能節省日志文件所占的空間。
監控系統日志
用防火牆保護系統以及用類似PortSentry的軟件所起到的作用就是它們可以監控和阻止連接到系統中空閒端口的企圖。這可以防止用“掃描-入侵”的方法對系統進行攻擊。
如果系統需要運行一個特定的服務(例如,在Web服務器上運行Apache、在DNS服務器上運行BIND)而且黑客發現了服務軟件中的一個安全漏洞,那麼防火牆和PortSentry就不能防止黑客對系統進行攻擊。當作為DNS服務器上運行的BIND軟件有安全漏洞,而且黑客通過掃描一定范圍內計算機的某一個特定端口(DNS端口)發現了這台有安全隱患的計算機並通過這個端口發動攻擊,防火牆和PortSentry都會把這樣的入侵看成是正常的對系統的訪問。
LogCheck
LogCheck(http://www.psionic.com/abacus/logcheck/)是一個非常有用的程序用來檢查系統日志查看有沒有什麼異常的活動。LogCheck掃描不同的系統日志文件(在Linux系統中是在“/var/log”目錄下),一旦發現有異常情況就會用email通知系統管理員。如果有黑客企圖攻擊你的系統或者已經攻擊了你的系統在日志文件中是可以找到一些蛛絲馬跡的。
安裝LogCheck
LogCheck的RPM軟件包象PortSentry一樣可以在Red Hat contrib FTP服務器上得到。安裝LogCheck的RPM軟件包或者用源代碼安裝(請看源代碼中提供的INSTALL文件)相對來說都是很簡單的。
配置LogCheck
LogCheck有四個主要的配置文件。在RPM的版本中,這些文件都保存在“/etc/logcheck”目錄下。正常情況下只有“logcheck.ignore”和“logcheck.violations.ignore”文件需要修改。安裝完LogCheck之後,還要做的事有:
l 用標准的配置文件運行一次LogCheck。這將產生一個很大的輸出文件,這個文件可以刪掉。
l 24小時之後,再運行一次LogCheck。這會檢測到上次運行之後日志文件中新增加的一些項,而且會生成一個小了一點但是還是很大的輸出文件。認真讀一下這個輸出文件。
l 對於日志文件中一些用不著考慮的消息(根據自己的判斷)找到可以標識這些消息的某個特殊的字符串。對於“Security Violations”部分的消息,把這個標識字符串加入“logcheck.violations.ignore”文件。對於其它的消息(在“Unusual System Events”部分),把標識串加入“logcheck.ignore”文件中。
l 在一周之內每隔12-24小時重復上面的過程。直到通過在“.ignore”文件中不斷地加入標識串把用不著的消息過濾掉,最後在LogCheck每天的報表中只剩下那些真正需要好好查看的消息為止。
注意,安裝完RPM的軟件包之後,LogCheck在默認情況下被設置成每小時運行一次。但是在一般情況下,除了那些需要定期監控的非常重要的系統,只要每天運行一次就行了。只要把“/etc/cron.hourly/logcheck”文件移到“/etc/cron.daily”目錄下就解決問題了。
基於內核的入侵檢測
基於內核的入侵檢測對於Linux來說是一項很新的技術。現在可以得到的基於內核的入侵檢測系統是LIDS,在http://www.lids.org/。(譯者注:這可是中國人主持的項目,大家要好好支持)
什麼是LIDS
LIDS是一個基於Linux內核的入侵檢測與防范系統。
LIDS的防范措施包括限制root(通常能夠完全控制整個系統)的權力,不讓他隨意地改變系統中的重要部分。LIDS的其它重要的特性還包括:經過加強的文件系統保護、防止直接對端口或者內存進行訪問、防止直接訪問磁盤以及保護日志文件。LIDS還能夠阻止某些系統“動作”,例如,安裝sniffer軟件以及改變防火牆規則。
LIDS的文檔
相對PortSentry和LogCheck來說,LIDS會難安裝一些。幸運的是,LIDS的站點有關於LIDS項目的很好的文檔,包括安裝和配置指南。
安裝LIDS
首先,在安裝LIDS之前,必須確保有最新版本的LIDS的patch(我用的是0.9)以及正確的內核版本。我使用從Red Hat Updates FTP站點的最新的內核(2.2.14-12),因為這個版本修正了一些安全問題。你還要有正在使用的內核的源代碼。
LIDS現在主要用於2.2.14版本的內核。我在Red Hat 6.2系統中安裝了LIDS,這個Linux的發行版已經包括了2.2.14的內核了。在安裝LIDS之前,我下載了最新版的內核(從ftp.redhat.com/updates/或其它鏡像站點下載)並根據http://www.redhat.com/support/docs/howto/kernel-upgrade/kernel-upgrade.Html的指示進行了安裝。
我還下載了最新的內核源代碼,也可以從ftp.redhat.com/updates/得到。用下面的命令安裝源代碼:
rpm -Uhv kernel-source-2.2.14-12.i386.rpm
然後,編譯和安裝lidsadm程序:
cd /usr/local/src/security/lids-0.9/lidsadm-0.9
make
make install
生成RipeMD-160口令(這將會被安裝到內核中去):
lidsadm -P
我輸入的口令為“anypass”結果得到的加密後的口令為“d502d92bfead11d1ef17887c9db07a78108859e8”。
然後,我把標准的Red Hat的內核配置文件拷貝到“/usr/src/linux”目錄:
cd /usr/src/l
然後,編譯和安裝lidsadm程序:
cd /usr/local/src/security/lids-0.9/lidsadm-0.9
make
make install
生成RipeMD-160口令(這將會被安裝到內核中去):
lidsadm -P
我輸入的口令為“anypass”結果得到的加密後的口令為“d502d92bfead11d1ef17887c9db07a78108859e8”。
然後,我把標准的Red Hat的內核配置文件拷貝到“/usr/src/linux”目錄:
cd /usr/src/l