管理员通过个人用户名登录服务器,然后运行sudo -i以成为root用户,这是公司的政策。运行sudo -i时,sudo会创建一个名为SUDO_USER的环境变量,其中包含原始用户的用户名。

是否可以使用类似于以下语法的方式在syslog中记录所有命令:

${TIME/DATE STAMP}: [${REAL_USER}|${SUDO_USER}]: ${CMD}


示例条目将是:

Sat Jan 19 22:28:46 CST 2013: [root|ksoviero]: yum install random-pkg


显然,它不一定与上述语法完全相同,只需包含最少的实际用户(例如root),sudo用户(例如ksoviero)和运行的完整命令(例如yum install random-pkg)。

我已经尝试过snoopy,但其中不包含SUDO_USER变量。

评论

您需要审核。

这是auditd的简短介绍

有人可以将其发布为答案吗?请说明我将如何严格记录用户运行的所有命令。 “ auditd的简要介绍”很有用,但它不包含与记录实际命令有关的任何内容(据我所知,该内容仍然如此)。

好的,我已经开始使用auditd,虽然我已经将它记录为正在运行的所有命令,但是它不包含SUDO_USER变量(或等效信息),而且我找不到包含它的方法。任何帮助将不胜感激!

该公司将如何处理管理员输入的所有命令的记录?

#1 楼

更新:
评论和后续问题中弹出的另外2件事:


以这种方式使用auditd将大大增加您的日志量,尤其是在系统通过命令行大量使用。调整您的日志保留策略。

Auditd创建它们的主机上的日志与同一框中的其他文件一样安全。将您的日志转发到远程日志收集服务器,例如ELK或Graylog,以保留日志的完整性。另外,在上述要点之外,它还可以更主动地删除旧日志。

正如迈克尔·汉普顿(Michael Hampton)所建议的那样,auditd是此处工作的正确工具。

我在Ubuntu 12.10安装上进行了测试,因此您的里程在其他系统上可能会有所不同。



安装auditd

apt-get install auditd


将这两行添加到/etc/audit/audit.rules中:

-a exit,always -F arch=b64 -F euid=0 -S execve
-a exit,always -F arch=b32 -F euid=0 -S execve



它们将跟踪由root(euid=0)运行的所有命令。为什么要有两个规则?必须使用32位和64位代码跟踪execve的系统调用。


