当前位置: 首页 > news >正文

《 Linux 点滴漫谈: 四 》文件权限与用户管理

1、引言

在 Linux 世界中,一切皆文件(Everything is a file)。
从系统配置、设备驱动到用户程序、日志文件,几乎所有资源都以文件的形式存在。而在一个多用户、多任务的操作系统中,如何安全、有效地管理这些文件——决定了整个系统的稳定性、安全性与可维护性。这正是「文件权限与用户管理」存在的根本意义。

1.1、Linux 与权限体系的渊源

Linux 继承了早期 UNIX 的核心设计哲学:多用户 + 多任务 + 安全隔离
在这样的体系下,系统中的每个用户都拥有独立的身份(UID/GID),每个文件都与特定的用户和组绑定。通过一套严谨的权限控制机制(rwx、ACL、SELinux 等),Linux 能够清晰地定义 “谁可以访问什么、以何种方式访问”,并在整个操作系统层面保障资源的安全性与隔离性。

换句话说,Linux 的权限体系并不是附属功能,而是系统安全架构的 “根基”。
没有对文件权限与用户管理的理解,就无法真正理解 Linux 系统的运行机制。

1.2、为什么学习文件权限与用户管理至关重要

很多初学者在使用 Linux 时,往往更关注命令使用或 Shell 操作,而忽略了底层的权限与用户机制。然而,在日常开发与运维工作中,权限问题几乎无处不在:

  • 文件无法访问? —— 可能是权限不足。
  • 服务启动失败? —— 可能是运行用户权限错误。
  • 容器挂载卷访问异常? —— UID/GID 不匹配。
  • 生产环境出安全事故? —— 权限配置过宽或 SUID 滥用。

理解文件权限与用户管理,不仅能帮助你快速定位问题,更能让你从 “命令执行者” 进化为 “系统掌控者”。
对于系统管理员,它是系统安全的第一道防线
对于开发者,它是代码落地到生产环境的关键保障
对于运维工程师,它是自动化与审计体系的基础

1.3、权限管理的多层次结构

Linux 的权限体系并非单一层级,而是一个多层次、可扩展的架构:

  • 传统权限模型(rwx):最经典的用户/组/其他三元控制方式;
  • 特殊权限位(SUID、SGID、Sticky Bit):用于控制程序执行特权与目录共享;
  • ACL(Access Control List):提供更细粒度的多用户权限配置;
  • SELinux/AppArmor(强制访问控制,MAC):在系统级别强化资源安全隔离;
  • sudo / PAM / LDAP / AD:构成现代企业级身份与授权管理体系。

每一层权限机制都不是孤立存在的,而是在不同安全需求与使用场景下协同工作的。
理解它们的作用与关系,才能在系统管理中做到既不过度开放,也不盲目限制

1.4、用户管理的战略地位

文件权限控制依赖于用户与组的定义。Linux 的用户管理体系以 /etc/passwd/etc/shadow/etc/group 为核心,通过 UID、GID 与认证机制(PAM、SSSD、LDAP 等)实现身份识别与访问控制。

用户管理不仅仅是 “创建一个账号” 这么简单。它涉及:

  • 账号生命周期管理(创建、修改、锁定、删除);
  • 权限分配与分组策略;
  • 密码复杂度、过期策略与安全审计;
  • 企业环境下的集中身份管理(LDAP / Active Directory)。

对这些机制的理解和掌握,是系统管理员与安全工程师的必修课。

1.5、本文目标与适用读者

本文将带你系统掌握 Linux 文件权限与用户管理的方方面面,从基础概念到企业级应用,逐步深入:

  • 如果你是 Linux 初学者,你将学习如何看懂 ls -l 输出、正确使用 chmodchownumask 等命令;
  • 如果你是 开发或运维人员,你将理解权限背后的原理、ACL/SELinux 的应用场景以及 sudo 配置策略;
  • 如果你是 企业级系统管理员,你将了解如何集成 LDAP/AD、统一用户管理与权限策略。

无论你是哪一类读者,本文都希望帮助你构建一个完整的知识体系,让你从命令层面走向架构层面,真正理解 Linux 权限与用户体系的运行逻辑。

