1. 概要

このチュートリアルでは、 HTTPSを使用して、Springのチャネルセキュリティ機能を使用してアプリケーションのログインページを保護する方法を示します。

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

この記事は、 Spring Security Loginチュートリアルの上に、セキュリティのレイヤーを追加することで構築されています。 エンコードされた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 use-expressions="true">
    <intercept-url pattern="/anonymous*" access="isAnonymous()"/>
    <intercept-url pattern="/login*" access="permitAll"/>
    <intercept-url pattern="/**" access="isAuthenticated()"/>
</http>

この時点で、ログインページは次の場所で利用できます。

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

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

3. HTTPSサーバー構成

ログインページをHTTPS 経由でのみ配信するには、WebサーバーがHTTPSページを提供できる必要があります。 これには、 SSL /TLSサポートが有効になっている必要があります。

有効な証明書を使用することも、テスト目的で独自の証明書を生成することもできることに注意してください。

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

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

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

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

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

<Connector port="8080" protocol="HTTP/1.1"
   connectionTimeout="20000"
   redirectPort="8443" />

<Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"
   maxThreads="150" SSLEnabled="true" scheme="https" secure="true"
   clientAuth="false" sslProtocol="TLS"
   keystoreFile="${user.home}/.keystore" keystorePass="changeit" />

2番目のSSL/TLS タグは通常、構成ファイルでコメント化されているため、コメント解除してキーストア情報を追加するだけで済みます。 詳細については、Tomcatの関連ドキュメントを参照してください。

HTTPS設定が適切に行われると、ログインページは次のURLでも提供できるようになります。

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

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

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

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

ログインページにHTTPSを要求するには次を追加してセキュリティ構成を変更します。

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

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

<intercept-url pattern="/login*" access="permitAll" requires-channel="https"/>

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

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

5. HTTPとHTTPSの混合

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

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

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

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

<intercept‐url pattern="/**" access="isAuthenticated()" requires‐channel="http"/>

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

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

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

<form-login login-processing-url="/perform_login"/>

/ Perform_loginにHTTPSの使用を強制しないと、そのHTTPバリアントにリダイレクトが発生し、元のリクエストで送信されたログイン情報が失われます。

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

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

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

XML構成の同等のものは、新しいものを追加する必要があります < インターセプトURL> 構成の要素:

<intercept-url pattern="/perform_login" requires-channel="https"/>

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

構成が整っていると、ユーザーはログインできますが、認証されたページにアクセスすることはできません。 Springのセッション固定保護機能のため、HTTPプロトコルでの/homepage.html

5.2. セッション固定保護を無効にする

セッション固定は、HTTPとHTTPSを切り替えるときに回避できない問題です。

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

これを回避するにはs session-fixation-protectiontononeが必要です

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

またはXML経由:

<session-management session-fixation-protection="none"/>

セッション固定保護を無効にするとセキュリティに影響する可能性があります。したがって、セッション固定ベースの攻撃が懸念される場合は、長所と短所を比較検討する必要があります。

6. テスト

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

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

7. 結論

このチュートリアルでは、ログインメカニズムを除いてHTTPを介して通信するSpringWebアプリケーションを構成する方法を見てきました。 ただし、新しい最新のWebアプリケーションは、ほとんどの場合、通信プロトコルとしてHTTPSのみを使用する必要があります。 セキュリティレベルを下げたり、セキュリティ機能( session-fixation-protection など)をオフにしたりすることは、決して良い考えではありません。

このチュートリアルは、GitHubで利用可能なコードベースに基づいています。 チャネルセキュリティ構成は、httpsをアクティブなSpringプロファイルとしてリストすることで有効にできます。