0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ALB×ApacheでHSTS対応

Posted at
js js

HTTP Strict Transport Security HSTSとは

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ヘッダを付記してやる
apacheconf
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
apacheconf

# 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]

動作確認

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

対応済のサイト

sh
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 

対応前

sh
curl -v -sS -o /dev/null -L -k https://my.host.jp

< HTTP/2 200 
< date: Thu, 03 Aug 2023 05:55:41 GMT
< content-type: text/html; charset=UTF-8
< server: Apache
< expires: Thu, 19 Nov 1981 08:52:00 GMT
< last-modified: Thu, 03 Aug 2023 05:55:41 GMT
< cache-control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
< pragma: no-cache
< set-cookie: PHPSESSID=n4b6a8cfjjn5u6tnn0qrob1d07; path=/; SameSite=None; secure; HttpOnly
< vary: Accept-Encoding
sh
curl -v -sS -o /dev/null -L -k https://my.host.jp

< HTTP/2 200 
< date: Thu, 03 Aug 2023 05:57:02 GMT
< content-type: text/html; charset=UTF-8
< server: Apache

# 追加された
< strict-transport-security: max-age=31536000; includeSubDomains; preload

< expires: Thu, 19 Nov 1981 08:52:00 GMT
< last-modified: Thu, 03 Aug 2023 05:57:02 GMT
< cache-control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
< pragma: no-cache
< set-cookie: PHPSESSID=kn8p8th7l9h79g8msd4nhrf1e6; path=/; SameSite=None; secure; HttpOnly
< vary: Accept-Encoding

307 Internal Redirectが発生していればOK

HSTSプリロード

  • ユーザが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 Preload List Submissionにhstsサイトとして登録してもらうことで、初回のhttp通信をブラウザで抑止できるようになる。

  • HSTS対応完了していること
  • 検査対象のDNSとしてサブドメインは不可。ネイキッドドメインであること。
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?