Windows Server上的Kerberos不在域



我想为一个软件实现kerberos身份验证,其中服务器和客户端都在Windows上运行,并在c++中实现。当客户端和服务器都在同一个Windows域上时,可以直接使用SSPI,我认为这也适用于跨域环境。

当由于任何原因服务器不能成为域的成员时,这种直接的方法将不起作用。如何对不属于域的服务器实现Kerberos身份验证?

如果我的研究是正确的java应用程序或linux使用keytab文件,而不是隐式地从AD检索密钥。显然SSPI不支持keytab文件。是否有一种方法来使用keytab文件在这种情况下?

SSPI不从AD"检索密钥;-服务密钥总是存储在本地,但在SSPI中,它是在AD加入过程中生成的机器帐户密码(并上传到AD而不是从中检索),它代替了keytab。Windows将机器密码存储在LSA中,并在内存中从中提取密钥,但它的目的与keytab文件相同。

可能是一种在非ad机器中存储机器密码的方法(使用ksetup.exe),但这是一个系统范围的更改-它似乎使Windows登录过程的某些部分的功能好像系统是域连接的-所以我将而不是建议这样做,除非在测试VM中。

相反,您可以使用另一个Kerberos实现—MIT KerberosHeimdal是两种主要的非ad Kerberos实现,它们以C库的形式出现(两者都是windows兼容的,尽管它们的重点是Linux/类unix系统)。这两个库都提供GSSAPI接口(类似于Windows SSPI),并且都使用keytab文件作为服务凭据。

对于c#, Kerberos。NET可用。对于Rust, SSPI -rs似乎正在积极开发中(它不仅仅是绑定到Windows SSPI,也是一个独立的实现)。Java当然有自己内置的Kerberos实现,作为JAAS的一部分,尽管Apache Kerby也存在。

大多数实现都支持相同的keytab格式,因为它们在某种程度上模仿了MIT Kerberos(这是最初的Kerberos 5实现)。

MIT Krb5和Heimdal不仅包括一个库,还包括一个KDC服务,尽管这部分不能在Windows上运行。Kerby和Kerberos。. NET也可以用于构建最小的kdc。)



以上对于服务器来说更重要;但是,客户机可以使用SSPI对Kerberos服务进行身份验证,而不需要成为域成员。

对于基于ad的域(无论是否加入域的特定服务器),提供upn格式的用户名(以user@domain的形式)和SSPI密码就足够了;它将自动发现kdc并获得门票。

对于非基于ad的Kerberos领域同样适用,只要该领域被标记为"MIT real";通过注册表或使用ksetup /AddRealmFlags。(此处需指定主体user@REALM为用户名。)与前面提到的情况不同,这个ksetup.exe的使用似乎没有负面的副作用。

最新更新