跳转至

Suid&Sgid

SUID/SGID

到现在可知,当使用chmod 777时,是用三组权限。其实,在前面还有一个额外的字节,默认为0。也就是说,777**其实是**0777。

下面是strace chmod 777的日志片段

Bash
fchmodat(AT_FDCWD, "domains.json", 0777) = 0

即使使用了 777,chmod仍将其转换为 0777。

第一个权限集称为特殊权限。和 RWX 一样,还有其他三个位

  • SUID:设置用户 ID
  • SGID:设置组ID
  • 粘滞位

由于这 3 位的权限集中在符号表示中没有其他可用空间,因此它取代了所有三组中的 x权限。

表示如下

  • rwsrw-r-x:SUID 位设置且二进制文件可执行
  • rwSrw-r-x: 设置了 SUID 位并且二进制文件不可执行
  • rwxrwsr-x: SGID 位设置且二进制文件可执行
  • rwxrwSr-x: SGID 位设置且二进制文件不可执行

Important

运行一个启用了 SUID 位的文件时,它是当前用户ID运行,但有效ID却是文件属主的用户ID

什么是 SUID?

简单来说,SUID**是一种特殊权限,只有在您拥有**文件**时才允许您**执行这些文件。 否则,您无法执行它。

当您只想**限制**对自己的**权限时,这可能会很方便。**最典型的例子是**passwd**命令,它具有 SUID 权限,因此,如何识别它的问题就出现了。

如果您想详细检查权限统计信息,请运行**stat** 命令**或者您可以使用**ls 命令。

Bash
linuxmi@linuxmi:~/www.linuxmi.com$ stat /usr/bin/passwd 
linuxmi@linuxmi:~/www.linuxmi.com$ ls -l /usr/bin/passwd

输出如下:
 文件:/usr/bin/passwd
大小:68208 块:136 IO 块:4096 普通文件
设备:805h/2053d Inode:28843676 硬链接:1
权限:(4755/-rwsr-xr-x) Uid:( 0/ root) Gid:( 0/ root)
最近访问:2021-12-07 18:51:04.827435882 +0800
最近更改:2021-07-15 06:08:18.000000000 +0800
最近改动:2021-07-24 20:19:58.576147880 +0800
创建时间:-创建时间:- Uid: (    0/    root)   Gid: (    0/    root)
Access: 2022-03-01 14:07:48.377112656 +0530
Modify: 2020-02-07 20:24:14.000000000 +0530
Change: 2021-10-30 19:29:05.076144777 +0530
 Birth: 2021-07-28 00:59:20.060264859 +0530

img

SUID**可以由数字**4**或“s”来标识,如果是可执行权限,则用“s”来标识,如果是非可执行权限,则用“S”**来标识。

因为该**passwd命令只能由**当前登录的**用户执行,并限制您更改任何其他用户的密码,除非您是**root用户。那么如何在系统上实现它呢?

Bash
linuxmi@linuxmi:~/www.linuxmi.com$ passwd mysql
输出如下
passwd:您不能查看或更改 mysql 的密码信息。

img

如何在文件上实现 SUID

要在文件上实现**SUID**非常简单,您只需使用代表**SUID的**第 4 位**,或使用符号模式**“s”。

Bash
$ chmod 4XXX [FILE-NAME]
$ chmod u+s [FILE-NAME]

例如,我创建了一个应该**由我**执行的 bash 脚本,并且没有其他用户可以执行,然后传递以下命令:

Bash
linuxmi@linuxmi:~/www.linuxmi.com$ chmod 4744 linuxmi.sh
linuxmi@linuxmi:~/www.linuxmi.com$ ls -l linuxmi.sh
输出如下:
-rwsr--r-- 1 linuxmi linuxmi 243 3月  11 21:15 linuxmi.sh

img

如何从文件中撤销 SUID

您只需传递以下命令即可简单地**撤销**SUID**权限,该命令将不触及权限值的其余部分并从文件**中清除SUID**权限**:

命令语法:

Bash
$ chmod u-s [FILE-NAME]
linuxmi@linuxmi:~/www.linuxmi.com$ chmod u-s linuxmi.sh
linuxmi@linuxmi:~/www.linuxmi.com$ ls -l linuxmi.sh
输出如下:
-rwxr--r-- 1 linuxmi linuxmi 243 3月  11 21:15 linuxmi.sh

img

什么是SGID?

SUID**适用于单个用户,如果您希望多个或多组用户可以执行文件,则使用类似于SUID 的**SGID权限。

当组权限用**“s”而不是“ x ”或“S”括起来时,您可以识别**SGID 权限,如果它是不可执行的文件或**位权限**中的第二个。

为了检查,我们将在wall上**运行以下命令,该命令用于向所有用户**广播消息。

Bash
linuxmi@linuxmi:~/www.linuxmi.com$ stat /usr/bin/wall
  文件:/usr/bin/wall
  大小:35048      块:72         IO 块:4096   普通文件
设备:805h/2053d   Inode:28845220    硬链接:1
权限:(2755/-rwxr-sr-x)  Uid:(    0/    root)   Gid:(    5/     tty)
最近访问:2022-02-12 12:11:30.000000000 +0800
最近更改:2022-02-07 21:33:35.000000000 +0800
最近改动:2022-02-12 12:11:32.378374082 +0800
创建时间:-
linuxmi@linuxmi:~/www.linuxmi.com$ ls -l /usr/bin/wall
-rwxr-sr-x 1 root tty 35048 2月   7 21:33 /usr/bin/wall

img

如何在文件上实现 SGUID

要在文件上实现**GUID**非常简单,您只需使用代表**SUID的**第 2 位**,或使用符号模式**“s”。

Bash
$ chmod 2XXX [FILE-NAME]
$ chmod g+s [FILE-NAME]

我将使用以下命令将**“linuxmi.sh”的权限修改为**SGID :

Bash
linuxmi@linuxmi:~/www.linuxmi.com$ chmod 2755 linuxmi.sh
linuxmi@linuxmi:~/www.linuxmi.com$ ls -l linuxmi.sh
输出如下:
-rwxr-sr-x 1 linuxmi linuxmi 243 3月  11 21:15 linuxmi.sh

img

如何从文件中撤销 SGID

您可以参考以下命令语法从相应文件中删除 SGID,并运行**ls``-l**以验证权限统计信息。

Bash
$ chmod g-s [FILE-NAME]
$ ls -l [FILE-NAME]

我将通过输入以下命令恢复为常规权限:

Bash
linuxmi@linuxmi:~/www.linuxmi.com$ chmod g-s linuxmi.sh
linuxmi@linuxmi:~/www.linuxmi.com$ ls -l linuxmi.sh
-rwxr-xr-x 1 linuxmi linuxmi 243 3月  11 21:15 linuxmi.sh

img

Linux提权系列:揭秘 SUID 和 SGID 位