CloudFrontにセキュリティヘッダーポリシーを追加する方法
AWS CloudFrontは、セキュリティヘッダーを利用することで、ブラウザに対してセキュリティに関する指示を送信することが可能です。これにより、クリックジャッキング、MIMEタイプの混乱、HSTS(HTTP Strict Transport Security)などのセキュリティリスクを軽減できます。この記事では、CloudFormationテンプレートを使用して、CloudFrontにStrict-Transport-Security
、X-Frame-Options
、X-Content-Type-Options
のセキュリティヘッダーポリシーを設定する方法を紹介します。
前提条件
- AWSアカウント – 事前にCloudFrontを利用できるアカウントが必要です。
- 適切な権限 – 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
各セキュリティヘッダーの説明
- Strict-Transport-Security: HTTP Strict Transport Security (HSTS) を設定するヘッダーで、HTTPSを強制し、サブドメインも保護します。
AccessControlMaxAgeSec
はHSTSの有効期限を指定しており、ここでは2年間(63072000秒)に設定しています。 - X-Frame-Options: クリックジャッキング攻撃を防ぐため、
SAMEORIGIN
に設定しています。これにより、同一オリジンからのiframe内での読み込みのみが許可されます。 - 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:テンプレートのデプロイ
- テンプレートを保存: 作成したYAMLファイルを保存します(例:
cloudfront-security-headers.yaml
)。 - CloudFormationでテンプレートをデプロイ: AWSマネジメントコンソール、CLI、またはCloudFormationサービスを使ってテンプレートをデプロイします。
CLIコマンド例:
aws cloudformation create-stack --stack-name CloudFrontSecurityHeaders --template-body file://cloudfront-security-headers.yaml
確認方法
デプロイが完了したら、ブラウザのデベロッパーツール(例:ChromeのDevTools)を使用して、CloudFrontディストリビューションから返されるレスポンスヘッダーを確認します。Strict-Transport-Security
、X-Frame-Options
、X-Content-Type-Options
のヘッダーがレスポンスに含まれていることを確認できれば成功です。
結論
AWS CloudFrontにセキュリティヘッダーを設定することで、ウェブアプリケーションをより安全にし、セキュリティ上のリスクを減らすことができます。CloudFormationを使って自動的にヘッダーを設定することで、一貫した設定を維持し、運用の手間を削減できます。