我的首席安全官 (CSO) 想要记录特权帐户 (root) 的活动。我知道我可以配置 sudo 来记录用户输入(击键)和控制台/终端输出(stdout/stderr),如中所述如何在“sudo su -”中记录命令?。但内容始终记录到本地文件中。 root 用户可以轻松擦除该文件!
我已在 /etc/sudoers 中启用日志记录:
Defaults>root log_input, log_output
Defaults iolog_dir=/var/log/sudo-io
或同等学历
root ALL = (ALL) LOG_INPUT: LOG_OUTPUT: ALL
如何保护文件不被删除?
答案1
您在服务器上本地执行的任何操作都可以被管理员或黑客规避,具体情况由管理员或黑客决定。确保任何日志完整性的唯一方法是将它们记录(或至少将它们复制)到远程系统日志服务器。我不会详细介绍如何完成此操作,因为这是一个众所周知的概念。如果您不知道,请搜索并阅读syslog-ng
。确保远程系统日志服务器只能由 CSO 团队访问,而不能由系统管理团队的任何人访问。职责分离是确保日志不被篡改的唯一方法。如果我是你们的 CSO,我会将服务器物理放置在操作员或系统管理员无法访问的地方。因为,一旦您可以物理访问任何盒子,安全性就消失了。我的2分钱。
答案2
两种选择:
本地日志记录(但 root 帐户可以以一种或另一种方式擦除文件)
您可以使用chattr +a
目录来制作它仅附加。但不幸的是,这个属性不会继承到新的文件和目录(“chattr +a”对目录有什么作用)。
chattr -R +a /var/log/sudo-io
然后你可以使用一个利用内核的inotify功能的工具来设置仅附加新文件和目录的属性(请参阅: 自动为新创建的文件/文件夹设置追加属性?)。 (这里可能存在定时攻击)
SELinux 当然可以帮助限制这里的用户特权帐户! (staff_u
并且sysadm_u
无法访问日志)
远程记录
不幸的是,日志文件的布局和格式使得使用 syslog 转发变得困难(每个会话 5 个文件):
/var/log/sudo-io
/var/log/sudo-io/seq
/var/log/sudo-io/00
/var/log/sudo-io/00/00
/var/log/sudo-io/00/00/02
/var/log/sudo-io/00/00/02/stdout
/var/log/sudo-io/00/00/02/log
/var/log/sudo-io/00/00/02/timing
/var/log/sudo-io/00/00/02/stderr
/var/log/sudo-io/00/00/02/ttyout
/var/log/sudo-io/00/00/01
/var/log/sudo-io/00/00/01/stdin
/var/log/sudo-io/00/00/01/stdout
/var/log/sudo-io/00/00/01/log
/var/log/sudo-io/00/00/01/timing
/var/log/sudo-io/00/00/01/ttyin
/var/log/sudo-io/00/00/01/stderr
/var/log/sudo-io/00/00/01/ttyout
iolog_dir
通过使用 NFS/CIFS 将sudo 指定的目录挂载到远程服务器,可以轻松地将日志文件写入远程服务器。 NFS 导出目录需要chattr +
如上所述。
显然,该服务器应该更安全,以便用户无法连接到该服务器并删除那里的文件:-)。
注意sudo 将拒绝运行如果无法创建日志文件:sudo:无法打开 /var/log/sudo-io/seq:权限被拒绝