文章目录
- 一、文件权限位
- 二、SUID简介
一、文件权限位
(1)
$ ls -l text.txt
-rw-rw-r-- 1 yl yl 0 Sep 28 16:25 text.txt
其中第一个字段-rw-rw-r–,我们可以把它分为四部分看:
-rw-rw-r--
(1)- :第一个字符表示文件的类型
(2)rw- :第 2-4 个字符表示文件所有者权限位
(3)rw- : 第 5-7 个字符表示所属组权限位
(4)r-- : 第 8 -10 个字符表示其他用户权限位
每个文件和目录都有一组权限位,用于控制对其的访问和操作权限。文件权限由九个位组成,分为三组,每组三个位,分别代表文件所有者、所属组和其他用户的权限。
这三组权限位分别是:
(1)文件所有者权限位:这组权限位控制文件所有者对文件的权限。它们的顺序是读取(r,位值为4)、写入(w,位值为2)和执行(x,位值为1)。文件所有者权限位的符号表示为:例如,rw-表示文件所有者具有读取和写入权限,但没有执行权限。
(2)所属组权限位:这组权限位控制与文件属于相同组的其他用户对文件的权限。它们的顺序和符号表示与文件所有者权限位相同。
(3)其他用户权限位:这组权限位控制所有其他用户对文件的权限,即除了文件所有者和所属组之外的用户。同样,它们的顺序和符号表示与文件所有者权限位相同。
在文件权限中,每个用户类型可以具有读取、写入和执行的权限组合。对于目录而言,读取权限允许查看目录内容,写入权限允许创建、删除和重命名目录中的文件,执行权限允许进入目录并访问其内容。
(2)
特殊权限:权限格式中可以存在三个特殊权限字符:
“s”(setuid、setgid):当出现在所有者或所属组的执行权限中时,表示设置了 setuid 或 setgid 权限。如果相应的读取或写入权限未设置,则用 “S” 表示。
“t”(粘着位):当出现在目录的其他用户执行权限中时,表示粘着位。通常用于限制只有文件所有者能删除目录中的文件。
当文件设置了SUID权限时,文件的权限位会显示为包含"S"的特殊形式。具体来说,文件所有者权限位中的执行权限位 “x” 将被替换为 “s”。这表示当执行该文件时,它将以文件所有者的权限运行。
以下是SUID权限位的不同组合及其含义:
-rwS------:文件所有者具有读写权限,并且设置了SUID权限。其他用户没有任何权限。
-rwSr-xr-x:文件所有者具有读写权限,并且设置了SUID权限。所属组和其他用户具有读取和执行权限。
-rwsr-xr-x:文件所有者具有读写执行权限,并且设置了SUID权限。所属组和其他用户具有读取和执行权限。
要设置SUID权限,可以使用chmod命令与数字或符号表示法。例如,chmod 4755 file将文件的权限设置为-rwsr-xr-x,其中SUID权限被设置为文件所有者的执行权限。
二、SUID简介
在Linux中,SUID(Set User ID)是一种权限机制,用于赋予程序在执行时临时获取文件所有者的权限。当一个可执行文件具有SUID权限时,无论是哪个用户执行该文件,该程序都会以文件所有者的权限运行,而不是执行者自身的权限。
SUID机制允许普通用户执行特定的程序或命令,以便执行特权操作,例如修改系统配置或访问受限资源。一个典型的例子是/usr/bin/passwd命令,它具有SUID权限,因此普通用户可以在不具备修改密码文件权限的情况下,通过执行该命令来更改自己的密码。
类似的还有 sudo、su命令等,比如在普通用户下执行sudo就可以执行root权限可以执行的操作。
SUID权限位:SUID由文件权限位中用户部分的"s"表示。如果一个文件被设置了SUID位,会表现在所有者(文件的属主)的权限的可执行位上(x)。
所有者的权限的可执行位(x)上定义了一个补充的s位,如果文件设置了SUID,那么它在执行的时候,会把进程的权限(euid)设置成文件属主的uid。
当设置了SUID时,还需要所有者的执行权限。当s这个标志出现在文件所有者的x权限上时,则就被称为Set UID。
可以使用chmod命令的数字符号(“4”)或符号符号(“u+s”)来设置SUID位。
执行上下文:当用户执行一个启用了SUID的程序时,该程序以文件所有者的有效用户ID(EUID)运行。这暂时提升了运行程序的用户的权限级别到文件所有者的级别。
SUID权限仅对二进制程序(binary program)有效,不能用在脚本上(script)。
这个SUID机制就是专门为提升/切换用户权限而设计的,切换用户也必须先提升到root用户才能切换到其他用户。在这类文件被执行后,不需要验证密码,进程的euid被设置成文件属主的uid,如果文件属主是root用户当前进程就有了root权限,同时这时进程的uid和euid也不相等了。
因此当我们以普通用户在终端上执行 passwd,sudo 等命令时,比如普通用户的uid是1000,那么终端上的bash进程是普通用户的uid1000,当执行 passwd,sudo 等命令时, passwd,sudo 等二进制文件设置了SUID位,这么bash进程的euid以文件所有者的有效用户ID(EUID)运行,而 passwd,sudo 等二进制文件是由root用户管理的,其文件属主的用户名是 root 用户,因此passwd,sudo 等二进制文件的 EUID 等于 root 用户的uid = 0,因此bash进程的euid以文件所有者的有效用户ID = 0运行,这暂时提升了bash程序的用户的权限级别到文件所有者的级别。这样就达到了提升用户权限的作用了。
除了以用户和用户组控制权限,还有以下凭证机制:
Capabilities
Secure management flags (securebits)
Keys and keyrings
LSM
AF_KEY
详细请参考:Linux 安全 - Credentials