Centos7マシンの1つでのユーザーアクティビティを追跡したいと思います。そのために、管理者はscriptおよびscriptreplayを使用して、基本的にユーザーのアクティビティを記録して再生することにしました。私はそれをどのように設計すべきかについて自分の側でいくつかの調査を行いましたが、auditdに依存するソリューションはここで管理者によって拒否され、スクリプトをユーザーの.profileに配置すると、以下で説明するいくつかの問題が発生します。
予想される動作は次のとおりです:
今の問題:
私の調査によると、スクリプトは実際に別のシェルを作成します。したがって、すべてのユーザーの.bash_profile(またはskel)にscript script.logを配置すると、ログイン後にユーザーに新しいシェルが発行され、ユーザーはプロセスを簡単に中止して、コマンドの入力を開始できます。彼の通常のSSHセッション。 スクリプトコマンドによって生成されたシェルを終了するときに、スクリプトにユーザーを実際にキックオフさせるにはどうすればよいですか?
スクリプト出力(つまり、ユーザーのコマンド)は、非sudoerが何もできない(R/W/E権限がない)プライベートな場所に保存する必要があります。 ユーザー自身が特権を持たない場合、ユーザーログイン時に昇格された特権でスクリプトを実行するにはどうすればよいですか?
コマンドの強制に関して、sshd
にはForceCommand
オプションがあります。
ForceCommandで指定されたコマンドの実行を強制し、クライアントおよび〜/ .ssh/rcが存在する場合はそれを無視して実行します。このコマンドは、ユーザーのログインシェルを-cオプションとともに使用して呼び出されます。
これは、シェル、コマンド、またはサブシステムの実行に適用されます。これは、Matchブロック内で最も役立ちます。クライアントによって最初に提供されたコマンドは、SSH_ORIGINAL_COMMAND環境変数で使用できます。
したがって、それを読んでから、ForceCommand
をscript
に設定すると、おおよそあなたが望むことをするはずです。
監査証跡を安全に保つことに関して、マルチサーバーシステムの1つの解決策は、syslogから学習し、ネットワークを介して別の物理ホストにエントリを送信することです。これにより、ユーザーがログを生成した後、ログにアクセスできなくなります。他に失敗した場合は、デーモンがログを収集して保存するlocalhostの別のポートにログを送信するように何かを調整することができます。 (明らかなことを試しましたが、script -f /dev/tcp/localhost/8888
はbashで処理する必要があるため、/dev/tcp/...
はできません。したがって、 manpage)のように自分で通信パスをmkfifo
する必要があると思いますscript -f
)の例