回答:
これは、問題へのアプローチ方法ではありません。シェルにユーザーにアクセス権を付与すると、そのユーザーに適切なアクセス許可があれば何でもできるようになります。コマンドロギングを忘れてください。Unixシステムでコマンドを実行する方法は多すぎます。
たとえば、ユーザーはメールクライアントを起動し(pine
たとえば、記録されるコマンドは1つのみ)、そこでVIを起動する「作成」を選択し、VIから必要なコマンドを起動します:!cmd
。このコマンドはどこにも記録されず、システムの観点からは、grepやsortなど、VIによって呼び出されるヘルパーアプリケーションのようなものです。シェルによって記録された唯一のコマンドはでしたpine
。
実際に必要なものは監査と呼ばれるようです。監査サブシステムを有効にし、監査パッケージのauditctl
コマンドとauditd
デーモンを使用して、記録する内容を制御します。詳細については、auditctl(8)のマニュアルページを参照してください。
すべてのプロセスのインスタンス化をログに記録することも最適ではないことに注意してください。たとえば、シンプルな./configure
ソフトウェアパッケージ(autotoolsを使用して作成された)は、数千のプロセスインスタンス化の作成で注目に値します。これにより、監査ログが非常に多くのノイズであふれ、後で分析することが非常に困難になります。
acct
パッケージをインストールし(パッケージ名はディストリビューションによって異なり、プロセスアカウンティングとも呼ばれます)、使用しますlastcomm <username>
:
[mithrandir]-[/home/sernin]-[1951] % lastcomm sernin
tr sernin pts/2 0.00 secs Fri Nov 12 12:02
zsh F sernin pts/2 0.00 secs Fri Nov 12 12:02
tr sernin pts/2 0.02 secs Fri Nov 12 12:02
zsh F sernin pts/2 0.00 secs Fri Nov 12 12:02
fortune sernin pts/2 0.00 secs Fri Nov 12 12:02
xmodmap sernin pts/2 0.00 secs Fri Nov 12 12:02
xrdb sernin pts/2 0.00 secs Fri Nov 12 12:02
sh sernin pts/2 0.00 secs Fri Nov 12 12:02
cpp sernin pts/2 0.00 secs Fri Nov 12 12:02
ttyまたはコマンド名で検索することもできます。いつものようにman lastcomm
、詳細については。
少しのCプログラミングを実行する場合は、execveをラップするライブラリを作成し、syslogにログを記録してから、実際のexecve syscallを含むライブラリをdlopenで作成します。次に、/ etc / environmentで、LD_PRELOADを作成したライブラリのパスに設定します。
ここでループに入ることに注意する必要があります。そのため、特定のバイナリのEXECのみをログに記録するか、他のログ(syslogなど)をログから除外することができます。
おそらく、ユーザーにsudo(または同様の)を使用して気になるコマンドを実行させ、あるレベルでユーザーを信頼させる方がよいでしょう。「完全に制御する」ことに近づくにつれて、それらが何をしているかを追跡することが難しくなります。たとえば、最近このようなツールを検討しています。ほとんどの場合、ログを作成するだけで、そのようなことを価値のあるものにするために十分なユーザーとマシンがある場合、管理が困難です。:)
生成するすべての情報を考慮してください。どれくらい気にしますか?おそらく非常に少ない-あなたはほとんど価値のないログを生成しています。他の人が示唆しているように、あなたが実際に気にしていることを監査することは、おそらくあなたをより良い最終状態に導きます。
セッションロギングを行うsudosh(http://sudosh.sourceforge.net)もあります。ユーザーの定義済みシェルとして、またはsudoを介して実行するオプションがあります。各セッションのタイミングも追跡するので、セッションを再生して見ることができます(セッションの編集などを含む)。