如果配置了公钥 (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