欢迎光临
我们一直在努力

Linux运维入门第四章(4-2):sudo权限委派进阶——从基础配置到精细化管理,一篇掌握!

前言

你好,欢迎来到 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 配置对照

配置项Rocky LinuxUbuntu
sudoers 编辑命令 visudo visudo
sudo 日志位置 /var/log/secure /var/log/auth.log
默认 visudo 编辑器 vim nano
sudo 组 wheel sudo
路径通配符 * ✅ 支持 ⚠️ 不推荐

附录:安全最佳实践

  • 最小权限原则:只授予用户完成任务所需的最少命令权限
  • 使用别名简化配置:当用户或命令较多时,使用别名提高可维护性
  • 区分 NOPASSWD 场景:只有低风险命令(如查看状态)才配置免密码
  • 定期审计日志:定期检查 /var/log/secure 或 /var/log/auth.log
  • 使用独立配置文件:在 /etc/sudoers.d/ 下创建独立文件,避免修改主文件
  • 始终使用 visudo:visudo 会检查语法错误,防止配置错误导致 sudo 不可用
  • 定期审查权限:定期检查哪些用户和组拥有 sudo 权限,及时回收不必要的权限
  • 赞(0)
    未经允许不得转载:171主机测评 » Linux运维入门第四章(4-2):sudo权限委派进阶——从基础配置到精细化管理,一篇掌握!
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址