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