ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

给同事只开“重启 nginx“的权限:sudo-rs 的 sudoers 配置指南

给同事只开“重启 nginx“的权限:sudo-rs 的 sudoers 配置指南 给同事只开重启 nginx的权限sudo-rs 的 sudoers 配置指南【免费下载链接】sudo-rsA memory safe implementation of sudo and su.项目地址: https://gitcode.com/GitHub_Trending/su/sudo-rs你值班时同事喊你帮他重启一下 nginx。直接给 root 密码当然不是办法正确姿势是只给他能重启这一个服务的权限。sudo-rs 是用 Rust 写的内存安全版 sudo用编译期杜绝缓冲区溢出这类问题而这类授权需求最后都落在同一个文件/etc/sudoers。本文就从这一条最小规则讲起把 sudoers 配置的四要素、别名、Defaults、凭证缓存和执行环境一次讲清顺带给出一条改完就生效的核对命令。️ 场景怎么让 alice 只能重启 nginx规则长这样一行搞定alice ALL(root) /usr/bin/systemctl restart nginx四段分别是alice谁、ALL哪台主机、(root)以谁的身份、命令能执行什么。注意命令必须是绝对路径nginx、systemctl这种裸名在规则位置是不被接受的。改这一行的入口永远建议是visudo——它先做语法检查再落盘写错了不会把你锁在 sudo 外面。解析规则的四类位置在哪里实现可以看 src/sudoers/ 这个模块字段级细节以 sudoers man 页 为准。 sudoers 规则的四要素Runas_Spec 与 Chdir_Spec 怎么写第三个位置(root)叫 Runas_Spec人话说就是允许用谁的身份跑只写用户如(root)只能以这些用户身份运行只写组如(:www-data)还是调用者本人但组可以切到 www-data都写如(root:www-data)用户、组各取列表里的任意组合整个省略默认只能以 root 跑它后面那个位置可以放 Chdir_Spec即CWD/某目录用来规定命令的起始工作目录路径必须以/或~开头写*则允许用户自己用 sudo 的-D选项指定。不写的话命令就在调用者当前目录下执行。位置关系值得注意Runas_Spec 只对同一行里它后面的命令生效NOPASSWD、PASSWD 这类标签同理后面的标签还能覆盖前面的默认值。改完拿不准时sudo -l看到的才是真正解析出来的结果。别名系统把用户、身份、主机、命令当变量用规则多了以后会失控sudoers 给了四类变量User_Alias一组用户、Runas_Alias一组身份、Host_Alias一组主机、Cmnd_Alias一组命令。写法统一是类型 名字 项1, 项2, ...名字必须大写字母开头User_Alias OPS alice, bob Cmnd_Alias RESTART_NGINX /usr/bin/systemctl restart nginx OPS ALL(root) RESTART_NGINX好处是改一处生效一片把 RESTART_NGINX 里的命令路径换了所有引用它的规则自动跟着变。另外 ALL 是内置别名在命令位置写 ALL 等于放行一切给普通用户时要格外小心。Defaults动全局行为前先认得这几个开关Defaults 是 sudoers 里的全局行为开关语法Defaults [作用域]参数[值]。最容易被忽略的是 env_resetsudo-rs 强制开启且无法关闭所以命令永远跑在全新、最小化的环境里想保留个别变量走 env_keep 白名单。另一常用的是 secure_path它用你指定的 PATH 替代用户自己的防止用户 PATH 污染导致脚本里相对路径的命令被劫持仓库自带的 docs/sudoers.example 里就有这么一行。Defaults 还能带作用域可以全局设置也可以用主机、:用户、!命令、身份前缀只作用于某一部分。列表类参数支持、-增删比如示例文件里Defaults!/usr/sbin/visudo env_keep SUDO_EDITOR EDITOR VISUAL就是只给 visudo 保留编辑器变量。缓存有效期 timestamp_timeout 也在这里调默认 15 分钟。认证与凭证缓存15 分钟不重输密码的机制和su不一样的是sudo-rs 要求认证时校验的是调用者自己的密码而不是 root 的密码。显式设置 rootpw 标志后这一行为才会改变变成校验目标用户的密码——大多数场景不建议动它。认证成功后sudo-rs 按用户写 timestamp 文件记录里包含认证用的用户 ID、终端会话 ID、会话开始时间和时间戳。同一终端里 15 分钟内即 timestamp_timeout 的默认值再跑 sudo 不再要密码换个终端、或 SSH 新登录开个新会话就得重新认证因为每个终端是独立计时的。timestamp_timeout 设为 0 则每次都要求认证。 命令实际跑在什么环境里env_reset 的效果是你 sudo 跑出的每个命令都拿到一份全新的最小环境。HOME、MAIL、SHELL、USER、LOGNAME 按目标用户重新初始化PATH 和 TERM 如果没被保留会落到默认值LOGNAME 和 USER 被当作一组处理值以左括号开头的变量会被直接删掉防止 bash 把它解释成函数定义。资源限制方面sudo-rs 走操作系统的原生机制Linux 上通常由 pam_limits.so 这个 PAM 模块负责BSD 由/etc/login.conf指定系统没有对应机制时命令就沿用调用者本人的限制。日志这块不用你操心sudo-rs 默认把成功和失败的尝试连同错误信息都写进 syslog排查授权问题直接翻日志就行。改完之后做什么先 visudo -c再 sudo -l 核对三件事。第一sudo visudo -c做语法检查不通过就别保存避免把文件改坏后连自己都没法 sudo。第二用sudo -l -U alice看实际解析出来的规则是不是你写的那条。第三让 alice 跑一次授权命令再翻 syslog 确认这条成功记录在日志里证明审计通路正常。现在就执行这一条确认改动生效sudo -l -U alice输出里应该只有那一条 restart nginx 的规则多一条都说明配置写宽了。【免费下载链接】sudo-rsA memory safe implementation of sudo and su.项目地址: https://gitcode.com/GitHub_Trending/su/sudo-rs创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表