CloudFrontディストリビューションにセキュリティヘッダーを追加する方法

CloudFrontにセキュリティヘッダーポリシーを追加する方法

AWS CloudFrontは、セキュリティヘッダーを利用することで、ブラウザに対してセキュリティに関する指示を送信することが可能です。これにより、クリックジャッキング、MIMEタイプの混乱、HSTS(HTTP Strict Transport Security)などのセキュリティリスクを軽減できます。この記事では、CloudFormationテンプレートを使用して、CloudFrontにStrict-Transport-SecurityX-Frame-OptionsX-Content-Type-Optionsのセキュリティヘッダーポリシーを設定する方法を紹介します。


前提条件

  1. AWSアカウント – 事前にCloudFrontを利用できるアカウントが必要です。
  2. 適切な権限 – AWS CloudFormationテンプレートをデプロイするための権限が必要です。

ステップ1:CloudFrontセキュリティヘッダーポリシーのCloudFormationテンプレート

以下のテンプレートは、CloudFrontにセキュリティヘッダーポリシーを設定するためのAWS::CloudFront::ResponseHeadersPolicyリソースを作成します。これにより、CloudFrontで返されるレスポンスに対して、指定したセキュリティヘッダーが追加されます。

AWSTemplateFormatVersion: "2010-09-09"
Resources:
  # CloudFront Response Headers Policy
  SecurityHeadersPolicy:
    Type: "AWS::CloudFront::ResponseHeadersPolicy"
    Properties:
      ResponseHeadersPolicyConfig:
        Name: "SecurityHeadersPolicy"
        Comment: "Add security headers to CloudFront responses"
        # Security headers to add to responses
        SecurityHeadersConfig:
          StrictTransportSecurity:
            Override: true
            AccessControlMaxAgeSec: 63072000
            IncludeSubdomains: true
            Preload: true
          FrameOptions:
            Override: true
            FrameOption: "SAMEORIGIN"
          ContentTypeOptions:
            Override: true

各セキュリティヘッダーの説明

  1. Strict-Transport-Security: HTTP Strict Transport Security (HSTS) を設定するヘッダーで、HTTPSを強制し、サブドメインも保護します。AccessControlMaxAgeSecはHSTSの有効期限を指定しており、ここでは2年間(63072000秒)に設定しています。
  2. X-Frame-Options: クリックジャッキング攻撃を防ぐため、SAMEORIGINに設定しています。これにより、同一オリジンからのiframe内での読み込みのみが許可されます。
  3. X-Content-Type-Options: この設定により、ブラウザがコンテンツのMIMEタイプを検証せず、サーバーが提供するMIMEタイプをそのまま使用するようになります。これにより、ブラウザが異なるMIMEタイプでコンテンツを解釈することで発生する可能性のある攻撃を防ぎます。

ステップ2:CloudFrontディストリビューションにポリシーを適用する

CloudFrontディストリビューションを作成し、このセキュリティヘッダーポリシーをレスポンスに適用することで、ウェブページのリクエストに対して常にセキュリティヘッダーを付加します。以下は、AWS::CloudFront::Distributionリソースを使用して、上記のポリシーをCloudFrontに設定する例です。

Resources:
  # CloudFront Distribution with ResponseHeadersPolicy attached
  CloudFrontDistribution:
    Type: "AWS::CloudFront::Distribution"
    Properties:
      DistributionConfig:
        Enabled: true
        DefaultCacheBehavior:
          TargetOriginId: "MyOrigin"
          ViewerProtocolPolicy: "redirect-to-https"
          ResponseHeadersPolicyId: !Ref SecurityHeadersPolicy
        Origins:
          - Id: "MyOrigin"
            DomainName: "your-s3-bucket-name.s3.amazonaws.com"
            CustomOriginConfig:
              OriginProtocolPolicy: "https-only"

Note: your-s3-bucket-name.s3.amazonaws.comは、CloudFrontディストリビューションのオリジンとして設定するS3バケットのドメイン名に置き換えてください。


ステップ3:テンプレートのデプロイ

  1. テンプレートを保存: 作成したYAMLファイルを保存します(例: cloudfront-security-headers.yaml)。
  2. CloudFormationでテンプレートをデプロイ: AWSマネジメントコンソール、CLI、またはCloudFormationサービスを使ってテンプレートをデプロイします。

CLIコマンド例:

aws cloudformation create-stack --stack-name CloudFrontSecurityHeaders --template-body file://cloudfront-security-headers.yaml

確認方法

デプロイが完了したら、ブラウザのデベロッパーツール(例:ChromeのDevTools)を使用して、CloudFrontディストリビューションから返されるレスポンスヘッダーを確認します。Strict-Transport-SecurityX-Frame-OptionsX-Content-Type-Optionsのヘッダーがレスポンスに含まれていることを確認できれば成功です。


結論

AWS CloudFrontにセキュリティヘッダーを設定することで、ウェブアプリケーションをより安全にし、セキュリティ上のリスクを減らすことができます。CloudFormationを使って自動的にヘッダーを設定することで、一貫した設定を維持し、運用の手間を削減できます。

Last modified: 2024-11-14

Author