そこで、どのプロセスがルートにディレクトリ ']' を作成しているのかを知りたかったのです。これはスクリプトのタイプミスだと思っていました。そこで、そのディレクトリの監査を設定しました。この質問。
翌日、ログをチェックしたところ、ディレクトリが再度作成され、監査によって記録されていたことがわかりました。しかし、この出力からわかるのは、根作成しました。
出力:
type=SYSCALL msg=audit(26.04.2013 06:25:20.275:85) : arch=i386 syscall=mkdir success=yes exit=0 a0=bfd02ea5 a1=1ed a2=bfd02ea5 a3=bfd025b8 items=2 ppid=24114 pid=24115 auid=unset uid=root gid=root euid=root suid=root fsuid=root egid=root sgid=root fsgid=root tty=(none) ses=4294967295 comm=mkdir exe=/bin/mkdir key=weird
行ごとに区切る:
type=SYSCALL
msg=audit(26.04.2013 06:25:20.275:85) :
arch=i386
syscall=mkdir
success=yes
exit=0 a0=bfd02ea5
a1=1ed a2=bfd02ea5 a3=bfd025b8
items=2 ppid=24114 pid=24115
auid=unset
uid=root
gid=root
euid=root
suid=root
fsuid=root
egid=root
sgid=root
fsgid=root
tty=(none)
ses=4294967295
comm=mkdir
exe=/bin/mkdir
key=weird
どのスクリプトがこのコマンドをルートとして発行するかを知りたいです。それは可能ですか? その PPID を使用しているプロセスは実行されなくなりました。
答え1
これが cron によって開始されたスクリプトによって発生したと仮定すると、すべての crond の子をトレースできます。
strace -p $CRONPID -f -o /path/to/cron-strace.log -e trace=mkdir
出力は次のようになります:
Process 3584 attached
Process 18227 attached
[pid 18227] execve("./testscript", ["./testscript"], [/* 100 vars */]) = 0
Process 18228 attached
[pid 18228] execve("/usr/bin/mkdir", ["mkdir", "/home/hl/tmp/strace-testdir"], ...) = 0
[pid 18228] mkdir("/home/hl/tmp/strace-testdir", 0777) = 0
もちろん、strace はスクリプトの実行速度を低下させますが、通常は問題にはなりません。
答え2
この出力だけでは、どのプログラムがコマンドを呼び出したかを判断することはできませんmkdir
。
あなたが持っている場合BSDプロセスアカウンティング次のコマンドは、PID 24114 を持つプログラムを表示します。
dump-acct /var/log/account/pacct | awk -F '|' '$10 ~ / 24114 / {print}'
これはおそらく ですsh
。列 10 (|
区切り文字として を使用) には、記録されたプロセスの PID とその PPID が含まれているため、PPID を使用して検索を繰り返すと、呼び出されたプログラムsh
などを確認できます。また、プロセスが開始された時刻もわかるため、どの cron ジョブであったかを判断するのに役立つ場合があります。
Auditd のみを使用する場合、ディレクトリを変更するコマンドやディレクトリ内のファイルにアクセスするコマンドを記録するために、呼び出しだけでなくそのディレクトリへのすべてのアクセスを記録する必要がありますmkdir
。ディレクトリは作成されているが、他には何もアクセスしない場合は、auditd だけではこれを把握するのに十分ではないと思います。