Spring HTTP/HTTPSチャンネルセキュリティ

Spring HTTP / HTTPSチャネルセキュリティ

1. 概要

このチュートリアルでは、Springのチャネルセキュリティ機能を使用したhow to use HTTPS to protect your application’s login pageを示します。

転送中に機密データの整合性を保護するには、認証にHTTPSを使用することが重要です。

この記事は、セキュリティの層を追加することにより、Spring Security Login tutorialの上に構築されています。 エンコードされたHTTPSチャネルを介してログインページを提供することにより、認証データを保護するために必要な手順を強調します。

2. チャネルセキュリティなしの初期設定

前述の記事で説明したセキュリティ構成から始めましょう。

Webアプリを使用すると、ユーザーは以下にアクセスできます。

  1. 認証なしの/anonymous.html

  2. /login.html、および

  3. ログインに成功した後の他のページ(/homepage.html)。

アクセスは、次の構成によって制御されます。

@Override
protected void configure(HttpSecurity http) throws Exception {
    http.authorizeRequests()
      .antMatchers("/anonymous*")
      .anonymous();

    http.authorizeRequests()
      .antMatchers("/login*")
      .permitAll();

    http.authorizeRequests()
      .anyRequest()
      .authenticated();

またはXML経由:


    
    
    

この時点で、ログインページは次の場所にあります。

http://localhost:8080/spring-security-login/login.html

ユーザーはHTTPを介して自分自身を認証できますが、パスワードはプレーンテキストで送信されるため、これは安全ではありません。

3. HTTPSサーバー構成

ログインページをHTTPSyour web-server must be able to serve HTTPS pages経由でのみ配信します。 これには、SSL/TLSのサポートが有効になっている必要があります。

有効な証明書を使用することも、テスト目的で独自の証明書を生成することもできます。

Tomcatを使用していて、独自の証明書をローリングしているとしましょう。 まず、自己署名証明書を使用してkeystoreを作成する必要があります。

キーストアの生成は、ターミナルで次のコマンドを発行して実行できます。

keytool -genkey -alias tomcat -keyalg RSA -storepass changeit -keypass changeit -dname 'CN=tomcat'

これにより、ホームフォルダー内のユーザープロファイルの既定のキーストアに秘密キーと自己署名証明書が作成されます。

次のステップは、conf/server.xmlを編集して次のようにすることです。



2番目のSSL / TLS<Connector>タグは通常、構成ファイルでコメント化されているため、必要なのはキーストア情報のコメント解除と追加だけです。 詳細については、Tomcat’s related documentationを参照してください。

HTTPS構成を配置すると、次のURLでもログインページを提供できるようになります。

https://localhost:8443/spring-security-login/login.html

Tomcat以外のWebサーバーでは、異なるがおそらく同様の構成が必要になります。

4. チャネルセキュリティの構成

この時点で、HTTPとHTTPSの両方でログインページを提供できます。 このセクションでは、HTTPSの使用を義務付ける方法について説明します。

To require HTTPS for the login pageは、以下を追加してセキュリティ構成を変更します。

http.requiresChannel()
  .antMatchers("/login*").requiresSecure();

または、requires-channel=”https”属性をXML構成に追加します。

この時点以降、ユーザーはHTTPS経由でのみログインできました。 すべての相対リンク(例: /homepage.htmlへの転送は、元の要求のプロトコルを継承し、HTTPSで提供されます。

単一のWebアプリ内でHTTP要求とHTTPS要求を混在させる場合、注意が必要な追加の側面があり、さらに設定が必要です。

5. HTTPとHTTPSの混合

セキュリティの観点から、すべてをHTTPSで提供することは良い習慣であり、確実な目標です。

ただし、HTTPSを排他的に使用するオプションがない場合は、構成に次を追加することでHTTPを使用するようにSpringを構成できます。

http.requiresChannel()
  .anyRequest().requiresInsecure();

または、requires-channel=”http”属性をXMLに追加します。

これは、明示的にHTTPSを使用するように構成されていないすべてのリクエストに対してSpringを使用するようにSpringに指示しますが、同時に元のログインメカニズムを中断します。 次のセクションでは、根本的な原因について説明します。

5.1. HTTPSを介したカスタムログイン処理URL

元のセキュリティチュートリアルのセキュリティ構成には、次のものが含まれています。

元のリクエストで送信されたWithout forcing /perform_login to use HTTPS a redirect would happen to the HTTP variant of it, losing the login information

これを克服するには、処理URLにHTTPSを使用するようにSpringを構成する必要があります。

http.requiresChannel()
  .antMatchers("/login*", "/perform_login");

antMatchersメソッドに渡される追加の引数/perform_loginに注意してください。

XML構成の同等のものでは、構成に新しい<intercept-url>要素を追加する必要があります。

独自のアプリケーションがデフォルトのlogin-processing-url/login)を使用している場合、/login*パターンがすでにそれをカバーしているため、これを明示的に構成する必要はありません。

構成が整っていると、ユーザーはログインできますが、認証されたページにアクセスすることはできません。 Spring’s session fixation protection featureのため、HTTPプロトコルでは/homepage.html

5.2. session-fixation-protectionの無効化

Session fixationは、HTTPとHTTPSを切り替えるときに回避できない問題です。

デフォルトでは、Springはログインが成功した後に新しいsession-idを作成します。 ユーザーがHTTPSログインページをロードすると、ユーザーのsession-id Cookieはsecure.としてマークされます。ログイン後、HTTPが安全でないため、コンテキストはHTTPおよびthe cookie will be lostに切り替わります。

このsetting session-fixation-protection to none is requiredを回避するため。

http.sessionManagement()
  .sessionFixation()
  .none();

またはXML経由:

Disabling session fixation protection might have security implicationsであるため、セッション固定ベースの攻撃が懸念される場合は、長所と短所を比較検討する必要があります。

6. Test

これらすべての構成変更を適用した後、ログインせずに/anonymous.htmlにアクセスすると(http://またはhttps://のいずれかを使用)、HTTPを介してページに転送されます。

/homepage.htmlのように他のページを直接開くと、HTTPS経由でログインページに転送され、ログイン後、HTTPを使用して/homepage.htmlに転送されます。

7. 結論

このチュートリアルでは、ログインメカニズムを除いてHTTPを介して通信するSpringWebアプリケーションを構成する方法について説明しました。 ただし、通信プロトコルとしてnew modern web-applications should almost always use HTTPS exclusively。 セキュリティレベルを下げたり、セキュリティ機能(session-fixation-protectionなど)をオフにしたりすることは決して良い考えではありません。

このチュートリアルは、codebase available on GitHubに基づいています。 チャネルセキュリティ構成は、httpsをアクティブなSpring profileとしてリストすることで有効にできます。