web-dev-qa-db-ja.com

すべてのログイン試行を監視する

数週間前、ユーザーがサーバーにログインするたびに電子メールを送信するスクリプトを作成することをお勧めします。

そこで、完全に機能するスクリプト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

13
Creek

まず、ユーザーの.profileは変更される可能性があるため、依存しないでください。それが本当にyourサーバーの場合、次のことができます。

  • auth.log、utmpなどのエントリを定期的にテストする(またはinotifyによってトリガーされる)
  • /bin/loginのラッパーを記述します。ラッパーはあなたの処理を行い、実際の/bin/loginを実行します。 (たとえば、sshが/bin/loginを実行するかどうかはよくわかりませんが、期待しています。)しかし、私はそれをお勧めすることはできません。危険すぎるためです。
2
emmwie
/var/log/auth.log

システムへの試行を追跡する

cat /var/log/auth.log grep sshd.\*Failed 

これは失敗した試行をgrepできます。また、タイムスタンプも利用できるので、スクリプトに合わせて調整できます。

tail -f /var/log/auth.log 

入力を常にトレースしてから、正規表現を実行できます。

1
klerk

私はこれが古いことを知っていますが、成功および失敗した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
0
Aguevara

私は上から@creekのソリューションが好きですが、小さな変更が1つあります。

if $msg contains 'session opened for user' then :ommail:;mailBody`

if $msg contains 'sshd:session' then :ommail:;mailBody`

単に「ユーザー向けに開かれたセッション」を使用すると、cronジョブが起動するたびにメッセージが表示されます。少なくとも私にとっては、SSHを監視したいだけです。上記の条件を調整して、他のニーズに合わせることができます。

0