組織でバケットを作成し、その周りに正しいACLを確保する方法は、S3バケットをプロビジョニングする自動ツール(内部でTerraformを使用)を提供することです。したがって、ユーザーがtestBucket
という名前の新しいバケットをリクエストすると、testBucket
という名前のバケットが作成され、testBucket-user
という名前のIAMユーザーも作成されます。自動化により、testBucket-user
のポリシーは、このユーザーに対して許可されるアクションのみが次のようになるようになっています。
"s3:ListBucket",
"s3:PutObject",
"s3:GetObject"
上記のアクションが許可される唯一の許可されたリソースは、testBucket
バケットです。
同様に、自動化は、自動化がバケットポリシーを配置することを保証し、その上で許可される唯一のアクションが上記の3つのアクションであり、ユーザーのみが保証するようにしますtestBucket-user
ただし、必要に応じて(ビジネス上正当な場合は)、作成されたバケットポリシーを必要に応じて変更します。そのため、最近、そのような要件が1つありました。特定のバケットには、公的に意図されたすべての画像を保持するためのフォルダーを含める必要がありました。
上記の要件をプロビジョニングするために、2つのオプションがありました。
principal:*
を許可し、バケット内のそのフォルダ内のすべてのオブジェクトをデフォルトでパブリックにできるようにします。セキュリティチームとして、私たちは最初のオプションがより論理的に見えたという理由だけで、より確信していました。ただし、最初のオプションの問題は、このフォルダー内のすべてのオブジェクト(公的に意図されているか、それ以外の場合でも)がデフォルトでパブリックになることです。
コミュニティはこのあたりでどう思いますか? AWS/IAMエキスパート、上記の2つのオプションからどのようなものを選択しますか、またその理由は何ですか?
ポリシー、パブリックアクセスのブロック、ACLの使用に加えて、次の方法で特定のアクションへのアクセスを制限することもできます。
参照リンク:https://aws.Amazon.com/premiumsupport/knowledge-center/secure-s3-resources/
それがあなたの質問への答えではないことはわかっています-しかし、一般公開されているアイテム用に完全に別個のバケットを用意することは、バケット内の単一のフォルダーを制限することよりも意味があると思います。バケットは自由に作成できます。したがって、暗号化、ストレージ、アーカイブ、ライフサイクルの要件が異なる可能性が高いため、すべてのプライベートオブジェクトとパブリックオブジェクトを1つのバケットに保持する価値はほとんどありません。
公開されている画像は、S3 API経由でアクセスされる可能性は低く、http経由である可能性が高いため、Cloudfront経由でのS3アクセスを制限し、http経由でバケットへのすべての相互作用を制限することをお勧めします-公開する必要があります。
最後に、本当に必要な場合は、問題のフォルダにprincipal:*
を配置する傾向があります。これにより、簡単に検出して一目で確認できます。バケットポリシーでは、この「フォルダー」内のオブジェクトに対してs3:GetObject
のみを許可する必要があります。また、s3:ListBucket
は、バケット内のフォルダだけでなく、バケット全体にも適用されます。注意してください。
S3にはファイルシステムがないことを思い出してください。S3は単にフォルダーのように見えますが、S3は内部でfolder/item
のキーを解析してフォルダー内のアイテムのように見えます。
私自身はS3の専門家ではないと思いますが、いくつかの理由から、最初のオプションの方が意味があると思います。最も重要なのは、開発者が必然的に間違ったACLを設定し、パブリックアクセスを許可することです。悪意からではなく、怠惰からではなく、無知からです(たとえば、あなたの会社の開発者の離職率は何ですか?.
したがって、very重要な点は、実際には両方を実行できることです(バケットポリシー+ IAM)。これは、推奨される安全なアプローチだと感じています。ユーザーは、バケットポリシーとIAMを介して割り当てられた権限の共通部分である操作のみを実行できます。これについて私が好きなのは、それが可能なことへの境界を提供することですが、バケット自体に適用されます。私の提案は、バケットをロックしたままにすることですが、フォルダーへのパブリックアクセスのみを許可し、おそらくパブリックフォルダー内のオブジェクトに対するPutObjectACLを許可します。
わずかに正接しているが関連性が高い場合は、cloudfrontを使用できるため、S3バケットの名前が明らかになることはありません。さらに、cloudfrontにパブリックフォルダーへのアクセスのみを許可できます。このようにして、バケットはロックされたままになり、cloudfrontはパブリックフォルダーのみに制限されます。