ユーザーポリシーを使用したバケットへのアクセスの制御
このチュートリアルでは、Amazon S3 でのユーザーアクセス許可の使用について説明します。この例では、フォルダを含むバケットを作成します。AWS アカウントで AWS Identity and Access Management IAM ユーザーを作成し、作成したユーザーに対して、Amazon S3 バケットおよびバケット内のフォルダへのアクセス許可を段階的に付与します。
トピック
バケットとフォルダの基本
Amazon S3 のデータモデルはフラットな構造をしています。バケットを作成し、バケットにオブジェクトを保存します。サブバケットやサブフォルダの階層はありませんが、フォルダ階層をエミュレートすることができます。Amazon S3 コンソールなどのツールを使用すると、バケット内の論理フォルダやサブフォルダを表示できます。
companybucket
という名前のバケットには、Private
、Development
、Finance
の 3 つのフォルダと s3-dg.pdf
オブジェクトが含まれていることがコンソールに表示されます。コンソールでは、フォルダおよびサブフォルダからなる論理的な階層が作成するために、オブジェクト名 (キー) を使用します。次の例を考えます。
-
Development
フォルダを作成すると、コンソールによってDevelopment/
というキーを持つオブジェクトが作成されます。区切り記号として末尾のスラッシュ (/
) が付いている点に注意してください。 -
Projects1.xls
というオブジェクトをDevelopment
フォルダにアップロードすると、コンソールによってそのオブジェクトがアップロードされ、Development/Projects1.xls
というキーが設定されます。このキーの
Development
はプレフィックスで、/
は区切り記号です。Amazon S3 API のオペレーションではプレフィックスと区切り記号がサポートされます。例えば、特定のプレフィックスと区切り記号を持つすべてのオブジェクトの一覧を取得できます。コンソールでDevelopment
フォルダを開くと、そのフォルダ内のオブジェクトがコンソールに一覧表示されます。次の例では、Development
フォルダには 1 つのオブジェクトが含まれています。コンソールで
Development
バケットのcompanybucket
フォルダを表示すると、プレフィックスにDevelopment
と区切り文字に/
を指定したリクエストが Amazon S3 に送信されます。コンソールのレスポンスは、コンピュータのファイルシステムのフォルダ一覧と似ています。前述の例は、バケットcompanybucket
にDevelopment/Projects1.xls
というキーを持つ 1 つのオブジェクトがあることを示しています。
コンソールは、オブジェクトのキーを使用して論理階層を推測しています。Amazon S3 には物理階層はありません。Amazon S3 にはフラットなファイル構造にオブジェクトを含むバケットがあるだけです。Amazon S3 API を使用してオブジェクトを作成すると、オブジェクトのキーを使用して論理階層を表すことができます。オブジェクトの論理階層を作成する場合は、個別のフォルダへのアクセスを管理できます。このチュートリアルで、その方法について説明します。
開始する前に、ルートレベルのバケットの内容の概念を理解する必要があります。companybucket
バケットに次のオブジェクトがあるとします。
-
Private/privDoc1.txt
-
Private/privDoc2.zip
-
Development/project1.xls
-
Development/project2.xls
-
Finance/Tax2011/document1.pdf
-
Finance/Tax2011/document2.pdf
-
s3-dg.pdf
これらのオブジェクトキーによって、ルートレベルフォルダ Private
、Development
、および Finance
と、ルートレベルオブジェクト s3-dg.pdf
を持つ論理階層が作成されます。Amazon S3 コンソールでバケット名を選択すると、ルートレベルの項目が表示されます。コンソールにはトップレベルのプレフィックス (Private/
、Development/
、Finance/
) が表示されます。オブジェクトキー s3-dg.pdf
にはプレフィックスがないため、ルートレベル項目として表示されます。
チュートリアルの概要
このチュートリアルでは、3 つのフォルダ (Private
、Development
、Finance
) を含むバケットを作成します。
ユーザーは Alice と Bob の 2 名です。Alice には Development
フォルダにのみ、Bob には Finance
フォルダにのみアクセスを付与します。Private
フォルダの内容は非公開のままにします。このチュートリアルの例では、IAM ユーザー (ユーザー名 Alice と Bob) を作成してアクセスを管理し、必要なアクセス許可を付与します。
IAM では、ユーザーグループを作成して、そのグループのすべてのユーザーに適用するグループレベルのアクセス許可を付与することもできます。これにより、アクセス許可を効果的に管理できます。この演習では、Alice と Bob に共通のアクセス許可が必要です。そのため、Consultants
というグループを作成し、Alice と Bob をそのグループに追加します。最初に、グループポリシーをグループに関連付けてアクセス許可を付与します。次に、特定のユーザーにポリシーを関連付けてユーザー固有のアクセス許可を追加します。
注記
このチュートリアルでは、バケット名に companybucket
、IAM ユーザーに Alice と Bob、グループ名に Consultants
を使用しています。Amazon S3 ではバケット名はグローバルに一意である必要があるため、このバケット名は実際に作成する名前に置き換えてください。
チュートリアルの準備をする
この例では、AWS アカウント 認証情報を使用して、IAM ユーザーを作成します。最初、これらのユーザーにはアクセス許可が何もありません。これらのユーザーに、Amazon S3 の特定のアクションを実行するためのアクセス許可を段階的に付与します。アクセス許可をテストするには、各ユーザーの認証情報を使用してコンソールにサインインします。AWS アカウントの所有者として許可を段階的に付与し、IAM ユーザーとして許可をテストするには、そのたびに異なる認証情報を使用してサインイン/サインアウトする必要があります。これは、1 つのブラウザでテストできますが、2 つのブラウザを使用した方が迅速に処理することができます。一方のブラウザで自分の AWS アカウント 認証情報を使用して AWS Management Console に接続し、もう一方のブラウザで IAM ユーザーの認証情報を使用して接続します。
AWS アカウント 認証情報を使用して AWS Management Console にサインインするには、https://conso4le.aws.amazon.com/
IAM の詳細については、IAM ユーザーガイドAWS Management Consoleの へのサインインページ を参照してください。
IAM ユーザーにサインインのリンクを提供するには
-
AWS Management Console にサインインして、IAM コンソール (https://console.aws.amazon.com/iam/
) を開きます。 -
[Navigation (ナビゲーション)] ペインで、[IAM Dashboard (IAM ダッシュボード)] を選択します。
-
[IAM users sign in link (IAM ユーザーのサインインのリンク)] の URL を書き留めます。このリンクを IAM ユーザーに提供して、IAM ユーザー名とパスワードを使用してコンソールにサインインしてもらいます。
ステップ 1: バケットを作成する
このステップでは、AWS アカウント認証情報を使用して Amazon S3 コンソールにサインインし、バケットの作成、バケットへのフォルダの追加、各フォルダのへの 1 つまたは 2 つのサンプルドキュメントのアップロードを行います。
AWS Management Console にサインインし、Amazon S3 コンソール (https://console.aws.amazon.com/s3/
) を開きます。 -
バケットを作成します。
手順については、バケットの作成 を参照してください。
-
バケットにドキュメントを 1 つアップロードします。
この演習では、このバケットのルートレベルに
s3-dg.pdf
というドキュメントがあることを前提としています。別のドキュメントをアップロードする場合は、s3-dg.pdf
をそのドキュメントのファイル名に置き換えてください。 -
3 つのフォルダ (
Private
、Finance
、Development
) をバケットに追加します。フォルダを作成するステップバイステップの手順については、Amazon Simple Storage Service ユーザーガイドの フォルダを使用して Amazon S3 コンソールのオブジェクトを整理する を参照してください。
-
各フォルダにドキュメントを 1 つか 2 つアップロードします。
この演習では、各フォルダに数個のドキュメントをアップロード済みで、バケットに次のキーを持つオブジェクトが存在することを前提としています。
-
Private/privDoc1.txt
-
Private/privDoc2.zip
-
Development/project1.xls
-
Development/project2.xls
-
Finance/Tax2011/document1.pdf
-
Finance/Tax2011/document2.pdf
-
s3-dg.pdf
手順については、オブジェクトのアップロード を参照してください。
-
ステップ 2: IAM ユーザーとグループを作成する
IAM コンソール
また、Consultants
という名前の管理グループを作成します。続いて、ユーザーをこのグループに追加します。詳細な手順については、「IAM ユーザーグループの作成」を参照してください。
警告
ユーザーとグループを追加するときに、これらのユーザーにアクセス許可を付与するポリシーを関連付けないでください。最初の時点では、アクセス許可はこれらのユーザーに付与せず、以降のセクションで段階的に付与します。まず、これらの IAM ユーザーにパスワードを割り当てておく必要があります。それらのユーザー認証情報を使用して Amazon S3 のアクションをテストし、アクセス許可が意図したとおりに機能することを確認します。
新しい IAM ユーザーの作成の各手順については、「IAM ユーザーガイド」の「AWS アカウント での IAM ユーザーの作成」を参照してください。このチュートリアル用にユーザーを作成するときは、[AWS Management Console アクセス] を選択し、[プログラムによるアクセス] を消去します。
管理グループを作成する手順については、IAM ユーザーガイドの最初の IAM 管理者のユーザーおよびグループの作成を参照してください。
ステップ 3: IAM ユーザーにアクセス許可が付与されていないことを確認する
ブラウザを 2 つ使用する場合は、ここで 2 つ目のブラウザからいずれかの IAM ユーザー認証情報を使用して、コンソールにサインインできます。
-
IAM ユーザーのサインインのリンク (「IAM ユーザーにサインインのリンクを提供するには」を参照) から、いずれかの IAM ユーザー認証情報を使用して AWS Management Consoleにサインインします。
-
https://console.aws.amazon.com/s3/
で Amazon S3 コンソールを開きます。 アクセスが拒否されることを示すコンソールメッセージを確認します。
次に、アクセス許可を段階的にユーザーに付与します。最初に、両方のユーザーに必要なアクセス許可を付与するグループポリシーをアタッチします。
ステップ 4: グループレベルのアクセス許可を付与する
ユーザーが次の内容を実行できるようにします。
-
親アカウントが所有するすべてのバケットを表示します。これを行うには、Bob と Alice に
s3:ListAllMyBuckets
アクションのためのアクセス許可が必要です。 -
companybucket
バケット内のルートレベルの項目、フォルダ、およびオブジェクトを一覧表示します。これを行うには、Bob と Alice にs3:ListBucket
バケットに対するcompanybucket
アクションのためのアクセス許可が必要です。
次に、これらのアクセス許可を付与するポリシーを作成し、Consultants
グループにアタッチします。
ステップ 4.1: すべてのバケットのリストを表示するアクセス許可を付与する
このステップでは、親アカウントが所有するすべてのバケットを表示するのに必要な最小限のアクセス許可をユーザーに付与する管理ポリシーを作成します。そのポリシーを Consultants
グループにアタッチします。その管理ポリシーをユーザーまたはグループにアタッチしたら、親 AWS アカウントが所有するバケットのリストを取得する許可をそのユーザーまたはグループに付与します。
-
AWS Management Console にサインインして、IAM コンソール (https://console.aws.amazon.com/iam/
) を開きます。 注記
ユーザーに許可を付与するため、IAM ユーザーではなく、AWS アカウントの認証情報を使用してサインインします。
-
管理ポリシーを作成します。
-
左側のナビゲーションペインで [ポリシー] を選択し、続いて [ポリシーの作成] を選択します。
-
[JSON] タブを選択します。
-
以下のアクセスポリシーをコピーし、 ポリシーテキストフィールドに貼り付けます。
{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowGroupToSeeBucketListInTheConsole", "Action": ["s3:ListAllMyBuckets"], "Effect": "Allow", "Resource": ["arn:aws:s3:::*"] } ] }
ポリシーは JSON ドキュメントです。そのドキュメントの
Statement
はオブジェクトの配列であり、各オブジェクトが名前と値のペアを使用してアクセス許可を定義しています。前述のポリシーは、1 つの特定のアクセス許可を定義しています。Action
はアクセスの種類を指定します。ポリシーのs3:ListAllMyBuckets
は、定義済みの Amazon S3 アクションです。このアクションは Amazon S3 GET サービスオペレーションをターゲットとし、認証された送信者が所有するすべてのバケットの一覧を返します。Effect
エレメントの値は、特定のアクセスを許可するかどうかを決定します。 -
[ポリシーの確認] を選択します。次のページで、[
AllowGroupToSeeBucketListInTheConsole
Name (名前)] フィールドに「」と入力し、[Create policy (ポリシーの作成)] を選択します。注記
[Summary (概要)] エントリに、このポリシーではどのアクセス許可も付与されないことを示すメッセージが表示されます。このチュートリアルでは、このメッセージを無視しても問題ありません。
-
-
作成した
AllowGroupToSeeBucketListInTheConsole
管理ポリシーをConsultants
グループにアタッチします。管理ポリシーのアタッチの各手順については、「IAM ユーザーガイド」の「IAM ID のアクセス許可の追加および削除」を参照してください。
IAM コンソールで、ポリシードキュメントを IAM ユーザーおよびグループにアタッチします。両方のユーザーがバケットのリストを取得できるように、ポリシーをグループにアタッチします。
-
アクセス許可をテストします。
-
IAM ユーザーのサインインのリンク (「IAM ユーザーにサインインのリンクを提供するには」を参照) から、いずれかの IAM ユーザー認証情報を使用してコンソールにサインインします。
-
https://console.aws.amazon.com/s3/
で Amazon S3 コンソールを開きます。 コンソールにすべてのバケットが表示されますが、バケット内のオブジェクトは表示されません。
-
ステップ 4.2: バケットのルートレベルの内容をユーザーが表示できるようにする
次に、Consultants
グループのすべてのユーザーがルートレベルの companybucket
バケット項目を一覧表示できるようにします。Amazon S3 コンソールで会社のバケットを選択すると、そのバケットのルートレベルのアイテムが表示されます。
注記
この例では、companybucket
を使用して説明します。作成したバケットの名前を使用する必要があります。
バケット名を選択したときにコンソールから Amazon S3 に送信されるリクエスト、Amazon S3 から返されるレスポンス、コンソールでレスポンスがどのように解釈されるかについて理解するために、さらに詳しくフローを見てみましょう。
バケット名を選択すると、コンソールから Amazon S3 にバケットの GET (ListObjects) のリクエストが送信されます。このリクエストには次のパラメータが含まれます。
-
空の文字列を値に持つ
prefix
パラメータ。 -
delimiter
を値に持つ/
パラメータ。
リクエストの例を次に示します。
GET ?prefix=&delimiter=/ HTTP/1.1 Host: companybucket.s3.amazonaws.com Date: Wed, 01 Aug 2012 12:00:00 GMT Authorization: AWS AKIAIOSFODNN7EXAMPLE:xQE0diMbLRepdf3YB+FIEXAMPLE=
Amazon S3 から返されるレスポンスには、次の <ListBucketResult/>
エレメントが含まれます。
<ListBucketResult xmlns="http://s3.amazonaws.com/doc/2006-03-01/"> <Name>companybucket</Name> <Prefix></Prefix> <Delimiter>/</Delimiter> ... <Contents> <Key>s3-dg.pdf</Key> ... </Contents> <CommonPrefixes> <Prefix>Development/</Prefix> </CommonPrefixes> <CommonPrefixes> <Prefix>Finance/</Prefix> </CommonPrefixes> <CommonPrefixes> <Prefix>Private/</Prefix> </CommonPrefixes> </ListBucketResult>
キーの s3-dg.pdf
オブジェクトには区切り文字のスラッシュ (/
) が含まれておらず、このキーは Amazon S3 から <Contents>
エレメントで返されています。一方、このバケットの例の他のキーには区切り文字の /
が含まれています。Amazon S3 は、キーをグループ化し、<CommonPrefixes>
、Development/
、および Finance/
のそれぞれのプレフィックス値の Private/
エレメントを返します。このエレメントは、これらのキーの先頭から、指定した /
区切り記号の出現箇所までのサブ文字列です。
コンソールでこの結果が解釈され、ルートレベルの項目が 3 つのフォルダと 1 つのオブジェクトキーとして表示されます。
Bob または Alice が Development フォルダを開くと、コンソールから Amazon S3 にバケットの GET (ListObjects) のリクエストが送信されます。このリクエストの prefix
パラメータと delimiter
パラメータは、次の値に設定されます。
-
値が
prefix
のDevelopment/
パラメータ。 -
値が「
delimiter
」の/
パラメータ。
レスポンスでは、指定したプレフィックスで始まるオブジェクトのキーが Amazon S3 から返されます。
<ListBucketResult xmlns="http://s3.amazonaws.com/doc/2006-03-01/"> <Name>companybucket</Name> <Prefix>Development</Prefix> <Delimiter>/</Delimiter> ... <Contents> <Key>Project1.xls</Key> ... </Contents> <Contents> <Key>Project2.xls</Key> ... </Contents> </ListBucketResult>
コンソールにオブジェクトキーが表示されます。
ここで、ルートレベルのバケット項目を一覧表示するためのアクセス許可をユーザーに付与する作業に戻ります。バケットの内容を一覧表示するには、ユーザーは s3:ListBucket
アクションを呼び出すためのアクセス許可を持っている必要があります。次のポリシーステートメント を参照してください。ルートレベルのコンテンツのみを表示するようにするために、ユーザーがリクエストで prefix
に値を指定していないことを条件に追加します。これにより、ユーザーはルートレベルのフォルダをダブルクリックできなくなります。最後に、値が「delimiter
」の /
パラメータをユーザーリクエストに組み込むようユーザーに義務付けて、フォルダ形式のアクセスを要求する条件を追加します。
{ "Sid": "AllowRootLevelListingOfCompanyBucket", "Action": ["s3:ListBucket"], "Effect": "Allow", "Resource": ["arn:aws:s3:::companybucket"], "Condition":{ "StringEquals":{ "s3:prefix":[""], "s3:delimiter":["/"] } } }
Amazon S3 コンソールでバケットを選択すると、コンソールはまず Get Bucket location リクエストを送信して、バケットがデプロイされている AWS リージョン を確認します。次に、コンソールはリージョン固有のバケットのエンドポイントを使用して、バケットの GET (ListObjects) のリクエストを送信します。結果として、ユーザーがコンソールを使用する場合は、次のポリシーステートメントに示すように、s3:GetBucketLocation
アクションのためのアクセス許可を付与する必要があります。
{ "Sid": "RequiredByS3Console", "Action": ["s3:GetBucketLocation"], "Effect": "Allow", "Resource": ["arn:aws:s3:::*"] }
ユーザーがルートレベルのバケットの内容を一覧表示できるようにするには
-
AWS Management Console にサインインして、IAM コンソール (https://console.aws.amazon.com/iam/
) を開きます。 IAM ユーザーの認証情報ではなく、AWS アカウントの認証情報を使用してコンソールにサインインします。
-
Consultants
グループにアタッチされている既存のAllowGroupToSeeBucketListInTheConsole
管理ポリシーを以下のポリシーに置き換えます。このポリシーでもs3:ListBucket
アクションは実行できます。Resource
ポリシーの
は、自分のバケットの名前に置き換えてください。companybucket
手順については、「IAM ユーザーガイド」の「IAM ポリシーの編集」を参照してください。詳細な手順では、ポリシーがアタッチされているすべてのプリンシパルエンティティに変更を適用するステップに従ってください。
{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowGroupToSeeBucketListAndAlsoAllowGetBucketLocationRequiredForListBucket", "Action": [ "s3:ListAllMyBuckets", "s3:GetBucketLocation" ], "Effect": "Allow", "Resource": [ "arn:aws:s3:::*" ] }, { "Sid": "AllowRootLevelListingOfCompanyBucket", "Action": ["s3:ListBucket"], "Effect": "Allow", "Resource": ["arn:aws:s3:::
companybucket
"], "Condition":{ "StringEquals":{ "s3:prefix":[""], "s3:delimiter":["/"] } } } ] } -
更新されたアクセス許可をテストします。
-
IAM ユーザーのサインインリンク (「IAM ユーザーにサインインのリンクを提供するには」を参照) を使用して AWS Management Consoleにサインインします。
https://console.aws.amazon.com/s3/
で Amazon S3 コンソールを開きます。 -
作成したバケットを選択すると、ルートレベルのバケット項目がコンソールに表示されます。バケット内のフォルダを選択しても、フォルダの内容は表示されません。そのためのアクセス許可が付与されていないからです。
-
このテストは、ユーザーが Amazon S3 コンソールを使用すると成功します。コンソールでバケットを選択すると、コンソールの実装により、空の文字列を値に持つ prefix
パラメータと、delimiter
を値に持つ /
パラメータが送信されるためです。
ステップ 4.3: グループポリシーの概要
追加したグループポリシーによって、IAM ユーザーである Alice と Bob に次の最小限のアクセス許可が付与されます。
-
親アカウントが所有するすべてのバケットを表示します。
-
companybucket
バケット内のルートレベルの項目を表示します。
ただし、ユーザーが実行できる操作はまだ十分ではありません。次のように、ユーザー固有のアクセス許可を付与します。
-
Development
フォルダのオブジェクトの読み書きを Alice に許可します。 -
Finance
フォルダのオブジェクトの読み書きを Alice と Bob に許可します。
ユーザー固有のアクセスを許可するには、グループではなく特定のユーザーにポリシーを関連付けます。次のセクションでは、Development
フォルダを操作するためのアクセス許可を Alice に付与します。Finance
フォルダを操作するための同様のアクセス許可を Bob に付与するステップを繰り返します。
ステップ 5: IAM ユーザーの Alice に特定のアクセス許可を付与する
次に、Development
フォルダの内容を表示し、そのフォルダ内のオブジェクトを読み書きできるように、追加のアクセス許可を Alice に付与します。
ステップ 5.1: IAM ユーザーの Alice に Development フォルダの内容を一覧表示するためのアクセス許可を付与する
Alice が Development
フォルダの内容を表示できるようにするには、s3:ListBucket
バケットに対して companybucket
アクションを実行するためのアクセス許可を付与するポリシーをユーザー Alice に適用する必要があります (プレフィックス Development/
がリクエストに含まれていることを前提とします)。このポリシーはユーザー (Alice) にのみ適用するため、インラインポリシーを使用します。インラインポリシーの詳細については、「IAM ユーザーガイド」の「管理ポリシーとインラインポリシー」を参照してください。
-
AWS Management Console にサインインして、IAM コンソール (https://console.aws.amazon.com/iam/
) を開きます。 IAM ユーザーの認証情報ではなく、AWS アカウントの認証情報を使用してコンソールにサインインします。
-
Development
フォルダの内容を表示するアクセス許可をユーザー (Alice) に付与するインラインポリシーを作成します。-
左側のナビゲーションペインで、[ユーザー] を選択します。
-
ユーザー名 [Alice] を選択します。
-
ユーザーの詳細ページで、[Permissions (アクセス許可)] タブを選択し、[Add inline policy (インラインポリシーの追加)] を選択します。
-
[JSON] タブを選択します。
-
以下のアクセスポリシーをコピーし、ポリシーのテキストフィールドに貼り付けます。
{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowListBucketIfSpecificPrefixIsIncludedInRequest", "Action": ["s3:ListBucket"], "Effect": "Allow", "Resource": ["arn:aws:s3:::
companybucket
"], "Condition":{ "StringLike":{"s3:prefix":["Development/*"] } } } ] } -
[ポリシーの確認] を選択します。次のページで、[Name (名前)] フィールドに名前を入力し、[Create policy (ポリシーの作成)] を選択します。
-
-
Alice のアクセス許可の変更をテストします。
-
IAM ユーザーのサインインリンク (「IAM ユーザーにサインインのリンクを提供するには」を参照) を使用して AWS Management Consoleにサインインします。
https://console.aws.amazon.com/s3/
で Amazon S3 コンソールを開きます。 -
Amazon S3 コンソールで、Alice がバケットの
Development/
フォルダ内のオブジェクトを一覧表示できることを確認します。ユーザーが
/Development
フォルダ内のオブジェクトを一覧表示するためにそのフォルダを選択すると、Amazon S3 コンソールから Amazon S3 にプレフィックスにListObjects
を指定した/Development
のリクエストが送信されます。ユーザーにはプレフィックスにDevelopment
と区切り文字に/
を指定してオブジェクトを一覧表示するアクセス許可が付与されているため、Amazon S3 からキープレフィックスがDevelopment/
のオブジェクトの一覧が返されてコンソールに表示されます。
-
ステップ 5.2: IAM ユーザーの Alice に Development フォルダでオブジェクトを取得および作成するためのアクセス許可を付与する
Alice が Development
フォルダ内のオブジェクトを読み書きできるようにするには、s3:GetObject
および s3:PutObject
アクションを呼び出すためのアクセス許可が Alice に必要です。次のポリシーステートメントは、そのアクセス許可を付与します (リクエストに prefix
の値を持つ Development/
パラメータが設定されているとします)。
{ "Sid":"AllowUserToReadWriteObjectData", "Action":["s3:GetObject", "s3:PutObject"], "Effect":"Allow", "Resource":["arn:aws:s3:::companybucket/Development/*"] }
-
AWS Management Console にサインインし、Amazon S3 コンソール (https://console.aws.amazon.com/s3/
) を開きます。 IAM ユーザーの認証情報ではなく、AWS アカウントの認証情報を使用してコンソールにサインインします。
-
前のステップで作成したインラインポリシーを編集します。
左側のナビゲーションペインで、[ユーザー] を選択します。
ユーザー名 [Alice] を選択します。
ユーザーの詳細で、[アクセス許可] タブを選択し、[インラインポリシー] セクションを展開します。
前のステップで作成したポリシーの名前の横にある [Edit Policy (ポリシーの編集)] をクリックします。
以下のポリシーをコピーして、 ポリシーテキストフィールドに貼り付け、既存のポリシーと置き換えます。
{ "Version": "2012-10-17", "Statement":[ { "Sid":"AllowListBucketIfSpecificPrefixIsIncludedInRequest", "Action":["s3:ListBucket"], "Effect":"Allow", "Resource":["arn:aws:s3:::
companybucket
"], "Condition":{ "StringLike":{"s3:prefix":["Development/*"] } } }, { "Sid":"AllowUserToReadWriteObjectDataInDevelopmentFolder", "Action":["s3:GetObject", "s3:PutObject"], "Effect":"Allow", "Resource":["arn:aws:s3:::companybucket
/Development/*"] } ] }
-
更新されたポリシーをテストします。
-
IAM ユーザーのサインインリンク (「IAM ユーザーにサインインのリンクを提供するには」を参照) を使用して AWS Management Consoleにサインインします。
-
https://console.aws.amazon.com/s3/
で Amazon S3 コンソールを開きます。 -
Amazon S3 コンソールで、Alice が
Development
フォルダに対するオブジェクトの追加およびダウンロードを行えるようになったことを確認します。
-
ステップ 5.3: バケットの他のフォルダへの IAM ユーザーの Alice のアクセス許可を明示的に拒否する
ユーザー Alice が companybucket
バケットのルートレベルの内容を表示できるようになったことを確認します。Alice は Development
フォルダのオブジェクトを読み書きすることもできます。厳密にアクセス許可を制限したい場合は、バケットの他のフォルダへの Alice のアクセスを明示的に拒否することができます。バケットの他のフォルダへのアクセス許可を Alice に付与する他のポリシー (バケットポリシーまたは ACL) が存在する場合は、この明示的な拒否がそれらのアクセス許可よりも優先されます。
次のステートメントをユーザーの Alice のポリシーに追加すると、Alice が Amazon S3 に送信するすべてのリクエストに prefix
パラメータを含めて値を Development/*
または空の文字列にすることを要求できます。
{ "Sid": "ExplicitlyDenyAnyRequestsForAllOtherFoldersExceptDevelopment", "Action": ["s3:ListBucket"], "Effect": "Deny", "Resource": ["arn:aws:s3:::companybucket"], "Condition":{ "StringNotLike": {"s3:prefix":["Development/*",""] }, "Null" : {"s3:prefix":false } } }
Condition
ブロックには 2 つの条件式があります。これらの条件式の結果は、論理 AND
を使用して結合されます。両方の条件が true の場合、結合された条件の結果は true です。このポリシーの Effect
が Deny
であるため、Condition
が true と評価されると、ユーザーは指定した Action
を実行できません。
-
Null
条件式により、Alice からのリクエストにprefix
パラメータが含まれていることが保証されます。prefix
パラメータはフォルダに類似したアクセスを必要とします。prefix
パラメータのないリクエストを送信すると、Amazon S3 によりすべてのオブジェクトキーが返されます。リクエストに null 値の
prefix
パラメータが含まれている場合、式の評価結果は true になり、Condition
全体の評価結果が true になります。空の文字列をprefix
パラメータの値として許可する必要があります。null 文字列を許可すると、この前の説明に示したコンソールでの操作と同様に、Alice はルートレベルのバケット項目を取得できるようになります。詳細については、ステップ 4.2: バケットのルートレベルの内容をユーザーが表示できるようにする を参照してください。 条件式
StringNotLike
を使用すると、prefix
パラメータの値が指定されていてDevelopment/*
でない場合、リクエストは失敗します。
前のセクションの手順に従って、ユーザー Alice 用に作成したインラインポリシーを再び更新します。
以下のポリシーをコピーして、 ポリシーテキストフィールドに貼り付け、既存のポリシーと置き換えます。
{ "Version": "2012-10-17", "Statement":[ { "Sid":"AllowListBucketIfSpecificPrefixIsIncludedInRequest", "Action":["s3:ListBucket"], "Effect":"Allow", "Resource":["arn:aws:s3:::
companybucket
"], "Condition":{ "StringLike":{"s3:prefix":["Development/*"] } } }, { "Sid":"AllowUserToReadWriteObjectDataInDevelopmentFolder", "Action":["s3:GetObject", "s3:PutObject"], "Effect":"Allow", "Resource":["arn:aws:s3:::companybucket
/Development/*"] }, { "Sid": "ExplicitlyDenyAnyRequestsForAllOtherFoldersExceptDevelopment", "Action": ["s3:ListBucket"], "Effect": "Deny", "Resource": ["arn:aws:s3:::companybucket
"], "Condition":{ "StringNotLike": {"s3:prefix":["Development/*",""] }, "Null" : {"s3:prefix":false } } } ] }
ステップ 6: IAM ユーザーの Bob に特定のアクセス許可を付与する
次に、Finance
フォルダへのアクセス許可を Bob に付与します。Alice にアクセス許可を付与するときに使用した手順に従います。ただし、Development
フォルダは Finance
フォルダに置き換えます。手順については、ステップ 5: IAM ユーザーの Alice に特定のアクセス許可を付与する を参照してください。
ステップ 7: Private フォルダをセキュリティで保護する
この例では、ユーザーは 2 名だけです。グループレベルで最小限必要なすべてのアクセス許可を付与し、ユーザーレベルのアクセス許可は、個々のユーザーレベルでアクセスを許可することが必要な場合にのみ付与しました。このようにすると、アクセス許可を管理する手間を最小限に抑えることができます。ユーザー数が増えるに従って、アクセス許可の管理は煩雑になります。例えば、この例のどのユーザーも Private
フォルダの内容にアクセスできないようにします。Private
フォルダへのアクセス許可を誤って付与しないようにするには、どのような方法があるでしょうか。このフォルダへのアクセスを明示的に拒否するポリシーを追加します。明示的な拒否は他のあらゆるアクセス許可よりも優先されます。
Private
フォルダを非公開に保つには、次の 2 つの拒否ステートメントをグループポリシーに追加します。
-
次のステートメントを追加して、
Private
フォルダのリソースに対するあらゆるアクションを明示的に拒否します (companybucket/Private/*
)。{ "Sid": "ExplictDenyAccessToPrivateFolderToEveryoneInTheGroup", "Action": ["s3:*"], "Effect": "Deny", "Resource":["arn:aws:s3:::companybucket/Private/*"] }
-
また、リクエストに
Private/
プレフィックスが指定されている場合に、オブジェクトを一覧表示するアクションに必要なアクセス許可を拒否します。コンソールで Bob または Alice がPrivate
フォルダを開くと、このポリシーにより Amazon S3 からエラーレスポンスが返されます。{ "Sid": "DenyListBucketOnPrivateFolder", "Action": ["s3:ListBucket"], "Effect": "Deny", "Resource": ["arn:aws:s3:::*"], "Condition":{ "StringLike":{"s3:prefix":["Private/"]} } }
Consultants
グループポリシーを、前述の拒否ステートメントを含む更新したポリシーに置き換えます。更新したポリシーが適用されると、グループ内のどのユーザーも、バケット内の Private
フォルダにアクセスできなくなります。
-
AWS Management Console にサインインし、Amazon S3 コンソール (https://console.aws.amazon.com/s3/
) を開きます。 IAM ユーザーの認証情報ではなく、AWS アカウントの認証情報を使用してコンソールにサインインします。
-
Consultants
グループにアタッチされている既存のAllowGroupToSeeBucketListInTheConsole
管理ポリシーを以下のポリシーに置き換えます。ポリシーの
は自分のバケットの名前に置き換えてください。companybucket
手順については、「IAM ユーザーガイド」の「カスタマー管理ポリシーの編集 (コンソール)」を参照してください。手順では、ポリシーがアタッチされているすべてのプリンシパルエンティティに変更を適用する指示に従ってください。
{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowGroupToSeeBucketListAndAlsoAllowGetBucketLocationRequiredForListBucket", "Action": ["s3:ListAllMyBuckets", "s3:GetBucketLocation"], "Effect": "Allow", "Resource": ["arn:aws:s3:::*"] }, { "Sid": "AllowRootLevelListingOfCompanyBucket", "Action": ["s3:ListBucket"], "Effect": "Allow", "Resource": ["arn:aws:s3:::
companybucket
"], "Condition":{ "StringEquals":{"s3:prefix":[""]} } }, { "Sid": "RequireFolderStyleList", "Action": ["s3:ListBucket"], "Effect": "Deny", "Resource": ["arn:aws:s3:::*"], "Condition":{ "StringNotEquals":{"s3:delimiter":"/"} } }, { "Sid": "ExplictDenyAccessToPrivateFolderToEveryoneInTheGroup", "Action": ["s3:*"], "Effect": "Deny", "Resource":["arn:aws:s3:::companybucket
/Private/*"] }, { "Sid": "DenyListBucketOnPrivateFolder", "Action": ["s3:ListBucket"], "Effect": "Deny", "Resource": ["arn:aws:s3:::*"], "Condition":{ "StringLike":{"s3:prefix":["Private/"]} } } ] }
ステップ 8: クリーンアップする
クリーンアップするには、IAM コンソール
ストレージへの不要な請求を防ぐために、この演習で作成したオブジェクトとバケットも削除してください。
関連リソース
「IAM ユーザーガイド」の「IAM ポリシーを管理する」