あんパン

こしあん派

SSHでログインされたらSlackに通知する

割とn番煎じっぽい小ネタ。このブログは自分用メモみたいなところがあるのでそういうものです。

SSHでログインされたらSlackに通知したい。誰かが入ってきたら分かるようにしたい。コンテナ化された現代の開発ではSSHログインされるサーバがまずなかったりするわけだが、個人がお金をケチって運用しているとまあある。というかこれです。

ホストへのSSHログインがあった場合にそれをトリガーとしてコマンドを実行するには /etc/pam.d/sshd

session optional pam_exec.so PATH_TO_BIN

の1行を足せば良い。PAMはLinuxにおける認証まわりをよしなに扱えるようにする仕組み。configに書いてある行を評価していってログインの成否を決める。sessionはユーザ認証の前後あたりで実行するモジュールを指し、optionalとすることで、以降の成否が認証の成否に影響を与えないようにする。つまりコマンドがコケても無視するというところ。このあたりは man pam.conf を眺めておけば分かる。

pam_execを利用するといくつかの値が環境変数に設定された状態でPATH_TO_BINの実行ファイルが実行される。こちらは man pam_exec を眺めれば分かる。具体的には

the following PAM items are exported as environment variables:
PAM_RHOST, PAM_RUSER, PAM_SERVICE, PAM_TTY, PAM_USER and PAM_TYPE, which contains one of the
module types: account, auth, password, open_session and close_session.

とのこと。これを読みつつPATH_TO_BINの中身は実際には以下のようなシェルスクリプトにしている。

#!/bin/sh

if [ "$PAM_TYPE" != "close_session" ]; then
  echo "$PAM_USER logged in to $(hostname) from $PAM_RHOST" | /opt/bin/notify_slack;
fi

/opt/bin/notify_slack はcatatsuyさんが作られているプロダクトで、この実行ファイルをポン置きしたもの。

github.com

設定はこのドキュメントに書いてある通り、事前にAppを作ってIncoming Webhookを払い出して /etc/notify_slack.toml に置いている。Slackに投稿する部分はcurlなどで書くと煩雑になるので、標準入力で渡せば適当に流してくれるのはありがたい。

ということで、ここまで設定するとSSHログイン時に以下のような通知がSlackへ送られてくる。

Slackにやってきた通知(いろいろ隠した)

SSHログイン時だけでなく単純なユーザのログインなどもトリガーにできるので、デスクトップLinuxでもいろいろ遊べそう。