🔥更新:2024-10-17📝字数: 0 字⏱时长: 0 分钟
第一章:Linux 权限管理体系概述
1.1 回顾 RBAC 模型
- RBAC(Role-Based Access Control,基于角色的访问控制)是一种访问控制模型,它通过定义
角色来管理用户对系统资源的访问权限。 - 在 RBAC 模型中,用户不是直接被授予权限的,而是被分配到一个或多个角色中,每个角色都包含了一组权限。
- 这样,
用户可以通过角色来间接的获取对资源的访问控制(权限)。 - 这种模型的核心思想是将
权限管理和用户身份分离,使得权限分配更加灵活和易于管理。

提醒
- ① 在 Linux 中,其权限模型就是 RBAC0 权限模型;只不过,在 Linux 中没有角色,而是用户组的概念,含义是一样的。
- ② 在 Linux 中,默认情况下,创建用户会生成一个
同名的用户组;当然,也可以通过参数使其不生成同名的用户组。 - ③ 在 Linux 中,权限就是对
文件和目录的访问控制,并且使用rwx这三种描述符来表示权限。 - ④ Linux 使用
rwx权限描述符来控制整个 Linux 系统的安全,用户和权限共同组成 Linux 系统的安全防护体系。
1.2 所有者、所属组、其他人
- 在 RBAC 模型中,一个用户(所有者)可以分配多个角色(所属组),一个角色也可以被分配多个用户,
它们之间的关系是多对多的关系;当然,角色和权限之间也是多对多的关系,即:

- 对于上图而言,我们可以知道,
李四和王五都属于开发(用户组),其他的人是不属于开发(用户组),即其他人的角色。 - 如果,我们以
李四为主要视角(所有者),那么王五和李四就是同一组(所属组),而张三、赵六、田七和王八就是其它人的角色,即:

在 Linux 中,权限通常分为三种类型(角色),即:
- 所有者(user):文件或目录的所有者拥有的权限。
- 所属组(group):与文件所有者相同用户组的其他用户拥有的权限。
- 其他人(others):不属于文件所有者和用户组的其他所有用户拥有的权限。
在 Linux 中,权限通常由
rwx来描述文件或目录的访问权限,即:
| 权限 | 含义 | 备注 |
|---|---|---|
r (read) | 读取权限 | 如果一个用户或用户组有对文件的读取权限,他们可以查看文件的内容。 |
w (write) | 写入权限 | 拥有写入权限的用户或用户组可以修改文件的内容,包括:添加文件内容、删除文件内容、修改文件内容。 |
x (execute) | 执行权限 | 对于文件,执行权限允许用户运行该文件作为程序,一般是命令或脚本。 对于目录,执行权限允许用户进入该目录(即访问目录下的文件和子目录)。 |
提醒
- ① 可以使用
chown命令或chgrp命令来改变文件或目录的所有者以及所属组。 - ②
chgrp命令可以修改文件或目录的所属组。 - ③
chown命令可以修改文件或目录的所有者和所属组;当然,也可以只修改文件或目录的所有者。 - ④ Linux 的文件或目录的权限体系(rwx)是由
文件系统提供支持的,并不是所有的文件系统都支持权限体系,如:Fat32 文件系统就不支持权限体系(rwx)。
第二章:权限计算和修改权限(⭐)
2.1 权限计算
2.1.1 概述
- 在 Linux 中,我们可以通过
ll命令快速查看文件和目录的权限,即:
shell
ll /usr/bin
- 截取部分信息,如下所示:

- 所有者(user)、所属组(group)和其他人(others)对应的信息,如下所示:

