web-dev-qa-db-ja.com

コマンドが終了したら、sshログインおよびログアウト時にコマンドを実行します

Centos7マシンの1つでのユーザーアクティビティを追跡したいと思います。そのために、管理者はscriptおよびscriptreplayを使用して、基本的にユーザーのアクティビティを記録して再生することにしました。私はそれをどのように設計すべきかについて自分の側でいくつかの調査を行いましたが、auditdに依存するソリューションはここで管理者によって拒否され、スクリプトをユーザーの.profileに配置すると、以下で説明するいくつかの問題が発生します。

予想される動作は次のとおりです:

  1. ユーザーがSSH経由でサーバーにログインすると、スクリプトコマンドが生成され、ユーザーアクティビティのファイルへのログ記録が開始されます。
  2. ユーザーがサーバーでの作業を終えると、ログオフします(通常はexitまたはCTRLDと入力します)。
  3. スクリプトプロセスが停止し、ファイルを閉じます。

今の問題:

  1. 私の調査によると、スクリプトは実際に別のシェルを作成します。したがって、すべてのユーザーの.bash_profile(またはskel)にscript script.logを配置すると、ログイン後にユーザーに新しいシェルが発行され、ユーザーはプロセスを簡単に中止して、コマンドの入力を開始できます。彼の通常のSSHセッション。 スクリプトコマンドによって生成されたシェルを終了するときに、スクリプトにユーザーを実際にキックオフさせるにはどうすればよいですか?

  2. スクリプト出力(つまり、ユーザーのコマンド)は、非sudoerが何もできない(R/W/E権限がない)プライベートな場所に保存する必要があります。 ユーザー自身が特権を持たない場合、ユーザーログイン時に昇格された特権でスクリプトを実行するにはどうすればよいですか?

2
nxr_jivra

コマンドの強制に関して、sshdにはForceCommandオプションがあります。

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

したがって、それを読んでから、ForceCommandscriptに設定すると、おおよそあなたが望むことをするはずです。

監査証跡を安全に保つことに関して、マルチサーバーシステムの1つの解決策は、syslogから学習し、ネットワークを介して別の物理ホストにエントリを送信することです。これにより、ユーザーがログを生成した後、ログにアクセスできなくなります。他に失敗した場合は、デーモンがログを収集して保存するlocalhostの別のポートにログを送信するように何かを調整することができます。 (明らかなことを試しましたが、script -f /dev/tcp/localhost/8888はbashで処理する必要があるため、/dev/tcp/...はできません。したがって、 manpage)のように自分で通信パスをmkfifoする必要があると思いますscript -f )の例

2
Ulrich Schwarz