<笔记> Linux特殊权限详解:SUID、SGID、Sticky Bit

Linux 系统中除了常见的 rwx 权限外,还有三个特殊权限:SUID (4)、SGID (2)、Sticky Bit (1)


一、特殊权限速查表

权限 数字 字符表示 作用对象 主要功能
SUID 4 s (在所有者x位) 可执行文件 以文件所有者身份执行
SGID 2 s (在所属组x位) 可执行文件/目录 文件:以文件所属组身份执行
目录:新文件继承目录的组
Sticky 1 t (在其他人x位) 目录 只能删除自己创建的文件

二、SUID (Set User ID)

含义

当执行设置了 SUID 的程序时,进程以文件所有者(而不是执行者)的身份运行

设置方法

1
2
3
4
5
# 数字法
chmod 4755 文件名 # 4 表示 SUID

# 符号法
chmod u+s 文件名

查看方法

1
2
ls -l 文件名
# -rwsr-xr-x (所有者权限位的 x 变成 s)

经典示例:passwd 命令

1
2
3
4
5
6
7
# 查看 passwd 命令的权限
ls -l /bin/passwd
# -rwsr-xr-x 1 root root /bin/passwd
# ↑ 这里有个 s,表示设置了 SUID

# 普通用户执行 passwd 时,会以 root 身份运行
# 这样才能修改 /etc/shadow 文件

为什么需要 SUID?

1
2
3
4
5
6
# /etc/shadow 只有 root 可读写
ls -l /etc/shadow
# -rw------- 1 root root /etc/shadow

# 但普通用户需要修改自己的密码(需要写 shadow)
# SUID 让 passwd 以 root 身份运行,临时获得写权限

三、SGID (Set Group ID)

含义

  • 对文件:执行时以文件所属组的身份运行
  • 对目录:在该目录下创建的新文件,继承目录的组所有权

设置方法

1
2
3
4
5
# 数字法
chmod 2755 文件/目录 # 2 表示 SGID

# 符号法
chmod g+s 文件/目录

查看方法

1
2
3
ls -l 文件/目录
# -rwxr-sr-x (组权限位的 x 变成 s)
# drwxr-sr-x (目录的组权限位有 s)

经典示例:协作目录

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 创建协作目录
mkdir /company/project
chown root:dev_team /company/project
chmod 2770 /company/project # SGID + rwxrwx---

# 设置 SGID
chmod g+s /company/project

# 查看结果
ls -ld /company/project
# drwxrws--- 2 root dev_team /company/project
# ↑ 这里有个 s,表示设置了 SGID

# 开发人员创建文件
touch /company/project/file1.txt
ls -l /company/project/file1.txt
# -rw-rw-r-- 1 dev_wang dev_team file1.txt
# 文件自动属于 dev_team 组,而不是 dev_wang 的个人组

四、Sticky Bit

含义

设置 Sticky Bit 的目录中,用户只能删除自己创建的文件,不能删除其他人的文件。

设置方法

1
2
3
4
5
# 数字法
chmod 1777 目录名 # 1 表示 Sticky

# 符号法
chmod +t 目录名

查看方法

1
2
ls -ld 目录名
# drwxrwxrwt (其他人权限位的 x 变成 t)

经典示例:/tmp 目录

1
2
3
4
5
6
7
# 查看 /tmp 目录权限
ls -ld /tmp
# drwxrwxrwt 10 root root /tmp
# ↑ 这里有个 t,表示设置了 Sticky

# 所有用户都可以在 /tmp 创建文件
# 但不能删除其他人的文件

演示 Sticky Bit 的作用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 创建测试目录
mkdir /test_sticky
chmod 777 /test_sticky

# 用户1创建文件
su - dev_wang -c "touch /test_sticky/file1"

# 用户2尝试删除(可以成功)
su - dev_li -c "rm /test_sticky/file1" # ✅ 可以删除

# 设置 Sticky Bit
chmod +t /test_sticky

# 用户1再创建文件
su - dev_wang -c "touch /test_sticky/file2"

# 用户2尝试删除(会失败)
su - dev_li -c "rm /test_sticky/file2" # ❌ 不能删除
# rm: remove write-protected regular empty file '/test_sticky/file2'? y
# rm: cannot remove '/test_sticky/file2': Operation not permitted

五、组合使用:三位数字表示法

特殊权限用第一位数字表示,放在普通权限前面:

