用來在日志文件裡搜索特定活動事件的工具不下幾十種,本文將介紹搜索日志文件時應該采取的策略。然後,通過幾個具體示例介紹一些使用grep命令手動搜索日志文件的辦法。接下來,我們將看到logwatch工具和logsurfer工具的用法。最後,將看到需要自行下載和安裝的工具,如swatch等。 1、查找日志文件簡單方法
一般來說,系統日志文件幾乎都保存在/var/子目錄(該路徑由syslog.conf文件定義)。如果想讓所有的應用程序都把日志文件集中存放到/var/子目錄下,需要依次對每一個應用程序的配置文件進行編輯。把日志集中到/var/子目錄下是個很好的主意。首先,當需要查看它們、修改它們的權限或者對它們進行備份的時候,只要到一個地方就可以找到所有的日志文件。
其次,/var/子目錄通常是在一個獨立於根目錄(/)的文件系統裡,這有助於防止日志文件迅速變大並占滿可用空間,避免操作系統和應用程序受到影響。可以利用find命令把你不知道的日志文件查找出來具體做法是:先切換到根目錄下,然後以根用戶(root)身份執行下面這條命令把最近被修改過的文件全部找出來:
find . -type f -mtime -5 –print | grep -v proc | grep -v lock
2、搜索日志文件時的策略
日志文件分析工作中的第一個挑戰是把異常活動從正常活動中識別出來。完成這項挑戰的前提是你必須知道系統和網絡上的正常活動在日志文件裡是什麼樣子。如果沒有事先積累的經驗,很難知道按規律發生的事件在日志文件裡的表現。熟悉正常的日志文件活動要有一個時間過程,要求大家一上來就把日志文件看明白顯然不現實,這是一個需要時間積累的過程。
要知道,隨著網絡上的應用程序和用戶的數量不斷增減和變化,日志文件的內容肯定會發生相應的改變。把異常情況孤立出來之後,接下來的步驟是正確地判斷這種異常情況是否屬於警報條件。要想正確地做出判斷,只能通過加深對公司日常活動的了解才能做到。往往需要在系統的可用性與防范風險之間把握一種平衡。
3、以手動方式搜索日志文件
grep是Unix系統上功能最強大的shell命令之一。利用grep命令在日志文件裡搜索各種可疑線索是這個文本文件搜索命令的絕佳用途。grep命令的用法很簡單——在命令行上輸入:
grep "failed" /var/log/messages
上面這條grep命令將把/var/log/messages文件裡包含單詞“failed”的文本行全部找出來。在默認情況下,grep命令是大小寫敏感的,你可能需要根據具體情況使用grep命令和它的“-i”選項來進行對大小寫不敏感的搜索。搜索日志文件的挑戰之一是你必須先知道自己想找什麼東西,然後才可以把可能存在的這個東西找出來。有幾種辦法可以幫助解決這一問題。
如果你知道自己想找的事件或活動——比如,用戶試圖使用su命令切換為根用戶——可以先自己進行一次這樣的活動,然後去日志文件裡看看它是什麼樣子。比如,在SUSE Linux系統上,執行失敗的su命令將在日志文件裡留下這樣一條記錄:
Apr 1 11:15:54 chim su: FAILED SU (to root) rreck on /dev/pts/1
於是,如果想把所有這類活動都查出來,應該使用下面這樣的命令:
grep "FAILED SU" /var/log/messages
上面示例裡的活動是黑客攻擊的一種標志。如果grep命令只在日志文件裡零零散散地找到了幾個這樣的失敗事件,那很可能是有人忘記了口令字或者是打字時出現了錯誤。反之,如果grep命令在日志文件裡找到幾十個這樣的失敗事件,很可能是有人在試圖闖入你的系統,應該立刻采取措施在網絡級拒絕他們的訪問。
4、使用logsurfer工具搜索日志文件
logsurfer是一個日志文件搜索工具。與swatch等日志搜索工具相比,logsurfer允許人們做出更細致的決定。與其他日志搜索程序相似,logsurfer工具也是把日志文件裡的每一行與一些規則表達式進行匹配,每找到一個匹配就相應地執行某個動作,而那些動作被表達為“規則”。logsurfer工具在某些方面比swatch工具做得還要好。
首先,logsurfer工具使用兩組規則表達式匹配文本行;日志文件中的文本行必須匹配第一組表達式,但不需要匹配可選的第二組表達式。這種安排在某些場合非常有用,它可以讓人們方便地排除異常情況。logsurfer工具的另外一個突出優點是它可以結合上下文進行檢查而不是只檢查單個的文本行。這很方便,因為日志文件裡的單獨一行文本往往不足以包含做出某個決定所需要的信息。
要說不足,不少人認為logsurfer工具比較難以配置,因為對它進行配置必須精通規則表達式,而且它本身提供的配置示例不夠多。如果想了解更多關於logsurfer工具的信息,它的man文檔是最好的地方。列在表1裡的細節都可以在這個工具的man文檔裡查到。logsurfer配置文件裡的每
一行可以是以下三種情況之一:如果第一個字符是“#”,它是一個注釋行;如果第一個字符是空格,它是上一行的繼續;如果第一個字符既不是“#”也不是空格,它是一條新規則的開始。每條新規則由六個必要字段(第1、2、3、4、5、7字段)和一個可選字段(第6字段)組成,對這七個字段的詳細解釋見表1。
表1 logsurfer配置行上的各個字段
字段編號
是否是可選
字段名
字段解釋
1
必要
match_regex
“字段1”被解釋為一個規則表達式。如果文本行匹配“字段1”(match_regex),按後續各項定義依次處理;如果不匹配,logsurfer將用下一條規則匹配這個文本行,本規則後續各項定義不起作用
2
必要或-
not_match_regex
這個字段將被解釋為一個規則表達式。用“字段1”(match_regex)匹配到的文本行只有在不匹配“字段2”(not_match_regex)的情況下才繼續按後續各項定義依次處理
3
必要或-
stop_regex
如果不是減號(-)字符,本字段將被解釋為一個規則表達式。如果這個表達式得到匹配,本規則將從活躍規則表裡被刪除
4
必要或-
not_stop_regex
如果不是減號(-)字符,本字段將被解釋為一個規則表達式。只有在“字段3”(stop_regex)存在且已得到匹配和“字段4”(not_stop_regex)不匹配的情況下才刪除這個規則
5
必要或0
timeout
以秒計算logsurfer規則的壽命,把“字段5”設置為0表示規則永遠有效
6
可選
Continue
如果這個字段被設置為“continue”,logsurfer將繼續使用下一條規則來匹配文本行;如果沒有“continue”,後續的規則將全部被跳過
7
必要
Action
以下幾種動作之一:ignore、exec、pipe、open、delete、report、rule
表2 logsurfer動作解釋
動作名稱
解釋
Ignore
什麼都不做,忽略被匹配到的文本行。有時候,雖然用logsurfer工具找到了一些日志文本行,但如果知道它們並不重要,可以用這個動作不讓logsurfer發出警報
exec
這個動作的參數被解釋為一個程序,規則得到匹配時logsurfer將調用該程序
pipe
類似於exec動作,但被調用的程序將從stdin設備讀入一個日志文本行
open
增加(打開)一個新的上下文,但在匹配match_regex(“字段1”)時已經存在的上下文就不必再次打開了
Delete
如果一個現已存在的match_regex被用做這個動作的參數,指定的上下文將被關閉並刪除,而且不采取“default_action”選項定義的默認動作
report
這個動作的第1個參數是一個將被調用執行的程序(及其命令行選項)。隨後的參數是一些將被用做該程序的標准輸入的上下文定義
Rule
這個動作將創建一條新規則。關鍵字“rule”的後面必須有一個告訴logsurfer按什麼順序使用新規則的指示符:before(在本規則之前使用)、behind(在本規則之後使用)、top(在本配置文件所有規則之前使用)、bottom(在本配置文件所有規則之後使用)
5、使用swatch工具搜索日志文件
swatch工具不是Red Hat Enterprise Linux發行版本的標准組成部分,但因為swatch工具很容易安裝、配置和使用,所以你應該考慮下載並安裝它。在開始使用它之前,還需要一個配置文件。在默認情況下,swatch工具將在啟動它的那個用戶的登錄子目錄裡尋找.swatchrc文件(例如/home/rreck/.swatchrc),但你可以用“-f”選項為它另外指定一個配置文件,如下所示:
swatch –f /etc/.swatchrc
接下來,看看如何使用swatch工具從日志文件裡發現黑客活動的蹤跡以及發現之後該做些什麼。
◆修改swatch配置以監測針對Apache的攻擊
下面這個例子裡的攻擊手段是一種真實存在的攻擊手段,我們來看看它會在日志文件裡留下怎樣的蹤跡以及在發現這些蹤跡後如何修改系統配置加以防御。在過去,因為mod_userdir模塊(一個默認的Apache模塊)的缺陷和它的默認配置,Apache的HTTP服務器經常受到攻擊,攻擊者可以用一種能掃描遠程主機的程序獲得遠程主機上的某些用戶賬戶信息。
該工具先檢查是不是Apache,再檢查它是不是有安防漏洞的那個版本,如果是,它將自動地使用很多常見的用戶賬戶去試探目標系統。這種掃描非常快,根據網絡連接和服務器的速度,掃描一個賬戶有時候不用一秒鐘。掃描出來的用戶信息將被黑客用來攻擊FTP等其他系統服務,因為黑客已經確切地知道那些用戶賬戶是存在的。這種攻擊將在Apache的access_log日志裡留下大量的事件記錄。如果黑客試測的用戶賬戶不存在,會在日志裡留下404出錯信息。
如果黑客試測的用戶賬戶存在但不允許訪問,會在日志裡留下403出錯信息。除了進入日志文件,這些出錯信息還將返回到攻擊者那裡,這正是攻擊者希望的。攻擊者只對403出錯信息感興趣——導致403出錯信息的賬戶在目標系統上是存在的,黑客可以針對這些賬戶發動下一步攻擊。把下面幾行代碼添加到用swatch工具檢查Apache日志文件時使用的.swatchrc文件裡,就可以通過電子郵件知道哪些賬戶最有可能成為上述攻擊手段的受害者:
#Apache403errors
watchfor/403/
echo
bell
偶爾出現一條403出錯信息沒有關系,但如果在幾秒之內連續出現許多403出錯信息,就應該知道必須采取行動了。因為403出錯不是一種經常發生的事情,定期進行搜索就可以。比如,如果打算安排swatch工具在每晚0點5分對Apache日志文件進行一次檢查,可以在根用戶的crontab文件裡增加一項如下所示的計劃任務:
5 0 * * * --config-file=swatchrc.apache swatch --examine-file=/var/log/httpd/access_log
最保險的做法是把swatch運行為一個守護進程或讓它運行在“tail”模式下,這可以讓你在事情發生的時候立刻收到swatch發來的警報。可以用下面這條命令達到這個目的:
swatch --config-file=swatchrc.apache --tail-file=/var/log/httpd/access_log
一旦確認攻擊正在發生,應該立刻采取補救措施:在Apache的配置文件/etc/httpd/httpd.conf文件裡增加和修改幾條配置指令,然後用命令重新啟動Apache守護進程。修改Apache配置文件的具體辦法有兩種。第一種辦法是先全局禁用UserDir指令,再把需要激活的用戶賬戶激活,如下所示:
UserDir disabled
UserDirenabled user1 user2 user3
第二種是先全局激活UserDir指令,再把不想讓外界知道的用戶賬戶禁用掉,如下所示:
UserDir enabled
UserDir disabled user4 user5 user6
◆修改swatch配置以監測針對SSH守護進程的攻擊
通過掃描日志文件及時掌握系統安全狀況有重要意義。日志的作用只有通過人們對日志信息的運用才能真正體現出來。在設法弄到系統上的一個用戶名後,黑客就可以發動“暴力”攻擊了,這是一種通過SSH服務試測幾千個口令字以期獲得遠程系統shell訪問權限的攻擊手段。這種暴力攻擊會在系統(Red Hat)的日志裡留下記錄類似下面這樣:
Jun 6 13:01:56 chim sshd(pam_unix)[17331]: authentication failure; logname= uid=0 euid=0 tty=NODEVssh ruser= rhost=192.168.1.199 user=rreck
Jun 6 13:02:01 chim sshd[17331]: Failed password for rreck from 192.168.1.199 port 33181 ssh2
Jun 6 13:02:03 chim sshd[17331]: Failed password for rreck from 192.168.1.199 port 33181 ssh2
Jun 6 13:02:03 chim sshd(pam_unix)[17331]: 2 more authentication failures; logname= uid=0 euid=0 tty=NODEVssh ruser= rhost=192.168.1.199
user=rreck
讓自己盡早獲知這些事情正在發生是防范這類攻擊最有效的策略。為了做到這一點,需要把一段下面這樣的swatch配置代碼添加到系統的swatchrc文件裡:
# Failed password
watchfor / Failed password for /
echo
bell
此後,當swatch以cron計劃任務或以“tail”模式運行時,如果在日志文件裡發現這種攻擊的特征,就會立刻通過電子郵件向你發出警報。這種電子郵件警報是有行動信號。根據你的具體情況,你或許需要允許rreck用戶從多個主機登錄。編輯/etc/ssh/sshd_config文件,下面給出的配置代碼將明確地拒絕rreck用戶從已發生多次試測口令字失敗活動的主機進行登錄,但同時允許rreck從其他主機登錄:
# Prevent access for hacker even if they guess the password !
DenyUsers [email protected]
AllowUsers rreck@*
接下來,向sshd發出一個SIGHUP信號或者用下面這條命令重新啟動它:
/etc/rc.d/sshd restart
當你在/var/log/messages文件裡看到sshd發來的如下消息時,就可以知道你做的修改已經生效,攻擊者的登錄企圖已經被sshd拒絕了:
Apr 1 17:42:55 linux sshd[5864]: User rreck not allowed because listed in DenyUsers
這條日志消息表示,即使猜到了正確的口令字,rreck用戶也不能登錄。從黑客那邊看,沒有任何東西可以讓他知道你已經改變了配置,他們怎麼努力也不可能得逞。
總結:筆者想通過這個例子告訴大家,信息安全工作沒有盡頭;它需要長期持久的努力。降低或者消除風險的最佳辦法是保持勤奮和警惕。一定要密切留意日志,一定要不斷總結系統上各種正常活動的規律。必須時刻保持警惕並認真解讀日志消息的含義,只有常備不懈,才能保證安全。對日志進行監控可以幫助你及時發現問題並指導你對有關配置做出針對性的修改。
說到最後,最好的安全防御措施就是采取行動。在事情發生之前把一切可以采取的措施都考慮周全會對今後產生極大的幫助,這將保證你在采取行動前不會浪費任何時間。提前做好安排還有助於避免在事情發生時的情緒化因素干擾你的判斷和思考,保證你對事件做出的反應是在力所能及的范圍內最合理有效的。