Linux 中的 umask 是什么,如何使用它?

已发表: 2022-07-29
显示 bash 提示符的 Linux 笔记本电脑
fatmawati achmad zaenuri/Shutterstock.com

在 Linux 中,所有目录和文件都有访问权限。 您可以使用chmod为不同的用户设置您的首选访问权限。 但是什么决定了他们的默认权限呢? 让我们谈谈umask

访问权限

所有目录和文件都有称为模式位的标志,这些标志决定它们是否可以被读取、写入或执行。 执行文件意味着像程序或脚本一样运行它。 对于一个目录,您必须能够“执行”一个目录以cd进入它。 位模式设置统称为目录或文件的权限

共有三组权限。 一组用于目录或文件的所有者。 除非所有权已通过chown更改,否则所有者是创建目录或文件的人。

Linux 文件权限如何工作?
相关Linux 文件权限如何工作?

第二组权限适用于已分配目录或文件的用户组的成员。 通常,这是所有者的用户组。

“其他人”还有第三组也是最后一组权限。 对于前两组中未包含的每个人来说,这是一个包罗万象的内容。

通过像这样分离权限,可以为这三个类别赋予不同的能力。 这就是在 Linux 中控制目录和文件访问的方式。 尽管它是一个简单的方案,但它提供了一种灵活且健壮的方式来决定谁可以对任何目录或文件执行什么操作。

模式位

您可以使用ls命令和-l (长格式)选项查看文件的权限。

 ls -l 任意*

我们还将通过添加-d (目录)选项来查看目录。 如果没有这个选项, ls将查看目录中的文件,而不是目录本身。

 ls -ld 

使用 ls 查看目录和文件的权限

ls列表中每个条目的开头,有 10 个字符的集合。 这是文件和目录的这些字符的特写。

文件和目录的权限,关闭

文件是最上面一行,目录是下面一行。 第一个字符告诉我们查看的是目录还是文件。 “d”表示目录,破折号“ - ”表示文件。

三组权限由每组三个字符表示。 从左到右,这些是所有者、组和其他人的权限。 在每组权限中,三个字符从左到右分别表示读取权限“r”、写入权限“w”和执行权限“x”的设置。 字母表示已设置权限。 破折号“ - ”表示未设置权限。

对于我们的示例文件,这 10 个字符表示:

  • :这是一个文件,而不是一个目录。
  • rwx :所有者可以读取、写入和执行此文件。
  • rw- :该文件分配到的同一组的其他成员可以读取和写入该文件,但他们不能执行它。
  • r- : 其他人只能读取文件。

对于我们的示例目录,这 10 个字符表示:

  • d :这是一个目录。
  • rwx :所有者可以读取、写入和执行( cd进入)这个目录。
  • rwx :同一组的其他成员可以读取、写入和cd到此目录。
  • rx :其他人都可以cd进入这个目录,但他们只能读取文件。 他们不能删除文件、编辑文件或创建新文件。

权限存储在目录或文件的元数据中的模式位中。 每个模式位都有一个数值。 如果未设置,它们的值都为零。

  • r :如果设置,读取位的值为 4。
  • w :如果设置,写入位的值为 2。
  • x :如果设置,执行位的值为 1。

一组三个权限可以由位值的总和表示。 最大值为 4+2+1=7,这会将集合中的所有三个权限设置为“开启”。 这意味着所有三组的所有排列都可以在三位八进制(以 8 为基数)值中捕获。

以我们上面的示例文件为例,所有者具有读、写和执行权限,即 4+2+1=7。 文件所在组的其他成员有读写权限,即4+2=6。 其他类别只有读取权限集,即 4。

因此该文件的权限可以表示为 764。

使用相同的方案,目录的权限将为 775。您可以使用stat命令查看权限的八进制表示。

如何在 Linux 上使用 chmod 命令
相关如何在 Linux 上使用 chmod 命令

chmod ( ch ange mod e bits) 命令是用来设置目录和文件权限的工具。 但它并没有规定在创建目录或文件时设置什么权限。 为此使用了一组默认权限。

默认权限和 umask

目录的默认权限是 777,文件的默认权限是 666。这使每个用户都可以完全访问所有目录,并能够读取和写入任何文件。 未在文件上设置执行位。 您不能创建已经设置了执行位的文件。 这可能会带来安全风险。

如何在 Linux 上使用 stat 命令
相关如何在 Linux 上使用 stat 命令

