欢迎光临
我们一直在努力

【Linux 系统篇(五)】权限详解(二)

在这里插入图片描述

大家好,欢迎来到 huangjin007_ 的博客

个人主页:huangjin007_
🔥
文章收录专栏:Linux 内功修炼手册(系统篇)

总会有一些坚持能从冰封的土地里培育出十万朵怒放的蔷薇


Linux 系统篇(五) —— 权限详解(二)

文章目录

  • Linux 系统篇(五) —— 权限详解(二)
    • 一、Linux 默认权限与 Umask 掩码机制
      • 1.1 默认权限
      • 1.2 Umask 是什么?为什么我的文件权限不是 666 / 777?
      • 1.3 用二进制拆解 umask 运算
      • 1.4 普通用户的默认 umask 为什么是 0002?
      • 1.5 如何查看和修改 umask?
      • 1.6 Umask 存在的意义
    • 二、删除文件与文件本身权限无关
      • 2.1 一次颠覆认知的实验
      • 2.2 多用户协作中的痛点
    • 三、粘滞位
      • 3.1 粘滞位的作用
      • 3.2 如何设置粘滞位
      • 3.3 粘滞位验证
    • 结语:

一、Linux 默认权限与 Umask 掩码机制

1.1 默认权限

  当你在终端里敲下 touch test.txt 或者 mkdir mydir 时,内核并不是随机地给它们分配权限,而是有一套默认的“初始权限”作为起点。

  • 普通文件:初始权限为 666,也就是 rw-rw-rw-。 你可能会奇怪,为什么不是 777 呢?原因很简单:出于安全考虑,系统不会默认给一个新建的普通文件加上“可执行(x)”权限。毕竟一个文本文件、图片或者代码源文件,大概率是不需要直接运行的。
  • 目录文件:初始权限为 777,也就是 rwxrwxrwx。 目录和普通文件不同,它需要 x(执行)权限才能让用户 cd 进入。如果目录连 x 权限都没有,即使你有读取权限,也无法切换到该目录下工作。

小结:可以把初始权限理解为系统预设的一个“基础模板”,普通文件模板是 666,目录模板是 777。

1.2 Umask 是什么?为什么我的文件权限不是 666 / 777?

  但如果你马上用 ls -l 看一眼刚刚创建的文件,会发现它的权限根本不是 666 或 777,往往是 644 或 755。 在这里插入图片描述

  这是 umask 在起作用。

  umask(权限掩码)可以看作一个“过滤器”,它在文件或目录创建时,自动把你不希望出现的权限位屏蔽掉。计算最终权限的公式如下:

最终权限 = 初始权限 & (~umask) (即:初始权限 与 umask 取反之后的值,做按位与运算)

1.3 用二进制拆解 umask 运算

  我们先以超级用户默认的 umask 0022 和创建一个目录为例,把整个计算过程走一遍。

第一步:把八进制转换成二进制

  • 初始目录权限 777 -> 二进制:111 111 111

  • umask 值 022 -> 二进制:000 010 010

第二步:对 umask 取反 将 umask 的每一位取反(0变1,1变0): ~022 = 111 101 101 转换成八进制就是 755。

第三步:按位与运算   将初始权限的二进制和取反后的 umask 二进制进行“与”操作(只有两个位都是 1 时,结果才为 1)。

111 111 111 (777,初始权限)
& 111 101 101 (~022,取反后的 umask)
—————-
111 101 101 -> 转回八进制就是 755

  所以最终目录权限为 755(即 rwxr-xr-x)。

  再来看普通文件,初始权限为 666,即 110 110 110,与同样的掩码(~022 = 111 101 101)进行按位与:

110 110 110 (666)
& 111 101 101 (~022)
—————-
110 100 100 -> 八进制 644

  最终文件权限就是 644(rw-r–r–)。

  这样一拆解,就很清晰了。umask 里值为 1 的位,在取反后变成 0,而与运算时“与 0”一定会让对应的权限位变成 0,也就是说 umask 中出现的权限位,最终会被屏蔽掉。超级用户的 umask 0022 中 group 和 other 的 w(写)位被置为 1,因此创建出来的文件属组和其他用户都没有写权限。

1.4 普通用户的默认 umask 为什么是 0002?

  大多数 Linux 发行版中,root 的默认 umask 是 0022,而普通用户的默认 umask 是 0002。区别就在于 owner(文件拥有者)的那个位上:普通用户 umask 的 owner 部分是 0,因此不会屏蔽自己的任何权限。但对 group 和 other 来说,依然屏蔽了写权限。

  • root umask 0022 -> 文件 644,目录 755
  • 普通用户 umask 0002 ->文件 664,目录 775

1.5 如何查看和修改 umask?

查看当前 umask:

在这里插入图片描述

  直接输入 umask 不带参数,会输出当前 shell 的掩码值,例如 0022 或 0002。

  如果想看到更人性化的符号形式,可以使用 -S 选项:

在这里插入图片描述

临时修改 umask:

umask 0002 # 设为 0002

  这样修改只对当前终端会话有效,关闭终端后就会恢复。

1.6 Umask 存在的意义

  你可能会想:既然系统可以直接规定创建出来的文件就是 644,为什么还要绕一个 umask 的圈子?

