Мы используем keycloak в качестве провайдера идентификации и доступа, который связан с пружинной защитой с помощью адаптера пружинной безопасности keycloak. Мы поняли, что идентификатор сеанса не изменяется, когда пользователь входит в приложение, которое является открытой дверью для атак фиксации сеанса. И клавиатурный ключ, и пружинная защита предоставляют решения для предотвращения фиксации сеанса, но когда я использую оба в комбинации, ни один из них не работает должным образом.
Из документации ключевого плаща :
turn-off-change-session-id-on-login
Идентификатор сеанса по умолчанию изменяется при успешном входе в систему на некоторых платформах для подключения вектора атаки безопасности. Измените это на true, если вы хотите отключить это НЕОБЯЗАТЕЛЬНО. Значение по умолчанию - false.
Я не отключил эту функцию, но идентификатор сеанса остается неизменным после процедуры входа в систему.
Безопасность Spring поставляется вместе с двумя реализациями SessionAuthenticationStrategy
, ChangeSessionIdAuthenticationStrategy
и SessionFixationProtectionStrategy
, но ни один из них не сработает.
В keycloak doku вы можете найти подсказку, что "SessionFixationProtectionStrategy
в настоящее время не поддерживается" , но нет никаких советов, как бороться с риском фиксации сеанса в этой настройке. Но согласно этой подсказке все еще должна быть возможность изменить идентификатор сеанса с пружинной защитой, в результате чего «универсальный выход из системы больше не будет работать» . Но даже при этом я не могу работать (возможно, мы могли бы go с компромиссом и потерять универсальный выход из системы) Я попытался изменить идентификатор сеанса с помощью Spring Security некоторыми способами (извлечение файла конфигурации):
- перезаписать фильтр управления сеансами по умолчанию, следуя этим инструкциям
<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.