我试图让管理员和开发人员尽可能轻松地过渡到双因素身份验证。一个绊脚石是每次客户端打开会话时都需要输入第二个因素。有没有办法获得 ssh 的双因素身份验证,其中第二个因素每天或其他一些相当长的时间段只需输入一次?
这个想法是为需要 2FA 的 ssh 设置跳转主机。然后可以使用跳转主机来提供对其他服务器的访问(ssh -J JumpHost TargetHost),而这些服务器又将被限制为仅接受来自跳转主机的连接。
理想情况下,对于我的环境,跳转主机上的第一次登录需要公钥、密码或 Kerberos TGT 以及第二个因素。在指定的时间段内在同一台服务器上的后续登录只需要第一个因素。
到目前为止,我已经检查了 Duo 和 Okta。Duo 还没有回复我关于持久性的问题,从他们的文档中看不出它甚至可以做到。Okta 可以做到这一点,但我发现了一种将凭据从一个用户劫持到另一个用户的方法——甚至跨客户端机器——所以它是一个不太有吸引力的选择。
如果第二个因素是通过 PAM(而不是通过强制的 post-auth 命令)完成的,则可以插入自定义 PAM 模块来跟踪成功的身份验证并跳过与 2fa 相关的 PAM 模块。我不确定这样的 PAM 模块是否已经存在(但它可能与 pam_faillock 非常相似,一个模块进行检查,另一个模块进行跟踪)。
(PAM 配置中的“扩展语法”允许一种前向 goto,例如
auth [success=1 default=ignore] pam_localuser.so
,通常用于1
为本地用户跳过下一个模块。)但是,这可能不是必需的,因为 SSH已经以长期多路复用连接的形式支持持久身份验证。在初始身份验证之后,SSH 客户端可以根据需要打开任意数量的通道/会话——保持相同的连接一整天都处于活动状态。
例如,在 OpenSSH 配置
ControlPath
(和可选ControlPersist
)中允许启用多路复用,而 PuTTY 在“连接→SSH→共享 SSH 连接”下具有相同的功能。同一连接可以承载交互式 shell 会话、批处理命令、TCP 隧道和 SFTP 传输。这不仅避免了第二个因素要求,甚至还避免了第一个因素(由于连接已经过身份验证)。大多数 SSH 服务器默认情况下允许这样做,除非明确禁用 - 因此在大多数情况下,无需系统管理员参与,这已经是可能的,只需要客户端配置即可启用它。