人人都会AI编程

12.1 用户与用户组管理

更新时间:2026-07-12

在 Linux 中,用户与用户组管理是系统安全与权限控制的基石。每个进程、每个文件、每个目录都有对应的所有者和属组,系统通过判断请求者的身份来决定允许还是拒绝操作。理解用户与组的工作方式,是日常运维的基础技能。

1. 用户、组与文件权限的基本关系

Linux 系统用“用户”(User)和“用户组”(Group)来标识身份。一个用户可以属于一个主要组和多个附加组。当用户执行操作时,系统会根据文件的权限位来判定是否允许:

  • 如果用户是文件的所有者,则适用“属主权限”;
  • 如果用户在文件的属组中,则适用“属组权限”;
  • 否则适用“其他人权限”。

这就构成了经典的 rwx(读/写/执行)三层权限模型。这种机制简单却有效,能够在不引入复杂访问控制列表的情况下应对绝大多数场景。

2. 核心用户配置文件

所有用户信息保存在 /etc/passwd 文件中,每行记录一个用户,格式为:

用户名:密码占位符:UID:GID:注释:主目录:登录Shell

示例:

john:x:1001:1001:John Doe:/home/john:/bin/bash

这里的“x”表示密码已移至更安全的 /etc/shadow 文件加密存储。

用户组信息保存在 /etc/group 中,格式为:

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

例如:

developers:x:1002:john,mary

表示组 developers 的 GID 为 1002,成员为 john 和 mary。

注意:直接编辑这两个文件需要格外谨慎,通常建议使用专门的管理工具来避免格式错误。

3. 常用管理命令

实际工作中,管理员通过一系列命令来增、删、改用户和组。

用户管理:

  • useradd:添加用户。常用选项:
  • -m:自动创建用户主目录;
  • -s /bin/bash:指定登录 Shell;
  • -G wheel,developers:同时加入附加组。
  sudo useradd -m -s /bin/bash -G developers john
  
  • usermod:修改现有用户。例如将用户加入附加组:
  sudo usermod -aG docker john   # -a 表示追加,否则会覆盖组列表
  
  • userdel:删除用户,用 -r 同时删除主目录和邮件池:
  sudo userdel -r john
  
  • passwd:设置或修改用户密码:
  sudo passwd john
  # 锁定/解锁账户:
  sudo passwd -l john
  sudo passwd -u john
  

用户组管理:

  • groupadd:添加组。
  sudo groupadd developers
  
  • groupmod:修改组属性(如 GID、组名)。
  • groupdel:删除组(需确保没有用户以此为主要组)。
  • gpasswd:管理组成员或设置组密码。常用场景:
  sudo gpasswd -a john developers    # 将 john 加入 developers 组
  sudo gpasswd -d john developers    # 将 john 移出 developers 组
  

信息查询:

  • id:查看当前用户或指定用户的 UID、GID 及所有所属组。
  id john
  # 输出:uid=1001(john) gid=1001(john) groups=1001(john),1002(developers),994(docker)
  
  • whoami:显示当前登录用户名。
  • groups:列出当前用户所属的组列表。
  • getent passwd john:从系统数据库获取用户信息,更准确地反映当前生效配置。

4. 实战中的常见场景

场景一:创建一个新开发者账号

sudo useradd -m -s /bin/bash -G developers,docker alice
sudo passwd alice

之后 alice 即可登录,并自动获得 developers 和 docker 组的权限,例如可以运行 Docker 容器。

场景二:授权普通用户临时管理员权限
许多发行版通过 sudo 组(或 wheel 组)控制 sudo 权限。只需将用户添加到该组即可:

sudo usermod -aG sudo john   # Debian/Ubuntu 系
# 或
sudo usermod -aG wheel john  # RHEL/CentOS 系

注销重新登录后,john 就可以使用 sudo 执行管理员命令。

场景三:调试权限问题
如果用户反映“无法访问某个文件或目录”,逐一检查:

  • 该用户是否是目标的所有者?用 ls -l 查看属主。
  • 用户是否在目标属组中?用 groups 用户名 确认,同时查看文件的属组。
  • 如果都不匹配,检查“其他人”权限。
  • 注意:目录的执行权限(x)意味着能否进入该目录,常被遗漏。

5. 安全注意事项

  • 避免直接使用 root 账号,养成使用 sudo 的习惯,所有操作都可由审计日志追踪。
  • 合理使用最小权限原则:用户仅被赋予完成工作所需的最少组和权限。
  • 定期用 last 查看登录记录,用 who 查看当前登录用户,及时发现异常。
  • 系统账户(如 www-datamysql)不应设置登录 Shell,通常设为 /usr/sbin/nologin/bin/false,防止被利用进行登录攻击。
  • /etc/shadow 文件的权限必须为 640600,确保加密密码不被普通用户读取。

用户与用户组的管理看似基础,却是整个系统安全体系的第一道防线。掌握这些命令和思路,无论在传统服务器还是在容器化环境下,都能高效、安全地控制身份与访问。