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


11

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

我知道我可以将可执行文件包装在可以记录参数的shell脚本中,但是我想知道是否还有一种更特定于内核的方式来监视它,也许是一个文件系统回调,它可以在特定的/ proc / pid / exe文件中看到匹配给定的二进制?


有没有办法auditd记录命令行参数以及程序是否运行?serverfault.com/questions/765179/…–
Neil

Answers:


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/rrdtool呢?我什至不知道rrdtool相关软件如何。
Graeme 2014年

@Graeme问题中描述的问题是跟踪的调用rrdtool。如果要记录所有程序的调用,请删除该-F path=…部分(当然,您会获得很多日志)。
吉尔斯(Gilles)'所以

是的...问题的第一行。谢谢。
Graeme

一切都很好,但是如何将配置重置为初始状态?否则,它将继续使用新的和新启动的命令填充日志...还是此auditctl命令仅在重新启动后才有效?
罗斯兰

@Ruslan的效果auditctl只有在重新启动后才能保持,但是无论如何,这是个好主意,我已经添加了有关删除它们而不重新启动答案的说明。
吉尔斯(Gilles)'所以

6

您可以使用snoopy

Snoopy是一种更轻量级的解决方案,因为它不需要内核合作。所有需要的是动态加载程序(dl),该加载程序预装了snoopy库,该库的路径在中指定/etc/ld.so.preload

披露:我目前是史努比的维护者。


是否可以仅直接或间接地从特定外壳生成命令记录日志?
RV

我不确定我是否理解您的问题-您是说“ shell”是用作shell的特定程序(bash,dash,zsh等),还是您想只记录特定的PTY?史努比提供了过滤框架,但是目前仅实现了几个非常基本的过滤器,请参阅此处的列表:link。如果您有一个适用于其他用户的具体用例,请在功能请求中进行说明,哦,顺便说一句,欢迎使用补丁程序:)
Bostjan Skufca 2015年

我的意思是只是特定的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

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

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

但是要当心……这将导致生成大量日志消息。确保磁盘上有足够的空间!

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

并且要当心;如果用户在执行命令中输入了密码(例如mysql --user=username --password=passwd),则将其记录下来。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.