如何在基于 SSH 密钥的身份验证会话中查询 AD?

如何在基于 SSH 密钥的身份验证会话中查询 AD?

我在 Windows(2019)服务器上有一个 PoSh 脚本,我想从 Linux Web 服务器上的一个简单 Web 应用程序(一个按钮)启动它,因此我启用了 OpenSSH 并将其限制为通用的非特权帐户。

在使用用户名/密码验证的手动测试中,帐户验证通过并且脚本运行正常。

当我建立公钥/私钥对时,帐户连接成功,但脚本失败。失败是因为脚本尝试读取必要的 ADSI 查询的 (null) 结果。我认为使用密钥对的原因之一是避免将密码硬编码到脚本中。

我唯一能想到的是,基于密钥的身份验证并不是真正的“登录”,并且需要生成某种类型的票证,当需要凭据进行安全访问检查时,该票证可以传递给 AD。我认为,有关在 Windows 上设置/使用 SSH 的所有文档中都会解释这样的警告。

如果我的猜测是正确的,那么解决这个问题的最佳方法是什么? OpenSSH 中是否有一些设置,以便基于密钥的身份验证可以生成没有密码的票证? 我真的需要将密码输入代码吗?

谢谢

答案1

我唯一能想到的是,基于密钥的身份验证并不是真正的“登录”,并且需要生成某种票证,当需要凭据进行安全访问检查时,可以将该票证传递给 AD

访问 AD 始终需要凭证。在正常登录中,ADSI(以及 RSAT、SMB 文件共享等)会自动使用 Windows 在登录过程中存储的“默认”凭证 - 对于 Active Directory,它会获取凯尔伯罗斯来自 AD DC 的初始票证(以及存储非 AD 集成服务的 NTLM 密码哈希)。您可以运行klist以查看授予所有 AD 服务访问权限的“krbtgt/”票证。

OpenSSH 中是否有某些设置,以便基于密钥的身份验证可以生成无需密码的票证?

一般情况下不会,机器不能产生从无到有——必须获得从 AD DC 中获取它们,为此,它需要您的凭据以 AD 可接受的形式存在。这通常意味着您的密码(或者从技术上讲是您的 PKI 证书,如果 AD 已为此设置 - 但这无法通过 OpenSSH 实现)。

使用公钥认证时,服务器上的 OpenSSH 没有任何可用于代表您获取 Kerberos 票证的凭证。

例外情况是受约束的授权使用 Kerberos 的“S4U2Proxy”扩展,其中系统可以使用其自己的“机器”凭据来生成冒充您的票证。但是,这不是 OpenSSH 设置(据我所知,S4U2Proxy 不能用于创建“初始”krbtgt 票证);一旦向机器授予了约束委派的权限,ADSI 可能需要要求 Windows 为实际的 LDAP 连接执行此操作。

我认为这样的警告会在有关在 Windows 上设置/使用 SSH 的所有文档的某处得到解释。

人们很可能认为该问题通过 WinRM 从 PowerShell Remoting 中“已为人所知”,只要该功能存在,它就被称为“第二跳问题”。

在提供的选项中,SSH 传输支持不受约束的 Kerberos 委派,但不支持 CredSSP(虽然我不明白为什么文章声称后者更安全——它们都会传输您的凭据,因此两者都同样危险)。

这不是 Windows 独有的问题 - 在 Unix 站点上也会出现这种情况,例如,运行用户的系统(其主目录基于 NFS 或 AFS)的大学由于同样的原因发现无法使用公钥认证。

我真的需要把密码输入到代码中吗?

当然不是——您可以将其放在单独的配置文件中。

(包含私钥的文件与包含密码的文件之间几乎没有区别……最终,它们都是静态的、不会过期的凭证,可以被窃取,并且都必须受到同等程度的保护。这是其他密钥对的一些特性使得它们值得使用。

另一个选择是重写脚本以在 Linux 上运行,通过 LDAP(例如 python-ldap 或 perl Net::LDAP)访问 Active Directory。这样,它可以使用 Kerberos keytab 文件进行身份验证,而不是存储密码 - 这仍然需要在磁盘上进行相同的保护,但总体上具有使用 Kerberos 的优势。

相关内容