1.6、阅读与学习建议

本文内容较为系统,建议分阶段学习:

  1. 理解传统权限模型(rwx):掌握基本命令与文件权限判断;
  2. 深入特殊权限与 ACL:解决复杂多用户协作场景;
  3. 学习 SELinux / AppArmor:掌握系统级安全控制思维;
  4. 进阶用户管理与 sudo 策略:为自动化与企业部署打下基础。

此外,本文还会在最后提供练习题与实践示例,帮助你巩固知识、验证理解。

一句话总结:

掌握 Linux 文件权限与用户管理,不仅是学会几条命令,更是理解 Linux 安全哲学、系统设计思想与企业级运维能力的关键一步。

2、基础概念回顾(先修知识)

在深入文件权限与用户管理的具体命令与机制之前,先把底层的概念弄清楚非常重要。理解 “用户是谁、进程如何运行、文件在磁盘上如何表示” 能让后续学习不再靠猜测,而是逻辑清晰地推断原因与解决方案。本节分三部分:用户与进程模型、文件系统基础、以及为何需要权限模型(含常见威胁模型与最小权限原则)。

2.1、操作系统的用户与进程模型概述

2.1.1、用户(User)和身份标识(UID / GID)

  • 用户(User):在 Linux 中,每个登录的人或运行的服务通常对应一个用户账号。用户账号用于标识 “谁” 在发起操作。
  • UID(User ID):每个用户有一个唯一的数值标识符,称为 UID。常见约定:
    • 0root(超级用户,拥有系统所有权限)
    • 1–999:系统/服务用户(不同发行版略有差异)
    • 1000+:普通交互用户(通常从 1000 或 500 起)
  • GID(Group ID)与组(Group):用户可以属于一个主组(primary group)和多个附加组(supplementary groups)。组是把多个用户归类以便统一分配权限的单元。

查看当前用户与组信息:

id            # 显示 uid, gid, 以及所属的 supplementary groups
getent passwd username   # 查询 /etc/passwd 或域服务中的用户记录
getent group groupname   # 查询组信息

理解 UID/GID 很重要,因为文件的拥有者用 UID 表示,访问控制判断也围绕 UID/GID 展开。

2.1.2、进程(Process)与主体(Subject)

  • 进程 是正在运行的程序实例。每个进程在内核中与一个或多个标识关联(如 UID/GID、有效 UID/有效 GID、进程ID PID、父进程 PPID)。
  • 主体(subject):在安全模型里,发出操作请求的是主体(通常为进程);主体的身份与权限决定它能否对对象(文件、socket、设备)执行操作。

实用命令查看进程与其 UID:

ps -eo pid,user,uid,cmd | head
# 或查看某进程的详细信息
ps -p <pid> -o pid,ppid,uid,euid,gid,egid,comm

2.1.3、实际 UID、有效 UID 与权限继承

  • Real UID(RUID):表示谁启动了这个进程(登录用户)。
  • Effective UID(EUID):内核在进行权限判断时使用的 UID。某些程序可设置 SUID(setuid)位,运行时将其 EUID 改为文件拥有者(例如 passwd 的 EUID 为 root),从而临时获得更高权限来完成特权操作。
  • Supplementary groups:进程还携带其所属的附加组列表,用于组权限判断。

查看某进程的 RUID/EUID:

# 在 shell 中:
echo "RUID=$(id -u), EUID=$(id -u -r)"  # id -u -r 可能不可用在所有系统
# 或使用 /proc/<pid>/status 查看 UIDs/GIDs 字段
cat /proc/$$/status | egrep 'Uid|Gid'

2.2、文件系统基础:inode、文件类型与文件描述符

要理解文件权限,必须了解文件在 Linux 内核层面的表示方式。

2.2.1、inode(索引节点)

  • inode 是文件元数据的核心结构,不包含文件名,但包含诸多属性:
    • 模式(mode:文件类型 + 权限位)
    • 所有者 UID
    • 所属组 GID
    • 文件大小(bytes)
    • 时间戳:atime(最后访问)、mtime(最后修改)、ctime(inode 改变时间)
    • 链接计数(link count)
    • 指向数据块的指针(直接/间接指针)
  • 文件名则由目录条目(directory entry)指向 inode。一个 inode 可以由多个目录项指向(即硬链接)。

