web-dev-qa-db-ja.com

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

rrdtoolの特定のインスタンスをログに記録して、受け取っているパスが正しくないかどうかを確認する方法を探しています。

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

11
Peter Grace

はい、カーネル機能があります。監査サブシステムです。 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を実行してすべての監査ルールを削除します。

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

snoopy を使用できます。

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

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

6
Bostjan Skufca

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

例えばこれらのコマンドを実行すると:

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

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

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

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

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

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

2
Stephen Harris