Linux SetUID权限(SUID)

Linux SetUID权限(SUID)教程

Linux 中的文件和目录的权限除了 rwx 权限,其实还有 s 权限,此种权限通常称为 SetUID,简称 SUID 特殊权限。

SUID 特殊权限仅适用于可执行文件,所具有的功能是,只要用户对设有 SUID 的文件有执行权限,那么当用户执行此文件时,会以文件所有者的身份去执行此文件,一旦文件执行结束,身份的切换也随之消失。

Linux SetUID权限(SUID)详解

我们使用 ls 命令,查看 passwd 二进制文件的权限,具体命令如下:

ls -l /usr/bin/passwd

运行后,终端输出如下:

68_Linux SetUID特殊权限.png

可以看到,原本表示文件所有者权限中的 x 权限位,却出现了 s 权限,此种权限通常称为 SetUID,简称 SUID 特殊权限。

Linux 系统中所有用户的密码数据都记录在 /etc/shadow 这个文件中,通过 ls 命令,查看其权限,具体命令如下:

ls -l /etc/shadow

运行后,终端输出如下:

69_Linux SetUID特殊权限.png

我们看到,此文件的权限是 0(---------),也就是说,普通用户对此文件没有任何操作权限。这就会产生一个问题,为什么普通用户可以使用 passwd 命令修改自己的密码呢?

上面我们已经看到 passwd 命令的权限配置,此命令拥有 SUID 特殊权限,而且其他人对此文件也有执行权限,这就意味着,任何一个用户都可以用文件所有者,也就是 root 的身份去执行 passwd 命令。

换句话说,当普通用户使用 passwd 命令尝试更改自己的密码时,实际上是在以 root 的身份执行 passwd 命令,正因为 root 可以将密码写入 /etc/shadow 文件,所以普通用户也能做到。只不过,一旦命令执行完成,普通用户所具有的 root 身份也随之消失。

那么,普通用户可以使用 cat 命令查看 /etc/shadow 文件吗?答案的否定的,因为 cat 不具有 SUID 权限,因此普通用户在执行 cat /etc/shadow 命令时,无法以 root 的身份,只能以普通用户的身份,因此无法成功读取。

具体图解如下:

70_Linux SetUID特殊权限.png

Linux SetUID权限特点

  • 只有可执行文件才能设定 SetUID 权限,对目录设定 SUID,是无效的。
  • 用户要对该文件拥有 x(执行)权限。
  • 用户在执行该文件时,会以文件所有者的身份执行。
  • SetUID 权限只在文件执行过程中有效,一旦执行完毕,身份的切换也随之消失。

Linux SetUID权限(SUID)总结

Linux 中的文件和目录的权限除了 rwx 权限,其实还有 s 权限,此种权限通常称为 SetUID,简称 SUID 特殊权限。

SUID 特殊权限仅适用于可执行文件,所具有的功能是,只要用户对设有 SUID 的文件有执行权限,那么当用户执行此文件时,会以文件所有者的身份去执行此文件,一旦文件执行结束,身份的切换也随之消失。