查看 inode 与文件元信息:

ls -li filename   # 第一个字段是 inode 编号
stat filename     # 更详细的 inode 信息与时间戳

理解 inode 的几点要点:

  • 权限判断基于 inode 中的 owner/group/mode 字段(而非文件名)。
  • 删除文件时,只有当 inode 的链接计数(link count)为 0,并且没有进程打开该文件,文件数据才会真正被回收。
  • 不同文件系统(ext4、xfs、btrfs)都实现 inode,但具体实现细节(如最大链接数、支持的扩展属性)不同。

2.2.2、文件类型

Unix/Linux 中文件不只是 “普通文件”。常见类型可以通过 ls -l 第一字符或 stat 查看:

  • - 普通文件(regular file)
  • d 目录(directory)
  • l 符号链接(symbolic link / symlink)
  • b 块设备(block device,磁盘)
  • c 字符设备(character device,如串口)
  • p 命名管道(FIFO)
  • s 套接字(socket)

这些不同类型影响访问行为与权限含义,例如目录的执行位(x)表示允许进入目录(search 权限),而对普通文件 x 表示可执行。

2.2.3、硬链接与符号链接

  • 硬链接(hard link):目录项直接指向 inode。硬链接之间没有 “原文件” 概念,只有 inode。删除某个目录项只是减少链接计数,直到计数为 0(且无进程打开)才删除数据。
    • 硬链接不能跨文件系统,也不能对目录创建(普通工具受限)。
  • 符号链接(symlink):是一个特殊类型的文件,内容是另一个路径名。符号链接可以跨文件系统,可以指向目录,也可能指向不存在的目标(悬挂链接)。
    • 访问符号链接时,内核会解析其目标并按目标的权限进行判断(若目标不存在则会报错)。

查看链接示例:

ln fileA fileA_hardlink     # 创建硬链接
ln -s /path/to/target link_name   # 创建符号链接
ls -l

2.2.4、文件描述符(File Descriptor, FD)

  • 每个进程与打开的文件(或 socket、pipe)之间由文件描述符建立联系。文件描述符是一个小整数(0=stdin, 1=stdout, 2=stderr 起始)。
  • 内核维护 per-process 的打开文件表(指向系统级的 file 表项,再指向 inode/in-memory data structures)。
  • 权限检查通常在打开文件(open())或执行特定系统调用时发生。

查看进程打开的文件:

lsof -p <pid>    # 列出进程打开的文件(需要 lsof)
ls -l /proc/<pid>/fd   # 查看文件描述符对应的真实文件

理解文件描述符有助于理解重定向、管道和并发访问场景。

2.3、为什么要有权限模型:核心原则与威胁模型

2.3.1、权限模型的目的

文件权限模型不是 “为了限制用户而已”,其核心目的是:

  • 保护机密性(Confidentiality):防止未授权读取敏感数据(如私钥、用户数据库)。
  • 保护完整性(Integrity):防止未授权修改或破坏文件(如二进制、配置文件)。
  • 保证可用性(Availability):避免滥用资源(如无限写入日志填满磁盘)导致服务不可用。
  • 支持多租户/多用户协作:不同用户、不同组拥有不同访问集合。

这一套目标映射为具体控制手段:文件拥有者(owner)、所属组(group)、其他(others),以及更细粒度的 ACL 与强制访问控制(MAC)策略。

2.3.2、常见威胁场景(Threat Model)

