我们有一个客户需要通过单点登录来保护Web应用程序,将来称为SSO。 它使用用户在登录Windows域时输入的身份验证和授权数据。这里,Web浏览器通过特殊机制(Kerberos)与Web应用程序和Active Directory进行通信,Active Directory在此处充当身份验证服务和票证授予服务。这里可以获得对该机制的简单解释。
现在我们也有客户要求Web应用程序的SSO应该在完善的Websphere Application Server以及Docker容器中的Tomcat中运行。特别是,这是挑战。由于Web应用程序是最广泛意义上的Spring应用程序,因此我们决定将Spring解决方案与Spring Security和Spring Security Kerberos一起使用。通过使用Websphere和Tomcat的配置文件,这很容易集成并且易于配置。
配置
首先,WebApplicationInitializer必须放在类路径中,该路径使用Servlet-3.0 Api自动加载,并springSecurityFilterChain 使用一组HTTP servlet过滤器注册Spring Security 。指定的WebApplicationInitializer必须扩展Spring类AbstractSecurityWebApplicationInitializer,否则可能为空。但是,此WebApplicationInitializer仅注册对servlet过滤器链的引用,因此您还必须创建其他Spring bean。这可以在Java-Config的帮助下轻松完成。为此,将在WebSecurityConfigurerAdapter扩展Spring类的应用程序的ApplicationContext中创建配置@EnableWebSecurity注释。此配置类现在还创建了Kerberos机制所需的Spring Bean。这些特别包括KerberosTicketValidator,KerberosServiceAuthenticationProvider,SpnegoAuthenticationProcessingFilter和SpnegoEntryPoint。
配置可能如下所示的示例:
如您所见,此配置是抽象的,仍然需要实现。现在,已经为Websphere和Tomcat实现了与配置文件相关的映射,以映射不同的系统。所以现在有两种配置。
WebSphere配置
Tomcat配置
准备关键配送中心(KDC)
在该示例中,KDC的角色由Active Directory填充。如您所见,配置中引用了所谓的“服务主体”和其他文件,我将在下面讨论。
1. Service-Principal
服务主体SPN(简称SPN)是使用Kerberos身份验证的网络域中的服务名称。它由服务类,主机名和可能的端口组成。在该示例中,每个提供Web应用程序的服务器都有一个HTTP服务类SPN。
HTTP / tomcat.codecentric.deHTTP / websphere.codecentric.de主机名必须与Web浏览器调用应用程序的方式相匹配。在示例中,它可以是URL https://tomcat.provinzial.com:8080/example。这两个SPN现在必须在KDC中注册并分配给用户。为此,在Windows控制台中执行以下命令(PC必须登录到域):
使用此命令,SPN将生成并分配给用户A_KERBEROS_USER。
2. kerberos.keytab
此文件是用于Web应用程序和KDC之间的身份验证的密钥。
该命令为用户A_KERBEROS_USER和密码A_SECRET_PASSWD创建密钥表文件,但这只能用于SPN HTTP / tomcat.codecentric.de。对于SPN HTTP / websphere.codecentric.de,必须类似地生成另一个密钥表文件。
3. krb5.ini
Kerberos本身在此文件中配置。例如,这里配置了KDC:
此配置高度依赖于Active Directory中的域配置。这只是一个例子。
调用Web应用程序
在创建必要的文件并使用上述Spring配置部署Web应用程序后,调用URL https://tomcat.codecentric.com/example将启动Kerberos机制。首先,应用程序检查调用者是否已经登录,如果没有,则写入SpnegoEntryPointHTTP头(WWW-Authenticate = Negotiate)并返回状态401。因此,Web浏览器知道它必须在新请求中发送Windows用户的数据,即HTTP标头中的Kerberos票证。此票证已存在于票证缓存中,或者仍必须从KDC获取。
Webspheres IBM Runtime Java
不幸的是KerberosTicketValidator,用于Kerberos 的Spring库只包含一个与Oracle JRE一起使用并且明确不与IBM JRE一起使用的库。具体而言,LoginModuleIBM JRE中对实现的引用是不同的。另一个区别是与KDC的通信实施。
IBM实现本质上是一个副本,SunJaasKerberosTicketValidator除了以下摘录:
在执行的run()方法是IBM的文档回来。
没有SSO呼叫的可能性
最后一项要求是提供登录Web应用程序而无需通过SSO自动登录的功能。如果用户不想使用自己的用户登录,而是与其他人一起登录,则此功能非常有用。
这个想法很简单。在包含子域nosso的DNS中输入主机名,并指向与没有nosso子域的主机名相同的IP 。在该示例中,还可以通过URL https://tomcat.nosso.codecentric.de/example访问Web应用程序。
在Web应用程序中,然后自己SpnegoEntryPoint实现了投票率。覆盖方法的部分显示了切换。
因此,调用https://tomcat.nosso.codecentric.de/beispiel不会引发Kerberos机制,反而导致https://tomcat.nosso.codecentric.de/beispiel/login重定向当用户再可以输入所需的用户数据。
结论
开发此解决方案需要大量实验。我希望能够为此做出贡献,使将来能够做的更轻松。