有没有一种简单的方法来记录所有执行的命令,包括命令行参数?

有没有一种简单的方法来记录所有执行的命令,包括命令行参数?

我试图找到如何记录 的特定实例,rrdtool以查看它接收的路径是否不正确。

我知道我可以将可执行文件包装在一个记录参数的 shell 脚本中,但我想知道是否有一种更特定于内核的方法来监视它,也许是一个文件系统回调,可以在特定的 /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或您的发行版放置它们的任何位置。您需要成为 root 才能控制审计子系统。

完成调查后,使用相同的命令行而-d不是-a删除日志记录规则,或运行auditctl -D以删除所有审核规则。

出于调试目的,用包装器脚本替换程序可以让您更灵活地记录环境、有关父进程的信息等信息。

答案2

你可以使用史努比

Snoopy 是更轻量级的解决方案,因为它不需要内核合作。所需要的只是预加载 snoopy 库的动态加载器 (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

可以看到一些有趣的值;例如,“auid”是 500,这是我的登录 ID,即使“uid”为零(因为我正在运行su)。因此,即使用户可能已经切换了帐户susudo我们仍然可以追溯到他们的“审核 ID”

现在这些auditctl命令将在重新启动时丢失。您可以将它们放入配置文件中(例如/etc/audit/rules.d/,在 CentOS 7 上的目录中)。确切的位置取决于您的操作系统版本。手册auditctl页应该在这里提供帮助。

但要小心...这会导致很多要生成的日志消息的数量。确保磁盘上有足够的空间!

如有必要,可以将规则限制为特定用户或特定命令。

还要小心;如果用户在命令执行中输入密码(例如mysql --user=username --password=passwd),那么这将被记录。

相关内容