コマンドライン引数を含め、実行されたすべてのコマンドを簡単に記録する方法はありますか?


11

特定のインスタンス化をログに記録して、rrdtool受信したパスが正しくないかどうかを確認する方法を見つけようとしています。

パラメータをログに記録するシェルスクリプトで実行可能ファイルをラップできることはわかっていますが、それを監視するためのよりカーネル固有の方法、特定の/ proc / pid / exe指定されたバイナリと一致しますか?


auditdコマンドライン引数とプログラムの実行を記録する方法はありますか?serverfault.com/questions/765179/...
ニール・

回答:


16

はい、カーネル機能があります:監査サブシステムです。auditdデーモンは、ロギングを行い、およびコマンドがauditctlログ記録ルールを設定します。いくつかのフィルタリングを使用して、特定のシステムオールへのすべてのコールをログに記録できます。実行されたすべてのコマンドとその引数をログに記録する場合は、execveシステムコールをログに記録します。

auditctl -a exit,always -S execve

特定のプログラムの呼び出しを明確にトレースするには、プログラム実行可能ファイルにフィルターを追加します。

auditctl -a exit,always -S execve -F path=/usr/bin/rrdtool

ログは/var/log/audit.log、またはディストリビューションが配置する場所に表示されます。監査サブシステムを制御するには、rootである必要があります。

調査が完了したら、ログルールを削除する-d代わりに同じコマンドラインを使用する-aか、実行auditctl -Dしてすべての監査ルールを削除します。

デバッグの目的で、プログラムをラッパースクリプトに置き換えると、環境や親プロセスに関する情報などのログを記録する柔軟性が高まります。


なぜ-F path=/ust/bin/rrdtoolrrdtool関連するソフトウェアでさえどうだかわかりません。
Graeme 14

@Graeme質問で説明されている問題は、の呼び出しを追跡することでしたrrdtool。すべてのプログラムの呼び出しをログに記録したい場合は、その-F path=…部分を削除します(もちろん、多くのログが表示されます)。
Gilles「SO-邪悪なことをやめなさい」

右...質問の最初の行。ありがとう。
Graeme 14

これはすべて素晴らしいですが、構成を初期状態にリセットするにはどうすればよいですか?それ以外の場合は、新しく起動されたコマンドがログに記録され続けます...または、このauditctlコマンドは再起動するまでのみ有効ですか?
ルスラン

@Ruslan効果はauditctl再起動まで存続しますが、とにかく良い点です。私は再起動せずにそれらを削除する手順を追加しました。
Gilles「SO-邪悪なことをやめ

6

あなたはスヌーピーを使うことができます。

スヌーピーはカーネルの協力を必要としないため、より軽量なソリューションです。必要なのは、スヌーピーライブラリをプリロードするダイナミックローダー(dl)だけ/etc/ld.so.preloadです。パスは、で指定されています。

開示:私は現在のスヌーピーのメンテナーです。


特定のシェルのみから直接または間接的に生成されたコマンドのロギングを行うことは可能ですか?
rv

私はあなたの質問を理解しているのかわかりません-シェルとして使用される特定のプログラム(bash、dash、zshなど)として「シェル」を意味しますか、それとも特定のPTYだけをログに記録したいという意味ですか?スヌーピーはフィルタリングフレームワークを提供しますが、現在実装されている非常に基本的なフィルターは2、3のみです。リストについては、こちらをご覧ください:リンク。他のユーザーに適用できる具体的なユースケースがある場合は、機能のリクエストで説明してください。
そうですね

特定のPTYを意味しました。
rv

PTYで利用可能なATMに特定のフィルターはありません。ただし、snoopyを使用して、イベントが発生したPTYを含むすべてをログに記録し、syslogデーモンでフィルタリングを行うことができます。どちらを使用しているかはわかりませんが、syslog-ng(たとえば)は、正または負の正規表現マッチングを実行できます。
Bostjan Skufca 2015

はい、ありがとう!ツールとアプローチは一般的に非常に便利です。必要なものを取得するために、簡単にフィルタリングを行うことができます。
rv

2

Linuxカーネルの「監査」サブシステムは、必要なことを実行できます。

たとえば、次のコマンドを実行した場合:

auditctl -a exit,always -F arch=b64 -S execve
auditctl -a exit,always -F arch=b32 -S execve

次に、すべての実行イベントがログに記録され、その周りに多くの情報が提供されます

たとえば、これは実行している私の出力です tail /var/log/audit/audit.log

exit=0 a0=7f0e4a21e987 a1=7f0e4a21e6b0 a2=7f0e4a21e808 a3=8 items=2 ppid=906 pid=928 auid=500 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=pts0 ses=1 comm="tail" exe="/usr/bin/tail" subj=kernel key=(null)
type=EXECVE msg=audit(1543671660.203:64): argc=2 a0="tail" a1="/var/log/audit/audit.log"
type=CWD msg=audit(1543671660.203:64):  cwd="/home/sweh"
type=PATH msg=audit(1543671660.203:64): item=0 name="/usr/bin/tail" inode=266003 dev=fd:03 mode=0100755 ouid=0 ogid=0 rdev=00:00 obj=unlabeled objtype=NORMAL cap_fp=0000000000000000 cap_fi=0000000000000000 cap_fe=0 cap_fver=0
type=PATH msg=audit(1543671660.203:64): item=1 name="/lib64/ld-linux-x86-64.so.2" inode=273793 dev=fd:03 mode=0100755 ouid=0 ogid=0 rdev=00:00 obj=unlabeled objtype=NORMAL cap_fp=0000000000000000 cap_fi=0000000000000000 cap_fe=0 cap_fver=0
type=PROCTITLE msg=audit(1543671660.203:64): proctitle=7461696C002F7661722F6C6F672F61756469742F61756469742E6C6F67

見ることができるいくつかの興味深い値があります。たとえば、「uid」がゼロであっても、「auid」は500であり、これは私のログインIDです(「cosを実行しています」su)。だから、ユーザーが持つアカウントを切り替えた場合であってもsu、またはsudo、我々はまだ彼らの「監査ID」に戻って追跡することができます

これらのauditctlコマンドは、再起動すると失われます。それらを構成ファイル(/etc/audit/rules.d/CentOS 7のディレクトリなど)に配置できます。正確な場所は、OSのバージョンによって異なります。auditctlマニュアルページはこちら役立つはずです。

ただし、注意してください。これにより、大量のログメッセージが生成されます。ディスクに十分なスペースがあることを確認してください。

必要に応じて、ルールを特定のユーザーまたは特定のコマンドに制限できます。

また、注意してください。ユーザーがコマンド実行でパスワードを入力すると(例:)mysql --user=username --password=passwd、これはログに記録されます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.