[FreeBSD] mtree 檢查文件變更

為了偵測 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:

發表迴響

你的電子郵件位址並不會被公開。 必要欄位標記為 *