メニュー
Amazon Simple Storage Service
開発者ガイド (API Version 2006-03-01)

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

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

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

Amazon S3 のデータモデルはフラットな構造です。バケットを作成し、そのバケットにオブジェクトが格納されます。サブバケットやサブフォルダの階層はありませんが、フォルダ階層をエミュレートすることができます。Amazon S3 コンソールなどのツールで、バケット内の論理フォルダおよび論理サブフォルダを次のように表示できます。

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

  • Development フォルダを作成すると、コンソールは Development/ というキーを持つオブジェクトを作成します。後ろに区切り記号「/」が付いていることに注意してください。

  • [Development] フォルダの [Projects1.xls] というオブジェクトをアップロードすると、コンソールはオブジェクトをアップロードし、[Development/Projects1.xls] というキーを設定します。

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

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

コンソールはオブジェクトキーを使用して論理的な階層を表します。Amazon S3 に物理的な階層はなく、フラットなファイル構造にオブジェクトを含むバケットが存在するだけです。Amazon S3 API を使用してオブジェクトを作成するときに、論理的な階層を示すオブジェクトキーを使用できます。

オブジェクトの論理階層を作成するときに、個別のフォルダへのアクセスを管理できます。このチュートリアルで、その方法について説明します。

チュートリアルに入る前に、理解しておくべき概念がもう 1 つあります。「ルートレベル」のバケットの内容です。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 はプレフィックスがないため、ルートレベルアイテムとして表示されます。

チュートリアルの例

このチュートリアルの例は次のとおりです。

  • バケットを 1 つ作成し、3 つのフォルダ(Private、Development、および Finance)を追加します。

  • ユーザーは Alice と Bob の 2 名です。Alice には Development フォルダのみ、Bob には Finance フォルダのみにアクセスを許可し、Private フォルダの内容は非公開にします。このチュートリアルでは、AWS Identity and Access Management(IAM)ユーザー(Alice と Bob という同じユーザー名を使用)を作成してアクセスを管理し、必要なアクセス許可を付与します。

    IAM では、ユーザーグループを作成し、そのグループのすべてのユーザーに適用するグループレベルのアクセス許可を付与することもできます。これにより、アクセス許可を効果的に管理できます。この演習では、Alice と Bob に共通のアクセス許可が必要になります。そのため、Consultants というグループを作成し、Alice と Bob をグループに追加します。最初に、グループポリシーをグループに関連付けてアクセス許可を付与します。次に、特定のユーザーにポリシーを関連付けてユーザー固有のアクセス許可を追加します。

注記

このチュートリアルでは、companybucket をバケット名として、Alice および Bob を IAM ユーザーとして、Consultants をグループ名として使用しています。Amazon S3 ではバケット名はグローバルに一意である必要があるため、実際に作成する名前に置き換えてください。

ステップ 0: チュートリアルに関する準備を行う

この例では、AWS アカウントの認証情報を使用して IAM ユーザーを作成します。 当初、これらのユーザーにはアクセス権限はありません。これらのユーザーに、特定の Amazon S3 アクションを実行するためのアクセス許可を段階的に付与します。アクセス許可をテストするには、各ユーザーの認証情報を使用してコンソールにサインインします。AWS アカウントの所有者としてアクセス許可を段階的に付与する場合と、IAM ユーザーとしてアクセス許可をテストする場合とでは、異なる認証情報を使用してサインイン/サインアウトする必要があります。このテストは 1 つのブラウザで行うこともできますが、2 つの異なるブラウザを使用するとより効率的です。1 つのブラウザで AWS アカウントの認証情報を使用して AWS マネジメントコンソール に接続し、もう 1 つのブラウザで IAM ユーザー認証情報を使用して接続します。

AWS アカウントの認証情報を使用して AWS マネジメントコンソールにサインインするには、https://console.aws.amazon.com/ にアクセスします。 IAM ユーザーは、この同じリンクからはサインインできません。IAM ユーザーは IAM 対応のサインインページを使用する必要があります。アカウント所有者からユーザーにこのリンクを通知します。

