CroudFront + S3 with Terraform でセキュリティレスポンスヘッダーを設定する

サイトを公開するにあたりセキュリティ対策のためのレスポンスヘッダーとしてX-Content-Type-OptionsContent-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コンソールでは設定内容が以下のようになります。

Webコンソールでの編集画面

一方、以下は設定しておりません。

  • Content-Security-Policy

Content-Security-Policy (CSP) については、将来的に使いたくなる機能やサードパーティリソースなどが増えるたびに許可設定を見直す必要がありえるため運用コストが高いと考えました。そんなに人気サイトというわけではないので攻撃されるリスクもそこまで高くないと判断し設定しておりません。CSPをしっかりと導入した事例および解説として以下のZennの記事(Zenn自体が導入した話)が非常に参考になりますのでおすすめです。

ここは実際に運営するサイトの構成や使い方、セキュリティの考え方等によって変わる部分ですので、各自でふさわしい設定をしてください。

余談

2023年11月にTerraformを体系的に学べる書籍がオライリーから発売されました。Terraformを使ってきてそろそろ体系的に学びたいという人におすすめです。

詳解 Terraform 第3版 ―Infrastructure as Codeを実現する
Yevgeniy Brikman (著), 松浦 隼人 (翻訳)
- amazon.co.jp
最終更新 2024-05-25

広告

本記事はお役に立てたでしょうか。本ブログでは匿名でのコメントや少額から(15円~)の寄付などを受け付けております。もしお役に立てたのであればご支援いただけると大変励みになります。

Built with Hugo
テーマ StackJimmy によって設計されています。