SSH ログイン通知方法


SSHログインの際に不正なログインを検知するために通知を送ることはしばしばあるかと思います。
通知機能を実装する際に、私は次の２つの構成を思い浮かべます。

①/etc/ssh/sshrcにSSHログイン時に通知を送るスクリプトを書く
→ EC2自身がメールサーバーとして役割を果たすため、gmailだと信頼されていないメールサーバーとしてメールが迷惑メールに送られる

<strong>②AWSサービスのCloudWatchとSNSを利用して通知を送る</strong>
→ 少々使うサービスが多いので手間がかかるが、AWS側のメールサーバーはgmailから信頼されているので迷惑メールに振り分けられず済む（gmail側の設定による）

今回は②にフォーカスして話を進めていきます、①については以下の記事で事足ります

https://qiita.com/toshibe/items/890ca35b76e554f13cb3


大まかな流れ
1.EC2にIAMロールをアタッチ
2.Cloudwatchエージェントインストール
3.Cloudwatchの構築をする
4.SNSを作成する
5.CloudwatchアラームのターゲットにSNS設定

#1.EC2にIAMロールをアタッチ

IAMロールを作成 → AWS管理ポリシーの「CloudWatchAgentServerPolicy」をIAMロールにアタッチ → IAMロールをEC2にアタッチ

ポリシーの詳細：
https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/create-iam-roles-for-cloudwatch-agent.html

#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
```

②エージェント設定ファイルに以下の内容の"任意の名前"を変えてコピペ

```ruby:/opt/aws/amazon-cloudwatch-agent/bin/config.json
{
        "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」
「メトリクス値」：「１」
「デフォルト値」：「０」
（そのほかの設定は任意で設定して下さい）

③Cloudwatchアラーム作成
Cloudwatchロググループより自身のロググループ選択　→ 作成したメトリクスにチェックを入れて「アラームを作成」をクリック →　以下の設定に注意
「条件」>「アラーム条件」：「以上」
「条件」>「しきい値を定義」：「1」
「通知の送信先」：自身が作成したSNSの名前を設定

#テスト
試しにSSHログインしてみて登録したメールアドレスにメールが届いている確認してみてください

@@@@@ポリシーの注意@@@@@
・EC2に適切なIAMロールをアタッチしないとCloudWatchエージェントが機能しない
・SNSの暗号化を有効化にしているせいでKMSを使うためののポリシーを加えないと通知が届かないので注意
@@@@@@@@@@@@@