SSHログインを監視したい（SSHログインがあったらメール通知）＋ メール送信はAmazon SESを使いたい

# 環境

- CentOS 7
- Amazon SES

# 追記

以降のSES設定を記載する方法は冗長だったので、mailコマンドは使える前提で、必要な処理だけ（SES設定なし）の記事を作成しました。

[[改良]SSHログイン監視（ログインがあったら通知/自IPは通知除外） - Qiita](https://qiita.com/s-katsumata/items/d40654ec1d68318791a3)

# やりたいこと

- SSHログインがあった時にメール通知したい（mailコマンド利用）
- メール送信サーバ（SMTP)は、Amazon SESを使用

# 実現方法

- `/etc/ssh/sshrc` を作成して、メール送信処理を実装する(*1)
- Amazonの証明書がないとログインしたユーザに警告が表示されるのでインストールする

(*1)この方法だと捕捉できるのはSSHログインのみであり、また @angel_p_57 様がコメントで指摘してくださったような留意事項もあります。代替手段として PAMを使った方法もあります。

> angel_p_57 様のコメント
> sshrcがログイン時処理追加用なのは確かですが、これはX転送時のxauth処理を請け負う想定なので、
> 本記事のような実装だと、X転送に齟齬が出ます。…というのは注意点になります。
> 参考: sshd(8)のSSHRCの項
> 
> sshに限らず、ログイン時の(メール送信等)プログラム自動実行を実現する場合、PAMを利用することもできますので、参考まで。
> http://www.mikitechnica.com/19-notify-login-pam-exec.html

# 手順
## SES設定
### SMTP認証情報を取得
SESコンソールの「SMTP Settings」で`Sever Name`を控えます。
`Create My SMTP Credentials`ボタン押下してSMTPユーザ名・パスワードを生成して控えます。

![](https://i.gyazo.com/6319f947d5eab6b0677b910aaf2a54dd.png)

### 送信元メールアドレスをVerifyする

![](https://i.gyazo.com/9182e43dc2d6323a51562a979bbba549.png)

### SESサンドボックスの解除

SESは初期状態では送信制限があります。申請して解除してもらいます。

Amazon SES サンドボックスの外への移動 - Amazon Simple Email Service
https://docs.aws.amazon.com/ja_jp/ses/latest/DeveloperGuide/request-production-access.html

## SSH設定
`/etc/ssh/sshrc`というファイルを作成します。このファイルはすべてのユーザがSSHログインした際に自動的に実行されます。
このファイル内でmailxコマンド（存在しない場合は `yum install mailx`）を使って、メール送信します。

認知しているIPアドレスは通知をSKIPしたい場合のコード

`IPS`変数に指定します。（複数指定したい場合は空白で区切ります）

```
MAIL_TO=to@example.com

FOUND=0
IPS="123.456.78.901"
DETECT_IP=
for ip in $IPS
do
  if [ "${SSH_CLIENT:0:${#ip}}" = "$ip" ]; then
    FOUND=1
    DETECT_IP=$ip
  fi
done

if [ $FOUND = 0 ]; then
  echo ""$USER" has logged in from [$SSH_CLIENT] at `date +"%Y/%m/%d %H:%M:%S"` " | mail -s "[$HOSTNAME ]sshd login alert" $MAIL_TO
# else
#  echo "detect defined ip [$DETECT_IP]" | mail -s "[$HOSTNAME ]sshd login alert" $MAIL_TO
fi
```

この時にSMTPサーバとしてSESを指定します。



```bash:/etc/ssh/sshrc
# 変数の設定
BODY=""$USER" has logged in from [$SSH_CLIENT] at `date +"%Y/%m/%d %H:%M:%S"` "
SUBJECT="[$HOSTNAME ]sshd login alert"
SMTP_SERVER=smtp://★SESのSever Name（リージョンにより異なるので注意）★:587
SMTP_USER=★SMTPユーザ★
SMTP_PASSWORD=★SMTPパスワード★
MAIL_FROM=★送信元メールアドレス（SESでverify済であること）★
MAIL_TO=★送信先メールアドレス（SESのサンドボックス解除されていればVerify不要）★

# SESをSMTPサーバに指定してメール送信
# エラーがなくなるまでは mail コマンドに -v(vobose) オプションをつけて実行するのがおすすめ
echo $BODY | mailx -s "$SUBJECT" \
-S smtp-use-starttls \
-S ssl-verify=ignore \
-S smtp-auth=login \
-S smtp=$SMTP_SERVER \
-S from=$MAIL_FROM \
-S smtp-auth-user=$SMTP_USER \
-S smtp-auth-password=$SMTP_PASSWORD \
-S ssl-verify=ignore \
-S nss-config-dir=/etc/pki/nssdb \
$MAIL_TO 
```

### IP除外できるバージョン



★-S で指定している設定は、`~/.mailrc` に記載することもできますが、この場合、各ユーザごとにmailrcファイルが必要となります。

# Amazon証明書のインストール

【参考にさせていただいた記事】[Amazon SES + mailx で「Error in certificate: Peer's certificate issuer is not recognized.」が出た時の対処法](https://qiita.com/nunemoga/items/150da96e0ddfdc8b7b8f)

前述までの内容でメールは送信されるようになりますが、ログインしたユーザのコンソールに以下の警告が表示されます。
この警告を消すにはAmazonの証明書インストールが必要です。

```
Error in certificate: Peer's certificate issuer is not recognized.
```

Amazon証明書をダウンロードして、証明書データベースに追加します。

```
# cd ~/
# wget https://www.amazontrust.com/repository/AmazonRootCA1.pem
# certutil -A -n "Amazon Cert" -t "C,," -d /etc/pki/nssdb -i ~/AmazonRootCA1.pem -a
```

証明書データベースの内容を確認します。★で囲んだ内容が表示されればOKです。

```
# certutil -L -d /etc/pki/nssdb
Certificate Nickname                                         Trust Attributes
                                                             SSL,S/MIME,JAR/XPI

★Amazon Cert                                                  C,,  ★
```

# トラブルシューティング
エラーが原因を特定するには以下の方法があります。

- mailxコマンドに`-v`オプションを付与して実行する
- メールログを確認する `# tail -f /var/log/maillog `

# 付録

## SESメール送信時警告

サーバーに証明書を設定しないとSSHログイン時にコンソールに警告が送出されます。
`ssl-verify=ignore` 設定しているのでメールそのものは送信できていますが，気になる場合は，以下を参考に設定してください。

[Amazon SES + mailx で「Error in certificate: Peer's certificate issuer is not recognized.」が出た時の対処法 - Qiita](https://qiita.com/nunemoga/items/150da96e0ddfdc8b7b8f)

## おまけ送信されてくるメール
上述したスクリプトでは、以下のようなメールが送信されてきます。

![](https://i.gyazo.com/3d8108342796d50bad622f11fec10da9.png)