ユーザーポリシーの例
このセクションでは、Amazon S3 へのユーザーアクセスを管理するための IAM ユーザーポリシーをいくつか示します。アクセスポリシー言語の詳細については、「Amazon S3 のポリシーとアクセス許可」を参照してください。
次のサンプルポリシーは、プログラムでテストする場合に機能します。ただし、Amazon S3 コンソールでこれらを使用するには、コンソールに必要な追加のアクセス許可を付与する必要があります。このようなポリシーの Amazon S3 コンソールでの使用の詳細については、「チュートリアル: ユーザーポリシーを使用したバケットへのアクセスのコントロール」を参照してください。
トピック
1 つのバケットへのアクセスを IAM ユーザーに許可する
この例では、AWS アカウントの IAM ユーザーに awsexamplebucket1
という 1 つのバケットに対するアクセス許可を付与して、ユーザーがオブジェクトを追加、更新、削除できるようにします。
このポリシーでは、ユーザーに s3:PutObject
、s3:GetObject
、s3:DeleteObject
のアクセス許可を付与するだけでなく、s3:ListAllMyBuckets
、s3:GetBucketLocation
、および s3:ListBucket
のアクセス許可も付与します。これらが、コンソールで必要とされる追加のアクセス許可です。またコンソール内のオブジェクトのコピー、カット、貼り付けを行うためには、s3:PutObjectAcl
および s3:GetObjectAcl
アクションが必要となります。コンソールを使用してユーザーにアクセス許可を付与してテストする例の解説については、「チュートリアル: ユーザーポリシーを使用したバケットへのアクセスのコントロール」を参照してください。
{ "Version":"2012-10-17", "Statement":[ { "Effect":"Allow", "Action": "s3:ListAllMyBuckets", "Resource":"arn:aws:s3:::*" }, { "Effect":"Allow", "Action":["s3:ListBucket","s3:GetBucketLocation"], "Resource":"arn:aws:s3:::awsexamplebucket1" }, { "Effect":"Allow", "Action":[ "s3:PutObject", "s3:PutObjectAcl", "s3:GetObject", "s3:GetObjectAcl", "s3:DeleteObject" ], "Resource":"arn:aws:s3:::awsexamplebucket1/*" } ] }
バケット内のフォルダへのアクセスを各 IAM ユーザーに許可する
次の例では、Alice と Bob という 2 人の IAM ユーザーに examplebucket
バケットに対するアクセス許可を付与して、この 2 人がオブジェクトを追加、更新、削除できるようにします。ただし、バケット内の単一のフォルダに全ユーザーのアクセスを制限したいとします。フォルダを作成する際、ユーザー名と同じフォルダ名にすることもできます。
awsexamplebucket1 Alice/ Bob/
各ユーザーに本人のフォルダのみへのアクセス権を付与するには、各ユーザー用のポリシーを作成し、個別にアタッチします。例えば、Alice に次のポリシーをアタッチして、awsexamplebucket1/Alice
フォルダに対する専用の Amazon S3 のアクセス許可を付与することができます。
{ "Version":"2012-10-17", "Statement":[ { "Effect":"Allow", "Action":[ "s3:PutObject", "s3:GetObject", "s3:GetObjectVersion", "s3:DeleteObject", "s3:DeleteObjectVersion" ], "Resource":"arn:aws:s3:::awsexamplebucket1/Alice/*" } ] }
次に、ユーザー Bob
にも同様のポリシーをアタッチし、Bob
の値にフォルダ 名として Resource
を指定します。
各ユーザーにポリシーをアタッチするのではなく、ポリシー変数を使用する単一のポリシーを作成し、そのポリシーをグループにアタッチできます。まずグループを作成し、Alice
と Bob をいずれもそのグループに追加する必要があります。次のポリシーの例では、awsexamplebucket1/${aws:username}
フォルダに対する Amazon S3 の一連のアクセス許可を付与しています。ポリシーが評価されると、ポリシー変数 ${aws:username}
はリクエスタのユーザー名で置き換えられます。たとえば、Alice がオブジェクトの PUT リクエストを送信した場合、Alice が examplebucket/Alice
フォルダにオブジェクトをアップロードする PUT オペレーションのみが許可されます。
{ "Version":"2012-10-17", "Statement":[ { "Effect":"Allow", "Action":[ "s3:PutObject", "s3:GetObject", "s3:GetObjectVersion", "s3:DeleteObject", "s3:DeleteObjectVersion" ], "Resource":"arn:aws:s3:::awsexamplebucket1/${aws:username}/*" } ] }
ポリシー変数を使用する場合は、2012-10-17
をポリシー内で明示的に指定する必要があります。アクセスポリシー言語のデフォルトバージョンは 2008-10-17 です。このバージョンでは、ポリシー変数をサポートしていません。
Amazon S3 コンソールで上記のポリシーをテストする場合は、次のポリシーに示すように、コンソールに Amazon S3 の追加のアクセス許可が必要です。これらのアクセス許可をコンソールで使用する方法については、「チュートリアル: ユーザーポリシーを使用したバケットへのアクセスのコントロール」を参照してください。
{ "Version":"2012-10-17", "Statement": [ { "Sid": "AllowGroupToSeeBucketListInTheConsole", "Action": [ "s3:ListAllMyBuckets", "s3:GetBucketLocation" ], "Effect": "Allow", "Resource": "arn:aws:s3:::*" }, { "Sid": "AllowRootLevelListingOfTheBucket", "Action": "s3:ListBucket", "Effect": "Allow", "Resource": "arn:aws:s3:::awsexamplebucket1", "Condition":{ "StringEquals":{ "s3:prefix":[""], "s3:delimiter":["/"] } } }, { "Sid": "AllowListBucketOfASpecificUserPrefix", "Action": "s3:ListBucket", "Effect": "Allow", "Resource": "arn:aws:s3:::awsexamplebucket1", "Condition":{ "StringLike":{"s3:prefix":["${aws:username}/*"] } } }, { "Sid": "AllowUserSpecificActionsOnlyInTheSpecificUserPrefix", "Effect":"Allow", "Action":[ "s3:PutObject", "s3:GetObject", "s3:GetObjectVersion", "s3:DeleteObject", "s3:DeleteObjectVersion" ], "Resource":"arn:aws:s3:::awsexamplebucket1/${aws:username}/*" } ] }
2012-10-17 バージョンのポリシーでは、ポリシー変数の先頭には $
が付きます。使用するオブジェクトキーに $
が含まれている場合、この構文の変化により衝突が発生します。たとえば、ポリシーにオブジェクトキー my$file
を含めるには、$
文字を ${$}
のように使用して my${$}file
と指定します。
IAM ユーザー名は人間が読んで理解できるわかりやすい識別子ですが、グローバルで一意である必要はありません。たとえば、Bob が退職して別の Bob が入社した場合、この別の
Bob が前の Bob の情報にアクセスできます。フォルダを作成する際に、ユーザー名の代わりにユーザー ID を使用することもできます。ユーザー ID はそれぞれ一意であるためです。この場合、${aws:userid}
ポリシー変数を使用するように前述のポリシーを修正する必要があります。ユーザー ID の詳細については、IAM ユーザーガイドの「IAM 識別子」を参照してください。
{ "Version":"2012-10-17", "Statement":[ { "Effect":"Allow", "Action":[ "s3:PutObject", "s3:GetObject", "s3:GetObjectVersion", "s3:DeleteObject", "s3:DeleteObjectVersion" ], "Resource":"arn:aws:s3:::mycorporatebucket/home/${aws:userid}/*" } ] }
バケット内のフォルダへのアクセスを非 IAM ユーザー (モバイルアプリユーザー) に許可する
ユーザーのデータを S3 バケットに保存するモバイルゲームアプリを開発するとします。バケットに各アプリユーザーのフォルダを作成します。また、各ユーザーには各自のフォルダのみにアクセスを制限します。 しかし、ユーザーがアプリをダウンロードしてゲームをプレイし始める前にフォルダを作成することはできません。お客様にはユーザーのユーザー ID がないためです。
この場合、ユーザーには、Login with Amazon、 Facebook、または Google などのパブリックアイデンティプロバイダを使用してアプリにサインインするよう要求できます。ユーザーがこれらのプロバイダの 1 つを使用してアプリにサインインすると、ユーザー ID が設定されるため、お客様はこれを使用して実行時にユーザー固有のフォルダを作成することができます。
これにより、AWS Security Token Service のウェブ ID フェデレーションを使用して、アイデンティプロバイダからの情報をアプリと一元化し、各ユーザーの一時的なセキュリティ認証情報を取得することができます。続いて、IAM ポリシーを作成して、アプリがバケットにアクセスできるようにしたり、ユーザー固有のフォルダの作成、データのアップロードなどのオペレーションを実行できるようにすることができます。ウェブ ID フェデレーションの詳細については、IAM ユーザーガイドの「ウェブ ID フェデレーションについて」を参照してください。
Amazon S3 で共有フォルダを持つことをグループに許可する
次のポリシーをグループにアタッチすることで、グループ内の全メンバーに Amazon S3 のフォルダ mycorporatebucket/share/marketing
へのアクセス権が付与されます。グループメンバーは、この指定のフォルダのオブジェクトに対してのみ、ポリシーに示されている Amazon S3 の特定のアクセス許可を付与されます。
{ "Version":"2012-10-17", "Statement":[ { "Effect":"Allow", "Action":[ "s3:PutObject", "s3:GetObject", "s3:GetObjectVersion", "s3:DeleteObject", "s3:DeleteObjectVersion" ], "Resource":"arn:aws:s3:::mycorporatebucket/share/marketing/*" } ] }
すべてのユーザーに対し、企業バケットの特定部分のオブジェクトの読み取りを許可する
次の例では、AllUsers
というグループを作成し、AWS アカウントのすべての IAM ユーザーを含めます。次に、GetObject
フォルダ内のオブジェクトに対してのみ GetObjectVersion
と mycorporatebucket/readonly
のアクセス権をグループに付与するポリシーをアタッチします。
{ "Version":"2012-10-17", "Statement":[ { "Effect":"Allow", "Action":[ "s3:GetObject", "s3:GetObjectVersion" ], "Resource":"arn:aws:s3:::MyCorporateBucket/readonly/*" } ] }
パートナーに対し、企業バケットの特定部分へのファイルのドロップを許可する
次の例では、パートナー会社を表す WidgetCo
というグループを作成します。パートナー会社でアクセス許可が必要な個人やアプリケーションのために IAM ユーザーを作成し、そのユーザーをグループに入れます。
次に、企業バケット PutObject
内の次のフォルダに対する mycorporatebucket/uploads/widgetco
アクセス権をグループに付与するポリシーをアタッチします。
このバケットに対する他の操作を WidgetCo
グループに禁止するには、AWS アカウントで Amazon S3 のリソースに対する PutObject
以外の Amazon S3 のアクセス許可を明示的に拒否するステートメントを追加します。このステップは、AWS アカウント内のどこかで、ユーザーに Amazon
S3 リソースへの幅広いアクセス権を付与するポリシーが使われている場合にのみ必要です。
{ "Version":"2012-10-17", "Statement":[ { "Effect":"Allow", "Action":"s3:PutObject", "Resource":"arn:aws:s3:::mycorporatebucket/uploads/widgetco/*" }, { "Effect":"Deny", "NotAction":"s3:PutObject", "Resource":"arn:aws:s3:::mycorporatebucket/uploads/widgetco/*" }, { "Effect":"Deny", "Action":"s3:*", "NotResource":"arn:aws:s3:::mycorporatebucket/uploads/widgetco/*" } ] }