
在掌握基础权限与 `chmod` 之后,进一步需要回答两个问题:新建文件和目录的默认权限如何形成,权限位中的 `s`、`t` 又分别代表什么。本文围绕 `umask` 的默认权限生成逻辑,以及 SUID、SGID、Sticky Bit 的适用边界展开,说明默认权限与特殊权限的核心机制。
本节说明 umask 如何影响新建文件和目录的默认权限。
umask(user file creation mask)决定了新建文件和目录的默认权限。它是一个遮罩码,从最大权限中减去遮罩位得到最终权限。
# 查看当前umaskumask# 输出:0022( RHEL/CentOS默认)# 输出:0002( Ubuntu/Debian默认)# 符号形式umask -S# u=rwx,g=rwx,o=rx# 文件最大权限:666(因为文件默认不设置执行权限)# 目录最大权限:777# umask 0022 遮罩的含义:# 0 - 所有者:不遮罩任何位# 2 - 所属组:遮罩写权限(w)# 2 - 其他用户:遮罩写权限(w)# 新建文件权限 = 666 & ~022 = 666 & 755 = 644touch /tmp/test_filels -la /tmp/test_file# -rw-r--r-- 1 root root 0 Apr 7 10:00 /tmp/test_file# 新建目录权限 = 777 & ~022 = 777 & 755 = 755mkdir /tmp/test_dirls -la /tmp/test_dir# drwxr-xr-x 2 root root 4096 Apr 7 10:00 /tmp/test_dir# 临时设置(当前shell生效)umask 0027# 永久设置 - 用户级别(~/.bashrc 或 ~/.profile)echo"umask 0027" >> ~/.bashrcsource ~/.bashrc# 永久设置 - 系统级别(/etc/profile 或 /etc/bash.bashrc)echo"umask 0027" >> /etc/bash.bashrc# 系统安全配置(RHEL/CentOS)cat >> /etc/profile << 'EOF'# Set defaultumask for new usersif [ $UID -ge 1000 ]; then umask 0027fiEOF# Apache/Nginx Web服务用户(不允许登录)# umask 应该设置为 022,避免文件权限过严grep UMASK /etc/sysconfig/httpd# UMASK=027# 数据库服务(MySQL/PostgreSQL)# 数据目录需要严格权限,通常 0700# 但运行用户需要适当的umask# 共享目录(团队协作)# umask 0002,允许组成员编辑文件# 配合setfacl 使用效果更好# 脚本中临时修改umask( umask 0027 # 这里创建的文件权限将是 640 echo"secret" > /tmp/shared_file)# 子shell退出后,父shell的umask不受影响本节概述 SUID、SGID 和 Sticky Bit 的作用边界。
SUID允许程序以文件所有者的权限运行,而非执行者的权限。
# SUID 设置chmod u+s /path/to/program# 或chmod 4755 /path/to/program# 查看SUIDls -la /usr/bin/passwd# -rwsr-xr-x 1 root root 27856 Apr 7 2024 /usr/bin/passwd# ^# 注意 s 替代了 x,表示设置了SUID# SUID 的典型应用:passwd 命令# 普通用户可以修改自己的密码(写入 /etc/shadow)# 这是因为 passwd 程序以 root 权限运行# SUID 风险示例:危险的配置chmod 4755 /bin/sh # 极其危险!任何用户都可以以root身份执行sh# 绝对不要这样做!SGID允许程序以文件所属组的权限运行。对于目录,SGID会使目录下新建的文件继承该目录的组。
# SGID 设置chmod g+s /path/to/program# 或chmod 2755 /path/to/program# 查看SGIDls -la /usr/bin/write# -rwxr-sr-x 1 root tty 19552 Jan 27 2024 /usr/bin/write# 目录的SGID:子文件继承目录组mkdir /home/sharedchgrp developers /home/sharedchmod 2775 /home/shared# 现在任何在 developers 组内的用户,在 /home/shared 下创建的文件# 都会自动属于 developers 组# 验证ls -la /home/shared# drwxrwsr-x 2 root root 4096 Apr 7 10:00 /home/shared# ^# 注意 s 表示SGIDSBIT(也称 RestrictedDeletion Bit)保护目录中的文件:只有文件所有者或root可以删除或重命名目录中的文件。
# SBIT 设置chmod +t /path/to/directory# 或chmod 1755 /path/to/directory# 查看SBITls -la /tmp# drwxrwxrwt 10 root root 4096 Apr 7 10:00 /tmp# ^# 注意 t 替代了x,表示设置了SBIT# 如果小写t,表示原来有x但被遮罩•/tmp 目录的SBIT解释:
•任何用户都可以在 /tmp 中创建文件
•但只有文件所有者(或root)可以删除自己的文件
•这防止用户A删除用户B的文件
# 查找所有设置了SUID的文件find / -perm -4000 -type f 2>/dev/null# 查找所有设置了SGID的文件find / -perm -2000 -type f 2>/dev/null# 查找所有设置了SBIT的目录find / -perm -1000 -type d 2>/dev/null# 综合查找find / \( -perm -4000 -o -perm -2000 \) -type f 2>/dev/null# 安全审计:检查可疑的SUID文件# 正常系统应该有的SUID文件(参考)/usr/bin/passwd/usr/bin/sudo/usr/bin/su/usr/bin/chfn/usr/bin/chsh/usr/bin/gpasswd/usr/bin/mount/usr/bin/umount/usr/bin/newgrp/usr/libexec/sudo/sudoers_parser/usr/sbin/unix_chkpwd/usr/sbin/pwdb_chkpwd
#!/bin/bash# check_special_perms.sh - 检查特殊权限配置set -euo pipefailREPORT="/tmp/special_perms_report_$(date +%Y%m%d_%H%M%S).txt"echo"=== Linux 特殊权限安全审计 ===" > "$REPORT"echo"审计时间: $(date)" >> "$REPORT"echo"" >> "$REPORT"# SUID 文件检查echo"【SUID 文件检查】" >> "$REPORT"echo"正常范围外的高风险SUID文件:" >> "$REPORT"find / -perm -4000 -type f -ls 2>/dev/null | \ grep -v -E "^(/usr/bin/passwd|/usr/bin/sudo|/usr/bin/su|/usr/bin/chfn|/usr/bin/chsh|/usr/bin/gpasswd|/usr/sbin/unix_chkpwd)" >> "$REPORT" || true# SGID 文件检查echo"" >> "$REPORT"echo"【SGID 文件检查】" >> "$REPORT"echo"高风险SGID文件:" >> "$REPORT"find / -perm -2000 -type f -ls 2>/dev/null | \ grep -v -E "^(/usr/bin/write|/usr/bin/wall|/usr/bin/lpr|/usr/bin/lprm)" >> "$REPORT" || true# SBIT 目录检查echo"" >> "$REPORT"echo"【SBIT 目录检查】" >> "$REPORT"echo"缺少SBIT保护的公共目录:" >> "$REPORT"find / -maxdepth 2 -perm -0002 -type d -ls 2>/dev/null | \ grep -v -E "^/tmp|^/var/tmp" >> "$REPORT" || true# 权限过高的文件echo"" >> "$REPORT"echo"【高风险权限配置】" >> "$REPORT"echo"777权限的可执行文件:" >> "$REPORT"find / -type f -perm -777 -ls 2>/dev/null | head -20 >> "$REPORT"echo"" >> "$REPORT"echo"【建议】" >> "$REPORT"cat >> "$REPORT" << 'EOF'1. SUID/SGID文件应定期审计,移除不必要的特殊权限
2. 高风险SUID文件(如有shell的SUID)应立即修复
3. 公共目录应设置SBIT保护
4. 使用 RPM/DPKG 验证系统文件完整性
rpm -Va | grep -E '^\.\.5.*P'# 检查SUID文件变化EOFcat "$REPORT"echo""echo"报告已保存到: $REPORT"至此,默认权限的生成逻辑与特殊权限的作用边界已经建立起对应关系。后续无论遇到新建文件权限与预期不符,还是在权限位中看到 `s`、`t` 等标记,都应优先回到机制本身进行判断,而非仅在结果层面反复修补。
欢迎「长按」下方图片👇,关注我们在公众号上的专业知识分享。