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。 - 相对路径:相对当前目录,如当前在
/data,share/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. 练习#
-
创建目录
/data/team,要求:
- 组为devops
- 新文件继承组
- 组可写
- 其他用户只读
提示:使用chmod 2754或chmod 2775并结合chown root:devops。 -
将当前用户的 umask 调整为
022,创建文件与目录,验证权限是否为 644 和 755。 -
扫描系统中所有 SUID 文件,找出非系统目录(如 /usr/bin 外)的文件并评估是否需要移除 SUID。