[レポート]Amazon S3 のセキュリティ:コントロール、ポリシー、監査システムの実装に参加しました。#STG302 #AWSreInvent

[レポート]Amazon S3 のセキュリティ:コントロール、ポリシー、監査システムの実装に参加しました。#STG302 #AWSreInvent

2025.12.04

はじめに

こんにちは。AWS re:Invent2025 に参加しているオペレーション部のshiinaです。
現地からワークショップ「Amazon S3 のセキュリティ:コントロール、ポリシー、監査システムの実装 #STG302」のレポートをお伝えします。

セッション概要

タイトル
Amazon S3 のセキュリティ:コントロール、ポリシー、監査システムの実装 #STG302
詳細

Amazon S3 は、事実上あらゆるワークロードに対応できるセキュリティ設定ときめ細かなアクセス制御機能を提供します。
本ワークショップでは、Amazon S3 のアクセス管理ツールを使って、アクセス権限を管理し、スケーラブルなユーザーベースおよびリソースベースのポリシーを定義する方法を学びます。
また、「誰が・どのデータに・どこから・いつ」アクセスしているかを把握するための、データの監視および監査テクニックも習得します。
実践的なシナリオを通じて、さまざまな S3 のセキュリティツールや機能を使い分け、幅広いセキュリティ要件に対応する方法を学びます。
基本的なアクセス制御から高度な監査システムまで、あらゆるワークロードの複雑さに対応可能な強固なセキュリティ対策を実装するための知見を身につけましょう。

スピーカー

  • Erick Dame,Sr, Solutions Architect, AWS
  • Christie Lee, Principal Solutions Architect, Amazon Web Services

レベル
300
20251203_083010

S3 バケットのセキュリティ対策とベストプラクティス

S3 バケットを安全に運用するためのベストプラクティスとAWS が提供する各種セキュリティ機能について、複数の観点から解説が行われました。
S3 セキュリティは一度設定して終わりではなく、継続的な取り組みであることが重要です。

1. S3 セキュリティの基本的な考え方

セキュリティは継続的なジャーニーであり、設定・検証・監視・改善のサイクルを回し続けることが重要。
ガバナンスやコンプライアンス要件が厳しい企業では、NIST サイバーセキュリティフレームワークなどのフレームワークに沿って S3 バケットを管理する取り組みが有効。
20251203_083246

2. アクセス制御とポリシー設計

  • IAM / 属性ベースアクセス制御(ABAC)
    IAM ポリシーに加え、属性ベースアクセス制御(ABAC)を活用することで、タグやメタデータに基づいた柔軟なアクセス制御が可能。
    ABAC を組み合わせることで、組織の規模が大きくなってもスケーラブルにポリシーを管理しやすくなる。
  • バケットポリシーと ACL
    バケットポリシーを中心にアクセス制御を設計し、 ACL(アクセスコントロールリスト)は非推奨。

3. 監査と可視化:設定・アクセスの「見える化」

  • IAM Access Analyzer による監査
    IAM Access Analyzer を使うことで、意図しないS3 バケットの外部公開や、他アカウントからアクセス可能になっていないかを自動的に検出する。

  • S3 メタデータとインベントリレポート
    オブジェクトのメタデータにより、誰がいつどのようにオブジェクトを操作したのか、バージョンや属性の変化などをトレースが可能に。
    S3 インベントリレポートを利用してオブジェクト情報を定期的に一覧化・分析することで、ガバナンスやコンプライアンス対応にも有効。

4. 設定変更・コンプライアンス違反の検知と自動対応

  • AWS Config による変更検知
    AWS Config を用いることで、S3 バケットやオブジェクトの設定変更(暗号化の有無、公開設定の変更など)を追跡可能。
    設定変更が組織のルールやコンプライアンス基準から外れた場合に検出できるため、監査証跡として利用可能。

  • Systems Manager による自動修復
    AWS Systems Manager を組み合わせることで、Config が検知した問題に対して自動的に修復・ポリシー適用が可能です。
    例えば、パブリックアクセス設定を自動的に戻すケースが挙げられます。

