欢迎光临
我们一直在努力

运维实战之3分钟搭建“银行级”用户权限体系,新手也能一次搞定!

📌 前面:为什么你的服务器总像“菜市场”?

刚接手一台服务器,你是不是经常遇到这种场景:

开发说“我要看日志”,你直接给了他 root 密码;

DBA 说“我要重启 MySQL”,你大手一挥给了 sudo ALL;

运维同事重启 Nginx 时,不小心敲成了 reboot……

结果就是:权限失控 ≈ 服务器裸奔。

今天就带大家用一个真实后台管理系统的需求,手把手搭建一套标准化、可追溯、易扩展的用户权限体系。全程只需要 10 条命令,但背后的设计思想,足够你用上 3 年。

🎯 场景还原:

一个后台管理系统需要什么样的“安保”?假设我们有一套名为 “若依” 的后台管理系统,有三类角色:

角色用户名所属组他只能做什么?
运维小哥 ruoyi-admin devops 重启 Nginx、看 Nginx 状态(别的想都别想)
DBA 老哥 ruoyi-dba dba 启停 MySQL、看 MySQL 状态(删库?不存在的)
开发弟弟 ruoyi-dev developer 只看应用日志(tail 和 cat,改代码?门都没有)

核心思想就一句话

| 基于组授权,而不是基于人——以后新人来了,直接加入组,权限自动到位。

🧱 第 0 步:

1.准备工作(强烈建议)为了避免和之前的实验“打架”,建议用一台快照恢复过的干净虚拟机(Rocky Linux 10 / Ubuntu 22.04 均可)。

2. 如果你用的是 Ubuntu,注意命令和 Rocky 有一点点区别,我会特别标注。

🔧 第 1 步:创建三个"部门"——用户组

在 Linux 系统中,用户组(Group)就像是公司的"部门",它是权限管理的基础单元。通过将用户分配到不同的组,我们可以实现批量权限管理,而不是为每个用户单独设置权限。

为什么需要用户组?