理解常见威胁有助于制定合理权限策略:

  1. 未授权读取(信息泄露)
    • 场景:普通用户能读取其他用户的 ~/.ssh/id_rsa/etc/shadow
    • 风险:私钥泄露、账户被攻破。
  2. 未授权写入(篡改、植入恶意)
    • 场景:WEB 服务进程能写入 /etc/ 或脚本目录,攻击者通过漏洞写入后门。
    • 风险:持久化后门、配置破坏。
  3. 权限提升(Privilege Escalation)
    • 场景:可写可执行的 SUID 二进制存在,攻击者构造输入触发提权。
    • 风险:普通账号获取 root 权限。
  4. 拒绝服务(资源耗尽)
    • 场景:日志或临时目录权限设置不当,用户/服务填满磁盘或创建大量文件导致系统崩溃。
    • 风险:服务中断、系统不可用。
  5. 权限混淆与跨域访问(网络/分布式)
    • 场景:NFS/CIFS 映射时 UID/GID 不一致导致访问异常或越权。
    • 风险:数据暴露或访问受阻。
  6. 审计缺失
    • 场景:未启用审计(auditd)或 sudo 审计,无法追踪谁修改了什么。
    • 风险:安全事件难以溯源,合规性问题。

2.3.3、安全设计原则:最小权限(Least Privilege)

  • 原则:主体只应拥有完成其任务所需的最小权限,不多也不少。
  • 实现方式
    • 使用专用系统账户运行服务(不使用 root)。
    • 将服务所需目录限制为只可写入的最小范围。
    • 使用组与 ACL 精细控制多人协作场景。
    • 使用 sudo 限制命令授权并启用审计日志。
    • 在更高安全需求下,引入 MAC(如 SELinux)进行强制访问控制。

2.4、与权限密切相关的其它基础概念(速览)

  • umask:创建新文件时的权限掩码(决定默认权限),常在 shell 启动时设置(后续章节详细)。
  • 文件系统挂载选项:如 noexecnodevnosuid 可在 mount 时限制行为(在设计权限策略时非常有用)。
  • 扩展属性(xattr)与 ACL:用于存放 SELinux 上下文或用户定义的额外元数据。
  • 审计(auditd)机制:记录敏感操作(文件权限变更、关键命令执行)以便溯源。

2.5、小结与实践建议

本节梳理了理解权限与用户管理所必须的 “底层概念地图”:

  • 用户/组/UID/GID:权限判断的基础身份。学会用 idgetent/etc/passwd/etc/group 来查看用户与组信息。
  • 进程身份(RUID/EUID):理解 SUID/Effective UID 的概念对后续 setuid 风险评估非常重要。
  • inode 与文件元数据:权限、所有者、时间戳都保存在 inode 中,文件名只是目录项指向 inode。用 stat 看清楚元数据。
  • 文件描述符与打开文件:删除文件并不一定立即释放数据(若仍有打开的 FD),理解这一点对故障恢复和日志轮转有帮助。
  • 威胁模型与最小权限原则:任何权限分配都应以减少攻击面为目标。

2.6、小练习(验证理解)

在你的 Linux 环境(虚拟机或云实例)中运行以下命令并观察输出,验证上面的概念:

# 当前用户与组
id# 查看某文件的 inode 与元数据
ls -li /etc/passwd
stat /etc/passwd# 打开一个终端运行 sleep,然后查看该进程的 UID 信息与 fd
sleep 300 &   # 后台运行
ps -p $! -o pid,uid,euid,cmd
ls -l /proc/$!/fd# 创建硬链接与符号链接并比较
echo hello > fileA
ln fileA fileA_hard
ln -s fileA link_to_fileA
ls -li fileA fileA_hard link_to_fileA

3、传统 Unix 权限模型(rwx / 八进制)

Linux 的文件权限体系源自 Unix 的安全设计理念,它以 最小权限原则(Principle of Least Privilege) 为核心思想,确保系统中每个文件和进程只能执行被允许的操作,从而实现安全、灵活的访问控制。理解传统 Unix 权限模型,是掌握 Linux 文件安全管理的第一步。

3.1、权限的三种基本类型:r、w、x

在 Linux 中,每个文件或目录都关联着三种最基本的权限类型,分别是:

符号英文单词含义
rread读权限 —— 允许查看文件内容,或列出目录内容
wwrite写权限 —— 允许修改文件内容,或在目录中添加/删除文件
xexecute执行权限 —— 允许将文件作为程序运行,或进入目录中执行操作

特别注意:

  • 对于文件(File)
    • r 表示可读取内容;
    • w 表示可修改内容;
    • x 表示可执行(脚本、二进制文件等)。
  • 对于目录(Directory)
    • r 表示可查看目录列表;
    • w 表示可在目录内创建、删除文件;
    • x 表示可进入该目录(即使用 cd 命令)。

