Skip to content

文件的保护

2026 大纲 四(一)4 文件的保护

多用户共用一块盘,谁能动谁的东西

文件这个抽象最初被三个问题逼出来,前两节把"按名存取"和"成组管理"都讲完了。 剩下第三个:多个用户共用一块盘,怎么防止互相踩踏。

这件事要回答的问题其实很具体:谁,能对哪个文件,做哪种操作。

三个"哪"合起来天然就是一张二维表——行是用户、列是文件、格子里放允许的操作, 这叫存取控制矩阵。概念上到此就结束了,剩下的全部内容都在解决一个工程问题: 这张表存不下。

存不下有两个原因,而且都很硬。规模是乘积:1000 个用户 × 100 万个文件 = 10 亿格。 而且极度稀疏:绝大多数用户和绝大多数文件根本没关系,非空的格子可能只占千分之一。

既然不能整张存,就只能存非空的部分。而存非空部分的自然选法只有两种——按列存,或者按行存, 没有第三种。按列存(一个文件对应一串"谁能动我")就是 ACL; 按行存(一个用户对应一串"我能动谁")就是能力表

这一节接下来的每一处差别——查得快的是哪种问法、撤销权限方不方便、存在哪、 Unix 为什么把用户压成三类、目录的 rwx 为什么含义全变——都是从"按行还是按列"这一个选择上长出来的

一、访问类型

访问类型说明
读(Read)读取文件内容
写(Write)修改文件内容
执行(Execute)将文件装入内存并执行
追加(Append)在文件末尾添加内容
删除(Delete)删除文件
列目录(List)读取文件的属性信息

二、一张矩阵,三种存法

存取控制矩阵、ACL、能力表不是三种保护"思想",而是同一张二维表的三种存储方式。把这条主线推清楚,三者的全部优缺点都不必单独记。

文件1文件2文件3
用户ARWR-
用户BRRWXRW
用户C-RR

整张矩阵存不下(乘积规模 + 极度稀疏),只能存它的非空部分;而组织非空部分只有按列按行两种自然选法:

存取控制矩阵ACL(按切)能力表(按切)
一张表挂在谁身上全局一张文件用户
存储位置独立的大数组该文件的 FCB / inode系统专区(不能让用户直接改)
规模u×f,高度稀疏每文件一张,长度 = 有权用户数每用户一张,长度 = 可访问对象数
问"谁能访问文件 X"读一列一步遍历所有用户
问"用户 A 能访问什么"读一行遍历所有文件一步
撤销某文件的全部授权清一列改一处遍历所有用户去删
撤销某用户的全部权限清一行遍历所有文件改一处
两种切法的具体表长什么样、四条推论各自怎么从"切的方向"得出(想弄清对角线现象的来源、而不只是记住它时展开)

按列切 → 访问控制列表 ACL。 取矩阵的一列(一个文件对应的那一列),把该列所有非空格子收集成一张表,挂在这个文件身上:

文件1 的 ACL:  [(用户A, RW), (用户B, R)]        ← 用户C 是空的,不存
文件2 的 ACL:  [(用户A, R), (用户B, RWX), (用户C, R)]
文件3 的 ACL:  [(用户B, RW), (用户C, R)]

这张表通常就存在该文件的 FCB 或 inode 里。推论全部从"表是按文件组织的"得出:

  • 查权限很快:要访问文件 X,直接读它的 inode 就拿到整张表——反正 inode 本来就要读
  • 按文件撤销权限极方便:该文件的全部授权集中在一处,改一张表即可
  • 按用户查权限很慢:想知道"用户 A 能访问哪些文件",必须扫描全部文件的 ACL
  • 表可能很长:一个所有人都能读的文件,ACL 里要列出所有人

按行切 → 能力表(Capability List)。 取矩阵的一行(一个用户对应的那一行),收集该行所有非空格子,挂在这个用户身上:

用户A 的能力表:  [(文件1, RW), (文件2, R)]
用户B 的能力表:  [(文件1, R), (文件2, RWX), (文件3, RW)]
用户C 的能力表:  [(文件2, R), (文件3, R)]

表中每一项除权限外还带一个指向对象的指针(在 Unix 里就是 inode 号)。推论同样全部从"表是按用户组织的"得出:

  • 按用户查权限极快:一步就能列出这个用户能碰的全部对象
  • 按文件撤销权限极难:要收回某文件对所有人的权限,得遍历每个用户的能力表去删
  • 表本身必须被保护:能力表就是通行证的集合,用户若能改自己的能力表就等于随意授权,所以它不能放在用户可写的地方,通常存在系统专区,只有经合法性检查的程序才能访问

实际系统两个一起用。 进程第一次访问某对象时查 ACL 做完整检查,通过后为它生成一个能力项挂到进程上;此后该进程再访问同一对象就直接用这个能力项快速放行,不必重查 ACL。ACL 保证撤销方便,能力表保证重复访问快。

三、Unix 的 9 个 bit:换来什么、牺牲什么

