1

我们使用 keycloak 作为我们的身份和访问提供者,通过 keycloak 的 spring security 适配器与 spring security 连接。我们意识到,当用户登录应用程序时,会话 ID 不会改变,这为会话固定攻击打开了大门。keycloak 和 spring security 都提供了防止会话固定的解决方案,但是当我将两者结合使用时,它们都不能正常工作。

keycloak的文档中

登录时关闭更改会话 ID

默认情况下,会话 ID 在某些平台上成功登录时会更改,以插入安全攻击向量。如果要关闭此功能,请将其更改为 true 这是可选的。默认值为假。

我没有关闭此功能,但登录过程后会话 ID 仍然保持不变。

Spring 安全性伴随着 , 和 的两个实现SessionAuthenticationStrategyChangeSessionIdAuthenticationStrategySessionFixationProtectionStrategy它们都不能解决问题。

keycloak doku中,您可以找到SessionFixationProtectionStrategy当前不支持”的提示,但没有建议如何处理此设置中的会话固定风险。但是根据这个提示,应该仍然可以使用 spring security 更改会话 id,结果是“通用注销将不再起作用”。但即使这样我也没有开始工作(也许我们可以进行权衡并失去通用注销)我尝试在某些方面使用spring security更改会话ID(提取配置文件):

  1. 按照此说明覆盖默认会话管理过滤器
<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>
  1. 通过此指令覆盖默认会话管理过滤器
<http ...>
    <session-management session-authentication-strategy-ref="sessionStrategy"/>
</http>

<bean id="sessionStrategy" class="org.springframework.security.web.authentication.session.ChangeSessionIdAuthenticationSessionStrategy"/>
  1. 根据spring 的文档更改默认会话管理过滤器的行为
<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 安全环境中防止会话固定的提示都值得赞赏。

4

0 回答 0