介绍
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 = read permissions
- w = write permissions
- x = execute permissions
重要的是要记住,字母权限总是以这个顺序指定的。如果某个特定权限被授予,则用相应的字母表示。如果访问受到限制,则用短横线(-)表示。
权限首先授予文件所有者,然后是组所有者,最后是其他用户。这给我们三组三个值。
使用长格式选项调用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
在这里,我们选择给予所有者完全权限,并取消组所有者和其他类别的写入权限。根据您的喜好调整此设置,以便下次登录时可以使用您的首选项。
A Word of Caution
更改权限时需要记住的一个重要点是,文件系统的某些区域和某些进程需要特定的权限才能正确运行。权限不足可能导致错误和应用程序无法正常运行。
另一方面,权限设置过于宽松可能会带来安全风险。基于这些原因,建议您不要在自己的主目录之外调整权限,除非您清楚了解由于配置不当的设置可能导致的后果。
另一个良好的原则是,特别是在手动配置软件时,始终分配最严格的权限策略,而不影响功能。
这意味着如果只有一个用户(例如服务)需要访问一组文件,则无需允许其他所有人对内容进行写入甚至读取访问权限。这在密码以明文存储的情况下尤为重要。
您可以通过正确使用组所有者权限并将必要的用户添加到适当的组中,更充分地微调权限。如果所有需要访问文件的用户都是组所有者的成员,则可以锁定其他权限类别以提高安全性。