要摆脱日志中的auid=4294967295消息,请将audit=1添加到内核的cmdline中(通过编辑/etc/default/grub

将行

session required pam_loginuid.so



放置在与登录相关的所有PAM配置文件中(/etc/pam.d/{login,kdm,sshd}),但不要放置在相关的文件中到susudo
这将使auditd在调用uidsudo时正确获取主叫用户的su


立即重新启动系统。
先登录并登录运行一些命令:

    $ id -u
    1000
    $ sudo ls /
    bin  boot  data  dev  etc  home  initrd.img  initrd.img.old  lib  lib32  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  scratch  selinux  srv  sys  tmp  usr  var  vmlinuz  vmlinuz.old
    $ sudo su -
    # ls /etc
    [...]


这将在/var/log/audit/auditd.log中产生类似的结果:

----
time->Mon Feb  4 09:57:06 2013
type=PATH msg=audit(1359968226.239:576): item=1 name=(null) inode=668682 dev=08:01 mode=0100755 ouid=0 ogid=0 rdev=00:00
type=PATH msg=audit(1359968226.239:576): item=0 name="/bin/ls" inode=2117 dev=08:01 mode=0100755 ouid=0 ogid=0 rdev=00:00
type=CWD msg=audit(1359968226.239:576):  cwd="/home/user"
type=EXECVE msg=audit(1359968226.239:576): argc=2 a0="ls" a1="/"
type=SYSCALL msg=audit(1359968226.239:576): arch=c000003e syscall=59 success=yes exit=0 a0=10cfc48 a1=10d07c8 a2=10d5750 a3=7fff2eb2d1f0 items=2 ppid=26569 pid=26570 auid=1000 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=pts0 ses=1 comm="ls" exe="/bin/ls" key=(null)
----
time->Mon Feb  4 09:57:06 2013
type=PATH msg=audit(1359968226.231:575): item=1 name=(null) inode=668682 dev=08:01 mode=0100755 ouid=0 ogid=0 rdev=00:00
type=PATH msg=audit(1359968226.231:575): item=0 name="/usr/bin/sudo" inode=530900 dev=08:01 mode=0104755 ouid=0 ogid=0 rdev=00:00
type=CWD msg=audit(1359968226.231:575):  cwd="/home/user"
type=BPRM_FCAPS msg=audit(1359968226.231:575): fver=0 fp=0000000000000000 fi=0000000000000000 fe=0 old_pp=0000000000000000 old_pi=0000000000000000 old_pe=0000000000000000 new_pp=ffffffffffffffff new_pi=0000000000000000 new_pe=ffffffffffffffff
type=EXECVE msg=audit(1359968226.231:575): argc=3 a0="sudo" a1="ls" a2="/"
type=SYSCALL msg=audit(1359968226.231:575): arch=c000003e syscall=59 success=yes exit=0 a0=7fff327ecab0 a1=7fd330e1b958 a2=17cc8d0 a3=7fff327ec670 items=2 ppid=3933 pid=26569 auid=1000 uid=1000 gid=1000 euid=0 suid=0 fsuid=0 egid=1000 sgid=1000 fsgid=1000 tty=pts0 ses=1 comm="sudo" exe="/usr/bin/sudo" key=(null)
----
time->Mon Feb  4 09:57:09 2013
type=PATH msg=audit(1359968229.523:578): item=1 name=(null) inode=668682 dev=08:01 mode=0100755 ouid=0 ogid=0 rdev=00:00
type=PATH msg=audit(1359968229.523:578): item=0 name="/bin/su" inode=44 dev=08:01 mode=0104755 ouid=0 ogid=0 rdev=00:00
type=CWD msg=audit(1359968229.523:578):  cwd="/home/user"
type=EXECVE msg=audit(1359968229.523:578): argc=2 a0="su" a1="-"
type=SYSCALL msg=audit(1359968229.523:578): arch=c000003e syscall=59 success=yes exit=0 a0=1ceec48 a1=1cef7c8 a2=1cf4750 a3=7fff083bd920 items=2 ppid=26611 pid=26612 auid=1000 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=pts0 ses=1 comm="su" exe="/bin/su" key=(null)
----
time->Mon Feb  4 09:57:09 2013
type=PATH msg=audit(1359968229.519:577): item=1 name=(null) inode=668682 dev=08:01 mode=0100755 ouid=0 ogid=0 rdev=00:00
type=PATH msg=audit(1359968229.519:577): item=0 name="/usr/bin/sudo" inode=530900 dev=08:01 mode=0104755 ouid=0 ogid=0 rdev=00:00
type=CWD msg=audit(1359968229.519:577):  cwd="/home/user"
type=BPRM_FCAPS msg=audit(1359968229.519:577): fver=0 fp=0000000000000000 fi=0000000000000000 fe=0 old_pp=0000000000000000 old_pi=0000000000000000 old_pe=0000000000000000 new_pp=ffffffffffffffff new_pi=0000000000000000 new_pe=ffffffffffffffff
type=EXECVE msg=audit(1359968229.519:577): argc=3 a0="sudo" a1="su" a2="-"
type=SYSCALL msg=audit(1359968229.519:577): arch=c000003e syscall=59 success=yes exit=0 a0=7fff327ecab0 a1=7fd330e1b958 a2=17cc8d0 a3=7fff327ec670 items=2 ppid=3933 pid=26611 auid=1000 uid=1000 gid=1000 euid=0 suid=0 fsuid=0 egid=1000 sgid=1000 fsgid=1000 tty=pts0 ses=1 comm="sudo" exe="/usr/bin/sudo" key=(null)
----
time->Mon Feb  4 09:57:09 2013
type=PATH msg=audit(1359968229.543:585): item=1 name=(null) inode=668682 dev=08:01 mode=0100755 ouid=0 ogid=0 rdev=00:00
type=PATH msg=audit(1359968229.543:585): item=0 name="/bin/bash" inode=6941 dev=08:01 mode=0100755 ouid=0 ogid=0 rdev=00:00
type=CWD msg=audit(1359968229.543:585):  cwd="/root"
type=EXECVE msg=audit(1359968229.543:585): argc=1 a0="-su"
type=SYSCALL msg=audit(1359968229.543:585): arch=c000003e syscall=59 success=yes exit=0 a0=13695a0 a1=7fffce08a3e0 a2=135a030 a3=7fffce08c200 items=2 ppid=26612 pid=26622 auid=1000 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=pts0 ses=1 comm="bash" exe="/bin/bash" key=(null)
----
time->Mon Feb  4 09:57:11 2013
type=PATH msg=audit(1359968231.663:594): item=1 name=(null) inode=668682 dev=08:01 mode=0100755 ouid=0 ogid=0 rdev=00:00
type=PATH msg=audit(1359968231.663:594): item=0 name="/bin/ls" inode=2117 dev=08:01 mode=0100755 ouid=0 ogid=0 rdev=00:00
type=CWD msg=audit(1359968231.663:594):  cwd="/root"
type=EXECVE msg=audit(1359968231.663:594): argc=3 a0="ls" a1="--color=auto" a2="/etc"
type=SYSCALL msg=audit(1359968231.663:594): arch=c000003e syscall=59 success=yes exit=0 a0=7fff8c709950 a1=7f91a12149d8 a2=1194c50 a3=7fff8c709510 items=2 ppid=26622 pid=26661 auid=1000 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=pts0 ses=1 comm="ls" exe="/bin/ls" key=(null)


auid列包含主叫用户的uid,它允许您过滤该用户使用以下命令运行的命令

 ausearch -ua 1000


这甚至会列出以root用户身份运行的命令。

来源:


http://www.woitasen.com.ar/2011/11/auditing-user-actions-after-sudo/
http://linux.die.net/man/8/pam_loginuid
http ://linux.die.net/man/8/auditd


评论


+50这个答案似乎是最全面的,尽管我对它最终变得相当复杂感到有些失望。感谢您的贡献。

–草根
13年2月7日在21:09

请注意,这些更改会大大增加/var/log/audit/audit.log中的日志量。在将两个execve行添加到audit.rules之后,我对该文件的日志量增加了一倍以上

– JDS
16年1月18日在17:17

请注意:在某些发行版中(例如,至少是Ubuntu 18.04+),您不应修改/etc/audit/audit.rules,而应修改/etc/audit/rules.d/audit.rules。根据子目录中包含的文件重新创建/etc/audit/audit.rules文件,因此对它的更改将丢失。

– Giacomo Alzetta
19年11月12日在10:15

#2 楼

请记住,sudo本身会将所有sudo命令记录在syslog中,因此,所有受过特权的用户都应该受过教育,不仅要简单地使用sudo来获取root shell,还应该::

sudo command p1 p2 ... pn


我想到的这种方法或任何方法的问题是,作为root用户,很难阻止用户逃避任何特定类型的日志记录。因此,您尝试执行的任何操作都会<100%,抱歉。

教育,文件编制,执法尤其是信任是必要的。

评论


我知道没有什么是完美的,但是我们永远无法像您所描述的那样使每个人都能工作。这些是我们正在谈论的系统管理员;)

