1.2.4 特殊权限与默认权限控制

本节聚焦于 Linux 的特殊权限(SUID、SGID、Sticky)与默认权限控制(umask),用于在 rwx 权限模型之上进一步约束或放宽访问行为,常见于系统工具与共享目录场景。为便于操作示例理解,补充通配符、绝对路径与相对路径的基本用法。

1. 特殊权限概览与原理#

文章图片
  • SUID(Set User ID):作用于可执行文件,执行时临时获得文件属主权限,常见于需要提升权限的系统命令。
  • SGID(Set Group ID)
  • 作用于可执行文件:执行时临时获得文件属组权限。
  • 作用于目录:新文件继承目录属组,适合团队协作目录。
  • Sticky(粘滞位):作用于目录,目录内文件仅允许文件属主、目录属主或 root 删除,典型如 /tmp。

2. 权限位表示与查看(含示例)#

  • 数字位:SUID=4、SGID=2、Sticky=1,与普通权限位组合(如 4755)。
  • 字符表示:
  • SUID:属主执行位显示为 s/S
  • SGID:属组执行位显示为 s/S
  • Sticky:其他执行位显示为 t/T
# 查看 /usr/bin/passwd 是否设置 SUID
ls -l /usr/bin/passwd
# 预期: -rwsr-xr-x 1 root root ... /usr/bin/passwd

# 查看 /tmp 是否设置 Sticky
ls -ld /tmp
# 预期: drwxrwxrwt 10 root root ... /tmp

2.1 绝对路径与相对路径(含示例)#

  • 绝对路径:从根目录 / 开始,如 /data/share/alice.txt
  • 相对路径:相对当前目录,如当前在 /datashare/alice.txt
# 绝对路径访问
ls -l /data/share

# 相对路径访问(假设当前目录为 /data)
cd /data
ls -l share

2.2 通配符(Wildcard)基础#

  • *:匹配任意长度任意字符
  • ?:匹配单个字符
  • []:匹配字符集合
# 列出 /data/public 下所有 .txt 文件
ls -l /data/public/*.txt

# 匹配 a1、a2 但不匹配 a10
ls -l /data/public/a?

# 匹配 a1 或 a2
ls -l /data/public/a[12]

3. SUID/SGID/Sticky 实操示例(含命令解释)#

3.1 SUID:允许普通用户执行需要特权的操作#

# 创建一个示例脚本(仅示例,脚本无法生效为 SUID)
sudo tee /usr/local/bin/idshow >/dev/null <<'EOF'
#!/bin/bash
id
EOF
sudo chmod 755 /usr/local/bin/idshow

# 说明:SUID 仅对二进制程序生效,不对脚本生效
# 这里以系统自带 /usr/bin/passwd 作为标准示例
ls -l /usr/bin/passwd

命令解释
- ls -l:查看权限位,rws 表示 SUID 生效。
- 注意:SUID 仅对二进制可执行文件有效。

3.2 SGID:目录协作示例#

# 创建协作组与目录
sudo groupadd devops
sudo usermod -aG devops alice
sudo usermod -aG devops bob
sudo mkdir -p /data/share
sudo chown root:devops /data/share
sudo chmod 2775 /data/share

# 解释:
# 2 表示 SGID,775 允许组写
# SGID 作用于目录时,新文件继承 devops 组

验证:

# 以 alice 创建文件,观察属组继承
sudo -u alice touch /data/share/alice.txt
ls -l /data/share/alice.txt
# 预期:-rw-r--r-- 1 alice devops ...

3.3 Sticky:共享目录防误删#

# 创建公共写目录并设置 Sticky
sudo mkdir -p /data/public
sudo chmod 1777 /data/public

# 解释:
# 1 表示 Sticky,777 允许任意用户写入

验证删除限制:

sudo -u alice touch /data/public/a.txt
sudo -u bob rm /data/public/a.txt
# 预期:rm: cannot remove '/data/public/a.txt': Operation not permitted

4. umask 默认权限控制(含示例与计算)#

4.1 规则说明#

  • 文件默认基准权限:666
  • 目录默认基准权限:777
  • 实际权限 = 基准权限 - umask

4.2 示例演示#

# 查看当前 umask
umask

# 临时设置 umask 为 027(仅对当前 shell)
umask 027

# 创建文件/目录并查看权限
touch /tmp/umask_file
mkdir /tmp/umask_dir
ls -l /tmp/umask_file /tmp/umask_dir
# 预期:
# -rw-r----- 1 user user ... /tmp/umask_file (666-027=640)
# drwxr-x--- 2 user user ... /tmp/umask_dir (777-027=750)

4.3 永久生效(bash)#

# 追加到 /etc/profile 或 ~/.bashrc
echo "umask 027" | sudo tee -a /etc/profile
# 重新加载
source /etc/profile

5. 常用排查与安全建议#

5.1 排查异常 SUID/SGID#

# 查找系统中所有 SUID/SGID 文件
sudo find / -xdev -type f \( -perm -4000 -o -perm -2000 \) -ls
# 解释:-perm -4000 表示设置 SUID,-perm -2000 表示设置 SGID

5.2 排查 Sticky 目录#

# 查找 Sticky 目录
sudo find / -xdev -type d -perm -1000 -ls

5.3 通配符辅助排查(含绝对/相对路径示例)#

# 使用绝对路径 + 通配符,查找 /data 下以 share 开头的目录
ls -ld /data/share*

# 使用相对路径 + 通配符(假设当前目录为 /data)
cd /data
ls -ld share*

5.4 常见问题与修复#

  • 问题:共享目录新文件属组不正确
    修复:确认目录 SGID 是否设置
sudo chmod g+s /data/share
  • 问题:公共目录误删文件
    修复:设置 Sticky
sudo chmod +t /data/public

6. 练习#

  1. 创建目录 /data/team,要求:
    - 组为 devops
    - 新文件继承组
    - 组可写
    - 其他用户只读
    提示:使用 chmod 2754chmod 2775 并结合 chown root:devops

  2. 将当前用户的 umask 调整为 022,创建文件与目录,验证权限是否为 644 和 755。

  3. 扫描系统中所有 SUID 文件,找出非系统目录(如 /usr/bin 外)的文件并评估是否需要移除 SUID。