无需密码执行timedatectl设置系统时间的sudoers配置问题
嘿,我来帮你搞定这个sudoers配置的问题!首先得给你提个关键提醒:永远不要直接用普通编辑器编辑/etc/sudoers文件,一定要用sudo visudo命令,它会在你保存前检查语法错误,避免因为写错配置导致sudo功能失效,那可就麻烦了。
现在来看你的配置问题,你写的规则本身语法没大问题,但可能有几个点导致它不生效:
可能的原因及解决办法
规则顺序不对:sudoers是按从上到下的顺序匹配规则的,如果你的
yellowfin ALL=(ALL) NOPASSWD: /usr/bin/timedatectl规则写在了类似%sudo ALL=(ALL:ALL) ALL这样的需要密码的组规则后面,而你的用户yellowfin又属于sudo组的话,sudo会先匹配到那个需要密码的组规则,自然还是会要求你输密码。
解决办法:把你的NOPASSWD规则移到所有需要密码的规则前面,比如放在root ALL=(ALL:ALL) ALL这一行的下面,%sudo规则的上面。权限范围太宽泛(可选优化):你当前的规则允许用户
yellowfin无密码执行所有timedatectl命令,包括修改时区等操作,从安全角度来说,最好只开放你需要的set-time操作,这样更符合最小权限原则。修改后的规则应该是:yellowfin ALL=(ALL) NOPASSWD: /usr/bin/timedatectl set-time *这里的
*是匹配任意时间参数,确保你能传入具体的时间值。测试时要用绝对路径:有时候用户习惯用
timedatectl而不是/usr/bin/timedatectl,但sudo的环境PATH可能和普通用户不同,所以测试的时候一定要用完整的绝对路径执行命令,比如:sudo /usr/bin/timedatectl set-time "2024-05-20 14:30:00"
更规范的配置方式(可选)
除了修改主sudoers文件,你还可以在/etc/sudoers.d/目录下创建一个单独的配置文件(比如99-yellowfin-timedatectl),内容就是上面的规则。这种方式不会改动主sudoers文件,更便于管理和排查问题,而且同样会被sudo加载。注意这个文件的权限必须是0440,否则sudo会忽略它,你可以用sudo chmod 0440 /etc/sudoers.d/99-yellowfin-timedatectl来设置权限。
按照上面的方法调整后,再测试应该就不会再要求输入密码啦!
备注:内容来源于stack exchange,提问作者SBFRF

