Linux /etc/login.defs 详解:用户账户与密码策略的核心配置文件

在 Linux 系统中,用户账户管理和密码策略是系统安全的基石。而 /etc/login.defs 文件作为 shadow 密码套件shadow-utils)的核心配置文件,扮演着至关重要的角色。它定义了用户账户创建的默认规则(如 UID/GID 范围、家目录路径)、密码策略(如密码有效期、最小长度)以及登录会话设置(如登录超时)等关键参数。理解并正确配置 /etc/login.defs,不仅能规范用户管理流程,还能显著提升系统安全性。

本文将深入解析 /etc/login.defs 的结构、核心参数、最佳实践及常见配置示例,帮助系统管理员掌握这一文件的使用方法。

目录#

  1. 文件位置与权限
  2. 核心配置参数详解
  3. 常见实践
  4. 最佳实践
  5. 示例配置
  6. 参考资料

1. 文件位置与权限#

位置#

/etc/login.defs 位于系统的 /etc 目录下,是全局可见的配置文件。

权限#

文件默认权限为 0644(所有者可读写,组和其他用户只读),所有者为 root:root。这一权限设置确保普通用户无法修改系统级配置,仅管理员(root)可调整参数。

$ ls -l /etc/login.defs
-rw-r--r-- 1 root root 11K 2023-10-01 12:00 /etc/login.defs

2. 核心配置参数详解#

/etc/login.defs 的参数按功能可分为四大类,以下逐一解析。

2.1 用户账户默认配置#

此类参数定义了创建普通用户和系统用户时的默认规则,如 UID/GID 范围、家目录路径等。

2.1.1 UID/GID 范围#

  • UID_MIN:普通用户的最小 UID 值(默认:1000,不同发行版可能一致)。

    • 作用:避免与系统账户(如 rootdaemon)的 UID 冲突。
    • 示例:UID_MIN 1000
  • UID_MAX:普通用户的最大 UID 值(默认:60000)。

    • 示例:UID_MAX 60000
  • SYS_UID_MIN/SYS_UID_MAX:系统账户的 UID 范围(默认:100-999)。

    • 系统账户(如 nginxmysql)用于运行服务,通常不需要登录权限。
    • 示例:SYS_UID_MIN 100SYS_UID_MAX 999
  • GID_MIN/GID_MAXSYS_GID_MIN/SYS_GID_MAX:与 UID 对应,定义用户组的 GID 范围(默认与 UID 规则一致)。

2.1.2 家目录与 Shell#

  • CREATE_HOME:创建用户时是否默认创建家目录(默认:yes)。

    • 可选值:yes(创建)、no(不创建)。
    • 示例:CREATE_HOME yesuseradd alice 会自动创建 /home/alice
  • HOME_DIR:家目录的路径模板(默认:/home/%u%u 表示用户名)。

    • 示例:HOME_DIR /home/%u → 用户 bob 的家目录为 /home/bob
  • SHELL:默认登录 Shell(默认:/bin/bash/bin/sh,依发行版而定)。

    • 示例:SHELL /bin/bash → 新用户默认使用 bash

2.1.3 用户组与权限#

  • USERGROUPS_ENAB:是否为用户创建同名私有组(默认:yes)。

    • 作用:避免用户共享默认组(如 users),增强文件权限隔离。
    • 示例:USERGROUPS_ENAB yes → 创建用户 alice 时自动创建组 alice,并将用户加入该组。
  • UMASK:家目录的默认权限掩码(默认:022)。

    • 计算方式:实际权限 = 777 - UMASK → 022 对应 755(rwxr-xr-x)。
    • 示例:UMASK 027 → 家目录权限为 750(仅用户和组可访问)。

2.2 密码策略配置#

此类参数控制密码的生命周期和强度,是系统安全的核心。

2.2.1 密码有效期#

  • PASS_MAX_DAYS:密码最大有效期(默认:99999,即永不过期)。

    • 安全建议:设置为 90 天(每季度更换一次)。
    • 示例:PASS_MAX_DAYS 90
  • PASS_MIN_DAYS:密码修改间隔(默认:0,即允许立即修改)。

    • 安全建议:设置为 7 天,防止用户频繁更换密码绕过策略。
    • 示例:PASS_MIN_DAYS 7
  • PASS_WARN_AGE:密码过期前警告天数(默认:7)。

    • 示例:PASS_WARN_AGE 14 → 过期前 14 天开始提醒用户。

2.2.2 密码强度#

  • PASS_MIN_LEN:密码最小长度(默认:5 或 6,依发行版而定)。

    • 安全建议:设置为 10 以上,并结合 PAM 模块(如 pam_cracklib)增强复杂度。
    • 示例:PASS_MIN_LEN 12
  • PASS_ALWAYS_WARN:即使密码未过期,登录时是否提示密码状态(默认:no)。

    • 示例:PASS_ALWAYS_WARN yes → 登录时显示密码剩余有效期。

