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 文件名
chmod u+s 文件名
|
查看方法
经典示例:passwd 命令
为什么需要 SUID?
三、SGID (Set Group ID)
含义
- 对文件:执行时以文件所属组的身份运行
- 对目录:在该目录下创建的新文件,继承目录的组所有权
设置方法
1 2 3 4 5
| chmod 2755 文件/目录
chmod g+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
chmod g+s /company/project
ls -ld /company/project
touch /company/project/file1.txt ls -l /company/project/file1.txt
|
四、Sticky Bit
含义
设置 Sticky Bit 的目录中,用户只能删除自己创建的文件,不能删除其他人的文件。
设置方法
1 2 3 4 5
| chmod 1777 目录名
chmod +t 目录名
|
查看方法
经典示例:/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
su - dev_wang -c "touch /test_sticky/file1"
su - dev_li -c "rm /test_sticky/file1"
chmod +t /test_sticky
su - dev_wang -c "touch /test_sticky/file2"
su - dev_li -c "rm /test_sticky/file2"
|
五、组合使用:三位数字表示法
特殊权限用第一位数字表示,放在普通权限前面:
| 数字 |
含义 |
组合 |
| 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
echo "配置协作开发目录..." mkdir -p /company/collab chown root:dev_team /company/collab chmod 2770 /company/collab ls -ld /company/collab echo ""
echo "配置共享临时目录..." mkdir -p /company/temp chmod 1777 /company/temp ls -ld /company/temp echo ""
echo "配置部署脚本(使用 sudo 替代 SUID)..." cat > /usr/local/bin/deploy.sh << 'EOF'
echo "正在部署应用..."
EOF
chmod 755 /usr/local/bin/deploy.sh
echo "dev_team ALL=(ALL) /usr/local/bin/deploy.sh" >> /etc/sudoers.d/deploy echo ""
echo "权限配置完成:" ls -la /company/
|
七、安全注意事项
SUID 的安全风险
1 2 3 4 5 6
|
chmod 4755 /bin/bash
|
查找系统中的 SUID/SGID 文件
1 2 3 4 5 6 7 8
| find / -perm -4000 -type f 2>/dev/null
find / -perm -2000 -type f 2>/dev/null
find / -perm -1000 -type d 2>/dev/null
|
特殊权限的字符显示
1 2 3 4 5 6 7 8 9
| -rwsr-xr-x -rwSr--r--
drwxrwsr-x drwxrwSr--
drwxrwxrwt drwxrwxr-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 ""
mkdir -p /practice/{suid_test,sgid_test,sticky_test} echo "1. 创建测试目录完成" echo ""
echo "2. SUID 练习" cat > /practice/suid_test/myid << 'EOF'
echo "实际用户: $(whoami)" echo "有效用户: $(id -un)" EOF chmod 755 /practice/suid_test/myid
echo " 不设 SUID:" /practice/suid_test/myid
chmod 4755 /practice/suid_test/myid echo " 设置 SUID 后:" /practice/suid_test/myid echo ""
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 ""
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:公共目录”各扫门前雪”