但是,如果您创建一个新目录和一个新文件并查看它们的权限,它们将不会设置为 777 和 666。我们将创建一个文件和一个目录,然后使用stat通过grep管道提取该行他们权限的八进制表示。

 触摸umask-article.txt
 mkdir howtogeek
 统计umask-article.txt | grep“访问:(”
 统计指南 | grep“访问:(” 

目录和文件的默认权限,以及它们每个的 stat 输出

对于目录,它们设置为 775,对于文件,它们设置为 664。 它们未设置为全局默认权限,因为另一个值修改了它们,称为 umask 值。

umask 价值

umask 值是全局设置的,root 用户使用一个值,所有其他用户使用不同的值。 但它可以为任何人设置一个新值。 要查看当前的 umask 设置是什么,请使用umask命令。

 掩码

普通用户的 umask 值

对于根:

 掩码

root 用户的 umask 值

新创建的目录或文件的权限是 umask 值修改全局默认权限的结果。

就像模式位一样,umask 值表示相同的三组权限——所有者、组和其他——并将它们表示为三个八进制数字。 您有时会看到它们写成四位数字,第一个数字为零。 这是“这是一个八进制数”的简写方式。 这是最右边的三位数字。

umask 值不能添加权限。 它只能删除或屏蔽权限。 这就是为什么默认权限如此自由的原因。 它们旨在通过应用 umask 值降低到合理的水平。

一组默认权限并不适合所有用户,也不适合所有场景。 例如,由 root 创建的目录和文件将需要比普通用户更多的限制性权限。 即使是普通用户也不希望其他类别中的每个人都能够查看和更改他们的文件。

umask 如何屏蔽权限

从默认权限中减去掩码值即可获得实际权限。 换句话说,如果在 umask 值中设置了权限,则不会在应用于目录或文件的权限中设置权限。

umask 值与通常的权限值相反。

  • 0 :不删除任何权限。
  • 1 :权限中未设置执行位。
  • 2 :权限中未设置写入位。
  • 4 :权限中未设置读取位。

目录的默认权限 777 和文件的 666 被 umask 值 002 修改,以在我们的测试目录和文件上产生 775 和 664 的最终权限。

 统计umask-article.txt | grep“访问:(”
 统计指南 | grep“访问:(” 

目录和文件的最终权限

这将删除目录和文件上其他类别的写权限。

如果 root 创建一个目录,则应用其 umask 值 022。 删除其他类别和组类别的写入权限。

 sudo mkdir 根目录
统计指南 | grep“访问:(” 

root创建目录时的权限

我们可以看到777的默认权限已经降低到了755。

相关:如何使用 Lynis 审核 Linux 系统的安全性

更改默认 umask 值

登录 shell 和非登录 shell 有不同的 umask 值。 登录 shell 是允许您通过 SSH 在本地或远程登录的 shell。 非登录外壳是您已经登录时终端窗口内的外壳。

如果更改登录 shell umask,请务必小心。 不要增加权限并降低您的安全性。 如果有的话,您应该倾向于减少它们并使它们更具限制性。

在 Ubuntu 和 Manjaro 上,可以在以下文件中找到 umask 设置:

  • Login Shell umask :对于登录 shell 默认 umask 值:/etc/profile
  • Non-Login Shell :对于非登录 shell 默认 umask 值:/etc/bash.bashrc

在 Fedora 上,可以在以下文件中找到 umask 设置:

  • Login Shell umask :用于登录 shell 默认 umask 值:/etc/profile
  • Non-Login Shell :对于非登录 shell 默认 umask 值:/etc/bashrc

如果您没有迫切需要更改这些,最好不要管它们。

首选方法是为需要不同于默认值的任何单个用户帐户设置一个新的 umask 值。 可以将新的 umask 设置放在用户主目录中的“.bashrc”文件中。

 gedit .bashrc 

在编辑器中打开 .bashrc 文件

在文件顶部附近添加您的 umask 设置。

将 umask 值添加到 .bashrc 文件

保存文件并关闭编辑器。 打开一个新的终端窗口并使用umask命令检查 umask 值。

 掩码

检查新的 umask 值

新值处于活动状态。

相关:如何从 Windows、macOS 或 Linux 连接到 SSH 服务器

umask 的短期变化

如果您对不同的 umask 值有短期需求,可以使用umask命令为当前会话更改它。 也许您要创建一个目录树和一些文件,并且希望提高它们的安全性。

您可以将 umask 值设置为 077,然后检查新值是否处于活动状态。

 掩码 077
 掩码

设置临时 umask 值

在组和其他类别中将掩码设置为 7 意味着从这些类别中删除所有权限。 除了您(和 root)之外,没有人能够进入新目录并读取和编辑您的文件。

 mkdir 安全目录
ls -ld 安全目录

在会话中使用临时 umask 值创建新目录

唯一的权限是目录所有者。

 mkdir 安全文件.txt
 ls -ld 安全文件.txt 

在会话中使用临时 umask 值创建新文件

该文件是安全的,不会被任何其他用户窥探。 关闭终端窗口会丢弃临时 umask 设置。

使用 umask 的其他方式

Linux 允许某些进程继承系统 umask 值,或赋予它们自己的 umask 设置。 例如, useradd使用 umask 设置来创建新用户的主目录。

umask 值也可以应用于文件系统。

 少 /etc/fstab 

用 less 查看 /etc/fstab 文件

在这台计算机上,“/boot/efi”文件系统应用了 077 的 umask 设置。

/etc/fstab 文件中的 umask 设置

使用ls查看文件系统挂载点,我们可以验证 umask 值已删除除所有者 root 之外的所有人的所有权限。

 ls /boot/efi -ld 

使用 ls 查看“/boot./efi”文件系统挂载点的权限

umask 和权限相互需要

默认权限在被 umask 值转换应用于目录或文件。 很少需要永久更改用户的 umask 值,但是在创建敏感目录或文档集合时临时设置 umask 值以提供更严格的权限是一种快速简便的方法来支持他们安全。

相关:如何使用 UFW 防火墙保护您的 Linux 服务器