想象一下,如果你的公司有 100 个开发人员,每个开发人员都需要访问相同的代码仓库和日志目录。如果没有用户组,你需要为这 100 个用户分别设置相同的目录权限。而有了用户组,你只需要:

  • 创建一个"developer"组
  • 设置该组对目录的访问权限
  • 将所有开发人员加入这个组
  • 这样,权限管理就变得简单高效。当有新员工加入时,只需将其加入对应的组,权限自动生效;当员工离职时,只需将其从组中移除,权限自动收回。

    创建三个核心用户组

    根据我们的场景需求,我们需要创建三个用户组,分别对应三个不同的角色:

    # 创建运维组
    groupadd devops
    创建数据库管理员组
    groupadd dba
    创建开发组
    groupadd developer

    这三个组分别代表:

    • devops:运维团队,负责服务器维护、服务部署和监控
    • dba:数据库管理员团队,负责数据库管理和维护
    • developer:开发团队,负责应用开发和维护

    验证用户组创建

    创建完成后,我们可以验证一下组是否成功创建:

    # 查看最后创建的三个组
    tail -3 /etc/group

    如果一切正常,你会看到类似这样的输出:

    devops:x:1001:
    dba:x:1002:
    developer:x:1003:

    这里的数字(1001、1002、1003)是组的 GID(Group ID),系统会自动分配。每个组的格式是:

    组名:密码占位符:GID:组成员列表

    用户组管理常用命令

    除了创建组,你还需要掌握以下常用命令:

    命令作用示例
    groupadd 创建新用户组 groupadd testgroup
    groupdel 删除用户组 groupdel testgroup
    groupmod 修改用户组属性 groupmod -n newname oldname
    gpasswd 管理组成员 gpasswd -a user group
    groups 查看用户所属组 groups username
    getent group 查看组信息 getent group groupname

    用户组文件详解

    Linux 中的用户组信息主要存储在以下两个文件中:

  • /etc/group:存储组的基本信息
  • /etc/shadow:存储组的加密密码(如果有)
  • 让我们看看 /etc/group 文件的具体格式:

    # 查看 devops 组的详细信息
    getent group devops

    输出格式为:组名:密码:GID:成员列表

    • 组名:组的名称
    • 密码:通常为"x"或"!",表示密码存储在 /etc/gshadow 中
    • GID:组的唯一标识符
    • 成员列表:属于该组的用户列表,用逗号分隔

    👤 第 2 步:招人!创建用户并"分部门"

    用户组就像公司的"部门",现在部门建好了,该"招人"了。我们将为每个角色创建对应的用户账户,并将他们分配到正确的"部门"(用户组)。

    创建用户并分配到组

    使用 useradd 命令创建用户,并通过 -g 参数指定主组,-G 参数指定附加组:

    # 创建运维用户,主组为 devops
    sudo useradd -m -s /bin/bash -g devops -G devops ruoyi-admin
    创建 DBA 用户,主组为 dba
    sudo useradd -m -s /bin/bash -g dba -G dba ruoyi-dba
    创建开发用户,主组为 developer
    sudo useradd -m -s /bin/bash -g developer -G developer ruoyi-dev

    参数说明:

    • -m:创建用户主目录(/home/用户名)
    • -s /bin/bash:指定用户的默认 shell 为 bash
    • -g devops:指定用户的主组(primary group)
    • -G devops:指定用户的附加组(supplementary groups)
    为用户设置初始密码

    创建用户后,需要为他们设置密码:

    # 为运维用户设置密码
    sudo passwd ruoyi-admin
    为 DBA 用户设置密码
    sudo passwd ruoyi-dba
    为开发用户设置密码
    sudo passwd ruoyi-dev

    系统会提示你输入并确认密码。建议使用强密码,或者使用 echo "密码" | passwd –stdin 用户名 进行批量设置(生产环境慎用)。

    验证用户创建和分组

    创建完成后,验证用户信息和所属组:

    # 查看用户基本信息
    id ruoyi-admin
    id ruoyi-dba
    id ruoyi-dev
    查看用户所属的所有组
    groups ruoyi-admin
    groups ruoyi-dba
    groups ruoyi-dev
    查看 /etc/passwd 中的用户记录
    grep -E "ruoyi-admin|ruoyi-dba|ruoyi-dev" /etc/passwd

    正常输出应该类似:

    # id ruoyi-admin
    uid=1001(ruoyi-admin) gid=1001(devops) groups=1001(devops)
    grep 输出示例
    ruoyi-admin:x:1001:1001::/home/ruoyi-admin:/bin/bash
    ruoyi-dba:x:1002:1002::/home/ruoyi-dba:/bin/bash
    ruoyi-dev:x:1003:1003::/home/ruoyi-dev:/bin/bash

    用户管理常用命令
    命令作用示例
    useradd 创建新用户 useradd -m -s /bin/bash username
    usermod 修改用户属性 usermod -aG groupname username
    userdel 删除用户 userdel -r username
    passwd 设置/修改密码 passwd username
    chage 修改密码过期策略 chage -l username
    id 查看用户ID和组信息 id username
    关键配置文件
  • /etc/passwd:存储用户账户信息(用户名、UID、GID、主目录、默认shell)
  • /etc/shadow:存储用户加密密码和密码策略
  • /etc/group:存储组信息(已在前一步创建)
  • /etc/sudoers:存储sudo权限配置(下一步重点)
  • 现在,我们的三个"员工"已经招聘到位,并分配到了正确的"部门"。下一步,我们将为他们配置具体的"工作权限"——精细化的sudo命令控制。

    🔑 第 3 步:发"门禁卡"——设置统一初始密码

    用户创建完成后,下一步就是为他们设置统一的初始密码,就像发放"门禁卡"一样。这一步看似简单,但却是安全管理的第一个实际接触点。

    为什么需要统一初始密码?

    在企业环境中,为新用户设置统一的初始密码有几个重要原因:

  • 标准化管理:统一的密码策略便于批量操作和审计
  • 强制首次登录修改:用户首次登录时必须修改密码,确保密码私密性
  • 简化入职流程:管理员可以快速为新员工开通账户
  • 安全基线:确保所有账户都有密码保护,避免空密码风险
  • 设置密码的两种方法

    在 Linux 中,设置用户密码主要有两种方式:

    方法一:交互式设置(推荐)

    # 为运维用户设置密码
    sudo passwd ruoyi-admin
    为 DBA 用户设置密码
    sudo passwd ruoyi-dba
    为开发用户设置密码
    sudo passwd ruoyi-dev

    执行命令后,系统会提示你输入并确认密码。这种方式最安全,因为密码不会出现在命令行历史中。

    方法二:非交互式设置(批量操作)

    # 使用 chpasswd 命令批量设置密码
    echo "ruoyi-admin:YANGge123" | sudo chpasswd
    echo "ruoyi-dba:YANGge123" | sudo chpasswd
    echo "ruoyi-dev:YANGge123" | sudo chpasswd

    或者使用 passwd 的 –stdin 选项:

    echo "YANGge123" | sudo passwd –stdin ruoyi-admin
    echo "YANGge123" | sudo passwd –stdin ruoyi-dba
    echo "YANGge123" | sudo passwd –stdin ruoyi-dev

    ⚠️ 重要安全提示:非交互式设置会将密码明文显示在命令行历史中,生产环境慎用!如果必须使用,请确保:

  • 立即清除命令历史:history -c
  • 设置密码后强制用户首次登录时修改密码
  • 使用强密码策略
  • 密码策略最佳实践

    为了确保密码安全,建议实施以下策略:

    策略项推荐配置说明
    密码复杂度 至少12位,包含大小写字母、数字、特殊字符 如:YANGge@2024#Secure
    密码有效期 90天强制修改 使用 chage -M 90 username 设置
    密码历史 记住最近5次密码 防止重复使用旧密码
    失败锁定 5次失败后锁定15分钟 防止暴力破解
    首次登录强制改密 必须启用 chage -d 0 username

    🛡️ 第 4 步:上"紧箍咒"——精细化 sudo 权限(核心中的核心!)

    前面的用户、用户组、密码都是"基础设施",真正让权限体系"活"起来的,是 sudo 精细化配置。这一步如果做错了,前面全白费;这一步做好了,你的服务器安全等级直接提升一个量级。

    为什么 sudo 权限需要"精细化"?

    很多人图省事,直接给用户加一行 username ALL=(ALL) ALL,这意味着这个用户可以执行任何命令,本质上等于给了 root 权限。一旦这个用户的密码泄露,攻击者就能为所欲为。

    精细化 sudo 的核心原则是:只给用户完成工作所需的最少命令,多一个都不给。这就是信息安全里的"最小权限原则"(Principle of Least Privilege)。

    sudoers 配置的黄金法则

    在动手之前,记住三条铁律:

  • 永远用 visudo 编辑:不要直接编辑 /etc/sudoers 文件,用 sudo visudo 或 sudo visudo -f /etc/sudoers.d/文件名。visudo 会在保存前检查语法,语法错误可能导致你彻底无法使用 sudo。
  • 使用独立的配置文件:不要在 /etc/sudoers 主文件里直接写规则,而是在 /etc/sudoers.d/ 目录下创建独立文件(如 /etc/sudoers.d/ruoyi),方便管理和迁移。
  • 按组授权,不按人授权:sudo 规则绑定到用户组(如 %devops),而不是个人用户。新人来了直接加组,权限自动到位。
  • 第一步:编写 sudoers 配置文件

    创建独立配置文件 /etc/sudoers.d/ruoyi:

    在打开的文件中写入以下内容:

    %devops ALL=(ALL) /usr/bin/systemctl restart nginx, /usr/bin/systemctl status nginx
    %dba ALL=(ALL) /usr/bin/systemctl start mysql, /usr/bin/systemctl stop mysql, /usr/bin/systemctl status mysql
    %developer ALL=(ALL) /usr/bin/tail -f /var/log/ruoyi/*, /usr/bin/cat /var/log/ruoyi/*

    配置解读:

    • %devops:百分号表示这是一个用户组,不是单个用户
    • ALL=(ALL):可以在任何主机上以任何用户身份执行(这是标准写法)
    • NOPASSWD::执行这些命令时不需要输入密码,适合自动化脚本场景。如果你希望每次执行都要输入密码(更安全),去掉 NOPASSWD: 即可
    • NGINX_CMDS:只能执行这个别名里定义的命令,多一个都不行

    ✅ 验收入:怎么知道我们做对了?

    1.保存退出后,立刻检查语法是否正确:

    # 检查 sudoers 配置语法
    sudo visudo -c

    如果输出 /etc/sudoers: parsed OK,说明语法没问题。如果报错,立即用 visudo 修复,千万不要退出当前终端——一旦语法错误且退出了 root shell,你可能再也 sudo 不回去了。

    2.逐用户验证权限

    分别切换到三个用户,测试他们的 sudo 权限边界:

    # === 测试运维用户 ruoyi-admin ===
    # 切换到运维用户
    su – ruoyi-admin
    ✅ 这些应该成功
    sudo systemctl status nginx # 查看 Nginx 状态,OK
    sudo systemctl restart nginx # 重启 Nginx,OK
    sudo nginx -t # 测试 Nginx 配置,OK
    ❌ 这些应该被拒绝
    sudo systemctl status mysql # 想偷看 MySQL?拒绝!
    sudo cat /etc/shadow # 想看密码文件?门都没有!
    sudo reboot # 想重启服务器?做梦!
    退出
    exit
    === 测试 DBA 用户 ruoyi-dba ===
    su – ruoyi-dba
    ✅ 这些应该成功
    sudo systemctl status mysql
    sudo systemctl restart mysql
    ❌ 这些应该被拒绝
    sudo systemctl status nginx # 想动 Nginx?越界了
    sudo reboot
    exit
    === 测试开发用户 ruoyi-dev ===
    su – ruoyi-dev
    ✅ 这些应该成功(假设 /var/log/app/ 下有日志文件)
    sudo tail -f /var/log/app/app.log
    sudo cat /var/log/app/error.log
    ❌ 这些应该被拒绝
    sudo cat /etc/passwd # 想看系统文件?不许
    sudo systemctl status nginx # 想管服务?没门
    exit

    3.当用户尝试执行未授权的命令时,sudo 会拒绝并记录日志:

    Sorry, user ruoyi-dev is not allowed to execute '/usr/bin/cat /etc/passwd' as root on server01.

    而且这次失败的尝试会被记录到 /var/log/secure(Rocky Linux)或 /var/log/auth.log(Ubuntu)中,方便审计追溯。

    4.sudo 权限审计与追溯

    所有 sudo 操作(无论成功还是失败)都会被系统记录,这是安全审计的重要依据:

    # Rocky Linux / CentOS:查看 sudo 操作日志
    sudo grep sudo /var/log/secure | tail -20
    Ubuntu / Debian:查看 sudo 操作日志
    sudo grep sudo /var/log/auth.log | tail -20
    查看某个用户的所有 sudo 操作
    sudo grep "ruoyi-admin" /var/log/secure | grep sudo

    日志中会清晰记录:谁在什么时间用 sudo 执行了什么命令,工作目录是什么。一旦出了问题,可以快速追溯到具体的人和操作。

    小结

    至此,我们完成了整个"组 + 用户 + 命令锁"三层权限体系的搭建:

  • 用户组(部门):devops、dba、developer
  • 用户(员工):ruoyi-admin、ruoyi-dba、ruoyi-dev
  • sudo 命令锁(工作权限):每个组只能执行特定命令,越权即拒绝
  • 以后不管是新人入职还是岗位调动,只需要一条命令:usermod -aG devops 新用户名,权限自动生效。这才是企业级权限管理的正确姿势。

    有问题欢迎在评论区留言交流!

    赞(0)
    未经允许不得转载:171主机测评 » 运维实战之3分钟搭建“银行级”用户权限体系,新手也能一次搞定!
    分享到: 更多 (0)

    评论 抢沙发

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