数週間前、私はユーザーが自分のサーバーにログインしたときに私に電子メールを送信するスクリプトを書くのが良い考えだと思いました。
そのため、完全に機能するスクリプトを提供し、notifyLogin.sh
各ユーザーのスクリプトからそれを呼び出すことにしました .bash_login
。
ssh
-t
しかし、誰かがスイッチを使って自分のサーバーにログインするために使用できるシェルを選択できることを発見しました。たとえば、
ssh user@myserver -t sh
このように.bash_login
実行されないと実行されません/etc/profile
。
notifyLogin.sh
シェルの種類に関係なく、ログイン時にそれを呼び出す方法はありますか? (常に動作する必要があります)
答え1
車輪を再発明しないで、rsyslog
すべてがあなたのためになされるようにしなさい。ファイルに到達する前にsyslogメッセージのパターンが一致した場合は、電子メールを送信できます。
以下に電子メールアドレスとSMTPサーバーを設定して入力または/etc/rsyslog.conf
入力/etc/rsyslog.d/
します。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
/var/log/auth.log
メッセージを表示し、sshd
パターンとして使用できる他の内容を確認できます。
源泉:rsyslog メール
答え2
まず、ユーザーが変更できるため、ユーザーの.profileに依存してはいけません。それが本当ならあなたのサーバーでは、次のことができます。
- auth.log、utmpなどのエントリを定期的にテストします(またはinotifyによってトリガされます)。
/bin/login
タスクを実行してから、実際のタスクを実行するラッパーを作成します/bin/login
。 (たとえば、sshが実行しているかどうかはわかりませんが、/bin/login
そうなることを願っています。)しかし、お勧めできません。危険すぎる。
答え3
/var/log/auth.log
システムでの試みの追跡
cat /var/log/auth.log grep sshd.\*Failed
失敗した試行をgrepでき、タイムスタンプも使用できるため、スクリプトに適用するか、次を使用できます。
tail -f /var/log/auth.log
入力を追跡し、いくつかの正規表現を実行できます。
答え4
@Creekの答えに応じて、rsyslogを使用した複数のユーザーの一致
$ModLoad ommail
$ActionMailSMTPServer localhost
$ActionMailFrom [email protected]
$ActionMailTo [email protected]
$template mailSubject,"Login alert on %hostname%"
# mailBody must be on one line!
$template mailBody,"\n\n%msg%"
$ActionMailSubject mailSubject
$ActionExecOnlyOnceEveryInterval 1
if $msg contains 'session opened for' then {
if $msg contains 'USER1' then :ommail:;mailBody
# Repetition required (did not investigate why)
$ActionMailSMTPServer localhost
$ActionMailFrom [email protected]
$ActionMailTo [email protected]
$template mailSubject,"Login alert on %hostname%"
$template mailBody,"\n\n%msg%"
$ActionMailSubject mailSubject
$ActionExecOnlyOnceEveryInterval 1
if $msg contains 'USER2' then :ommail:;mailBody
}