Unix/Linux 对 ACL 做了极端精简:不再逐个列出用户,而是把用户压成三类(owner = 创建者、group = 同组用户、others = 系统中其他所有用户),每类给 rwx 三位。

权限表示:rwxr-xr--
         ─┬─ ─┬─ ─┬─
          │    │    └── others: 只读
          │    └─────── group: 读+执行
          └──────────── owner: 读+写+执行

对应八进制:754

3×3=9 个 bit,正好塞进 inode 里一个定长字段——读 inode 时顺带就读到了,检查权限零额外磁盘 I/O;判断一次访问只要三次比较加一次位运算。

牺牲的是"对单个用户单独授权"的能力。 设文件属于 alice、同组是 dev,她想让只有 bob 一个人能读:

试法结果
others 设为可读全系统所有人都能读
group 设为可读dev 组全体都能读
把 bob 加进 dev 组他同时获得 dev 组对其他所有文件的权限,授权面反而扩大

三条路全部走不通——粒度被锁死在"三类"上,而不是"每个用户"。这是权限模型里典型的表达能力与存储/检查开销的交换:普通 ACL 表达力强但变长、要额外存储与检索;9 bit 表达力弱但定长、零额外开销。需要按单个用户精细授权时,现代系统会另外挂一份完整 ACL 作为补充。

四、目录的 rwx:同样三个字母,含义完全不同

目录也是一种文件,也用同一组 rwx 位,但因为目录的"内容"就是一张 (文件名, inode 号) 的表(见目录),三个权限的含义全部变了:

普通文件目录
r读取文件内容列出目录里有哪些名字(读目录的数据块)
w修改文件内容在这个目录里增删目录项——即在其中创建、删除、重命名文件
x把文件装入内存执行可以"进入"/穿越这个目录,即路径解析时允许经过它,也叫搜索权

读它的内容 = 看到有哪些名字,改它的内容 = 增删名字;而"执行一个目录"没有意义,Unix 就把 x 这一位复用成了路径解析的通行许可。由这三条推出四个反直觉、却天天在用的结论:

现象为什么
删除一个文件,看的是所在目录的 w 权限,而不是文件自己的权限删除动作改的是目录里的那一条目录项,不是文件内容。所以你可能对一个自己完全无权读写的文件拥有删除权——只要你对它所在的目录有 w
只有 x 没有 r 的目录:知道确切文件名就能访问其中的文件,但列不出目录内容x 允许穿越(按名字往下走),r 才允许读出名字表。这正是"公开目录但不让人看清单"的做法
只有 r 没有 x 的目录:能列出名字,但任何一个都打不开能读出名字表,却不允许穿越这个目录,所以拿到名字也走不下去
对一个目录没有 x 权限,它下面的东西全都访问不到,哪怕子目录和文件的权限全开路径解析必须逐级穿越,中间断一级,后面全部到不了

判据一句话:问这个动作改的是"文件的内容"还是"目录里的那一条目录项"——改内容看文件的权限,增删名字看目录的权限。

五、口令与加密

  • 口令保护:访问文件需提供正确口令,口令存放在 FCB 中。缺点是明文存储不安全,传输过程也可能被截获
  • 加密保护:对文件内容加密,只有持有密钥的用户才能解密读取。安全性高但有加解密开销

它们解决的是访问控制解决不了的那一类问题:访问控制的全部前提是"系统本身可信、且请求一定经过系统"。一旦这个前提被绕过——硬盘被整块拆走接到另一台机器上、攻击者拿到管理员身份——inode 里那 9 个 bit 就完全失效,因为解释这些位的正是被绕过的那个系统。

加密是唯一一种"即使系统被绕过仍然有效"的手段,因为它保护的是数据本身而不是访问路径。代价是每次读写都要加解密,且密钥一旦丢失数据永久无法恢复。

六、用位串表示权限时,要多少位

当权限被压成"若干类用户 × 若干种操作"的固定组合时,可以直接用一个二进制位串塞进 FCB, 每一位表示"这类用户有没有这项权限"。位数是一个纯乘法

所需位数=(用户类别数)×(访问权限种类数)

因为每一类用户对每一种权限都要独立地回答"允许还是不允许", 而一个二进制位恰好能回答一次是非。有 4 类用户、5 种权限, 就要 4×5=20 位。

Unix 的 9 bit 正是这个公式的一个特例:3 类用户(owner / group / others)× 3 种权限(rwx)=9

⚠️ 三种典型的算错方式,恰好对应常见的错误选项: 只算权限种类数(把 5 当答案,等于假设所有用户共用一份权限)、 算成加法4+5=9,把两个维度当成并列而不是组合)、 漏掉一类用户3×4 之类)。认准"每一格都要一位",就不会错。