2.3 登录会话设置#

此类参数控制用户登录过程中的行为,如超时时间、登录提示等。

  • LOGIN_TIMEOUT:登录提示符超时时间(秒,默认:60)。

    • 作用:防止未完成的登录会话长期占用终端。
    • 示例:LOGIN_TIMEOUT 30 → 30 秒无输入则断开连接。
  • MOTD_FILE:登录后显示的“每日消息”(MOTD)文件路径(默认:/etc/motd)。

    • 示例:MOTD_FILE /etc/motd → 用户登录后显示 /etc/motd 内容。
  • FAILED_LOGIN_DELAY:登录失败后的延迟时间(秒,默认:0)。

    • 安全建议:设置为 2 秒,缓解暴力破解风险。
    • 示例:FAILED_LOGIN_DELAY 2

2.4 影子文件(Shadow)相关配置#

影子文件(/etc/shadow)存储用户密码哈希,此类参数控制其加密方式和安全性。

  • ENCRYPT_METHOD:密码加密算法(默认:SHA512)。

    • 可选值:MD5(不安全,不推荐)、SHA256SHA512(推荐)。
    • 示例:ENCRYPT_METHOD SHA512 → 使用 SHA-512 加密密码。
  • SHA_CRYPT_MIN_ROUNDS/SHA_CRYPT_MAX_ROUNDS:SHA 加密的迭代次数(默认:5000/50000)。

    • 作用:次数越高,破解哈希的难度越大(但会增加 CPU 开销)。
    • 示例:SHA_CRYPT_MIN_ROUNDS 10000SHA_CRYPT_MAX_ROUNDS 20000

3. 常见实践#

以下是日常管理中高频使用的配置场景:

3.1 规范 UID/GID 分配#

  • 保持 UID_MIN=1000UID_MAX=60000,避免手动指定 UID 时与系统账户冲突。
  • 系统账户(如数据库、Web 服务)使用 SYS_UID_MIN-SYS_UID_MAX 范围内的 UID,例如:
    useradd -r -u 1001 mysql  # -r 表示系统账户,UID 1001 位于 100-999 范围内

3.2 强制密码定期更换#

PASS_MAX_DAYS 从默认的 99999 改为 90,并配合 PASS_WARN_AGE=14,确保用户及时更换密码:

PASS_MAX_DAYS   90
PASS_MIN_DAYS   7
PASS_WARN_AGE   14

3.3 限制家目录权限#

通过 UMASK 控制家目录默认权限,例如 UMASK 027 确保其他用户无法访问:

UMASK 027  # 家目录权限为 rwxr-x--- (750)

4. 最佳实践#

4.1 定期审计配置#

  • 使用 grep 检查关键参数是否符合安全要求:
    grep -E 'PASS_MAX_DAYS|PASS_MIN_LEN|ENCRYPT_METHOD' /etc/login.defs

4.2 结合 PAM 增强安全性#

/etc/login.defs 的部分参数(如密码复杂度)需依赖 PAM 模块(如 pam_cracklib)补充。例如,在 /etc/pam.d/system-auth 中添加:

password    requisite     pam_cracklib.so minlen=12 ucredit=-1 lcredit=-1 dcredit=-1 ocredit=-1

(要求密码至少 12 位,包含大小写字母、数字和特殊字符)。

4.3 避免使用 deprecated 参数#

部分旧参数已被淘汰,例如 MD5_CRYPT_ENAB(已被 ENCRYPT_METHOD 取代),需确保配置文件中无此类参数。

4.4 保持配置一致性#

若管理多台服务器,建议通过 Ansible、SaltStack 等工具统一同步 /etc/login.defs,避免策略碎片化。

5. 示例配置#

以下是一个符合安全最佳实践的 /etc/login.defs 片段:

# 用户账户配置
UID_MIN                  1000
UID_MAX                  60000
SYS_UID_MIN              100
SYS_UID_MAX              999
GID_MIN                  1000
GID_MAX                  60000
SYS_GID_MIN              100
SYS_GID_MAX              999
CREATE_HOME              yes
HOME_DIR                 /home/%u
SHELL                    /bin/bash
USERGROUPS_ENAB          yes
UMASK                    027
 
# 密码策略
PASS_MAX_DAYS            90
PASS_MIN_DAYS           7
PASS_WARN_AGE            14
PASS_MIN_LEN             12
PASS_ALWAYS_WARN         yes
 
# 登录会话设置
LOGIN_TIMEOUT            30
FAILED_LOGIN_DELAY       2
MOTD_FILE                /etc/motd
 
# 影子文件配置
ENCRYPT_METHOD           SHA512
SHA_CRYPT_MIN_ROUNDS     10000
SHA_CRYPT_MAX_ROUNDS     20000

6. 参考资料#

通过本文的解析,相信你已掌握 /etc/login.defs 的核心配置逻辑。合理调整参数,不仅能规范用户管理,更能为系统筑牢安全防线。