–索维耶罗
2013年1月20日16:46



这是不对的。至少我亲自与之合作的两家非常大的公司(由大量的系统管理员组成)已经制定了这项政策!同样,通过教育和执法,它可以起作用。

– mdpc
13年1月20日在17:48



mdpc是100%正确。这正是sudo命令的用途。我在一个由十个系统管理员和数百个主机组成的商店中,并且我们对所有内容使用单独的sudo命令-有一项特定的策略禁止通过su成为root-。这是确保管理员操作得到正确审核的唯一合理方法。

–杰夫·阿尔伯特
13年2月2日,0:08

-1教育永远不会这样做。我们生活在外包的世界中,您只是系统管理员众多客户之一。

–草根
13年2月7日在21:20

#3 楼

我曾经遇到过同样的问题,不得不提出一种快速而肮脏的解决方案-每个sudo用户在运行命令sudo -i后都会有自己的历史文件。

/root/.bashrc中,我添加了以下行-

 export HISTFILE=/root/.bash_history-$SUDO_USER
 export HISTTIMEFORMAT="%F %T "


因此,每位root用户的用户都将拥有一个历史记录文件.bash_history-username。

另一种方法-

将以下代码添加到/root/.bashrc,它将把用户名,sudo-user和命令附加到日志文件(无论是否设置了通知级别),很可能是/ var / log / messages。

