AWS のサービスにロールを渡すアクセス権限をユーザーに付与する - AWS Identity and Access Management

AWS のサービスにロールを渡すアクセス権限をユーザーに付与する

多くの AWS サービスを設定するには、そのサービスに IAM ロールを渡す必要があります。これで、その後サービスがロールを引き受け、ユーザーに代わってアクションを実行できるようになります。大半のサービスでは、サービスにロールを渡さなければならないのはセットアップ時の 1 回のみで、サービスがロールを引き受けるたびには行いません。例えば、Amazon EC2 インスタンスで実行しているアプリケーションがあるとします。このアプリケーションには認証に使う一時的な認証情報と、AWS でアクションを実行するためのアプリケーション認証のアクセス許可が必要です。アプリケーションをセットアップする場合、こうした認証情報を提供するインスタンスで使用するよう、Amazon EC2 にロールを渡す必要があります。そのロールに IAM ポリシーをアタッチして、インスタンスで実行するアプリケーションのアクセス許可を定義します。アプリケーションは、このロールが許可しているアクションを実行する必要があるたびに、ロールを引き受けます。

ユーザーがロール (とそのアクセス許可) を AWS サービスに渡すには、そのサービスにロールを渡すアクセス許可が必要になります。これにより、承認済みのユーザーのみが、アクセス許可を付与するロールを使用してサービスを設定できるようになります。ユーザーが AWS サービスにロールを渡すには、IAM ユーザー、ロール、またはグループに PassRole アクセス許可を付与する必要があります。

警告
  • 同じ AWS アカウントを共有するサービスに IAM ロールを渡すには、PassRole のアクセス許可のみ使用できます。アカウント A のロールをアカウント B のサービスに渡すには、まずアカウント A からロールを引き受けることができる IAM ロールをアカウント B に作成する必要があります。その後、アカウント B のロールをサービスに渡すことができます。詳細については、「IAM でのクロスアカウントのリソースへのアクセス」を参照してください。

  • ロールをタグ付けした後に、iam:PassRole アクションでポリシー内の ResourceTag 条件キーを使用してロールを渡せるユーザーを制御しないようにしてください。このアプローチでは信頼できる結果は得られません。

PassRole アクセス許可を設定する場合、ユーザーがロールに必要以上のアクセス許可があるロールを渡さないようにする必要があります。例えば、Alice が Amazon S3 アクションを実行する許可を持っていない場合があります。Alice が Amazon S3 アクションを許可するサービスにロールを渡すことができる場合、サービスはジョブの実行時に、Alice に代わって Amazon S3 アクションを実行できます。

サービスにリンクされたロールを特定する場合は、サービスにそのロールを渡すためのアクセス許可も必要になります。一部のサービスでは、そのサービスでアクションを実行する際にアカウント内にサービスにリンクされたロールが自動的に作成されます。例えば、Amazon EC2 Auto Scaling では Auto Scaling グループが最初に作成されたときに、AWSServiceRoleForAutoScaling のサービスにリンクされたロールを作成します。のアクセス許可がない状態で Auto Scaling グループの作成時にサービスにリンクされたのアクセス許可がない状態で、のアクセス許可がない状態で、iam:PassRole のアクセス許可がない状態で、エラーが表示されます。ロールを明示的に指定しない場合、iam:PassRole のアクセス許可は不要で、デフォルトではそのグループで実行されるすべての操作に AWSServiceRoleForAutoScaling ロールを使用します。サービスにリンクされたロールをサポートするサービスを確認するには、「IAM と連携する AWS のサービス」を参照してください。サービスにリンクされたロールがサービスでアクションの実行時に自動的に作成されるかどうかを確認するには、「はい」リンクを選択して、該当サービスのサービスにリンクされたロールに関するドキュメントを参照してください。

ユーザーは、ロールを使用してサービスにアクセス許可を割り当てる任意の API オペレーションで、パラメータとして ARN を渡すことができます。次に、そのサービスはユーザーに iam:PassRole 権限があるかどうか確認します。ユーザーが渡せるロールを承認済みのロールだけに制限するには iam:PassRole のアクセス許可と IAM のポリシーステートメントの Resources 要素をフィルターに掛けることができます。

JSON ポリシーの Condition 要素を使用して、すべての AWS リクエストのリクエストコンテキストに含まれるキーの値をテストできます。ポリシーでの条件キーの使用の詳細については、「IAM JSON ポリシー要素Condition」をご参照ください。iam:PassedToService 条件キーを使用して、ロールを渡すことができるサービスのサービスプリンシパルを指定できます。ポリシーでの iam:PassedToService 条件キーの使用の詳細については、「iam:PassedToService」をご参照ください。

例 1

