在Linux中,所有目录和文件都具有访问权限。您可以使用chmod设置不同用户的首选访问权限。但什么决定了它们的默认权限?让我们谈谈umask。
访问权限
所有目录和文件都有称为模式位的标志,用于决定是否可以读取、写入或执行它们。执行文件意味着像程序或脚本一样运行它。对于一个目录,您必须能够“执行”一个目录并将其cd到其中。位模式设置统称为目录或文件的权限。
有三组权限。一组用于目录或文件的所有者。除非所有权已更改为chown,否则所有者就是创建目录或文件的人。
第二组权限是为目录或文件分配给的用户组成员设置的。通常,这是所有者的用户组。
还有第三组也是最后一组“其他人”权限。这是前两组权限之外的所有人的总称。
通过这样分离权限,可以为这三个类别提供不同的功能。这就是Linux中控制目录和文件访问的方式。虽然这是一个简单的方案,但它提供了一种灵活而健壮的方式来规定谁可以对任何目录或文件执行什么操作。
模式位
可以使用ls命令和-l(长格式)选项查看文件的权限。
ls -l any*
我们还将通过添加-d(directory)选项来查看目录。如果没有此选项,ls将查看目录内的文件,而不是目录本身。
ls -ld
在ls列表中每个条目的开头,有一个10个字符的集合。下面是文件和目录中这些字符的特写。
文件在最上面一行,目录在最下面一行。第一个字符告诉我们是查看目录还是文件。“d”表示目录,破折号“-”表示文件。
三组权限由每组三个字符表示。从左到右是所有者、组和其他人的权限。在每组权限中,从左到右的三个字符表示读取权限“r”、写入权限“w”和执行权限“x”的设置。字母表示设置了权限。破折号“-”表示未设置权限。
对于我们的示例文件,10个字符表示:
- –:这是一个文件,而不是目录。
- rwx:所有者可以读取、写入和执行此文件。
- rw-:该文件所分配到的同一组的其他成员可以读写该文件,但不能执行该文件。
- r–:其他人只能读取文件。
对于我们的示例目录,10个字符表示:
- d: 这是一个目录。
- rwx:所有者可以读取、写入和执行(cd到)该目录。
- rwx:同一组的其他成员可以在这个目录中读、写和cd。
- r-x:其他人都可以cd到这个目录中,但他们只能读取文件。他们无法删除文件、编辑文件或创建新文件。
权限以模式位的形式存储在目录或文件的元数据中。每个模式位都有一个数值。如果未设置,它们的值都为零。
- r: 如果设置,则读取位的值为4。
- w: 如果设置,则写入位的值为2。
- x: 如果设置,则执行位的值为1。
一组三个权限可以由位值的总和表示。最大值为4+2+1=7,这会将集合中的所有三个权限设置为“on”。这意味着所有三个集合的所有排列都可以用三位数的八进制(基数8)值捕获。
以上面的示例文件为例,所有者具有读取、写入和执行权限,即4+2+1=7。文件所在组的其他成员具有读取和写入权限,即4+2=6。其他类别仅具有读取权限集,即4。
因此,该文件的权限可以表示为764。
使用相同的方案,目录的权限为775。您可以使用stat命令查看权限的Octal表示。
chmod(更改模式位)命令是用于设置目录和文件权限的工具。但它并没有规定在创建目录或文件时对其设置哪些权限。对此使用默认权限集。
默认权限和umask
目录的默认权限为777,文件的默认权限是666。这使得每个用户都可以完全访问所有目录,并能够读取和写入任何文件。文件上未设置执行位。无法创建已设置执行位的文件。这可能会带来安全风险。
但是,如果您创建一个新目录和一个新文件并查看其权限,则不会将其设置为777和666。我们将创建一个文件和一个目录,然后使用stat管道通过grep提取具有其权限八进制表示的行。
touch umask-article.txt
mkdir howtogeek
stat umask-article.txt | grep "Access: ("
stat howtogeek | grep "Access: ("
目录设置为775,文件设置为664。它们未设置为全局默认权限,因为另一个值会修改它们,称为umask值。
umask值
umask值是全局设置的,其中一个值用于root,另一个值则用于所有其他用户。但它可以为任何人设置一个新值。要查看当前umask设置,请使用umask命令。
umask
对于root:
umask
新创建的目录或文件的权限是umask值修改全局默认权限的结果。
与模式位一样,umask值表示相同的三组权限所有者、组和其他用户,并用三个八进制数字表示。您有时会看到它们被写为四位数,第一位数为零。这是表示“这是一个八进制数”的简写方式。它是最右边的三位数字。
umask值无法添加权限。它只能删除或屏蔽权限。这就是默认权限如此自由的原因。它们被设计为通过应用umask值降低到合理的水平。
一组默认权限不会适合所有用户,也不会适合所有场景。例如,根用户创建的目录和文件需要比普通用户更多的限制权限。即使是普通用户也不希望其他类别的所有人都能查看和更改他们的文件。
umask如何屏蔽权限
从默认权限中减去掩码值即为实际权限。换句话说,如果在umask值中设置了权限,则不会在应用于目录或文件的权限中设置该权限。
umask值与通常的权限值相反。
- 0:未删除任何权限。
- 1: 权限中未设置执行位。
- 2: 权限中未设置写入位。
- 4: 权限中未设置读取位。
umask值002修改了目录的默认权限777和文件的默认权限666,以产生测试目录和文件的最终权限775和664。
stat umask-article.txt | grep "Access: ("
stat howtogeek | grep "Access: ("
这将从目录和文件的其他类别中删除写入权限。
如果root用户创建了一个目录,则会应用其umask值022。将删除其他类别和组类别的写入权限。
sudo mkdir root-dir
stat howtogeek | grep "Access: ("
我们可以看到,777的默认权限已减少到755。
相关:如何使用Lynis审核Linux系统的安全性
更改默认umask值
登录shell和非登录shell有不同的umask值。登录shell是允许您通过SSH本地或远程登录的shell。非登录shell是在您已经登录时终端窗口中的shell。
如果更改登录shell umask,请务必小心。不要增加权限并降低安全性。如果有什么区别的话,你应该倾向于减少它们,并使它们更具限制性。
在Ubuntu和Manjaro上,可以在以下文件中找到umask设置:
- 登录Shell umask:对于登录Shell,默认umask值为:/etc/profile
- 非登录外壳:对于非登录外壳,默认umask值为:/etc/bash.bashrc
在Fedora上,可以在以下文件中找到umask设置:
- 登录Shell umask:对于登录Shell,默认umask值为:/etc/profile
- 非登录外壳:对于非登录外壳,默认umask值为:/etc/bashrc
如果你没有迫切需要改变这些,最好不要去管它们。
首选方法是为需要不同于默认值的任何单个用户帐户设置新的umask值。新的umask设置可以放在用户主目录中的“.bashrc”文件中。
gedit .bashrc
在文件顶部附近添加umask设置。
保存文件并关闭编辑器。打开一个新的终端窗口,并使用umask命令检查umask值。
umask
新值处于活动状态。
相关:如何从Windows、macOS或Linux连接到SSH服务器
umask的短期变化
如果短期需要不同的umask值,可以使用umask命令为当前会话更改该值。也许您要创建一个目录树和一些文件,并希望提高它们的安全性。
您可以将umask值设置为077,然后检查新值是否处于活动状态。
umask 077
umask
将组和其他类别中的掩码值设置为7意味着将从这些类别中删除所有权限。只有您(和root用户)才能进入新目录并读取和编辑您的文件。
mkdir secure-dir
ls -ld secure-dir
唯一的权限是目录所有者的。
mkdir secure-file.txt
ls -ld secure-file.txt
该文件是安全的,不会受到任何其他用户的窥探。关闭终端窗口将放弃临时umask设置。
使用umask的其他方式
Linux允许一些进程继承系统umask值,或者给它们自己的umask设置。例如,useradd使用umask设置创建新用户的主目录。
umask值也可以应用于文件系统。
less /etc/fstab
在这台计算机上,“/boot/efi”文件系统应用了一个077的umask设置。
使用ls查看文件系统挂载点,我们可以验证umask值是否删除了除所有者root之外的所有人的所有权限。
ls /boot/efi -ld
umask和权限相互需要
默认权限在通过umask值转换后应用于目录或文件。很少需要为用户永久更改umask值,但在创建敏感目录或文档集合时,临时设置umask的值以提供更严格的权限集是一种快速简便的方法,可以增强其安全性。
相关:如何使用UFW防火墙保护Linux服务器