在 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-data、mysql)不应设置登录 Shell,通常设为/usr/sbin/nologin或/bin/false,防止被利用进行登录攻击。 /etc/shadow文件的权限必须为640或600,确保加密密码不被普通用户读取。
用户与用户组的管理看似基础,却是整个系统安全体系的第一道防线。掌握这些命令和思路,无论在传统服务器还是在容器化环境下,都能高效、安全地控制身份与访问。