前言
你好,欢迎来到 Linux 运维第四章的第二部分!
在第二章(2-1)中,我们学习了 sudo 的基础用法——如何让普通用户临时获取 root 权限。但在实际生产环境中,需求远比"给不给 root 权限"要复杂得多:
- 运维组需要重启 Nginx,但不需要管理 MySQL
- DBA 组需要管理 MySQL,但不能看 Nginx 配置
- 开发组只需要查看日志,而且最好不用输密码
这些精细化的权限控制,都需要深入理解 sudoers 配置文件的语法。
今天我们将系统学习:
- sudoers 配置文件语法:用户、主机、运行身份、命令
- 用户与组授权:单个用户、用户组
- NOPASSWD 免密码配置:场景与风险
- 别名(Alias):User_Alias、Cmnd_Alias 等
- Rocky vs Ubuntu 的配置差异
- 日志审计:谁、什么时候、做了什么
- 实战案例:为若依项目团队配置精细化权限
学完今天的内容,你将能根据实际业务需求,设计出合理的 sudo 权限体系。
好,让我们正式开始今天的旅程 🚀
一、sudoers 配置文件
1.1 配置文件位置
# 主配置文件
/etc/sudoers
# 独立配置文件目录(推荐在此添加,避免覆盖主文件)
/etc/sudoers.d/
⚠️ 重要:必须使用 visudo 命令编辑,它会检查语法错误,防止配置错误导致 sudo 无法使用。
# 编辑主配置文件
visudo
# 编辑独立配置文件(推荐)
visudo -f /etc/sudoers.d/ruoyi
1.2 基础语法格式
用户/组 主机=(运行身份) 命令
| 用户/组 | 谁可以执行 | ruoyi、%devops |
| 主机 | 在哪个主机上生效 | ALL(所有主机)、db-server |
| 运行身份 | 以哪个用户身份执行 | ALL(所有用户)、root |
| 命令 | 可以执行什么命令 | ALL(所有命令)、/usr/bin/systemctl |
二、基础配置示例
2.1 给单个用户授权
# 让 ruoyi 可以执行所有命令(相当于完全 root 权限)
ruoyi ALL=(ALL) ALL
# 让 ruoyi 可以执行 Nginx 相关命令(精细化)
ruoyi ALL=(ALL) /usr/bin/systemctl restart nginx, /usr/bin/systemctl stop nginx
# 让 ruoyi 可以启动 MySQL
ruoyi ALL=(ALL) /usr/bin/systemctl start mysqld
2.2 给组授权
# devops 组所有成员可以执行所有命令
%devops ALL=(ALL) ALL
# dba 组可以管理 MySQL
%dba ALL=(ALL) /usr/bin/systemctl start mysqld, /usr/bin/systemctl stop mysqld
2.3 免密码执行(NOPASSWD)
# 免密码执行所有命令(⚠️ 谨慎使用,风险极高)
ruoyi ALL=(ALL) NOPASSWD: ALL
# 仅对特定命令免密码(推荐)
ruoyi ALL=(ALL) NOPASSWD: /usr/bin/systemctl status nginx, /usr/bin/systemctl status mysqld
# 大部分命令需要密码,只有 status 免密码(最佳实践)
ruoyi ALL=(ALL) ALL, NOPASSWD: /usr/bin/systemctl status nginx, /usr/bin/systemctl status mysqld
💡 最佳实践:只有低风险命令(如查看状态)才配置 NOPASSWD,高风险操作(如删除、重启)必须要求密码。
2.4 Rocky vs Ubuntu 适配差异
| Rocky/RHEL | 支持 * 通配符 | 可以使用 |
| Ubuntu | 支持但行为不同,可能造成安全隐患 | 不推荐在路径中使用 * |
Ubuntu 上不推荐写法:
# ❌ Ubuntu 不推荐(路径通配符可能产生意外匹配)
ruoyi ALL=(ALL) NOPASSWD: /usr/bin/systemctl status *
%developer ALL=(ALL) NOPASSWD: /usr/bin/ruoyi/*
Ubuntu 推荐写法(明确列出具体命令):
# ✅ Ubuntu 推荐:明确列出具体命令
ruoyi ALL=(ALL) NOPASSWD: /usr/bin/systemctl status nginx, /usr/bin/systemctl status mysql
%developer ALL=(ALL) NOPASSWD: /usr/bin/cat /var/log/nginx/access.log, /usr/bin/cat /var/log/nginx/error.log
三、别名(Alias)
当需要管理多个用户或命令时,使用别名可以大幅简化配置。
3.1 四种别名类型
| User_Alias | 用户别名 | User_Alias ADMINS = ruoyi, alice, bob |
| Runas_Alias | 运行身份别名 | Runas_Alias DB = mysql, postgres |
| Host_Alias | 主机别名 | Host_Alias WEB_SERVERS = web1, web2, web3 |
| Cmnd_Alias | 命令别名 | Cmnd_Alias NGINX = /usr/bin/systemctl restart nginx, /usr/bin/systemctl status nginx |
3.2 别名配置示例
# /etc/sudoers.d/ruoyi
# 定义用户别名
User_Alias DEVOPS = ruoyi-admin, ruoyi-ops
User_Alias DBA = ruoyi-dba
# 定义命令别名
Cmnd_Alias NGINX = /usr/bin/systemctl restart nginx, /usr/bin/systemctl start nginx, /usr/bin/systemctl stop nginx
Cmnd_Alias MYSQL = /usr/bin/systemctl restart mysqld, /usr/bin/systemctl stop mysqld, /usr/bin/systemctl start mysqld
Cmnd_Alias LOGS = /usr/bin/cat /var/log/nginx/access.log, /usr/bin/cat /var/log/nginx/error.log
# 授权:运维组管理 Nginx 和查看日志
DEVOPS ALL=(ALL) NGINX, LOGS
# 授权:DBA 组管理 MySQL
DBA ALL=(ALL) MYSQL
# 开发组可以查看日志(免密码,低风险)
%developer ALL=(ALL) NOPASSWD: LOGS
💡 别名的优势:当需要新增一个用户或命令时,只需在别名定义处添加一行,而不需要修改多处授权规则。
四、Ubuntu 上 visudo 编辑器配置
Ubuntu 执行 visudo 默认打开的是 nano 编辑器。如果习惯使用 vim,可以通过以下方式切换。
4.1 临时切换到 vim(单次生效)
# 执行 visudo 时指定编辑器
EDITOR=vim visudo
# 或编辑指定文件
EDITOR=vim visudo -f /etc/sudoers.d/ruoyi
4.2 永久切换到 vim(推荐)
# 在 ~/.bashrc 中设置默认编辑器
echo 'export EDITOR=vim' >> ~/.bashrc
source ~/.bashrc
# 验证
echo $EDITOR
输出示例:
vim
之后直接执行 visudo 就会使用 vim。
五、日志审计
sudo 的所有操作都会记录到系统日志中,便于审计和追溯。
# Rocky Linux (RHEL 系) 日志位置
tail -f /var/log/secure
# Ubuntu (Debian 系) 日志位置
tail -f /var/log/auth.log
# 查看 sudo 相关的日志
grep sudo /var/log/secure
日志输出示例:
Jul 20 09:32:16 magedu sudo[8540]: ruoyi-dba : TTY=pts/0 ; PWD=/home/ruoyi-dba ; USER=root ; COMMAND=/usr/bin/systemctl start mysqld
日志字段解读:
| Jul 20 09:32:16 | 时间戳 |
| magedu | 主机名 |
| sudo[8540] | 进程名和 PID |
| ruoyi-dba | 执行 sudo 的用户 |
| TTY=pts/0 | 终端 |
| PWD=/home/ruoyi-dba | 当前目录 |
| USER=root | 以 root 的身份执行 |
| COMMAND=/usr/bin/systemctl start mysqld | 执行的命令 |
💡 审计价值:当系统出现问题时,可以通过日志追溯到"谁在什么时间执行了什么命令",这是安全审计的核心依据。
六、实战案例:为若依项目团队配置权限
6.1 场景需求
| 运维组 | ruoyi-ops | 可重启 Nginx,可查看所有日志 |
| DBA 组 | ruoyi-dba | 可管理 MySQL(启动、停止、重启) |
| 开发组 | ruoyi-dev | 可查看所有日志(免密码) |
6.2 环境准备
创建用户和组:
# 创建用户组
groupadd ops
groupadd dba
groupadd dev
# 创建用户(Rocky)
useradd ruoyi-ops -G ops
useradd ruoyi-dba -G dba
useradd ruoyi-dev -G dev
# 设置用户密码
echo "ruoyi-ops:YANGel23" | chpasswd
echo "ruoyi-dba:YANGel23" | chpasswd
echo "ruoyi-dev:YANGel23" | chpasswd
安装并启动服务:
# 安装 Nginx 和 MySQL
dnf -y install nginx mysql-server
# 启动服务
systemctl start nginx
systemctl start mysqld
# 验证服务运行
ps aux | grep -E 'nginx|mysql'
6.3 配置 sudoers
创建独立配置文件:
visudo -f /etc/sudoers.d/ruoyi
写入以下内容:
# ============================================
# 若依项目 sudo 权限配置
# ============================================
# 1. 定义用户别名
User_Alias OPS = ruoyi-ops
User_Alias DBA = ruoyi-dba
User_Alias DEV = ruoyi-dev
# 2. 定义命令别名
Cmnd_Alias NGINX_CMDS = /usr/bin/systemctl restart nginx, /usr/bin/systemctl start nginx, /usr/bin/systemctl stop nginx, /usr/bin/systemctl status nginx
Cmnd_Alias MYSQL_CMDS = /usr/bin/systemctl restart mysqld, /usr/bin/systemctl start mysqld, /usr/bin/systemctl stop mysqld, /usr/bin/systemctl status mysqld
Cmnd_Alias LOG_CMDS = /usr/bin/cat /var/log/nginx/access.log, /usr/bin/cat /var/log/nginx/error.log, /usr/bin/tail -f /var/log/nginx/access.log, /usr/bin/tail -f /var/log/nginx/error.log
# 3. 授权规则
# 运维组:管理 Nginx + 查看日志
OPS ALL=(ALL) NGINX_CMDS, LOG_CMDS
# DBA 组:管理 MySQL
DBA ALL=(ALL) MYSQL_CMDS
# 开发组:查看日志(免密码)
DEV ALL=(ALL) NOPASSWD: LOG_CMDS
6.4 验证权限
验证运维组权限:
# 切换到 ruoyi-ops
su – ruoyi-ops
# 尝试重启 Nginx(应该成功)
sudo systemctl restart nginx
# 尝试查看日志(应该成功)
sudo cat /var/log/nginx/access.log
# 尝试管理 MySQL(应该被拒绝)
sudo systemctl stop mysqld
输出示例(被拒绝):
Sorry, user ruoyi-ops is not allowed to execute '/usr/bin/systemctl stop mysqld' as root on magedu.
验证 DBA 组权限:
# 切换到 ruoyi-dba
su – ruoyi-dba
# 尝试管理 MySQL(应该成功)
sudo systemctl restart mysqld
# 尝试查看 Nginx 日志(应该被拒绝)
sudo cat /var/log/nginx/access.log
验证开发组免密码权限:
# 切换到 ruoyi-dev
su – ruoyi-dev
# 查看日志(免密码,直接成功)
sudo cat /var/log/nginx/access.log
# 尝试重启 Nginx(应该被拒绝,且需要密码)
sudo systemctl restart nginx
6.5 查看审计日志
# 查看所有 sudo 操作记录
grep sudo /var/log/secure | tail -10
输出示例:
Jul 20 09:32:16 magedu sudo[8540]: ruoyi-ops : TTY=pts/0 ; PWD=/home/ruoyi-ops ; USER=root ; COMMAND=/usr/bin/systemctl restart nginx
Jul 20 09:35:22 magedu sudo[8560]: ruoyi-dba : TTY=pts/0 ; PWD=/home/ruoyi-dba ; USER=root ; COMMAND=/usr/bin/systemctl status mysqld
Jul 20 09:38:45 magedu sudo[8580]: ruoyi-dev : TTY=pts/0 ; PWD=/home/ruoyi-dev ; USER=root ; COMMAND=/usr/bin/cat /var/log/nginx/access.log
✅ 审计完成:所有操作都有记录,责任可追溯。
七、结语
恭喜你!😊 到这里,你已经完成了 Linux 运维第四章(4-2)的全部学习内容。
今天我们系统学习了:
- sudoers 配置文件语法:用户 主机=(运行身份) 命令
- 用户与组授权:单个用户和用户组的授权方式
- NOPASSWD 免密码配置:使用场景与安全风险
- 别名(Alias):User_Alias、Cmnd_Alias 等,大幅简化配置
- Rocky vs Ubuntu 差异:通配符 * 的行为差异与最佳实践
- visudo 编辑器切换:Ubuntu 从 nano 切换到 vim
- 日志审计:/var/log/secure 和 /var/log/auth.log
- 实战案例:为若依项目团队配置精细化权限
sudo 权限委派是 Linux 安全体系的重要组成部分。掌握了今天的内容,你就能根据实际业务需求,设计出"最小权限、责任到人、操作可审计"的权限体系。
如果在学习过程中遇到任何问题,欢迎在评论区留言讨论!也别忘了**点赞收藏,**方便以后查阅~
附录:核心知识点速查表
| 编辑 sudoers 主文件 | visudo |
| 编辑独立配置文件 | visudo -f /etc/sudoers.d/ruoyi |
| 查看 sudo 日志(Rocky) | tail -f /var/log/secure |
| 查看 sudo 日志(Ubuntu) | tail -f /var/log/auth.log |
| 搜索 sudo 操作记录 | grep sudo /var/log/secure |
| 临时指定编辑器 | EDITOR=vim visudo |
| 永久设置编辑器 | echo 'export EDITOR=vim' >> ~/.bashrc |
| 验证 sudo 权限 | sudo -l |
| 查看用户组 | groups ruoyi-ops |
附录:sudoers 语法速查
| ruoyi ALL=(ALL) ALL | ruoyi 可以在任何主机以任何用户身份执行任何命令 |
| ruoyi ALL=(ALL) /usr/bin/systemctl restart nginx | ruoyi 只能重启 Nginx |
| %devops ALL=(ALL) ALL | devops 组所有成员可以执行任何命令 |
| ruoyi ALL=(ALL) NOPASSWD: ALL | ruoyi 免密码执行所有命令(⚠️ 风险高) |
| ruoyi ALL=(ALL) ALL, NOPASSWD: /usr/bin/systemctl status nginx | 大部分要密码,status 免密码(推荐) |
sudoers 语法格式:
用户/组 主机=(运行身份) 命令
附录:别名定义速查
| User_Alias | User_Alias 别名 = 用户1, 用户2 | User_Alias OPS = ruoyi-ops, alice |
| Runas_Alias | Runas_Alias 别名 = 用户1, 用户2 | Runas_Alias DB = mysql, postgres |
| Host_Alias | Host_Alias 别名 = 主机1, 主机2 | Host_Alias WEB = web1, web2 |
| Cmnd_Alias | Cmnd_Alias 别名 = 命令1, 命令2 | Cmnd_Alias NGINX = /usr/bin/systemctl restart nginx |
附录:Rocky vs Ubuntu 配置对照
| sudoers 编辑命令 | visudo | visudo |
| sudo 日志位置 | /var/log/secure | /var/log/auth.log |
| 默认 visudo 编辑器 | vim | nano |
| sudo 组 | wheel | sudo |
| 路径通配符 * | ✅ 支持 | ⚠️ 不推荐 |


