我们使用 keycloak 作为我们的身份和访问提供者,通过 keycloak 的 spring security 适配器与 spring security 连接。我们意识到,当用户登录应用程序时,会话 ID 不会改变,这为会话固定攻击打开了大门。keycloak 和 spring security 都提供了防止会话固定的解决方案,但是当我将两者结合使用时,它们都不能正常工作。
登录时关闭更改会话 ID
默认情况下,会话 ID 在某些平台上成功登录时会更改,以插入安全攻击向量。如果要关闭此功能,请将其更改为 true 这是可选的。默认值为假。
我没有关闭此功能,但登录过程后会话 ID 仍然保持不变。
Spring 安全性伴随着 , 和 的两个实现SessionAuthenticationStrategy
,ChangeSessionIdAuthenticationStrategy
但SessionFixationProtectionStrategy
它们都不能解决问题。
在keycloak doku中,您可以找到“SessionFixationProtectionStrategy
当前不支持”的提示,但没有建议如何处理此设置中的会话固定风险。但是根据这个提示,应该仍然可以使用 spring security 更改会话 id,结果是“通用注销将不再起作用”。但即使这样我也没有开始工作(也许我们可以进行权衡并失去通用注销)我尝试在某些方面使用spring security更改会话ID(提取配置文件):
- 按照此说明覆盖默认会话管理过滤器
<http use-expressions="true" auto-config="false" entry-point-ref="keycloakAuthenticationEntryPoint">
[...]
<!-- changeSessionId and newSession have no result at all -->
<session-management session-fixation-protection="none"/>
<session-management session-authentication-strategy-ref="sessionAuthenticationStrategy"/>
<custom-filter ref="sessionManagementFilter" position="SESSION_MANAGEMENT_FILTER"/>
[...]
</http>
<beans:bean id="sessionAuthenticationStrategy"
class="org.springframework.security.web.authentication.session.ChangeSessionIdAuthenticationStrategy"/>
<beans:bean id="sessionManagementFilter" class="org.springframework.security.web.session.SessionManagementFilter">
<beans:constructor-arg name="securityContextRepository" ref="securityContextRepository"/>
<beans:constructor-arg name="sessionStrategy" ref="sessionAuthenticationStrategy"/>
</beans:bean>
- 通过此指令覆盖默认会话管理过滤器
<http ...>
<session-management session-authentication-strategy-ref="sessionStrategy"/>
</http>
<bean id="sessionStrategy" class="org.springframework.security.web.authentication.session.ChangeSessionIdAuthenticationSessionStrategy"/>
<http use-expressions="true" auto-config="false" entry-point-ref="keycloakAuthenticationEntryPoint">
[...]
<!-- changeSessionId and newSession have no result at all -->
<session-management session-fixation-protection="changeSessionId"/>
[...]
</http>
任何有关在 keycloak spring 安全环境中防止会话固定的提示都值得赞赏。