LoginSignup
2
4

More than 5 years have passed since last update.

メールを送信するシェルスクリプト&関数への引数で困ったこと

Posted at

目的

クラッカー(悪意のあるハッカー)によりサーバーに入られてrootkitを置かれた事を検知するための
chkrootkitを導入して、シェルスクリプトを作り、cronで定期的に実行してセキュリティを少しでも高めたい。

が・・・シェルスクリプト・・・だめっ・・・!!

メールの件名が文字化けするっ・・・!!
関数へ渡した引数がぶっ壊れるっ・・・!!

環境

  • CentOS6.5
  • postfix、nkf導入済み
  • bash

忙しい人向け

結果的に、これでうまくいきました。
chkrootkit以外にも諸々チェックしたいので、
その場合には都度関数を追加してメール送信部分だけ下記の関数を使いまわすイメージ。

server_check.sh
#!/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`」に変更して実行した結果です。

メールの内容.txt

件名:【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さん使用)

下記で送信件名が文字化けしてしまうっ・・・!!

参考サイトより引用.sh
#!/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つの値を渡したのに分割されて渡されちゃってるっぽいぞっ・・・!!

server_check.sh
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"

こういう単純なミスがバグを生むわけですな・・・気をつけよう。

参考サイト

ありがとうございます!

2
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
4