sshログインが成功したときに電子メールアラートを設定するにはどうすればよいですか?


56

誰かがsshサーバーへのログインに成功した場合に誰かにメールしたり通知したりするbashスクリプトを持っていますか?誰かが私の個人ボックスにログインした場合に通知を受け取りたいです。

xfceを実行しているUbuntu 12.04を使用しています

回答:


46

警告:コメントによると、ユーザーが~/.ssh/rc。* というファイルを作成した場合、これは機能しません。

/etc/ssh/sshrc次の内容で変更または作成します。

ip=`echo $SSH_CONNECTION | cut -d " " -f 1`

logger -t ssh-wrapper $USER login from $ip
echo "User $USER just logged in from $ip" | sendemail -q -u "SSH Login" -f "Originator <from@address.com>" -t "Your Name <your.email@domain.com>" -s smtp.server.com &

これにより、誰かがSSHを介してログインするたびに電子メールで効果的に通知され、ログインがsyslogに記録されます。

注:電子メール通知を機能させるには、sendemailパッケージ(sudo apt-get install sendemail)が必要です。

注:ポート転送で動作しますが、-Nオプションでは動作しません。


これは、クライアントがTTYを要求しない場合にも機能しますか?たとえばssh -N、ポートフォワーディングのみ。
gertvdijk

gmailをsmtpサーバーとして使用しているときにも機能しますか?
user155073

これには警告が必要です。ユーザーがファイルを作成した場合、これは機能しない~/.ssh/rcため、セキュリティ対策としてはまったく役に立ちません。@adosaiguasの答えpam_execは正しいものです。
フリッツ14

2
@mchid:「誰かが私のパーソナルボックスにログインした場合に通知を受け取りたい」という質問を検討する場合、これ受け入れられるかもしれません。ユーザーアカウントが1つしかない場合。それ以外の場合は、新しく追加されたすべてのアカウントを含むすべてのアカウントに対して実行する必要があります。そして理想的には、ユーザーが~/.ssh/rcファイルを変更または削除できないことを確認してください。に基づいてシステム全体の方法を使用することは、混乱させるpamことしかrootできないため、より信頼性が高く安全です。したがって、答えは次のとおりです。sshrdメソッドはシングルユーザーシステムではpam正常に機能しますが、すべてのシステムで確実に機能ます。
フリッツ

70

警告:ログイン構成を変更するときはいつものように、バックグラウンドでバックアップsshセッションを開いたままにして、新しい端末からログインをテストします。

sshrcユーザーが自分の~/.ssh/rcファイルを持っている場合、このメソッドは機能しないため、pam_exec@ adosaiguasが提案したように、これを行う方法を説明します。良いことは、これはsshの別のファイルにフックすることで、(ローカルログインやすべてのログインなど)以外のログインタイプにも簡単に適応できることです/etc/pam.d/

最初に、コマンドラインからメールを送信できる必要があります。これについて他の質問があります。メールサーバーにインストールするのがおそらく最も簡単ですmailx(おそらく既にインストールされているでしょう)。

次に、次の内容を含む実行可能なスクリプトファイルlogin-notify.sh/etc/ssh/たとえば、それを配置します)が必要です。変数を変更して、電子メール通知の件名と内容を変更できます。実行chmod +x login-notify.shすることを忘れないでください。

#!/bin/sh

# Change these two lines:
sender="sender-address@example.com"
recepient="notify-address@example.org"

if [ "$PAM_TYPE" != "close_session" ]; then
    host="`hostname`"
    subject="SSH Login: $PAM_USER from $PAM_RHOST on $host"
    # Message to send, e.g. the current environment variables.
    message="`env`"
    echo "$message" | mailx -r "$sender" -s "$subject" "$recepient"
fi

それができたら、次の行をに追加できます/etc/pam.d/sshd

session optional pam_exec.so seteuid /path/to/login-notify.sh

