Spring Bootのセキュリティ自動設定

スプリングブートセキュリティの自動構成

1. 前書き

この記事では、セキュリティに対するSpringBootの意見のあるアプローチを見ていきます。

簡単に言うと、デフォルトのセキュリティ構成と、必要に応じて無効化またはカスタマイズする方法に焦点を当てます。

参考文献:

Spring Security –セキュリティなし、フィルターなし、アクセス許可All

Spring Securityのaccess = "permitAll"、filters = "none"、security = "none"の違い。

Spring Securityフォームログイン

Springログインの例-簡単なログインフォーム、基本的なセキュリティXML設定、およびより高度な設定テクニックのセットアップ方法。

2. デフォルトのセキュリティ設定

Spring Bootアプリケーションにセキュリティを追加するには、security starter dependencyを追加する必要があります。


    org.springframework.boot
    spring-boot-starter-security

これには、初期/デフォルトのセキュリティ構成を含むSecurityAutoConfigurationクラスが含まれます。

プロジェクトがすでに親としてBootを使用していることを前提として、ここでバージョンを指定しなかったことに注意してください。

簡単に言えば、by default, the Authentication gets enabled for the Application. Also, content negotiation is used to determine if basic or formLogin should be used.

次のような定義済みプロパティがいくつかあります。

spring.security.user.name
spring.security.user.password

事前定義されたプロパティspring.security.user.passwordを使用してパスワードを構成せずにアプリケーションを起動すると、デフォルトのパスワードがランダムに生成され、コンソールログに出力されます。

Using default security password: c8be15de-4488-4490-9dc6-fab3f91435c6

その他のデフォルトについては、Spring Boot Common Application Propertiesリファレンスページのセキュリティプロパティのセクションを参照してください。

3. 自動構成の無効化

セキュリティの自動構成を破棄して独自の構成を追加するには、SecurityAutoConfigurationクラスを除外する必要があります。

これは、単純な除外を介して実行できます。

@SpringBootApplication(exclude = { SecurityAutoConfiguration.class })
public class SpringBootSecurityApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringBootSecurityApplication.class, args);
    }
}

または、application.propertiesファイルに構成を追加します。

spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.security.SecurityAutoConfiguration

この設定では不十分な場合もあります。

たとえば、ほぼすべてのSpring Bootアプリケーションは、クラスパスのActuatorで起動されます。 This causes problems because another auto-configuration class needs the one we’ve just excludedであるため、アプリケーションの起動に失敗します。

この問題を修正するには、そのクラスを除外する必要があります。また、アクチュエータの状況に固有に、ManagementWebSecurityAutoConfigurationを除外する必要があります。

3.1. 無効化と セキュリティの自動構成を超える

自動構成を無効にすることとそれを超えることには大きな違いがあります。

無効にすることで、SpringSecurityの依存関係とセットアップ全体を最初から追加するのと同じようになります。 これは、いくつかの場合に役立ちます。

  1. アプリケーションセキュリティとカスタムセキュリティプロバイダーの統合

  2. 既存のセキュリティ設定を使用したレガシーSpringアプリケーションのSpring Bootへの移行

ただし、ほとんどの場合、セキュリティの自動構成を完全に無効にする必要はありません。

Spring Bootの構成方法では、新規/カスタム構成クラスを追加することにより、自動構成されたセキュリティを超えることができます。 ニーズを満たすために既存のセキュリティ設定をカスタマイズしているだけなので、これは通常は簡単です。

4. SpringBootセキュリティの構成

セキュリティの自動構成を無効にするパスを選択した場合は、当然、独自の構成を提供する必要があります。

前に説明したように、これはデフォルトのセキュリティ構成です。プロパティファイルを変更することでカスタマイズできます。

たとえば、独自のパスワードを追加してデフォルトのパスワードを上書きできます。

security.user.password=password

たとえば、複数のユーザーとロールを使用する、より柔軟な構成が必要な場合は、完全な@Configurationクラスを使用する必要があります。

@Configuration
@EnableWebSecurity
public class BasicConfiguration extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(AuthenticationManagerBuilder auth)
      throws Exception {
        auth
          .inMemoryAuthentication()
          .withUser("user")
            .password("password")
            .roles("USER")
            .and()
          .withUser("admin")
            .password("admin")
            .roles("USER", "ADMIN");
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
          .authorizeRequests()
          .anyRequest()
          .authenticated()
          .and()
          .httpBasic();
    }
}

デフォルトのセキュリティ構成を無効にする場合、@EnableWebSecurity注釈は非常に重要です。

存在しない場合、アプリケーションは起動に失敗します。 アノテーションは、WebSecurityConfigurerAdapterを使用してデフォルトの動作をオーバーライドする場合にのみオプションです。

次に、いくつかの簡単なライブテストを実行して、セキュリティ構成が正しく適用されることを確認する必要があります。

