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/

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

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 下创建临时文件。
  • 安全保障: 防止恶意用户或错误脚本删除其他用户正在使用的临时文件。

结语

相关推荐
码农阿豪1 小时前
Prometheus怎么监控另一台Linux服务器?Node Exporter配置教程
linux·服务器·prometheus
三言老师1 小时前
CentOS7 / 8 yum 查询软件安装路径实操
运维·服务器·网络·centos
BullSmall1 小时前
Jenkins LTS JDK21 docker-compose.yml(生产可用)
运维·docker·jenkins
公众号:fuwuqiBMC1 小时前
(转自“服务器BMC”)服务器BMC芯片功能——LTPI简介
运维·服务器
倚栏听雨_ylty1 小时前
H3C交换机关闭Telnet和HTTP服务实例
运维·网络·tcp/ip·网络安全
7177771 小时前
自研 BCA 引擎驱动:Gitee Scan 构建软件工厂全生命周期安全检测体系
安全·gitee
念何架构之路1 小时前
docker-Builder镜像构建
运维·docker·容器
xywww1681 小时前
Claude Opus 5 API 接入实战:国内项目上线前的网络、Key、限流和排错清单
大数据·linux·网络·数据库·云计算·aws
ShineWinsu1 小时前
对于Linux:http的解析
linux·网络·c++·网络协议·http·请求·响应