環境
- CentOS 7
- Amazon SES
追記
以降のSES設定を記載する方法は冗長だったので、mailコマンドは使える前提で、必要な処理だけ(SES設定なし)の記事を作成しました。
[改良]SSHログイン監視(ログインがあったら通知/自IPは通知除外) - Qiita
やりたいこと
- 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ユーザ名・パスワードを生成して控えます。
送信元メールアドレスをVerifyする
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を指定します。
# 変数の設定
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.」が出た時の対処法
前述までの内容でメールは送信されるようになりますが、ログインしたユーザのコンソールに以下の警告が表示されます。
この警告を消すには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
設定しているのでメールそのものは送信できていますが,気になる場合は,以下を参考に設定してください。
おまけ送信されてくるメール
上述したスクリプトでは、以下のようなメールが送信されてきます。