使用 UsePAM 进行基于密码和 SSH 密钥的过期登录 是

the*_*ion 12 users password ssh pam

有一台 SLES 11 机器。用户通过 SSH 和 pubkey 登录(混合,一些用户使用密码,一些用户使用 ssh 密钥)

sshd_config 有:

UsePAM yes
PasswordAuthentication yes
PubkeyAuthentication yes
Run Code Online (Sandbox Code Playgroud)

问题:如果使用公钥登录的用户密码过期,则会提示用户更改密码。

问题:如果用户拥有有效的 SSH 密钥并且密码已过期,我们如何设置 PAM 或 sshd 配置以允许用户登录?-没有弹出“更改密码”。

更新#1:解决方案不能是:“UsePAM no”

SERVER:~ # cat /etc/pam.d/sshd 
#%PAM-1.0
auth        requisite   pam_nologin.so
auth        include     common-auth
account     requisite   pam_nologin.so
account     include     common-account
password    include     common-password
session     required    pam_loginuid.so
session     include     common-session
SERVER:~ # 
Run Code Online (Sandbox Code Playgroud)

更新#2:解决办法不能是:将用户密码设置为永不过期

更新#3:

SERVER:/etc/pam.d # cat common-account
#%PAM-1.0
...
account required    pam_unix2.so    
account required    pam_tally.so
SERVER:/etc/pam.d # 
Run Code Online (Sandbox Code Playgroud)

Jan*_*der 13

导致密码过期提示的操作顺序如下:

  • SSH 运行 PAMaccount阶段,它验证帐户是否存在且有效。这account阶段注意到密码已过期,并通知 SSH。
  • SSH 执行基于密钥的身份验证。它不需要 PAM,所以它不运行auth舞台。然后它设置 SSH 登录会话并运行 PAMsession阶段。
  • 接下来,SSH 记住 PAM 告诉它密码已过期,打印一条警告消息,并要求 PAM 让用户更改密码。SSH 然后断开连接。

所有这些都是 SSH 所做的,我看不到任何 SSH 选项来配置此行为。因此,除非您想构建自定义版本的 SSH 和/或 PAM,否则我看到的唯一选择是阻止 PAM 向 SSH 报告过期密码。如果您这样做,它将完全禁用通过 SSH 进行的过期密码检查,即使用户使用密码通过 SSH 登录。其他(非 SSH)登录方法仍将检查密码过期。

您当前的pam.d/sshd文件有一个account include common-account条目。我认为有一个common-account文件包含对pam_unix.so. 这是检查过期密码的行。

您可能不想接触common-account文件本身,因为它用于其他登录方法。相反,您希望includepam.d/sshd文件中删除。如果有其他的功能common-account之外pam_unix.so,你可能想要把它们直接进入pam.d/sshd

最后,请记住,这是对您系统安全性的修改,您不应盲目相信我会为您提供好的建议。如果您不熟悉 PAM,请阅读 PAM 的工作原理。有些地方开始可能是man 7 PAMman 5 pam.confman 8 pam_unix


小智 6

一个选项被添加到 pam_unix.so(大约 2016 年 2 月),称为 no_pass_expiry(源代码更改在这里手册页在这里)。基本上,它告诉 pam_unix 如果使用 pam_unix 以外的其他东西进行身份验证,则忽略过期的密码,例如,如果 sshd 执行了身份验证。

因此,如果您的 pam_unix.so 版本包含该选项,您应该能够将 PAM 配置为:

  1. 如果使用 SSH 密钥通过 ssh 进行身份验证,仍会发出警告但不需要更改过期密码
  2. 如果通过 pam_unix.so 的登录名/密码用于通过 ssh 进行身份验证,则需要对过期密码进行密码更改
  3. 不影响任何其他身份验证序列(例如,通过登录服务)。

例如,我通过简单地更新 /etc/pam.d/sshd 并将 pam_unix.so no_pass_expiry 添加到帐户和密码类型来配置 RHEL 7 服务器来执行上述操作,例如

account    required    pam_nologin.so
account    sufficient  pam_unix.so no_pass_expiry
account    include     password-auth
password   sufficient  pam_unix.so no_pass_expiry
password   include     password-auth
Run Code Online (Sandbox Code Playgroud)