サイトを公開するにあたりセキュリティ対策のためのレスポンスヘッダーとしてX-Content-Type-OptionsやContent-Security-Policyなどを設定することが推奨されます。本記事ではAWSのCloudFrontでこれらのセキュリティヘッダーをTerraformを使って設定する方法を紹介します。
前提
CloudFrontではLambda@EdgeやCoundFront Functionsを使ってカスタムレスポンスヘッダを設定することができますが、コードを記述しなくても条件に沿ったレスポンスヘッダの付与が可能です。
ちなみに今回のようなセキュリティヘッダーはマネージドレスポンスヘッダーポリシーとしてあらかじめ定義されているものもありますので、まずはそれで要件を満たせるかどうかを判断するのがよいと思います。
まとめると、レスポンスヘッダーの設定は以下の方法があります。
方法 | 自由度 | 手間 |
---|---|---|
Lambda@Edge または CloudFront Functions | 高い | 大きい |
レスポンスヘッダーポリシー | そこそこ | そこそこ |
事前定義されたレスポンスヘッダーポリシー | 低い | 小さい |
まずは一番下の事前定義されたポリシーの利用がおすすめです。設定するヘッダーや値をカスタマイズしたい場合は真ん中のポリシーを自作するパターンがよいでしょう。もしリクエストの内容やアクセス元の情報などによって分岐したいといったCloudFrontのbehaviorでは条件が書けないパターンでのみ一番上のコードを書く方法がよいかと思います。
以下では真ん中のレスポンスヘッダーポリシーを自分で定義する方法を紹介します。
ちなみにWebコンソールを使う場合は以下の記事の通りの手順で設定可能です。
Terraformでの設定方法
TerraformでこれらをCloudFrontに設定するには以下のようにレスポンスヘッダーポリシーを定義しそれをキャッシュビヘイビアーで response_headers_policy_id
として指定します。
resource "aws_cloudfront_response_headers_policy" "security_headers" {
name = "security-headers-policy"
security_headers_config {
# 実際の要件に沿って設定をしてください
strict_transport_security {
access_control_max_age_sec = 31536000
include_subdomains = true
override = true
}
frame_options {
frame_option = "SAMEORIGIN"
override = true
}
referrer_policy {
referrer_policy = "no-referrer-when-downgrade"
override = true
}
xss_protection {
mode_block = true
protection = true
override = true
}
content_type_options {
override = true
}
}
}
resource "aws_cloudfront_distribution" "distribution" {
# 〜〜中略〜〜
default_cache_behavior {
# 〜〜中略〜〜
# cache behaviorの中で上記のポリシーを指定する
response_headers_policy_id = aws_cloudfront_response_headers_policy.security_headers.id
}
}
参考: Resource: aws_cloudfront_response_headers_policy - Terraform Registry
本サイトでの設定内容の説明
上記のTerraformの例は実際にこのサイトで設定しているものです(2024年3月現在)。以下のものを設定しています。
- Strict-Transport-Security
- X-Frame-Options
- Referrer-Policy
- X-XSS-Protection
- X-Content-Type-Options
Webコンソールでは設定内容が以下のようになります。
一方、以下は設定しておりません。
- Content-Security-Policy
Content-Security-Policy (CSP) については、将来的に使いたくなる機能やサードパーティリソースなどが増えるたびに許可設定を見直す必要がありえるため運用コストが高いと考えました。そんなに人気サイトというわけではないので攻撃されるリスクもそこまで高くないと判断し設定しておりません。CSPをしっかりと導入した事例および解説として以下のZennの記事(Zenn自体が導入した話)が非常に参考になりますのでおすすめです。
ここは実際に運営するサイトの構成や使い方、セキュリティの考え方等によって変わる部分ですので、各自でふさわしい設定をしてください。
余談
2023年11月にTerraformを体系的に学べる書籍がオライリーから発売されました。Terraformを使ってきてそろそろ体系的に学びたいという人におすすめです。