@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = RANDOM_PORT)
public class BasicConfigurationIntegrationTest {

    TestRestTemplate restTemplate;
    URL base;
    @LocalServerPort int port;

    @Before
    public void setUp() throws MalformedURLException {
        restTemplate = new TestRestTemplate("user", "password");
        base = new URL("http://localhost:" + port);
    }

    @Test
    public void whenLoggedUserRequestsHomePage_ThenSuccess()
     throws IllegalStateException, IOException {
        ResponseEntity response
          = restTemplate.getForEntity(base.toString(), String.class);

        assertEquals(HttpStatus.OK, response.getStatusCode());
        assertTrue(response
          .getBody()
          .contains("example"));
    }

    @Test
    public void whenUserWithWrongCredentials_thenUnauthorizedPage()
      throws Exception {

        restTemplate = new TestRestTemplate("user", "wrongpassword");
        ResponseEntity response
          = restTemplate.getForEntity(base.toString(), String.class);

        assertEquals(HttpStatus.UNAUTHORIZED, response.getStatusCode());
        assertTrue(response
          .getBody()
          .contains("Unauthorized"));
    }
}

実際、Spring Boot Securityの背後にはSpring Securityがあるため、これで実行できるセキュリティ構成、またはこれがサポートする統合もSpring Bootに実装できます。

5. Spring BootOAuth2自動構成

Spring Bootには、OAuth2専用の自動構成サポートがあります。

その前に、Maven依存関係を追加して、アプリケーションのセットアップを開始しましょう。


   org.springframework.security.oauth
   spring-security-oauth2

この依存関係には、OAuth2AutoConfigurationクラスで定義された自動構成メカニズムをトリガーできるクラスのセットが含まれます。

現在、アプリケーションの範囲に応じて、継続する複数の選択肢があります。

5.1. OAuth2認証サーバーの自動構成

アプリケーションをOAuth2プロバイダーにしたい場合は、@EnableAuthorizationServerを使用できます。

起動時に、自動構成クラスが承認サーバーのクライアントIDとクライアントシークレットを生成し、もちろん基本認証用のランダムパスワードを生成することがログに表示されます。

Using default security password: a81cb256-f243-40c0-a585-81ce1b952a98
security.oauth2.client.client-id = 39d2835b-1f87-4a77-9798-e2975f36972e
security.oauth2.client.client-secret = f1463f8b-0791-46fe-9269-521b86c55b71

これらの資格情報を使用して、アクセストークンを取得できます。

curl -X POST -u 39d2835b-1f87-4a77-9798-e2975f36972e:f1463f8b-0791-46fe-9269-521b86c55b71 \
 -d grant_type=client_credentials
 -d username=user
 -d password=a81cb256-f243-40c0-a585-81ce1b952a98 \
 -d scope=write  http://localhost:8080/oauth/token

5.2. その他のSpringBootOAuth2自動構成設定

Spring Boot OAuth2によってカバーされる他のいくつかのユースケースがあります:

  1. リソースサーバー–@EnableResourceServer

  2. クライアントアプリケーション–@EnableOAuth2Ssoまたは@EnableOAuth2Client

アプリケーションを上記のいずれかのタイプにする必要がある場合は、アプリケーションプロパティに構成を追加するだけです。

OAuth2固有のすべてのプロパティはSpring Boot Common Application Propertiesにあります。

6. Spring Boot 2セキュリティとSpring Boot 1セキュリティ

Spring Boot 1と比較して、Spring Boot 2 has greatly simplified the auto-configuration

Spring Boot 2では、独自のセキュリティ構成が必要な場合は、カスタムWebSecurityConfigurerAdapter.を追加するだけです。これにより、デフォルトの自動構成が無効になり、カスタムセキュリティ構成が有効になります。

Spring Boot 2は、Spring Securityのデフォルトのほとんどを使用します。 このため、some of the endpoints that were unsecured by default in Spring Boot 1 are now secured by default

これらのエンドポイントには、/ css /, /js/、/ images /, /webjars/、/ ** / favicon.icoなどの静的リソース、およびエラーエンドポイントが含まれます。 これらのエンドポイントへの認証されていないアクセスを許可する必要がある場合は、明示的に設定できます。

セキュリティ関連の構成を簡素化するために、Spring Boot 2 has removed the following Spring Boot 1 properties

security.basic.authorize-mode
security.basic.enabled
security.basic.path
security.basic.realm
security.enable-csrf
security.headers.cache
security.headers.content-security-policy
security.headers.content-security-policy-mode
security.headers.content-type
security.headers.frame
security.headers.hsts
security.headers.xss
security.ignored
security.require-ssl
security.sessions

7. 結論

この記事では、Spring Bootが提供するデフォルトのセキュリティ構成に注目しました。 セキュリティの自動構成メカニズムを無効化またはオーバーライドする方法、および新しいセキュリティ構成を適用する方法について説明しました。

ソースコードはover on Githubにあります。