Linux 核心机制详解(三):文件系统权限与共享安全——从删除规则到粘滞位防护

目录

  • 前言
  • [一、深入理解 Linux 文件系统:文件删除与共享机制](#一、深入理解 Linux 文件系统:文件删除与共享机制)
    • [1.1 关于文件删除的话题](#1.1 关于文件删除的话题)
      • [1.1.1 核心原则:删除权限由目录决定](#1.1.1 核心原则:删除权限由目录决定)
      • [1.1.2 实验演示:为什么 whb 能删除 root 的文件?](#1.1.2 实验演示:为什么 whb 能删除 root 的文件?)
        • [1.1.2.1 环境准备](#1.1.2.1 环境准备)
        • [1.1.2.2 制造"冲突"文件](#1.1.2.2 制造“冲突”文件)
        • [1.1.2.3 见证奇迹的时刻](#1.1.2.3 见证奇迹的时刻)
        • [1.1.2.4 反向思考:如果目录没有 w 权限呢?](#1.1.2.4 反向思考:如果目录没有 w 权限呢?)
    • [1.2 Linux 文件共享的挑战与解决方案](#1.2 Linux 文件共享的挑战与解决方案)
      • [1.2.1 共享目录的选址原则](#1.2.1 共享目录的选址原则)
      • [1.2.2 初步实现共享](#1.2.2 初步实现共享)
      • [1.2.3 共享中的安全隐患:误删风险](#1.2.3 共享中的安全隐患:误删风险)
    • [1.3 粘滞位(Sticky Bit):共享目录的守护神](#1.3 粘滞位(Sticky Bit):共享目录的守护神)
      • [1.3.1 什么是粘滞位?](#1.3.1 什么是粘滞位?)
      • [1.3.2 设置粘滞位](#1.3.2 设置粘滞位)
      • [1.3.3 效果验证](#1.3.3 效果验证)
      • [1.3.4 现实中的应用:/tmp 目录](#1.3.4 现实中的应用:/tmp 目录)
  • 结语

🎬 云泽Q :个人主页
🔥 专栏传送入口 : 《C语言》《数据结构》《C++》《Linux》《蓝桥杯系列》《笔试算法》《AI赋能》《STM32》

⛺️遇见安然遇见你,不负代码不负卿~


前言

大家好啊,我是云泽Q,欢迎阅读我的文章,一名热爱计算机技术的在校大学生,喜欢在课余时间做一些计算机技术的总结性文章,希望我的文章能为你解答困惑~

一、深入理解 Linux 文件系统:文件删除与共享机制

要真正理解 Linux 的权限管理,我们需要先搞清楚两个核心问题:关于文件删除的本质 以及关于 Linux 文件共享的实现。虽然现在的云盘和共享经济非常发达,但在 Linux 系统内部,理解文件共享的场景依然是掌握高级权限(如粘滞位)的最佳切入点。

1.1 关于文件删除的话题

1.1.1 核心原则:删除权限由目录决定

很多初学者有一个误区,认为只要我没有文件的写权限,我就删不掉这个文件。这是错误的!

在 Linux 中,删除文件的操作不由目标文件自身的读写执行权限决定,而是由该文件所在目录的写(w)权限决定。

我们可以用一个形象的比喻来理解:

"外人把衣服扔进你家洗衣机,你有权将其扔出门外。"

即使一个文件对普通用户没有任何权限(rwx 均无),只要该用户对其所在的目录拥有写权限,就能删除该文件。

1.1.2 实验演示:为什么 whb 能删除 root 的文件?

让我们通过一组具体的实验来验证这个结论。假设我们有两个用户:普通用户 whb 和超级管理员 root。

1.1.2.1 环境准备

首先,我们在用户 whb 的家目录下创建一个测试目录 118。

bash 复制代码
[whb@bite-alicloud ~]$ mkdir 118
[whb@bite-alicloud ~]$ cd 118
[whb@bite-alicloud 118]$ pwd
/home/whb/code/118

此时,目录 118 的所有者是 whb,所属组也是 whb,且默认拥有所有权限(drwxrwxr-x)。

1.1.2.2 制造"冲突"文件

接着,我们切换到 root 用户,在这个属于 whb 的目录下创建几个文件,并故意剥夺其他人的权限。

bash 复制代码
[root@bite-alicloud 118]# touch root1.txt root2.txt root3.txt
[root@bite-alicloud 118]# chmod o-r root{1..3}.txt
[root@bite-alicloud 118]# ll
total 0
-rw-r----- 1 root root 0 Oct 29 19:39 root1.txt
-rw-r----- 1 root root 0 Oct 29 19:39 root2.txt
-rw-r----- 1 root root 0 Oct 29 19:39 root3.txt

可以看到,这些文件属于 root,且其他用户(others)连读权限都没有。

1.1.2.3 见证奇迹的时刻

现在切回普通用户 whb,尝试删除这些文件。

bash 复制代码
[whb@bite-alicloud 118]$ rm root1.txt
rm: remove write-protected regular empty file 'root1.txt'? y
[whb@bite-alicloud 118]$ ll
total 0
-rw-r----- 1 root root 0 Oct 29 19:39 root2.txt
-rw-r----- 1 root root 0 Oct 29 19:39 root3.txt

结果分析:

whb 成功删除了 root1.txt!尽管 whb 对这个文件本身没有任何权限,但因为 118 这个目录是 whb 的,他对目录有写权限(w),所以系统允许他修改目录的内容------也就是把文件名从目录列表中抹去。

1.1.2.4 反向思考:如果目录没有 w 权限呢?

如果我们将目录的权限收回,情况就会反转。

bash 复制代码
[root@bite-alicloud 118]# mkdir dir
[root@bite-alicloud 118]# chmod o-w dir  # 移除其他人的写权限
[root@bite-alicloud 118]# su ran         # 切换到一个普通用户 ran
[ran@bite-alicloud 118]$ touch ran.txt
touch: cannot touch 'ran.txt': Permission denied
[ran@bite-alicloud 118]$ mkdir new_dir
mkdir: cannot create directory 'new_dir': Permission denied

当目录失去了 w 权限,普通用户既不能在里面新建文件,也不能删除里面的文件,无论文件本身的权限如何。

1.2 Linux 文件共享的挑战与解决方案

理解了删除机制后,我们来看看如何实现多用户之间的文件共享。这在实际开发协作中非常重要。

1.2.1 共享目录的选址原则

绝对不能在任意一个用户的家目录下进行共享!

Linux 的用户家目录(如 /home/whb)默认权限通常是 drwx------(700),这意味着除了所有者和 root,其他人连进入(x)的权限都没有。

bash 复制代码
[zpw@bite-alicloud ~]$ cd /home/whb
bash: cd: /home/whb: Permission denied

因此,共享文件一般都在非用户家目录内部,通常由 root 用户在根目录或特定分区下创建公共目录。

1.2.2 初步实现共享

我们可以由 root 在根目录下创建一个公共目录 /shared_dir,并开放权限。

bash 复制代码
[root@bite-alicloud /]# mkdir shared_dir
[root@bite-alicloud /]# chmod o+w shared_dir/
[root@bite-alicloud /]# ll -d shared_dir/
drwxr-xrwx 2 root root 4096 Oct 29 20:07 shared_dir/

这样,用户 whb 和 zpw 都可以进入该目录并创建文件。

bash 复制代码
[whb@bite-alicloud shared_dir]$ touch shared.txt
[whb@bite-alicloud shared_dir]$ echo "aaaa" > shared.txt

此时,zpw 也可以读取这个文件:

bash 复制代码
[zpw@bite-alicloud shared_dir]$ cat shared.txt
aaaa

1.2.3 共享中的安全隐患:误删风险

虽然大家都能读写,但这里存在一个巨大的隐患。回顾我们刚才讲的删除原则 :只要对目录有 w 权限,就能删除目录下的文件。

在上面的例子中,用户 xjh 虽然不是文件的创建者,但他对 /shared_dir 有写权限,所以他可以轻易删除 whb 创建的文件:

bash 复制代码
[xjh@bite-alicloud shared_dir]$ rm shared.txt
rm: remove write-protected regular file 'shared.txt'? y
[xjh@bite-alicloud shared_dir]$ ll
total 0

问题来了: 我们希望所有人都能在共享目录下新建文件,但又希望每个人只能删除自己创建的文件,该怎么办?

  • 方案 A:去掉目录的 w 权限? 不行!那样大家都没法新建文件了,共享功能直接瘫痪。
  • 方案 B:使用特殊的权限位。 这就是我们要引入的主角------粘滞位(Sticky Bit)。

1.3 粘滞位(Sticky Bit):共享目录的守护神

1.3.1 什么是粘滞位?

粘滞位是一种特殊的权限位,专门用于目录。当一个目录被设置了粘滞位后,该目录下的文件删除规则会发生改变:

只有以下三种身份的人才能删除目录下的文件:

  1. 超级管理员(root)
  2. 该目录的所有者(通常是 root)
  3. 该文件的所有者(即谁创建的谁负责)

1.3.2 设置粘滞位

我们使用 chmod +t 命令来给目录设置粘滞位。

bash 复制代码
[whb@bite-alicloud /]$ sudo chmod +t shared_dir/
[whb@bite-alicloud /]$ ll -d shared_dir/
drwxr-xrwt 2 root root 4096 Oct 29 20:17 shared_dir/

注意看权限位的最后一位变成了 t (如果是大写 T 则表示没有执行权限 x,小写 t 表示有执行权限 x)。

1.3.3 效果验证

设置粘滞位后,我们再次尝试用 xjh 用户去删除 whb 创建的文件。

bash 复制代码
[xjh@bite-alicloud shared_dir]$ ll
total 4
-rw-rw-r-- 1 whb whb 5 Oct 29 20:14 whb.txt

[xjh@bite-alicloud shared_dir]$ rm whb.txt
rm: remove write-protected regular file 'whb.txt'? y
rm: cannot remove 'whb.txt': Operation not permitted

报错提示:Operation not permitted(操作不被允许)。

即便 xjh 对目录有写权限,但因为他不是 whb.txt 的所有者,也不是 root,系统拒绝了这次删除操作。

1.3.4 现实中的应用:/tmp 目录

其实,Linux 系统中早就为我们准备好了这样一个带有粘滞位的目录,那就是 /tmp(临时目录,该目录就在根目录下,云服务器安装后自带)。

bash 复制代码
[root@bite-alicloud /]# ll -d /tmp
drwxrwxrwt. 13 root root 4096 Jul 11 2019 /tmp

你会发现 /tmp 的权限末尾也是一个 t。

  • 设计初衷: 任何程序、任何用户都可以在 /tmp 下创建临时文件。
  • 安全保障: 防止恶意用户或错误脚本删除其他用户正在使用的临时文件。

结语

相关推荐
Nerd(BUG版)36 分钟前
KMP学习day4--Kotlin空安全与泛型
学习·安全·kotlin
测试界的小码农1 小时前
【Linux 命令实战(03):文件创建、复制、移动与删除,掌握 touch、mkdir、cp、mv、rm】
linux·服务器·php
byte轻骑兵2 小时前
实战 1:修改 BlueZ 源码,添加自定义开机日志
linux·aiot·bluez·电脑蓝牙·嵌入式蓝牙
叼烟扛炮2 小时前
Linux 学习笔记(五十):网络层——IP 协议、子网划分与 NAT 魔法
linux·笔记·学习
叼烟扛炮2 小时前
Linux 学习笔记(六十):单线程的逆袭——epoll 高并发服务器实战
linux·服务器·网络·笔记·学习·算法
AR-26710-3 小时前
Linux Day32——实操五类资源告急排查
linux·运维
skywalk81633 小时前
hive 常驻集群:像 OSPF 一样在线,像 git 一样可信
运维·人工智能·hive
StarsGreen3 小时前
libva中的图像格式说明
linux
H.莓飛4 小时前
【C++】【STL】vector_OJ题
linux·服务器·开发语言·数据结构·c++·visual studio
Rabitebla4 小时前
【Linux操作系统】进程篇(十一):进程程序替换——从底层原理到 exec 函数族
linux·服务器·c++·笔记·学习·算法