S3 書き込みの TLS 強制設定の確認

S3 の書き込みに HTTPS を必須とし、アップロードデータを転送中に保護してください。

説明

S3 バケットでアップロードなどの書き込みに TLS を必須としないと、権限を持つクライアントの平文 HTTP リクエストが許可される場合があります。転送中の暗号化がなければ、アップロードデータがネットワーク上で漏えいする可能性があります。

AWS::S3::BucketPolicy の aws:SecureTransport 条件で非暗号化リクエストを明示的に拒否してください。HTTPS を許可するステートメントを追加するだけでは、別のポリシーが許可する HTTP リクエストを遮断できません。

想定される影響

  • 平文でアップロードするデータがネットワーク上で傍受・改ざんされる可能性があります。
  • 組織が定める転送中の暗号化要件を満たせない場合があります。

対処方法

  • 保護が必要な操作とリソースについて、aws:SecureTransport: false のリクエストを Deny するポリシーを設定してください。
  • アプリケーションとデプロイスクリプトが HTTPS エンドポイントを使用することを確認してください。
  • AWS サービス間の呼び出しではネットワーク条件の情報が省略される場合があります。必要なサービスプリンシパルの例外を確認し、連携が引き続き機能することをテストしてください。

例

以下はバケットポリシーの抜粋です。BucketName には有効で一意なバケット名を指定してください。最初の公開読み取りポリシーには別途公開アクセスの確認が必要で、パブリックアクセスブロックが適用されると設定が拒否される場合があります。

変更前

yaml
Resources:
  S3Bucket:
    Type: AWS::S3::Bucket
    Properties:
      BucketName: !Ref BucketName
  BucketPolicy:
    Type: AWS::S3::BucketPolicy
    Properties:
      Bucket: !Ref S3Bucket
      PolicyDocument:
        Statement:
          - Sid: PublicReadForGetBucketObjects
            Effect: Allow
            Principal: "*"
            Action: s3:GetObject
            Resource: !Sub arn:aws:s3:::${S3Bucket}/*

このステートメントは公開読み取りだけを許可し、書き込み権限も HTTPS の強制も提供しません。別のポリシーが書き込みを許可していても、ここには HTTP 書き込みを拒否する条件がありません。

変更後

yaml
Resources:
  S3Bucket:
    Type: AWS::S3::Bucket
    Properties:
      BucketName: !Ref BucketName
  BucketPolicy:
    Type: AWS::S3::BucketPolicy
    Properties:
      Bucket: !Ref S3Bucket
      PolicyDocument:
        Statement:
          - Sid: EnsureSSL
            Effect: Deny
            Principal: "*"
            Action: s3:PutObject
            Condition:
              Bool:
                aws:SecureTransport: false
            Resource: !Sub arn:aws:s3:::${S3Bucket}/*

オブジェクトへの HTTP s3:PutObject リクエストを拒否します。アップロード権限と、ほかの操作での TLS 強制は別途必要です。最初の例の公開読み取り許可も削除されます。

参考資料