例如:

r-- :仅可读取文件内容  
rw- :可读取并修改,但不能执行  
r-x :可读取与执行,但不能修改  

3.2、权限的三种作用对象:user、group、others

在 Linux 系统中,每个文件都属于一个所有者(user)和一个用户组(group),并且针对三类用户分别设置不同的访问权限:

类别英文缩写含义
uuser文件所有者(owner)
ggroup所属用户组(group)中的成员
oothers除上述两类外的所有其他用户

例如,一个文件的权限显示为:

-rwxr-xr--

可拆解如下:

部分对象权限含义
rwxuser读、写、执行文件所有者可完全访问
r-xgroup读、执行同组成员可读取和执行
r--others只读其他用户仅可读取

这一机制保证了文件的访问控制既有层次,又灵活可定制。

3.3、八进制表示法:权限的数字化表达

除了字符形式外,Linux 还支持用数字(八进制)表示权限。每个权限位(rwx)对应一个固定的数值:

权限位二进制值八进制值
r1004
w0102
x0011

于是,三个权限位的组合可以直接用数字表示:

权限组合数值含义
0无权限
–x1仅执行
-w-2仅写
-wx3写 + 执行
r–4仅读
r-x5读 + 执行
rw-6读 + 写
rwx7读 + 写 + 执行

一个完整的文件权限(user、group、others)由三个数字构成,例如:

-rwxr-xr--
→ 八进制表示为 755

这意味着:

  • 所有者 (u):7 → 可读、可写、可执行;
  • 同组用户 (g):5 → 可读、可执行;
  • 其他用户 (o):4 → 仅可读。

3.4、权限修改命令示例:chmod 的两种语法

Linux 通过 chmod 命令修改权限,常见有两种用法:

3.4.1、符号模式(Symbolic Mode)

chmod u+x filename     # 给所有者增加执行权限
chmod go-w filename    # 移除组用户和其他用户的写权限
chmod u=rwx,g=rx,o=r filename   # 明确设置三类权限

3.4.2、数字模式(Octal Mode)

chmod 755 filename     # 设置为 rwxr-xr-x
chmod 644 filename     # 设置为 rw-r--r--
chmod 700 filename     # 仅所有者有读写执行权限

3.5、文件类型标识符与权限位的联系

在执行 ls -l 命令时,你会看到类似如下输出:

-rw-r--r--  1 root root  2048  Oct 27  2025  config.txt
drwxr-xr-x  2 user user  4096  Oct 27  2025  Documents

最左侧的第一个字符表示文件类型:

符号含义
-普通文件
d目录
l符号链接
c字符设备
b块设备
s套接字(socket)
p命名管道(FIFO)

接下来的九个字符就是权限位(rwxrwxrwx),合并起来构成了完整的访问控制描述。

3.6、权限模型的设计哲学

传统 Unix 权限模型虽然结构简单,但体现了极高的设计智慧:

  • 安全性:通过严格区分访问层级,避免误操作和越权访问;
  • 灵活性:用户可针对不同文件设置不同访问策略;
  • 简洁性:三个角色 × 三个位 = 九位权限位,一目了然;
  • 可扩展性:后续 ACL(Access Control List)等高级机制均在此基础上扩展。

传统的 Unix 权限模型通过 rwx 与八进制表示方式,构建了一个清晰、可靠的访问控制系统。它不仅为 Linux 的安全管理奠定了基础,也成为现代操作系统权限设计的原型。
掌握这一部分,不仅能让我们读懂每个文件的权限输出,还能在后续学习中更好地理解 特殊权限(SUID、SGID、Sticky Bit) 以及 ACL 扩展控制 的底层逻辑。

4、特殊权限位:setuid / setgid / sticky bit

在传统的 Linux 权限模型中,rwx 仅定义了读、写、执行三种基本操作。然而,在多用户系统中,这种简单模型有时并不足够。
例如:

  • 普通用户需要临时执行一个必须以 管理员权限 运行的程序;
  • 某个目录中的文件需要保持 统一的组归属
  • 公共目录需要防止用户 误删他人文件

