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(自主访问控制)​ 模型。进程的安全上下文由其发起者(用户)决定。当进程访问文件时,系统按以下顺序检查权限:

  1. 若进程的属主与文件属主相同,则应用文件属主权限;

  2. 否则,若进程属主属于文件属组,则应用属组权限;

  3. 否则,应用 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 查看用户信息:idwhoami

  • 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

三种用法:

  1. 符号模式chmod u+x,g-w,o=r file

  2. 八进制模式chmod 755 file

  3. 参考模式chmod --reference=ref_file target_file

递归选项 -R 慎用,建议使用符号模式避免意外。

示例:为脚本添加可执行权限:

chmod u+x deploy.sh

6.3 修改属主和属组:chownchgrp

  • 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 控制默认权限,installmktemp 是脚本中实用的工具。

7.2 运维建议

  1. 最小权限原则:仅为用户分配完成任务所需的最小权限,避免滥用 root。

  2. 使用系统用户运行服务:例如 Nginx 以 www-data 用户运行,而非 root。

  3. 定期审计用户和组:检查是否存在僵尸账户或多余组。

  4. 密码策略自动化:通过 chage/etc/login.defs 统一设置密码老化规则。

  5. 谨慎使用递归权限修改chmod -Rchown -R 可能影响大量文件,操作前确认路径无误。

掌握以上内容,你将能够独立完成 Linux 系统中的用户、组与权限管理工作,为后续的服务部署、安全加固打下坚实基础。

posted @ 2026-08-03 14:57  GuiGui321  阅读(9)  评论(0)    收藏  举报