Spring Securityの保護機能の無効化

Spring Securityの保護機能の無効化

説明

csrf().disable()、frameOptions().disable()、anyRequest().permitAll()などは、対象のSpring Securityフィルターチェーンの保護機能やアクセス制限を解除します。リスクは、ブラウザーが自動送信する認証情報の利用、ほかのフレーム制限、チェーンが処理する要求の範囲によって異なります。

想定される影響

  • Cookieなどの認証情報をブラウザーが自動送信する場合、CSRF保護がないと外部サイトから状態変更を誘発されるおそれがあります。
  • frameOptionsの無効化でクリックジャッキング対策が弱まる可能性があります。
  • 対象チェーンのanyRequest().permitAll()は認証を要求しないため、保護すべき機能まで公開するおそれがあります。

対処方法

  • ブラウザーの認証方式を確認し、CSRF保護を維持してください。保護が不要な経路だけを明示的に除外してください。csrf().disable()はチェーン全体に適用されます。
  • フレーム制限を単に解除せず、sameOriginまたは適切なCSPのframe-ancestorsを使ってください。
  • 意図した公開経路だけを許可し、ほかの要求には認証を求めてください。

例

Spring Security 6.x形式の設定の抜粋です。構成クラスの登録と認証方式は別途用意し、使用中のバージョンに合うDSLを使ってください。

変更前

java
import org.springframework.context.annotation.Bean;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.web.SecurityFilterChain;

public class UnsafeCsrfConfig {
    @Bean
    SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        http.csrf().disable();
        return http.build();
    }
}

変更後

java
import org.springframework.context.annotation.Bean;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.web.SecurityFilterChain;

public class SafeSecurityConfig {
    @Bean
    SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        http
            .authorizeHttpRequests(auth -> auth
                .requestMatchers("/health").permitAll()
                .anyRequest().authenticated()
            );
        return http.build();
    }
}

説明:

  • 変更前: このフィルターチェーンのCSRF保護を無効にします。
  • 変更後: 既定のCSRF保護を維持し、/healthだけを認証なしで許可し、それ以外の要求には認証を求めます。ロールやオブジェクトごとの認可は別途構成してください。

ほかの保護設定の確認

フレーム制限や広い要求許可が意図に合うか確認してください。JavaとKotlinのDSLのどちらでも、必要な保護を維持し、意図した公開経路だけを許可してください。

参考資料