IAM の料金の詳細については、『IAM ユーザーガイド』の「AWS マネジメントコンソール サインインページ」を参照してください。

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

  1. AWS マネジメントコンソール にサインインし、IAM コンソール(https://console.aws.amazon.com/iam/)を開きます。

  2. [Navigation] ペインで、[IAM Dashboard] をクリックします。

  3. [IAM users sign in link:] の URL に注意してください。このリンクを IAM ユーザーに通知し、IAM ユーザー名とパスワードを使用してコンソールにサインインしてもらいます。

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

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

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

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

    詳細な手順については、「S3 バケットを作成する方法」(Amazon Simple Storage Service コンソールユーザーガイド) を参照してください。

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

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

  4. Private、Finance、および Development という 3 つのフォルダをバケットに追加します。

  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

    手順については、「S3 バケットにファイルとフォルダをアップロードする方法」(Amazon Simple Storage Service コンソールユーザーガイド) を参照してください。

ステップ 2: IAM ユーザーとグループを作成する

IAM コンソールを使用して 2 人の IAM ユーザー(Alice と Bob)を AWS アカウントに追加します。また、Consultants という管理グループを作成し、両ユーザーをこのグループに追加します。

警告

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

新しい IAM ユーザーを作成する詳細な手順については、IAM ユーザーガイドの「AWS アカウント内での IAM ユーザーの作成」を参照してください。

管理グループの作成の詳細な手順については、『IAM ユーザーガイド』の「最初の IAM ユーザーと管理者グループの作成」を参照してください。

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

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

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

  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 マネジメントコンソール にサインインし、IAM コンソール(https://console.aws.amazon.com/iam/)を開きます。

    注記

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

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

    1. 左側のナビゲーションペインで [Policies] をクリックし、[Create Policy] をクリックします。

    2. [Create Your Own Policy] の横の [Select] をクリックします。

    3. [Policy Name] フィールドに「AllowGroupToSeeBucketListInTheConsole」と入力します。

    4. 以下のアクセスポリシーをコピーして、[Policy Document] フィールドに貼り付けます。

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

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

    管理ポリシーをアタッチする詳しい手順については、『IAM ユーザーガイド』の「Working with Managed Policies Using the AWS Management Console」を参照してください。

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

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

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

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

      コンソールにすべてのバケットが表示されますが、バケット内のオブジェクトは表示されません。

ステップ 4.2: バケットのルートレベルの内容をユーザーが表示できるようにする

次に、すべてのユーザーに、ルートレベルの companybucket バケットアイテムを表示することを許可します。ユーザーは、Amazon S3 コンソールで会社のバケットをクリックすると、そのバケット内のルートレベルの項目を表示できるようになります。

ここでは、説明のために companybucket を使用しています。実際には、この演習で作成したバケットの名前を使用する必要があります。

バケット名をクリックしたときにコンソールから Amazon S3 にどのようなリクエストが送信され、 Amazon S3 からどのようなレスポンスが返されるか、さらに、レスポンスがコンソールでどのように解釈されるかを理解するには、少し詳細な知識が必要です。

バケット名をクリックすると、コンソールから Amazon S3 に GET Bucket(List Objects) リクエストが送信されます。このリクエストには次のパラメーターが含まれます。

  • prefix空の文字列を値に持つ パラメーター。

  • delimiter/ を値に持つ パラメーター。

リクエストの例を次に示します。

Copy
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/> 要素が含まれます。

Copy
<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 は、キーをグループ化し、Development/Finance/、および Private/ のそれぞれのプレフィックス値の <CommonPrefixes/> 要素を返します。この要素は、これらのキーの先頭から、指定した '/' 区切り記号の最初の出現箇所までのサブ文字列です。

コンソールでこの結果が解釈され、ルートレベルのアイテムが 3 つのフォルダと 1 つのオブジェクトキーとして表示されます。

次に、Bob か Alice が [Development] フォルダをダブルクリックすると、コンソールから Amazon S3 に GET Bucket(List Objects) リクエストが送信されます。このリクエストの prefix および delimiter パラメーターは次の値に設定されています。

  • prefix値が Development/ の パラメーター。

  • delimiter値が '/' の パラメーター。

レスポンスとして、指定したプレフィックスで始まるオブジェクトキーが Amazon S3 から返されます。

Copy
<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 パラメーターを組み込むようユーザーに要求することにより、フォルダ形式のアクセスを要求する条件を追加します。

Copy
{ "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 Bucket (List Objects) リクエストを送信します。結果として、ユーザーがコンソールを使用する場合は、次のポリシーステートメントに示すように、s3:GetBucketLocation アクションのためのアクセス許可を付与する必要があります。

Copy
{ "Sid": "RequiredByS3Console", "Action": ["s3:GetBucketLocation"], "Effect": "Allow", "Resource": ["arn:aws:s3:::*"] }

ユーザーがルートレベルのバケットの内容を一覧表示できるようにするには

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

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

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

    詳細な手順については、『IAM ユーザーガイド』の「カスタマー管理ポリシーの編集」を参照してください。詳細な手順では、ポリシーがアタッチされているすべてのプリンシパルエンティティに変更を適用する指示に従ってください。

    Copy
    { "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 マネジメントコンソール にサインインします。

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

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

ユーザーが Amazon S3 コンソールを使用している場合、このテストは成功します。コンソールでバケットをクリックすると、コンソールの実装により、空の文字列を値に持つ prefix パラメーターと、'/' を値に持つ delimiter パラメーターが送信されるためです。

ステップ 4.3: グループポリシーの概要

追加したグループポリシーによって、IAM ユーザーである Alice と Bob に次のような最小限のアクセス許可が付与されます。

  • 親アカウントが所有するすべてのバケットを表示する.

  • companybucket バケット内のルートレベルのアイテムを表示します。

ただし、ユーザーが実行できる操作はまだ十分ではありません。次のようにユーザー固有のアクセス許可を付与します。

  • Alice に Development フォルダのオブジェクトの読み書きを許可します。

  • Bob に Finance フォルダのオブジェクトの読み書きを許可します。

ユーザー固有のアクセスを許可するには、グループではなく特定のユーザーにポリシーを関連付けます。この後のセクションでは、Development フォルダを操作するためのアクセス許可を Alice に付与します。手順を繰り返して、Finance フォルダを操作するための同様のアクセス許可を Bob に付与することができます。

ステップ 5: IAM ユーザー Alice に特定のアクセス許可を付与する

次に、追加のアクセス許可を Alice に付与し、Alice が Development フォルダの内容を表示し、そのフォルダ内のオブジェクトを読み書きできるようにします。

ステップ 5.1: IAM ユーザー Alice に Development フォルダの内容を表示するためのアクセス許可を付与する

Alice が Development フォルダの内容を表示できるようにするには、companybucket バケットに対する s3:ListBucket アクションのためのアクセス権限を付与するポリシーを Alice ユーザーに適用する必要があります(プレフィックス Development/ がリクエストに含まれることを前提とします)。このポリシーを適用するのはユーザー Alice のみであるため、インラインポリシーを使用します。インラインポリシーの詳細については、『IAM ユーザーガイド』の「管理ポリシーとインラインポリシー」を参照してください。

  1. AWS マネジメントコンソール にサインインし、IAM コンソール (https://console.aws.amazon.com/iam/) を開きます。

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

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

    1. 左側のナビゲーションペインで、[Users] をクリックします。

    2. ユーザー名の [Alice] をクリックします。

    3. ユーザー詳細ページで [Permissions] タブを選択し、[Inline Policies] セクションを展開します。

    4. [click here] (または [Create User Policy]) を選択します。

    5. [Custom Policy] をクリックし、[Select] をクリックします。

    6. [Policy Name] フィールドにポリシー名を入力します。

    7. 以下のポリシーをコピーして、[Policy Document] フィールドに貼り付けます。

      Copy
      { "Version": "2012-10-17", "Statement": [ { "Sid": "AllowListBucketIfSpecificPrefixIsIncludedInRequest", "Action": ["s3:ListBucket"], "Effect": "Allow", "Resource": ["arn:aws:s3:::companybucket"], "Condition":{ "StringLike":{"s3:prefix":["Development/*"] } } } ] }
  3. Alice のアクセス許可の変更をテストします。

    1. IAM ユーザーのサインインリンク(「IAM ユーザー用のサインインリンクを提供するには」を参照)を使用して AWS マネジメントコンソール にサインインします。

    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/ パラメーターが設定されているとします)。

Copy
{ "Sid":"AllowUserToReadWriteObjectData", "Action":["s3:GetObject", "s3:PutObject"], "Effect":"Allow", "Resource":["arn:aws:s3:::companybucket/Development/*"] }
  1. AWS マネジメントコンソール にサインインし、Amazon S3 コンソール (https://console.aws.amazon.com/s3/) を開きます。

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

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

    1. 左側のナビゲーションペインで、[Users] をクリックします。

    2. ユーザー名の [Alice] をクリックします。

    3. ユーザー詳細ページで [Permissions] タブを選択し、[Inline Policies] セクションを展開します。

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

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

      Copy
      { "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 マネジメントコンソール にサインインします。

    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/* または空の文字列でなければなりません。

Copy
{ "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 です。

  • Null 条件式により、Alice からのリクエストに prefix パラメーターが含まれていることが保証されます。

    prefix パラメーターはフォルダに類似したアクセスを必要とします。prefix パラメーターのないリクエストを送信すると、Amazon S3 によりすべてのオブジェクトキーが返されます。

    リクエストに null 値の prefix パラメーターが含まれている場合、式の評価結果は true になり、Condition 全体の評価結果が true になります。空の文字列を prefix パラメーターの値として許可する必要があります。null 文字列を許可すると、この前の説明に示したコンソールでの操作と同様に、Alice はルートレベルのバケット項目を取得できるようになります。詳細については、「ステップ 4.2: バケットのルートレベルの内容をユーザーが表示できるようにする」を参照してください。

  • 条件式 StringNotLike を使用すると、prefix パラメーターの値が指定されていて Development/* でない場合、リクエストは失敗します。

前のセクションの手順に従って、ユーザー Alice 用に作成したインラインポリシーを再び更新します。

以下のポリシーをコピーして、[Policy Document] フィールドに貼り付けて既存のポリシーと置き換えます。

Copy
{ "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/*)。

    Copy
    { "Sid": "ExplictDenyAccessToPrivateFolderToEveryoneInTheGroup", "Action": ["s3:*"], "Effect": "Deny", "Resource":["arn:aws:s3:::companybucket/Private/*"] }
  • また、リクエストに Private/ プレフィックスが指定されている場合に、オブジェクトを一覧表示するアクションに必要なアクセス許可を拒否します。コンソールで、Bob または Alice が Private フォルダをダブルクリックすると、このポリシーにより Amazon S3 がエラーレスポンスを返します。

    Copy
    { "Sid": "DenyListBucketOnPrivateFolder", "Action": ["s3:ListBucket"], "Effect": "Deny", "Resource": ["arn:aws:s3:::*"], "Condition":{ "StringLike":{"s3:prefix":["Private/"]} } }

Consultants グループポリシーを、前述の拒否ステートメントを含む更新したポリシーに置き換えます。更新したポリシーが適用されると、グループ内のどのユーザーも、バケット内の Private フォルダにアクセスできなくなります。

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

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

  2. Consultants グループにアタッチされている既存の AllowGroupToSeeBucketListInTheConsole 管理ポリシーを以下のポリシーに置き換えます。ポリシーの companybucket は自分のバケットの名前に置き換えてください。

    手順については、『IAM ユーザーガイド』の「カスタマー管理ポリシーの編集」を参照してください。手順では、ポリシーがアタッチされているすべてのプリンシパルエンティティに変更を適用する指示に従ってください。

    Copy
    { "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/"]} } } ] }

クリーンアップ

クリーンアップするには、IAM コンソールに移動し、ユーザー Alice と Bob を削除します。詳細な手順については、『IAM ユーザーガイド』の「IAM ユーザーの削除」を参照してください。

ストレージに課金されないようにするには、この演習で作成したオブジェクトとバケットも削除してください。

関連リソース