- 为了方便使用权限,于是给每个权限字母设置了一个对应的数字,通过数字来表示权限,即:
| 权限 | 含义 | 权限对应的数字 |
|---|---|---|
r (read) | 是否可读。 | 4 |
w (write) | 是否可写。 | 2 |
x (execute) | 是否可执行,对于文件而言,通常是命令和脚本(命令的集合)。 | 1 |
| - | 没有权限 | 0 |
提醒
- ① 9 位权限信息其实是
八进制,这样就可以 3 位权限信息作为一组,这能完美的表示r、w、x。 - ② 如果
数字表示的权限信息中有奇数,则证明一定会有可执行权限(x)。
- 其实,权限对应的数字是这么计算的,即:
txt
假设一个文件的权限是 rwx rw- rw- ,那么只要有权限就是 1 ,没有权限(-)就是 0 ;
那么,转换为对应的数字就是 rwx rw- rw- = 111 110 110
又因为 111 110 110 都是二进制的数字,转换为八进制就是
u = 2^2 * 1 + 2^1 * 1 + 2^0 * 1 = 7
g = 2^2 * 1 + 2^1 * 1 + 2^0 * 0 = 6
o = 2^2 * 1 + 2^1 * 1 + 2^0 * 0 = 6- 其实,我们也可以通过
stat命令,来查看权限对应的数字,即:
shell
stat /usr/bin/which
- 计算如下:
- rwx r-x r-x
4+2+1 4+0+1 4+0+1 = 7552.1.2 案例
- 示例:字母 → 数字
- rwx r-x r-x
4+2+1 4+0+1 4+0+1 = 755- 示例:字母 → 数字
- r-- r-- r--
4+0+0 4+0+0 4+0+0 = 444- 示例:字母 → 数字
- r-- rw- rw-
4+0+0 4+2+0 4+2+0 = 466- 示例:数字 → 字母
644 = 4+2+0 4+0+0 4+0+0
- rw- r-- r--- 示例:数字 → 字母
750 = 4+2+1 4+0+1 0+0+0
- rwx r-x ---- 示例:数字 → 字母
700 = 4+2+1 0+0+0 0+0+0
- rwx --- ---- 示例:数字 → 字母
600 = 4+2+0 0+0+0 0+0+0
- rw- --- ---2.2 修改权限
2.2.1 概述
前文提到:
用户和权限共同组成 Linux 系统的安全防护体系,那么就可以使用 chmod 命令来修改权限,使用 chown 来修改用户或用户组。修改用户(用户组)的命令:
shellchown [-R] [所有者][:所属组] 文件或目录 ...
提醒
- ① 选项:
-R,--recursive:递归修改文件和目录,慎用!! - ② 如果只需要修改文件或目录的所有者,则可以使用
chown [-R] 所有者 文件或目录 ...命令。 - ③ 如果需要同时修改文件或目录的所有者和所属组,则可以使用
chown [-R] 所有者:所属组 文件或目录 ...命令。 - ④ 如果只需要修改文件或目录的所属组,则可以使用
chown [-R] :所属组 文件或目录 ...命令。
- 修改用户组的命令(了解):
shell
chgrp [-R] 所属组 文件或目录 ...提醒
选项:-R,--recursive:递归修改文件和目录,慎用!!!
- 修改权限的命令:
shell
chmod [-R] 模式[,模式]... 文件或目录 ...提醒
- 选项:
-R,--recursive:递归修改文件和目录,慎用!!! - 模式:
[ugoa]*([-+=]([rwxXst]*|[ugo]))+|[-+=][0-7]+。
重要
- ① 用户的最终权限,是按照从左到右的顺序进行匹配的,即:所有者(u)、所属组(g)、其他人(o),一旦匹配成功就会立即生效,不会继续向右查看其它权限。
- ② r 权限和 w 权限对 root 用户无效,因为 root 是 Linux 系统中的系统管理员,拥有最高权限,即:对于没有读写权限的文件,root 用户也可以进行读和写。
- ③ 只要所有者(u)、所属组(g)、其他人(o)三者之一有 x 权限,root 用户就可以执行。
2.2.2 准备工作
- 批量创建文件:
shell
touch /tmp/{01..10}.txt
- 创建用户:
shell
useradd x
2.2.3 案例
- 示例:将
/tmp/01.txt文件的权限设置为755
shell
# mode 为数字的形式
chmod 755 /tmp/01.txt
- 示例:将
/tmp/01.txt文件的所有者和所属组设置为x
shell
chown x:x /tmp/01.txt
- 示例:将
/tmp/02.txt文件的所有者的权限增加x权限
shell
# 以字符串的形式;其中,u 表示所有者,user;g 表示所属组,group;o 表示其它人,other;
# a = u + g + o
# + 表示在原来权限的基础上增加,- 表示在原来权限的基础上减少,
# = 表示用新的权限覆盖旧的权限
chmod u+x /tmp/02.txt
- 示例:给
/etc/rc.d/rc.local文件增加x权限
shell
chmod a+x /etc/rc.d/rc.local
第三章:文件和目录的权限
3.1 概述(⭐)
- 文件和目录的权限不同,如下所示:
| 权限 | 文件 | 目录 |
|---|---|---|
r (read) | 是否可以查看文件内容。 | 是否可以查看目录内容,需要 x 权限配合。 |
w (write) | 是否可以修改文件内容,包括:添加文件内容、删除文件内容、修改文件内容;一般需要 r 权限配合。 | 是否可以在目录中创建、删除、重命名文件,需要 x 权限配合。 |
x (execute) | 是否允许用户执行该文件,通常是命令或脚本;一般需要 r 权限配合。 | 是否可以进去到该目录,是否可以访问目录下的文件属性。 |
提醒
- ① 通过 root 修改权限,其它普通用户来测试权限;因为 root 用户具有最高权限,可以无视权限规则。
- ② 实际工作中,启动程序或脚本等,尽量使用普通用户!!!
3.2 测试文件权限
3.2.1 准备工作
- root 创建
文件以及修改权限:
shell
touch /tmp/demo.shshell
echo 'hostname' > /tmp/demo.shchmod 777 /tmp/demo.shshell
chown x:x /tmp/demo.sh
- root 用户测试读、写、执行权限:
shell
# 读权限
cat /tmp/demo.shshell
# 写权限
echo 'whoami' >> /tmp/demo.shshell
# 执行权限,可以使用绝对路径或相对路径;
# 如果是相对路径,需要切换到对应的目录中,使用./demo.sh
/tmp/demo.sh
- x 用户测试读、写、执行权限:
shell
# 读权限
cat /tmp/demo.shshell
# 写权限
echo 'w' >> /tmp/demo.shshell
# 执行权限
/tmp/demo.sh
3.2.2 测试文件的 r 权限
root用户修改文件的权限为r权限:
shell
chmod u=r /tmp/demo.sh
x用户测试文件的r权限:
shell
cat /tmp/demo.sh
x用户测试文件的w权限:
shell
# 失败,因为只有 r 权限,没有 w 权限
echo 'ls -lah .' >> /tmp/demo.sh
x用户测试文件的x权限:
shell
# 失败,因为只有 r 权限,没有 x 权限
./tmp/demo.sh
3.2.3 测试文件的 w 权限
root用户修改文件的权限为w权限:
shell
chmod u=w /tmp/demo.sh
x用户测试文件的r权限:
shell
# 失败,因为只有 w 权限,没有 r 权限
cat /tmp/demo.sh
x用户测试文件的w权限:
shell
# 可以,如果通过 vi 是不行的,因为 vi 需要先读取文件;所以,通常 rw 配合使用
echo 'cd .' >> /tmp.demo.sh
x用户测试文件的x权限:
shell
# 失败,因为只有 w 权限,没有 x 权限
./tmp/demo.sh
3.2.4 测试文件的 x 权限
root用户修改文件的权限为x权限:
shell
chmod u=x /tmp/demo.sh
x用户测试文件的r权限:
shell
# 失败,因为只有 x 权限,没有 r 权限
cat /tmp/demo.sh
x用户测试文件的w权限:
shell
# 失败,因为只有 x 权限,没有 w 权限
echo 'cd .' >> /tmp.demo.sh
x用户测试文件的x权限:
shell
# 失败,因为只有 w 权限,没有 r 权限;
# SHELL 解释器在执行的时候,需要先读取文件,再执行;所以,通常需要配合 r 使用
./tmp/demo.sh
3.3 测试目录权限
3.3.1 准备工作
- root 创建
目录以及修改权限:
shell
mkdir -pv /tmp/demoshell
touch /tmp/demo/{01..10}.txtshell
chown -R x:x /tmp/demo
3.3.2 测试目录的 r 权限
root用户修改目录的权限为r权限:
shell
chmod u=r /tmp/demo
x用户测试目录的r权限:
shell
# 只能查看到文件名,看不到文件属性,需要配合 x 权限
ll /tmp/demo
提醒
- ① 目录和文件不同,目录用来对文件分类的,所以 r 权限可以查看目录中文件名称;对于文件的属性等,r 权限就无能为力了。
- ② 目录的 x 权限表示能够
进入目录,并且能够查看和修改目录下文件的属性信息。 - ③ 通常,目录的 r 权限要配合 x 权限一起使用。
x用户测试目录的w权限:
shell
# 失败,没有 x 权限
touch /tmp/demo/11.txt
x用户测试目录的x权限:
shell
# 失败,没有 x 权限
cd /tmp/demo
3.3.3 测试目录的 w 权限
root用户修改目录的权限为w权限:
shell
chmod u=w /tmp/demo
x用户测试目录的r权限:
shell
# 失败,没有 r 和 x 权限
ll /tmp/demo
x用户测试目录的w权限:
shell
# 失败,没有 x 权限;很好理解,连目录都不能进入,怎么向目录中创建文件?
touch /tmp/demo/11.txt
x用户测试目录的x权限:
shell
# 失败,没有 x 权限
cd /tmp/demo
3.3.4 测试目录的 x 权限
root用户修改目录的权限为x权限:
shell
chmod u=x /tmp/demo
x用户测试目录的r权限:
shell
# 失败,没有 r
ll /tmp/demo
x用户测试目录的w权限:
shell
# 失败,没有 w 权限
touch /tmp/demo/11.txt
x用户测试目录的x权限:
shell
cd /tmp/demo
3.4 总结(⭐)
- 文件和目录的权限不同,如下所示:
| 权限 | 文件 | 目录 |
|---|---|---|
r (read) | 是否可以查看文件内容。 | 是否可以查看目录内容,需要 x 权限配合,即 rx。 |
w (write) | 是否可以修改文件内容,包括:添加文件内容、删除文件内容、修改文件内容;一般需要 r 权限配合,即 rw。 | 是否可以在目录中创建、删除、重命名文件,需要 x 权限配合,即 rwx。 |
x (execute) | 是否允许用户执行该文件,通常是命令或脚本;一般需要 r 权限配合,即 rx 或 rwx。 | 是否可以进去到该目录,是否可以访问目录下的文件属性,即 rx 或 rwx。 |
提醒
- ① 在实际工作中,对于
脚本文件的权限,一般会授予rx或rwx权限。 - ② 在实际工作中,对于
目录,我们通常会授予rx或rwx权限。
第四章:系统的默认权限和特殊权限
4.1 系统的默认权限
- 在 Linux 系统中,文件和目录是有权限的,即:
shell
# 创建目录
mkdir demo
# 查看目录
ll
# 查看目录的属性
stat demo
shell
# 创建文件
touch demo.txt
# 查看文件
ll
# 查看文件的属性
stat demo.txt
提醒
从上图中,我们可以得知,文件的默认权限是 644 ,而目录的默认权限是 755 ,怎么计算的?
- 在 Linux 中,文件和目录的默认权限是通过 umask 设置来决定了,即:
shell
umask
提醒
从上图中,我们可以得知,umask 是 022 ,和文件的默认权限是 644 ,而目录的默认权限是 755 ,没有任何关系,到底怎么计算的?
- 其实,在 Linux 中,文件的最大权限是
666,即-rw-rw-rw-(默认创建的文件是没有执行权限的);而目录最大的权限是777,即drwxrwxrwx。 - umask 的计算公式如下:
shell
文件或目录的权限 = 文件 或 目录的最大权限 - umask- 那么,文件和目录的权限就是这么计算的:
txt
文件: 666
- umask: 022
----------------------------
结果: 644txt
目录: 777
- umask: 022
----------------------------
结果: 755- 其实,真实的计算是这样的(将 umask
取反,然后按与运算(&)计算):
txt
文件: 666 --对应的二进制--> 110 110 110 -- 对应的二进制 --> 110 110 110
&- umask: 022 --对应的二进制--> 000 010 010 -- 将对应的二进制取反 --> 111 101 101
----------------------------------------------------------------------------------------
结果: 644 <--对应的八进制-- 110 100 100 <-- 与(&)--------------- 110 100 100txt
目录: 777 --对应的二进制--> 111 111 111 -- 对应的二进制 --> 111 111 111
&- umask: 022 --对应的二进制--> 000 010 010 -- 将对应的二进制取反 --> 111 101 101
----------------------------------------------------------------------------------------
结果: 755 <--对应的八进制-- 111 101 101 <-- 与(&)--------------- 111 101 101- 其实,umask 的最大作用就是从将
文件的默认权限中移除某些权限位(可执行权限):
txt
如果上述的算法成立,即:文件或目录的默认权限 = 文件 或 目录的最大权限 - umask (八进制计算)txt
如果 umask = 123 ;那么,文件的默认权限的计算过程:
文件: 666
- umask: 123
----------------------------
结果: 543
543 显示是不对的,因为这就表明了 u 和 o 具有可执行权限,违反了 umask 的定义txt
如果换算为二进制,计算过程是这样的:
文件: 666 --对应的二进制--> 110 110 110 -- 对应的二进制 --> 110 110 110
&- umask: 123 --对应的二进制--> 001 010 011 -- 将对应的二进制取反 --> 110 101 100
----------------------------------------------------------------------------------------
结果: 644 <--对应的八进制-- 110 100 100 <-- 与(&)--------------- 110 100 100- 其实,umask 也是有技巧的,仅仅针对文件而言:
txt
如果 umask = 123 ;那么,文件的默认权限的计算过程:
文件: 666
- umask: 123
----------------------------
结果: 543
543 显示是不对的,因为这就表明了 u 和 o 具有可执行权限,违反了 umask 的定义txt
对于文件而言,结果是奇数位的 + 1 就可以了,即 5 4 3 + 1 0 1 = 6 4 4对于目录而言,不需要上述技巧,即:
目录: 777
- umask: 123
----------------------------
结果: 654提醒
- ① 如果需要持久化保存 umask 值,可以使用
echo 'umask xxx' >> /etc/bashrc命令写入到/etc/bashrc文件中,并通过source /etc/bashrc以便全局生效;也可以通过echo 'umask xxx' >> ~/.bashrc命令写入到~/.bashrc文件中,并通过source ~/.bashrc以便当前用户生效;但是,通常不建议修改!!! - ② 在实际工作的时候,推荐网站的权限配置是:
文件 644 root root,目录 755 root root。 - ③ 网站在运行的时候,不推荐使用
root,而是自己创建虚拟用户或软件自动帮助我们创建虚拟用户。
4.2 特殊权限
4.2.1 概述
- 之前,我们在使用
ll查看权限时候:
shell
ll /usr/bin- 结果如下:
shell
-rwxr-xr-x. 1 root root 28560 9月 28 01:32 which
-rwxr-xr-x. 1 root root 32696 2月 10 2022 whiptail
-rwxr-xr-x. 1 root root 52816 4月 7 2023 who
-rwxr-xr-x. 1 root root 32224 4月 7 2023 whoami
-rwxr-xr-x. 1 root root 32432 10月 1 19:43 wireplumber
-rwxr-xr-x. 1 root root 250 10月 15 2022 withsctp
-rwxr-xr-x. 1 root root 61288 10月 1 19:43 wpctl
-rwxr-xr-x. 1 root root 24264 10月 1 19:43 wpexec
-rwxr-sr-x. 1 root tty 23800 9月 27 10:50 write- 会发现权限除了
rwx外,还有s等,这些其实就是特殊权限;并且当我们使用stat查看文件或目录的属性的时候:
shell
stat /usr/bin/which- 结果如下:
文件:/usr/bin/which
大小:28560 块:56 IO 块:4096 普通文件
设备:fd00h/64768d Inode:17087621 硬链接:1
权限:(0755/-rwxr-xr-x) Uid:( 0/ root) Gid:( 0/ root)
环境:system_u:object_r:bin_t:s0
最近访问:2024-02-18 08:25:27.740628828 +0800
最近更改:2023-09-28 01:32:45.000000000 +0800
最近改动:2024-01-19 13:22:42.874728285 +0800
创建时间:2024-01-19 13:22:42.874728285 +0800- 会发现权限是
四位,即0755,不是通常所见的三位;其实,第一位就是特殊权限。特殊权限有如下的三种:
| 特殊权限 | 解释 | 备注 |
|---|---|---|
| set uid ,即 suid | 运行这个命令的时候,就相当于这个命令的所有者权限,用数字 4 表示。 | /usr/bin/passwd |
| set gid ,即 sgid | 运行这个命令的时候,就相当于这个命令的所属组(用户组)权限,用数字 2 表示。 | /usr/bin/locate |
| sticky,即 t | 对于包含 sticky 权限的目录,每个用户都可以在目录下创建内容,但是每个用户只能管理自己的文件,用数字 1 表示。 | /tmp |
- 查看特殊权限:
shell
ll -d /usr/bin/passwd /usr/bin/locate /tmp
提醒
- ① 特殊权限
suid、sgid和sticky,通常在rwx上的x位上,会影响到rwx权限的显示和行为。 - ② 特殊权限
suid和sgid通常作用于可执行文件(命令);而特殊权限sticky通常作用于目录。
4.2.2 suid 权限
- 我们可以先看一下
/etc/shadow的权限:
shell
ll /etc/shadow
- 上图表明了
/etc/shadow文件是没有任何权限的;但是,在 Linux 中,root用户是可以通过vim编辑的,是因为root用户在 Linux 中是最高权限,即:
shell
vim /etc/shadow
- 如果,我们创建一个
普通用户:
shell
useradd xshell
echo '123456' | passwd --stdin x
- 并让
普通用户,去通过vim编辑/etc/shadow文件,就会发现权限不够的现象:
shell
su - xshell
vim /etc/shadow
- 但是,如果我们通过
passwd命令去修改自己(普通用户)的密码,却是可以:
shell
passwd
- 其实,我们也知道,
passwd命令背后修改的就是/etc/shadow文件;既然,普通用户通过vim对/etc/shadow是没有任何权限的,而普通用户通过passwd命令却可以修改/etc/shadow文件,是因为passwd命令具有特殊权限,即:
shell
ll /usr/bin/passwd
- 这和我们通常见到的权限是不一样的,即:
shell
ll /usr/bin/cat
- 我们可以将
passwd命令和cat命令的权限进行对比,如下所示:
txt
-rwsr-xr-x. 1 root root 32656 4月 14 2022 /usr/bin/passwdtxt
-rwxr-xr-x. 1 root root 36320 4月 7 2023 /usr/bin/cat- 会发现,对于
所有者而言,通常所见的权限rwx中的x却是s,这就是特殊权限,表明运行该命令的时候以所有者的权限执行;那么,就可以推论:当我们执行passwd命令的时候,就会提权到root来修改/etc/shadow文件,root在Linux中可是最高权限,当然可以修改/etc/shadow文件了,该类权限也称为suid。
提醒
set uid ,即 suid 运行这个命令的时候,就相当于这个命令的所有者权限,用数字 4 表示。
4.2.3 sgid 权限
- 那么,对于
guid的特殊权限,可以通过如下的命令查看:
shell
ll -d /usr/bin/locate
- 这和我们通常见到的权限是不一样的,即:
shell
ll /usr/bin/cat
- 我们可以将
locate命令和cat命令的权限进行对比,如下所示:
txt
-rwx--s--x. 1 root slocate 41048 2月 10 2022 /usr/bin/locatetxt
-rwxr-xr-x. 1 root root 36320 4月 7 2023 /usr/bin/cat- 会发现,对于
所属组而言,通常所见的权限rwx中的x却是s,这就是特殊权限,表明运行该命令的时候以所属组(用户组)的权限执行;那么,就可以推论:如果一个用户属于某个用户组,并且该用户组对某个命令具有sgid的权限,那么该用户也可以执行该命令。
提醒
set gid ,即 sgid ,运行这个命令的时候,就相当于这个命令的所属组(用户组)权限,用数字 2 表示。
4.2.4 sticky 权限
- 如果一个目录被设置为
rwx权限(其他人),那么就可以在该目录中创建、删除、重命名文件,即:
shell
mkdir /tmp/demoshell
chmod o=rwx /tmp/demoshell
touch /tmp/demo/{a..c}.txtshell
rm -f /tmp/demo/a.txt
- 这样,会导致即使文件是 root 用户的,也可以被其他用户(其他人)删除,即:
shell
su - xshell
rm -f b.txt
- 这样,非常不安全,其他的用户(其他人)竟然可以删除我的文件;此时,我们就可以在目录上设置
sticky(粘滞位)权限,仅允许用户删除属于他们自己的权限,即:
shell
chmod o+t /tmp/demo
- 那么,其他用户删除不属于自己的文件的时候,就会出现
不允许的操作的错误,即:
shell
su - xrm -f /tmp/demo/c.txt
提醒
- ① Linux 系统的
/tmp目录,默认就是sticky(粘滞位)权限。 - ② sticky,即 t,对于包含 sticky (粘滞位)权限的目录,每个用户都可以在目录下创建内容,但是每个用户只能管理自己的文件,用数字
1表示。
4.2.5 如何设置?
- 我们会发现,特殊权限的位置是固定的,即:
txt
- --s --s ---
suid sgidd --- --- --t
sticky提醒
- ①
suid和sgid通常都是设置到命令(可执行的二进制文件)上的,sgid也可以设置到目录上。 - ②
sticky都是设置到目录上的。 - ③
suid和sgid以及sticky都是单独计算的;换言之,如果都有就是1 1 1,所以suid就是4,而 sgid 就是2,而sticky就是1。 - ④ 如何使用
chmod的数字写法,对于特殊权限必须使用四个数字表示,并且第一位数字表示的就是特殊权限。 - ⑤ 我们通常所写的
三位数字权限写法是一种简化写法,即在没有特殊权限的情况下,系统默认会将四个数字的第一位数字设置为0。
- 设置特殊权限的字符写法:
shell
chmod u+s /bin/rm
chmod g+s /bin/rm
chmod o+t /tmp- 设置特殊权限的数字写法:
shell
chmod 4755 /bin/rm
chmod 1777 /tmp提醒
了解即可,实际工作的时候,几乎不需要手动设置。
第五章:特殊属性(⭐)
5.1 概述
- 某些时候,为了防止病毒修改某些文件或命令,我们可以使用
chattr增强系统的安全性,防止未授权的修改或删除。 - 修改文件或命令的特殊属性:
shell
chattr [+a|i] 文件或命令 ...提醒
- 对应的英文:change attribute。
- 选项:
+表示增加特殊属性,-表示删除特殊属性。a是 append 的缩写,表示只能追加。i是 immutable 的缩写,表示不朽的、无法被毁灭的,即不能被删除。
- 查看文件或命令的特殊属性:
shell
lsattr 文件或命令重要
目前了解即可,后面再详细讲解!!!
5.2 案例
- 示例:
shell
touch /tmp/log.txtshell
chattr +a /tmp/log.txtshell
lsattr /tmp/log.txt
- 示例:
shell
touch /tmp/log.txtshell
chattr +i /tmp/log.txtshell
lsattr /tmp/log.txt
第六章:访问控制列表 ACL
6.1 概述
- 上文也提到了在 RBAC 出现之前的一种权限模型,即 ACL(访问控制列表)。

