Amazon Simple Storage Service
開発者ガイド (API バージョン 2006-03-01)

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

このチュートリアルでは、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 つのオブジェクトが含まれています。

     

    
                        バケット、フォルダ、およびオブジェクトの階層を示すコンソールのスクリーンショット。

     

    コンソールで companybucket バケットの [Development] フォルダを表示すると、Amazon S3 にリクエストが送信されます。そのリクエストに、プレフィックス Development と区切り記号 / が指定されています。コンソールのレスポンスは、コンピュータのファイルシステムのフォルダ一覧と似ています。前述の例は、バケット 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 にはプレフィックスがないため、ルートレベル項目として表示されます。


                コンソールのオブジェクトタブのスクリーンショット (リスト内に s3-dg.pdf オブジェクトを含む)。

チュートリアルの概要

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

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

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

注記

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

チュートリアルに関する準備を行う

この例では、AWS アカウントの認証情報を使用して IAM ユーザーを作成します。 最初、これらのユーザーにはアクセス許可が何もありません。これらのユーザーに、特定の Amazon S3 アクションを実行するためのアクセス許可を段階的に付与します。アクセス許可をテストするには、各ユーザーの認証情報を使用してコンソールにサインインします。AWS アカウントの所有者としてアクセス許可を段階的に付与する場合と、IAM ユーザーとしてアクセス許可をテストする場合とでは、異なる認証情報を使用してサインイン/サインアウトする必要があります。これは、1 つのブラウザでテストできますが、2 つのブラウザを使用した方が迅速に処理することができます。一方のブラウザで自分の AWS アカウント認証情報を使用して AWS マネジメントコンソール に接続し、もう一方のブラウザで 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. [ナビゲーション] ペインで、[IAM ダッシュボード] を選択します。

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

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

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

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

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

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

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

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

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

    フォルダを作成する詳細な手順については、Amazon Simple Storage Service コンソールユーザーガイド の「 フォルダの作成」を参照してください。

  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

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

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

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

警告

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

新しい IAM ユーザーを作成する詳細な手順については、IAM ユーザーガイド の「AWS アカウント内での IAM ユーザーの作成」を参照してください。このチュートリアル用にユーザーを作成するときは、[AWS マネジメントコンソールへのアクセス] チェックボックスをオンにし、[プログラムによるアクセス] チェックボックスはオフのままにします。

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

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

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

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

  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/)を開きます。

    注記

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

  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. [ポリシーの確認] を選択します。次のページで、[Name (名前)] フィールドに「AllowGroupToSeeBucketListInTheConsole」と入力し、[Create policy (ポリシーの作成)] を選択します。

      注記

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

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

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

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

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

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

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

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

      
                                    バケットのリストを示すコンソールのスクリーンショット。

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

次に、Consultants グループのすべてのユーザーがルートレベルの companybucket バケット項目を一覧表示できるようにします。Amazon S3 コンソールで会社のバケットをクリックすると、そのバケット内のルートレベルの項目が表示されます。


                    companybucket の内容を示すコンソールスクリーンショット。

注記

この例では、companybucket を使用して説明します。作成したバケットの名前を使用する必要があります。

バケット名の選択時にコンソールより Amazon S3 に送信されるリクエスト、Amazon S3 より返るレスポンス、コンソールでレスポンスが解釈される様子を把握するには、詳細な知識が必要です。

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

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

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


                    3 つのフォルダと 1 つの pdf ファイルがある companybucket の内容を示すコンソールスクリーンショット。

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

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

  • 値が「/」の 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>

コンソールにオブジェクトキーが表示されます。


                    2 つの xls ファイルを含む development フォルダを示すコンソールスクリーンショット。

ここで、ルートレベルのバケット項目を一覧表示するためのアクセス許可をユーザーに付与する作業に戻ります。バケットの内容を一覧表示するには、ユーザーは 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 Bucket (List Objects) リクエストを送信します。結果として、ユーザーがコンソールを使用する場合は、次のポリシーステートメントに示すように、s3:GetBucketLocation アクションのためのアクセス許可を付与する必要があります。

{ "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 ユーザーガイド の「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 マネジメントコンソール にサインインします。

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

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

      
                                    3 つのフォルダを含む会社のバケットを示すコンソールスクリーンショット。

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

  1. AWS マネジメントコンソール にサインインし、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 マネジメントコンソール にサインインします。

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

    3. Amazon S3 コンソールで、Alice がバケットの Development/ フォルダ内のオブジェクトのリストを表示できることを確認します。

      ユーザーが /Development フォルダを選択してそのフォルダ内のオブジェクトのリストを表示すると、Amazon S3 コンソールから Amazon S3 にプレフィックスが /DevelopmentListObjects リクエストが送信されます。ユーザーにはプレフィックス Development と区切り記号 / を持つオブジェクトリストを表示するためのアクセス許可が付与されているため、Amazon S3 からは、キープレフィックス Development/ を持つオブジェクトのリストが返り、コンソールにそのリストが表示されます。

      
                                    2 つの xls ファイルを含む development フォルダを示すコンソールスクリーンショット。

ステップ 5.2: IAM ユーザー Alice に Development フォルダ内のオブジェクトを読み書きするためのアクセス許可を付与する

Alice が Development フォルダ内のオブジェクトを読み書きできるようにするには、s3:GetObject および s3:PutObject アクションを呼び出すためのアクセス許可が Alice に必要です。次のポリシーステートメントは、そのアクセス許可を付与します (リクエストに Development/ の値を持つ prefix パラメータが設定されているとします)。

{ "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. 左側のナビゲーションペインで、[ユーザー] を選択します。

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

    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 マネジメントコンソール にサインインし、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 ユーザーの削除」を参照してください。

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

関連リソース