5. データ保護のための具体的な機能

  • バケットポリシーとネットワーク境界
    バケットポリシーを用いて、特定の VPC エンドポイントからのみアクセスを許可するなど、ネットワーク境界と組み合わせた防御が可能。
    S3 のパブリックアクセスブロック設定も併用し、誤設定による公開を防ぐことが推奨される。
  • オブジェクトロック(Object Lock)
    一定期間オブジェクトの削除・上書きを防止でき、ランサムウェア対策やコンプライアンスに有用。

やってみた

本ワークショップの構成は次の通りです。

  • ラボ1 - ガバナンス
    バケットとオブジェクトを保護する S3 バケットのセキュリティのデフォルトを確認する
    リソース制御ポリシー (RCP) とサービス制御ポリシー (SCP) を使用して複数のアカウントを管理する
  • ラボ2 - 識別
    S3 メタデータを設定し、S3 メタデータ ジャーナルとインベントリ テーブルをクエリして、最近の削除と暗号化されていないオブジェクトを検出する
  • ラボ3 - 保護
    S3 バケットポリシーを使用して S3 バケットへのアクセス許可を付与および制限する
    IAM ユーザーまたはロールを使用して S3 Access Grants を構成する方法と、S3 Access Grants 認証情報を使用するように AWS CLI を設定
  • ラボ4 - 検出
    S3 バケット内の脅威の存在を検出するために GuardDuty マルウェア保護を構成する
  • ラボ5 - 応答
    AWS Config と Access Analyzer を使用して、アカウントと組織内でパブリックアクセスを持つバケットを検出し、意図しないパブリックアクセスを修正する

ラボ1- ガバナンス

新規バケット作成後に、ブロックパブリックアクセス、暗号化(SSE-S3)、チェックサムがデフォルトで有効になっていることを確認しました。
1111

また、AWS Organizations を使用してガードレールを作成し、Amazon S3 へのアクセスを管理する方法を学べます。
AccountOuDiagram

  • サービス制御ポリシー (SCP) の例
{
  "Version": "2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Deny",
      "Action": "s3:PutObject",
      "Resource": "*",
      "Condition": {
        "Null": {
          "s3:x-amz-server-side-encryption": "true"
        }
      }
    },
    {
      "Effect": "Deny",
      "Action": "s3:PutObject",
      "Resource": "*",
      "Condition": {
        "StringNotEquals": {
          "s3:x-amz-server-side-encryption": "AES256"
        }
      }
    }
  ]
}
  • リソース制御ポリシー (RCP)の例
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "EnforceS3TlsVersion",
            "Effect": "Deny",
            "Principal": "*",
            "Action": "s3:*",
            "Resource": "*",
            "Condition": {                
                "NumericLessThan": {
                    "s3:TlsVersion": [
                        "1.2"
                    ]
                }
            }
        },
        {
            "Sid": "EnforceKMSEncryption",
            "Effect": "Deny",
            "Principal": "*",
            "Action": "s3:PutObject",
            "Resource": "*",
            "Condition": {
                "Null": {
                    "s3:x-amz-server-side-encryption-aws-kms-key-id": "true"
                }
            }
        }
    ]
}

ラボ2 - 識別

S3 メタデータを使用して、バケット内の最近削除されたオブジェクトや暗号化されていないオブジェクトを検出を体験しました。

実際にメタデータ設定と統合を実施し、Athena を利用してクエリを行いました。
2222

3333

参考になるクエリサンプル集

  • 過去24時間以内に削除されたオブジェクト抽出
SELECT bucket,
	key,
	version_id,
	last_modified_date
from journal
where last_modified_date >= (current_date - interval '1' day)
	and record_type = 'DELETE';
  • 過去24時間以内に削除されたオブジェクト(S3ライフサイクルルールによる削除を除外)
SELECT bucket,
	key,
	version_id,
	last_modified_date,
	requester,
	source_ip_address
from journal
where last_modified_date >= (current_date - interval '1' day)
	and requester != 's3.amazonaws.com'
	and record_type = 'DELETE';
  • リクエスト元 IP 分析
SELECT source_ip_address,
	count(source_ip_address) as count
from journal
group by source_ip_address;
  • オブジェクト タグまたはユーザーメタデータが最近更新されたオブジェクトの抽出
SELECT key,
	version_id,
	record_timestamp,
	record_type,
	object_tags,
	user_metadata,
	size,
	last_modified_date
