Spring HTTP / HTTPSチャネルセキュリティ
1. 概要
このチュートリアルでは、Springのチャネルセキュリティ機能を使用したhow to use HTTPS to protect your application’s login pageを示します。
転送中に機密データの整合性を保護するには、認証にHTTPSを使用することが重要です。
この記事は、セキュリティの層を追加することにより、Spring Security Login tutorialの上に構築されています。 エンコードされたHTTPSチャネルを介してログインページを提供することにより、認証データを保護するために必要な手順を強調します。
2. チャネルセキュリティなしの初期設定
前述の記事で説明したセキュリティ構成から始めましょう。
Webアプリを使用すると、ユーザーは以下にアクセスできます。
-
認証なしの/anonymous.html、
-
/login.html、および
-
ログインに成功した後の他のページ(/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サーバー構成
ログインページをHTTPS–your 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としてリストすることで有効にできます。