一、为什么需要理解用户与组
在 Linux 系统中,用户和组是实现多用户隔离与资源访问控制的基础设施。每个进程都以某个用户的身份运行,其对文件的访问权限取决于该用户的权限。如果不理解用户与组的管理机制,就无法正确配置服务、保护敏感数据,甚至可能因权限错误导致系统安全隐患。
本文将系统地介绍 Linux 用户与组的核心概念、关键配置文件、管理命令以及权限控制模型,并结合实际操作示例,帮助你建立清晰的运维知识体系。
二、核心概念:用户、组与安全上下文
2.1 用户分类与标识
Linux 系统中的用户分为三类:
管理员(root):UID 为 0,拥有系统最高权限。
系统用户:UID 范围通常为 1–999(某些发行版为 1–499),用于运行后台服务或守护进程,一般不用于登录。
登录用户:UID 范围通常为 1000–60000(或 500–60000),供人交互使用。
每个用户通过唯一的 UID(User ID) 标识,用户名与 UID 的映射关系存储在 /etc/passwd 文件中。
2.2 组的概念与分类
组是用户的容器,便于批量管理权限。组也有 GID(Group ID),分类如下:
2.3 安全上下文
Linux 采用 DAC(自主访问控制) 模型。进程的安全上下文由其发起者(用户)决定。当进程访问文件时,系统按以下顺序检查权限:
若进程的属主与文件属主相同,则应用文件属主权限;
否则,若进程属主属于文件属组,则应用属组权限;
否则,应用 other 权限。
这一模型是所有权限管理命令设计的理论基础。
三、关键配置文件详解
3.1 /etc/passwd – 用户账户信息
每一行代表一个用户,共七个字段,以冒号分隔:
用户名:密码占位符:UID:GID:注释信息:家目录:登录Shell
示例:
alice:x:1001:1001:Alice Smith:/home/alice:/bin/bash
注意:现代 Linux 系统中,密码字段通常为 x,真正的密码哈希存放在 /etc/shadow 中,以防止普通用户读取。
3.2 /etc/shadow – 密码与账户时效信息
该文件仅 root 可读,存储加密后的密码及老化策略。九个字段:
用户名:加密密码:最后修改日:最小使用期限:最大使用期限:警告天数:宽限天数:过期日期:保留字段
其中加密密码字段包含哈希算法标识(如 $6$ 表示 SHA-512)和 salt。
3.3 /etc/group – 组信息
四个字段:
组成员列表仅列出将该组作为附加组的用户,主组用户不在此列。
3.4 /etc/gshadow – 组密码
存储组的管理员密码,用于 newgrp 切换组时的认证。
四、用户管理命令与实践
4.1 创建用户:useradd
常用选项:
选项 | 作用 |
|---|
-u UID
| 指定 UID |
-g GID
| 指定主组(需事先存在) |
-G GROUP1,GROUP2
| 指定附加组 |
-c COMMENT
| 注释信息 |
-d HOME_DIR
| 指定家目录(默认复制 /etc/skel) |
-m
| 强制创建家目录 |
-s SHELL
| 指定登录 Shell |
-r
| 创建系统用户 |
示例:创建一个登录用户 webadmin,主组为 developers,附加组为 www-data,家目录为 /home/webadmin,Shell 为 /bin/bash:
useradd -g developers -G www-data -d /home/webadmin -s /bin/bash webadmin
注意:创建用户时的默认配置来源于 /etc/login.defs 和 /etc/default/useradd,可通过 useradd -D 查看并可编辑这些文件修改默认值。
4.2 修改用户属性:usermod
常用选项与 useradd 类似,另加:
示例:将用户 oldname 重命名为 newname,并追加到 docker 组:
usermod -l newname oldnameusermod -a -G docker newname
4.3 删除用户:userdel
4.4 密码管理:passwd
passwd:修改当前用户密码。
passwd username:root 修改他人密码。
选项:-l 锁定、-u 解锁、-d 清除密码、-n/-x/-w/-i 设置密码策略。
--stdin:从标准输入读取密码(仅 CentOS/RHEL 系列支持):
echo "MyP@ssw0rd" | passwd --stdin alice
4.5 密码过期策略:chage
常用选项:
-d 0:强制用户下次登录时修改密码。
-E YYYY-MM-DD:设置账户过期日期。
-M 90:密码最长使用 90 天。
-W 7:提前 7 天警告。
示例:设置用户 alice 密码每 60 天必须更换,过期前 5 天提醒:
4.6 查看用户信息:id 与 whoami
id:显示当前用户的 UID、GID 及所属组。
id username:显示指定用户的信息。
id -u:仅显示 UID。
whoami:显示当前有效用户名。
4.7 切换用户:su
su username:非登录式切换,不读取目标用户的环境配置文件。
su - username:登录式切换,重新初始化环境。
su -c 'command' username:以目标用户身份执行单条命令后返回。
示例:以 postgres 用户执行备份脚本:
su - postgres -c '/usr/bin/pg_dump mydb > /backup/mydb.sql'
五、组管理命令
5.1 创建组:groupadd
5.2 修改组:groupmod
5.3 删除组:groupdel
5.4 管理组成员:gpasswd
gpasswd -a user group:将用户添加到组。
gpasswd -d user group:从组中移除用户。
gpasswd group:设置组密码(允许非成员通过 newgrp 临时切换)。
5.5 临时切换主组:newgrp
该命令会启动一个新的 Shell,并将当前用户的主组临时改为 developers。使用 exit 返回原 Shell。
六、文件权限管理
6.1 权限位与表示法
每个文件或目录有三组权限:属主(u)、属组(g)、其他(o)。每组由 r(读)、w(写)、x(执行)三个位组成。
权限可用八进制数表示(rwx = 7, rw- = 6, r-x = 5, 等等)。
6.2 修改权限:chmod
三种用法:
符号模式:chmod u+x,g-w,o=r file
八进制模式:chmod 755 file
参考模式:chmod --reference=ref_file target_file
递归选项 -R 慎用,建议使用符号模式避免意外。
示例:为脚本添加可执行权限:
6.3 修改属主和属组:chown 与 chgrp
示例:将网站目录所有权交给 www-data 用户和组:
chown -R www-data:www-data /var/www/html
6.4 默认权限掩码:umask
umask 决定了新建文件和目录的默认权限。计算公式:
查看当前 umask:umask
设置 umask:umask 022(仅对当前 Shell 生效)
示例:若 umask 为 027,则新建文件权限为 640,新建目录权限为 750。
6.5 复制并设置权限:install
install 类似于 cp,但可同时设置属主、属组和权限。
6.6 创建临时文件/目录:mktemp
用于生成安全的临时文件或目录,名称模板需包含至少三个连续 X,会被随机字符替换。
tempfile=$(mktemp /tmp/myapp.XXXXXX)tempdir=$(mktemp -d /tmp/mydir.XXXXXX)
生成的路径可直接在脚本中使用。
七、总结与最佳实践
7.1 核心要点回顾
用户和组是 Linux 权限模型的基石,理解 UID/GID 和安全上下文至关重要。
关键配置文件(/etc/passwd, /etc/shadow, /etc/group)应谨慎编辑,优先使用专用命令。
用户管理命令(useradd, usermod, userdel)和组管理命令(groupadd, groupmod, groupdel)提供了完整的生命周期管理。
权限管理通过 chmod, chown, chgrp 实现,umask 控制默认权限,install 和 mktemp 是脚本中实用的工具。
7.2 运维建议
最小权限原则:仅为用户分配完成任务所需的最小权限,避免滥用 root。
使用系统用户运行服务:例如 Nginx 以 www-data 用户运行,而非 root。
定期审计用户和组:检查是否存在僵尸账户或多余组。
密码策略自动化:通过 chage 和 /etc/login.defs 统一设置密码老化规则。
谨慎使用递归权限修改:chmod -R 和 chown -R 可能影响大量文件,操作前确认路径无误。
掌握以上内容,你将能够独立完成 Linux 系统中的用户、组与权限管理工作,为后续的服务部署、安全加固打下坚实基础。