Linux 权限控制:Sudoers 文件精细化命令授权管理

作者:袖梨 2026-07-20
sudoers 文件是命令级权限控制机制,须用 visudo 编辑、通过别名分层管理、精确指定绝对路径与参数、启用审计日志并严格测试。

Linux 的 sudoers 文件不是给 root 权限的快捷方式,而是实现命令级权限控制的核心机制。关键在于“只放行必要命令”,而不是开放大范围权限。用错路径、忽略语法检查、滥用通配符,都会埋下安全隐患。

必须用 visudo 编辑,别碰 /etc/sudoers

直接编辑 /etc/sudoers 文件极易因语法错误导致 sudo 失效,甚至锁死系统。正确做法是:

  • 使用 sudo visudo 打开主配置文件,或更推荐:sudo visudo -f /etc/sudoers.d/your-rule 新建独立配置文件(如 ops、db、backup)
  • 文件名不能带点或波浪号(ops.confops~ 会被系统忽略)
  • visudo 会在保存前自动校验语法、设权限为 440、阻止相对路径和括号不匹配等非法写法

用别名分层管理,规则才可读可维护

别在每条规则里重复写用户、主机、长命令路径。用三类别名抽象:

  • User_Alias BACKUP = alice, %backup-team
  • Host_Alias DB_SERVERS = db01, db02
  • Cmnd_Alias PG_CTL = /usr/bin/pg_ctl start, /usr/bin/pg_ctl stop, /usr/bin/pg_ctl reload
  • 组合授权:BACKUP DB_SERVERS = (postgres) PG_CTL —— 后续加人、加节点、增命令,只需改对应别名,不动主逻辑

命令授权必须精确到绝对路径 + 参数边界

安全底线是“只准做什么”,不是“不准做什么”:

  • 所有命令必须写绝对路径(/usr/bin/systemctl ≠ systemctl
  • 通配符 * 只能出现在末尾且仅用于参数(/usr/bin/tail /var/log/nginx/*.log 合规;/usr/bin/* 禁止)
  • 显式拒绝高危入口:!/bin/sh, !/usr/bin/python3 -c, !/usr/bin/perl
  • NOPASSWD 仅限具体动作(如 NOPASSWD: /usr/bin/systemctl restart nginx),不扩展到整个二进制

启用审计与终端绑定,确保每次操作可追溯

权限配置后不审计,等于没配:

  • 在 sudoers 文件顶部加:Defaults logfile="/var/log/sudo.log", log_input, log_output
  • Defaults requiretty —— 阻止 Web 后台、crontab、SSH 非交互式调用 sudo
  • 测试验证:sudo -l 查当前权限列表;sudo -u root whoami 测试执行能力;tail -f /var/log/sudo.log 实时观察调用行为

相关文章

精彩推荐