Linux 特殊权限详解在 Linux 系统中,文件和目录的权限管理是非常重要的。除了基本的读(r)、写(w)和执行(x)权限外,还有一些特殊的权限位,这些特殊权限位可以提供更细粒度的访问控制和安全性。本文将详细介绍 Linux 中的三种特殊权限:Set-User-ID (SUID)、Set-Group-ID (SGID) 和 Sticky Bit (SBIT)。
一. Set-User-ID (SUID)
SUID是一种对二进制程序进行设置的特殊权限,能够让二进制程序的执行者临时拥有所有者的权限(仅对拥有执行权限的二进制程序有效)。这意味着,即使普通用户运行该文件,也能以文件所有者的权限执行。
1.1 使用场景
特权命令
例如,passwd 命令需要写入 /etc/shadow 文件,但普通用户没有写权限。通过设置 SUID 位,passwd 命令可以以 root 权限运行,从而修改密码文件。
1.2 设置 SUID
使用 chmod 命令
chmod u+s /bin/cmd
使用 数字模式:
chmod 4755 /bin/cmd
其中,4 表示 SUID 位,755 表示文件的其他权限。
1.3 检查 SUID
使用 ls -l 命令:
ls -l /bin/cmd
如果文件设置了 SUID 位,-rwxr-xr-x 会变成 -rwsr-xr-x,-rw-r-xr-x 会变成 -rwSr-xr-x,其中 S/s 表示 SUID 位。
1.4 示例
查看 passwd 命令的权限
[root@db1 scripts]# ls -l /bin/passwd
-rwsr-xr-x. 1 root root 34512 Aug 13 2018 /bin/passwd
二. Set-Group-ID (SGID)
SGID特殊权限有两种应用场景:当对二进制程序进行设置时,能够让执行者临时获取文件所属组的权限;当对目录进行设置时,则是让目录内新创建的文件自动继承该目录原有用户组的名称。
2.1 用途
特权命令
例如,chgrp 命令需要更改文件的组所有权,但普通用户没有权限。通过设置 SGID 位,chgrp 命令可以以文件所属组的权限运行。
目录继承
当在设置了 SGID 位的目录中创建新文件时,新文件的组所有权会继承目录的组所有权。
2.2 设置 SGID
使用 chmod 命令
chmod g+s /bin/cmd
使用 数字模式
chmod 2755 /bin/cmd
其中,2 表示 SGID 位,755 表示文件的其他权限。
2.3 检查 SGID
使用 ls -l 命令
ls -l /bin/cmd
如果文件设置了 SGID 位,-rwxr-xr-x 会变成 -rwxr-sr-x,-rwxr–r-x 会变成 -rwxr-Sr-x,其中 S/s 表示 SGID 位。
2.4 示例
创建一个目录并设置 SGID 位
[root]
mkdir /tmp/shared
chmod g+s /tmp/shared
查看目录的权限
ls -ld /tmp/shared
drwxr-sr-x 2 root root 6 Nov 22 16:01 /tmp/shared
切换普通用户创建目录
[test1]
$ touch a.txt
$ ll
total 0
-rw-rw-r-- 1 test1 root 0 Nov 22 16:31 a.txt
三. Sticky Bit (SBIT)
Sticky Bit 位主要用于目录,确保只有文件的所有者或 root 用户才能删除或重命名该目录中的文件,即使其他用户有写权限。
3.1 用途
公共目录
例如,/tmp 目录允许所有用户写入,但只有文件的所有者或 root 用户可以删除文件。设置 Sticky Bit
使用 chmod 命令
chmod +t directory
使用 数字模式
chmod 1755 directory
其中,1 表示 Sticky Bit 位,755 表示目录的其他权限。
3.2 检查 Sticky Bit
使用 ls -l 命令
ls -ld directory
如果目录设置了 Sticky Bit 位,drwxr-xr-x 会变成 drwxr-xr-t,drwxr-xr-- 会变成 drwxr-xr-T,其中 T/t 表示 Sticky Bit 位。
3.3 示例
查看 /tmp 目录的权限
[root]
#ls -ld /tmp
drwxrwxrwt. 25 root root 4096 Nov 22 16:01 /tmp
用户test1创建文件
权限给最大的777
[test1]
$ echo “aaaaa” > test1.txt
$ chmod 777 test1.txt
$ ll -d test1.txt
-rwxrwxrwx 1 test1 test1 5 Nov 22 16:19 test1.txt
用户test02删除文件
由于SBIT特殊权限的存在,即使读写执行的权限都具备,仍然无法删除该文件
[test02]
$ rm -rf /tmp/test1.txt
rm: cannot remove ‘/tmp/test1.txt’: Operation not permitted
四、实际使用
查看/etc/shadow的权限为000,只有root用户可以查看
–root用户
[root@db1 ~]# ll -d /etc/shadow
---------- 1 root root 3149 Oct 31 03:55 /etc/shadow
–普通用户
[test@db1 ~]$ cat /etc/shadow
cat: /etc/shadow: Permission denied
那如何让普通用户test可以查看到/etc/shadow的内容?
4.1 设置/bin/cat的SUID权限
#查看权限
[root@db1 scripts]# ll /bin/cat
-rwxr-xr-x. 1 root root 51856 Jan 11 2019 /bin/cat
#修改权限
[root@db1 scripts]# chmod u+s /bin/cat[root@db1 scripts]# ll /bin/cat
-rwsr-xr-x. 1 root root 51856 Jan 11 2019 /bin/cat
#切换用户查看
[test@db1 ~]$ cat /etc/shadow|wc -l
64
#回收权限再查看
[root@db1 scripts]# chmod u-s /bin/cat
[root@db1 scripts]# ll -d /bin/cat
-rwxr-xr-x. 1 root root 51856 Jan 11 2019 /bin/cat
[root@db1 scripts]# su - test
Last login: Fri Nov 22 16:39:34 CST 2024 on pts/1
[test@db1 ~]$ cat /etc/shadow|wc -l
cat: /etc/shadow: Permission denied
4.2 设置/bin/cat的SGID权限
设置SGID权限
[root@db1 scripts]# ll -d /bin/cat
-rwxr-xr-x. 1 root root 51856 Jan 11 2019 /bin/cat
[root@db1 scripts]# chmod g+s /bin/cat
[root@db1 scripts]# ll -d /bin/cat
-rwxr-sr-x. 1 root root 51856 Jan 11 2019 /bin/cat
[root@db1 scripts]# ll -d /etc/shadow
---------- 1 root root 3149 Oct 31 03:55 /etc/shadow
由于/etc/shadow的root组没有读权限,即使设置了SUID,普通用户仍然无法读取文件信息
[root@db1 scripts]# su - test
Last login: Fri Nov 22 16:41:33 CST 2024 on pts/1
[test@db1 ~]$ cat /etc/shadow
cat: /etc/shadow: Permission denied
设置文件上组的读权限
[root@db1 scripts]# chmod g+r /etc/shadow
[root@db1 scripts]# ll -d /etc/shadow
----r----- 1 root root 3149 Oct 31 03:55 /etc/shadow
[root@db1 scripts]# su - test
Last login: Fri Nov 22 16:43:14 CST 2024 on pts/1
[test@db1 ~]$ cat /etc/shadow|wc -l
64
4.3 授权其它组读权限
[root@db1 scripts]# chmod o+r /etc/shadow
[root@db1 scripts]# ll -d /etc/shadow
-------r-- 1 root root 3149 Oct 31 03:55 /etc/shadow
[root@db1 scripts]# su - test
[test@db1 ~]$ cat /etc/shadow|wc -l
64
五、总结
SUID:使命令在执行时以文件所有者的权限运行。
SGID:使命令在执行时以文件所属组的权限运行,或使目录中的新文件继承目录的组所有权。
Sticky Bit:确保只有文件的所有者或 root 用户才能删除或重命名目录中的文件。