function log2syslog
{
   declare COMMAND
   COMMAND=$(fc -ln -0)
   logger -p local1.notice -t bash -i -- "${USER}:${SUDO_USER}:${COMMAND}"
}
trap log2syslog DEBUG


贷方-http://backdrift.org/logging-bash-history-to-syslog-using-traps

评论


不错的方法,尽管要求的不尽相同。我想查看经过审核或类似的解决方案。

–草根
13年1月31日在20:13

好吧,我已经更新它,以依靠陷阱方法。

–丹尼尔(Daniel t。)
2013年1月31日20:24

对于合法用户,这可行。但是,如果该帐户被破解,则破解者可以通过运行/ bin / sh,取消设置HISTFILE或/ bin / bash --norc来快速禁用bash历史记录。

– Stefan Lasiewski
13年2月1日在21:01

#4 楼

实际上,许多机构禁止使用auditd,因为它占用大量资源,并且可能导致拒绝服务攻击的机会。

一种解决方案是配置最新的Korn Shell(ksh-93,有关详细信息,请参见http://kornshell.com/),以root身份执行的所有命令都记录到远程syslog服务器,然后根据政策要求,除紧急情况外,系统管理员必须使用个人帐户登录并通过sudo执行增强的Korn Shell。日志检查可以检测管理员何时从批准的外壳中启动另一个外壳以掩盖其踪迹,然后可以根据需要对SA进行培训。

#5 楼

记录启用的会话时,Sudo称为sudoreplay,以后可以重播,其工作方式类似于script命令,该命令使终端会话的打字稿稍后可以使用scriptreplay命令重播。

#6 楼

到目前为止,其他所有答案并没有什么问题,但是,如果您确定通过sudo进行syslog的日志记录令人满意,那么我是否建议您做些麻烦:通过网络将其记录到远程审核主机。

解决了“现在我已经成为root用户,可以从日志中删除任何渎职痕迹”的问题了。您现在可能已经是本地机器上的root用户,但是您无法从网络中回叫该日志包,并且(大概)您在远程审核主机上没有root用户特权。

我多年来,我一直在我管理的某些网络中执行此操作,它还具有其他两个信号优势:

首先,网络上有一个地方可以检查所有syslog,这使操作更加容易事件的相关性,因此是一站式服务,例如“当juno抱怨NFS服务器hera没有响应时,是否有人同时抱怨同一件事?如果是,那么hera很可能是问题,让我们看看她记录的内容;如果不是,那么juno的网络连接就更可疑了,让我们看看当时的juno还有什么记录。”。

其次,syslog日志轮换变得更容易:您不要不会将日志副本在本地主机上保留几天以上,但是您要确保审核服务器上有大量的磁盘空间e,并将所有系统日志保存几年。另外,例如,如果您要将它们写入WORM介质以进行法医审计,则只需购买一个WORM驱动器。

#7 楼

从2.0.0版开始,史努比能够记录任意环境变量。这是史努比示例配置文件的链接,您可以在其中找到有关%{env:NAME_OF_MY_ENV_VAR_I_WANT_LOGGED}语法的所有信息。
但是,最近的评论指出,记录tty的所有者是对“谁以root身份执行该命令?”。
公开:我是Snoopy的维护者。
编辑:更改了链接以直接指向相关文档(显然,某些人在存储库中找不到它) +稍微改写。

评论


请提供有关如何根据OP的要求进行设置的说明,而不是提供简单的链接。谢谢。

– Andrea Lazzarotto
17年8月15日在15:00

-1。这只是史努比的插件。您遵循了披露的内容,但仍未回答帖子中的问题;您刚刚链接到您的项目。

–邓肯X辛普森
18年1月19日在17:02