目次
はじめに
こんにちは、omkです。
前回はAIDEの改ざん検知の結果をCloudWatchのカスタムメトリクスにプッシュしました。
今回も引き続きAIDEの焼き直し活用方法を考えていきます。
今回は前回のシェルスクリプトを書き換えてSNSでメール通知するように変更します。
カスタムメトリクスからアラームを作成してSNSで通知でもいいのですが、こまめにカスタムメトリクスを送るとお金もかかりますし直接AWS CLIからSNSトピックを利用し、改ざんが検知されたときだけメール通知します。
前提
CentOS7のEC2インスタンスで実行します。
AIDEとAWS CLIはインストール済み、すぐに実行できるようになっています。
SNSトピックの作成手順は省略します。
スクリプト
#!/bin/bash
LOGFILE=/var/log/aide/aide.log
AIDEDIR=/var/lib/aide
SNSTOPIC=arn:aws:sns:*********:*********:***
/usr/sbin/aide -u > $LOGFILE
\cp -f $AIDEDIR/aide.db.new.gz $AIDEDIR/aide.db.gz
Difference=$(grep "Looks okay" $LOGFILE | wc -l)
if [ $Difference -eq 1 ]
then
# OK
:
else
# DETECTED
# Count
added=$(cat $LOGFILE | grep "Added files:" | sed s/[^0-9]//g)
changed=$(cat $LOGFILE | grep "Changed files:" | sed s/[^0-9]//g)
removed=$(cat $LOGFILE | grep "Removed files:" | sed s/[^0-9]//g)
# Raise
if [ $added -eq 0 ]
then
addedfiles=""
else
addedfiles=$(echo -e "\n$(cat $LOGFILE | grep 'added:')")
fi
if [ $changed -eq 0 ]
then
changedfiles=""
else
changedfiles=$(echo -e "\n$(cat $LOGFILE | grep 'changed:')")
fi
if [ $removed -eq 0 ]
then
removedfiles=""
else
removedfiles=$(echo -e "\n$(cat $LOGFILE | grep "removed:")")
fi
#MAIL
RES=$(echo -e "AIDE CHECKED\n\nAdded:$added$addedfiles\n\nChanged:$changed$changedfiles\n\nRemoved:$removed$removedfiles")
if [ $(echo $RES | wc -c) -le 100000 ]
then
# mail_size <= 100KB
aws sns publish --topic-arn "${SNSTOPIC}" --subject "WARNING: Data is Changed" --message "$RES"
else
# mail_size > 100KB
RES=$(echo -e "AIDE CHECKED\n\ncheck this -> $LOGFILE")
aws sns publish --topic-arn "${SNSTOPIC}" --subject "WARNING: Data is Changed" --message "$RES"
fi
fi
基本的な部分は前回と同じです。
まず、データの改ざんを調べてログファイルに出力、データベースを更新します。
ログファイルの内容から、改ざんがなかった場合は何もしません。
改ざんが検知された場合は追加分、変更分、削除分の数をそれぞれ取り出しで変数に入れます。
また、今回は数だけ出しても意味がないので変更があったファイルだけパスを出力します。
ここまで出すとそのまま「エラーログを送り付けてもいいのではないか」とも思えますが、SNSでは最大256KBしかメッセージが送れません。
https://aws.amazon.com/jp/sns/pricing/
試しに1MBのメッセージを送ってみたところ
-bash: /bin/aws: Argument list too long
とのことです。AIDEは標準でログの文字数が多いので整形する必要はあると思います。
話は戻りますが、前回はこれらをカスタムメトリクスとしてプッシュしましたが、今回はSNSのメッセージとして整形します。
RES=$(echo -e "AIDE CHECKED\n\nAdded:$added$addedfiles\n\nChanged:$changed$changedfiles\n\nRemoved:$removed$removedfiles")
の結果は例えば以下のようになります。echoで-eオプションをつけることで改行コードを読ませることが出来ます。
AIDE CHECKED
Added:2
added: /home/centos/aaa
added: /home/centos/d.text
Changed:1
changed: /home/centos/c.text
Removed:2
removed: /home/centos/a.text
removed: /home/centos/b.text
また、あまりサイズの大きいメールを送るのはいかがなものかということで100KB以上のメッセージになる場合は「ログを見ろ」という旨の内容を送信することにします。
全部、英数字で1文字1バイトなので(多分)文字数でメッセージサイズをカウントします。
if [ $(echo $RES | wc -c) -le 100000 ]
100KB以上の時はメッセージの内容を上書きしてログファイルの場所を書いて送ります。
# mail_size > 100KB
RES=$(echo -e "AIDE CHECKED\n\ncheck this -> $LOGFILE")
最後にAWS CLIのコマンドで利用するトピックのARN、件名、本文を入れてトピックに登録したサブジェクトにメールを送信してもらいます。
aws sns publish --topic-arn "${SNSTOPIC}" --subject "WARNING: Data is Changed" --message "$RES"
定期的に検知するのであればcronに登録しますが、今回はとりあえず動作確認のみ行うので以下のコマンドで確認します。
source AideSNS_Send.sh
入力に誤りが無ければメールが届きます。
AIDE CHECKED
Added:2
added: /home/centos/aaa
added: /home/centos/d.text
Changed:1
changed: /home/centos/c.text
Removed:2
removed: /home/centos/a.text
removed: /home/centos/b.text
--
If you wish to stop receiving notifications from this topic, please click or visit the link below to unsubscribe:
以下略
まとめ
以上でAIDEの検知結果をSNSで送信することができました。
人が見るものなので見てわかる内容にしないといけない一方であまり説明文のところに文字数を割きたくないので苦労します。
例で出したものはわからない方だと思うので使う場合は考えてみてください。
CloudWatchでカスタムメトリクスを取得する場合はこちらへ↓
https://blog.denet.co.jp/aide_cloudwatch/
アーキテクト課のomkです。
AWSについて雑多に取り組んだ内容を発信しています!!