Amazon S3 バケットにある特定のフォルダへのアクセス権をユーザーに付与するにはどうすればよいですか?
Amazon Simple Storage Service (Amazon S3) ユーザーが Amazon Simple Storage Service (Amazon S3) の特定のフォルダにしかアクセスできないように制限したいと考えています。
解決策
ユーザーとバケットが同じ AWS アカウントに属している場合は、IAM ポリシーを使用してユーザーにバケットフォルダへのアクセス権を付与します。IAM ポリシーがアクセスを許可している場合、バケットポリシーを更新する必要はありません。
注: Amazon S3 バケットポリシーが IAM ユーザーによるフォルダへのアクセスを明示的に拒否している場合は、バケットポリシーを更新する必要があります。
IAM ユーザーと S3 バケットが異なる AWS アカウントに属している場合は、IAM ポリシーとバケットポリシーの両方でアクセス権を付与します。詳細については、「Amazon S3 バケットに対し、オブジェクトをアップロードするアクセス権を、別の AWS アカウントのユーザーに付与するにはどうすればよいですか?」を参照してください。
シングルユーザーポリシー
次の IAM ポリシーの例では、David という名前のユーザーに自分のフォルダ (/home/David) のみへのフルアクセス権を付与しています。
{ "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/*" ] } ] }
このポリシーには以下のようなステートメントが含まれています。
- AllowStatement1: ユーザー自身の AWS アカウントに属するバケットを一覧表示することをユーザーに許可しています。この権限により、ユーザーはコンソール内のバケットに移動できます。
- AllowStatement2A: DOC-EXAMPLE-BUCKET 内のフォルダを一覧表示することをユーザーに許可しています。この権限により、ユーザーはコンソール内のフォルダに移動できます。
- AllowStatement3: DOC-EXAMPLE-BUCKET/home/David フォルダ内のコンテンツを一覧表示することをユーザーに許可しています。
- AllowStatement4A: DOC-EXAMPLE-BUCKET/home/David フォルダ内でのみ、読み取り、書き込み、削除などのすべてのアクションを許可しています。
マルチユーザーポリシー
ポリシーを記述するときに、リソースの正確な名前がわからない場合があります。たとえば、Amazon S3 バケットにユーザー独自のオブジェクトを所有することをすべてのユーザーに許可したいとします。ユーザーごとに個別のポリシーを作成する代わりに、ポリシー変数を使用して複数のユーザーに適用されるグループポリシーを作成します。ポリシー変数を使用すると、ポリシー内でプレースホルダーを指定できます。AWS にリクエストを行う場合に、ポリシーが評価されるとき、プレースホルダーがリクエストの値に置き換わります。
次の例は、ポリシー変数 ${aws:username} を使用する Amazon S3 バケットのポリシーを示しています。
注: この記事では aws:username キーを使用して、「Adele」や「David」などユーザーのファーストネームを返します。 この値は、IAM ユーザーを作成するときに指定したユーザー名から取得されます。場合によっては、それぞれグローバルに一意な値を使用した方が良い場合もあります。例えば、IAM ロールを使用する場合、aws:username の値はその IAM エンティティでは有効ではない場合があります。詳細については、「プリンシパルキーの値」を参照してください。
{ "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}/*" ] } ] }
このポリシーでは、ユーザーが AWS にリクエストを行うと、変数がリクエスタとしてのユーザー名に置き換わります。例えば、David がリクエストを行うと、${aws:username} は David として解決されます。
注: IAM ユーザーは、DOC-EXAMPLE-BUCKET/ などのすべてのプレフィックスを親レベルで一覧表示できます。ユーザーは、任意のグラフィカルユーザーインターフェイス (GUI) クライアントでホームディレクトリに移動できます。親レベルでのリストアクションを指定しない場合は、コマンドラインインターフェイスを使用して特定のフォルダに直接アクセスする必要があります。
IAM アイデンティティセンターのユーザープリンシパルを使用してアクセスを制限する
AWS IAM アイデンティティセンター (AWS シングルサインオンの後継) のユーザープリンシパルを使用して、S3 バケットフォルダへのアクセスを制御できます。IAM アイデンティティセンターのディレクトリの各ユーザーには、一意のユーザー ID があります。フォルダへのアクセスを制限したい各ユーザーには、ポリシー変数 $ {identityStore: userId} を使用してください。注: S3 フォルダを作成するときは、フォルダ名が IAM アイデンティティセンターのディレクトリ内のユーザーの ID に対応していることを確認してください。
例えば、IAM アイデンティティセンターのディレクトリ内のユーザー ('John') に対応する一意のユーザー IDが 1111111111-2a2aaa222-bb33-4444-5555-5cc5555c555c であると仮定します。John を管理するには、S3 バケットにこのユーザー用のフォルダを /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}/*" ] } ] }
関連情報
関連するコンテンツ
- 質問済み 6年前lg...