如何跟踪用户在Linux上创建的可执行文件?


11

使用Linux,我想跟踪以我的名字执行的可执行文件,包括整个命令行(实际上,每个exec *()以我自己的用户身份完成)。我应该控制一个程序,以便处理任务,执行我传入的程序,但我想确保它能够执行以及使用了哪些选项。我无法控制的程序是偷偷摸摸的,并且似乎会根据应为该任务执行的程序的名称来更改行为,因此我无法传递将记录信息并调用真实程序的shell脚本程序。

是否可以在Linux系统上以用户身份通知我所有exec *(),包括完整的命令行?就是ps没有循环运行。我宁愿直接在我工作的系统上执行此操作,而不需要root用户访问权限,但是如果需要,我可以生成一个我具有root用户访问权限的系统,然后安装程序并在那里进行调查。

使用Ubuntu 12.4 LTS。


我在这里问而不是问Ubuntu,因为它更多的是Unix / Linux问题,而不是真正的Ubuntu问题。
Pierre Lebeaupin 2013年

1
该程序有多狡猾?它会尝试检测或绕过调试器吗?它是动态链接的吗?如果太偷偷摸摸,您可能需要使用root用户所在的虚拟机。(即使对于不是特别偷偷摸摸的程序,这也可能是最简单的策略。)
吉尔斯(Gilles)'所以不要再邪恶了'

@Gilles这确实是可能的,我将尝试使用VM,然后更新问题,以确保它可行。
Pierre Lebeaupin 2013年

注意:您似乎实际上想要的是程序名和参数,答案提供audit了这些信息,但是shell中的“整个命令行”也会使用重定向/配管和envvar设置以及包含替换/扩展名,无意义的引用来影响子进程。和间距,以及诸如之类的控制结构doa && dob,您将一无所获。
dave_thompson_085

Answers:


10

您需要配置auditd以记录execve事件。在RHEL5上的示例:

[root@ditirlns01 ~]# auditctl -a always,entry -S execve
WARNING - 32/64 bit syscall mismatch, you should specify an arch
[root@ditirlns01 ~]#

我忽略了拱门警告,这似乎无关紧要,但是您可以根据需要使用-F arch=b64-F arch=b32设置它。

上面的结果是:

[root@ditirlns01 ~]# ls /tmp/whatever
ls: /tmp/whatever: No such file or directory
[root@ditirlns01 ~]# grep whatever /var/log/audit/audit.log
type=EXECVE msg=audit(1386797915.232:5527206): argc=3 a0="ls" a1="--color=tty" a2="/tmp/whatever"
type=EXECVE msg=audit(1386797927.133:5527241): argc=3 a0="grep" a1="whatever" a2="/var/log/audit/audit.log"
[root@ditirlns01 ~]#

这显然是快速而肮脏的,但这是您如何做的基础。您需要确切执行的操作可能很大程度上取决于您要精确执行的操作。您可以使用auditctl命令中的各种过滤器来减少审核流程,但是我不知道这些信息,因此也不知道要包括什么内容。如果您需要更具体的内容,建议您检查手册页或对此答案发表评论,我将对其进行更多更新。

希望能帮助您朝正确的方向前进。

编辑:

由于您的问题涉及查看特定用户,因此我可以向您展示:

[root@ditirlns01 ~]# auditctl -a always,entry -S execve -F euid=16777216
WARNING - 32/64 bit syscall mismatch, you should specify an arch

与上述相同,但只有execve使用有效用户ID运行的人员的16777216才会被记录。如果您需要指定用户的loginuid值(他们最初以谁身份登录到系统),则可以通过auid以下方式过滤:

[root@ditirlns01 ~]# auditctl -a always,entry -S execve -F auid=16777216
WARNING - 32/64 bit syscall mismatch, you should specify an arch

AUID / loginuid过滤器将很有用,例如,如果用户将执行“ a” su或“ sudoroot”操作。在那种情况下,会有很多东西以root用户身份运行,但是您只关心那些有问题的用户启动的东西。auditctl还可以让您堆叠过滤器,以便可以同时通过euid和进行过滤auid

[root@ditirlns01 ~]# auditctl -a always,entry -S execve -F auid=16777216 -F euid=0
WARNING - 32/64 bit syscall mismatch, you should specify an arch
[root@ditirlns01 ~]# ls /tmp/nashly -ltar
ls: /tmp/nashly: No such file or directory
[root@ditirlns01 ~]# grep nashly /var/log/audit/audit.log
type=EXECVE msg=audit(1386798635.199:5529285): argc=4 a0="ls" a1="--color=tty" a2="/tmp/nashly" a3="-ltar"
type=EXECVE msg=audit(1386798646.048:5529286): argc=3 a0="grep" a1="nashly" a2="/var/log/audit/audit.log"

1
“请注意,我没有超级用户访问权限”。(否则,这将是一个很好的答案。)
吉尔斯(Gilles)'所以

该死...太近了...
Bratchley

谢谢,那行得通。我应该补充一点,我必须通过apt-get安装auditctl,它不是预装在Ubuntu上的。
Pierre Lebeaupin 2013年

谢谢。很好的例子。但是,有什么方法可以使退出代码脱离审核日志?
Kaos

0

您问了一些简单的问题。我已经举了一个例子,mplayer但我想它可以适应其他情况:

#! /bin/sh
# This executable must be used instead of /usr/bin/mplayer
# do not forget the chmod +x filename...
LOG=/tmp/mplayer.log
echo "$@" >> $LOG
if [ -n "$1" ] && [ -f "$1" ] ; then
        filename="$1"
        echo "$(date "+%F %T") $(basename "$filename")" \
        | tee -a "$(dirname "$filename")/mplayer.log"  >> $LOG
fi
/usr/bin/mplayer "$@"

如您所见,这很简单:它解析第一个参数(因为它是一个文件),因此将日志写入中央文件$LOG并串联到一个文件中(该文件mplayer.log在同一目录中始终具有相同的名称)。

因此,用户可以在每个目录上获得他已阅读的最新电影。


问特别指出,替换脚本是行不通的。
dave_thompson_085

可能,但是这更适合我的情况:我没有安全性问题,可以选择运行的脚本。尽管看起来如此令人难以置信,但我拥有这种最简单,最简单的解决方案,也许其他人会对不关注仅适用于极客的东西感兴趣。我承认以前的解决方案更安全!
MUY比利时
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.