3.7.2 特殊权限与目录权限策略
3.7.2 特殊权限与目录权限策略#
原理草图:特殊权限对访问控制的影响#
特殊权限位概览#
- SUID:可执行文件运行时临时获得文件属主权限,常用于
passwd等系统工具。 - SGID:可执行文件运行时临时获得文件属组权限;用于目录时,新建文件继承目录属组。
- Sticky Bit:仅对目录有效,目录内文件只能被文件属主或目录属主删除,常见于
/tmp。
权限位数值与表现:
- SUID:权限位 4,属主执行位显示 s/S
- SGID:权限位 2,属组执行位显示 s/S
- Sticky Bit:权限位 1,其他执行位显示 t/T
特殊权限设置与查看(含命令解释)#
# 1) 设置 SUID:将可执行文件在运行时临时拥有属主权限
chmod u+s /usr/local/bin/demo_suid
# 数值形式等价
chmod 4755 /usr/local/bin/demo_suid
# 2) 设置 SGID:目录中新建文件继承目录属组
chmod g+s /data/share
# 数值形式等价
chmod 2775 /data/share
# 3) 设置 Sticky Bit:目录内文件仅属主/目录属主可删除
chmod +t /data/tmp
# 数值形式等价
chmod 1777 /data/tmp
# 4) 查看权限位
ls -l /usr/local/bin/demo_suid /data/share /data/tmp
# 5) 审计系统中存在的特殊权限文件
find / -perm -4000 -type f 2>/dev/null # SUID 文件
find / -perm -2000 -type f 2>/dev/null # SGID 文件
find / -perm -1000 -type d 2>/dev/null # Sticky 目录
预期效果(示例):
-rwsr-xr-x 1 root root 24576 demo_suid
drwxrwsr-x 2 root dev 4096 share
drwxrwxrwt 2 root root 4096 tmp
示例:SGID 共享目录协作策略#
# 创建共享目录并设置属组
groupadd dev
mkdir -p /data/share
chgrp dev /data/share
# 设置 SGID,确保新文件继承 dev 组
chmod 2775 /data/share
# 测试:以 dev 组成员创建文件
su - devuser -c "touch /data/share/a.txt && ls -l /data/share/a.txt"
预期效果:
-rw-r--r-- 1 devuser dev 0 a.txt
说明:新文件属组继承 dev,便于团队协作。
示例:Sticky 目录防止互删#
# 创建公共临时目录
mkdir -p /data/tmp
chmod 1777 /data/tmp
# 用户 A 创建文件
su - userA -c "touch /data/tmp/a.log"
# 用户 B 尝试删除 A 的文件(应被拒绝)
su - userB -c "rm -f /data/tmp/a.log"
预期效果:
rm: cannot remove '/data/tmp/a.log': Operation not permitted
示例:SUID 工具风险验证#
# 演示 SUID 对权限的提升效果
# 创建示例文件,仅 root 可读
echo "secret" > /root/secret.txt
chmod 600 /root/secret.txt
# 创建一个读取文件的小程序(示例)
cat > /usr/local/bin/read_secret.sh <<'EOF'
#!/bin/bash
cat /root/secret.txt
EOF
chmod 755 /usr/local/bin/read_secret.sh
# 普通用户执行(应失败)
su - userA -c "/usr/local/bin/read_secret.sh"
# 设置 SUID 后执行(将成功读取,存在安全风险)
chown root:root /usr/local/bin/read_secret.sh
chmod 4755 /usr/local/bin/read_secret.sh
su - userA -c "/usr/local/bin/read_secret.sh"
说明:SUID 在脚本上通常无效或被系统限制,生产环境严禁随意赋予 SUID。
目录权限策略与落地#
- 共享目录协作
- 目录
chmod 2775设置 SGID - 配合
umask 002控制新文件默认权限 - 公共临时目录
- 目录
chmod 1777设置 Sticky Bit - 应用写入目录
- 明确服务账号(如
nginx、mysql),设置最小权限 - 禁止
chmod 777 - 如需组协作,用 SGID + 组成员管理
排错与排查清单#
# 1) 权限显示异常(s/S/t/T)
ls -l /path/to/file
# 2) SUID/SGID 执行后权限未提升
# 原因:文件非可执行、文件系统挂载 nosuid
mount | grep -E "nosuid|nodev"
# 3) Sticky 目录仍可互删
# 检查目录是否真正设置了 t
ls -ld /data/tmp
# 4) SGID 目录新文件未继承属组
# 检查:目录是否设置 SGID、用户是否在目标组
ls -ld /data/share
id devuser
练习#
- 创建
/data/share,设置 SGID 并验证新文件继承属组。 - 创建
/data/tmp,设置 Sticky Bit,验证不同用户无法互删文件。 - 扫描系统 SUID 文件,列出 5 个并分析用途与风险。
- 模拟
nosuid挂载后,验证 SUID 失效行为(可在测试环境进行)。