ACLを使用しているS3バケットへの対応方法

このブログシリーズ 「クラウドセキュリティ 実践集」 では、一般的なセキュリティ課題を取り上げ、「なぜ危険なのか?」 というリスクの解説から、「どうやって直すのか?」 という具体的な修復手順(コンソール、AWS CLI、Terraformなど)まで、分かりやすく解説します。
この記事では、SecurityHubで検出される「[S3.12] ACL は、S3 汎用バケットへのユーザーアクセスの管理に使用しないでください。」について解説します。

ポリシーの説明
[S3.12] ACL は、S3 汎用バケットへのユーザーアクセスの管理に使用しないでください。
Amazon S3 の Security Hub コントロール – AWS Security Hub
このコントロールは、Amazon S3 汎用バケットがアクセスコントロールリスト (ACL) を持つユーザーアクセス許可を提供するかどうかをチェックします。バケットでのユーザーアクセスを管理するために ACL が設定されている場合、コントロールは失敗します。
リスク: S3アクセスコントロールリスト(ACL)は、バケットやオブジェクトへのアクセス制御を行うためのレガシーな仕組みです。ACLの使用は、IAMポリシーやS3バケットポリシーと比較して、以下のようなリスクや課題を引き起こす可能性があります。
- 管理の複雑性: ACLは、バケットレベルとオブジェクトレベルの両方で設定でき、複数のエンティティに異なるアクセス許可を付与できます。これにより、アクセス制御の管理が複雑になり、意図しないアクセス許可の設定や、設定ミスによるセキュリティリスクが発生しやすくなります。
- IAMポリシーとの一貫性の欠如: IAMポリシーは、AWSリソース全体にわたる一貫したアクセス制御を提供しますが、ACLはS3に特化した仕組みであり、IAMポリシーとの連携や全体像の把握が難しくなることがあります。
- 監査の困難性: ACLの設定は、IAMポリシーほど一元的に管理・監査することが難しく、誰がどのリソースにどのようなアクセス権を持っているかの追跡が複雑になる可能性があります。
- 機能の制限: IAMポリシーやS3バケットポリシーと比較して、ACLで設定できるアクセス許可の種類や条件に制限があります。例えば、IPアドレスやVPCエンドポイントに基づくアクセス制御はACLでは直接的に行えません。
- 最新のベストプラクティスからの逸脱: AWSの推奨するアクセス制御方法は、より柔軟で強力なIAMポリシーとS3バケットポリシーの使用であり、ACLの使用は推奨されていません。
対策: S3バケットおよびオブジェクトへのアクセス制御には、ACLではなく、IAMポリシーまたはS3バケットポリシーを使用するように移行することが推奨されます。
- バケットポリシーの適用: バケットレベルのアクセス制御は、S3バケットポリシーを使用して定義します。バケットポリシーを使用すると、特定のプリンシパル(IAMユーザー、IAMロール、AWSアカウントなど)に対して、バケット全体または特定のプレフィックスを持つオブジェクトへのアクセス許可を詳細に制御できます。
- IAMポリシーの適用: 特定のIAMユーザーやIAMロールに対して、S3リソースへのアクセス許可を付与する場合は、IAMポリシーを使用します。IAMポリシーは、より広範なAWSリソースに対するアクセス制御を一元的に管理するのに適しています。
- ACLの削除または制限: 既存のS3バケットやオブジェクトにACLが設定されている場合は、それらを削除し、代わりにバケットポリシーまたはIAMポリシーを使用して同等のアクセス許可を付与します。どうしてもACLを使用する必要がある場合は、アクセス許可を必要最小限に制限します。
- デフォルトACLの確認: 新しいバケットやオブジェクトが作成される際のデフォルトACLの設定を確認し、不必要にパブリックアクセスを許可するような設定になっていないか確認します。
修復方法
AWSコンソールでの修復手順
AWSコンソールを用いて、S3バケットおよびオブジェクトのACLを確認し、必要に応じて削除または制限し、代わりにバケットポリシーまたはIAMポリシーを適用します。
- AWSコンソールにログインします。
- ナビゲーションペインから S3 を選択します。
- バケットのリストから、確認したいバケットの名前をクリックします。
- アクセス許可 タブを選択します。
- バケットポリシー セクションを確認し、バケットポリシーが設定されているかどうかを確認します。設定されていない場合は、編集 をクリックしてバケットポリシーを設定します。
- オブジェクトの所有者 セクションを確認し、オブジェクトの所有者がバケット所有者になっていることを確認します(推奨)。
- アクセスコントロールリスト (ACL) セクションを確認します。設定されているACLを確認し、不必要に広範なアクセス許可が付与されていないか確認します。
- ACLを削除または制限するには、編集 をクリックし、不要なアクセス許可を削除または変更します。
- オブジェクトレベルのACLを確認するには、バケット内のオブジェクトを選択し、アクション ドロップダウンメニューから アクセス許可を編集 を選択します。ここでオブジェクトのACLを確認および編集できます。
- IAMポリシーを編集するには、IAMコンソールに移動し、該当するIAMユーザーまたはIAMロールを選択し、ポリシーを編集してS3リソースへの適切なアクセス許可を追加します。

Terraformでの修復手順
TerraformでS3バケットのACLを設定しないようにするには、aws_s3_bucket
リソースの acl
パラメータを明示的に設定しないか、private
に設定します。バケットポリシーを設定するには、aws_s3_bucket_policy
リソースを使用します。
resource "aws_s3_bucket" "example" {
bucket = "my-example-bucket"
acl = "private" # または acl パラメータを省略
# その他の設定 ...
}
resource "aws_s3_bucket_policy" "example" {
bucket = aws_s3_bucket.example.id
policy = jsonencode({
Version = "2012-10-17"
Statement = [
{
Sid = "AllowGetObjectForSpecificUser"
Effect = "Allow"
Principal = {
AWS = "arn:aws:iam::123456789012:user/SpecificUser"
}
Action = "s3:GetObject"
Resource = "${aws_s3_bucket.example.arn}/*"
},
]
})
}
上記の例では、aws_s3_bucket
リソースでACLを private
に設定し、aws_s3_bucket_policy
リソースで特定のIAMユーザーにオブジェクトの読み取り権限を付与するバケットポリシーを設定しています。
オブジェクトレベルのACLを管理する場合は、aws_s3_object
リソースの acl
パラメータを使用しますが、可能な限りバケットポリシーまたはIAMポリシーでの制御を推奨します。
既存のバケットのACLを削除するには、aws_s3_bucket
リソースの acl
パラメータを削除するか、private
に設定し、terraform apply
を実行します。オブジェクトのACLを削除するには、同様に aws_s3_object
リソースの acl
パラメータを削除します。
最後に
今回は、S3アクセスコントロールリスト(ACL)の使用がもたらす管理の複雑性やセキュリティリスク、そしてより推奨されるIAMポリシーまたはS3バケットポリシーへの移行について解説しました。S3リソースへのアクセス制御は、IAMポリシーとバケットポリシーを中心に管理することで、より安全で一貫性のある環境を構築できます。
この問題の検出は弊社が提供するSecurifyのCSPM機能で簡単に検出及び管理する事が可能です。
運用が非常に楽に出来る製品になっていますので、ぜひ興味がある方はお問い合わせお待ちしております。
最後までお読みいただきありがとうございました。この記事が皆さんの役に立てば幸いです。