目的
クラッカー(悪意のあるハッカー)によりサーバーに入られてrootkitを置かれた事を検知するための
chkrootkitを導入して、シェルスクリプトを作り、cronで定期的に実行してセキュリティを少しでも高めたい。
が・・・シェルスクリプト・・・だめっ・・・!!
メールの件名が文字化けするっ・・・!!
関数へ渡した引数がぶっ壊れるっ・・・!!
環境
- CentOS6.5
- postfix、nkf導入済み
- bash
忙しい人向け
結果的に、これでうまくいきました。
chkrootkit以外にも諸々チェックしたいので、
その場合には都度関数を追加してメール送信部分だけ下記の関数を使いまわすイメージ。
#!/bin/bash
#--------------------------------
#
# 環境変数
#
#--------------------------------
# 実行日時
DATE=`date +'%Y/%m/%d %H:%M:%S'`
# 宛先メールアドレス
MAIL_TO="ore@mail.com"
# 送信元メールアドレス
MAIL_FROM="noreply@mail.com"
#--------------------------------
#
# 関数定義
#
#--------------------------------
#********************************
# メール送信処理
# @param1($1) : メールの件名
# @param2($2) : 実行プログラム名
# @param3($3) : 実行結果
#********************************
mail_send () {
cat << EOD | nkf -j -m0 | sendmail -t
From: ${MAIL_FROM}
To: ${MAIL_TO}
Subject: ${1}
MIME-Version: 1.0
Content-Type: text/plain; charset="ISO-2022-JP"
Content-Transfer-Encoding: 7bit
実行日時:${DATE}
・${2}
${3}
EOD
}
#********************************
# chkrootkitの実行
#********************************
exec_chkrootkit() {
# chkrootkit実行ログ
TMPLOG=`mktemp`
chkrootkit > $TMPLOG
# SMTPSのbindshell誤検知対応
if [ ! -z "$(grep 465 $TMPLOG)" ] && \
[ -z $(/usr/sbin/lsof -i:465|grep bindshell) ]; then
sed -i '/465/d' $TMPLOG
fi
# upstartパッケージ更新時のSuckit誤検知対応
if [ ! -z "$(grep Suckit $TMPLOG)" ] && \
[ -z "$(rpm -V `rpm -qf /sbin/init`)" ]; then
sed -i '/Suckit/d' $TMPLOG
fi
# 問題がある場合にはメール通知
CHKROOTKIT=`grep INFECTED $TMPLOG`
if [ ! -z "$CHKROOTKIT" ]; then
MAIL_TITLE=`echo -n "【server_check】chkrootkitに問題発生" | base64 | tr -d '\n' | xargs printf '=?UTF-8?B?%s?=\n'`
mail_send "$MAIL_TITLE" 'chkrootkit' "$CHKROOTKIT"
fi
}
#--------------------------------
#
# 処理
#
#--------------------------------
exec_chkrootkit
exit 0
※下記はテスト実行のため、「CHKROOTKIT=`grep INFECTED \$TMPLOG`」を「CHKROOTKIT=`grep infected \$TMPLOG`」に変更して実行した結果です。
件名:【server_check】chkrootkitに問題発生
本文:
実行日時:2017/02/02 23:03:45
・chkrootkit
Checking `basename'... not infected
Checking `chfn'... not infected
Checking `chsh'... not infected
Checking `cron'... not infected
Checking `crontab'... not infected
Checking `date'... not infected
Checking `du'... not infected
Checking `dirname'... not infected
Checking `echo'... not infected
Checking `egrep'... not infected
Checking `env'... not infected
Checking `find'... not infected
Checking `grep'... not infected
Checking `hdparm'... not infected
Checking `su'... not infected
Checking `ifconfig'... not infected
Checking `init'... not infected
Checking `killall'... not infected
Checking `ldsopreload'... not infected
Checking `login'... not infected
Checking `ls'... not infected
Checking `lsof'... not infected
Checking `mail'... not infected
Checking `mingetty'... not infected
Checking `netstat'... not infected
Checking `passwd'... not infected
Checking `pidof'... not infected
Checking `ps'... not infected
Checking `pstree'... not infected
Checking `slogin'... not infected
Checking `sendmail'... not infected
Checking `sshd'... not infected
Checking `tar'... not infected
Checking `tcpd'... not infected
Checking `tcpdump'... not infected
Checking `top'... not infected
Checking `traceroute'... not infected
Checking `vdir'... not infected
Checking `w'... not infected
Checking `write'... not infected
Checking `asp'... not infected
Checking `bindshell'... not infected
Checking `w55808'... not infected
Checking `scalper'... not infected
Checking `slapper'... not infected
Checking `OSX_RSPLUG'... not infected
問題1
- メールの送信件名、本文を日本語で送りたいのにうまくいかないっ・・・!!
送信件名は日本語だけど本文が文字化けしたり、
本文は文字化けしないけど件名は文字化けしたりするっ・・・!!(Thunderbirdさん使用)
例
下記で送信件名が文字化けしてしまうっ・・・!!
#!/bin/bash
export PATH=$PATH:/usr/sbin
MAIL_TO="ore@gmail.com"
MAIL_FROM="noreply@hogehoge.com"
SUBJECT="メールテスト"
DATA="データ"
mail_send () {
cat << EOD | nkf -j -m0 | sendmail -t
From: ${MAIL_FROM}
To: ${MAIL_TO}
Subject: ${SUBJECT}
MIME-Version: 1.0
Content-Type: text/plain; charset="ISO-2022-JP"
Content-Transfer-Encoding: 7bit
メールが送信されます。
ここに${DATA}が入るよ。
EOD
}
mail_send
exit 0
解決策
メールの件名を色々パイプでつなげる
MAIL_TITLE=`echo -n "【server_check】chkrootkitに問題発生" | base64 | tr -d '\n' | xargs printf '=?UTF-8?B?%s?=\n'`
「tr -d '\n'」←これが無いとbase64後の文字列に
XQ==
とかいうゴミ文字列とその直前の改行コードが色々悪さをしてしまうので注意。
問題2
- 関数への引数がなんかおかしいっ・・・!!
3つの値を渡したのに分割されて渡されちゃってるっぽいぞっ・・・!!
例
mail_send () {
echo $1
echo $2
echo $3
}
exec_chkrootkit() {
CHKROOTKIT=`grep INFECTED $TMPLOG`
MAIL_TITLE=`echo -n "【server_check】chkrootkitに問題発生 [192.168.11.11]" | base64 | xargs printf '=?UTF-8?B?%s?=\n'`
mail_send $MAIL_TITLE 'chkrootkit' $CHKROOTKIT
}
exec_chkrootkit
これを実行するとmail_send()の中で実行した引数3つが、意図したものと違うものが出てきてしまった。
解決策
- 「chkrootkitに問題発生 [192.168.11.11]」カッコの前に半角スペースがあったせいで引数が2つ扱いにされたからスペース削除
- そもそも引数に文字列渡すならダブルクオーテーションで囲まんとあかんでしょ
mail_send $MAIL_TITLE 'chkrootkit' $CHKROOTKIT
↓
mail_send "$MAIL_TITLE" 'chkrootkit' "$CHKROOTKIT"
こういう単純なミスがバグを生むわけですな・・・気をつけよう。
参考サイト
【自宅サーバ構築記録】サーバを外部にさらすまえに…セキュリティ!
http://blue-goheimochi.hatenablog.com/entry/2013/07/17/%E3%82%B5%E3%83%BC%E3%83%90%E3%82%92%E5%A4%96%E9%83%A8%E3%81%AB%E3%81%95%E3%82%89%E3%81%99%E3%81%BE%E3%81%88%E3%81%AB%E2%80%A6%E3%82%BB%E3%82%AD%E3%83%A5%E3%83%AA%E3%83%86%E3%82%A3%EF%BC%81rootkit検知ツール導入(chkrootkit)
https://centossrv.com/chkrootkit.shtmlメールを送信するシェルスクリプト
http://qiita.com/tiida26/items/3a2486a75132e159e4ea
ありがとうございます!