SSHログインの際に不正なログインを検知するために通知を送ることはしばしばあるかと思います。
通知機能を実装する際に、私は次の2つの構成を思い浮かべます。
①/etc/ssh/sshrcにSSHログイン時に通知を送るスクリプトを書く
→ EC2自身がメールサーバーとして役割を果たすため、gmailだと信頼されていないメールサーバーとしてメールが迷惑メールに送られる
②AWSサービスのCloudWatchとSNSを利用して通知を送る
→ 少々使うサービスが多いので手間がかかるが、AWS側のメールサーバーはgmailから信頼されているので迷惑メールに振り分けられず済む(gmail側の設定による)
今回は②にフォーカスして話を進めていきます、①については以下の記事で事足ります
大まかな流れ
1.EC2にIAMロールをアタッチ
2.Cloudwatchエージェントインストール
3.Cloudwatchの構築をする
4.SNSを作成する
5.CloudwatchアラームのターゲットにSNS設定
1.EC2にIAMロールをアタッチ
IAMロールを作成 → AWS管理ポリシーの「CloudWatchAgentServerPolicy」をIAMロールにアタッチ → IAMロールをEC2にアタッチ
2.cloudwatchエージェントインストール
①エージェントをインストール → ②エージェント設定 → ③エージェント起動
詳細
①エージェントをインストール(&準備)
sudo yum install wget
wget https://s3.amazonaws.com/amazoncloudwatch-agent/redhat/amd64/latest/amazon-cloudwatch-agent.rpm
sudo yum install amazon-cloudwatch-agent.rpm
②エージェント設定ファイルに以下の内容の"任意の名前"を変えてコピペ
{
"agent": {
"metrics_collection_interval": 60,
"run_as_user": "root"
},
"logs": {
"logs_collected": {
"files": {
"collect_list": [
{
"file_path": "/var/log/secure",
"log_group_name": "任意の名前",
"log_stream_name": "{instance_id}"
}
]
}
}
},
"metrics": {
"append_dimensions": {
"AutoScalingGroupName": "${aws:AutoScalingGroupName}",
"ImageId": "${aws:ImageId}",
"InstanceId": "${aws:InstanceId}",
"InstanceType": "${aws:InstanceType}"
},
"metrics_collected": {
"disk": {
"measurement": [
"used_percent"
],
"metrics_collection_interval": 60,
"resources": [
"*"
]
},
"mem": {
"measurement": [
"mem_used_percent"
],
"metrics_collection_interval": 60
}
}
}
}
③エージェント起動
sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -a fetch-config -m ec2 -s -c file:/opt/aws/amazon-cloudwatch-agent/bin/config.json
※確認
以下のコマンドたたいてactiveと書いてあればOKです
systemctl status amazon-cloudwatch-agent.service
以下のコマンドたたいて上の内容が出力されていればOKです
sudo cat /opt/aws/amazon-cloudwatch-agent/bin/config.json
3.SNSを作成する
①以下の設定に注意してSNS作成
「タイプ」:「スタンダード」
「暗号化」:無効化」(有効化したい場合はポリシーにKMSを使えるように設定してください)
②作成したSNSをクリックして送信したいメールアドレス設定して作成
③メールが届いているはずなのでconfirmする
4.Cloudwatchの構築をする
①Cloudwatchロググループ確認 → ②Cloudwatchメトリクスフィルター作成 → ③Cloudwatchアラーム作成
詳細
①Cloudwatchロググループ確認
任意の名前で設定したロググループが反映されているかAWSコンソール画面から確認してみましょう
②Cloudwatchメトリクスフィルター作成
Cloudwatchロググループより自身のロググループ選択 → [アクション]>[メトリクスフィルターの作成]から作成
→ 作成する際に以下の設定に注意
「フィルターパターン」:「Accepted」
「メトリクス値」:「1」
「デフォルト値」:「0」
(そのほかの設定は任意で設定して下さい)
③Cloudwatchアラーム作成
Cloudwatchロググループより自身のロググループ選択 → 作成したメトリクスにチェックを入れて「アラームを作成」をクリック → 以下の設定に注意
「条件」>「アラーム条件」:「以上」
「条件」>「しきい値を定義」:「1」
「通知の送信先」:自身が作成したSNSの名前を設定
テスト
試しにSSHログインしてみて登録したメールアドレスにメールが届いている確認してみてください
@@@@@ポリシーの注意@@@@@
・EC2に適切なIAMロールをアタッチしないとCloudWatchエージェントが機能しない
・SNSの暗号化を有効化にしているせいでKMSを使うためののポリシーを加えないと通知が届かないので注意
@@@@@@@@@@@@@