使用 ssh 密钥身份验证和 yubikey 进行两因素身份验证?

信息安全 SSH 优比键
2021-09-09 00:12:32

如果配置了公钥 (RSA) 身份验证并且客户端提供了有效密钥,则 OpenSSH 根本不会调用 PAM。因此,如果您使用基于密钥的身份验证,则无法轻松实施 2FA。

此限制的一种解决方法是编写一个帮助程序,该程序将提示输入 Yubikey OTP。这个帮助程序安排在用户使用 ForceCommand 指令成功认证后由 sshd 执行。示例:https ://www.berrange.com/posts/2011/12/18/multi-factor-ssh-authentication-using-yubikey-and-ssh-public-keys-together/

由于我不相信我的 shell 编程知识(处理信号、tty 分配等)来查看帮助程序,所以我一直在寻找不同的东西。

以下替代方法中有哪些漏洞?

  • 配置 yubikey 为基于 ssh 密码的身份验证执行 2FA。

  • 每个登录名“X”都会有一个名为“pre-X”的“堡垒”登录名。

  • 两个登录名将存在于同一台机器上

  • 一个 sshd 实例

  • 使用 Match sshd 配置指令,ssh 服务器将被配置为禁止对匹配模式“pre-*”的所有登录名进行公钥身份验证。

  • 'bastion' 登录将在没有主目录的情况下创建,登录 shell 设置为 /bin/false,gid 设置为 'nogroup' 以及我们可以做的任何其他事情来使其尽可能弱。为了更好地衡量,对这些登录使用 ForceCommand ssh 指令以始终执行 /bin/false 并使用 ChrootDirectory 对其进行沙箱处理。

  • 使用 AllowUsers 指令禁止除堡垒之外的登录从除 localhost 以外的任何 IP 登录。

  • 在 ssh 客户端使用 ProxyCommand 通过 bastion 登录脚本关闭隧道。

我已经这样做了,效果很好,但我想知道我是否错过了什么?

Bastion 用户的创建方式如下:

# password will never be typed in, so need to record it
sudo useradd -M -N -g nogroup -s /bin/false pre-user001 -p $(dd if=/dev/urandom bs=128 count=1 2>/dev/null  | base64 -w0)

sshd_config 看起来像这样:

# Nobody can login from anywhere except localhost
AllowUsers *@localhost
# ... except for logins starting with 0
AllowUsers pre-*@*

# force password auth for bastion logins
Match User pre-*
PasswordAuthentication yes
RSAAuthentication no
PubkeyAuthentication no
ForceCommand /bin/false
2个回答

截至 2015 年(使用 OpenSSH >= 6.2),您认为 sshd 不会结合公钥身份验证调用 PAM 的假设不再成立。

使用 OpenSSH 6.2 ,除了公钥身份验证之外,您还可以强制执行第二个甚至多个身份验证因素。

AuthenticationMethods指令可用于在全局或用户特定级别上指定多个因素sshd_config例如

AuthenticationMethods publickey,keyboard-interactive

keyboard-interactive触发 PAM 链,例如可以为 sshd 配置OTP pam 模块。

我过去使用DuoSecurity取得了巨大成功,它遵循与 Yubikey 类似的方法,但允许使用多种身份验证方法。

使用最少的用户学习曲线非常容易设置。