考点速记

  1. 权限天然是矩阵 M[用户][文件]约定行是用户、列是文件),因规模是乘积u×f)且极度稀疏而不能整张存。
  2. 组织非空部分只有两种存法——按列(ACL,挂在文件上)与按行(能力表,挂在用户上),没有第三种
  3. 判 ACL / 能力表看"挂在谁身上":ACL 挂在文件上 ⇒ 取的必是该文件那一;能力表挂在用户上 ⇒ 取的必是该用户那一。别去背"按行还是按列"。
  4. 两个"一步"永远在对角线上:ACL 下问"谁能访问文件 X"、撤销某文件全部授权是一步,问"用户 A 能访问什么"要扫全部文件;能力表恰好相反。
  5. 存储位置:ACL 存在该文件的 FCB / inode 里;能力表存系统专区、用户不能直接改。实际系统两者并用——ACL 做授权、能力表做缓存
  6. Unix 的 9 个 bit:用户压成 owner / group / others 三类,各 rwx(rwxr-xr-- = 754)。换来定长、可直接嵌在 inode 里、检查零额外磁盘 I/O
  7. ⚠️9 bit 做不到"只授权给某一个用户":给 group 是给全组、给 others 是给全系统、把人拉进组反而扩大授权面。要精细授权只能另挂一份完整 ACL。
  8. 目录的 rwx 含义全变(由"目录的内容是一张目录项表"完全推出):r = 列出目录里有哪些名字;w = 在这个目录里增删目录项(即创建 / 删除 / 重命名文件);x = 允许穿越该目录(搜索权)。
  9. 删文件看的是所在目录的 w——删除改的是目录里那条目录项,不是文件内容。所以可能对一个自己读不了的文件却拥有删除权。
  10. 中间任一级目录缺 x,其下全部不可达:路径解析必须逐级穿越。
  11. 位串表示权限时,位数 = 用户类别数 × 权限种类数——每一格都要一位。
  12. 口令 vs 加密:口令是入口上的校验、明文存在 FCB 里;加密作用于内容本身。访问控制与口令都假设"系统可信且访问必经系统",只有加密在系统被绕过时仍然有效

这一节在真题里被考过的形式

只出过一道题,而且考的是位数计算——概念部分(ACL vs 能力表、目录的 rwx) 至今没有单独设问,但它们是选项里的常见素材。

  • 给用户类别数和权限种类数,问描述文件权限至少需要多少位(2017-30)。4 类用户 (安全管理员、文件主、文件主的伙伴、其他用户)× 5 种权限(完全控制、执行、修改、读取、写入) =20 位。⚠️ 三个错项正好是三种算错方式:5(只算权限种类,等于假设所有用户共用一份权限)、 9(算成加法 4+5,把两个维度当并列)、123×4,漏了一类用户)。 判据一句话:每一类用户对每一种权限都要独立回答一次是非,所以每一格都要一位

复习优先级计算题必须拿满,概念部分按选项素材准备。 位数公式是纯乘法, 认准"每一格一位"即可。第三条(判 ACL/能力表看挂在谁身上)和第八、九条 (目录的 rwx、删文件看目录的 w)虽然没单独考过,但在 目录硬链接和软链接 的题里会作为判断依据出现,理解一遍就够。

易错:算权限位数时只乘权限种类、不乘用户类别。位数 = 用户类别数 × 权限种类数,每一格都要一位。

易错:把两个维度算成加法。它们是组合关系不是并列关系。

易错:背"ACL 按列存、能力表按行存"。判据是挂在谁身上——挂在文件上就取那一列,挂在用户上就取那一行。

易错:认为 Unix 的 9 bit 能精细授权给某一个用户。给 group 是给全组、给 others 是给全系统。

易错:把目录的 r 和 x 混为一谈。r 是列出名字,x 是允许穿越——只有 r 没有 x 时能看见名字却进不去。

易错:认为删文件要看该文件的 w 权限。看的是所在目录的 w——删除改的是目录项。

易错:认为口令保护和加密是同一层的手段。口令查的是入口,加密作用于内容;只有加密在系统被绕过时仍有效。

教材出处
  • 汤小丹《计算机操作系统》印刷版 p248(7.5 文件保护):明确"将访问矩阵按列划分,或者按行划分,以分别形成访问控制表或访问权力表";ACL 是"对访问矩阵按列(对象)划分,为每一列建立一张访问控制表……由于在大多数情况下,矩阵中的空项远多于非空项,因而使用访问控制表可以显著地减少所占用的存储空间",且"当对象是文件时,便把访问控制表存放在该文件的文件控制表中,或放在文件的索引结点中";访问权限表则是"把访问矩阵按行(即域)划分",且"访问权限表不能允许直接被用户(进程)所访问,通常将访问权限表存储到系统区内的一个专用区中"。
  • 同书 p249:大多数系统同时采用两者——进程第一次访问对象时先查访问控制表,通过后"为该进程建立一访问权限,将之连接到该进程",此后直接用它快速验证。这是本篇"ACL 做授权、能力表做缓存"的依据。
  • 孙钟秀、费翔林《操作系统教程》(第 6 版)印刷版 p182:现代操作系统"首先对用户进行分类,再针对每类用户规定文件属性……用户的分类可以是属主、合作者或其他,文件的属性可以分为读、写、执行,在此情况下,就产生了 9 种不同的用户文件属性",并配有 chmod / chown / chgrp 三条命令。

相关知识

文件的操作文件的逻辑结构文件的基本概念目录

真题练习