ユーザーポリシーを使用したバケットへのアクセスの制御 - Amazon Simple Storage Service

ユーザーポリシーを使用したバケットへのアクセスの制御

このチュートリアルでは、Amazon S3 でのユーザーアクセス許可の使用について説明します。この例では、フォルダを含むバケットを作成します。AWS アカウントで AWS Identity and Access Management IAM ユーザーを作成し、作成したユーザーに対して、Amazon S3 バケットおよびバケット内のフォルダへのアクセス許可を段階的に付与します。

バケットとフォルダの基本

Amazon S3 のデータモデルはフラットな構造をしています。バケットを作成し、バケットにオブジェクトを保存します。サブバケットやサブフォルダの階層はありませんが、フォルダ階層をエミュレートすることができます。Amazon S3 コンソールなどのツールを使用すると、バケット内の論理フォルダやサブフォルダを表示できます。

companybucket という名前のバケットには、PrivateDevelopmentFinance の 3 つのフォルダと s3-dg.pdf オブジェクトが含まれていることがコンソールに表示されます。コンソールでは、フォルダおよびサブフォルダからなる論理的な階層が作成するために、オブジェクト名 (キー) を使用します。次の例を考えます。

  • Development フォルダを作成すると、コンソールによって Development/ というキーを持つオブジェクトが作成されます。区切り記号として末尾のスラッシュ (/) が付いている点に注意してください。

  • Projects1.xls というオブジェクトを Development フォルダにアップロードすると、コンソールによってそのオブジェクトがアップロードされ、Development/Projects1.xls というキーが設定されます。

    このキーの Developmentプレフィックスで、/ は区切り記号です。Amazon S3 API のオペレーションではプレフィックスと区切り記号がサポートされます。例えば、特定のプレフィックスと区切り記号を持つすべてのオブジェクトの一覧を取得できます。コンソールで Development フォルダを開くと、そのフォルダ内のオブジェクトがコンソールに一覧表示されます。次の例では、Development フォルダには 1 つのオブジェクトが含まれています。

     

     

    コンソールで Development バケットの companybucket フォルダを表示すると、プレフィックスに Development と区切り文字に / を指定したリクエストが Amazon S3 に送信されます。コンソールのレスポンスは、コンピュータのファイルシステムのフォルダ一覧と似ています。前述の例は、バケット companybucketDevelopment/Projects1.xls というキーを持つ 1 つのオブジェクトがあることを示しています。

コンソールは、オブジェクトのキーを使用して論理階層を推測しています。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

これらのオブジェクトキーによって、ルートレベルフォルダ PrivateDevelopment、および Finance と、ルートレベルオブジェクト s3-dg.pdf を持つ論理階層が作成されます。Amazon S3 コンソールでバケット名を選択すると、ルートレベルの項目が表示されます。コンソールにはトップレベルのプレフィックス (Private/Development/Finance/) が表示されます。オブジェクトキー s3-dg.pdf にはプレフィックスがないため、ルートレベル項目として表示されます。

チュートリアルの概要

このチュートリアルでは、3 つのフォルダ (PrivateDevelopmentFinance) を含むバケットを作成します。

ユーザーは 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 ユーザーは IAM 対応のサインインページを使用する必要があります。アカウント所有者からユーザーにこのリンクを通知します。

IAM の詳細については、IAM ユーザーガイドAWS Management Consoleの へのサインインページ を参照してください。

