[Linux]Permissions

Permissions

1 文件权限

如先前所学,文件有不同的权限或文件模式

1
2
$ ls -l Desktop/
drwxr-xr-x 2 pete penguins 4096 Dec 1 11:45 .

文件权限分为四个部分。第一部分是文件类型,由权限字符串的第一个字符表示。在本例中,由于查看的是目录,因此文件类型显示为d。最常见的是用-表示普通文件。

接下来的三个部分是实际权限,每组权限由3个比特位组成,分别代表用户权限、组权限和其他用户权限。为了便于区分,我们在各组之间加上竖线。

1
d | rwx | r-x | r-x

每个字符代表不同的权限:

  • r: 可读
  • w: 可写
  • x: 可执行(基本上是指可执行程序)
  • -: 无此权限

根据上述示例,我们可以看出用户pete对目录具有读取、写入和执行权限。组penguins拥有读取和执行权限。最后,其他用户(即其余所有人)也具有读取和执行权限。

2 修改权限

使用chmod命令可以更改权限。

首先,选择要更改的权限集:用户(user)、组(group)或其他(other)。你可以通过+-来添加或移除权限。以下是一些示例:

为文件添加权限位

1
$ chmod u+x myfile

上述命令意为:对myfile修改权限,在用户权限集中添加执行权限。这意味着用户现在对此文件具有执行权限

移除文件的权限位

1
$ chmod u-x myfile

为文件添加多个权限位

1
$ chmod ug+w

另一种更改权限的方法是使用数字格式。这种方法允许一次性更改权限,而不必用rwx表示权限,而是采用数字表示单个权限集,因此无需指定用户(u)或组(g)。

以下是数字表示法:

  • 4:读取权限
  • 2:写入权限
  • 1:执行权限

来看一个例子:

1
$ chmod 755 myfile

755覆盖所有权限集的权限。第一个数字(7)代表用户的权限,第二个数字(5)代表组的权限,最后的5代表其他用户的权限。

3 所有权

除了修改文件的权限外,还可以修改文件的用户和组所有权。

修改用户所有权

1
$ sudo chown patty myfile

此命令将myfile的所有者设置为patty

修改组所有权

1
$ sudo chgrp whales myfile

此命令将myfile的组所有权设置为whales

同时修改用户和组所有权

若要在同一时间设置用户和组所有权,只需在用户名后加上冒号和组名即可。

1
$ sudo chown patty:whales myfile

这样,就能一次性设置myfile的用户所有者为patty,组所有者为whales

4 Umask

每个创建的文件都带有一套默认权限。如果需要更改这套默认权限,可以使用umask命令来实现。该命令基于常见的数字权限表示法中的3位权限集合进行操作。

值得注意的是,umask并非增加权限,而是通过减去某些权限来设定文件的默认权限。

1
$ umask 021

在上述示例中,设置意味着希望新文件的默认权限为:允许用户拥有全部访问权限,但对组取消写权限,以及其他用户取消执行权限。多数发行版的默认umask值是022,这表示所有者拥有完全访问权限,但是组和其他用户不具有写权限。

执行umask命令后,它将应用于您创建的新文件的默认权限集。然而,若要使这种设置持久化,则需要修改启动文件(例如.profile)。

5 Setuid

在很多情况下,普通用户需要更高的权限来执行某些操作。系统管理员不可能总是在场输入root密码以供用户访问受保护的文件,因此有特殊的文件权限位允许这种行为。设置用户ID(Set User ID, SUID)允许用户以程序文件的所有者身份,而非自身用户身份运行程序。

举个例子:

假设想要修改自己的密码,这很简单,只需使用passwd命令即可:

1
$ passwd

passwd 命令实际会修改一些文件,最重要的是修改了/etc/shadow文件。让我们看一下这个文件:

1
$ ls -l /etc/shadow

输出可能如下所示:

1
-rw-r----- 1 root shadow 1134 Dec 1 11:45 /etc/shadow

注意到该文件是由root用户拥有的。那么,普通用户如何能够修改由root拥有的文件呢?

