Linux 系统的文件权限 (3) 特殊权限 SUID SGID Sticky

前面讲过文件的 rwx 普通权限, 但是偶尔我们还会看到 t 权限和 s 权限.

例如 drwxrwxrwt/tmp, -rwsr-xr-x/usr/bin/passwd 文件等

s 权限替代拥有者 x 权限称为 SUID

SUID 是 SET UID 的意思.

仅对可执行文件有效(不可执行或者文件夹无效)
表示执行此文件的时候, 获取此文件所有者权限.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 准备当前用户
sudo su ops

# 准备文件
echo '213' > aa
chown dev:dev aa
chmod 660 aa
# -rw-rw---- 1 dev dev aa

# 准备 cat 文件
sudo cp /usr/bin/cat .
# -rwxr-xr-x 1 root dev cat

# 权限不够 - 当前 ops 用户, 执行 cat 为 other 权限, cat 调用 aa 为 other 权限
./cat aa

# 授权 SUID
sudo chmod u+s ./cat
# -rwsr-xr-x 1 root dev cat

# 可以获取数据 - 当前用户 ops, 执行 cat 为 other 权限, cat 具有 SUID 权限, cat 调用 aa 为 root 权限
./cat aa

s 权限替代所属组 x 权限成为 SGID

SGID 是 SET GID 的意思.

目录有此权限: 表示创建的新文件默认群组与目录群组相同.
文件有此权限: 表示执行此文件的时候, 获取此文件所属组的权限.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 准备当前用户
sudo su ops

# 准备文件
echo '213' > aa
chown dev:dev aa
chmod 660 aa
# -rw-rw---- 1 dev dev aa

# 准备 cat 文件
sudo cp /usr/bin/cat .
# -rwxr-xr-x 1 root dev cat

# 权限不够 - 当前 ops 用户, 执行 cat 为 other 权限, cat 调用 aa 为 other 权限
./cat aa

# 授权 SGID
sudo chmod g+s ./cat
# -rwxr-sr-x 1 root dev cat

# 可以获取数据 - 当前用户 ops, 执行 cat 为 other 权限, cat 具有 SGID 权限, cat 调用 aa 为 dev 组权限, 与 aa 文件同一组
./cat aa

t 权限替代其他用户 x 权限成为 SBIT

SBIT 是 Sticky Bit 的意思.

仅对目录有效,对文件无效. 文件夹下面的文件或文件夹, 仅文件所有者与 root 才有权力删除, 即使文件夹为对所属组或者其他用户有些权限也不能删除.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 准备文件夹
mkdir ./tmp
chmod 1666 ./tmp
touch ./tmp/log.txt
echo 123 >> ./tmp/log.txt

# 准备当前用户
sudo su ops

echo 234 >> ./tmp/log.txt
cat ./tmp/log.txt

# 删除不允许, 当前用户 ops 非所有者和 root
rm -rf ./tmp/log.txt

SUID SGID SBIT 的设置

权限的分级表示方法

1
2
3
4
5
6
# SUID
chmod u±s file
# SGID
chmod g±s file/path
# SBIT
chmod o±t path

八进制表示方法

rwx 类似, 第一位 SUID 为 4, 第二位 SGID 为 2, 第三位 SBIT 为 1. 完整的表示即为 7777.

所以在有些授权的时候, 指定的是 0755 就是这个道理.

文件所属用户为非 root 时, 用户名与组名不一致无法授权 SGID

当文件所属用户为非 root 的时候, 比如 ops, 所属组为 dev, 此时对文件进行授权 SGID.

文件/文件夹原来没有 x 权限

设置了特殊权限后, s -> S, t -> T, 表示特殊权限无效.

参考文档

Donate - Support to make this site better.
捐助 - 支持我让我做得更好.