数字 含义 组合
4 SUID chmod 4755 = SUID + rwxr-xr-x
2 SGID chmod 2755 = SGID + rwxr-xr-x
1 Sticky chmod 1777 = Sticky + rwxrwxrwx
6 SUID + SGID chmod 6755
5 SUID + Sticky chmod 5755
3 SGID + Sticky chmod 3755
7 SUID + SGID + Sticky chmod 7755

六、在企业权限脚本中的应用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#!/bin/bash
# 企业权限配置 - 使用特殊权限

# 1. 协作开发目录(使用 SGID)
echo "配置协作开发目录..."
mkdir -p /company/collab
chown root:dev_team /company/collab
chmod 2770 /company/collab # SGID + rwxrwx---
ls -ld /company/collab
echo ""

# 2. 共享临时目录(使用 Sticky)
echo "配置共享临时目录..."
mkdir -p /company/temp
chmod 1777 /company/temp # Sticky + rwxrwxrwx
ls -ld /company/temp
echo ""

# 3. 部署脚本(使用 SUID 的替代方案)
echo "配置部署脚本(使用 sudo 替代 SUID)..."
cat > /usr/local/bin/deploy.sh << 'EOF'
#!/bin/bash
# 部署脚本 - 需要 root 权限
echo "正在部署应用..."
# 实际部署命令
EOF

chmod 755 /usr/local/bin/deploy.sh
# 不设 SUID,而是通过 sudo 授权
echo "dev_team ALL=(ALL) /usr/local/bin/deploy.sh" >> /etc/sudoers.d/deploy
echo ""

# 4. 测试权限
echo "权限配置完成:"
ls -la /company/

七、安全注意事项

SUID 的安全风险

1
2
3
4
5
6
# ⚠️ 不要随意设置 SUID
# 危险示例:给 bash 设置 SUID
chmod 4755 /bin/bash # ❌ 极度危险!任何用户都能以 root 执行命令

# 安全做法:使用 sudo 替代
# 在 /etc/sudoers 中精细控制权限

查找系统中的 SUID/SGID 文件

1
2
3
4
5
6
7
8
# 查找所有 SUID 文件
find / -perm -4000 -type f 2>/dev/null

# 查找所有 SGID 文件
find / -perm -2000 -type f 2>/dev/null

# 查找所有 Sticky 目录
find / -perm -1000 -type d 2>/dev/null

特殊权限的字符显示

1
2
3
4
5
6
7
8
9
# 当同时有执行权限时显示小写 s/t
-rwsr-xr-x # SUID + 有执行权限
-rwSr--r-- # SUID + 无执行权限(大写 S)

drwxrwsr-x # SGID + 有执行权限
drwxrwSr-- # SGID + 无执行权限(大写 S)

drwxrwxrwt # Sticky + 有执行权限
drwxrwxr-T # Sticky + 无执行权限(大写 T)

八、实战练习

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#!/bin/bash
# 特殊权限实战练习

echo "=== 特殊权限实战练习 ==="
echo ""

# 1. 创建测试环境
mkdir -p /practice/{suid_test,sgid_test,sticky_test}
echo "1. 创建测试目录完成"
echo ""

# 2. SUID 练习
echo "2. SUID 练习"
cat > /practice/suid_test/myid << 'EOF'
#!/bin/bash
echo "实际用户: $(whoami)"
echo "有效用户: $(id -un)"
EOF
chmod 755 /practice/suid_test/myid

# 不设 SUID 时
echo " 不设 SUID:"
/practice/suid_test/myid

# 设置 SUID
chmod 4755 /practice/suid_test/myid
echo " 设置 SUID 后:"
/practice/suid_test/myid
echo ""

# 3. SGID 练习
echo "3. SGID 练习"
chown root:dev_team /practice/sgid_test
chmod 2770 /practice/sgid_test

# 创建文件测试组继承
touch /practice/sgid_test/test_file
ls -l /practice/sgid_test/test_file
echo ""

# 4. Sticky 练习
echo "4. Sticky 练习"
chmod 1777 /practice/sticky_test
ls -ld /practice/sticky_test
echo ""

echo "练习完成!"

总结

特殊权限 数字 适用对象 主要作用
SUID 4 可执行文件 以文件所有者身份执行
SGID 2 文件/目录 文件:以所属组身份执行
目录:新文件继承组
Sticky 1 目录 只能删除自己的文件

记住口诀

  • SUID 4:执行时”变身”文件主
  • SGID 2:目录里”子承父组”
  • Sticky 1:公共目录”各扫门前雪”