Amazon S3 バケットにある特定のフォルダへのアクセス権をユーザーに付与する方法を教えてください。
AWS Identity and Access Management (IAM) ユーザーが Amazon Simple Storage Service (Amazon S3) の特定のフォルダにしかアクセスできないように制限したいと考えています。
解決策
IAM ユーザーとバケットが同じ AWS アカウントに属している場合は、IAM ポリシーを使用してユーザーにバケットフォルダへのアクセス権を付与します。IAM ポリシーでアクセス権を付与する際に、バケットポリシーを更新する必要はありません。ただし、バケットポリシーが IAM ユーザーによるフォルダへのアクセスを明示的に拒否している場合は、そのバケットポリシーを更新する必要があります。
IAM ユーザーと S3 バケットが異なるアカウントに属している場合は、IAM ポリシーとバケットポリシーの両方でアクセス権を付与します。詳細については、「Amazon S3 バケットに対し、オブジェクトをアップロードするアクセス権を、別の AWS アカウントのユーザーに与えるにはどうすれば良いですか?」を参照してください。
IAM ポリシーでは、単一または複数のユーザーにアクセス権を付与できます。複数のユーザーを対象にする場合、ポリシーにはグループまたは AWS IAM Identity Center ID を含めることができます。
単一ユーザーにアクセス権を付与する
単一のユーザーに、そのユーザー用のフォルダのみへのアクセス権を付与するには、IAM ポリシーを作成します。
ポリシーの例:
{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowStatement1", "Action": [ "s3:ListAllMyBuckets", "s3:GetBucketLocation" ], "Effect": "Allow", "Resource": [ "arn:aws:s3:::*" ] }, { "Sid": "AllowStatement2A", "Action": [ "s3:ListBucket" ], "Effect": "Allow", "Resource": [ "arn:aws:s3:::DOC-EXAMPLE-BUCKET" ], "Condition": { "StringEquals": { "s3:prefix": [ "", "home/", "home/David" ], "s3:delimiter": [ "/" ] } } }, { "Sid": "AllowStatement3", "Action": [ "s3:ListBucket" ], "Effect": "Allow", "Resource": [ "arn:aws:s3:::DOC-EXAMPLE-BUCKET" ], "Condition": { "StringLike": { "s3:prefix": [ "home/David/*" ] } } }, { "Sid": "AllowStatement4A", "Effect": "Allow", "Action": [ "s3:*" ], "Resource": [ "arn:aws:s3:::DOC-EXAMPLE-BUCKET/home/David/*" ] } ] }
注: DOC-EXAMPLE-BUCKET は S3 バケットの名前に置き換えます。
ポリシーに含めることができるステートメントの例を次に示します。
- AllowStatement1 を使用すると、ユーザーはコンソールを使用して自分のアカウントに属するバケットを一覧表示したり、バケットに移動したりできます。
- AllowStatement2A を使用すると、ユーザーはコンソールを使用して DOC-EXAMPLE-BUCKET 内のフォルダを一覧表示したり、フォルダに移動したりできます。
- AllowStatement3 を使用すると、ユーザーは DOC-EXAMPLE-BUCKET/home/Username フォルダ内のコンテンツを一覧表示できます。
- AllowStatement4A を使用すると、DOC-EXAMPLE-BUCKET/home/Username フォルダ内でのみ、読み取り、書き込み、削除用のアクセス許可を含むすべてのアクションが許可されます。
グループポリシーを使用して複数のユーザーにアクセス権を付与する
ポリシー変数を使用して複数ユーザー用のグループポリシーを作成します。
ポリシー変数 ${aws:username} を使用するバケットポリシーの例:
{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowGroupToSeeBucketListInTheConsole", "Action": [ "s3:ListAllMyBuckets", "s3:GetBucketLocation" ], "Effect": "Allow", "Resource": [ "arn:aws:s3:::*" ] }, { "Sid": "AllowRootAndHomeListingOfCompanyBucket", "Action": [ "s3:ListBucket" ], "Effect": "Allow", "Resource": [ "arn:aws:s3:::DOC-EXAMPLE-BUCKET" ], "Condition": { "StringEquals": { "s3:prefix": [ "", "home/" ], "s3:delimiter": [ "/" ] } } }, { "Sid": "AllowListingOfUserFolder", "Action": [ "s3:ListBucket" ], "Effect": "Allow", "Resource": [ "arn:aws:s3:::DOC-EXAMPLE-BUCKET" ], "Condition": { "StringLike": { "s3:prefix": [ "home/${aws:username}/*", "home/${aws:username}" ] } } }, { "Sid": "AllowAllS3ActionsInUserFolder", "Action": [ "s3:*" ], "Effect": "Allow", "Resource": [ "arn:aws:s3:::DOC-EXAMPLE-BUCKET/home/${aws:username}/*" ] } ] }
注: DOC-EXAMPLE-BUCKET は S3 バケットの名前に置き換えます。
上記のポリシーでは aws:username キーを使用し、Adele や David といった、各ユーザーのフレンドリ名を返します。 aws:username の値が特定の IAM ロールで有効でない場合は、一意の ID も使用できます。詳細については、「プリンシパルキーの値」を参照してください。
IAM ユーザーは、DOC-EXAMPLE-BUCKET/ などのすべての親レベルのプレフィックスを一覧表示できます。ユーザーは、任意のグラフィカルユーザーインターフェイス (GUI) クライアントを使用してホームディレクトリに移動することもできます。親レベルでの List アクションを指定していない場合は、コマンドラインインターフェイスを使用して指定したフォルダにアクセスする必要があります。
AWS IAM アイデンティティセンターを使用して複数のユーザーにアクセス権を付与する
S3 バケットフォルダへのアクセスは AWS IAM アイデンティティセンターのプリンシパルに基づいて制御できます。IAM アイデンティティセンターのディレクトリに属する各ユーザーには、一意のユーザー ID があります。フォルダへのアクセス制限を行う各ユーザーには、ポリシー変数 ${identitystore:UserId} を使用します。
S3 フォルダを作成する際、フォルダ名には IAM アイデンティティセンターのディレクトリに属するユーザーの ID と対応する名前を使用します。例えば、ユーザー John の一意のユーザー ID が 1111111111-2a2aaa222-bb33-4444-5555-5cc5555c555c である場合、John を管理するには、S3 バケット内に、John 用のフォルダを /home/1111111111-2a2aaa222-bb33-4444-5555-5cc5555c555c という名前で作成します。ユーザーのユーザー ID を見つけるには、IAM アイデンティティセンターコンソールで各ユーザーに移動するか、DescribeUser API を使用します。
次の IAM ポリシーの例では、${identitystore:UserId} 変数を使用しています。
{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowGroupToSeeBucketListInTheConsole", "Action": [ "s3:ListAllMyBuckets", "s3:GetBucketLocation" ], "Effect": "Allow", "Resource": [ "arn:aws:s3:::*" ] }, { "Sid": "AllowRootAndHomeListingOfCompanyBucket", "Action": [ "s3:ListBucket" ], "Effect": "Allow", "Resource": [ "arn:aws:s3:::DOC-EXAMPLE-BUCKET" ], "Condition": { "StringEquals": { "s3:prefix": [ "", "home/" ], "s3:delimiter": [ "/" ] } } }, { "Sid": "AllowListingOfUserFolder", "Action": [ "s3:ListBucket" ], "Effect": "Allow", "Resource": [ "arn:aws:s3:::DOC-EXAMPLE-BUCKET" ], "Condition": { "StringLike": { "s3:prefix": [ "home/${identitystore:UserId}/*", "home/${identitystore:UserId}" ] } } }, { "Sid": "AllowAllS3ActionsInUserFolder", "Effect": "Allow", "Action": [ "s3:*" ], "Resource": [ "arn:aws:s3:::DOC-EXAMPLE-BUCKET/home/${identitystore:UserId}/*" ] } ] }
注: DOC-EXAMPLE-BUCKET は S3 バケットの名前に置き換えます。

