地方エンジニアの学習日記

興味ある技術の雑なメモだったりを書いてくブログ。たまに日記とガジェット紹介。

【入門】HSTS

目次

HSTSとは

HSTS(HTTP Strict Transport Security)は、ウェブセキュリティポリシーのメカニズムの一つで、ウェブサイトがブラウザに対してHTTPSを通じてのみアクセスするように要求するために使用されます。このメカニズムは、ウェブサイトとそのユーザー間の通信を保護するために設計されており、特に中間者攻撃(Man-In-The-Middle Attack)から保護することを目的としています。

HSTSは、ウェブサーバーからブラウザへのレスポンスヘッダーにStrict-Transport-Securityを設定することによって機能します。このヘッダーには、ポリシーの有効期間(max-age)が秒単位で指定され、オプションとしてサブドメインにポリシーを適用するかどうか(includeSubDomains)、およびウェブサイトがブラウザの事前読み込みリストに追加されることを許可するかどうか(preload)を指定することができます。

以下のようなヘッダー返すとこの設定により、ブラウザは次の31536000秒(約1年)間、このウェブサイトへのすべてのリクエストをHTTPSを通じて送信するようになります。また、includeSubDomainsディレクティブにより、サブドメインに対しても同様のポリシーが適用されます。

Strict-Transport-Security: max-age=31536000; includeSubDomains

RFC

RFC 6797では、HSTSポリシーがどのようにブラウザに伝達されるか、ポリシーの要件、ブラウザがポリシーにどのように従うべきかなどが詳細に記述されています。また、Strict-Transport-Security HTTPヘッダーの使用方法についても説明しています。

tex2e.github.io

HSTS Preload(HTTP Strict Transport Security Preload)とは

HSTS Preload(HTTP Strict Transport Security Preload)は、ウェブサイトがブラウザや他のユーザーエージェントに対して、常にHTTPSを使用して接続することを要求する仕組みです。しかし、HSTS Preloadは通常のHSTSメカニズムをさらに一歩進めたもので、ウェブサイトをブラウザに組み込まれた「プリロードリスト」に事前に登録します。これにより、ユーザーがそのウェブサイトに初めてアクセスする際から、自動的にHTTPSを使用するようになります。

https://hstspreload.org/ にあらかじめドメインを登録しておくことで、初回からhttpsの通信で行うようにブラウザに通知し初回アクセスを含め、常にhttpsでのアクセスを可能にします。これに登録するには以下の要件を満たす必要があります。2024年現在ハードルはそこまで高くないのかなと思います(個人の感想)

  • includeSubdomainを付加
  • 有効期限は1年以上
  • preloadの指定

Firefoxが実装している HSTS プリロードリストの登録確認方法は以下のページを見ることで確認することができます。ちなみにpreload自体はRFCには記載がないので各ブラウザの実装次第になりそうでした。(ChromeFirefoxSafari、Internet Explorer11、Edge、Operaでは対応していそうだった)

searchfox.org

ちなみにcurlwgetも対応している。

curl.se

www.gnu.org

その他

誤った設定をしてしまったら

HSTS(HTTP Strict Transport Security)を誤って設定してしまった場合、特にmax-ageパラメータを非常に長く設定してしまった場合、訪問者のブラウザが長期間にわたってその設定を記憶し、HTTP接続を拒否し続けることがあります。これは、ウェブサイトがHTTPSを使用できない状態になった場合に問題を引き起こす可能性があります。以下は、誤ったHSTS設定を修正するための一般的なステップです。

  1. HSTSヘッダーの更新 ウェブサーバーの設定を更新し、HSTSヘッダーにmax-age=0を設定します。これにより、HSTSポリシーが即座に無効化されるように指示します。

  2. プリロードリストからの削除 ウェブサイトがHSTSプリロードリストに登録されている場合は、プリロードリストからウェブサイトを削除するリクエストを送信する必要があります。これは、HSTS Preloadリストの公式ウェブサイトで行うことができますが、削除プロセスは時間がかかる可能性があり、すべてのユーザーのブラウザから削除されるまでに数ヶ月かかる場合があります。

hstspreload.org

HSTSプリロードリストからの削除は、すぐには反映されず、ブラウザの更新を待つ必要があるというのはhstsのページにもある通りなので設定するときは慎重にやりましょうって感じですね。

.devのTLDはブラウザ側でHSTS強制するようになって

.devと.appがHSTS preload listに追加されている。Google が管理する多数の TLD を HSTS に追加していくというのは過去にも発表されているので今後も増えていくのだろう。

qiita.com

developers-jp.googleblog.com

HTTPSに自動で切り替えるChromeHTTPS Upgrade

なるほど。こんな機能が...

asnokaze.hatenablog.com

常時SSL化

2016年あたりから言われてる話っぽい。いまだにhttpのサイトはまあまあ見るし少しずつ割合は減っていくんだろうな

webtan.impress.co.jp

ingress nginxはデフォルトで有効

preloadをtrueにすることでpreload listへの登録の要件を満たすことができる。

kubernetes.github.io

Googleにおける暗号化トラフィック割合

100%に近い値を出してるのかと思いきや2018年あたりから横ばいのようで95%あたりの数値となっていた。

transparencyreport.google.com

参考情報