Linux 用户、组与权限管理:从原理到实战
一、为什么需要理解用户与组
在 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),分类如下:
-
按角色:管理员组(GID 0)、系统组、登录组。
-
按关系:基本组(主组)和附加组。一个用户只能属于一个主组,但可以加入多个附加组。
-
按组成:私有组(组名与用户名相同且仅包含该用户)和公共组(包含多个用户)。
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 – 组信息
四个字段:
组名:组密码占位符:GID:组成员列表
组成员列表仅列出将该组作为附加组的用户,主组用户不在此列。
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 类似,另加:
-
-l NEW_NAME:修改用户名 -
-L:锁定用户(在密码前加!) -
-U:解锁用户 -
-a -G GROUP:追加附加组(不加-a会覆盖原有附加组)
示例:将用户 oldname 重命名为 newname,并追加到 docker 组:
usermod -l newname oldname
usermod -a -G docker newname
4.3 删除用户:userdel
-
userdel username:删除用户,保留家目录和邮件池。 -
userdel -r username:同时删除家目录和邮件池。
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 天提醒:
chage -M 60 -W 5 alice
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
-
groupadd devops:创建普通组。 -
groupadd -g 2000 devops:指定 GID。 -
groupadd -r sysgroup:创建系统组(GID < 1000)。
5.2 修改组:groupmod
-
groupmod -n newname oldname:重命名组。 -
groupmod -g 3000 devops:修改 GID。
5.3 删除组:groupdel
groupdel devops:删除组(前提是该组不是任何用户的主组)。
5.4 管理组成员:gpasswd
-
gpasswd -a user group:将用户添加到组。 -
gpasswd -d user group:从组中移除用户。 -
gpasswd group:设置组密码(允许非成员通过newgrp临时切换)。
5.5 临时切换主组:newgrp
newgrp developers
该命令会启动一个新的 Shell,并将当前用户的主组临时改为 developers。使用 exit 返回原 Shell。
六、文件权限管理
6.1 权限位与表示法
每个文件或目录有三组权限:属主(u)、属组(g)、其他(o)。每组由 r(读)、w(写)、x(执行)三个位组成。
-
对于文件:r 可读取内容,w 可修改内容,x 可作为程序执行。
-
对于目录: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 慎用,建议使用符号模式避免意外。
示例:为脚本添加可执行权限:
chmod u+x deploy.sh
6.3 修改属主和属组:chown 与 chgrp
-
chown owner:group file:同时修改属主和属组。 -
chown :group file:仅修改属组。 -
chgrp group file:修改属组(功能同上)。 -
递归选项
-R适用于目录。
示例:将网站目录所有权交给 www-data 用户和组:
chown -R www-data:www-data /var/www/html
6.4 默认权限掩码:umask
umask 决定了新建文件和目录的默认权限。计算公式:
-
文件:
666 - umask(结果若有执行位则加 1) -
目录:
777 - umask
查看当前 umask:umask
设置 umask:umask 022(仅对当前 Shell 生效)
示例:若 umask 为 027,则新建文件权限为 640,新建目录权限为 750。
6.5 复制并设置权限:install
install 类似于 cp,但可同时设置属主、属组和权限。
-
install -m 755 -o root -g root source dest:复制文件并设置权限。 -
install -d -m 700 /data/backup:创建目录并设置权限。
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 系统中的用户、组与权限管理工作,为后续的服务部署、安全加固打下坚实基础。

浙公网安备 33010602011771号