pam(3)-pam_securetty.so

pam_securetty.so 是 Linux PAM(Pluggable Authentication Modules)框架中的一个模块,主要用于限制 root 用户只能从指定的“安全终端”(secure tty)登录。它通过检查登录请求的终端设备是否在 /etc/securetty 文件中列出,来决定是否允许 root 用户登录。这种机制最初设计是为了增强系统安全性,防止 root 从不安全的终端(如远程网络连接)直接登录。


功能

  • 限制 root 登录终端pam_securetty.so 检查当前登录请求的终端设备(tty)是否被认为是“安全的”。
  • 依赖 /etc/securetty 文件:该文件列出了允许 root 登录的终端设备名称(如 tty1pts/0)。
  • **仅影响 root**:通常只对 UID 为 0 的用户(即 root)生效,对普通用户无限制。

使用场景

  • 在需要严格控制 root 登录的环境中,例如物理服务器或嵌入式系统。
  • 防止 root 通过不安全的远程终端(如某些 telnet 配置)登录。

工作原理

  1. 当应用程序(如 loginsshd)调用 PAM 的 auth 栈时,pam_securetty.so 被触发。
  2. 模块检查当前登录的终端设备名称(例如 tty1pts/0)。
  3. 将终端名称与 /etc/securetty 文件中的条目进行比对:
    • 如果终端在文件中列出,认证通过。
    • 如果不在,针对 root 用户返回失败。
  4. 返回结果给 PAM 框架,由控制标志决定后续流程。

配置示例

在 PAM 配置文件中(例如 /etc/pam.d/login),可能会看到如下条目:

auth  required  pam_securetty.so
  • 类型auth 表示用于认证阶段。
  • 控制标志required 表示此模块必须通过,否则认证失败。
  • 模块pam_securetty.so

/etc/securetty 文件

该文件是一个纯文本文件,每行指定一个允许 root 登录的终端名称。示例内容:

tty1
tty2
tty3
pts/0
  • tty1, tty2 等:物理终端。
  • pts/0:伪终端,通常用于 SSH 或图形界面。

如果文件为空或不存在,pam_securetty.so 默认拒绝 root 从任何终端登录。

参数

pam_securetty.so 支持少量可选参数:

  • debug:启用调试输出,将日志写入系统日志。
  • noconsole:忽略控制台设备(较少使用)。

示例:

auth  required  pam_securetty.so  debug

注意事项

  1. 现代系统的局限性
    • 在现代 Linux 发行版中,pam_securetty.so 的使用逐渐减少,因为 SSH 等远程登录工具已成为主流,而 SSH 默认不允许 root 直接登录(通过 PermitRootLogin 配置控制)。
    • 伪终端(pts/*)的广泛使用也削弱了其作用,因为需要手动在 /etc/securetty 中列出所有可能的 pts 设备并不实用。
  2. 兼容性
    • 如果系统中没有 /etc/securetty 文件,模块行为可能因实现而异(某些版本可能默认允许登录)。
  3. 安全性
    • 依赖静态文件配置,可能无法应对动态环境,建议结合其他模块(如 pam_tally2.so)增强防护。

典型应用

假设系统配置如下:

  • /etc/pam.d/login 中包含 auth required pam_securetty.so
  • /etc/securetty 只列出 tty1

结果:

  • root 只能通过物理终端 tty1 登录。
  • tty2pts/0(如 SSH)登录时,pam_securetty.so 会拒绝。

总结

pam_securetty.so 是一个简单但历史悠久的 PAM 模块,适合需要限制 root 登录终端的场景。然而,随着现代安全实践(如禁用 root 远程登录、强制使用 sudo)的普及,其重要性已有所下降。