為了偵測 FreeBSD 系統中的重要文件變動,之前是利用 md5 產生目錄下每個文件的 md5 值,然後在對這個文件的 md5 做偵測,如果有異常再比對看看那個文件有變動。不過最近知道 mtree 這個程式可以達到這個功能,而且可以選用 SHA256 的編碼方式。而且因為其有散列計算以及權限對比等能力,將其作為一個文件系統完整性審計工具也是剛好。另外還有一個很重要的原因是這個工具為基本發行版所附帶,也可以使用 rescue CD 裡的這個工具,還有它依賴的運行庫也是非常之少,甚至臨時從其他系統複製一個來用也完全可以(參考網站)。
產生比對的標準文件(產生 /etc/ 下的標準文件到 mtree-etc.txt):
mtree -c -K sha256digest -p /etc/ > mtree-etc.txt -c:產生標準文件(Print a specification for the file hierarchy to the standard output) -K:選擇 keyword(可以選擇 cksum、md5、SHA-256...等) -p:指定路徑(預設為當前目錄)
標準文件內容:
# user: sample # machine: sample.com # tree: /usr/local/etc # date: Fri May 8 11:03:00 2009 # . /set type=file uid=0 gid=0 mode=0755 nlink=1 flags=none . type=dir nlink=29 size=1536 time=1240725789.0 dhcpd.conf mode=0444 size=3841 time=1234431506.0 \ sha256digest=2fa87c2d4141def184efedb16c4247f26a792d9bffd2061bc261105614e0ebe1 dhcpd.conf.sample \ mode=0444 size=3278 time=1234422795.0 \ sha256digest=dfb70484f1d3c3609710ba2ae76ee00bcd82da8e71bc42614064a25e35cacd92
比對目錄文件有無變更:
mtree -f mtree-etc.txt -K sha256digest -p /etc/ -f:讀取標準文件
如果沒有什麼變更的話,就不會有任何訊息出現。有變更的話:
test changed #/etc/test 有變動 size expected 14 found 20 #檔案大小從 14 變成 20 modification time expected Fri May 8 11:07:00 2009 found Fri May 8 11:07:08 2009 #檔案時間也有變更 SHA-256 expected 9b30a446c32404081fd1e2eb48a01fa227b7aae2b34f65036a71b31f5d9c3584 found ef460616e2b9e4ccfd5ac958c0a05f5428f03821e794a8175a018c49fb790a98 #檔案的 SHA 值的變動 xxx extra #新增了 /etc/xxx 檔案 yyy missing #/etc/yyy 檔案被刪除了
這是我放在 crontab 固定時間會去執行的 shell scipt(這樣就會在偵測到異常的時候,寄 mail 給我):
#! /bin/sh # # Use mtree to check file change script # # By denniswave # # V1.0 20090508 First Version date=`date "+%Y-%m-%d %H:%M:%S"` result1=`/usr/sbin/mtree -f /tmp/etc.txt -K sha256digest -p /etc/` result2=`/usr/sbin/mtree -f /tmp/usr.txt -K sha256digest -p /usr/local/etc/` echo "+-------------------+" >> /var/log/mtree.log echo "|$date|" >> /var/log/mtree.log echo "+-------------------+" >> /var/log/mtree.log if [ "$result1" = "" ] ; then echo "Check OK:/etc/" >> /var/log/mtree.log else echo "Check Fail:/etc/ file was changed!!" >> /var/log/mtree.log echo "$result1" >> /var/log/mtree.log echo "" >> /var/log/mtree.log echo "$date" > /tmp/tempmtree echo "$result1" >> /tmp/tempmtree mail -s "/etc 的檔案被動到了!!!" root < /tmp/tempmtree fi if [ "$result2" = "" ] ; then echo "Check OK:/usr/local/etc/" >> /var/log/mtree.log else echo "Check Fail:/usr/local/etc/ file was changed!!" >> /var/log/mtree.log echo "$result2" >> /var/log/mtree.log echo "$date" >> /tmp/tempmtree echo "$result2" >> /tmp/tempmtree mail -s "/usr/local/etc 的檔案被動到了!!!" root < /tmp/tempmtree fi echo "" >> /var/log/mtree.log
Please follow and like us: