我管理几个服务器,其中有几个用户拥有 sudo 权限。
它的设计就是这样的。这些是开发服务器,用户需要能够更新/安装软件并对其进行配置。对此有严格的规定,但这还不够。
这对服务器管理团队来说是一个问题,因为每当出现问题时,就必须进行清理并使其再次正常运行。
每次有人安装软件包和/或更改 /etc/ 文件时,是否有办法收到通知?
我用 Google 搜索,但得到的唯一结果只有 apticron,这并不是我要找的东西。
这将非常有用,因为一方面它可以控制滥用安装,另一方面可以快速跟踪已完成的操作并在必要时恢复。
欢迎任何其他可能有助于解决此问题的建议。
答案1
在“vanilla”(无需下载其他软件)中,您必须编写一个脚本来监视 /var/log/auth.log 文件。每当用户使用“su”成为 root 或任何其他用户时,都会在此处输入其 UID:
Apr 24 04:32:57 Hostname sudo: pam_unix(sudo:session): session opened for user root by (uid=0)
这会告诉您谁在何时成为 root 用户。然后,您还可以解析每个用户的 bash 历史记录(存储在主目录中的 /home/user/.bash_history 中)。最后,您的脚本将如下所示:
for name in $(awk --field-separator=":" '{print $1}' /etc/passwd); do echo $name >> /var/log/report; cat /home/$name/.bash_history | grep -i "apt install" >> /var/log/report; done
您也可以轻松地将“apt-install”替换为“sudo”,以查看正在运行的所有 sudo 命令实例,但此脚本可以节省您查看谁安装了程序的时间。如果他们使用“su”成为 root,则需要采取额外步骤将其与 auth.log 文件中的时间戳和 UID 绑定。只要您的开发人员没有该访问权限并且只能运行 sudo,就没有必要这样做(但如果您的某个开发人员修改了他们的 bash 历史记录,那么所有这些都会失败)
至于监控整个 /etc 目录,我的建议是明确查看时间戳。每当对文件执行修改时(实际更改某些内容/写入文件),时间戳ls -l
就会更新:
-rw------- 1 user user 32500 Apr 24 04:25 .bash_history
这个脚本会稍微复杂一些,因为它需要递归遍历目录,这要求它还包含逻辑来确定某个项目是否是目录。不过,除了递归之外,它还会查看 ls-l 输出的字段 6、7、8,最好在一天结束时运行一次,并检查时间戳是否等于当天的日期。如果是,它会记下更改或创建了哪些文件。