现在查看一下我们所运行命令的权限设置:

1
$ ls -l /usr/bin/passwd

输出显示为:

1
-rwsr-xr-x 1 root root 47032 Dec 1 11:45 /usr/bin/passwd

注意这里的特殊权限位s。这就是SUID,当一个文件设置了此权限时,它允许启动程序的用户获得文件所有者的权限以及执行权限,在本例中即为root用户的权限。因此,当用户运行passwd命令时,实际上是以root身份运行。

这就是为什么我们可以访问像/etc/shadow这样的受保护文件的原因。如果取消了这一权限位,则无法修改/etc/shadow文件,从而不能更改密码。

修改SUID

与常规权限一样,有两种方式可以修改SUID权限。

符号方式:

1
$ sudo chmod u+s myfile

数值方式:

1
$ sudo chmod 4755 myfile

如上所示,SUID用数字4表示,并且前置到权限设置中。有时您可能会看到大写的S,这意味着尽管具有相同的SUID功能,但该文件没有执行权限。

6 setgid

类似于设置用户ID权限位,还存在一个设置组ID(SGID)权限位。当此位被设置时,允许一个程序以其所属的组身份运行。

例如:

1
2
$ ls -l /usr/bin/wall
-rwxr-sr-x 1 root tty 19024 Dec 14 11:45 /usr/bin/wall

从上述输出可以看到,权限位位于组权限集合中。

修改SGID的方法如下:

1
2
$ sudo chmod g+s myfile
$ sudo chmod 2555 myfile

在数值表示法中,SGID用数字2表示。

7 进程权限

对于进程权限,有一个关键点需要注意:当使用设置了SUID权限位的passwd命令时,程序将以root权限运行。但这并不意味着可以临时作为root用户修改其他用户的密码。这是因为Linux系统实施了多种用户标识(UID)。

每启动一个进程,就涉及到以下三种UID:

  • 有效用户ID(Effective UID):决定进程访问资源时所使用的权限。

  • 真实用户ID(Real UID):标识启动进程的用户身份,用于追踪发起该进程的实际用户是谁。

  • 保存用户ID(Saved UID):允许进程在有效UID和真实UID之间切换,这对于控制特权提升至关重要。仅在必要时才使用特殊权限是一种良好的实践。

passwd命令为例,当执行此命令时,默认情况下有效UID是自己的UID(假设为500)。然而,由于passwd命令设置了SUID权限位,所以运行时其有效UID变为0,即root用户的UID。这使得程序能够以root权限访问相关文件。

如果尝试修改其他用户的密码,比如Sally(UID为600),即使暂时拥有root权限,但由于进程同时持有真实UID(在此例中为500),因此无权修改其他用户的密码。

当运行passwd命令时,它会首先根据真实UID启动进程,并保存文件所有者的UID(即有效UID),以便于两者间进行必要的切换。这样就不需要对无需root访问权限的文件进行修改。

8 The Sticky Bit

粘滞位(Sticky Bit)是一种特殊权限位,它使得文件或目录仅允许其所有者或root用户进行删除或修改操作。这一机制在共享目录中尤为重要。

例如,查看以下/tmp目录的权限:

1
2
$ ls -ld /tmp
drwxrwxrwxt 6 root root 4096 Dec 15 11:45 /tmp

注意到权限字符串末尾的t标志,这意味着所有用户都可以在/tmp目录下添加、写入或修改文件,但只有文件的所有者或root用户才能删除这些文件。

设置粘滞位

可以通过以下两种方式为一个目录设置粘滞位:

  • 使用符号表示法:

    1
    $ sudo chmod +t mydir
  • 或者使用数字表示法(其中粘滞位由千位的1表示):

    1
    $ sudo chmod 1755 mydir

这里,数字权限1755中的1即代表设置了粘滞位。


[Linux]Permissions
https://erlsrnby04.github.io/2025/03/21/Linux-Permissions/
作者
ErlsrnBy04
发布于
2025年3月21日
许可协议