背景/行为是:如果你通过 ssh 连接到 box,并且 GSSAPI/Kerberos 成功,并且你有一个本地用户密码文件 /etc/passwd,您按照以下 PAM 配置成功登录。一切正常。
但如果你没有本地用户密码文件 /etc/passwd但您可以获得 host/XXXXXX 服务票证(GSSAPI 有效),sshd 登录失败,并且永远不会收到 SecurID 提示(我们的 pam radius 指向 SecurID)。我理解这一点。由于服务器“验证”了用户和 pam_unix知道用户不在 /etc/passwd 中,因此无需使用任何其他身份验证方法。
但是,我的问题是,为什么如果我第一次运行 kdestroy(故意让 GSSAPI 失败),(并且仍然不存在于 /etc/passwd 中)我会突然收到 Securid 提示(即 PAM 已启动)?
运行带有调试功能的 sshd 时显示:针对无效用户“user”推迟键盘交互。首先,为什么它不会简单地失败?其次,为什么要延迟?pam_radius 是“必需的”,而不是“必需的”。
我预计也会失败,因为即使我没有经过身份验证,我也永远无法通过 pam_unix。
文件:
/etc/ssh/sshd_config
....
ChallengeResponseAuthentication yes
GSSAPIAuthentication yes
HostbasedAuthentication no
KerberosAuthentication no
PasswordAuthentication no
PubkeyAuthentication yes
RhostsRSAAuthentication no
RSAAuthentication yes
UsePAM yes
....
sshd 配置文件
auth requisite pam_radius_auth.so conf=pam_radius_auth.conf debug retry=3
auth required pam_nologin.so
auth required pam_krb5.so.1
account sufficient pam_radius_auth.so conf=pam_radius_auth.conf
account required pam_stack.so service=system-auth
password required pam_stack.so service=system-auth
session required pam_stack.so service=system-auth
session required pam_limits.so
session optional pam_console.so
/etc/pam.d/系统身份验证
auth required pam_env.so
auth sufficient pam_krb5.so.1
auth sufficient pam_unix.so
auth required pam_deny.so
account required pam_unix.so
password required pam_cracklib.so retry=3
password sufficient pam_unix.so use_authtok md5 shadow
password required pam_deny.so
session required pam_limits.so
session required pam_unix.so
答案1
GSSAPI 身份验证不由 PAM 处理。kerberos 的 PAM 模块用于对用户进行密码身份验证,使用 kerberos 协议获取有效票证。
GSSAPI 认证有 3 种结果。
- 身份验证失败,因为已发送凭证但凭证无效。
- 使用所提供的凭证验证成功。
- 由于未提供任何凭证,因此身份验证被忽略。
如果结果为 1,则请求被直接拒绝,因为已发送令牌但失败了。SSHD 不会尝试其他身份验证方法。
如果结果为 3,sshd
接下来将尝试其他身份验证方法,其中包括 PAMauth
部分。
我不太熟悉,pam_radius
但我认为出于安全原因,无论用户是否存在,它都会请求身份验证令牌。如果失败,则立即向用户/攻击者表明此类用户确实不是存在,因此通过消除过程,您可以枚举用户。
至于“requisite”选项,在给定的堆栈设置中,“required”和“requisite”具有相同的效果。pam_krb
无论如何都无法在没有有效用户的情况下请求票证,因此它最终会立即失败。
因为给出的配置pam_unix
不是用于身份验证而是用于授权,这是身份验证之后发生的步骤。澄清一下:身份验证用于证明您是您所说的那个人,而授权用于让您拥有正确的权限来执行您想做的事情(在本例中是登录)。