対象サーバについて
製品名 | OpenBlockS 600 |
OS(kernel ver) | Debian lenny(2.6.29) |
CPU | 600MHz(AMCC PowerPC 405EX) |
メモリ | 1GB(DDR2 SDRAM) |
ストレージ | 8GB(Compact Flash) |
インストールと初期状態確認
# aptitude install chkrootkit
試しに一度、chkrootkitコマンドを実行してみます。
# chkrootkit ROOTDIR is `/' Checking `amd'... not found Checking `basename'... not infected Checking `biff'... not found Checking `chfn'... not infected Checking `chsh'... not infected ... # chkrootkit | grep INFECTED #
INFECTEDが出た場合、rootkitが見つかった可能性があります。
not infected は発見されなかったこと、not found はコマンドが無いこと、not testedはチェックできなかったことを意味します。
上記結果はINFECTEDが無かったので問題無しと言えます。
次にquiet mode(問題となった項目のみ表示されるモード)で実施してみます。
# /usr/sbin/chkrootkit -q The following suspicious files and directories were found: /lib/init/rw/.ramfs eth0: PACKET SNIFFER(/usr/sbin/dhcpd3[2565])
/lib/init/rw/.ramfsという疑わしいファイルがあると怒らましたが、これはバグのようなので問題無しとします。
また、eth0: PACKET SNIFFER(/usr/sbin/dhcpd3[2565])はDHCPを使っていると出るようです。
DHCPを止めたら消えましたので、上記と同じく問題無しとします。
インストール後に自動設定されたcronの確認
確認するファイル1:/etc/cron.daily/chkrootkit
#!/bin/sh -e CHKROOTKIT=/usr/sbin/chkrootkit CF=/etc/chkrootkit.conf LOG_DIR=/var/cache/chkrootkit # /usr/sbin/chkrootkitが実行可能で無ければ終了 if [ ! -x $CHKROOTKIT ]; then exit 0 fi # /etc/chkrootkit.confを読み込む if [ -f $CF ]; then . $CF fi # /etc/chkrootkit.confで定義している$RUN_DAILY="true"なら以降を実施() if [ "$RUN_DAILY" = "true" ]; then # $DIFF_MODE = "true"の場合に実施 if [ "$DIFF_MODE" = "true" ]; then # /usr/sbin/chkrootkit -q > /var/cache/chkrootkit/log.newを実施 $CHKROOTKIT $RUN_DAILY_OPTS > $LOG_DIR/log.new 2>&1 # 以下のいずれかの場合にcat /var/cache/chkrootkit/log.newが実施される。 # 1./var/cache/chkrootkit/log.oldが存在しない # 2.log.oldとlog.newが異なる場合、 if [ ! -f $LOG_DIR/log.old ] \ || ! diff -q $LOG_DIR/log.old $LOG_DIR/log.new > /dev/null 2>&1; then cat $LOG_DIR/log.new fi # log.newをlog.oldに名前変更 mv $LOG_DIR/log.new $LOG_DIR/log.old # $DIFF_MODE = "false"の場合に実施 else # $DIFF_MODE = falseの場合、/usr/sbin/chkrootkit -q のみ実施して終了 $CHKROOTKIT $RUN_DAILY_OPTS fi fi
確認するファイル2:/etc/chkrootkit.conf
RUN_DAILY="false" RUN_DAILY_OPTS="-q" DIFF_MODE="false"
→初期設定はchkrootkitを実行しないようになっています。
# ls -al /var/cache/chkrootkit/ 合計 8 drwxr-xr-x 2 root root 4096 2008-11-27 20:04 . drwxr-xr-x 9 root root 4096 2009-11-01 17:01 ..
→/etc/cron.daily/chkrootkit実行前は当然何もありません。
# /etc/cron.daily/chkrootkit # ls -al /var/cache/chkrootkit/ 合計 8 drwxr-xr-x 2 root root 4096 2008-11-27 20:04 . drwxr-xr-x 9 root root 4096 2009-11-01 17:01 ..
→/etc/chkrootkit.confにてRUN_DAILY=falseになっているため実行されません。
RUN_DAILYとDIFF_MODEをtrueに修正します。
編集するファイル:/etc/chkrootkit.conf
RUN_DAILY="true" RUN_DAILY_OPTS="-q" DIFF_MODE="true"
→falseからtrueに修正
# /etc/cron.daily/chkrootkit The following suspicious files and directories were found: /lib/init/rw/.ramfs eth0: PACKET SNIFFER(/usr/sbin/dhcpd3[2565]) # ls /var/cache/chkrootkit/ log.old # less /var/cache/chkrootkit/log.old The following suspicious files and directories were found: /lib/init/rw/.ramfs eth0: PACKET SNIFFER(/usr/sbin/dhcpd3[2565])
→想定通り、quiet modeで実行した結果がlog.oldに保存されています。
また、1回目の実施で、かつ/var/cache/chkrootkit/log.oldが存在しなかったため、catにてログが標準出力に表示されました。
INFECTEDが発見された際にメール送信されるようにcronスクリプトを変更
INFECTEDが発見されたらメールコマンドにてroot宛てにメールするようにcronスクリプトを修正します。
色々なサイトで同じスクリプトが出回っておりどのサイトが原本か分かりませんでしたが、私も右に倣えで参考にして作成しました。
修正したファイル:/etc/cron.daily/
#!/bin/sh -e CHKROOTKIT=/usr/sbin/chkrootkit CF=/etc/chkrootkit.conf LOG_DIR=/var/cache/chkrootkit if [ ! -x $CHKROOTKIT ]; then exit 0 fi if [ -f $CF ]; then . $CF fi if [ "$RUN_DAILY" = "true" ]; then if [ "$DIFF_MODE" = "true" ]; then #$CHKROOTKIT $RUN_DAILY_OPTS > $LOG_DIR/log.new 2>&1 #if [ ! -f $LOG_DIR/log.old ] \ # || ! diff -q $LOG_DIR/log.old $LOG_DIR/log.new > /dev/null 2>&1; then # cat $LOG_DIR/log.new #fi #mv $LOG_DIR/log.new $LOG_DIR/log.old # /usr/sbin/chkrootkit結果をTMPLOGに保存してlocal5.infoにてsyslogに出力 TMPLOG=`mktemp` $CHKROOTKIT > $TMPLOG 2>&1 cat $TMPLOG | logger -p local5.info # TMPLOGにINFECTEDの文字列があった場合、grep結果をrootにメール送信 [ ! -z "$(grep INFECTED $TMPLOG)" ] && \ grep INFECTED $TMPLOG | mail -s "rootkit found in `hostname`" root rm -f $TMPLOG else $CHKROOTKIT $RUN_DAILY_OPTS fi fi
→rsyslogにて必要なlocal5.info用の設定は割愛しますが忘れないように。
上記、INFECTEDの箇所を”not found”に変更して実施してみたところ、以下のように、not foundのみgrepされた結果がメールで送られていました。
tail -33 /var/mail/user001 From root@example.jp Sun Nov 01 21:41:16 2009 Return-path:Envelope-to: root@example.jp Delivery-date: Sun, 01 Nov 2009 21:41:16 +0900 Received: from root by www with local (Exim 4.69) (envelope-from ) id 1N4ZkB-0004nj-Nw for root@example.jp; Sun, 01 Nov 2009 21:41:16 +0900 To: root@example.jp Subject: chkrootkit report in www Message-Id: From: root Date: Sun, 01 Nov 2009 21:41:15 +0900 Checking `amd'... not found Checking `biff'... not found Checking `fingerd'... not found Checking `gpm'... not found Checking `hdparm'... not found Checking `identd'... not found Checking `lsof'... not found Checking `mingetty'... not found Checking `named'... not found Checking `pop2'... not found Checking `pop3'... not found Checking `rlogind'... not found Checking `rshd'... not found Checking `slogin'... not found Checking `sshd'... not found Checking `timed'... not found Checking `rexedcs'... not found
INFECTEDに書き直して終了とします。
コマンドの確保
chkrootkitで使用するコマンドが改竄された時のために、正常なコマンドを退避しておきます。
# mkdir cmd # cp `which awk cut echo egrep find head id ls netstat ps strings sed uname` cmd/ # cp -p /usr/sbin/chkrootkit ./cmd/ # cd cmd/ # ls -al 合計 1044 drwxr-xr-x 2 root root 4096 2009-11-01 23:01 . drwxr-xr-x 5 root root 4096 2009-11-01 22:55 .. -rwxr-xr-x 1 root root 117036 2009-11-01 22:55 awk -rwxr-xr-x 1 root root 78705 2008-11-27 20:03 chkrootkit -rwxr-xr-x 1 root root 30580 2009-11-01 22:55 cut -rwxr-xr-x 1 root root 18260 2009-11-01 22:55 echo -rwxr-xr-x 1 root root 108788 2009-11-01 22:55 egrep -rwxr-xr-x 1 root root 167352 2009-11-01 22:55 find -rwxr-xr-x 1 root root 32532 2009-11-01 22:55 head -rwxr-xr-x 1 root root 26508 2009-11-01 22:55 id -rwxr-xr-x 1 root root 104776 2009-11-01 22:55 ls -rwxr-xr-x 1 root root 115592 2009-11-01 22:55 netstat -rwxr-xr-x 1 root root 102380 2009-11-01 22:55 ps -rwxr-xr-x 1 root root 47844 2009-11-01 22:55 sed -rwxr-xr-x 1 root root 33224 2009-11-01 22:55 strings -rwxr-xr-x 1 root root 18264 2009-11-01 22:55 uname -rwxr-xr-x 1 root root 946 2009-11-01 22:55 which # man chkrootkit -p dir1:dir2:dirN Specify the path for the external commands used by chkrootkit. # ./chkrootkit -p ~/cmd/ ROOTDIR is `/' Checking `amd'... not found Checking `basename'... not infected Checking `biff'... not found ... # tar czvf chkrootkit.tar.gz cmd →chkrootkit.tar.gzをWindowsにダウンロードしておく。 # rm -rf cmd