Google や Facebook にログインすると、セキュリティ向上のために通知メールが届きます。IT の人なら、「SSH でも同じことができないか」と考えたことがあるのではないでしょうか。どのユーザーが SSH でログインしても、システム管理者へ通知が送られれば、セキュリティに役立ちます。
方法は 2 つあります。.bashrc や .zshrc にコマンドを書くか、PAM(Pluggable Authentication Modules for Linux)を使って SSH ログインのイベントにフックするかです。私は PAM を使うことをおすすめします。
この記事は Ubuntu / Debian 向けに書いています。
手順
vim や nano など任意のテキストエディタで /etc/pam.d/sshd を開き、カーソルを末尾に移動します。次の行をファイルに入力してください:session optional pam_exec.so seteuid /root/notify.shこれは、ログイン、ログアウト、その他 SSH セッションに関する操作が行われるたびに、SSH デーモンが "/root/notify.sh" を呼び出すという意味です。最後のパラメーターは、任意の Linux コマンドやファイルに置き換えられます。
2 番目のフィールドである “optional” は、notify.sh が失敗のステータスコードを返してもログインを続行させる、という意味です。“required” に設定すると、notify.sh が失敗したときにログインできなくなるため、“required” は使わないことをおすすめします!
次に /root/notify.sh を作成し、以下の内容をファイルに書き込んで、実行可能にしてください:
#! /bin/bash
if [ $PAM_TYPE == 'open_session' ]; then
subject = "[$(hostname)] User $PAM_USER login from $PAM_RHOST at $(date)"
elif [ $PAM_TYPE == 'close_session' ]; then
subject = "[$(hostname)] User $PAM_USER logout from $PAM_RHOST at $(date)"
fi
echo subject > mail -s $subject rootPAM が notify.sh を実行するとき、いくつかの環境変数が設定されます。たとえば次のようなものです:
- PAM_TYPE:ユーザーがログインしたのかログアウトしたのかを判断するのに使います
- PAM_USER:ログインしたユーザー
- PAM_RHOST:リモートユーザーの IP アドレス
- PAM_SERVICE
- PAM_TTY
PAM は同期的に動作すると考えられるので、通知の送信に長い時間がかかると、ログインも遅くなってしまいます。
この記事の参考資料: