Linux权限基础知识以及如何在VPS上使用Umask
介绍
Linux 权限允许文件或目录所有者根据访问者与每个文件的关系来限制访问。 这允许控制方案为不同的人提供不同级别的访问。
umask 命令用于确定分配给每个用户创建的文件的默认权限。 根据系统和用户的需要,可以对其进行修改,为文件共享场景提供严格的安全限制或放宽权限。
本指南将解释 Linux 权限的基础知识,并将演示正确配置 umask 的用处。 它还将简要介绍作为关联权限工具的 chmod 命令。
目录
权限类别
Linux 权限对于新用户来说似乎晦涩难懂且难以理解。 但是,一旦您熟悉了权限的表示方式,就可以轻松地读取和更改文件或目录的权限。
所有者权限
理解权限所必需的第一个概念是 Linux 从根本上说是一个多用户操作系统。
每个文件仅由一个用户拥有。 即使您是唯一使用您的 VPS 的人,仍然会创建许多不同的“用户”来运行特定程序。 您可以通过键入以下内容查看系统上的不同用户:
cat /etc/passwd
root:x:0:0:root:/root:/bin/bash daemon:x:1:1:daemon:/usr/sbin:/bin/sh bin:x:2:2:bin:/bin:/bin/sh sys:x:3:3:sys:/dev:/bin/sh sync:x:4:65534:sync:/bin:/bin/sync games:x:5:60:games:/usr/games:/bin/sh man:x:6:12:man:/var/cache/man:/bin/sh lp:x:7:7:lp:/var/spool/lpd:/bin/sh mail:x:8:8:mail:/var/mail:/bin/sh news:x:9:9:news:/var/spool/news:/bin/sh uucp:x:10:10:uucp:/var/spool/uucp:/bin/sh . . .
/etc/passwd 文件包含在您的操作系统上创建的每个用户的一行。 每行的第一个字段是唯一用户的名称。 如您所见,其中许多用户都与服务和应用程序相关联。
将服务配置为作为不同的用户操作允许我们通过利用用户权限分配来控制服务的访问。 许多程序被配置为创建用户名并使用该用户执行所有操作。
组权限
我们可以分配权限的第二类是文件的“组所有者”。
与所有者类别一样,一个文件只能由一个组拥有。 每个用户可以是多个组的成员,每个组可以包含多个用户。
要查看您的用户当前所属的组,请键入:
groups
这将向您显示您的用户当前所属的所有组。 默认情况下,您可能只是一个或两个组的成员,其中一个可能与您的用户名相同。
要显示系统上当前可用的所有组,请键入:
cat /etc/group
root:x:0: daemon:x:1: bin:x:2: sys:x:3: adm:x:4: tty:x:5: disk:x:6: lp:x:7: . . .
每行的第一个字段是组的名称。
Linux 允许您根据文件的组所有者分配权限。 这允许您为一组人提供自定义权限,因为只有一个用户可以拥有一个文件。
其他权限
您可以为其分配权限的最后一个类别是“其他”类别。 在此上下文中,其他定义为不是文件所有者且不是拥有该文件的组的成员的任何用户。
此类别允许您设置适用于其他两个控制组之外的任何人的基本权限级别。
权限类型
可以为每个权限类别(所有者、组所有者和其他)分配允许或限制他们读取、写入或执行文件的能力的权限。
对于常规文件,需要读取权限才能读取文件的内容,需要写入权限才能修改文件,并且需要执行权限才能将文件作为脚本或应用程序运行。
对于目录,需要读取权限才能 ls(列出)目录的内容,需要写入权限才能修改目录的内容,执行权限允许用户 cd (更改目录)进入目录。
Linux 使用两种不同的符号表示法来表示这些类型的权限:字母和八进制。
字母符号
字母符号很容易理解,并且被一些常见的程序用来表示权限。
每个权限由一个字母表示:
- r = 读取权限
- w = 写权限
- x = 执行权限
请务必记住,始终按此顺序指定字母权限。 如果授予了某种特权,则由相应的字母表示。 如果访问受到限制,则用破折号 (-) 表示。
首先授予文件所有者的权限,然后是组所有者,最后是其他用户。 这给了我们三组三个值。
ls 命令在使用其长格式选项调用时使用字母表示法:
cd /etc ls -l
drwxr-xr-x 3 root root 4096 Apr 26 2012 acpi -rw-r--r-- 1 root root 2981 Apr 26 2012 adduser.conf drwxr-xr-x 2 root root 4096 Jul 5 20:53 alternatives -rw-r--r-- 1 root root 395 Jun 20 2010 anacrontab drwxr-xr-x 3 root root 4096 Apr 26 2012 apm drwxr-xr-x 3 root root 4096 Apr 26 2012 apparmor drwxr-xr-x 5 root root 4096 Jul 5 20:52 apparmor.d drwxr-xr-x 6 root root 4096 Apr 26 2012 apt …
此命令输出中的第一个字段表示文件的权限。
十个字符代表此数据。 第一个字符实际上不是权限值,而是表示文件类型(- 表示常规文件,d 表示目录等)。
接下来的九个字符代表我们上面讨论的权限。 代表所有者、组所有者和其他权限的三个组,每个组的值表示读取、写入和执行权限。
在上面的示例中,“acpi”目录的所有者具有读取、写入和执行权限。 组所有者和其他用户具有读取和执行权限。
“anacrontab”文件允许文件所有者读取和修改,但组成员和其他用户只有读取权限。
八进制表示法
表示权限的更简洁但不太直观的方式是使用八进制表示法。
使用此方法,每个权限类别(所有者、组所有者和其他)由 0 到 7 之间的数字表示。
我们通过为每种类型的权限分配一个数值来得出适当的数字:
- 4 = 读取权限
- 2 = 写权限
- 1 = 执行权限
我们将与我们希望为每个类别授予的权限类型相关联的数字相加。 对于每个类别,这将是一个介于 0 和 7 之间的数字(0 表示无权限,7 表示完全读取、写入和执行权限)。
例如,如果文件所有者具有读取和写入权限,这将在文件所有者列中表示为 6。 如果组所有者只需要读取权限,则可以使用 4 来表示他们的权限。
与字母表示法类似,八进制表示法可以包括指定文件类型的可选前导字符。 接下来分别是所有者权限、组所有者权限和其他权限。
chmod 命令是受益于使用八进制表示法的基本程序。
使用 Chmod 命令
更改文件 ' 权限的最流行方法是使用带有 chmod 命令的八进制表示法。 我们将通过在我们的主目录中创建一个空文件来练习:
cd touch testfile
首先,让我们查看创建时授予此文件的权限:
ls -l testfile
-rw-rw-r-- 1 demouser demouser 0 Jul 10 17:23 testfile
如果我们解释权限,我们可以看到文件所有者和文件组所有者都具有读写权限,而其他用户具有读取能力。
如果我们将其转换为八进制表示法,则所有者和组所有者的权限值为 6(4 表示读取,2 表示写入),而其他类别的权限值为 4(表示读取)。 完整权限将由三元组 664 表示。
我们将假设这个文件包含一个我们想要作为所有者执行的 bash 脚本。 我们不希望任何其他人(包括组所有者)修改该文件,并且我们不希望任何不在该组中的人能够读取该文件。
我们可以像这样按字母顺序表示我们想要的权限设置:-rwxr-----。 我们将其转换为八进制表示法并使用 chmod 更改权限:
chmod 740 testfile ls -l testfile
-rwxr----- 1 demouser demouser 0 Jul 10 17:23 testfile
如您所见,权限已正确分配。
如果我们想改回权限,我们可以很容易地通过给 chmod 提供以下命令来做到这一点:
chmod 664 testfile ls -l testfile
-rw-rw-r-- 1 demouser demouser 0 Jul 10 17:23 testfile
使用 Umask 设置默认权限
umask 命令根据为文件和目录定义的“基本”权限集定义新创建文件的默认权限。
文件的基本权限集为 666,或所有用户的完全读写权限。 默认情况下不分配执行权限,因为大多数文件都不会被执行(分配可执行权限也会带来一些安全问题)。
目录的基本权限集为 777,即所有用户的读取、写入和执行权限。
Umask 通过对上面显示的基本权限应用减法“掩码”来操作。 我们将使用一个示例来演示它是如何工作的。
如果我们希望所有者和所有者组的成员能够写入新创建的目录,但不能写入其他用户,我们希望将权限分配给 775。
我们需要三个数字来表示基本权限和所需权限之间的差异。 这个数字是 002。
777 - 775 ------ 002
这个结果数字是我们想要应用的 umask 值。 巧合的是,这是许多系统的默认 umask 值,正如我们之前使用 touch 命令创建文件时看到的那样。 让我们再试一次:
touch test2 ls -l test2
-rw-rw-r-- 1 demouser demouser 0 Jul 10 18:30 test2
我们可以使用 umask 命令定义不同的 umask。
如果我们想更安全地保护我们的系统,我们可以说默认情况下,我们希望不是文件所有者的用户根本没有权限。 这可以通过 077 umask 来完成:
umask 077 touch restricted ls -l restricted
-rw------- 1 demouser demouser 0 Jul 10 18:33 restricted
如果我们有一个创建共享内容的进程,我们可能希望为其创建的每个文件和目录授予完全权限:
umask 000 touch openfile ls -l openfile
-rw-rw-rw- 1 demouser demouser 0 Jul 10 18:36 openfile
默认情况下,您分配给 umask 的设置仅适用于当前 shell 会话。 当您下次登录时,任何新文件和目录都将使用您的发行版选择的原始设置。
如果您想让您的 umask 设置在会话中保持不变,您可以在 .bashrc 文件中定义 umask 设置:
cd nano .bashrc
搜索以查看是否已经设置了 umask 值。 如果有,请修改现有值。 否则,在文件底部添加一行,包含您所需的 umask 设置:
umask 022
在这里,我们选择授予所有者完全权限,并取消组所有者和其他类别的写入权限。 根据您的喜好调整此设置,以便在您下次登录时使用您的偏好。
一个谨慎的词
更改权限时要记住的重要一点是文件系统的某些区域和某些进程需要特定权限才能正确运行。 权限不足可能会导致错误和无法运行的应用程序。
另一方面, 也 允许的设置可能存在安全风险。
出于这些原因,建议您不要在自己的主目录之外调整权限,除非您知道由于设置不正确而可能产生的影响。
另一个需要遵守的好规则,尤其是在手动配置软件时,是始终尽可能分配最严格的权限策略,而不会影响功能。
这意味着如果只有一个用户(例如服务)需要访问一组文件,那么就没有必要允许世界其他地方对内容具有写入甚至读取权限。 在密码以纯文本形式存储的情况下尤其如此。
您可以通过正确利用组所有者权限并将必要的用户添加到适当的组来更充分地微调权限。 如果需要访问文件的所有用户都是组所有者的成员,则可以锁定其他权限类别以提高安全性。