FROM journal
WHERE record_type = 'UPDATE_METADATA'
ORDER BY record_timestamp DESC
LIMIT 50
  • 暗号化されていないオブジェクト数と容量取得
SELECT encryption_status,
	count(key) as number_of_keys,
	sum(size) as total_capacity_in_bytes
FROM "inventory"
group by encryption_status
  • 過去1時間で削除が最も多かったトップレベルプレフィックスをプレフィックスの総容量サイズに基づいてソートして抽出
 SELECT 
    regexp_extract(j.key, '^([^/]+)', 1) as top_level_prefix,
    COUNT(*) as delete_count,
    ROUND(CAST(SUM(COALESCE(i.size, 0)) AS DOUBLE) / 1024.0 / 1024.0, 2) as total_capacity_deleted_in_MB
FROM journal j 
LEFT JOIN inventory i ON j.bucket = i.bucket AND j.key = i.key 
WHERE j.record_type = 'DELETE' 
    AND j.record_timestamp >= (NOW() - interval '1' hour)
GROUP BY regexp_extract(j.key, '^([^/]+)', 1) 
ORDER BY delete_count DESC

メタデータを利用するユースケースとしては、次のものが挙げられます。

  • 最近アクセスされたオブジェクトを追跡する
  • コンプライアンスのため暗号化されていないオブジェクトを識別する
  • 最近の変更を監査する

ラボ3 - 保護

S3 バケットポリシーと S3 Access Grants でアクセス制御の挙動について学ぶことができます。
ワークショップで利用したポリシー

  • HTTPS 以外で S3 バケットへのアクセスを制限する
{
	"Id": "S3-Security-Deny-unless-HTTPS",
	"Version": "2012-10-17",
	"Statement": [{
		"Action": "s3:*",
		"Effect": "Deny",
		"Principal": "*",
		"Resource": "arn:aws:s3:::BUCKET_NAME/*",
		"Condition": {
			"Bool": {
				"aws:SecureTransport": false
			}
		}
	}]
}
  • SSE-KMS 暗号化を強制する
{
	"Id": "S3-Security-Deny-unless-SSE-KMS",
	"Version": "2012-10-17",
	"Statement": [{
		"Effect": "Deny",
		"Principal": "*",
		"Action": "s3:PutObject",
		"Resource": "arn:aws:s3:::BUCKET_NAME/ssekms-only/*",
		"Condition": {
			"StringNotEquals": {
				"s3:x-amz-server-side-encryption": "aws:kms"
			}
		}
	}]
}
  • S3 VPC エンドポイントを通過するリクエストのみにアクセスを制限
{
	"Id": "S3-Security-Deny-unless-VPC-endpoint",
	"Version": "2012-10-17",
	"Statement": [{
		"Action": "s3:*",
		"Effect": "Deny",
		"Resource": "arn:aws:s3:::BUCKET_NAME/*",
		"Condition": {
			"StringNotEquals": {
				"aws:sourceVpce": "VPC_ENDPOINT_ID"
			}
		},
		"Principal": "*"
	}]
}

4444

S3 Access Grants についても、設定から実際の挙動を試すことができました。
S3 Access Grants で重要なポイントは次の通りです。

  • Grants を作成する前にバケットが存在していること(プレフィックスまでは不要)
  • IAM Identity Center を利用したフェデレーションユーザーに直接権限を付与ができる

ラボ4 - 検出

Amazon GuardDuty Malware Protection for S3 でマルウェア対策の有効化を実施しました。
Eicar ファイルをバケットにアップロードしてマルウェアとして検出・タグ付けされることが確認できました。
5555

ラボ5 - 応答

AWS Config ルール「s3-bucket-public-read-prohibited」を利用して、パブリックアクセス可能なバケットの検出を行いました。
IAM Access Analyzer と IAM Access Analyzer for S3 それぞれを利用してパブリックなバケットを把握する方法が学べます。
6666

7777

まとめ

本ワークショップではサイバーセキュリティフレームワーク全体にわたって S3 を保護するための知識を得ることができます。
Access Grants や GuardDuty Malware Protection for S3 など、比較的新しい機能を実際に触ってみることができます。
セキュリティレベルとガバナンスを高めていきたい方におすすめできるセッションでした。

#STG302
#AWSreInvent

この記事をシェアする

FacebookHatena blogX

関連記事