背景
在 Linux 系统中,有些操作需要 root 权限,例如重启服务、修改系统配置、查看硬件信息等。如果让普通用户每次都切换到 root 账户或者输入 root 密码,既不安全又不方便。
sudo(Superuser Do)是 Linux 下的权限委托机制,允许管理员精确控制"哪个用户"可以"在哪台机器上"以"哪个身份"执行"哪些命令",并且可以免输密码(NOPASSWD)。合理配置 sudoers 文件,是生产环境中运维和自动化部署的标准实践。
1. 安全编辑 /etc/sudoers
永远不要用普通编辑器(如 vim /etc/sudoers)直接修改 sudoers 文件。应使用 visudo,它会在保存时进行语法检查,防止因格式错误导致所有用户无法使用 sudo:
sudo visudo
如果想直接编辑某个独立配置文件(推荐做法):
# 在 /etc/sudoers.d/ 目录下创建独立配置文件(推荐)
sudo visudo -f /etc/sudoers.d/deploy
💡 推荐:将自定义规则放到
/etc/sudoers.d/目录下,而不是直接修改主文件,便于管理和回滚。
2. sudoers 配置格式详解
sudoers 的核心格式如下:
who where=(as_whom) [NOPASSWD:] commands
各字段说明:
who:执行命令的用户(或以
%开头的用户组)where:允许从哪些主机执行,
ALL表示所有主机(as_whom):以哪个用户的身份执行,
(root)或(ALL)NOPASSWD:(可选):免输密码
commands:允许执行的命令路径,
ALL表示所有命令,!前缀表示排除
⚠️ 命令必须使用绝对路径,可用
which 命令名查看路径,例如which systemctl。
3. 实用配置示例
示例一:免密执行单个命令
允许 jetson 用户免密执行 dmidecode(查看硬件信息):
jetson ALL=(root) NOPASSWD: /usr/sbin/dmidecode
示例二:限制来源主机 + 排除危险命令
james 用户只能从指定 IP 登录,并执行 /usr/sbin/ 下的所有命令,但不允许执行 userdel:
james 192.168.175.136,192.168.175.138=(root) /usr/sbin/, !/usr/sbin/userdel
示例三:允许用户组免密管理服务
ops 组的成员可以免密重启、停止、启动系统服务:
%ops ALL=(root) NOPASSWD: /bin/systemctl restart *, /bin/systemctl stop *, /bin/systemctl start *
示例四:部署账户免密执行特定脚本
CI/CD 自动化部署场景中,允许 deploy 用户免密执行部署脚本:
deploy ALL=(root) NOPASSWD: /opt/scripts/deploy.sh, /bin/systemctl restart myapp
示例五:用户组完全免密 sudo(慎用)
Ubuntu 系统中,sudo 组默认配置如下,可作为参考:
%sudo ALL=(ALL:ALL) ALL
若需完全免密:
%sudo ALL=(ALL:ALL) NOPASSWD: ALL
4. /etc/sudoers.d/ 目录使用规范
主文件 /etc/sudoers 末尾通常有如下一行,表示会自动加载该目录下的所有配置:
@includedir /etc/sudoers.d
最佳实践:
# 为 deploy 用户创建独立配置
sudo visudo -f /etc/sudoers.d/deploy
# 写入内容
deploy ALL=(root) NOPASSWD: /bin/systemctl restart myapp
# 验证语法(退出 visudo 时自动检查)
# 或手动验证
sudo visudo -c -f /etc/sudoers.d/deploy
5. 安全注意事项
最小权限原则:只授予用户必要的命令权限,不要随意使用
NOPASSWD: ALL。使用绝对路径:命令必须写绝对路径,防止通过 PATH 注入执行恶意命令。
禁止编辑器/Shell 获取 root:不要授权
vim、bash、python等可以逃逸到 shell 的命令,否则等同于直接给 root 权限。定期审查:定期
sudo -l -U username检查各用户的权限,及时回收不再需要的授权。日志审计:生产环境确保
/var/log/auth.log或journald记录 sudo 操作日志,便于安全审计。
总结
sudo + sudoers 是 Linux 权限委托的核心机制,合理使用可以在保证安全的同时提升运维效率。记住几个关键点:
✅ 用
visudo编辑,不要直接 vim✅ 自定义规则放
/etc/sudoers.d/,便于管理✅ 命令用绝对路径,配合
NOPASSWD:实现免密✅ 遵循最小权限原则,禁止授权 shell/编辑器类命令