web-dev-qa-db-ja.com

SSHログインおよび/またはログアウトで(システム)スクリプトを実行する

ユーザーがSSHを使用してログインし、理想的にはホスト名またはIPとユーザー名を渡すたびに、OpenSSHサーバーがスクリプトを開始するようにします。さらに、セッションが終了する(ユーザー名を渡す)たびにスクリプトを実行したいと思います。これらのスクリプトは、ユーザーのセッションではなく、システム全体で実行する必要があります。

アイデアは、ログインとログアウト時に音声警告を出すことです。 espeakを使用して、外部ディスプレイに情報を表示します。

私はpam-scriptsパッケージがあることを見てきましたが、これが私が望むことをするのか、それをどのように使うのかはわかりません。

12
sunside

SSHユーザー(または特定のコマンドを与えない場合はシェル)の代わりにコマンドを強制することができます。これは、ForceCommand /root/ssh-wrapper/etc/ssh/sshd_configのようなコマンドを指定することで実行できます(スクリプトの場所や名前に関係なく、すべてのユーザーが実行可能で、sshd構成ファイルがそれを指していることを確認してください)。また、sshdを再起動/再ロードする必要があります。 元のコマンドは、強制コマンドから$SSH_ORIGINAL_COMMANDとしてアクセス可能です。

このスクリプトを一緒にハッキングしました。

#! /bin/sh

# add logger options when needed
log="logger -t ssh-wrapper"

# find IP address
ip=`echo $SSH_CONNECTION | cut -d " " -f 1`

$log $USER login from $ip
espeak "$USER just logged in from $ip" > /dev/null 2>&1

$log command: ${SSH_ORIGINAL_COMMAND:-Shell}
${SSH_ORIGINAL_COMMAND:-Shell}

$log $USER logout
espeak "$USER just logged out" > /dev/null 2>&1

これで、ログインまたはログアウトするたびに音声で通知され、ログエントリがsyslogに書き込まれます。また、コマンドをログに記録します。次のようなものを使用して、sshdの使用を「フォロー」できます。

tailf /var/log/syslog | grep ssh-wrapper

このスクリプトはほとんどテストされていないため、ご自身の責任で使用してください! ;-)

PS:このスクリプトは、ログインしたユーザーとして実行されるため、機能を追加するために変更すると、必要なすべてを実行できないことに注意してください...

10
JanC

以前にログファイルでこの一致するイベントを見たことがあります(これにより、何でも一致する柔軟性が得られます)。このページのフォーマットは不十分ですが、始めるのに役立つかもしれません: https://help.ubuntu.com/community/AudibleLogs#Play with esound

1
kanaka

ServerFault の同じ質問からクロスポストされた回答)

必要な処理を実行するスクリプトを作成し、必要に応じて/etc/profileまたは、場合によっては/etc/bash.bashrcに固定します。これらのファイルへの変更は、すべてのユーザーに適用されます。ただし、このアプローチを使用してログアウトを通知する方法についてはわかりません。

別の方法として、これを行う別の方法は、新しい(および閉じる)sshセッションの/var/log/authを監視する単純なデーモンを使用することです。そうすれば、ログインとログアウトの両方で通知を送信できます。

0
EEAA

PAMが最良の選択肢だと思います。システム全体であり、ユーザーの構成ファイルで上書きすることはできません。

次の手順を実行できます。彼らは私のためにUbuntu 14.04.4 LTSで働いていました。

実行:

$ Sudo pico /opt/custom/bin/info-session.sh

その空のファイルを編集して、次の行を追加します。

#!/bin/sh

[ "$PAM_TYPE" = "open_session" ] || exit 0

INFO=$(date +"%Y/%m/%d %T $PAM_USER ($PAM_RHOST) $PAM_SERVICE $PAM_TTY") # You can customize message.

echo "PAM access: $INFO" | write user > /dev/null 2>&1 # See Note 1.

exit 0

その後、スクリプトに実行権限を付与します。

$ Sudo chmod ugo+x /opt/custom/bin/info-session.sh

次に、実行します:

$ Sudo pico /etc/pam.d/common-session

ファイルの最後に次の行を追加します。

# Modified by user:
session optional pam_exec.so /opt/custom/bin/info-session.sh

サービスを再起動する必要はありません。このスクリプトは、ユーザーがSSHではなくターミナルからログインしたときにも実行されることに注意してください。

注1:espeakまたは必要に応じて他のプロセス(電子メール、プッシュ通知など)にパイプすることができます... )。 writeを使用し、userがログインしている場合、ユーザーは端末に出力メッセージを直接表示します。

参照:
https://blog.stalkr.net/2010/11/login-notifications-pamexec-scripting.html
https://blog.redbranch.net/2014/06/04/pam_exec-so-execute-commands-on-user-login/

関連:
sshログインが成功したときに電子メールアラートを設定するにはどうすればよいですか?
https://serverfault.com/questions/400613/how-can-i-configure-my-server-to-notify-me-whenever-it-is-remotely-accessed-via
https://serverfault.com/questions/395393/email-notification-about-each-ssh-connection-to-linux-server

0
Pestro

Sshrcを使用できます(man sshd、sshrcを検索)

sshは/ etc/ssh/sshrcを実行します(存在する場合)。そこから1つのスクリプトを実行(または複数のスクリプトを呼び出す)できます

$USERなどのbash変数を呼び出すか、IPを取得できます

read -d " " ip <<< $SSH_CONNECTION

スクリプトを作成して、必要なものをテストまたはログに記録できます。

ログアウトスクリプト...まあ、それは私が探しているものです! :D

0
higuita