AWS iam:PassRoleって何だ

2022年9月1日

EC2 インスタンスだけを管理できてそれ以外の権限は不要という IAM ユーザが必要になり、IAM ユーザのポリシーに AmazonEC2FullAccessだけを付与して EC2 インスタンスを作ろうとしたところ、iam:PassRole というアクションの権限が必要というエラーがでてきました。この iam:PassRole について調べたので備忘録です。

目次

  1. 前提として
  2. インスタンスを作成しようとするとエラーが発生する
  3. エンコードされたエラーメッセージをデコードする
  4. iam:passRole って何だ
  5. iam:PassRole がなぜ用意されているのか

前提として

  1. IAM ユーザのポリシーに AmazonEC2FullAccess だけを設定した IAM ユーザを用意する。
  2. そのユーザで AWS マネジメントコンソールにログインする。
  3. EC2 インスタンス作成時に IAM Role を設定する。

インスタンスを作成しようとするとエラーが発生する

IAM Role を設定してインスタンスを作成しようとすると、以下のようにエラーが発生します。

Launch Failed - You are not authorized to perform this operation. Encoded authorization failure message: 4GIOHlTkIaWHQD0Q0m6XSnuUMCm-abcdefghijklmn-abcdefghijklmn-abcdefghijklmn

エンコードされたエラーメッセージをデコードする

Encoded authorization failure with RunInstances in Amazon EC2 を参考に AWS CLI を使ってエラーメッセージの内容をデコードします。

aws sts decode-authorization-message --encoded-message 4GIOHlTkIaWHQD0Q0m6XSnuUMCm-abcdefghijklmn-abcdefghijklmn-abcdefghijklmn

DecodedMessage に書かれた json を整形すると以下のようになります。json の context.conditions.items[] が長いので中身を省略しています。

{
  "allowed": false,
  "explicitDeny": false,
  "matchedStatements": {
    "items": []
  },
  "failures": {
    "items": []
  },
  "context": {
    "principal": {
      "id": "AccesskeyID",
      "name": "test-user",
      "arn": "arn:aws:iam::accountID:user/test-user"
    },
    "action": "iam:PassRole",
    "resource": "arn:aws:iam::accountID:role/EC2-roles-for-XYZ",
    "conditions": {
      "items": []
    }
  }
}

Launch Failed - You are not authorized to perform this operation.のエラーメッセージとセットで確認すると、IAM ユーザ test-user が IAM ロール role/EC2-roles-for-XYZ に対して iam:PassRole アクションを実行する権限が無いのでエラーが出たことが分かります。

iam:passRole って何だ

AWS のドキュメントを確認します。Grant an IAM user permission to pass an IAM role to an instance - Amazon Elastic Compute Cloud によると、IAM ロールを持つインスタンスの起動をするには、iam:PassRole を許可するように書かれています。やはり iam:PassRole が必要なようです。

さらに AWS のドキュメントを調べたところ、Granting a user permissions to pass a role to an AWS service - AWS Identity and Access Managementiam:PassRole の解説がありました。このドキュメントもなかなか難しいのですが、何度も読んで以下のように解釈しました。

iam:PassRole は、IAM Role の使用を許可する権限である。

  1. サービス B が IAM ロール を必要としているとき
  2. ユーザ A はロールに対して iam:PassRole 権限を持っていれば
  3. ユーザ A は サービス B にロールを渡すことができる

今回のケースでは EC2 サービスが IAM ロールを必要としているため、IAM ユーザに iam:PassRole 権限が必要ということになります。IAM ユーザに以下のポリシーを追加すれば、IAM ロールを設定してインスタンスを作成することができるようになります。

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

PassRole できる範囲をもう少し細かくすることもできます。たとえば EC2 の指定したリージョンに限定する場合はこのようにします。詳しくは IAM and AWS STS condition context keys - Available keys for IAM - AWS Identity and Access Management を参照

{
    "Effect": "Allow",
    "Action": "iam:PassRole",
    "Resource": "*",
    "Condition": {
        "StringEquals": {"iam:PassedToService": "ec2.amazonaws.com"},
        "StringLike": {
            "iam:AssociatedResourceARN": [
                "arn:aws:ec2:us-east-1:111122223333:instance/*",
                "arn:aws:ec2:us-west-1:111122223333:instance/*"
            ]
        }
    }
}

iam:PassRole がなぜ用意されているのか

どうして iam:PassRole というアクションが用意されているのか、AmazonEC2FullAccessに権限がなぜ入っていないのかを考えたところ、以下のようにシナリオを防ぐためかと思っています。

  1. Amazon EC2 インスタンスを起動する権限を持つ、管理者ではない IAM ユーザーがいて
  2. インスタンスを起動するとき、ユーザーはインスタンスに関連付ける IAM ロールを自由に指定できるとします
  3. このとき、ユーザーが AdministratorAccess ポリシーをアタッチされた IAM ロールを選択しインスタンスを起動した場合、ユーザはインスタンスに SSH でログインし、そのロールの権限を使用して特権的なアクセスを得ることができます

IAM ユーザに設定された以上の権限を IAM Role を使って得ることができることを防ぐために、ユーザは特定の IAM ロールに対して iam:PassRole 権限を許可されるようになっているのだと理解しています。

-技術ブログ
-