インスタンスの起動時に、承認済みの一連のロールを Amazon EC2 サービスに渡すための権限をユーザーに付与したいと考えているとします。その場合、3 つの要素が必要です。

  • ロールに許可されている内容を定義し、ロールにアタッチしている IAM のアクセス許可ポリシー ロールが実行しなければならない操作やロールが操作を実行する上で必要とするリソースのみにアクセス許可を制限します。AWS のマネージドまたはカスタマー定義の IAM アクセス権ポリシーが使用できます。

    { "Version": "2012-10-17", "Statement": { "Effect": "Allow", "Action": [ "A list of the permissions the role is allowed to use" ], "Resource": [ "A list of the resources the role is allowed to access" ] } }
  • サービスにロールの引き受けを許可する、ロールの信頼ポリシー。例えば、次の信頼ポリシーを UpdateAssumeRolePolicy アクションを使用するロールにアタッチできます。この信頼ポリシーは Amazon EC2 がロールを使用し、そのロールにアタッチしているアクセス許可の使用を許可します。

    { "Version": "2012-10-17", "Statement": { "Sid": "TrustPolicyStatementThatAllowsEC2ServiceToAssumeTheAttachedRole", "Effect": "Allow", "Principal": { "Service": "ec2.amazonaws.com" }, "Action": "sts:AssumeRole" } }
  • 承認済みのロールのみをユーザーが渡せるように許可する、IAM ユーザーにアタッチしている IAM のアクセス許可ポリシー。ユーザーが渡すロールの詳細を得るため、通常 iam:GetRoleiam:PassRole に追加します。この例でユーザーが渡すことができるのは、指定されたアカウントに存在し、EC2-roles-for-XYZ- で始まる名前を持つロールに限ります。

    { "Version": "2012-10-17", "Statement": [{ "Effect": "Allow", "Action": [ "iam:GetRole", "iam:PassRole" ], "Resource": "arn:aws:iam::account-id:role/EC2-roles-for-XYZ-*" }] }

これでユーザーは割り当てられたロールで Amazon EC2 インスタンスを起動することができます。インスタンスで実行しているアプリケーションはインスタンスプロファイルのメタデータのロールで一時的な認証情報にアクセスすることができます。ロールにアタッチされたアクセス権限ポリシーは、インスタンスに許可する操作を定義します。

例 2

Amazon Relational Database Service (Amazon RDS) は、拡張モニタリングと呼ばれる機能をサポートしています。この機能により、Amazon RDS はエージェントを使用してデータベースインスタンスをモニタリングできます。また、Amazon RDS は Amazon CloudWatch Logs にメトリックスを記録することもできます。この機能を有効にするには、サービスロールを作成して、メトリクスをモニタリングしログに書き込む権限を Amazon RDS に付与する必要があります。

Amazon RDS 拡張モニタリング用のロールを作成するには
  1. AWS Management Console にサインインして、IAM コンソール (https://console.aws.amazon.com/iam/) を開きます。

  2. [ロール]、[ロールの作成] の順に選択します。

  3. [AWS Service] ロールタイプを選択し、[Use cases for other AWS のサービス][RDS] サービスを選択します。[RDS – Enhanced Monitoring] (RDS – 拡張モニタリング)、[Next] (次へ) の順に選択します。

  4. AmazonRDSEnhancedMonitoringRole アクセス権ポリシーを選択します。

  5. [Next] を選択します。

  6. [Role name] (ロール名) に、このロールの目的を識別しやすくするロール名を入力します。ロール名は AWS アカウント アカウント内で一意である必要があります。ロール名がポリシーまたは ARN の一部として使用される場合、ロール名は大文字と小文字が区別されます。サインイン処理中など、コンソールでロール名がユーザーに表示される場合、ロール名は大文字と小文字を区別しません。さまざまなエンティティがロールを参照する可能性があるため、作成後にロール名を編集することはできません。

  7. (オプション) [Description (説明)] には、新しいロールの説明を入力します。

  8. (オプション) タグをキーバリューペアとしてアタッチして、メタデータをユーザーに追加します。IAM におけるタグの使用の詳細については、「IAM リソースのタグ付け」を参照してください。

  9. ロール情報を確認し、ロールの作成 を選択します。

ロールを引き受ける monitoring.rds.amazonaws.com サービスのアクセス許可を付与する信頼ポリシーをロールが自動的に取得します。その後、Amazon RDS は AmazonRDSEnhancedMonitoringRole ポリシーが許可するすべての操作を実行できるようになります。

拡張モニタリングへのアクセスを許可するユーザーは、次に示すように、ユーアーが RDS をリストすることを許可するステートメントとユーザーがロールを渡すことを許可するステートメントを含むポリシーが必要になります。アカウント番号を自分のものに置き換え、ロールの名前をステップ 6 で指定した名前に置き換えます。

{ "Sid": "PolicyStatementToAllowUserToListRoles", "Effect": "Allow", "Action": ["iam:ListRoles"], "Resource": "*" }, { "Sid": "PolicyStatementToAllowUserToPassOneSpecificRole", "Effect": "Allow", "Action": [ "iam:PassRole" ], "Resource": "arn:aws:iam::account-id:role/RDS-Monitoring-Role" }

別のポリシーのステートメントとこのステートメントを組み合わせたり、独自のポリシーで使用することができます。代わりにユーザーが RDS- で始まるロールを渡せるように指定するには、以下のようにリソース ARN にあるロールの名前をワイルドカードに置き換えできます。

"Resource": "arn:aws:iam::account-id:role/RDS-*"

AWS CloudTrail ログ内の iam:PassRole アクション

PassRole は API 呼び出しではありません。PassRole はアクセス許可です。つまり、IAM PassRole には CloudTrail ログは生成されません。CloudTrail でどのロールがどの AWS のサービス に渡されるかを確認するには、ロールを受け取る AWS のリソースを作成または変更した CloudTrail ログを確認する必要があります。例えば、ロールが作成されると AWS Lambda 関数に渡されます。CreateFunction アクションのログには、関数に渡されたロールの記録が表示されます。