IAM ユーザーにサインインのリンクを提供するには

  1. AWS Management Console にサインインして、IAM コンソール (https://console.aws.amazon.com/iam/) を開きます。

  2. [Navigation (ナビゲーション)] ペインで、[IAM Dashboard (IAM ダッシュボード)] を選択します。

  3. [IAM users sign in link (IAM ユーザーのサインインのリンク)] の URL を書き留めます。このリンクを IAM ユーザーに提供して、IAM ユーザー名とパスワードを使用してコンソールにサインインしてもらいます。

ステップ 1: バケットを作成する

このステップでは、AWS アカウント の認証情報を使用して Amazon S3 コンソールにサインインし、バケットを作成します。作成したバケットにフォルダ (DevelopmentFinance およびPrivate) を追加し、各フォルダにサンプルドキュメントを 1 つか 2 つアップロードします。

  1. AWS Management Console にサインインし、Amazon S3 コンソール (https://console.aws.amazon.com/s3/) を開きます。

  2. バケットを作成します。

    手順については、バケットの作成 を参照してください。

  3. バケットにドキュメントを 1 つアップロードします。

    この演習では、このバケットのルートレベルに s3-dg.pdf というドキュメントがあることを前提としています。別のドキュメントをアップロードする場合は、s3-dg.pdf をそのドキュメントのファイル名に置き換えてください。

  4. 3 つのフォルダ (PrivateFinanceDevelopment) をバケットに追加します。

    フォルダを作成するステップバイステップの手順については、Amazon Simple Storage Service ユーザーガイドフォルダを使用して Amazon S3 コンソールのオブジェクトを整理する を参照してください。

  5. 各フォルダにドキュメントを 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 コンソールを使用して 2 人の IAM ユーザー (Alice と Bob) を AWS アカウント に追加します。詳細な手順については、「IAM ユーザーガイド」の「AWS アカウント での IAM ユーザーの作成」を参照してください。

また、Consultants という名前の管理グループを作成します。続いて、ユーザーをこのグループに追加します。詳細な手順については、「IAM ユーザーグループの作成」を参照してください。

警告

ユーザーとグループを追加するときに、これらのユーザーにアクセス許可を付与するポリシーを関連付けないでください。最初の時点では、アクセス許可はこれらのユーザーに付与せず、以降のセクションで段階的に付与します。まず、これらの IAM ユーザーにパスワードを割り当てておく必要があります。それらのユーザー認証情報を使用して Amazon S3 のアクションをテストし、アクセス許可が意図したとおりに機能することを確認します。

新しい IAM ユーザーを作成する手順については、IAM ユーザーガイドAWS アカウントの での IAM ユーザーの作成 を参照してください。このチュートリアル用にユーザーを作成するときは、[AWS Management Console アクセス] を選択し、[プログラムによるアクセス] を消去します。

管理グループを作成する手順については、IAM ユーザーガイド最初の IAM 管理者のユーザーおよびグループの作成を参照してください。

ステップ 3: IAM ユーザーにアクセス許可が付与されていないことを確認する

ブラウザを 2 つ使用する場合は、ここで 2 つ目のブラウザからいずれかの IAM ユーザー認証情報を使用して、コンソールにサインインできます。

  1. IAM ユーザーのサインインのリンク (「IAM ユーザーにサインインのリンクを提供するには」を参照) から、いずれかの IAM ユーザー認証情報を使用して AWS Management Consoleにサインインします。

  2. https://console.aws.amazon.com/s3/ で Amazon S3 コンソールを開きます。

    アクセスが拒否されることを示す次のコンソールメッセージを確認します。

次に、アクセス許可を段階的にユーザーに付与します。最初に、両方のユーザーに必要なアクセス許可を付与するグループポリシーをアタッチします。

ステップ 4: グループレベルのアクセス許可を付与する

ユーザーが次の内容を実行できるようにします。

  • 親アカウントが所有するすべてのバケットを表示します。これを行うには、Bob と Alice に s3:ListAllMyBuckets アクションのためのアクセス許可が必要です。

  • companybucket バケット内のルートレベルの項目、フォルダ、およびオブジェクトを一覧表示します。これを行うには、Bob と Alice に s3:ListBucket バケットに対する companybucket アクションのためのアクセス許可が必要です。

次に、これらのアクセス許可を付与するポリシーを作成し、Consultants グループにアタッチします。

ステップ 4.1: すべてのバケットのリストを表示するアクセス許可を付与する

このステップでは、親アカウントが所有するすべてのバケットを表示するのに必要な最小限のアクセス許可をユーザーに付与する管理ポリシーを作成します。そのポリシーを Consultants グループにアタッチします。その管理ポリシーをユーザーまたはグループにアタッチしたら、親 AWS アカウントが所有するバケットのリストを取得する許可をそのユーザーまたはグループに付与します。

  1. AWS Management Console にサインインして、IAM コンソール (https://console.aws.amazon.com/iam/) を開きます。

    注記

    ユーザーに許可を付与するため、IAM ユーザーではなく、AWS アカウントの認証情報を使用してサインインします。

  2. 管理ポリシーを作成します。

    1. 左側のナビゲーションペインで [ポリシー] を選択し、続いて [ポリシーの作成] を選択します。

    2. [JSON] タブを選択します。

    3. 以下のアクセスポリシーをコピーし、 ポリシーテキストフィールドに貼り付けます。

      { "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 エレメントの値は、特定のアクセスを許可するかどうかを決定します。

    4. [ポリシーの確認] を選択します。次のページで、[AllowGroupToSeeBucketListInTheConsoleName (名前)] フィールドに「」と入力し、[Create policy (ポリシーの作成)] を選択します。

      注記

      [Summary (概要)] エントリに、このポリシーではどのアクセス許可も付与されないことを示すメッセージが表示されます。このチュートリアルでは、このメッセージを無視しても問題ありません。

  3. 作成した AllowGroupToSeeBucketListInTheConsole 管理ポリシーを Consultants グループにアタッチします。

    管理ポリシーをアタッチする手順については、IAM ユーザーガイドの「IAM ID のアクセス許可の追加および削除」を参照してください。

    IAM コンソールで、ポリシードキュメントを IAM ユーザーおよびグループにアタッチします。両方のユーザーがバケットのリストを取得できるように、ポリシーをグループにアタッチします。

  4. アクセス許可をテストします。

    1. IAM ユーザーのサインインのリンク (「IAM ユーザーにサインインのリンクを提供するには」を参照) から、いずれかの IAM ユーザー認証情報を使用してコンソールにサインインします。

    2. 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 パラメータは、次の値に設定されます。

  • 値が prefixDevelopment/ パラメータ。

  • 値が「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:::*"] }
ユーザーがルートレベルのバケットの内容を一覧表示できるようにするには
  1. AWS Management Console にサインインして、IAM コンソール (https://console.aws.amazon.com/iam/) を開きます。

    IAM ユーザーの認証情報ではなく、AWS アカウントの認証情報を使用してコンソールにサインインします。

  2. Consultants グループにアタッチされている既存の AllowGroupToSeeBucketListInTheConsole 管理ポリシーを以下のポリシーに置き換えます。このポリシーでも s3:ListBucket アクションは実行できます。ポリシー の companybucket は自分のバケッResourceトの名前に置き換えてください。

    手順については、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":["/"] } } } ] }
  3. 更新されたアクセス許可をテストします。

    1. IAM ユーザーのサインインリンク (「IAM ユーザーにサインインのリンクを提供するには」を参照) を使用して AWS Management Consoleにサインインします。

      https://console.aws.amazon.com/s3/ で Amazon S3 コンソールを開きます。

    2. 作成したバケットを選択すると、ルートレベルのバケット項目がコンソールに表示されます。バケット内のフォルダを選択しても、フォルダの内容は表示されません。そのためのアクセス許可が付与されていないからです。

このテストは、ユーザーが 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 ユーザーガイド管理ポリシーとインラインポリシーを参照してください。

  1. AWS Management Console にサインインして、IAM コンソール (https://console.aws.amazon.com/iam/) を開きます。

    IAM ユーザーの認証情報ではなく、AWS アカウントの認証情報を使用してコンソールにサインインします。

  2. Development フォルダの内容を表示するアクセス許可をユーザー (Alice) に付与するインラインポリシーを作成します。

    1. 左側のナビゲーションペインで、[ユーザー] を選択します。

    2. ユーザー名の [Alice] を選択します。

    3. ユーザーの詳細ページで、[Permissions (アクセス許可)] タブを選択し、[Add inline policy (インラインポリシーの追加)] を選択します。

    4. [JSON] タブを選択します。

    5. 以下のアクセスポリシーをコピーし、ポリシーテキストフィールドに貼り付けます。

      { "Version": "2012-10-17", "Statement": [ { "Sid": "AllowListBucketIfSpecificPrefixIsIncludedInRequest", "Action": ["s3:ListBucket"], "Effect": "Allow", "Resource": ["arn:aws:s3:::companybucket"], "Condition":{ "StringLike":{"s3:prefix":["Development/*"] } } } ] }
    6. [ポリシーの確認] を選択します。次のページで、[Name (名前)] フィールドに名前を入力し、[Create policy (ポリシーの作成)] を選択します。

  3. Alice のアクセス許可の変更をテストします。

    1. IAM ユーザーのサインインリンク (「IAM ユーザーにサインインのリンクを提供するには」を参照) を使用して AWS Management Consoleにサインインします。

    2. https://console.aws.amazon.com/s3/ で Amazon S3 コンソールを開きます。

    3. 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/*"] }

  1. AWS Management Console にサインインし、Amazon S3 コンソール (https://console.aws.amazon.com/s3/) を開きます。

    IAM ユーザーの認証情報ではなく、AWS アカウントの認証情報を使用してコンソールにサインインします。

  2. 前のステップで作成したインラインポリシーを編集します。

    1. 左側のナビゲーションペインで、[ユーザー] を選択します。

    2. ユーザー名の [Alice] を選択します。

    3. ユーザーの詳細で、[アクセス許可] タブを選択し、[インラインポリシー] セクションを展開します。

    4. 前のステップで作成したポリシーの名前の横にある [Edit Policy (ポリシーの編集)] をクリックします。

    5. 以下のポリシーをコピーして、 ポリシーテキストフィールドに貼り付け、既存のポリシーと置き換えます。

      { "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/*"] } ] }
  3. 更新されたポリシーをテストします。

    1. IAM ユーザーのサインインリンク (「IAM ユーザーにサインインのリンクを提供するには」を参照) を使用して AWS Management Consoleにサインインします。

    2. https://console.aws.amazon.com/s3/ で Amazon S3 コンソールを開きます。

    3. 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 です。このポリシーの EffectDeny であるため、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 フォルダを非公開に保つには、次の 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 フォルダにアクセスできなくなります。

  1. AWS Management Console にサインインし、Amazon S3 コンソール (https://console.aws.amazon.com/s3/) を開きます。

    IAM ユーザーの認証情報ではなく、AWS アカウントの認証情報を使用してコンソールにサインインします。

  2. 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 コンソールを開き、ユーザーの Alice と Bob を削除します。手順については、IAM ユーザーガイドIAM ユーザーの削除 を参照してください。

ストレージへの不要な請求を防ぐために、この演習で作成したオブジェクトとバケットも削除してください。

関連リソース