Suid&Sgid
SUID/SGID¶
到现在可知,当使用chmod 777时,是用三组权限。其实,在前面还有一个额外的字节,默认为0。也就是说,777**其实是**0777。
下面是strace chmod 777的日志片段
即使使用了 777,
chmod仍将其转换为 0777。
第一个权限集称为特殊权限。和 RWX 一样,还有其他三个位
SUID:设置用户 IDSGID:设置组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 命令。
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

SUID**可以由数字**4**或“s”来标识,如果是可执行权限,则用“s”来标识,如果是非可执行权限,则用“S”**来标识。
因为该**passwd命令只能由**当前登录的**用户执行,并限制您更改任何其他用户的密码,除非您是**root用户。那么如何在系统上实现它呢?

如何在文件上实现 SUID¶
要在文件上实现**SUID**非常简单,您只需使用代表**SUID的**第 4 位**,或使用符号模式**“s”。
例如,我创建了一个应该**由我**执行的 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

如何从文件中撤销 SUID¶
您只需传递以下命令即可简单地**撤销**SUID**权限,该命令将不触及权限值的其余部分并从文件**中清除SUID**权限**:
命令语法:
$ 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

什么是SGID?¶
SUID**适用于单个用户,如果您希望多个或多组用户可以执行文件,则使用类似于SUID 的**SGID权限。
当组权限用**“s”而不是“ x ”或“S”括起来时,您可以识别**SGID 权限,如果它是不可执行的文件或**位权限**中的第二个。
为了检查,我们将在wall上**运行以下命令,该命令用于向所有用户**广播消息。
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

如何在文件上实现 SGUID¶
要在文件上实现**GUID**非常简单,您只需使用代表**SUID的**第 2 位**,或使用符号模式**“s”。
我将使用以下命令将**“linuxmi.sh”的权限修改为**SGID :
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

如何从文件中撤销 SGID¶
您可以参考以下命令语法从相应文件中删除 SGID,并运行**ls``-l**以验证权限统计信息。
我将通过输入以下命令恢复为常规权限:
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
