HSTSとは?
HSTS(HTTP Strict Transport Security)は、ブラウザがHTTPS経由でウェブサイトとしかやりとりするWebセキュリティメカニズムです。 ブラウザがHSTSヘッダを見たら、自動的にHTTPSへの将来のリクエストをアップグレードし、ユーザーが明示的にhttp://.をタイプしても、プレーンHTTP経由で接続を拒否します
なぜHSTSマター
有効な SSL 証明書でも、脆弱性が存在します。
SSL ストリッピング
1. 「example.com」(https://なし)
2。 攻撃者は初期のHTTPリクエストを介入します
3. HTTPS への攻撃者のプロキシ、ユーザーに HTTP を提示します
4。 ユーザーは、安全だと考えているが、攻撃者はすべてを見る
HSTSは、ブラウザが初期のHTTPリクエストを行わないことを確実にすることでこれを防ぐことができます。
##HSTSのメリット
- ダウングレード攻撃を防止: HTTP のフォールバックはできません。
- ユーザーブックマークの保護: 古いHTTPブックマークでもHTTPSになります
- 混合コンテンツの限定: サブリソースも HTTPS に強制
- 性能の改善: HTTP→HTTPS のリダイレクトは不要
HSTSヘッダシンタックス
Strict-Transport-Security: max-age=31536000; includeSubDomains; preload
ディレクティブ
| ディレクティブ | コンテンツ |
|---|---|
| 最高年齢 | HSTSを覚える秒 (31536000 = 1年) |
| サブドメイン | すべてのサブドメインにHSTSを適用 |
| プレロード | ブラウザのプレロードリストへの同意 |
HSTSの実装
####Nginxの
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
##Apache
Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
####Cloudflareの
SSL/TLS → Edge 証明書 → HTTP 厳格な輸送セキュリティで有効
###express.js ディレクティブ
const helmet = require('helmet');
app.use(helmet.hsts({
maxAge: 31536000,
includeSubDomains: true,
preload: true
}));
HSTSプリロードリスト
HSTSのプリロードリストは、HTTPS経由でアクセスされるべき唯一のブラウザにハードコードされたドメインのリストです。 これは、最初のリクエストのHTTP脆弱性さえ排除します。
プレロードの要件
1. 有効なSSLの証明書
2。 すべてのHTTPをHTTPSにリダイレクト
3. HSTSヘッダー:
- 最高年齢少なくとも31536000 (1年)
- preloadディレクティブ
プリロードリストへの投稿
1. 条件を確かめて下さい: hstspreload.org でチェック
2. 送信ドメイン: hstspreload.orgのドメインを入力してください
3. 包含のための待ち: ブラウザの更新のために数週間から数か月かかります
プレロード警告
プリロードは永続的(事実上)です。 リストから削除すると、ブラウザの更新が必要です。 特定のすべてのサブドメインが HTTPS を無期限にサポートする場合のみ、プリロードします。HSTSのチェック
ブラウザ DevTools:1. DevTools → ネットワークタブを開く
2. サイトをロードする
3. Strict-Transport-Security の応答のヘッダーを点検して下さい
カールの使用:curl -I https://example.com | grep -i strict
DomScanの使用:
curl "https://domscan.net/v1/health?domain=example.com"
# Reports hasHSTS in security details
前荷の状態:
hstspreload.orgをチェックしてドメインがプリロードされているかどうかを確認します。
HSTS導入戦略
フェーズ1: ショートマックスエイジ
短時間でテストを始めて下さい:
Strict-Transport-Security: max-age=300何かが壊れた場合、ユーザーは5分だけキャッシュされます。
フェーズ 2: 期間を増加させる
HTTPS がどこからでも動作確認した後:
Strict-Transport-Security: max-age=86400
フェーズ 3: サブドメインを追加
すべてのサブドメインが HTTPS をサポートしたら:
Strict-Transport-Security: max-age=2592000; includeSubDomains
##フェーズ4:フル展開+プリロード
安定した操作の年後:
Strict-Transport-Security: max-age=31536000; includeSubDomains; preloadその後、プリロードリストに提出してください。
一般的なHSTSの問題
HTTPSなしのサブドメイン: サブドメインがサブドメインを破る 開発環境: 生産からキャッシュされるHSTSはローカルのdevを破ります CDN/プロキシヘッダー: HSTSヘッダが仲介業者によって除去されていないことを確認してください ミックスコンテンツ: すべてのリソースは HTTPS でなければなりません。HSTS は埋め込まれた HTTP リソースを修正しません。HSTSは、機密データを処理し、すべてのHTTPSサイトに強く推奨されるあらゆるウェブサイトにとって不可欠です。