LinuxサーバーへSSHログインした時にメールで知らせる方法

ログインする度にメールが送信されるというのはうっとうしく感じる場合があるかも知れないのですが、不正アクセスを検知する効果は非常に高いです。

管理者権限を奪取されている場合、アクセスログは改ざんされる可能性が高いため信頼できません。しかしメールであればログインした瞬間にメールが送信されるのでリアルタイムに検知できます。

個人的にはログ監視で不正アクセス検知しつつメールでログインを知らせるというのが非常におすすめの方法なので、VPSで不正アクセスを検知したいという方はぜひ導入してみてください。

PAMを使ってメールを送るための事前チェック

PAMはPrivileged Access Managementの略で、アクセス権や各種権限を管理するための技術です。PAMを使うとログインした際にメールを送信できるようになります。

SSHでPAMが有効化されているかチェック

SSHのデフォルト設定であればPAMが有効化されているはずですが念のため確認しておきましょう。/etc/ssh/sshd_configUsePAMyesになっている事を確認します。

# Set this to 'yes' to enable PAM authentication, account processing,
# and session processing. If this is enabled, PAM authentication will
# be allowed through the KbdInteractiveAuthentication and
# PasswordAuthentication.  Depending on your PAM configuration,
# PAM authentication via KbdInteractiveAuthentication may bypass
# the setting of "PermitRootLogin without-password".
# If you just want the PAM account and session checks to run without
# PAM authentication, then enable this but set PasswordAuthentication
# and KbdInteractiveAuthentication to 'no'.
UsePAM yes

意図的に設定を変更していない限り「yes」のはずです。

メールを送信できるかチェックしよう

コマンドラインを使って外部にメールを送信できる状態かチェックしましょう。詳しくは次の記事をご覧ください。

Postfixを設定してローカルから外部へメール送信する方法|外部からはアクセスさせない

メール送信するスクリプトを作成する

SSHでログインしたらPAMを使ってメール送信します。メール送信にはスクリプトを使うので、そのスクリプトを作成しましょう。

わたしは次のような小さなシェルスクリプトを作成しました。ファイル名は「login-mail.sh」としています。

login-mail.sh
#!/bin/sh

to=通知先メールアドレス
from=差出人メールアドレス
subject="[$(hostname)] Login from ${PAM_RHOST}"

[ "$PAM_TYPE" = "open_session" ] || exit

/usr/bin/echo -e "To:${to}\nFrom:${from}\nSubject:${subject}\n\nUser: ${PAM_USER}\nFrom: ${PAM_RHOST}\nService: ${PAM_SERVICE}\nTTY: ${PAM_TTY}" | sendmail -t

このファイルをどこか適当な場所に配置してください。システム全体で使うので/usr/local/bin/配下が良いでしょう。

$ sudo cp login-mail.sh /usr/local/bin/

シェルスクリプトは実行権限を付けておきます。また、ファイルを改ざんされないように所有者をrootにしておきます。

$ chmod +x /usr/local/bin/login-mail.sh
$ sudo chown root. /usr/local/bin/login-mail.sh

PAMに設定を加える

PAMの設定ファイルは/etc/pam.d配下にあります。

どのファイルを変更するか悩ましいところですが、今回はSSHログインに限定したいので/etc/pam.d/sshdに設定を加えます。

ファイルの末尾に次の1行を追記します。

session optional pam_exec.so /usr/local/bin/login-mail.sh

optionalにしておくと、万が一スクリプトの実行が失敗してもログインには影響がでません。スクリプトのパスは先ほど配置したファイルパスとします。

この設定を保存すると有効化されます。

ログインしてみる

設定を保存したらSSHでログインしてみてください。次のようなメールが送信されるはずです。

タイトル: [example.com] Login from xx.xx.xx.xx

本文:
User: foo
From: xx.xx.xx.xx
Service: sshd
TTY: ssh

もしもメールが送信されない場合はsendmailが失敗している可能性があります。以下の記事を参考にしてコマンドラインでメールを送信できることを確認してください。

Postfixを設定してローカルから外部へメール送信する方法|外部からはアクセスさせない

まとめ

地味ですがログインする度にメールを飛ばす方法は攻撃者からすると嫌なものです。バックドアなどでSSH以外のログイン方法を侵入された場合は検知できないので注意してください。

不正アクセスを検知する方法はいくつかあるので、セキュリティーレベルを上げたい方は次の記事も参考にしてみてください。

VPSに侵入されたとき、どうすれば気付けるのか|チェック方法と対策