キークロークのスプリングセキュリティアダプターによってスプリングセキュリティに接続されているIDおよびアクセスプロバイダーとしてキークロークを使用します。ユーザーがアプリケーションにログインしても、セッション ID が変更されないことがわかりました。これは、セッション固定攻撃への扉を開いています。キークロークとスプリング セキュリティの両方が、セッション固定を防止するソリューションを提供しますが、両方を組み合わせて使用すると、いずれも適切に機能しません。
ログイン時にセッション ID の変更をオフにする
一部のプラットフォームでは、ログインに成功すると、セッション ID がデフォルトで変更され、セキュリティ攻撃ベクトルがプラグインされます。これをオフにする場合は、これを true に変更します。これはオプションです。デフォルト値は false です。
この機能をオフにしませんでしたが、ログイン手順の後もセッション ID は同じままです。
Spring セキュリティには 、SessionAuthenticationStrategy
、ChangeSessionIdAuthenticationStrategy
およびの 2 つの実装が付属SessionFixationProtectionStrategy
していますが、いずれもうまくいきません。
キークロークのドキュメントでは、「現在サポートされていません」SessionFixationProtectionStrategy
というヒントを見つけることができますが、このセットアップでセッション固定のリスクに対処する方法についてのアドバイスはありません。しかし、このヒントによれば、 「ユニバーサル ログアウトが機能しなくなる」という結果で、春のセキュリティでセッション ID を変更することはまだ可能であるはずです。しかし、これでもうまくいきません(トレードオフを行ってユニバーサルログアウトを失う可能性があります)いくつかの方法で春のセキュリティでセッション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"/>
- 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>
キークロークの春のセキュリティ環境内でのセッションの固定を防ぐためのヒントをいただければ幸いです。