主要原因有两点:

  • 灵活表达需求:初始权限 666/777 是由内核硬编码的,用户无法在 touch 或 mkdir 的时候直接附加一个“请给我 700 权限”的参数(当然可以用 chmod 后修改,但那是事后补救)。而通过调整 umask,你可以统一控制所有新创建的文件和目录的默认权限,这是一种系统级别的策略控制。
  • 安全控制:在多用户或服务器环境下,合理的 umask 可以避免你创建的文件被其他用户意外修改或查看。

  • 二、删除文件与文件本身权限无关

    2.1 一次颠覆认知的实验

      让我们先看一个场景:用户 zhangsan 在共享目录 /shared 下创建了一个文件,并把它设为只读(自己也只能看不能改)。然后用户 lisi 进入该目录,试图删除这个文件。

    # zhangsan 的操作
    $ mkdir /shared
    $ chmod 777 /shared # 暂且设为全开放
    $ cd /shared
    $ touch zhangsan_file
    $ chmod 444 zhangsan_file # 改为只读

    # lisi 的操作
    $ cd /shared
    $ ls -l
    total 0
    -r–r–r– 1 zhangsan zhangsan 0 Sep 19 17:00 zhangsan_file
    $ rm zhangsan_file
    rm: remove write-protected regular empty file ‘zhangsan_file’? y
    $ ls
    (文件不见了!)

      是不是很吃惊?文件明明是只读的,而且还不属于 lisi,为什么他能删掉?

      核心结论:在 Linux 中,一个文件能否被删除,根本不取决于文件自身的权限,而是取决于其所在父目录的权限。

      具体来说,只要你对父目录拥有 写入(w) 和 执行(x) 权限,你就有权修改该目录下的目录项列表,包括删除里面的任何文件,无论这个文件是谁创建的、它的权限设置成什么样。

      删除操作修改的是目录的内容,而不是文件的内容。只要你对目录有写入权,自然就可以在其内执行增、删、改名字的操作。

      反过来,即便你对某个文件有 w 权限,但如果对父目录没有 w 权限,你也无法删除这个文件。你可以修改文件内容,但就是删不掉。

    2.2 多用户协作中的痛点

      这个逻辑在单用户环境下可能没什么问题,但到了多用户协作场景,就会暴露出巨大的安全隐患。   假设我们有一个公共工作目录 /home/project,组内所有人都需要对它进行读写。为了让每个人都能创建文件,我们把它设成 777 。这时候,张三写了一个非常重要的代码文件,李四如果不小心或是恶意,完全可以直接 rm 掉,张三毫无办法。权限是开放了,数据安全却崩了。

      怎么解决呢?让操作系统知道:“这个目录是公用的,你可以进来创建自己的东西,但你不能乱动别人的文件。”


    三、粘滞位

    3.1 粘滞位的作用

      对于一个目录设置了粘滞位后,该目录下的文件,只有以下三类用户才能删除或重命名:

  • 超级管理员 root
  • 该目录的所有者
  • 该文件的所有者
  •   换句话说,即使你对这个共享目录拥有写权限,只要文件不是你自己的,你就删不掉

    3.2 如何设置粘滞位

      设置粘滞位使用 chmod +t 命令,后面跟目录名。

    在这里插入图片描述

      注意权限字符串末尾多了一个 t,它位于原来 other 的 x 权限位置上:

    • 如果 other 原来的 x 位是 x,加了粘滞位后显示为小写 t。
    • 如果 other 原来的 x 位是 -(无执行权限),加了粘滞位后就会显示为大写 T,表示“粘滞位生效,但 other 没有执行权限,所以实际上无法使用该目录”。虽然可以设置,但这种组合几乎没有实用价值。

      用数字模式设置的话,粘滞位的数值是 1,要放在三位权限数字的前面,例如:

    在这里插入图片描述

      这样目录权限就是 rwxrwxrwt。

    3.3 粘滞位验证

      假设有一个共享目录,已经开启了粘滞位,用户 lisi 想删除不属于他的文件。

    [root@localhost ~]# chmod 1777 /home/public
    [root@localhost ~]# su – zhangsan
    [zhangsan@localhost ~]$ cd /home/public
    [zhangsan@localhost public]$ touch abc.c
    [zhangsan@localhost public]$ exit

    [root@localhost ~]# su – lisi
    [lisi@localhost ~]$ cd /home/public
    [lisi@localhost public]$ rm abc.c
    rm:是否删除有写保护的普通空文件 "/home/public/abc.c"?y
    rm: 无法删除"/home/public/abc.c": 不允许的操作

      系统先是按照删除普通文件那样问了一句“是否删除”,然而在 lisi 确认后,内核直接拒绝执行,并返回 Operation not permitted。这正是粘滞位在发挥保护作用。

      有几点需要注意:

    • 粘滞位只对目录有效,对普通文件没有任何意义(如果你给一个普通文件设置了 +t,它只会显示为 t 或 T,但完全不影响删除行为)。
    • 即使目录有粘滞位,root 依然可以为所欲为,因为它不受任何权限约束。
    • 目录的所有者可以删除目录下任何人的文件。

    结语:

      今天的内容到这里就结束了,希望你能有所收获~

    干货整理到手抖,觉得有用的话,赏个三连回回血?__(:ᗤ」ㄥ)_ _

    赞(0)
    未经允许不得转载:171主机测评 » 【Linux 系统篇(五)】权限详解(二)
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址