dgy*_*i92 6 ssh kerberos authentication pam
我正在尝试为 OpenSSH 实施两因素身份验证。环境是 Centos 7(内核:3.10.0-229.1.2.el7.x86_64)和 OpenSSH_6.6.1p1,OpenSSL 1.0.1e-fips 2013 年 2 月 11 日。我们部署了 Active Directory (LDAP) + Kerberos。规格如下:
为了执行第二个因素的身份验证过程,有第 3 方可用的 PAM 模块,它对 Kerberos 一无所知。所以这就是我所做的:
将这些行放入 /etc/ssh/sshd_config:
# To enable PAM - this will make sshd use PAM with configuration /etc/pam.d/sshd
UsePam yes
ChallengeResponseAuthentication yes
# To enable Kerberos and public key authentication - it will let sshd use existing Kerberos tickets
GSSAPIAuthentication yes
# Enable public key authentication
PubkeyAuthentication yes
# Password validation should be done via the KDC
PasswordAuthentication yes
KerberosAuthentication yes
KerberosOrLocalPasswd yes
# Kerberos / Public Key + PAM
AuthenticationMethods gssapi-with-mic,keyboard-interactive:pam publickey,keyboard-interactive:pam password,keyboard-interactive:pam
# (only supported for OpenSSH 6.2 or higher)
Run Code Online (Sandbox Code Playgroud)
sshd 的 PAM 配置的 auth 部分 (/etc/pam.d/sshd)
auth [success=ignore default=1] pam_localuser.so
auth substack password-auth
auth [success=1 default=ignore] pam_localuser.so
auth required pam_2fa.so [...some arguments...]
auth include postlogin
Run Code Online (Sandbox Code Playgroud)
模块 pam_2fa.so 负责提示和验证第二个因素。
现在对于 Kerberos,这几乎完成了我想要实现的所有目标。但是,对于本地帐户,它会导致两个后续密码提示。这是我在这里的主要问题。这是因为在这种情况下,按预期使用了路径“password,keyboard-interactive:pam”。(我需要此身份验证路径,因此拥有 Kerberos 帐户但没有有效票证的人可以通过输入密码然后输入 OTP 来获得票证。)如果我从 PAM 配置中完全删除密码身份验证子堆栈,则 Kerberos 帐户仍然有效并且本地帐户仍然无法使用。对我来说,似乎 KerberosOrLocalPasswd yes 语句被忽略了,因为 UsePAM yes 也存在。但是,sshd 确实一直使用 KDC 进行密码验证,否则它也不适用于 LDAP 帐户。
同样,为了进一步澄清我希望在这里实现的是描述所需身份验证逻辑的伪代码:
if gssapi_auth_ok(principal) or pubkey_auth_ok(pubkey):
return second_factor_auth(user, read_otp())
else:
if is_local_account(user):
if local_passwd_auth(user, read_password()):
return second_factor_auth(user, read_otp())
else:
return AUTH_ERR
else:
if krb5_auth(principal, read_password()):
return second_factor_auth(user, read_otp())
return AUTH_ERR
Run Code Online (Sandbox Code Playgroud)
所以我认为我的方案在任何方面都不太复杂或雄心勃勃,但尽管我花了几天的时间研究和试验,我仍然找不到一个明确的方法来实现它。你能帮我找到解决办法吗?
非常感谢您提前!
我不知道有什么方法可以在不编写新的 pam 模块的情况下使用 PAM 完成您想要的操作。PAM 相对复杂,根据我的经验,sshd 与 PAM 和 kerberos 交互的方式总是存在不起作用的边缘情况。
你想要的也许是可能的,我只是不知道该怎么做。如果您只需要保护 ssh 我建议使用
ForceCommand /path/to/2fa_executable
Run Code Online (Sandbox Code Playgroud)
在你的 sshd_config 中。这将允许您实现您想要的逻辑,缺点是 2fa_executable 需要设置uid 才能读取任何 2fa 秘密。
Duo Security 网站上有示例和代码。您可以使用 duo setuid 包装器以及您正在使用的任何 2fa 代码。
| 归档时间: |
|
| 查看次数: |
3609 次 |
| 最近记录: |