ALB×ApacheでHSTS対応




HTTP Strict Transport Security

HSTS とは HTTP から HTTPS へのリダイレクト途中の通信を改ざんされたり中間者攻撃を防ぐための設定です。 HTTP の通信は改ざんチェックは行われないため HTTPS のリダイレクト途中の通信でサイトに対して攻撃されてしまうと検知するすべがありません。 HSTS を導入するとサーバ側で HTTPS にリダイレクトされるのではなくブラウザ内部で HTTPS へのリダイレクトが行われます。通信の始点であるブラウザから HTTPS 通信することによって通信の途中で HTTP 通信することがありません。

AWS ALB 配下で HSTS の設定を行う方法


  • http:80プロトコルでアクセスしようとすると、ブラウザUAがhttpsにインターナルリダイレクトする仕組み。
  • サーバーサイドのhttpsリダイレクトではフィッシング詐欺や(httpな)ブックマークによる直アクセスにおいて、リダイレクト前のhttp:80アクセスが脅威にさらされる。
  • レスポンスヘッダにHSTSヘッダを付記して、ブラウザUAにキャッシュさせることで実現させている。
  • HSTSヘッダはhttpsプロトコル下でないとブラウザUAがキャッシュしてくれない。
  • したがってあいかわらず初回のhttpアクセスでは電文は露見する。
  • ただし後述のpreload仕様では初回のhttp:80アクセスさえhttpsインターナルリダイレクトを強要することができる。

ALBのバックエンドで80ポートをフォワードしている場合の対策



  • ALB単体はルールセットでhttpsリダイレクトを組めるがカスタムヘッダーを付記することができないため、バックエンドが付記してやる必要がある
  • ALB<--->バックエンドがhttp:80プロトコルであっても、UAにとっての終端であるALBとの通信がhttps:ならがHSTSヘッダをキャッシュてくれる
  • バックエンドはとにかく常時HSTSヘッダを付記してやる

Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"

バックエンドがhttpsリダイレクトまでやる場合


  • バックエンドでHSTSヘッダを常時付記しつつ、httpsリダイレクトする
  • ALBがUA<--->ALBのプロトコルをフォワードヘッダに付記してくれるのでhttp:80プロトコルの場合のみリダイレクトする=RewriteCond %{HTTP:X-Forwarded-Proto} =http

# HSTSヘッダを常時付記
Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
# Rewrite
RewriteEngine On
# ブラウザUA<--->ALBがhttp:80プロトコルの場合httpsにリダイレクト
RewriteCond %{HTTP:X-Forwarded-Proto} =http
RewriteRule .* https://%{HTTP:Host}%{REQUEST_URI} [L,R=permanent]

preload




  • ユーザがWebサイトにHTTPで初回アクセスした場合でもHSTSが有効になり、初回から必ずHTTPSでアクセスを行うための仕組みのことです。事前に自身の所持するWebサイトのドメインをHSTS preloadリストに登録する必要があります。
  • HSTS preloadリストとは主要ブラウザ(Chrome、Firefox、Safari、IE11、Edge、Opera)が参照するHSTS対応サイトリストのことです。HSTS preloadリストに登録されているWebサイトは、ブラウザが予めSSL/TLSを使用することが分かるようになるため、初回からHSTS機能が有効になります。

AWSのCLB(Classic Load Balancer)配下にHSTSとPreload設定を行う方法 | N-LAB


申請は次が条件なので対応後に登録する


  • サブドメインはだめ
  • HSTS対応していないとだめ

動作確認




  • httpsアクセスすると、レスポンスヘッダにstrict-transport-securityがある
  • httpアクセスすると、307インターナルリダイレクトしてhttps通信した

対応済のサイト

curl -v -sS -o /dev/null -L -k https://www.rakuten-sec.co.jp
< HTTP/2 200 
< server: Apache
< strict-transport-security: max-age=31536000;
< content-type: text/html
< date: Thu, 03 Aug 2023 05:41:44 GMT
< server-timing: ak_p; desc="1691041304439_1611081229_148344902_765_433_13_0_15";dur=1 
Share:

0 Comments:

コメントを投稿