为了应对这些实际需求,Linux 引入了三种特殊权限位(Special Permission Bits)—— setuid、setgid 和 sticky bit,使系统的权限控制更加灵活和安全。

4.1、setuid(Set User ID on Execution)

4.1.1、定义与作用

setuid 是一种针对**可执行文件(Executable)的特殊权限位。
当文件设置了 setuid 后,任何执行该程序的用户,都将临时获得该文件
所有者(owner)**的权限。

📘 简言之

程序在执行期间,其有效用户 ID(EUID)被暂时切换为文件的拥有者 UID。

4.1.2、应用场景

举个经典的例子:
系统中的 /usr/bin/passwd 命令允许普通用户修改自己的密码,而密码存储在 /etc/shadow 文件中,该文件只有 root 才能写入。
这就需要 passwd 程序拥有临时的 root 权限来完成写入操作。

执行:

ls -l /usr/bin/passwd

输出:

-rwsr-xr-x 1 root root 54256 Oct 27 2025 /usr/bin/passwd

注意第三个位置的 s

rws → 表示所有者具有 setuid 权限

这意味着:
即使普通用户执行 passwd,系统也会让该进程临时以 root 身份运行,从而写入 /etc/shadow

4.1.3、设置与取消

chmod u+s filename   # 设置 setuid
chmod u-s filename   # 取消 setuid

4.1.4、八进制表示

setuid 对应八进制数 4,当与普通权限组合时,可以形成四位数权限,如:

权限八进制含义
47554 + 755启用 setuid 且原权限为 755
47504 + 750启用 setuid 且原权限为 750

4.1.5、安全风险提示

⚠️ 高风险操作!
若不当设置 setuid,可能造成权限提升漏洞(Privilege Escalation)
应确保:

  • 仅系统受信任的程序使用;
  • 不对用户自定义脚本设置 setuid;
  • setuid 程序需严格校验输入与执行路径。

4.2、setgid(Set Group ID on Execution)

http://www.dtcms.com/a/535730.html

相关文章:

  • 评估虚拟机资源规划
  • 深入理解 SO_REUSEADDR:从“Address already in use”到服务器瞬间重启
  • 机器人中的多模态——RoboBrain
  • MySQL 8.0.x 全平台安装指南:Windows、CentOS、Ubuntu 详细步骤与问题解决
  • YOLO!!
  • 电子电气架构 --- 汽车座舱行业背景综述
  • C++(23):通过print和printIn进行输出
  • 获取网站访客qq号成都网站建设优点
  • 做一个同城便民信息网站怎么做公司给别人做的网站违法吗
  • 微算法科技(NASDAQ MLGO)探索自适应差分隐私机制(如AdaDP),根据任务复杂度动态调整噪声
  • 入选大模型一体机产业图谱,云从科技以全栈能力推动AI落地新范式
  • 十六、STM32的TIM(七)(PWM直流电机)
  • TCP与UDP深度理解
  • 万界星空科技MES系统功能介绍及实施指南
  • 中国软件出海,为何优选亚马逊云科技Marketplace?
  • StarRocks Community Monthly Newsletter (Sep)
  • HarmonyOS 微服务与 OpenHarmony 开发:构建模块化与开源生态应用
  • autojs----2025淘宝淘金币跳一跳自动化
  • 什么网站可以做兼职赚钱吗互联网商城建设
  • 地方网站系统建模素材免费网站
  • 东莞百度网站快速排名怎么用.net做网站
  • IP5306 2.4A放电 2.1A充电 高集成度移动电源SOC
  • Qt5与Qt6的详细区别
  • Sui 主网升级至 V1.58.3
  • [优选算法专题五.位运算——NO.35~36 只出现一次的数字 II、消失的两个数字]
  • 晶台光耦KL101X:光伏发电系统的安全卫士与效率引擎
  • 普诚PT5139深度解析:功能特性、应用场景与技术优势
  • MCoT在医疗AI工程化编程的实践手册(下)
  • Qwen系列模型:WAN介绍
  • HarmonyOS大型项目架构与模块化开发指南