Linuxサーバに対するSSH接続を検知して通知するよ
🚨 SSH-Notify
Python 3.10.12 / Ubuntu 22.04.3
パスワード認証はオフにしてはいるけど、念のためにSSH接続されたら通知を飛ばすようにしたい‼️
...ということで、Discordで通知を受け取る方法と、なんかたまにDiscordで通知が来ない場合があるのでntfy.shを使用して通知を受け取る方法を書き記します。
🛠 準備をしよう
Python
こちらのコードではens18をNIC名に指定していますが、環境に合わせて変更してください。
Discordを使用する場合
適当なDiscordサーバを立て、Webhookを作成、URLをコード内に貼り付けます。
サーバー設定 → 連携サービス → ウェブフック
ntfy.shを使用する場合
スマホにコマンドラインから通知を飛ばすことができます。
デフォルトでは公式サーバを経由するため、同じトピック名を設定した人にも通知が飛んでしまいます。
一応、自前のサーバでも環境を作れるみたいなので試してみたのですが、なんでかプッシュ通知が来ないぞ‼️と思ったら...
Unlike Android, iOS heavily restricts background processing, which sadly makes it impossible to implement instant push notifications without a central server.
公式ドキュメントによると、iosだと公式サーバなしではプッシュ通知が制限されているみたいですね。
なのでトピック名を他人と被らせないように乱数を設定します。ガイモ調べによると64文字まで、英数字のみ設定可能らしいです。
Linux
PythonファイルをLinuxサーバ内の適当な場所に配置します。
netifaces, requestsライブラリを使用するため、事前にpip install
しておいてください。
SSHのアクセスログからクライアントのIPアドレスを取得します。各ディストリビューションごとに認証ログのパスが違うため、編集する必要があるかもしれません。
本コードでは/var/log/auth.log
を指定しています。
PAMはLinuxで使用される認証システムのライブラリです。これを用いてSSH接続を検知し、Pythonスクリプトを実行します。
root権限で/etc/pam.d/sshd
に以下の記述を追記します。パスは各自変更してください。
session optional pam_exec.so type=open_session /path/to/ssh-notify.py
✅ 試してみよう
SSH接続を行うと、通知が...‼️ やったね🎉
Discussion