仅运行 umask 027 不足以实现生产环境严格权限控制,必须通过 /etc/login.defs 设置 UMASK 027 控制新用户初始值,并在 PAM 的 common-session 或 system-auth 中添加 session optional pam_umask.so umask=0027 实现全路径生效,最后实测新建文件(-rw-r-----)和目录(drwxr-x---)权限。

直接结论:仅运行 umask 027 不足以在生产环境实现严格权限控制;必须通过 /etc/login.defs + PAM 双层配置,并实测新建文件/目录权限是否符合预期(-rw-r----- 和 drwxr-x---)。
为什么 umask 027 临时设置不生效于 su/sudo/cron?
因为 umask 命令只影响当前 shell 进程,而 su -、sudo -i、systemd --user 或 crond 启动的子 shell 并不读取你的 ~/.bashrc 或 /etc/profile。它们绕过 shell 初始化流程,直接由 PAM 模块接管会话初始化。
常见错误现象:
- 你在终端执行
umask 027后touch f得到-rw-r-----,但sudo -i touch f2却生成-rw-rw-r-- - 新用户用
useradd创建后首次登录,umask显示仍是0002或0022
根本原因:PAM 未加载 pam_umask.so,或配置顺序错误(必须放在 session 段且非 required 级别)。
如何正确配置全局 umask 027?
必须同时修改两个位置,缺一不可:
- 编辑
/etc/login.defs,确保有未注释行:UMASK 027—— 这控制useradd创建的新用户首次登录时的初始值 - 编辑
/etc/pam.d/common-session(Debian/Ubuntu)或/etc/pam.d/system-auth(RHEL/CentOS),在session段末尾添加:session optional pam_umask.so umask=0027 - 若系统无
pam_umask.so(如旧版 Ubuntu),先安装:apt install libpam-umask或yum install pam
注意:UMASK 027 在 /etc/login.defs 中写三位即可,PAM 配置中推荐写四位 0027(兼容性更好)。
验证时不能只看 umask 命令输出
umask 命令只显示当前 shell 的值,不代表真实创建行为。必须新开干净会话并实测:
- SSH 重连,或开新 TTY(Ctrl+Alt+F2),避免继承旧环境变量
- 执行:
umask && touch testf && mkdir testd && ls -ld testf testd - 期望结果:
-rw-r-----(文件)和drwxr-x---(目录) - 若目录是
drwxr-xr-x或文件是-rw-rw-r--,说明 PAM 未生效或配置被覆盖
特别注意:某些服务(如 systemd user session、某些容器 init)可能忽略 PAM,需单独检查其启动脚本是否硬编码了 umask。
umask 027 对已有文件无效,且不改变默认执行位
umask 只影响“新创建”的文件和目录,它不会递归修复已有内容。另外,内核强制规则始终生效:
- 普通文件永远不会有执行位(即使 umask 是 000),所以
touch出来的文件权限上限是666,不是777 - 目录必须保留 x 位才能被进入,因此 umask 027 下目录是
750(rwxr-x---),不是755或740 - 如果你需要已有敏感文件(如
/etc/shadow、密钥)也符合 027 语义,得手动跑chmod 640 /path/to/file或用find批量修正
最易被忽略的一点:USERGROUPS_ENAB yes 在 /etc/login.defs 中启用后,每个用户创建私有组(同名组),能避免 umask 027 下组权限意外开放给其他用户——这点在多用户协作服务器上非常关键,但常被跳过。


















