特殊权限是什么
在Linux中,特殊权限是指针对文件或目录的特殊权限设置,包括SetUID
、SetGID
和Sticky Bit
。
特殊权限 | 说明 | |
---|---|---|
SetUID |
Set User ID | 当一个可执行文件被设置了SetUID权限后,当任何用户执行该文件时,文件的所有者权限会被赋予执行者,而不是执行者的权限。这使得用户可以以文件所有者的身份执行文件,通常用于需要特殊权限的程序。 |
SetGID |
Set Group ID | 当一个可执行文件被设置了SetGID权限后,当任何用户执行该文件时,文件的所属组权限会被赋予执行者,而不是执行者的权限。这使得用户可以以文件所属组的身份执行文件,通常用于需要特殊权限的程序。 |
Sticky Bit |
粘置位 | 当一个目录被设置了Sticky Bit权限后,只有目录的所有者、文件的所有者或者root用户才能删除该目录下的文件。这通常用于共享目录,防止其他用户删除不属于自己的文件。 |
一个典型的例子就是 passwd
命令,这个命令允许用户修改自己的密码。
ll /usr/bin/passwd
-rwsr-xr-x. 1 root root 32648 Aug 10 2021 /usr/bin/passwd
我们可以看到本来是rwx的权限表示形式变成了rws
查找特殊权限的文件或目录
#1.查找/usr/bin目录下拥有suid权限的文件
find /usr/bin -perm /u+s#2.查找/目录下拥有guid权限的目录
find / -type d -perm /g+s#3.查找/目录下拥有sticky权限的目录
find / -type d -perm /o+t
linux权限的示意图
Linux特殊权限的说明
SetUID权限
- 添加SetUID的权限,Owner原本有执行权限的,执行权限位会从
x
会变为s
。 - 添加SetUID的权限,Owner原本没有执行权限的,执行权限位会从
-
会变为S
。 - 数字模式:4744
例如,Linux系统 passwd
修改密码的命令需要通过修改 /etc/passwd
文件实现,但是这个文件是权限所属于 root
用户,普通用户需要临时提权调用这个 passwd
命令。
-
查看passwd命令,查看所有者的执行位权限为s
[root@localhost ~]# ls -l /usr/bin/passwd -rwsr-xr-x. 1 root root 33424 Feb 18 2022 /usr/bin/passwd
-
将passwd命令的setuid权限取消
[root@localhost ~]# chmod 755 /usr/bin/passwd
-
使用普通用户jungout修改密码,发现执行错误
[root@localhost ~]# su - jungout [jungout@localhost ~]$ passwd Changing password for user jungout. Current password: #输入旧密码 New password: #输入新密码 passwd: Authentication token manipulation error #认证令牌操作错误
-
切换回root用户添加setuid权限
[jungout@localhost ~]$ exit [root@localhost ~]# chmod u+s /usr/bin/passwd
-
再次使用jungout修改密码,执行成功
[root@localhost ~]# su - jungout [jungout@localhost ~]$ passwd Changing password for user jungout. Current password: #输入旧密码 New password: #输入新密码 Retype new password: #确认新密码 passwd: all authentication tokens updated successfully.
SetGID权限
SetGID权限,用户可以以文件所属组的身份执行文件,新创建的文件或目录会继承该目录的所属组,但是只有目录的所有者、文件的所有者或者root用户才能删除该目录下的文件。
- 添加SetGID的权限,Group原本有执行权限的,执行权限位会从
x
会变为s
。 - 添加SetGID的权限,Group原本没有执行权限的,执行权限位会从
-
会变为S
。 - 数字模式:2770
例如,Linux系统中一个项目的 共享目录 设置 SetGID
权限,共享目录的名称为:share ,这个目下执行的操作和文件都会继承该目录的所属组的权限。
- 在/home目录下创建share的目录
[root@localhost ~]# mkdir /home/share
- 要求/home/share的所属组是shareuser,组内成员可读可写。
[root@localhost ~]# groupadd shareuser [root@localhost ~]# chgrp shareuser /home/share [root@localhost ~]# chmod 770 /home/share
- 设置sgid权限位,所属组的执行位权限为s
[root@localhost ~]# chmod g+s /home/share [root@localhost ~]# ls -l /home | grep share drwxrws---. 2 root shareuser 6 Jan 5 04:55 share
- 将普通用户jungout添加到shareuser组
[root@localhost ~]# gpasswd -a jungout shareuser Adding user jungout to group shareuser
- 切换到jungout并在/home/share目录上创建file1文件(继承组权限,组内成员都可以访问)
[root@localhost ~]# su - jungout [jungout@localhost ~]$ touch /home/share/file1 [jungout@localhost ~]$ ls -l /home/share/ -rw-rw-r--. 1 jungout shareuser 0 Jan 5 05:27 file1
Sticky Bit权限
Sticky Bit 权限,只有目录的所有者、文件的所有者或者root用户才能删除该目录下的文件,这通常用于共享目录下的私人文件,防止其他用户删除不属于自己的文件。
- 添加 Sticky Bit 的权限,Others原本有执行权限的,执行权限位会从
x
会变为t
。 - 添加 Sticky Bit 的权限,Others原本没有执行权限的,执行权限位会从
-
会变为T
。 - 数字模式:1777
例如,Linux系统中临时目录 /tmp ,通常用于临时存放服务的进程PID,这要求意味着所有用户都有对该目录的写入权限,但只有文件的所有者才能删除自己创建的文件。
-
查看/tmp目录的ohter的执行权限位为:t
[root@localhost ~]# ls -l / | grep tmp drwxrwxrwt. 16 root root 4096 Jan 5 05:42 tmp
-
创建普通用户user1,并在/tmp目录下创建一个目录
[root@localhost ~]# useradd user1 [root@localhost ~]# su -user1 [user1@localhost ~]$ mkdir /tmp/user1-servr [user1@localhost ~]$ exit #返回root用户
-
使用普通用户jungout删除/tmp/user1-servr目,操作不允许。
[root@localhost ~]# su - jungout [jungout@localhost ~]$ rmdir /tmp/user1-services rmdir: failed to remove '/tmp/user1-services/': Operation not permitted