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

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

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

引数を記録するシェルスクリプトで実行可能ファイルをラップできることを知っていますが、それを監視するカーネル専用の方法があるかどうかを知りたいです。特定の/proc/pid/で実行できるファイルシステムコールバックがあるかもしれません。与えられたものと一致するバイナリを見つけるときにexeを使用しますか?

答え1

はい、監査サブシステムと呼ばれるカーネル機能があります。デーモンはauditdロギングを実行し、コマンドはauditctlロギングルールを設定します。特定のシステムへのすべての呼び出しを記録し、いくつかのフィルタリングを実行できます。実行されたすべてのコマンドとそのパラメーターを記録するには、execveシステム呼び出しを記録してください。

auditctl -a exit,always -S execve

特定のプログラムへの呼び出しを具体的に追跡するには、プログラムの実行可能ファイルにフィルタを追加します。

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

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

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

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

答え2

使用できるスヌーピー

スヌーピーはカーネルの協力が必要ないので、より軽い解決策です。必要なのは、パスがあるスヌーピーライブラリをプリロードする動的ローダ(dl)です/etc/ld.so.preload

公開:私は現在スヌーピーマネージャーです。

答え3

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」は0ですが(実行中なのでsu)、「auid」は私のログインIDの500です。したがって、ユーザーがアカウントを切り替えた場合でも「監査ID」を追跡できますsusudo

これでauditctl、再起動時にこれらのコマンドが失われます。設定ファイル(/etc/audit/rules.d/CentOS 7のディレクトリなど)に配置できます。正確な場所はオペレーティングシステムのバージョンによって異なります。マニュアルauditctlページがここで役に立ちます。

しかし、注意してください。これにより、次のような状況が発生する可能性があります。たくさん生成するログメッセージの数。ディスクに十分なスペースがあることを確認してください!

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

また注意してください。ユーザーがコマンドの実行中にパスワードを入力すると、mysql --user=username --password=passwdこの内容が記録されます。

関連情報