例 4 - バケット所有者が所有権のないオブジェクトへのクロスアカウントアクセス許可を付与する
トピック
この例のシナリオでは、バケット所有者が、オブジェクトをアップロードするためのアクセス許可を他の AWS アカウント に付与します。バケットの S3 オブジェクト所有権にバケット所有者強制設定を適用した場合、別の AWS アカウント によって書き込まれたオブジェクトを含む、バケット内のすべてのオブジェクトを所有します。これにより、バケット所有者であるユーザーがオブジェクトを所有していないという問題が解決されます。次に、自分のアカウントまたは他の AWS アカウント アカウントのユーザーにアクセス許可を委任できます。S3 オブジェクト所有権のバケット所有者強制設定が有効になっていないとします。つまり、バケットは、他の AWS アカウントが所有するオブジェクトを含むことができます。
バケット所有者は、オブジェクトの所有者が誰であるかに関係なく、オブジェクトに対するクロスアカウントのアクセス許可を別のアカウントのユーザーに付与しなければならない場合があります。例えば、課金アプリケーションがユーザーとしてオブジェクトのメタデータにアクセスしなければならない場合などです。ここで、主に 2 つの問題が生じます。
-
バケット所有者には、他の AWS アカウントで作成されたオブジェクトに対する許可はありません。バケット所有者が、自分が所有していないオブジェクトに対するアクセス許可を付与するには、オブジェクトの所有者 (オブジェクトを作成した ) は、最初にバケット所有者にアクセス許可を付与する必要があります。この所有者は、オブジェクトを作成した AWS アカウントです。これで、バケット所有者は、それらのアクセス許可を委任できるようになります。
バケット所有者は、自分のアカウントのユーザーに許可を委任できます (「例 3: バケット所有者が自分の所有していないオブジェクトに対するアクセス許可を付与する」を参照)。ただし、クロスアカウントの委任はサポートされていないため、バケット所有者アカウントは他の AWS アカウント にアクセス許可を委任できません。
このシナリオでは、バケット所有者はオブジェクトへのアクセス許可を持つ AWS Identity and Access Management (IAM) ロールを作成できます。その後、バケット所有者は別の AWS アカウント にロールを引き受けるアクセス許可を付与して、バケットのオブジェクトへのアクセスを一時的に有効化できます。
注記
S3 オブジェクト所有権は、Amazon S3 バケットレベルの設定で、バケットにアップロードされる新しいオブジェクト所有権を制御し、ACL を無効にするのに使用できます。デフォルトでは、オブジェクト所有権はバケット所有者の強制設定に設定され、すべての ACL は無効になります。ACL を無効にすると、バケット所有者はバケット内のすべてのオブジェクトを所有し、アクセス管理ポリシーのみを使用してデータへのアクセスを管理します。
Amazon S3 の最新のユースケースの大部分では ACL を使用する必要がなくなっています。オブジェクトごとに個別に制御する必要がある通常ではない状況を除き、ACL は無効にしておくことをお勧めします。ACL を無効にすると、誰がオブジェクトをバケットにアップロードしたかに関係なく、ポリシーを使用してバケット内のすべてのオブジェクトへのアクセスを制御できます。詳細については、「オブジェクトの所有権の制御とバケットの ACL の無効化。」を参照してください。
クロスアカウントのアクセス許可の理解と IAM ロールの使用
IAM ロールは、リソースへのアクセスを委任する、いくつかのシナリオで使用されます。なかでも、クロスアカウントアクセスは重要なシナリオです。この例では、バケット所有者 (アカウント A) は、IAM ロールを使用して、他の AWS アカウント (アカウント C) のユーザーに一時的にオブジェクトへのクロスアカウントの許可を委任します。作成された IAM ロールには、次の 2 つのポリシーがアタッチされています。
-
ロールを引き受ける別の AWS アカウントを指定する信頼ポリシー。
-
ロールを引き受けるユーザーに付与されるアクセス許可 (
s3:GetObject
など) を定義するアクセスポリシー。ポリシーで指定できるアクセス許可のリストについては、Amazon S3 のポリシーアクション を参照してください。
信頼ポリシーで指定された AWS アカウントは、アカウントに属するユーザーにロールを引き受ける許可を付与します。ユーザーは、以下の手順でオブジェクトにアクセスします。
-
ロールを引き受け、その応答として一時的なセキュリティ認証情報を取得します。
-
一時的なセキュリティ認証情報を使用して、バケットのオブジェクトにアクセスします。
IAM ロールの詳細については、「IAM ユーザーガイド」の「IAM ロール」を参照してください。
この手順の概要を以下に示します。
-
アカウント A の管理者ユーザーは、バケットポリシーをアタッチし、オブジェクトをアップロードする条件付きのアクセス許可をアカウント B に付与します。
-
アカウント A の管理者ユーザーは、IAM ロールを作成し、アカウント C との間に信頼を確立します。これで、アカウント C のユーザーはアカウント A にアクセスできるようになります。ロールにアタッチされたアクセスポリシーは、アカウント C のユーザーがアカウント A にアクセスするときに実行できる操作を制限します。
-
アカウント B の管理者は、アカウント A が所有するバケットにオブジェクトをアップロードし、バケット所有者にフルコントロールのアクセス許可を付与します。
-
アカウント C の管理者は、ユーザーを作成し、ロールを引き受けるためのユーザーポリシーをアタッチします。
-
アカウント C のユーザーが初めてロールを引き受けると、一時的なセキュリティ認証情報が返されます。ユーザーは、この一時的な認証情報を使用して、バケットのオブジェクトにアクセスします。
この例では、3 つのアカウントが必要です。次の表に、これらのアカウントの呼び方とそれぞれの管理者ユーザーを示します。IAM のガイドライン (「管理者ユーザーを使用したリソースの作成とアクセス許可の付与について」を参照) に従い、このチュートリアルでは AWS アカウントのルートユーザーの認証情報を使用しません。その代わりに、各アカウントで管理者ユーザーを作成し、その認証情報を使用してリソースを作成し、アクセス許可を付与します。
AWS アカウント ID | アカウントの呼び方 | アカウントの管理者ユーザー |
---|---|---|
|
アカウント A |
AccountAadmin |
|
アカウント B |
AccountBadmin |
|
アカウント C |
AccountCadmin |
ステップ 0: チュートリアルの準備をする
注記
テキストエディタを開いて、手順を実行しながら、いくつかの情報を書き留めることができます。特に、コンソールに接続する各アカウントのアカウント ID、正規ユーザー ID、IAM ユーザーのサインイン URL、IAM ユーザーとロールの Amazon リソースネーム (ARN) が必要になります。
-
前のセクションの表に示したように、3 つの AWS アカウント があり、各アカウントに 1 人ずつ管理者ユーザーが存在することを確認します。
-
必要に応じて AWS アカウントにサインアップします。ここでは、それぞれのアカウントをアカウント A、アカウント B、アカウント C と呼ぶことにします。
-
アカウント A の認証情報を使用して、IAM コンソール
にサインインし、次の操作を行って管理者ユーザーを作成します。 -
ユーザー
AccountAadmin
を作成して、そのセキュリティ認証情報を書き留めます。ユーザーの追加の詳細については、「IAM ユーザーガイド」の「AWS アカウント での IAM ユーザーの作成」を参照してください。 -
フルアクセスを付与するユーザーポリシーをアタッチして、管理者に AccountAadmin を付与します。手順については、「IAM ユーザーガイド」の「IAM ポリシーを管理する」を参照してください。
-
IAM コンソールの [ダッシュボード] で、[IAM ユーザーのサインイン URL] を書き留めます。このアカウントのユーザーは、この URL を使用して AWS Management Console にサインインします。詳細については、「IAM ユーザーガイド」の「Sign in to the AWS Management Console as an IAM user」を参照してください。
-
-
前述の手順を繰り返し、アカウント B およびアカウント C の管理者ユーザーを作成します。
-
-
アカウント C で、正規ユーザー ID を書き留めます。
アカウント A で IAM ロールを作成したら、信頼ポリシーでアカウント C のアカウント ID を指定して、ロールを引き受けるアクセス許可をアカウント C に付与します。アカウント情報は、次の手順で確認できます。
-
AWS アカウント ID またはアカウントエイリアス、IAM ユーザー名、パスワードを使用して、Amazon S3 コンソール
にサインインします。 -
バケットの詳細を確認する Amazon S3 バケットの名前を選択します。
-
[Permissions (アクセス許可)] タブを選択してから、[アクセスコントロールリスト] を選択します。
-
AWS アカウント のアクセスのセッションで、アカウント 列は
c1daexampleaaf850ea79cf0430f33d72579fd1611c97f7ded193374c0b163b6
のような長い識別子です。これが正規ユーザー ID です。
-
-
バケットポリシーを作成するときは、次の情報が必要になります。これらの値を書き留めます。
-
アカウント A の正規ユーザー ID – アカウント A の管理者がアカウント B の管理者にオブジェクトをアップロードする条件付きのアクセス許可を付与するとき、オブジェクトに対するフルコントロールを取得するアカウント A のユーザーの正規ユーザー ID を指定します。
注記
正規ユーザー ID は、Amazon S3 固有の概念です。64 文字から成る、難読化されたアカウント ID です。
-
アカウント B 管理者の ユーザー ARN - ユーザー ARN は IAM コンソール
にあります。[概要] タブでユーザーを選択し、ユーザーの ARN を見つけます。 バケットポリシーでは、オブジェクトをアップロードするアクセス許可を
AccountBadmin
に付与し、ARN を使用してユーザーを指定します。ARN 値の例を示します。arn:aws:iam::
AccountB-ID
:user/AccountBadmin
-
-
AWS Command Line Interface (CLI) または AWS Tools for Windows PowerShell をセットアップします。管理者ユーザーの認証情報は以下のように保存します。
-
AWS CLI を使用する場合は、設定ファイルに
AccountAadmin
とAccountBadmin
のプロファイルを作成します。 -
AWS Tools for Windows PowerShell を使用する場合は、セッションの認証情報を
AccountAadmin
およびAccountBadmin
として保存します。
手順については、チュートリアル用のツールのセットアップ を参照してください。
-
ステップ 1: アカウント A のタスクを実行する
この例では、アカウント A はバケット所有者です。したがって、アカウント A のユーザー AccountAadmin は以下を実行します。
-
バケットを作成します。
-
オブジェクトをアップロードするアクセス許可をアカウント B の管理者に付与するバケットポリシーをアタッチします。
-
バケット内のオブジェクトにアクセスできるように、ロールを引き受けるアクセス許可をアカウント C に付与する IAM ロールを作成します。
ステップ 1.1: AWS Management Consoleにサインインする
アカウント A で IAM ユーザーのサインイン URL を使用して、まず AccountAadmin
ユーザーとして AWS Management Console にサインインします。このユーザーはバケットを作成し、ポリシーをアタッチします。
ステップ 1.2: バケットを作成してバケットポリシーをアタッチする
Amazon S3 コンソールで、次の操作を行います。
-
バケットを作成します。この演習では、バケットの名前を
とします。amzn-s3-demo-bucket1
手順については、バケットの作成 を参照してください。
-
次のバケットポリシーをアタッチします。このポリシーは、オブジェクトをアップロードする条件付きのアクセス許可をアカウント B の管理者に付与します。
、amzn-s3-demo-bucket1
、AccountB-ID
に独自の値を指定してポリシーを更新します。CanonicalUserId-of-AWSaccountA-BucketOwner
{ "Version": "2012-10-17", "Statement": [ { "Sid": "111", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::
AccountB-ID
:user/AccountBadmin" }, "Action": "s3:PutObject", "Resource": "arn:aws:s3:::
/*" }, { "Sid": "112", "Effect": "Deny", "Principal": { "AWS": "arn:aws:iam::amzn-s3-demo-bucket1
AccountB-ID
:user/AccountBadmin" }, "Action": "s3:PutObject", "Resource": "arn:aws:s3:::
/*", "Condition": { "StringNotEquals": { "s3:x-amz-grant-full-control": "id=amzn-s3-demo-bucket1
CanonicalUserId-of-AWSaccountA-BucketOwner
" } } } ] }
ステップ 1.3: アカウント C にクロスアカウントアクセスを許可する IAM ロールをアカウント A に作成する
IAM コンソールexamplerole
) を作成します。このロールはアカウント A に作成する必要があるため、アカウント A の管理者としてサインインしていることを再度確認してください。
-
ロールを作成する前に、ロールに必要なアクセス許可を定義する管理ポリシーを準備します。後の手順で、このポリシーをロールにアタッチします。
-
左側のナビゲーションペインで [ポリシー] を選択し、続いて [ポリシーの作成] を選択します。
-
[独自のポリシーを作成] の横で、[選択] を選択します。
-
[Policy Name (ポリシー名)] フィールドに「
access-accountA-bucket
」と入力します。 -
以下のアクセスポリシーをコピーして、[Policy Document (ポリシードキュメント)] フィールドに貼り付けます。このアクセスポリシーは、ロールに
s3:GetObject
のアクセス許可を付与するため、アカウント C のユーザーがこのロールを引き受けると、s3:GetObject
オペレーションのみを実行できます。{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "s3:GetObject", "Resource": "arn:aws:s3:::
/*" } ] }amzn-s3-demo-bucket1
-
[ポリシーの作成] を選択します。
新しいポリシーが管理ポリシーの一覧に表示されます。
-
-
左側のナビゲーションペインで、[ロール]、[新しいロールの作成] の順に選択します。
-
[ロールタイプの選択] で [クロスアカウントアクセスのロール] を選択して、[所有する AWS アカウント の間のアクセスの提供] の隣の [選択] ボタンを選択します。
-
アカウント C のアカウント ID を入力します。
このチュートリアルでは、ロールを引き受けるユーザーに多要素認証 (MFA) を必須とする必要がないため、このオプションは選択していない状態のままにしておきます。
-
[次のステップ] を選択して、そのロールに関連するアクセス許可を設定します。
-
作成した access-accountA-bucket ポリシーの横にあるチェックボックスを選択し、[次のステップ] を選択します。
[Review] ページが表示されます。このページで作成前のロールの設定を確認できます。このページで注意する重要な項目は、このロールを使用する必要があるユーザーに送信できるリンクです。ユーザーがこのリンクをクリックすると、[ロールの切り替え] ページがすぐに表示されます。このページには、[アカウント ID] と [ロール名] がすでに設定されています。このリンクは、クロスアカウントロールの [ロールの概要] ページで後で確認することもできます。
-
ロール名に「
examplerole
」と入力し、[次のステップ] を選択します。 -
ロールを確認したら、[ロールの作成] を選択します。
examplerole
ロールがロールの一覧に表示されます。 -
ロール名
examplerole
を選択します。 -
[Trust Relationships (信頼関係)] タブを選択します。
-
[ポリシードキュメントの表示] を選択して、表示されている信頼ポリシーが次のポリシーと一致するか確認します。
次の信頼ポリシーは、アカウント C との信頼を確立し、
sts:AssumeRole
アクションを許可します。詳細については、AWS Security Token Service API リファレンスの「AssumeRole」を参照してください。{ "Version": "2012-10-17", "Statement": [ { "Sid": "", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::
AccountC-ID
:root" }, "Action": "sts:AssumeRole" } ] } -
作成した
examplerole
ロールの Amazon リソースネーム (ARN) を書き留めます。後の手順で、このロールの引き受けを許可するユーザーポリシーを IAM ユーザーにアタッチしますが、ロールは ARN 値で指定します。
ステップ 2: アカウント B のタスクを実行する
アカウント A が所有するバケットの例では、他のアカウントが所有するオブジェクトが必要です。このステップでは、アカウント B の管理者は、コマンドラインツールを使用してオブジェクトをアップロードします。
-
put-object
AWS CLI コマンドを使用して、オブジェクトを
にアップロードします。amzn-s3-demo-bucket1
aws s3api put-object --bucket
--keyamzn-s3-demo-bucket1
HappyFace.jpg
--bodyHappyFace.jpg
--grant-full-control id="canonicalUserId-ofTheBucketOwner
" --profileAccountBadmin
次の点に注意してください。
-
--Profile
パラメータはAccountBadmin
のプロファイルを指定しているため、オブジェクトはアカウント B によって所有されます。 -
grant-full-control
パラメータは、バケットポリシーに従って、バケット所有者にオブジェクトに対するフルコントロールのアクセス許可を付与します。 -
--body
パラメータは、アップロードするソースファイルを指定します。例えば、ファイルが Windows コンピュータの C: ドライブにある場合は、「c:\HappyFace.jpg
」と指定します。
-
ステップ 3: アカウント C のタスクを実行する
これまでの手順で、アカウント A はすでに examplerole
ロールを作成し、アカウント C との信頼を確立しています。これにより、アカウント C のユーザーは、アカウント A にアクセスすることができます。このステップでは、アカウント C の管理者がユーザー (Dave) を作成し、アカウント A から取得した sts:AssumeRole
のアクセス許可を委任します。examplerole
を引き受けた Dave は、一時的にアカウント A へのアクセス権を取得します。アカウント A がロールにアタッチしたアクセスポリシーは、アカウント A にアクセスする Dave が実行できるアクション (特に
のオブジェクトを取得すること) を制限します。amzn-s3-demo-bucket1
ステップ 3.1: アカウント C でユーザーを作成し、examplerole を引き受けるアクセス許可を委任する
-
アカウント C で IAM ユーザーのサインイン URL を使用して、まず
AccountCadmin
ユーザーとして AWS Management Console にサインインします。 -
IAM コンソール
で、ユーザー Dave を作成します。 詳細な手順については、「IAM ユーザーガイド」の「AWS Management Console での IAM ユーザーの作成」を参照してください。
-
Dave の認証情報を書き留めます。Dave は、
examplerole
ロールを引き受けるのに、これらの認証情報を必要とします。 -
アカウント A の
sts:AssumeRole
ロールでexamplerole
アクセス許可を Dave に委任する Dave IAM ユーザー用のインラインポリシーを作成します。左側のナビゲーションペインで、[ユーザー] を選択します。
ユーザー名 [Dave] を選択します。
ユーザー詳細ページで [Permissions (アクセス許可)] タブを選択し、[Inline Policies (インラインポリシー)] セクションを展開します。
[click here (ここをクリック)] (または [Create User Policy (ユーザーポリシーの作成)]) を選択します。
[Custom Policy] を選択し、[Select] を選択します。
[Policy Name (ポリシー名)] フィールドにポリシーの名前を入力します。
以下のポリシーをコピーして、[Policy Document (ポリシードキュメント)] フィールドに貼り付けます。
を指定してポリシーを更新する必要があります。AccountA-ID
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": ["sts:AssumeRole"], "Resource": "arn:aws:iam::
AccountA-ID
:role/examplerole" } ] }[ポリシーを適用] を選びます。
-
別のプロファイル
AccountCDave
を追加して、Dave の認証情報を AWS CLI の設定ファイルに保存します。[profile AccountCDave] aws_access_key_id =
UserDaveAccessKeyID
aws_secret_access_key =UserDaveSecretAccessKey
region = us-west-2
ステップ 3.2: ロール (examplerole) を引き受けてオブジェクトにアクセスする
Dave は、以下の手順でアカウント A が所有するバケットのオブジェクトにアクセスできます。
-
Dave は、まず自分の認証情報を使用して、
examplerole
を引き受けます。一時的な認証情報が返されます。 -
この一時的な認証情報を使用して、アカウント A のバケットのオブジェクトにアクセスします。
-
コマンドプロンプトで、
AccountCDave
プロファイルを使用して、次の AWS CLIassume-role
コマンドを実行します。examplerole
が定義されている
を指定して、コマンドの ARN 値を更新する必要があります。AccountA-ID
aws sts assume-role --role-arn arn:aws:iam::
AccountA-ID
:role/examplerole --profile AccountCDave --role-session-name testAWS Security Token Service (AWS STS) が一時的なセキュリティ認証情報 (アクセスキー ID、シークレットアクセスキー、およびセッショントークン) を返します。
-
一時的なセキュリティ認証情報を
TempCred
プロファイルの AWS CLI 設定ファイルに保存します。[profile TempCred] aws_access_key_id =
temp-access-key-ID
aws_secret_access_key =temp-secret-access-key
aws_session_token =session-token
region = us-west-2 -
コマンドプロンプトで、一時的な認証情報を使用して、次の AWS CLI コマンドを実行してオブジェクトにアクセスします。例えば、コマンドで head−object API を指定すると、
HappyFace.jpg
オブジェクトのオブジェクトメタデータが取得されます。aws s3api get-object --bucket
--keyamzn-s3-demo-bucket1
HappyFace.jpg
SaveFileAs.jpg
--profile TempCredexamplerole
にアタッチされているアクセスポリシーでは、アクションが許可されているため、Amazon S3 はリクエストを処理します。バケットの任意のオブジェクトに対して任意のアクションを試してみましょう。例えば、
get-object-acl
のアクションを試すと、このロールではそのアクションは許可されていないため、アクセス許可が拒否されます。aws s3api get-object-acl --bucket
--keyamzn-s3-demo-bucket1
HappyFace.jpg
--profile TempCredこの例では、ユーザー Dave がロールを引き受け、一時的な認証情報を使用してオブジェクトにアクセスしました。同様に、アカウント C のアプリケーションが
のオブジェクトにアクセスすることも可能です。アプリケーションが一時的なセキュリティ認証情報を取得すれば、アカウント C はこのアプリケーションにamzn-s3-demo-bucket1
examplerole
を引き受けるアクセス許可を委任できます。
ステップ 4: クリーンアップする
-
テストが終了したら、次の手順でクリーンアップを行います。
-
アカウント A の認証情報を使用して AWS Management Console
にサインインし、次の操作を行います。 -
Amazon S3 コンソールで、
にアタッチされているバケットポリシーを削除します。バケットの [プロパティ] で、[アクセス許可] セクションのポリシーを削除します。amzn-s3-demo-bucket1
-
バケットをこの演習のために作成した場合は、Amazon S3 コンソールでオブジェクトを削除してから、バケットを削除します。
-
IAM コンソール
で、アカウント A で作成した examplerole
を削除します。詳細な手順については、「IAM ユーザーガイド」の「IAM ユーザーの削除」を参照してください。 -
IAM コンソール
で、[AccountAadmin] ユーザーを削除します。
-
-
-
アカウント B の認証情報を使用して IAM コンソール
にサインインします。ユーザー AccountBadmin を削除します。 -
アカウント C の認証情報を使用して IAM コンソール
にサインインします。AccountCadmin とユーザー Dave を削除します。
関連リソース
このチュートリアルに関連する詳細については、「IAM ユーザーガイド」の以下のリソースを参照してください。