Amazon S3(以下、S3)は、静的ファイルの配信やバックアップ、データレイクなど多用途に利用される非常に便利なストレージサービスです。しかし、設定ミスによる意図しないデータの外部公開(情報漏洩)が後を絶ちません。
本記事では、実務でS3バケットを安全に運用するために、公開設定ミスを防ぐための具体的なチェックリスト、安全なバケットポリシーの設定例、および設定確認のためのAWS CLIコマンド例を解説します。
対象読者
- AWS環境の構築・運用を担当するインフラエンジニア、バックエンドエンジニア
- S3バケットのセキュリティ設定を見直したい実務担当者
S3の公開設定ミスを防ぐための3つの防御壁
S3のアクセス制御は複数の機能が絡み合っています。安全性を確保するためには、以下の3つの防御壁を正しく理解し、設定する必要があります。
- ブロックパブリックアクセス (Block Public Access: BPA)
- バケットポリシー (Bucket Policy)
- アクセス制御リスト (ACL: Access Control List)
現在、AWSの推奨事項としては、特別な理由がない限りACLを無効化し、アクセス制御をIAMポリシーとバケットポリシーに一元化することが推奨されています。
S3公開設定確認チェックリスト(実務用)
設計時および構築後に確認すべきチェックリストです。新規バケット作成時や定期的なセキュリティ監査の際にご活用ください。
| 確認項目 | 期待される設定値 | 確認方法・判断基準 | 対応優先度 |
|---|---|---|---|
| 1. ブロックパブリックアクセス (BPA) | すべてオン (True) | バケット単位、またはアカウント単位で「パブリックアクセスをすべてブロック」が有効になっているか。 | 高 (必須) |
| 2. ACLの有効性 | 無効 (Bucket owner enforced) | ACLが有効になっていないか。特別な要件がない限り、ACLは無効化してポリシー制御に一本化する。 | 高 |
| 3. バケットポリシーのPrincipal | 特定のIAMロール/ユーザー、またはAWSサービス |
"Principal": "*" になっていないか。公開バケットにする場合を除き、原則として特定のエンティティのみに制限する。 |
高 (必須) |
| 4. バケットポリシーのCondition | IP制限、VPCエンドポイント制限など | 外部からのアクセスを許可する場合、aws:SourceIp や aws:sourceVpc などの条件制約(Condition)が適切に設定されているか。 |
中 |
| 5. 暗号化の設定 | 有効 (SSE-S3 または SSE-KMS) | デフォルトの暗号化が有効になっているか。 | 中 |
| 6. ライフサイクルルール | 適切に設定されているか | 不要なデータが永続的に残らないよう、有効期限や移行ルールが設定されているか。 | 低 |
安全な設定例
1. CloudFormationによる安全なバケット定義例
以下は、ブロックパブリックアクセスを有効化し、ACLを無効化した状態でS3バケットを作成するAWS CloudFormation(YAML)のテンプレート例です。
AWSTemplateFormatVersion: '2010-09-09'
Description: 'Secure S3 Bucket Template'
Resources:
SecureBucket:
Type: 'AWS::S3::Bucket'
Properties:
BucketName: !Sub 'my-secure-data-bucket-${AWS::AccountId}'
# ACLを無効化し、バケット所有者強制(Bucket owner enforced)にする設定
OwnershipControls:
Rules:
- ObjectOwnership: BucketOwnerEnforced
# ブロックパブリックアクセスをすべて有効化
PublicAccessBlockConfiguration:
BlockPublicAcls: true
BlockPublicPolicy: true
IgnorePublicAcls: true
RestrictPublicBuckets: true
# デフォルトの暗号化設定
BucketEncryption:
ServerSideEncryptionConfiguration:
- ServerSideEncryptionByDefault:
SSEAlgorithm: 'AES256'
2. 特定のVPCエンドポイントからのみアクセスを許可するバケットポリシー例
社内システムや特定のVPC内からのみアクセスを許可し、インターネットからの直接アクセスを遮断したい場合のバケットポリシー例です。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "LimitAccessToSpecificVPCE",
"Effect": "Deny",
"Principal": "*",
"Action": "s3:*",
"Resource": [
"arn:aws:s3:::my-secure-data-bucket-123456789012",
"arn:aws:s3:::my-secure-data-bucket-123456789012/*"
],
"Condition": {
"StringNotEquals": {
"aws:sourceVpc": "vpc-0123456789abcdef0"
}
}
}
]
}
※ my-secure-data-bucket-123456789012 および vpc-0123456789abcdef0 はプレースホルダーです。実際の環境に合わせて書き換えてください。
設定確認用 AWS CLI コマンド集
既存のバケットの設定状態を迅速に確認するためのCLIコマンドです。
1. ブロックパブリックアクセスの設定確認
指定したバケットのブロックパブリックアクセス設定を取得します。
aws s3api get-public-access-block --bucket <バケット名>
期待される出力結果(すべて true であること):
{
"PublicAccessBlockConfiguration": {
"BlockPublicAcls": true,
"IgnorePublicAcls": true,
"BlockPublicPolicy": true,
"RestrictPublicBuckets": true
}
}
2. バケットポリシーの取得
意図しない "Principal": "*" や、条件(Condition)のない Allow ルールがないか確認します。
aws s3api get-bucket-policy --bucket <バケット名> --query Policy --output text | jq .
3. オブジェクト所有権(ACL無効化状態)の確認
ACLが完全に無効化されているか確認します。
aws s3api get-bucket-ownership-controls --bucket <バケット名>
期待される出力結果:
ObjectOwnership が BucketOwnerEnforced になっている場合、ACLは無効化されています。
{
"OwnershipControls": {
"Rules": [
{
"ObjectOwnership": "BucketOwnerEnforced"
}
]
}
}
導入時の注意点とよくある失敗
1. 「Deny」ポリシーによる管理者自身のロックアウト
バケットポリシーで "Principal": "*" に対して "Effect": "Deny" を設定する際、条件(Condition)の設定を誤ると、管理者自身も含めて誰もバケットにアクセスできなくなる(ロックアウト)可能性があります。
-
対策: ポリシーを適用する前に、条件式(
StringNotEqualsなど)に管理用IAMロールや特定のIPアドレスが正しく含まれているかをダブルチェックしてください。万が一ロックアウトされた場合は、AWSアカウントのルートユーザー、または十分な権限を持つIAMポリシーを使用してバケットポリシーを削除する必要があります。
2. マルチアカウント環境での考慮不足
他アカウントからオブジェクトがアップロードされる運用の場合、ACLが有効なままだと「アップロードしたアカウントがオブジェクトの所有者」となり、バケット所有者であってもオブジェクトの読み取りや削除ができないトラブルが発生します。
- 対策: 特別な理由がない限り、バケットの「オブジェクト所有権(Object Ownership)」設定で Bucket owner enforced(バケット所有者強制) を選択し、ACLを無効化してください。これにより、他アカウントからアップロードされたオブジェクトの所有権も自動的にバケット所有者に移行します。
まとめ
S3の公開設定ミスを防ぐためには、以下の3原則を徹底することが重要です。
- 「ブロックパブリックアクセス」は原則すべてオンにする
- 「ACL」は無効化し、アクセス制御をポリシーに一元化する
- バケットポリシーで「Deny」を使用する際は、条件設定を慎重に行う
本記事のチェックリストと設定例を参考に、安全なS3運用体制を構築してください。
※AWSの仕様や推奨設定は変更される場合があります。実装の際は、必ず最新のAWS公式ドキュメントを併せてご確認ください。