web-dev-qa-db-ja.com

すべてのLinuxコマンドをログサーバーに記録する方法

入力したすべてのコマンドをログサーバーに送信する必要があります。すべてのログをログサーバーに送信するsyslog-ngはすでに構成されています。

私はこれを行うすべての方法に興味があります。悪意のあるユーザーとセキュリティについての議論が期待されますが、最初の主な目的は、単にセッションをログに記録させることです。すべてのセッションはssh経由ですが、コンソール接続コマンドもログに記録する必要があります。どのシェルでもこれを実行したいのですが、主なものはbashです。 (再び、悪意のあるユーザーが自分のシェルを作成できることを知っています...)

13
Leo

これは、問題への取り組み方ではありません。 Shellアクセス権をユーザーに付与すると、そのユーザーは適切な権限を持つすべてのことを実行することになります。コマンドのロギングを忘れて、Unixシステムでコマンドを実行する方法は多すぎます。

たとえば、ユーザーはメールクライアントを開始することができ(たとえば、記録されるコマンドはpineのみ)、そこでVIを開始する「作成」を選択し、VIから:!cmdを介して必要なコマンドを起動します。このコマンドはどこにも記録されず、システムの観点からは、grepやsortなどのVIによって呼び出されるヘルパーアプリケーションのようです。シェルによって記録される唯一のコマンドはpineでした。

あなたが実際に望んでいるのはauditingと呼ばれているようです。監査サブシステムを有効にし、auditctlコマンドと audit パッケージのauditdデーモンを使用して、ログに記録される内容を制御します。詳細は auditctl(8) マニュアルページにあります。

すべてのプロセスのインスタンス化をログに記録することも最適ではない場合があることに注意してください。たとえば、(autotoolsを使用して作成された)ソフトウェアパッケージの単純な./configureは、何千ものプロセスのインスタンス化を作成するために注目に値します。これにより、監査ログが大量のノイズでいっぱいになり、後で分析することが非常に難しくなります。

29
Juliano

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をご覧ください。

13
Sam Halicke

少しCプログラミングをするつもりなら、execveをラップするライブラリを作成し、syslogにログを記録してから、dlopenで実際のexecve syscallを含むライブラリを作成できます。次に、/ etc/environmentで、LD_PRELOADを作成したライブラリのパスに設定します。

ここでループに入ることに注意する必要があるので、特定のバイナリのexecのみをログに記録するか、他のバイナリ(syslogなど)をログに記録しないようにすることができます。

11
mark

rootshman page )のようなものを探しているように聞こえます。 manページを引用するには:

Rootshは、エコーされたすべてのキーストロークと端末出力をファイルやsyslogに記録するシェルのラッパーです。

名前にもかかわらず、これはすべてのユーザーに使用できます。

7
Andrew M.

おそらく、ユーザーがSudo(または類似の)を使用して関心のあるコマンドを実行し、ユーザーをあるレベルで信頼する方がよいでしょう。 「完全な制御」に近づくにつれて、彼らが何をしているかを追跡することが難しくなります。たとえば、最近このようなツールを検討しています。ほとんどの場合、それらは、そのようなことを価値のあるものにするのに十分なユーザーとマシンがある場合、管理が難しいログを作成するだけです。 :)

生成するすべての情報を検討してください。どれだけ気にしていますか?おそらくごくわずか-したがって、ほとんど価値のないログを生成しています。他の人が示唆しているように、あなたが実際に気にかけていることを監査することは、おそらくあなたをより良い最終状態に導くでしょう。

2
dannysauer

Bashは4.1以降、syslogをサポートするようにコンパイルできます。

それは絶対確実ではありません(プロセスアカウンティングの方が適している可能性があります)が、ほとんどの場合ユーザーとのやり取りです。ボリュームはより管理しやすいはずであり、異常が疑われる場合は、より詳細なものに切り替えることができます。

とは言っても、これは非常に煩わしいものであり、ユーザーがそれを始める前に、非常に具体的なプライバシー警告を期待します。

1
Tobu

セッションのロギングを行うsudosh( http://sudosh.sourceforge.net )もあります。ユーザーに対して定義されたシェルとして、またはSudoを介して実行するオプションがあります。各セッションのタイミングも追跡するので、セッションを再生して見ることができます(編集セッションなどを含む)。

0
Stick