[Linux]Permissions
Permissions
1 文件权限
如先前所学,文件有不同的权限或文件模式
1 |
|
文件权限分为四个部分。第一部分是文件类型,由权限字符串的第一个字符表示。在本例中,由于查看的是目录,因此文件类型显示为d
。最常见的是用-
表示普通文件。
接下来的三个部分是实际权限,每组权限由3个比特位组成,分别代表用户权限、组权限和其他用户权限。为了便于区分,我们在各组之间加上竖线。
1 |
|
每个字符代表不同的权限:
r
: 可读w
: 可写x
: 可执行(基本上是指可执行程序)-
: 无此权限
根据上述示例,我们可以看出用户pete
对目录具有读取、写入和执行权限。组penguins
拥有读取和执行权限。最后,其他用户(即其余所有人)也具有读取和执行权限。
2 修改权限
使用chmod
命令可以更改权限。
首先,选择要更改的权限集:用户(user)、组(group)或其他(other)。你可以通过+
或-
来添加或移除权限。以下是一些示例:
为文件添加权限位
1 |
|
上述命令意为:对myfile
修改权限,在用户权限集中添加执行权限。这意味着用户现在对此文件具有执行权限
移除文件的权限位
1 |
|
为文件添加多个权限位
1 |
|
另一种更改权限的方法是使用数字格式。这种方法允许一次性更改权限,而不必用r
、w
或x
表示权限,而是采用数字表示单个权限集,因此无需指定用户(u
)或组(g
)。
以下是数字表示法:
4
:读取权限2
:写入权限1
:执行权限
来看一个例子:
1 |
|
755覆盖所有权限集的权限。第一个数字(7)代表用户的权限,第二个数字(5)代表组的权限,最后的5代表其他用户的权限。
3 所有权
除了修改文件的权限外,还可以修改文件的用户和组所有权。
修改用户所有权
1 |
|
此命令将myfile
的所有者设置为patty
。
修改组所有权
1 |
|
此命令将myfile
的组所有权设置为whales
。
同时修改用户和组所有权
若要在同一时间设置用户和组所有权,只需在用户名后加上冒号和组名即可。
1 |
|
这样,就能一次性设置myfile
的用户所有者为patty
,组所有者为whales
。
4 Umask
每个创建的文件都带有一套默认权限。如果需要更改这套默认权限,可以使用umask
命令来实现。该命令基于常见的数字权限表示法中的3位权限集合进行操作。
值得注意的是,umask
并非增加权限,而是通过减去某些权限来设定文件的默认权限。
1 |
|
在上述示例中,设置意味着希望新文件的默认权限为:允许用户拥有全部访问权限,但对组取消写权限,以及其他用户取消执行权限。多数发行版的默认umask
值是022,这表示所有者拥有完全访问权限,但是组和其他用户不具有写权限。
执行umask
命令后,它将应用于您创建的新文件的默认权限集。然而,若要使这种设置持久化,则需要修改启动文件(例如.profile
)。
5 Setuid
在很多情况下,普通用户需要更高的权限来执行某些操作。系统管理员不可能总是在场输入root密码以供用户访问受保护的文件,因此有特殊的文件权限位允许这种行为。设置用户ID(Set User ID, SUID)允许用户以程序文件的所有者身份,而非自身用户身份运行程序。
举个例子:
假设想要修改自己的密码,这很简单,只需使用passwd
命令即可:
1 |
|
passwd
命令实际会修改一些文件,最重要的是修改了/etc/shadow
文件。让我们看一下这个文件:
1 |
|
输出可能如下所示:
1 |
|
注意到该文件是由root用户拥有的。那么,普通用户如何能够修改由root拥有的文件呢?
现在查看一下我们所运行命令的权限设置:
1 |
|
输出显示为:
1 |
|
注意这里的特殊权限位s
。这就是SUID,当一个文件设置了此权限时,它允许启动程序的用户获得文件所有者的权限以及执行权限,在本例中即为root用户的权限。因此,当用户运行passwd
命令时,实际上是以root身份运行。
这就是为什么我们可以访问像/etc/shadow
这样的受保护文件的原因。如果取消了这一权限位,则无法修改/etc/shadow
文件,从而不能更改密码。
修改SUID
与常规权限一样,有两种方式可以修改SUID权限。
符号方式:
1 |
|
数值方式:
1 |
|
如上所示,SUID用数字4表示,并且前置到权限设置中。有时您可能会看到大写的S,这意味着尽管具有相同的SUID功能,但该文件没有执行权限。
6 setgid
类似于设置用户ID权限位,还存在一个设置组ID(SGID)权限位。当此位被设置时,允许一个程序以其所属的组身份运行。
例如:
1 |
|
从上述输出可以看到,权限位位于组权限集合中。
修改SGID的方法如下:
1 |
|
在数值表示法中,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 |
|
注意到权限字符串末尾的t
标志,这意味着所有用户都可以在/tmp
目录下添加、写入或修改文件,但只有文件的所有者或root用户才能删除这些文件。
设置粘滞位
可以通过以下两种方式为一个目录设置粘滞位:
使用符号表示法:
1
$ sudo chmod +t mydir
或者使用数字表示法(其中粘滞位由千位的
1
表示):1
$ sudo chmod 1755 mydir
这里,数字权限1755
中的1
即代表设置了粘滞位。