umask是Linux中控制新文件和目录默认权限的核心机制,通过屏蔽危险权限位实现安全兜底,推荐生产环境全局配置为027或077,并结合PAM统一管控以确保su、sudo、cron等场景生效。

直接在系统级配置 umask 是加固新文件安全最基础也最有效的手段。关键不是“加权限”,而是从源头屏蔽掉不该开放的访问位,尤其防止敏感配置、日志、密钥文件被组内或外部用户意外读取。
优先修改 /etc/login.defs 实现全局生效
这是对所有新创建用户都起效的标准位置,生产环境推荐值为 027 或 077:
- UMASK 027:目录为 750(属主全权、组可进可列、其他无权),文件为 640(属主读写、组只读、其他无权)——适合需组内协作但隔离外部的场景
- UMASK 077:目录为 700,文件为 600——彻底私有,适用于数据库管理员、密钥管理等高敏账户
- 编辑 /etc/login.defs,确保存在且未被注释的行:
UMASK 027 - 该设置仅影响新用户;已有用户需新建会话或重新登录才继承
补充 PAM 统一管控,覆盖 su/sudo 等非标准登录
/etc/login.defs 对某些登录方式(如 su -、sudo -i、systemd 用户服务)可能不生效,PAM 方式更可靠:
- 编辑 /etc/pam.d/common-session(Debian/Ubuntu)或 /etc/pam.d/system-auth(RHEL/CentOS)
- 追加一行:
session optional pam_umask.so umask=0077 - PAM 设置优先级高于 shell 配置,且对 cron 脚本调用的子 shell 也有效(只要其通过 PAM 启动)
验证必须做两件事:看值 + 看文件
改完不验证等于没改。不能只运行 umask,要确认真实创建行为:
- 在干净终端中执行:
umask && touch testf && mkdir testd && ls -ld testf testd - 预期结果示例(umask 027):
-rw-r----- 1 user group ... testf和drwxr-x--- 2 user group ... testd - 特别注意:非交互式 shell(如 crond 执行的脚本)默认不加载 ~/.bashrc,若脚本需严格权限,应在脚本开头显式写
umask 027
避免常见失效陷阱
很多配置看似写了却无效,问题常出在加载路径和 shell 类型:
- 只改了 ~/.bashrc,但系统用的是 ~/.bash_profile 启动——检查后者是否包含
source ~/.bashrc,否则直接把 umask 行写进 ~/.bash_profile - 用户 shell 是 zsh 或 fish,却去改 bash 配置文件——先查
echo $SHELL,再改对应配置(如 ~/.zshrc) - 误以为
umask 000能让文件带 x 权限——内核强制过滤普通文件的执行位,新建文件永远不会有 x,哪怕 umask 是 000

















