EC2 インスタンスだけを管理できてそれ以外の権限は不要という IAM ユーザが必要になり、IAM ユーザのポリシーに AmazonEC2FullAccessだけを付与して EC2 インスタンスを作ろうとしたところ、iam:PassRole というアクションの権限が必要というエラーがでてきました。この iam:PassRole について調べたので備忘録です。
目次
- iam:PassRole は、IAM Role の使用を許可する権限である
 - 調査に至った背景
 - EC2 インスタンスの作成完了画面で Authorization failure エラーが発生する
 - エンコードされたエラーメッセージをデコードする
 - iam:passRole って何だ
 - iam:PassRole がなぜ用意されているのか
 - iam:PassRole が必要なサービス
 
iam:PassRole は、IAM Role の使用を許可する権限である
先に結論を。AWS のドキュメント Granting a user permissions to pass a role to an AWS service - AWS Identity and Access Management に iam:PassRole の解説があります。
iam:PassRole は、IAM Role の使用を許可する権限である。
サービス B が IAM ロール を必要としているとき
ユーザ A はロールに対して iam:PassRole 権限を持っていれば
ユーザ A は サービス B にロールを渡すことができる
ユーザが AWS サービスにロールを渡す(Pass する)権限ということで、iam:PassRole という名前がついているようです。説明自体はこれで終わりなのですが、調査にいたった経緯と補足の説明をまとめておくので気になった方は続きをどうぞ。
調査に至った背景
- IAM ユーザのポリシーに 
AmazonEC2FullAccessだけを設定した IAM ユーザを用意する。 - そのユーザで AWS マネジメントコンソールにログインする。
 - EC2 インスタンス作成の画面で IAM Role (IAM Instance Profile) を設定する。
 - EC2 インスタンス作成完了画面で Authorization failure エラーが発生する。
 
EC2 インスタンスの作成完了画面で Authorization failure エラーが発生する
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 Management に iam:PassRole の解説がありました。このドキュメントもなかなか難しいのですが、何度も読んで以下のように解釈しました。
iam:PassRole は、IAM Role の使用を許可する権限である。
サービス B が IAM ロール を必要としているとき
ユーザ A はロールに対して iam:PassRole 権限を持っていれば
ユーザ 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"
    }
  ]
}
iam:PassRole はある程度柔軟に権限設定ができます。たとえばすべての IAM ロールを、特定のリージョンの EC2 インスタンスだけに PassRole できるようにする場合はこのようにします。詳しくは 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権限になぜ iam:PassRole が入っていないのかを考えたところ、以下のようなケース、「IAM ユーザに設定された以上の権限を IAM ロールを使って得ることができる」ことを防ぐためためではないかと思っています。
Amazon EC2 インスタンスを起動する権限を持つ、管理者ではない IAM ユーザーがいて、
インスタンスを起動するとき、ユーザーはインスタンスに関連付ける IAM ロールを自由に指定できるとします。
このとき、ユーザーが AdministratorAccess ポリシーをアタッチされた IAM ロールを選択しインスタンスを起動した場合、ユーザはインスタンスに SSH でログインし、そのロールの権限を使用して特権的なアクセスを得ることができます。
このようなことを防ぐために、ユーザは特定の IAM ロールに対して iam:PassRole 権限を許可されるようになっているのだと理解しています。
iam:PassRole が必要なサービス
iam:PassRole の権限が必要なサービスは、Lambda, CloudFormation, CodeBuild など、他にもたくさんあります。マネジメントコンソールで IAM Role を指定するサービスはすべて iam:PassRole が必要なイメージです。
AmazonEC2FullAccess と違い、AWSLambda_FullAccess には iam:PassRole が含まれています。サービスに SSH などでアクセスができない種類のサービスの IAM Role には、あらかじめ iam:PassRole が含まれているようです。
{
    "Version": "2012-10-17",
    "Statement": [
        ...
        {
            "Effect": "Allow",
            "Action": "iam:PassRole",
            "Resource": "*",
            "Condition": {
                "StringEquals": {
                    "iam:PassedToService": "lambda.amazonaws.com"
                }
            }
        },
        ...
    ]
}