数週間前、ユーザーがサーバーにログインするたびに電子メールを送信するスクリプトを作成することをお勧めします。
そこで、完全に機能するスクリプトnotifyLogin.sh
を用意し、各ユーザーの.bash_login
スクリプトから呼び出すことにしました。
しかし、誰かがssh
-t
スイッチを使用してサーバーにログインし、利用可能なシェルを選択できることを発見しました。例えば:
ssh user@myserver -t sh
このように、.bash_login
は実行されず、/etc/profile
も実行されません。
ログイン時にシェルの種類に関係なくnotifyLogin.sh
を呼び出す方法はありますか? (それは常に動作するはずです)
車輪を作り直すのではなく、rsyslog
にすべてを任せましょう。ファイルにヒットする前に、syslogメッセージでパターンが一致したときにメールを送信する機能があります。
メールアドレスとSMTPサーバーを次のように設定して/etc/rsyslog.conf
に配置するか、/etc/rsyslog.d/
にドロップしてrestart rsyslog
$ModLoad ommail
$ActionMailSMTPServer localhost
$ActionMailFrom [email protected]
$ActionMailTo [email protected]
$template mailSubject,"Login Alert on %hostname%"
$template mailBody,"\n\n%msg%"
$ActionMailSubject mailSubject
$ActionExecOnlyOnceEveryInterval 1
# the if ... then ... mailBody mus be on one line!
if $msg contains 'session opened for user' then :ommail:;mailBody
これにより、rsyslog
がメッセージ内の文字列session opened for user
と一致したときにメールが送信されます。
sshd
からのメッセージを/var/log/auth.log
で調べて、パターンとして他に使用できるものを確認できます。
ソース: rsyslog ommail
まず、ユーザーの.profileは変更される可能性があるため、依存しないでください。それが本当にyourサーバーの場合、次のことができます。
/bin/login
のラッパーを記述します。ラッパーはあなたの処理を行い、実際の/bin/login
を実行します。 (たとえば、sshが/bin/login
を実行するかどうかはよくわかりませんが、期待しています。)しかし、私はそれをお勧めすることはできません。危険すぎるためです。/var/log/auth.log
システムへの試行を追跡する
cat /var/log/auth.log grep sshd.\*Failed
これは失敗した試行をgrepできます。また、タイムスタンプも利用できるので、スクリプトに合わせて調整できます。
tail -f /var/log/auth.log
入力を常にトレースしてから、正規表現を実行できます。
私はこれが古いことを知っていますが、成功および失敗したssh接続/試行を監視するために何かを書きました。 sshguardを使用している場合はIPも禁止されます。私はそれをPythonとRubyで書きました。誰かがssh経由で正常に接続したとき、誰かがsshパスワードを間違えたとき、または誰かが何度も失敗したために禁止されたときにメールで通知します。うまくいけば、これはこの問題を検索して私のコードを見つける将来の誰かを助けるでしょう!
Pythonの実装:
https://github.com/amboxer21/SSHMonitorPy
Rubyの実装:
https://github.com/amboxer21/SSHMonitor
pythonスクリプトの場合、プロセスを監視するためのbashスクリプトを作成しました。ルートcronタスクを介して毎分実行されているかどうかを確認します。実行されていない場合は、別のプロセスを開始します。
Bashスクリプト:
/ home/anthony/.ssh/is_sshm_running.sh
#!/bin/bash
if [[ `ps aux | egrep --color -i "root.*[0-9]*:[0-9]* Sudo /usr/bin/python /usr/bin/SSHMonitor.py" | wc -l` < 1 ]]; then
Sudo /usr/bin/python /usr/bin/SSHMonitor.py -e "[email protected]" -p "password" &
fi
if [[ `ps aux | egrep --color -i "root.*[0-9]*:[0-9]* Sudo /usr/bin/python /usr/bin/SSHMonitor.py" | wc -l` > 1 ]]; then
Sudo kill -9 `ps aux | egrep --color -i "root.*[0-9]*:[0-9]* Sudo /usr/bin/python /usr/bin/SSHMonitor.py" | awk '{print $2}'`;
fi
これによって呼び出されるroot cronタスクは毎分:
[anthony@ghost ImageCapturePy]$ Sudo crontab -l
[Sudo] password for anthony:
* * * * * /bin/bash /home/anthony/.ssh/is_sshm_running.sh
私は上から@creekのソリューションが好きですが、小さな変更が1つあります。
if $msg contains 'session opened for user' then :ommail:;mailBody`
に
if $msg contains 'sshd:session' then :ommail:;mailBody`
単に「ユーザー向けに開かれたセッション」を使用すると、cronジョブが起動するたびにメッセージが表示されます。少なくとも私にとっては、SSHを監視したいだけです。上記の条件を調整して、他のニーズに合わせることができます。