誰かがsshサーバーへのログインに成功した場合に誰かにメールしたり通知したりするbashスクリプトを持っていますか?誰かが私の個人ボックスにログインした場合に通知を受け取りたいです。
Xfceを実行しているUbuntu 12.04を使用しています
警告:コメントによると、ユーザーが
~/.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 <[email protected]>" -t "Your Name <[email protected]>" -s smtp.server.com &
これにより、誰かがSSH経由でログインするたびに電子メールで効果的に通知され、ログインがsyslogに記録されます。
注:電子メール通知を機能させるには、sendemail
package(Sudo apt-get install sendemail
)が必要です。
注:はポート転送で機能しますが、-Nオプションでは機能しません。
警告:いつものように、ログイン構成を変更するときは、バックグラウンドでバックアップsshセッションを開いたままにして、新しい端末からログインをテストします。
ユーザーが独自の~/.ssh/rc
ファイルを持っている場合、sshrc
メソッドは機能しないため、@ adosaiguasが示唆したように、pam_exec
を使用してこれを行う方法を説明します。良いことは、/etc/pam.d/
の別のファイルにフックすることにより、ssh
以外のログインタイプ(ローカルログインまたはすべてのログインなど)にも簡単に適応できることです。
最初に、コマンドラインからメールを送信できる必要があります。これについて他の質問があります。メールサーバーでは、おそらくmailx
(おそらく既にインストールされている)をインストールするのがおそらく最も簡単です。
次に、次の内容の実行可能スクリプトファイルlogin-notify.sh
(たとえば、/etc/ssh/
に入れます)が必要です。変数を変更して、電子メール通知の件名と内容を変更できます。 chmod +x login-notify.sh
を実行して実行可能にすることを忘れないでください。
#!/bin/sh
# Change these two lines:
sender="[email protected]"
recepient="[email protected]"
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
として含まれているため、実行が失敗した場合でもログインできます。動作することを確認したら、optional
をrequired
に変更できます。フックスクリプトの実行が成功しない限り、ログインはできません(それが必要な場合)。
PAMとは何か、どのように機能するかについて説明が必要な場合は、 非常に優れたもの です。
Linuxボックスのプロセスを監視するために、 monit を使用しています。 monit は、sshを介したログインの成功について電子メールで警告することもできます。 monit configは次のようになります
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
ファイルで設定する必要があります
更新:詳細について書いた ブログ投稿
/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" [email protected]
fi
/etc/profile
はログインごとに実行されます(bash Shellユーザーの場合)。 ifステートメントは、ユーザーがssh経由でログインしている場合にのみtrueを返します。これにより、インデントされたコードブロックが実行されます。
次に、メッセージのテキストを作成します。
$(date)
はdate
コマンドの出力に置き換えられます${USER}
はユーザーのログイン名に置き換えられます$(hostname -f)
は、ログインしているシステムの完全なホスト名に置き換えられます2番目のTEXT
行は最初の行に追加され、このユーザーがログインしているシステムのIPアドレスを示します。最後に、生成されたテキストがメールであなたのアドレスに送信されます。
要約Linuxは、デフォルトでは、システムログファイルにすべてのシステムログインをsshであるかどうかにかかわらず記録しますが、特にsshを介してほとんどアクセスされないシステムの場合、迅速でダーティな通知が役立つ場合があります。
私はこのスレッドからいくつかの優れた回答を得て、コピーアンドペーストが可能なものを作成しました。 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
swatchdogパッケージのswatchdogを使用して、フレーズ「fail」を含む行を監視しています "(大文字と小文字を区別しない)in/ var/log/auth.log。単純なsystemdサービスとして実行するように設定しました。
apt install swatch
構成ファイル/ etc/swatch/swatch-auth-log.confを作成し、所有者ルート、パーミッション644-
watchfor /fail/i
pipe /usr/local/sbin/sendmail -t [email protected]
"/ fail/i"は正規表現で、「i」は大文字と小文字を区別しないことを示します。 (私のsendmailは、mailgunを介してすべてを固定アドレスに送信するスクリプトであるため、アドレスは実際には重要ではありません)。
systemdサービスファイル/ etc/systemd/system/swatch-auth-log.serviceを作成し、所有者ルート、パーミッション644- -
[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 board の説明は次のとおりです。
セキュリティ設定を理解するのが難しいことには触れないほうが安全だと判断しました。とにかくすべてがログファイルにあります。
投稿した後、@ 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 <[email protected]>'
TO='[email protected]'
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
)の読み取り権限なしで機能するため、到着ユーザーはスクリプトの読み取りアクセス権を持っている必要はありません。
/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
私は実際に@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 <[email protected]>" &
これは、セットアップした14.04、16.04、およびCentos 6.5.xサーバーで動作します。mtaが設定されていることを確認する必要があることは間違いありませんが、一度実行すると魅力的です。次のステップtwilioアラート