pam(4)-pam_nologin.so

pam_nologin.so 是 Linux PAM(Pluggable Authentication Modules)框架中的一个模块,用于根据系统状态限制用户登录。它主要通过检查 /etc/nologin 文件是否存在来决定是否允许用户(通常是非 root 用户)登录。如果该文件存在,模块会阻止登录并显示文件中定义的消息,通常用于系统维护或关闭期间限制访问。


功能

  • 限制登录:当 /etc/nologin 文件存在时,阻止普通用户登录。
  • **仅允许 root**:默认情况下,root 用户可以绕过此限制,继续登录。
  • 自定义消息:如果 /etc/nologin 文件包含文本,登录被拒绝时会显示该文本作为提示。

使用场景

  • 系统维护:管理员在进行系统更新或维护时,创建 /etc/nologin 文件以阻止普通用户登录。
  • 系统关闭前:在系统计划关闭前,通知用户并限制新登录。
  • 安全控制:临时限制访问以应对潜在威胁。

工作原理

  1. 应用程序(如 loginsshd)调用 PAM 的 authaccount 栈时,触发 pam_nologin.so
  2. 模块检查 /etc/nologin 文件是否存在:
    • 如果文件不存在,认证通过,允许登录。
    • 如果文件存在:
      • 检查当前用户是否为 root
      • 如果是普通用户,返回失败并显示 /etc/nologin 中的消息。
      • 如果是 root,根据模块参数决定是否允许登录。
  3. 将结果返回给 PAM 框架,由控制标志决定后续流程。

配置示例

在 PAM 配置文件中(例如 /etc/pam.d/sshd/etc/pam.d/login),常见用法如下:

auth  required  pam_nologin.so
  • 类型:通常用于 auth(认证阶段)或 account(账户检查阶段)。
  • 控制标志required 表示此模块必须通过,否则登录失败。
  • 模块pam_nologin.so

/etc/nologin 文件

  • 如果文件不存在,模块不起作用,允许所有用户登录。
  • 如果文件存在且为空,用户会被拒绝登录,默认提示为类似“系统维护中,请稍后再试”。
  • 如果文件中包含自定义文本,例如:
    系统将于 2025-03-22 凌晨进行维护,请稍后尝试登录。
    用户在登录失败时会看到该消息。

参数

pam_nologin.so 支持以下可选参数:

  • no_root:禁止 root 用户登录(默认情况下 root 可以登录)。
  • successok:即使 /etc/nologin 不存在,也返回成功(用于特定逻辑调整)。
  • debug:启用调试输出,记录到系统日志。

示例:

auth  required  pam_nologin.so  no_root

e8c05c139b739b3bb93dcb429408742f.png

注意事项

  1. 行为差异
    • 在某些系统(如 Debian 或 Ubuntu),pam_nologin.so 默认允许 root 登录,除非指定 no_root 参数。
  2. 与其他模块的交互
    • 如果与其他认证模块(如 pam_unix.so)组合使用,需注意执行顺序,确保 pam_nologin.so 在适当位置检查。
  3. SSH 和其他服务
    • 对于 sshd,需要在 /etc/pam.d/sshd 中配置此模块,否则不会生效。

典型应用

假设系统配置如下:

  • /etc/pam.d/login 中包含 auth required pam_nologin.so
  • 创建 /etc/nologin 文件,内容为“系统维护中”。

结果:

  • 普通用户尝试登录时会看到“系统维护中”并被拒绝。
  • root 用户仍可登录(除非使用 no_root 参数)。

总结

pam_nologin.so 是一个简单而有效的工具,用于在特定情况下限制用户登录,特别适合系统管理员在维护或紧急情况下使用。其配置简单,主要依赖 /etc/nologin 文件的状态,易于集成到现有 PAM 策略中。