我有一个域(ACME.COM)上运行的服务(AcmeService)和另一个域(DISNEY.COM)中运行的用户。
[email protected]想要使用AcmeService进行身份validation。 该服务知道DISNEY.COM域,并通过使用已知的DISNEY.COM证书将所有用户导入其本地用户数据库中。
如果mickey发送完全限定的用户名/密码,AcmeService可以通过直接连接到DISNEY.COM域控制器(他已经知道)使用LDAP来validation他。
[email protected]也希望使用AcmeService进行身份validation,但希望通过集成安全性进行身份validation,因为他不信任AcmeService足以泄露密码。 (在我的情况下,它使用.Net NegotiateStream这是SSPI的包装)
我对这个问题的理解是,AcmeService不能用一个不属于他的域的用户(ACME.COM)的集成安全性进行validation。
我认为一般的解决scheme是在ACME.COM和DISNEY.COM之间创build一个即将离任的信任关系,但在我的情况下是不可能的。
是否有一个解决scheme,允许AcmeService使用SSPIvalidation用户,如果该用户位于外部域中,并且没有定义的信任关系? 如果解决scheme只能在AcmeService机器上运行,那就没问题了。
我可能会误解,但我的印象是使用ksetup / addkdc可以用外部的MIT Kerberos来做这样的事情。
任何想法?
谢谢
UPDATE
客户端和AcmeService之间的通信已经通过TLS进行了保护(不需要双向authentication)。 连接完成后,客户端知道他正在与真正的AcmeService交谈(感谢TLS),但他现在需要使用他的DISNEY.COM凭证向AcmeServicevalidation其身份,在这里客户端证书不是一个选项,AcmeService只知道它以前导入的ActiveDirectory帐户。
NTLM(v2)对于我的场景来说足够了,但是我不明白为什么Kerberos是不可能的。 AcmeService有一个DISNEY.COM帐户([email protected]),它可以用来与Kerberos进行相互validation。
我认为问题是当尝试使用SSPIvalidation一个disney.com用户时,AcmeService无法自动为DISNEY.COM域定位域控制器。 AcmeService机器需要知道DISNEY.COM控制器可以位于“dc.disney.com”。
以下是在AcmeService机器上运行的dcdiag和nltest的结果:
dcdiag /s:dc.disney.com /u:disney.com\acmeuser/p:XXXX/test:LocatorCheck
Running enterprise tests on : disney.com Starting test: LocatorCheck Warning: DcGetDcName(GC_SERVER_REQUIRED) call failed, error 1722 A Global Catalog Server could not be located - All GC's are down. Warning: DcGetDcName(PDC_REQUIRED) call failed, error 1722 A Primary Domain Controller could not be located. The server holding the PDC role is down. Warning: DcGetDcName(TIME_SERVER) call failed, error 1722 A Time Server could not be located. The server holding the PDC role is down. Warning: DcGetDcName(GOOD_TIME_SERVER_PREFERRED) call failed, error 1722 A Good Time Server could not be located. Warning: DcGetDcName(KDC_REQUIRED) call failed, error 1722 A KDC could not be located - All the KDCs are down. ......................... disney.com failed test LocatorCheck
nltest /dsgetdc:disney.com
Getting DC name failed: Status = 1355 0x54b ERROR_NO_SUCH_DOMAIN
我需要的是像“register-domain /domain:DISNEY.COM/controller:dc.disney.com”这样的魔术命令,正如我之前所说的那样,如果只有AcmeService能够authenticationDISNEY.COM用户,那么解决scheme不需要与ACME.COM域中的每个人一起工作。
是否有一个解决scheme,允许AcmeService使用SSPIvalidation用户,如果该用户在外部域中并且没有定义的信任关系?
没有。
如果您受限于使用.NET NegotiateStream类,那么您将在MSDN文档中看到NegotiateStream类[MS-NNS] :
.NET NegotiateStream协议使用SPNEGO(在Kerberos和NTLM之间进行select)来确定要使用的基础安全协议。
所以你的select是NTLM和Kerberos。
[email protected]也希望使用AcmeService进行身份validation,但希望使用集成安全性进行身份validation,因为他不信任AcmeService足以泄露他的密码。
那么NTLM就出来了。 具有会话安全性的NTLM v1,v2和v2都依赖于弱哈希algorithm,而且密码的哈希值本质上是密码等效的,所以我同意你使用NTLM对服务进行身份validation是将密码提供给那个服务。
所以现在你只剩下Kerberos了。 Kerberos由Active Directory实现,不会为不受信任的域validation凭据。
所以现在你没有select了。
我认为一般的解决scheme是在ACME.COM和DISNEY.COM之间创build一个即将离任的信任关系,但在我的情况下是不可能的。
你是正确的,创build一个信任将允许一个Kerberos领域信任另一个Kerberos领域的authentication机制,但由于你不能创build一个信任,那么你是SOL。
当您想要在客户端和服务器之间提供强大的相互身份validation,并且您不能使用Kerberos时,则使用PKI,数字证书,TLS。
我通常会build议你去探索AD联邦服务,但是如果你不能以任何理由创build一个传统的AD信任关系,那么你也不可能创build一个联盟信任。
所以我的build议是客户端证书。 (Schannel中)