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
  • 应用写入目录
  • 明确服务账号(如 nginxmysql),设置最小权限
  • 禁止 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

练习#

  1. 创建 /data/share,设置 SGID 并验证新文件继承属组。
  2. 创建 /data/tmp,设置 Sticky Bit,验证不同用户无法互删文件。
  3. 扫描系统 SUID 文件,列出 5 个并分析用途与风险。
  4. 模拟 nosuid 挂载后,验证 SUID 失效行为(可在测试环境进行)。