Spring HTTP/HTTPSチャンネルセキュリティ
1概要
このチュートリアルでは、SpringのChannel Security機能を使用して、HTTPSを使用してアプリケーションのログインページを保護する方法を説明します。
認証にHTTPSを使用することは、転送中に機密データの整合性を保護するために非常に重要です。
この記事は、リンクの上に構築されています。エンコードされたHTTPSチャネルを介してログインページを提供することによって認証データを保護するために必要な手順を強調します。
2チャネルセキュリティなしの初期設定
前述の記事で説明したセキュリティ構成から始めましょう。
ウェブアプリはユーザーがアクセスすることを可能にします:
-
認証なしの
/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 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ページを提供できる必要があります
。これはhttps://en.wikipedia.org/wiki/Transport
Layer
Security[SSL/TLS]サポートが有効になっていることを必要とします。
有効な証明書を使用することも、テスト目的で独自の証明書を生成することもできます。
Tomcatを使用しており、独自の証明書を転用しているとしましょう。まず自己署名証明書を使用して
keystore
を作成する必要があります。
キーストアを生成するには、端末で次のコマンドを発行します。
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
<Connector>
タグは通常configファイルでコメントアウトされているので、キーストア情報のコメントを外して追加するだけで十分です。詳細については、https://tomcat.apache.org/tomcat-8.0-doc/ssl-howto.html[Tomcatの関連文書]を参照してください。
HTTPS構成が設定されていると、ログインページは次のURLでも配信できるようになります。
https://localhost:8443/spring-security-login/login.html
Tomcat以外のWebサーバーでは、異なるが似たような設定が必要になります。
4チャネルセキュリティの設定
この時点で、HTTPとHTTPSの両方でログインページを提供することができます。このセクションでは、HTTPSの使用を強制する方法について説明します。
-
ログインページにHTTPSを要求するには** 以下を追加してセキュリティ設定を変更します。
http.requiresChannel()
.antMatchers("/login** ").requiresSecure();
または、XML設定に
requires-channel =” https”
属性を追加します。
<intercept-url pattern="/login** " access="permitAll" requires-channel="https"/>
この時点以降、ユーザーはHTTPS経由でのみログインできます。すべての関連リンク
/homepage.html
に転送すると、元のリクエストのプロトコルが継承され、HTTPSで配信されます。
1つのWebアプリケーション内でHTTP要求とHTTPS要求を混在させる場合は、注意が必要な点や、追加の設定が必要な点があります。
5 HTTPとHTTPSの混在
セキュリティの観点からは、HTTPS経由ですべてを処理することがベストプラクティスであり、固い目標です。
ただし、HTTPSを排他的に使用することが選択肢ではない場合は、設定に次のように追加することで、HTTPを使用するようにSpringを設定できます。
http.requiresChannel()
.anyRequest().requiresInsecure();
または、
requires-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構成の同等のものは、構成に新しい
<intercept-url>
要素を追加することを必要とします。
<intercept-url pattern="/perform__login" requires-channel="https"/>
あなた自身のアプリケーションがデフォルトの
login-processing-url
(
/login
)を使っているなら、
/login **
パターンがすでにそれをカバーしているので、これを明示的に設定する必要はありません。
設定が整っていれば、ユーザーはログインできますが、認証されたページにはアクセスできません。
Springのセッション固定保護機能のため
5.2.
セッション固定保護
の無効化
Session fixation
は、HTTPとHTTPSを切り替えるときに避けられない問題です。
デフォルトでは、Springはログイン成功後に新しい
session-id
を作成します。
ユーザーがHTTPSログインページをロードすると、そのユーザーの
session-id
cookieは__secureとマークされます。ログイン後、コンテキストはHTTPとhttp://docs.spring.io/spring-security/site/faq/に切り替わります。 HTTPは安全ではないため、faq.html#faq-tomcat-https-session[cookieは失われます]。
これを避けるには
session-fixation-protection
を
none
に設定してください。必要とされている** 。
http.sessionManagement()
.sessionFixation()
.none();
またはXML経由で:
<session-management session-fixation-protection="none"/>
-
セッション固定保護を無効にするとセキュリティに影響を与える可能性があるため、** セッション固定ベースの攻撃を心配している場合は長所と短所を比較検討する必要があります。
6. テスト
ログインせずに(
http://
またはhttps://を使用して)
/anonymous.html
にアクセスし、これらの設定変更をすべて適用すると、HTTPを介してページに移動します。
/homepage.html
のような他のページを直接開くと、HTTPSでログインページに転送され、ログイン後にHTTPを使用して
/homepage.html
に転送されます。
7. 結論
このチュートリアルでは、ログインメカニズムを除いてHTTPを介して通信するSpring Webアプリケーションを設定する方法を見ました。ただし、新しい現代のWebアプリケーションは、ほとんどの場合、通信プロトコルとしてHTTPSを排他的に使用します。セキュリティレベルを下げる、またはセキュリティ機能を無効にする(
session-fixation-protection
など)のはお勧めできません。
このチュートリアルはhttps://github.com/eugenp/tutorials/tree/master/spring-security-mvc-login#readme[GitHubで入手可能なコードベース]に基づいています。チャネルセキュリティ設定は
https
をアクティブリンクとして一覧表示することで有効にできます:/spring-profiles[Spring profile]。