login.defs 是什么
/etc/login.defs 是 shadow-utils 的全局配置文件,被 useradd、usermod、userdel、passwd、chage 等工具读取,用来决定 UID 与 GID 的分配区间、是否创建家目录、默认 umask、密码有效期等默认值。它属于「账号工具的默认参数」,不是认证机制:真正校验密码复杂度与登录规则的是 PAM。
基本信息
| 适用平台 | Linux(shadow-utils,Debian 系为 passwd 包,路径相同) |
|---|---|
| 配置文件 | /etc/login.defs |
| 影响工具 | useradd、usermod、passwd、chage、su 等 |
| 典型条目 | UID_MIN 与 UID_MAX、SYS_UID_MAX、GID_MIN、CREATE_HOME、UMASK、PASS_MAX_DAYS |
| 生效方式 | 立即对后续工具调用生效,无需重启;不影响已有账号 |
典型使用场景
- 合规落地:设定密码有效期与最小修改间隔、过期前警告天数
- 统一新建账号行为:强制创建家目录、固定 umask,避免各机器不一致
- 账号区间规划:把业务账号固定在高位 UID 段,便于审计与批量管理
- 排查「改了策略却不生效」:先确认是 login.defs 还是 PAM 在起作用
- 迁移对齐:新老机器保持同一套默认值,减少账号属性差异
关键参数示例
关键参数示例
PASS_MAX_DAYS 90 # 密码最长有效期(天)
PASS_MIN_DAYS 7 # 两次修改的最小间隔,防止立刻改回去
PASS_WARN_AGE 14 # 过期前提前警告天数
CREATE_HOME yes # useradd 默认创建家目录
UMASK 027 # 新建文件与目录的默认权限掩码
UID_MIN 1000 # 普通用户 UID 起始值
UID_MAX 60000 # 普通用户 UID 上限
SYS_UID_MAX 999 # 系统账号 UID 上限查看与验证
查看与验证
grep -E '^(PASS_|UMASK|CREATE_HOME|UID_MIN|UID_MAX|SYS_UID_MAX)' /etc/login.defs
grep -v '^#' /etc/login.defs | grep -v '^$' # 只看有效行
getent shadow alice | cut -d: -f1,3,4,5 # 核对账号实际落地的策略
chage -l alice # 查看账号有效期现状关键项与影响范围
| 配置项 | 作用 | 影响范围 |
|---|---|---|
| PASS_MAX_DAYS | 密码最长有效期 | passwd 与 chage 计算过期时间;已有账号需单独 chage |
| PASS_WARN_AGE | 过期前警告天数 | 登录时给出提示 |
| CREATE_HOME | useradd 是否默认创建家目录 | 仅影响未显式指定 -m 或 -M 的创建操作 |
| UMASK | 新建文件默认权限掩码 | 经 PAM 登录时由 pam_umask 采用 |
| UID_MIN 与 SYS_UID_MAX | 普通账号与系统账号的 UID 分界 | 影响 useradd 自动分配 UID 的结果 |
login.defs 只影响创建与检查工具的默认值;密码复杂度、失败锁定、有效期是否真的强制执行,落在 PAM 配置上(常见的是 pam_pwquality 与 pam_unix 的对应参数)。改了这里却「没效果」,多半是没改到 PAM。
UMASK 只在通过 PAM 登录时由 pam_umask 采用;systemd 用户的默认 umask 由 logind.conf 的 DefaultUMask 决定,而服务进程会被单元里的 UMask= 覆盖。三处都可能有值,排查「新建文件权限不对」时都要确认。
验证策略是否真的落地,不要只看配置文件:chage -l 看某个账号的实际有效期,getent shadow 看密码最后修改时间,再新建一个测试账号看生成结果。三步走完才能确认「配置写了」和「账号上生效了」是一回事。