公司政策是管理员通过个人用户名登录服务器,然后运行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安装随机 pkg)。
我已经试过了snoopy
,但它不包括SUDO_USER
变量。
更新:在评论和后续问题中又出现了 2 件事:
auditd
这种方式将显着增加您的日志量,尤其是当系统通过命令行大量使用时。调整您的日志保留策略。Auditd
创建它们的主机上的日志与同一个盒子上的其他文件一样安全。将您的日志转发到远程日志收集服务器,如 ELK 或 Graylog,以保持日志的完整性。另外,除了上面的一点,它还允许更积极地删除旧日志。正如 Michael Hampton 所建议的那样,
auditd
是完成此处工作的正确工具。我在 Ubuntu 12.10 安装上对此进行了测试,因此您的里程在其他系统上可能会有所不同。
安装
auditd
:apt-get install auditd
将这两行添加到
/etc/audit/audit.rules
:这些将跟踪 root (
euid=0
) 运行的所有命令。为什么有两个规则?execve
必须在 32 位和 64 位代码中跟踪系统调用。要删除
auid=4294967295
日志中的消息,请添加audit=1
到内核的 cmdline(通过编辑/etc/default/grub
)放线
session required pam_loginuid.so
在与登录 ( ) 相关的所有 PAM 配置文件中
/etc/pam.d/{login,kdm,sshd}
,但不在与su
或相关的文件中sudo
。这将允许在调用or时正确auditd
获取调用用户的。uid
sudo
su
立即重新启动系统。
让我们登录并运行一些命令:
这将产生类似这样的东西
/var/log/audit/auditd.log
:该
auid
列包含调用用户的uid
,它允许您过滤此用户运行的命令这甚至会列出用户以 root 身份运行的命令。
资料来源:
请记住,sudo 本身会在系统日志中记录所有 sudo 命令,因此应该教育所有特权用户不要简单地通过 sudo 来获得 root shell,而是要:
这种方法或我想到的任何方法的问题是,作为
root
用户,很难阻止用户逃避任何特定类型的日志记录。因此,您尝试的任何事情都将 < 100% 我很抱歉地说。教育、文件、执法以及最重要的信任是必要的。
我曾经遇到过同样的问题,不得不想出一个快速而肮脏的解决方案——每个 sudo 用户在运行命令后都会有自己的历史文件
sudo -i
在
/root/.bashrc
我添加以下行 -所以每个 sudo 到 root 的用户都会有一个历史文件 .bash_history-username。
另一种方法 -
添加以下代码
/root/.bashrc
,它会将用户名、sudo-user 和命令附加到日志文件,其中设置了通知级别,很可能是 /var/log/messages。感谢 - http://backdrift.org/logging-bash-history-to-syslog-using-traps
许多机构实际上禁止使用 auditd,因为它是资源密集型的,并且可能导致拒绝服务攻击的机会。
一种解决方案是配置最新的 Korn shell(ksh-93,有关详细信息,请参阅http://kornshell.com/)以将所有以 root 身份执行的命令记录到远程系统日志服务器,然后根据策略要求,除非在紧急情况下在某些情况下,系统管理员使用个人帐户登录并通过 sudo 执行增强的 Korn shell。检查日志可以检测管理员何时从批准的 shell 启动另一个 shell 以掩盖他们的踪迹,然后可以根据需要对 SA 进行教育。
当启用的会话被记录并且可以稍后重播时,Sudo 有一个叫做sudoreplay
script
的东西,其工作方式类似于制作终端会话打字稿的命令,稍后可以使用该scriptreplay
命令重播。到目前为止,并不是说其他答案有任何问题,但是如果您认为
sudo
通过的日志记录syslog
令人满意,我可以建议一个皱纹:通过网络将其记录到远程审计主机。这解决了“现在我已经成为 root,我可以从日志中删除任何我渎职的痕迹”的问题。您现在可能是本地机器上的 root 用户,但您不能从网络中调用该日志数据包,而且您(大概)在远程审计主机上没有 root 权限。
多年来,我一直在用我管理的一些网络这样做,它还有另外两个信号优势:
首先,网络上有一个地方可以检查所有系统日志,这样可以更容易地关联事件,因此是一个一站式调查商店,例如“当
juno
抱怨 NFS 服务器hera
没有响应时,是否有其他人抱怨同时做同样的事情?如果是这样,hera
很可能是问题所在,让我们看看她记录了什么;如果不是,则juno
网络连接更值得怀疑,让我们看看当时还juno
记录了什么。”。其次,syslog 日志轮换变得更容易:您不会在本地主机上保留日志副本超过几天,但您要确保审计服务器有大量磁盘空间,并将所有 syslog 保留在那里数年。另外,如果您想将它们写入 WORM 介质以用于法医审计等目的,您只需购买一个 WORM 驱动器。
从 2.0.0 版本开始,Snoopy 能够记录任意环境变量。这是 Snoopy 示例配置文件的链接,您可以在其中找到有关
%{env:NAME_OF_MY_ENV_VAR_I_WANT_LOGGED}
语法的所有信息。然而,最近的贡献指出,记录 tty 的所有者是对“谁以 root 身份执行该命令?”这个问题的一个相当有效和优雅的答案。
披露:我是史努比的维护者。
编辑:更改链接以直接指向相关文档(显然,某些人无法在回购中找到它)+ 轻微改写。