級別: 入門 晉亮, 網路安全工程師,
2003 年 1 月 09 日 我們主要講一下Linux環境中的系統紀錄和系統日誌管理以及怎麼用一些工具更加方便有效的管理日誌訊息。
當我們用上面的方法進行了 Linux 伺服器的安裝和一些基本的設置後,我們的伺服器應該說來是比較安全的。但是總是還會有駭客可以通過各種方法利用系統管理員的疏忽侵入我們的系統。他們的一舉一動都會記錄到系統的日誌之中,儘管他們可能可以改變這些日誌資訊,甚至用自己的程式替換掉我們系統本身的命令程式,但是通過日誌我們總還是能找到一些蛛絲馬跡。下面我們主要講一下 Linux 環境中的系統紀錄和系統日誌管理以及怎麼用一些工具更加方便有效的管理日誌資訊。
1 系統紀錄
最初開發的系統紀錄用於跟蹤用戶資源消費情況,從用戶帳號中提取費用為目的。現在我們可以把它用於安全目的,給我們提供有關在系統中發生的各種活動的有價值資訊。
系統紀錄主要非為兩類:
1) 連接紀錄
連接紀錄是跟蹤當前用戶當前對話、用戶登入和退出的活動。在 Linux 系統中使用 utmp (動態用戶對話)和 wtmp(登入/退出日誌記錄)工具來完成這一紀錄過程。Wtmp 工具同時維護重新引導和系統狀態變化資訊。各種程式對這些工具進行刷新和維護,因此無須進行特殊的後臺進程或程式。然而,utmp 和 wtmp輸出結果檔案必須存在,如果這些檔不存在會關閉連接紀錄。與 utmp 和 wtmp 有關的所有資料將分別保存在 /var/run/utmp 和 /var/log/wtmp中。這些檔歸根用戶所有。這些檔中的資料是用戶不可讀的,但也有工具可以轉換成可讀的形式。
dump-utmp 可以轉換連接紀錄資料為可讀的 ASCII 格式資料。
ac 命令提供了有關用戶連接的大概統計,我們可以使用帶有標誌 d 和 p 的 ac 命令。標誌 d 顯示了一天的總連接統計,標誌 p 顯示了每一個用戶的連接時間。這種統計資訊的方式對瞭解與探測入侵有關的用戶情況及其他活動很有幫助。Last 和 who 是出於安全角度定期使用的最常用命令。
last 命令提供每一個用戶的登入時間,退出登入時間,登入位置,重新引導系統及運行級別變化的資訊。last -10 表示 last 的最多輸出結果為最近的 10 條資訊。預設時 last 將列出在 /var/log/wtmp 中記錄的每一連接和運行級別的變化。從安全角度考慮,last 命令提供了迅速查看特定系統連接活動的一種方式。觀察每天的輸出結果是個好習慣,從中可以捕獲異常輸入項。Last 命令的 -x 選項可以通知系統運行級別的變化。
who 命令主要作用是報告目前正在登入的用戶、登入設備、遠端登入主機名或使用的 Xwindows 的 X 顯示值、會話閒置時間以及會話是否接受 write 或 talk 信息。
例如: who -iwH 的輸出結果:
USER MESG LINE LOGIN-TIME IDLE FROM
Denny - tty1 Feb 18 08:42 old
這就表示用戶 Denny 不能接受 write 或 talk 資訊,2月18日8:42 從 tty1 登入。該命令的安全值提供了用戶連接的大致情況,這也為監視可疑活動提供了條件。 其他的有關命令有 lastlog 命令,該命令報告了有關 /var/log/lastlog 中記錄的最後一次登入的資料資訊。
2) 進程紀錄
進程紀錄是對進程活動的記錄。原資料保存在 /var/log/pacct 檔中,其許可權為 600。該檔的存在是進程紀錄有效的保障。與連接紀錄不同,進程紀錄必須處於打開狀態,使用下面的命令設置打開狀態.
# accton /var/log/pacct
可以使用自選檔代替 /var/log/pacct,但必須記住這一檔並且設置適當的許可許可權。必須在每次引導的時候執行該命令,可以在 /etc/rc.d/rc.local 中輸入以下指令碼:
# initiate process account
if [ -x /sbin/accton ]
then
/sbin/accton /var/log/pacct
echo "process accounting initiated"
fi
一旦在系統中配置進程紀錄後,將使用 3 個命令解釋在 /var/log/pacct 中的非用戶可讀的原資料。這些命令分別為 dump-acct,該命令與 dump-utmp 完全相似,sa 命令用於統計系統進程紀錄的大致情況,最後一個是 lastcomm 命令列出了系統執行的命令。
1 sa 命令
與 ac 命令一樣,sa 是一個統計命令。該命令可以獲得每個用戶或每個命令的進程使用的大致情況,並且提供了系統資源的消費資訊。在很大程度上,sa 又是一個紀錄命令,對於識別特殊用戶,特別是已知特殊用戶使用的可疑命令十分有用。另外,由於信息量很大,需要處理指令碼或程式篩選這些資訊。
可以用這樣的命令單獨限制用戶:
# sa -u |grep joe
joe 0.00 cpu bash
joe 0.00 cpu ls
joe 0.01 cpu ls
joe 0.01 cpu lastcomm
joe 0.01 cpu tcpdump
joe 0.01 cpu reboot
輸出結果從左到右依次為:用戶名、CPU 使用時間秒數、命令(最多為 16 個字元)。
2 lastcomm 命令
與 sa 命令不同,lastcomm 命令提供每一個命令的輸出結果,同時列印出與執行每個命令有關的時間印戳。就這一點而說,lastcomm 比sa 更有安全性。
lastcomm 命令使用命令名,用戶名或終端名作為變數。該命令可以查詢進程紀錄資料庫。下面顯示 lastcomm joe 的輸出結果,每行表示命令的執行情況,從左到右為:用戶、設備、使用的 cpu 時間秒數、執行命令的日期和時間。
# lastcomm joe
reboot joe ttyp1 0.01 secs Fri Feb 26 18:40
tcpdump joe ttyp1 0.01 secs Fri Feb 26 18:39
lastcomm joe ttyp1 0.01 secs Fri Feb 26 18:32
ls joe ttyp1 0.01 secs Fri Feb 26 18:30
ls joe ttyp1 0.00 secs Fri Feb 26 18:28
bash joe ttyp1 0.00 secs Fri Feb 26 18:25
如果系統被入侵,請不要相信在 lastlog、utmp、wtmp、pacct中記錄的資訊,但也不要忽略,因為這些資訊可能被修改過了。另外有可能有人替換了who程式來掩人耳目。
通常,在已經識別某些可疑活動後,進程紀錄可以有效的發揮作用。使用 lastcomm可以隔絕用戶活動或在特定時間執行命令。但是使用該命令必須設置為打開狀態。
基本上,/var/log/pacct,/var/run/utmp, /var/log/pacct是動態資料庫檔。其中/var/log/pacct和/var/log/wtmp檔隨著輸入項的增加和修改而增加。問題在於這些檔處於動態增加狀態,因此到一定程度就會變的很大。
我們可以通過一個叫 logrotate 的程式來解決上面這個問題,該程式讀 /etc/logrotate.conf 配置檔,該配置檔告訴 logrotate 所要讀 /etc/logrotate.d 目錄中的檔。可以通過它來設定日誌檔的迴圈時間。
2 系統日誌
在 Linux 下使用各種日誌檔,有些用於某些特殊用途,例如:/var/log/xferlog 用於記錄檔傳輸協定 FTP 的信息。其他日誌檔,例如 /var/log/messages 檔通常包含許多系統和內核工具的輸入項。這些日誌檔為系統的安全狀態提供了資訊。
我們主要講解兩個日誌守護程式---syslog和klogd------並且簡要敘述了由Linux作業系統生成的其他其他日誌檔。目的是提供基本的配置情況。
2.1 syslog系統日誌工具
大部分的 Linux 系統中都要使用 syslog 工具,它是相當靈活的,能使系統根據不同的日誌輸入項採取不同的活動。下面將詳細討論syslog 的工作機制以及在配置檔 /etc/syslog.conf 中的配置,還將論述利用 syslog 靈活性和功能性進行工作的各種方法。
1) 概述
非常簡單,syslog 工具由一個守護程式組成。它能接受存取系統的日誌資訊並且根據 /etc/syslog.conf 配置檔中的指令處理這些資訊。程式,守護進程和內核提供了存取系統的日誌資訊。因此,任何希望生成日誌資訊的程式都可以向 syslog 介面呼叫生成該資訊。
通常,syslog 接受來自系統的各種功能的資訊,每個資訊都包括重要級。/etc/syslog.conf 文件通知 syslogd 如何根據設備和資訊重要級別來報告資訊。
2) etc/syslog.conf
/etc/syslog.conf 檔使用下面的形式
facility.level action
空白行和以#開頭的行可以忽略。Facility.level 欄位也被稱做 seletor。應該使用一次或多次 tab 鍵分隔 facility 和 action。大部分 Linux 使用這些空格為分隔符號。現在分析一下 /etc/syslog.conf 中的三個要素。
facility 指定 syslog 功能,主要包括以下這些:
auth 由 pam_pwdb 報告的認證活動。
authpriv 包括特權資訊如用戶名在內的認證活動
cron 與 cron 和 at 有關的資訊。
daemon 與 inetd 守護進程有關的資訊。
kern 內核資訊,首先通過 klogd 傳遞。
lpr 與列印服務有關的信息。
mail 與電子郵件有關的資訊
mark syslog 內部功能用於生成時間戳
news 來自新聞伺服器的資訊
syslog 由 syslog 生成的資訊
user 由用戶程式生成的資訊
uucp 由 uucp 生成的資訊
local0----local7 與自定義程式使用,例如使用 local5 做為 ssh 功能
* 萬用字元代表除了 mark 以外的所有功能
與每個功能對應的優先順序是按一定順序排列的,emerg 是最高級,其次是 alert,依次類推。預設時,在 /etc/syslog.conf 記錄中指定的級別為該級別和更高級別。如果希望使用確定的級別可以使用兩個運算符號!(不等)和=。
user.=info
表示告知 syslog 接受所有在 info 級別上的 user 功能資訊。
syslog 級別如下:
emerg 或 panic 該系統不可用
alert 需要立即被修改的條件
crit 阻止某些工具或子系統功能實現的錯誤條件
err 阻止工具或某些子系統部分功能實現的錯誤條件
warning 預警信息
notice 具有重要性的普通條件
info 提供資訊的消息
debug 不包含函數條件或問題的其他資訊
none 沒有重要級,通常用於排錯
* 所有級別,除了none
action欄位所表示的活動具有許多靈活性,特別是,可以使用名稱管道的作用是可以使 syslogd 生成後處理資訊。
syslog 主要支援以下活動
file 指定檔案的絕對路徑
terminal 或 print 完全的串列或並行設備標誌字元
@host 遠端的日誌伺服器
username 發送資訊到使用 write 的指定用戶中
named pipe 指定使用 mkfifo 命令來建立的 FIFO 檔的絕對路徑。
3) 呼叫 syslogd 守護程式
syslog 守護程式是由 /etc/rc.d/init.d/syslog 指令碼在運行級2下被呼叫的,預設不使用選項。但有兩個選項 -r 和 -h 很有用。
如果將要使用一個日誌伺服器,必須呼叫 syslogd -r。預設情況下 syslog 不接受來自遠端系統的資訊。當指定 -r 選項,syslogd 將會監聽從 514 埠上進來的 UDP 封包。
如果還希望日誌伺服器能傳送日誌資訊,可以使用 -h 標誌。預設時,syslogd 將忽略使其從一個遠端系統傳送日誌資訊到另一個系統的/etc/syslog.conf 輸入項。
4) klogd 守護進程
klogd 守護進程獲得並記錄 Linux 內核資訊。通常,syslogd 會記錄 klogd 傳來的所有資訊,然而,如果呼叫帶有 -f filename 變數的 klogd 時,klogd 就在 filename 中記錄所有資訊,而不是傳給 syslogd。當指定另外一個檔進行日誌記錄時,klogd 就向該檔中寫入所有級別或優先權。Klogd 中沒有和 /etc/syslog.conf 類似的配置檔。使用 klogd 而避免使用 syslogd 的好處在於可以查找大量錯誤。如果有人入侵了內核,使用 klogd 可以修改錯誤。
5) 其他日誌
在 /var/log 和不同版本的系統中以及自己配置的應用程式中都可以找到其他日誌檔。當然,/etc/syslog.conf 列出了由 syslogd 管理的所有日誌檔案名和位置。其他日誌由其他應用程式管理。例如在 Redhat6.2 中,apache server 生成 /var/log/htmlaccess.log 檔記錄客戶存取,生成 /var/log/httpd/error.log 檔在 syslog 以外查找錯誤。
cron 工具維護的資訊日誌檔 /var/log/cron。當 Linuxconf 工具記錄系統重新配置資訊時,將生成日誌檔如 /var/log/nerconf.log。samba 在 /var/log/samba 中維護其日誌資訊。
另外由於 syslogd 在系統非常繁忙時,可能會丟掉信息,所以,可以用 cyclog 替換 syslog。Cyclog 緩存日誌資訊並確保日誌檔是同步的,並且自動交替迴圈其管理的日誌檔,可到參見下面 ftp。
ftp://koobera.math.uic.edu/www/daemontools.html
參考資料
關於作者
對本文的評價
|