🚨

Linuxサーバに対するSSH接続を検知して通知するよ

2023/09/03に公開

🚨 SSH-Notify

Python 3.10.12 / Ubuntu 22.04.3
パスワード認証はオフにしてはいるけど、念のためにSSH接続されたら通知を飛ばすようにしたい‼️
...ということで、Discordで通知を受け取る方法と、なんかたまにDiscordで通知が来ない場合があるのでntfy.shを使用して通知を受け取る方法を書き記します。

🛠 準備をしよう

Python

https://github.com/gaimo-ch/SSH-Notify
特定のIPを除外する記述もありますのでそこは各自お好きに。
こちらのコードではens18をNIC名に指定していますが、環境に合わせて変更してください。

Discordを使用する場合

適当なDiscordサーバを立て、Webhookを作成、URLをコード内に貼り付けます。
サーバー設定 → 連携サービス → ウェブフック

3

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文字まで、英数字のみ設定可能らしいです。
4

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接続を行うと、通知が...‼️ やったね🎉

1
2


Discussion