sudo 配置
适用于 CentOS Stream 9 & 10 / AlmaLinux 9.x & 10.x / Rocky Linux 9.x & 10.x
sudo 允许普通用户以其他用户(通常是 root)的身份执行命令,而无需知道 root 密码。正确配置 sudo 是服务器安全管理的关键环节。
- sudo 的工作原理和基本使用
- 使用
visudo安全编辑 sudoers 文件 - sudoers 文件语法
- 为用户和组配置 sudo 权限
- NOPASSWD 配置
- sudo 日志审计
- EL 系统上的 wheel 组
- 一台已安装 EL 9.x 的系统
- 当前拥有
sudo权限或能以 root 登录 - 了解用户和组管理的基本操作
sudo 基础
Section titled “sudo 基础”sudo 如何工作
Section titled “sudo 如何工作”当你执行 sudo <命令> 时:
- 系统检查
/etc/sudoers文件,确认当前用户是否有权限 - 要求用户输入自己的密码(不是 root 密码)
- 验证通过后,以目标用户身份(默认 root)执行命令
- 执行结果记录到系统日志
$ sudo systemctl restart nginx[sudo] password for admin:$ sudo -u postgres psql$ sudo -l输出示例:
Matching Defaults entries for admin on myserver: !visiblepw, always_set_home, match_group_by_gid, always_query_group_plugin, env_reset, env_keep="COLORS DISPLAY HOSTNAME HISTSIZE KDEDIR LS_COLORS", secure_path=/sbin:/bin:/usr/sbin:/usr/bin
User admin may run the following commands on myserver: (ALL) ALLEL 系统上的 wheel 组
Section titled “EL 系统上的 wheel 组”在 EL 系统中,wheel 组是默认的管理员组。属于 wheel 组的用户拥有完整的 sudo 权限。
$ getent group wheelwheel:x:10:admin$ sudo usermod -aG wheel newadmin这是 /etc/sudoers 中默认的 wheel 组配置:
$ sudo grep wheel /etc/sudoers## Allows people in group wheel to run all commands%wheel ALL=(ALL) ALL使用 visudo 编辑 sudoers
Section titled “使用 visudo 编辑 sudoers”visudo 命令会在保存时自动检查语法错误:
$ sudo visudo如果想使用其他编辑器:
$ sudo EDITOR=vim visudo使用 /etc/sudoers.d/ 目录
Section titled “使用 /etc/sudoers.d/ 目录”推荐将自定义配置放在 /etc/sudoers.d/ 目录下,而不是直接修改 /etc/sudoers 主文件:
$ sudo visudo -f /etc/sudoers.d/custom-rules确认主文件中包含了对该目录的引用(EL 9 默认已包含):
$ sudo grep "includedir" /etc/sudoers#includedir /etc/sudoers.dsudoers 语法详解
Section titled “sudoers 语法详解”用户 主机=(目标用户:目标组) 命令各部分说明:
| 部分 | 说明 |
|---|---|
| 用户 | 被授权的用户名,组名前加 % |
| 主机 | 该规则适用的主机,ALL 表示所有主机 |
| 目标用户 | 可以切换到的用户,ALL 表示所有用户 |
| 目标组 | 可以切换到的组(可选) |
| 命令 | 允许执行的命令,ALL 表示所有命令 |
常见配置示例
Section titled “常见配置示例”deploy ALL=(ALL) ALL%developers ALL=(ALL) ALLwebadmin ALL=(ALL) /usr/bin/systemctl restart nginx, /usr/bin/systemctl reload nginxdbadmin ALL=(postgres) ALLoperator ALL=(ALL) ALL, !/usr/bin/su, !/usr/bin/passwd root当多个用户需要相同的权限时,可以使用别名简化配置:
Cmnd_Alias WEB_CMDS = /usr/bin/systemctl restart nginx, \ /usr/bin/systemctl reload nginx, \ /usr/bin/systemctl status nginx
Cmnd_Alias PKG_CMDS = /usr/bin/dnf install *, \ /usr/bin/dnf update *, \ /usr/bin/dnf remove *webadmin ALL=(ALL) WEB_CMDSpkgadmin ALL=(ALL) PKG_CMDS也可以定义用户别名和主机别名:
User_Alias WEBTEAM = zhangsan, lisi, wangwuWEBTEAM ALL=(ALL) WEB_CMDSNOPASSWD 配置
Section titled “NOPASSWD 配置”默认情况下,使用 sudo 需要输入用户自己的密码。可以配置免密码执行:
deploy ALL=(ALL) NOPASSWD: ALLmonitor ALL=(ALL) NOPASSWD: /usr/bin/systemctl status *, /usr/bin/journalctl%wheel ALL=(ALL) NOPASSWD: ALL混合使用 PASSWD 和 NOPASSWD
Section titled “混合使用 PASSWD 和 NOPASSWD”operator ALL=(ALL) NOPASSWD: /usr/bin/systemctl status *, PASSWD: /usr/bin/systemctl restart *sudo 日志审计
Section titled “sudo 日志审计”sudo 的所有操作都会记录到系统日志,这对于安全审计非常重要。
$ sudo journalctl -u sudo$ sudo grep sudo /var/log/secure输出示例:
Mar 24 14:30:22 myserver sudo: admin : TTY=pts/0 ; PWD=/home/admin ; USER=root ; COMMAND=/usr/bin/systemctl restart nginx配置详细日志
Section titled “配置详细日志”可以在 sudoers 中配置额外的日志选项:
$ sudo visudo -f /etc/sudoers.d/loggingDefaults log_input, log_outputDefaults logfile="/var/log/sudo.log"Defaults iolog_dir="/var/log/sudo-io/%{seq}"实战:配置多级权限
Section titled “实战:配置多级权限”以下示例展示如何为不同角色配置不同的 sudo 权限。
-
创建角色配置文件
创建自定义 sudoers 文件 $ sudo visudo -f /etc/sudoers.d/team-roles -
定义命令别名
# 服务管理命令Cmnd_Alias SVC_CMDS = /usr/bin/systemctl start *, \/usr/bin/systemctl stop *, \/usr/bin/systemctl restart *, \/usr/bin/systemctl reload *, \/usr/bin/systemctl status *# 只读监控命令Cmnd_Alias MON_CMDS = /usr/bin/systemctl status *, \/usr/bin/journalctl *, \/usr/bin/top, \/usr/bin/htop, \/usr/bin/ss, \/usr/bin/df, \/usr/bin/free -
分配权限
# 运维人员:完整服务管理权限%ops ALL=(ALL) SVC_CMDS# 监控人员:只读权限,且无需密码%monitors ALL=(ALL) NOPASSWD: MON_CMDS# 部署账户:完整权限,免密码deploy ALL=(ALL) NOPASSWD: ALL -
创建对应的组并添加用户
创建组和添加用户 $ sudo groupadd ops$ sudo groupadd monitors$ sudo usermod -aG ops zhangsan$ sudo usermod -aG monitors lisi -
验证配置
验证 zhangsan 的权限 $ sudo -U zhangsan sudo -l
sudo 常用选项
Section titled “sudo 常用选项”| 命令 | 说明 |
|---|---|
sudo <命令> | 以 root 身份执行命令 |
sudo -u <用户> <命令> | 以指定用户身份执行命令 |
sudo -l | 列出当前用户的 sudo 权限 |
sudo -U <用户> -l | 列出指定用户的 sudo 权限(需 root) |
sudo -i | 切换到 root 的登录 Shell |
sudo -s | 以 root 启动一个 Shell(不切换环境) |
sudo -k | 清除 sudo 密码缓存 |
sudo -v | 刷新密码缓存的超时时间 |
提示 “xxx is not in the sudoers file”
Section titled “提示 “xxx is not in the sudoers file””用户没有 sudo 权限。以 root 身份将用户加入 wheel 组:
$ su -# usermod -aG wheel username# exit提示 “syntax error” 后无法使用 sudo
Section titled “提示 “syntax error” 后无法使用 sudo”如果错误地直接编辑了 /etc/sudoers 导致语法错误:
方法一:如果有其他有 sudo 权限的用户或能以 root 登录:
$ su -# visudo方法二:如果无法登录 root,需要进入 rescue mode。
sudo 密码缓存时间如何调整
Section titled “sudo 密码缓存时间如何调整”$ sudo visudo -f /etc/sudoers.d/timeoutDefaults timestamp_timeout=15设为 0 表示每次都要求输入密码。设为 -1 表示永不过期(不推荐)。
如何在脚本中使用 sudo
Section titled “如何在脚本中使用 sudo”在自动化脚本中,建议为执行脚本的用户配置 NOPASSWD 权限(限定具体命令),避免脚本执行时卡在密码输入环节。
deploy ALL=(ALL) NOPASSWD: /usr/bin/systemctl restart myapp, /usr/bin/dnf update myapp