我的老板自愿担任我们生产 Redhat 服务器的系统管理员。他要求我加强安全保卫,避免rm -f *
发生不久前发生的类似事故。
现在,我们有 53 个用户通过 sudo 进入机器,这是一场审计噩梦。我想知道是否可以仅允许用户在一周中的特定日期访问。
例如,我可以允许用户“Joe”仅在周二和周四登录,而“Jane”仅在周日登录吗?可以etc/sudoers
定制以允许这样做吗?
除了使用 sudoers 之外,还有更好的方法吗?
答案1
sudo
与 Linux 机器上的几乎所有其他内容一样,它通过 PAM 进行身份验证。
所以你应该能够使用来pam_time.so
做到这一点。
至少在 Debian 上默认情况下,该模块未启用。您需要添加一行,如下所示:
account requisite pam_time.so
仅/etc/pam.d/sudo
启用 sudo 或/etc/pam.d/common-account
(在 pam-auth-update 块之后)启用系统上的所有程序。
然后编辑/etc/security/time.conf
以设置您的限制。服务名称应该是sudo
.例如,要允许 Fredsudo
仅在周五下午 3 点到 5 点之间使用:
sudo;*;fred;Fr1500-1700
(注意:我还没有对此进行测试。)
编辑:需要明确的是,我同意其他答案和各种评论者的观点,似乎有太多人以 root 身份运行了太多命令,你确实需要解决这个问题。当然,如果他们可以成为 root,他们就可以编辑 pam 配置...
答案2
我会质疑为什么 53 个用户需要 sudo 来完成日常工作——对于大多数用户(甚至开发人员)来说,sudo 应该是一个罕见的例外,而不是有人随意运行命令的例行公事sudo rm -rf *
。
您能否使用组权限(或更高级的 ACL)来让人们访问完成工作所需的文件,也许使用一些 setuid 或 sudo 脚本或二进制文件来让他们执行诸如重新启动服务之类的操作? (请注意,编写安全的 setuid/sudo 脚本很困难,因此更重要的是让诚实的人保持诚实)。
即使您可以限制人们每周只有一天可以访问 sudo,一周内仍然有 53 个人可以访问 sudo,因此这并不能真正帮助解决您的核心问题。
就此而言,我会质疑是否有那么多用户需要访问生产服务器——您可以将日志或他们需要的任何数据/文件发送到非生产计算机吗?
答案3
最简单的方法是使用 sudoers.d 目录(通过includedir)进行配置。然后,您可以使用 cron 作业,根据您的需要将每个用户的规则放入该目录中。
#includedir 指令可在 /etc/sudoers 中使用来创建 sudoers.d 目录,您可以将 sudoers 规则作为规则的一部分放入其中。例如,给定:
#includedir /etc/sudoers.d
sudo 将读取 /etc/sudoers.d 中的每个文件,跳过以“~”结尾或包含“.”的文件名字符以避免导致包管理器或编辑器临时/备份文件出现问题。文件按词汇顺序进行解析。也就是说, /etc/sudoers.d/01_first 将在 /etc/sudoers.d/10_second 之前解析。请注意,由于排序是词法排序,而不是数字排序,因此 /etc/sudoers.d/1_whoops 将在 /etc/sudoers.d/10_second 之后加载。在文件名中使用一致数量的前导零可以避免此类问题。
请注意,与通过 #include 包含的文件不同,visudo 不会编辑 #includedir 目录中的文件,除非其中之一包含语法错误。仍然可以使用 -f 标志运行 visudo 来直接编辑文件。
当您希望 joe 具有访问权限时,/etc/sudoers.d/joe 就会出现,您只需删除该文件即可取消访问权限。
答案4
您可以添加一个 crontab 将用户放入 sudo 组,然后添加第二个 crontab 将该用户删除。