umask 决定新文件的权限
umask 是权限的“掩码”:新建文件从 666 出发、新建目录从 777 出发,减去 umask 得到实际权限。默认 022 会让同组和其他用户都能读(文件 644、目录 755),收敛为 027 后新文件是 640、新目录是 750,从源头减少信息暴露。两个边界要记住:umask 只管新建对象,历史文件权限不会跟着变;systemd 起服务时有自己的 UMask 默认值,改 shell 层配置影响不到服务。
基本信息
| 加固项 | 新文件与新目录默认权限收紧 |
|---|---|
| 适用平台 | Linux(RHEL/CentOS、Debian/Ubuntu) |
| 权限要求 | root 改全局,普通用户可改自己会话 |
| 基线值 | /etc/login.defs 中 UMASK 027 |
| 配套位置 | shell 启动脚本、systemd 服务单元 UMask |
典型使用场景
- 主机基线巡检中确认默认权限不是 022
- 多用户服务器上避免新文件被同组随意读取
- 日志、配置导出脚本产出的文件默认就更紧
- 应用账号专用的 profile.d 脚本里单独设置更严的 umask
- 排查“新文件权限异常”问题时定位是哪一层覆盖了配置
核查与加固
核查与加固
umask # 当前会话的实际值,期望 0027
grep -E '^UMASK' /etc/login.defs # 全局默认值来源
grep -rn 'umask' /etc/profile /etc/bashrc /etc/profile.d/ 2>/dev/null # 找出有没有别处覆盖
sed -i 's/^UMASK.*/UMASK 027/' /etc/login.defs
printf 'umask 027\n' > /etc/profile.d/umask.sh && chmod 644 /etc/profile.d/umask.sh取值对照
| umask | 新文件 | 新目录 | 说明 |
|---|---|---|---|
| 022 | 644 | 755 | 默认值,其他用户可读 |
| 027 | 640 | 750 | 基线推荐,仅属主与同组可访问 |
| 077 | 600 | 700 | 最严,适合无同组协作的场景 |
| 002 | 664 | 775 | 同组可写,共享目录场景常见 |
核查命令速查
| 看当前值 | umask |
|---|---|
| 看全局缺省 | grep -E '^UMASK' /etc/login.defs |
| 找覆盖位置 | grep -rn 'umask' /etc/profile /etc/bashrc /etc/profile.d/ |
| 看服务生效值 | systemctl show <unit> -p UMask |
不少发行版在 /etc/profile 或 /etc/bashrc 里显式写了 umask(Debian 系常见 umask 022),它的执行时机晚于 /etc/login.defs,会直接覆盖配置值。只改 login.defs 往往看不到效果,必须同时检查并统一 shell 层的设置,改完新开一个会话用 umask 命令复核。
systemd 服务的默认 UMask 是 0022,由服务单元而非 shell 决定。要让服务产出更严权限,需要在单元文件里写 UMask=0027;用 drop-in(systemctl edit <unit>)覆盖比直接改发行版自带单元更易维护。
验证时别只读配置文件:用 touch 建一个文件和一个目录,再用 stat -c '%a %n' 看实际权限,得到的是真实生效值。不同进入路径(SSH 登录、su、sudo -i、cron)加载的启动脚本不一样,实测更能反映真实差异。