S3バケットでHTTPでの通信を許容している場合の設定修正手順

このブログシリーズ 「クラウドセキュリティ 実践集」 では、一般的なセキュリティ課題を取り上げ、「なぜ危険なのか?」 というリスクの解説から、「どうやって直すのか?」 という具体的な修復手順(コンソール、AWS CLI、Terraformなど)まで、分かりやすく解説します。

この記事では、HTTPでの通信を許容しているS3バケットについて、そのリスクと対策を解説します。

ポリシーの説明

[S3.5] S3 汎用バケットではリクエストに SSL を使用する必要があります。

Amazon S3 の Security Hub コントロール – AWS Security Hub

このコントロールは、Amazon S3 汎用バケットに SSL を使用するためのリクエストを要求するポリシーがあるかどうかをチェックします。バケットポリシーが SSL を使用するリクエストを必要としない場合、コントロールは失敗します。

リスクとしては、Amazon S3 バケットが SSL (Secure Sockets Layer) を使用しないリクエストを許可している場合、データが暗号化されずに送受信される可能性があります。これにより、通信経路上でのデータの盗聴や改ざんといったセキュリティリスクが高まります。

このリスクを回避するために、S3 バケットポリシーで SSL を要求する設定を行うことが望ましいです。具体的には、バケットポリシーに以下のような条件を追加し、aws:SecureTransportfalse の場合にアクセスを拒否することで、SSL を使用しないリクエストをブロックできます。

修復方法

修正するためにはバケットポリシーを変更し、HTTPSのみの接続許可に強制させる必要があります。

AWSコンソールでの修正手順

  1. https://s3.console.aws.amazon.com/s3/buckets から、S3 バケット一覧画面に遷移します。
  2. 該当S3バケットの詳細画面に遷移し、「アクセス許可」タブのバケットポリシーの「編集」をクリックします。

3. 「バケットポリシー」に以下のポリシーを記述し、変更の保存をします。


{
	"Version": "2012-10-17",
	"Statement": [
		{
			"Sid": "AllowOnlyWithSSL",
			"Effect": "Deny",
			"Principal": {
				"AWS": "*"
			},
			"Action": "s3:*",
			"Resource": [
				"arn:aws:s3:::${バケット名}",
				"arn:aws:s3:::${バケット名}/*"
			],
			"Condition": {
				"Bool": {
					"aws:SecureTransport": "false"
				}
			}
		}
	]
}

Terraformでの修復手順

注意点:

  • 既存のバケットに適用する場合は、aws_s3_bucketリソースを削除し、他のリソースでbucket属性に既存のバケット名を指定してください。
  • このコードは新しいバケットを作成します。既存のバケットを変更する場合は、データ損失のリスクを避けるため、慎重に適用してください。
  • 組織のセキュリティ要件に応じて、ポリシーやその他の設定をカスタマイズする必要があるかもしれません。

このTerraformコードを適用することで、S3バケットはHTTPSのみのアクセスを強制し、暗号化が有効になり、パブリックアクセスがブロックされます。これにより、前回のスクリプトで検出された潜在的なセキュリティの問題を解決できます。

# プロバイダーの設定
provider "aws" {
  region = "ap-northeast-1"  # 東京リージョン
}

# S3バケットの作成
resource "aws_s3_bucket" "secure_bucket" {
  bucket = "your-secure-bucket-name"  # バケット名を指定してください
}

# バケットのバージョニングを有効化
resource "aws_s3_bucket_versioning" "versioning" {
  bucket = aws_s3_bucket.secure_bucket.id
  versioning_configuration {
    status = "Enabled"
  }
}

# バケットの暗号化を有効化
resource "aws_s3_bucket_server_side_encryption_configuration" "encryption" {
  bucket = aws_s3_bucket.secure_bucket.id

  rule {
    apply_server_side_encryption_by_default {
      sse_algorithm = "AES256"
    }
  }
}

# HTTPSのみを許可するバケットポリシー
resource "aws_s3_bucket_policy" "secure_policy" {
  bucket = aws_s3_bucket.secure_bucket.id

  policy = jsonencode({
    Version = "2012-10-17"
    Statement = [
      {
        Sid       = "ForceSSLOnlyAccess"
        Effect    = "Deny"
        Principal = "*"
        Action    = "s3:*"
        Resource = [
          aws_s3_bucket.secure_bucket.arn,
          "${aws_s3_bucket.secure_bucket.arn}/*",
        ]
        Condition = {
          Bool = {
            "aws:SecureTransport" = "false"
          }
        }
      }
    ]
  })
}

# パブリックアクセスをブロック
resource "aws_s3_bucket_public_access_block" "public_access_block" {
  bucket = aws_s3_bucket.secure_bucket.id

  block_public_acls       = true
  block_public_policy     = true
  ignore_public_acls      = true
  restrict_public_buckets = true
}

最後に

今回は、S3 バケットが SSL を使用しないリクエストを許可している場合のリスクとその対策についてご紹介しました。SSL を使用しない通信は、データの盗聴や改ざんのリスクを高めます。設定を確認し、必要に応じて本記事を参考に修正してみてください。

この問題の検出は弊社が提供するSecurifyのCSPM機能で簡単に検出及び管理する事が可能です。

運用が非常に楽に出来る製品になっていますので、ぜひ興味がある方はお問い合わせお待ちしております。

最後までお読みいただきありがとうございました。この記事が皆さんの役に立てば幸いです

この記事をシェアする

クラウドセキュリティ対策実践集一覧へ戻る

貴社の利用状況に合わせた見積もりを作成します。

料金プランを詳しく見る