- 它们之间的优缺点对比,如下所示:
| 权限模型 | RBAC(基于角色的访问控制) | ACL(访问控制列表) |
|---|---|---|
| 优点 | ① 简化管理:通过为角色而非单独用户分配权限,简化了权限管理过程。在用户角色发生变化时,只需修改其角色成员资格,无需重新配置权限。 ② 可扩展性:适合大型组织,可以有效地管理大量用户和复杂的权限需求。 ③ 一致性和复用性:角色可以复用,不同用户可以共享相同的角色定义,提高权限配置的一致性。 | ① 细粒度控制:ACL 可以对每个对象定义具体的用户访问权限,提供更详细的访问控制。 ② 灵活性:可以针对单个文件或资源设置详尽的权限,满足特定的安全需求。 ③ 直接性:直接列出哪些用户或组可以访问哪些资源,权限状态一目了然。 |
| 缺点 | ① 角色爆炸:在复杂的环境中,为满足具体需求可能需要创建大量细化的角色,导致管理复杂。 ② 灵活性有限:对于需要极其细粒度访问控制的场景,RBAC 可能不够灵活,因为它是基于角色而非个别资源的权限定义。 | ① 管理复杂性:随着用户和资源数量的增加,维护 ACL 可能变得非常繁琐和复杂。 ② 缺乏抽象:缺少角色这一层的抽象,每次用户职责变更可能都需要重新配置多个 ACL,增加了管理负担。 ③ 性能开销:对于每个访问请求,系统可能需要检查多个 ACL 条目,这可能影响系统性能。 |
提醒
- ① RBAC 更适用于用户角色固定且组织结构明确的环境,如:企业内部系统,而 ACL 适用于需要详尽控制每个文件或资源访问的场景,如:操作系统的文件系统。
- ② 主流的 Linux 系统的权限模型依然是 RBAC ,但是某些 Linux 系统的文件系统已经可以同时支持 RBAC 权限模型和 ACL 权限模型,如:RHEL 7+ 之后 的 ext4 文件系统和 xfs 文件系统。
- ③ ACL 的生效顺序是:所有者、自定义用户、所属组、自定义组、其他人。
- ④ ACL 可以在传统的 RBAC 模型(所有者、所属组、其他人)的基础上,对更多的用户设置权限,如:其他人中的 x 用户对文件或目录具有 rw 权限,其他人中的 w 用户对文件或目录具有 rx 权限。
6.2 ACL 相关命令
- 设置 ACL 权限:
shell
setfacl [-m u:用户:rwx- g:用户组:rwx- o::rwx- ][-x u:用户 g:用户组 o:其它人][-b] 文件或目录提醒
选项:
-m u:用户:rwx- g:用户组:rwx- o::rwx-:设置 acl 权限。-x u:用户 g:用户组 o:删除 acl 权限。-b:删除所有的 acl 权限。
- 查看 ACL 权限:
shell
getfacl 文件或目录- 示例:准备工作
shell
cp /etc/hosts f1.txt
- 示例:设置 x 用户对文件没有权限
shell
setfacl -m u:x:- f1.txt
- 示例:查看文件的 acl 权限
shell
getfacl f1.txt
- 示例:清除文件的 acl 权限
shell
setfacl -x u:x f1.txt
- 示例:清除所有的 acl 权限
shell
setfacl -b f1.txt
6.3 备份和还原 ACL
cp 命令和 mv 命令都支持 ACL,只是 cp 命令需要添加
-p参数。但是,tar 等命令不会保留文件和目录的 ACL 信息。示例:cp 命令和 mv 命令都支持 ACL,只是 cp 命令需要添加
-p参数
shell
cp -a f1.txt f1.txt.bak
- 示例:tar 等命令不会保留文件和目录的 ACL 信息
shell
tar -zcvf abc.tar.gz f1.*