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

# 目的
クラッカー（悪意のあるハッカー）によりサーバーに入られて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
```

<font color="red">※下記はテスト実行のため、「CHKROOTKIT=\`grep INFECTED \$TMPLOG\`」を「CHKROOTKIT=\`grep infected \$TMPLOG\`」に変更して実行した結果です。</font>

```メールの内容.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"`

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

# 参考サイト
- 【自宅サーバ構築記録】サーバを外部にさらすまえに…セキュリティ！
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%81

- rootkit検知ツール導入(chkrootkit)
https://centossrv.com/chkrootkit.shtml

- メールを送信するシェルスクリプト
http://qiita.com/tiida26/items/3a2486a75132e159e4ea

ありがとうございます！