web-dev-qa-db-ja.com

誰かがSSH経由でLinuxボックスにログインするたびにプログラムを実行する

小さなSSHサーバーがあり、誰かがSSH経由でログインするたびに実行するスクリプトを書きたいのですが。

さて、どうすればいいですか?

ANYBODYがログインするたびにスクリプトを実行したいのですが、少なくともログインしたユーザーのユーザー名とログインしたユーザーのIPアドレスにアクセスできる必要があります。

/etc/bash.bashrcの使用を考えましたが、それは良い解決策ですか?たとえば、ユーザーがその使用を無効にして、スクリプトを無効にする方法はありますか?はいの場合、私のその他のオプションは何ですか?

ありがとう。

10
houbysoft

使用するメカニズムは、目的によって異なります。

ユーザーに何か便利またはフレンドリーを提供したい場合、_/etc/profile_は、すべてのユーザーは同じシェルを使用します。 ssh経由でログインするときにコマンドにonlyを実行させる場合は、コマンドを_/etc/ssh/sshrc_に配置します。 (ユーザーが独自の_~/.ssh/rc_ファイルでコマンドをオーバーライドしてもかまわない場合)。

ユーザーに1つのプログラムと1つのプログラムのみを実行させる強制する場合は、ForceCommandオプションDigitalRossで説明されているように、良いアプローチです。 (私は個人的にさらに 必須のアクセス制御AppArmorSELinux[〜#〜]などのシステムでユーザーを制限しますtomoyo [〜#〜] 、または [〜#〜] smack [〜#〜] を使用して、プログラムがユーザーの脱出を許可できないようにします。AppArmorで10年間取り組んできました年、それが私が最初に選ぶツールですが、他の人は優秀なプログラマーによって書かれた素晴らしいツールです。)

1つのプログラムだけを実行したい場合、ユーザーに迷惑をかけないようにするには、最善の方法は、バイパスできないpam_exec(8)モジュールを使用することです。 、シェルに関係なく機能し、ユーザーまたは承認を実行するプログラムのユーザーアカウントとして実行する簡単な機能を提供します。マンページには次の例が示されています。

_   Add the following line to /etc/pam.d/passwd to rebuild the
   NIS database after each local password change:

               passwd optional pam_exec.so seteuid make -C /var/yp

   This will execute the command

       make -C /var/yp

   with effective user ID.
_

これは、authaccountpassword、およびsessionアクションで実行するように拡張できます。おそらくsessionは、ログイン時に実行するのに最適です。次のような行を追加するだけです。

_session optional pam_exec.so log=/var/log/ssh_login_cmd /usr/local/bin/ssh_cmd
_

_/etc/pam.d/sshd_制御ファイルに。

12
sarnold

OpenSSHの新しいバージョンには、ForceCommandと呼ばれるサーバー機能があり、ユーザーが実行する操作(scp、ssh、...)ではなく、スクリプトを制御できます。意図されました。スクリプトには元のコマンドが渡されるので、必要なことをすべて実行した後、おそらくそれにチェーンすることができます。

Sshd_config(5)から:

ForceCommand

ForceCommandで指定されたコマンドの実行を強制します。クライアントおよび〜/ .ssh/rcが存在する場合は、それらが提供するコマンドを無視します。コマンドは、-cオプションを指定したユーザーのログインシェルを使用して呼び出されます。これは、シェル、コマンド、またはサブシステムの実行に適用されます。 Matchブロック内で最も役立ちます。クライアントが最初に提供したコマンドは、SSH_ORIGINAL_COMMAND環境変数で使用できます。 `` internal-sftp ''のコマンドを指定すると、ChrootDirectoryで使用するときにサポートファイルを必要としないインプロセスsftpサーバーの使用が強制されます。

これを1回使用してscpをオーバーライドし、gemのアップロードを許可されたすべてのユーザーに、不要または不要なgemのインタラクティブアクセスを与えることなく、安全なgemアップロードを提供しました。

4
DigitalRoss

1つの方法は、syslogデーモンとして syslog-ng を使用し、特定のログエントリ(sshログインの成功など)が一致するたびにスクリプトバックグラウンドを実行するように構成することです。

3

これをチェックしてください:

http://ubuntuforums.org/showthread.php?p=9383927

これを実行しないようにする方法はないと思います。他の誰かがこれを確認できますか?

0
Swift