HTTP Strict Transport Securityについて

SSL Server TestでA+を取るために必要なHTTP Strict Transport Securityヘッダ。
設定してみたがサブドメインまで飛ばされてちょいと不都合が起こったので外していた。
よく意味が分かってなかったんだがMDNの資料を見つけたのでこの際設定してみる。
HTTP Strict Transport Security -MDN
このヘッダの役割はブラウザからサイトにアクセスしようとした時にサーバーにアクセする前に強制的にHTTPSに飛ばすことで中間攻撃を防ごうと言うものです。
まあ単純に言えば
example.com/?id=1234 にアクセスするときに一回サーバーにHTTPでアクセスしてその後にHTTPSに飛ばされたとしましょう。
まあお分かりの通り一回HTTPでアクセスしてるので盗聴されていたらそこで終わりです。POSTでも同じです。
これを防ぐためにブラウザでhttpをhttpsに置き換えるように指示するのがこのヘッダです。
しかしこれはHTTPSで一回サーバーにアクセスしたあとに有効になります。
つまり初回HTTPでアクセスした時はたとえこのヘッダを挿入しても無視されます。証明書が有効であることが確認されてから有効になります。(ハッカーに書き換えられオレオレ証明書で通信させられる可能性があります?うーん、そこら辺はよくわからん…)
そのため別にhttpsリダイレクトは別に用意しないといけません。
さてStrict-Transport-Securityヘッダの設定ですが大まかに言うと…
Strict-Transport-Security: max-age=(有効期間[秒]) (; includeSubDomains )(; preload)
という感じです。
max-ageは有効期間です。これを過ぎるとブラウザでHTTPSにならなくなります。証明書の失効時の対策…と言いたいですが、これはアクセスするたびにカウンタがmax-ageにリセットされます。一ヶ月後に設定しても2週間後にまたアクセスするとそこから一ヶ月後になります。
HTTPアクセスを許可するにはmax-ageを0にします。
includeSubDomainsはサブドメインも適用するということです。自分はサブドメインでHTTPを使っているのでMNASの方は外しています。
preloadはHSTS Preload list というHTTPSでアクセスすべきサイトリストに登録するときに使います。HSTS Preloaded Listに説明がありますが、ここの手順に沿って設定すると初回アクセス時からHTTPS通信になるようです(という解釈で合ってるかな)。どうやらこれブラウザに組み込まれているようですね…。Chromeでは「chrome://net-internals/」のHSTSからいろいろできるので覗いてみてください。
というわけでnginxの設定に
add_header Strict-Transport-Security 'max-age=15552000';
を追加しました。
以上です。ありがとうございました。

投稿者: PG_MANA

支離滅裂な自称プログラマー。 C,C++,Rust,JavaScript,PHP,HTML,CSS,OS自作,openSUSE,Arch,旅行 なんか色々してる人 #seccamp 17 19 20 23 #OtakuAssembly