テスト目的で、モジュールはとして含まれているoptionalため、実行が失敗した場合でもログインできます。あなたはそれが動作することを確認しました後、あなたは変更することができますoptionalrequired。フックスクリプトの実行が成功しない限り、ログインはできません(それが必要な場合)。

PAMとは何か、またPAMがどのように機能するかについての説明が必要な方のために、ここに非常に良いものがあります。


1
それは言う:/etc/ssh/login-notify.sh failed: exit code 13右のログイン:(後
FelikZ

3
おかげで、それは素晴らしい作品です。sshd_configでにUsePAM設定しyesたことを確認してください。
ニコラスバディア

2
自分自身またはSelinuxを初めて使用する他の人へのメモです。pam_execがスクリプトを実行すると、許可エラーが発生しました。後で、Selinuxのラベルが間違っていることがわかりました。スクリプトを/ bin /に複製し、自動的にというラベルが付けられ unconfined_u:object_r:bin_t:s0ます。その後、私 chmod +x /bin/login-notify.shとそれが動作します。
-RedGiant

3
/etc/pam.d/login < -のttyログイン用
フェルナンド・アンドレ

2
@ 4wk_ヒントをありがとう。インターネットアーカイブへのリンクに置き換えたので、今度は再び機能するはずです。
フリッツ

9

私たちは、Linuxボックスのプロセスを監視するためにmonitを使用しています。monitは、sshを介したログインの成功について電子メールで警告することもできます。私たちのMONITの設定は次のようになります

 check file ssh_logins with path /var/log/auth.log  
     # Ignore login's from whitelist ip addresses
     ignore match "100.100.100.1"    
     # Else, alert
     if match "Accepted publickey" then alert

注:メールサーバーの設定、メール形式などはmonitrcファイルで設定する必要があります

更新:これに関する 詳細なブログ投稿を書きました


7

以下を入れます/etc/profile

if [ -n "$SSH_CLIENT" ]; then 
    TEXT="$(date): ssh login to ${USER}@$(hostname -f)" 
    TEXT="$TEXT from $(echo $SSH_CLIENT|awk '{print $1}')" 
    echo $TEXT|mail -s "ssh login" you@your.domain 
fi

スクリプトの仕組み

/etc/profileログインごとに実行されます(bashシェルユーザーの場合)。ifステートメントは、ユーザーがssh経由でログインした場合にのみtrueを返します。これにより、インデントされたコードブロックが実行されます。

次に、メッセージのテキストを作成します。

  • $(date)dateコマンドの出力に置き換えられます
  • ${USER} ユーザーのログイン名に置き換えられます
  • $(hostname -f) ログインしているシステムの完全なホスト名に置き換えられます

2 TEXT行目は1行目に追加され、このユーザーがログインしているシステムのIPアドレスを示します。最後に、生成されたテキストがメールであなたのアドレスに送信されます。

要約Linuxは、デフォルトでは、システムログファイルにすべてのシステムログインをsshであるかどうかにかかわらず記録しますが、特にsshを介してほとんどアクセスされないシステムの場合、迅速でダーティな通知が役立つ場合があります。


2

この他の質問では、おそらくあなたが探しているものがあります。基本的に、ユーザーがsshを介してログインするときに実行されるスクリプトにmailコマンドへの呼び出しを追加できます:/etc/pam.d/sshd


2

私はこのスレッドからいくつかの優れた答えを取り、多かれ少なかれコピーアンドペースト可能なものを作成しました。Mailgunを使用して電子メールを送信するので、STMPの設定に関する問題を回避できます。必要なのは、Mailgun APIキーと送信ドメインのみです。

SSHログイン時に、スクリプトはログインの詳細(ユーザー、ホスト名、IPアドレス、および現在のすべての環境変数)を電子メールアドレスに送信します。message変数をカスタマイズすることで、送信したい他のパラメーターを簡単に追加できます。

#!/bin/sh

# this script is triggered on SSH login and sends an email with details of the login
# such as user, IP, hostname, and environment variables

# script should be placed somewhere on the server, eg /etc/ssh
# to trigger on SSH login, put this line in /etc/pam.d/sshd:
#   session optional pam_exec.so seteuid /etc/ssh/snippet-for-sending-emails-on-SSH-login-using-PAM.sh

# Script settings
MAILGUN_API_KEY=
MAILGUN_DOMAIN=
SENDER_NAME=
SENDER_EMAIL_ADDRESS=
RECIPIENT_EMAIL_ADDRESS=

if [ "$PAM_TYPE" != "close_session" ]; then
    host=$(hostname)
    ip=$(dig +short myip.opendns.com @resolver1.opendns.com) # gets public IP
    # Message to send, e.g. the current environment variables.
    subject="SSH login - user:$USER pam-host:$PAM_RHOST host:$host ip:$ip" \
    message=$(env)
    curl -s --user '$MAILGUN_API_KEY' \
        https://api.mailgun.net/v3/$MAILGUN_DOMAIN/messages \
        -F from='$SENDER_NAME <$SENDER_EMAIL_ADDRESS>' \
        -F to=$RECIPIENT_EMAIL_ADDRESS \
        -F subject="$subject" \
        -F text="${subject} ${message}"
fi

私の意見ではこれが最良の答えです。それは単純であり、マシンから電子メールを送信する必要はありません。適切に設定されていなければ、確実にスパムフォルダーに格納されます。
JayD3e

2

@Fritz回答のMailgun適応

投稿した後、@ pacharaneroがmailgunについても書いていることに気付きましたが、彼らがdigで何をしているのか理解できないので、ソリューションも投稿します。

SMTPを持たないVMを使用している場合は、mailgun、sendgridなどのようなものを使用する必要があるかもしれません。これはGoogle Cloudでうまくいきました。

このアプローチのリスクの1つは、攻撃者がsudo suスクリプトを見つけて見つけることができる場合、または送信用のスクリプトを読み取り可能にしておくと、送信メールの送信資格情報を取得する可能性があることです。mailgunには、設定すべきIPホワイトリストがありますが、明らかにこの特定のユースケースには不完全です。

このスクリプトはmydomain.com、実際のドメインに変更した後、mailgunで動作するはずです。スクリプトを/root/login-alert.shもっとわかりにくい場所に保存することもできます。

#!/bin/bash
if [ "$PAM_TYPE" != "close_session" ]; then
    APK='api:your-mailgun-api-key-goes-here' 
    FROM='Login Alert <mailgun@mg.mydomain.com>'
    TO='me@mydomain.com'  
    SUBJECT="Login: $PAM_USER @ mydomain.com from $PAM_RHOST"
    DATE=$(date)
    TEXT="At $DATE a login occurred for $PAM_USER on mydomain.com from $PAM_RHOST"
    curl -s --user $APK \
     https://api.mailgun.net/v3/mg.mydomain.com/messages \
     -F from="$FROM" \
     -F to="$TO" \
     -F subject="$SUBJECT" \
     -F text="$TEXT"
fi

その後、@ Fritzの回答に従って、以下/etc/pam.d/sshdを含めるように変更できます。

session optional pam_exec.so seteuid /root/login-alert.sh

これは、到着ユーザー(chmod 700 /root/login-alert.sh)の読み取り権限がなくても機能するため、到着ユーザーはスクリプトの読み取りアクセス権を持っている必要はありません。


1

このスクリプトは/etc/ssh/sshrc電子メールを送信し、システムロガーにログを追加します。パーソナルサブネットとWorld Wide Webの間には違いがあります(必要に応じて無効にできます)(必須sudo apt-get install mailutils)。

SUBNET="192.168.0"

IP=`echo $SSH_CONNECTION | cut -d " " -f 1`
CURRENT_SUBNET="$(echo $IP|cut -d'.' -f1-3)"
if [ "$CURRENT_SUBNET" = "$SUBNET" ]; then
        msg="This message comes from same subnet! User $USER just logged in from $IP"
        echo $msg|mail -s "$msg" root
else
        msg="This message comes from different subnet! User $USER just logged in from $IP"
        echo $msg|mail -s "$msg" root
fi

logger -t ssh-wrapper $USER login from $IP

1

私が使用していますswatchdogをからスウォッチ句「を含むすべての行を監視するためにパッケージが失敗で」(大文字小文字を区別しない)/var/log/auth.logを。単純なsystemdサービスとして実行するように設定しました。

apt install swatch

所有者ルート、許可644で構成ファイル/etc/swatch/swatch-auth-log.confを作成します-

watchfor /fail/i
  pipe /usr/local/sbin/sendmail -t auth.log@xxx.com

「/失敗/ i」は「i」は、それが大文字と小文字を区別しないであることを示すと、正規表現です。(私のsendmailmailgunを介してすべてを固定アドレスに送信するスクリプトなので、アドレスは実際には問題ではありません)。

所有者ルート、許可644でsystemdサービスファイル/etc/systemd/system/swatch-auth-log.serviceを作成します-

[Unit]
Description=monitor /var/log/auth.log, send fail notices by mail

[Service]
ExecStart=/usr/bin/swatchdog -c /etc/swatch/swatch-auth-log.conf -t /var/log/auth.log

[Install]
#WantedBy=multi-user.target
WantedBy=pre-network.target

次に、サービスの有効化、開始、ステータスの表示-

sudo systemctl enable swatch-auth-log.service
sudo systemctl start swatch-auth-log.service
sudo systemctl status swatch-auth-log.service

成功したステータスレポートの例-

 swatch-auth-log.service - monitor /var/log/auth.log, send fail notices by mail
   Loaded: loaded (/etc/systemd/system/swatch-auth-log.service; enabled; vendor preset: enabled)
   Active: active (running) since Thu 2019-01-31 21:41:52 PST; 17min ago
 Main PID: 27945 (swatchdog)
    Tasks: 3 (limit: 4915)
   CGroup: /system.slice/swatch-auth-log.service
           ├─27945 /usr/bin/perl /usr/bin/swatchdog -c /etc/swatch/swatch-auth-log.conf -t /var/log/auth.log
           ├─27947 /usr/bin/perl /.swatchdog_script.27945
           └─27949 /usr/bin/tail -n 0 -F /var/log/auth.log

Jan 31 21:41:52 ub18 systemd[1]: Started monitor /var/log/auth.log, send fail notices by mail.
Jan 31 21:41:52 ub18 swatchdog[27945]: *** swatchdog version 3.2.4 (pid:27945) started at Thu Jan 31 21:41:52 PST 2019

サービスはブート時に自動的に開始され、systemdによって監視されます。


討論

元々、上記と同様のpamソリューションを使用しましたが、/ etc/pam.d/common-authにsshdではありません。それはssh、sudo、およびログインをキャッチすることでした。しかし、更新後、レスキューモードでパスワードを変更した後でも、すべてのパスワードが機能しなくなりました。最終的に、/ etc / pam.d / common-authを元に戻し、パスワードは再び機能しました。Stack Exchange UNIX&Linuxボードの説明はこちら

セキュリティ設定を理解するのが難しいことには触れないほうが安全だと判断しました。とにかくすべてがログファイルにあります。


0

私は実際に@SirCharloの答えを修正しました

ip=`echo $SSH_CONNECTION | cut -d " " -f 1`

logger -t ssh-wrapper $USER login from $ip
echo "User $USER just logged in from $ip" | mail -s "SSH Login" "who to <who-to@youremail.com>" &

これは、セットアップした14.04、16.04、Centos 6.5.xサーバーで機能します。mtaが設定されていることを確認する必要があると確信していますが、それが完了したら、これは魅力的です。次のステップtwilioアラート

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.