AWSサービスに渡すIAMロールを制限する

EC2インスタンスやLambda関数にはIAMロールをアタッチすることができます。 ゆるいIAMポリシーを採用していると、STS 可能な任意のIAMロールを利用できてしまいます。

この問題を解決するために、IAMロールとロールを利用するAWSサービスのペアを制限する方法を紹介します。

AWSサービスに渡すIAMロールを制限する

例えば、EC2 インスタンスに特定のIAMロールのみアタッチ出来るようにするには、次のように定義します。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "IAMPassRoleForEC2",
      "Effect": "Allow",
      "Action": [
        "iam:PassRole"
      ],
      "Resource": "arn:aws:iam::12345:role/EC2Role",
      "Condition": {
        "StringEquals": {
          "iam:PassedToService": [
            "ec2.amazonaws.com"
          ]
        }
      }
    }
  ]
}

iam:PassRole はユーザーが IAM ロールを AWS サービスに渡す(PASS)アクセス許可を定義します。 このアクションが許可されていないと、そもそも IAM ロールをパスできません。

渡すことの出来るロールを制限するには Resource を利用します。 上記例では arn:aws:iam::12345:role/EC2Role に制限しています。

さらに、渡す対象のAWSサービスを制限するには iam:PassedToService を利用します。 上記例では EC2 のみに制限(iam:PassedToServiceec2.amazonaws.com に一致)しています。

このようにすることで、IAMロールとロールを利用するAWSサービスのペアを制限できます。

Lambda ような他のAWSサービスも、同様に定義できます。

マネージドポリシーにもこのようなポリシーを確認できます。

...
  {
    "Action": [
      "iam:PassRole"
    ],
    "Effect": "Allow",
    "Resource": [
      "arn:aws:iam::*:role/service-role/cwe-role-*"
    ],
    "Condition": {
      "StringEquals": {
        "iam:PassedToService": [
          "events.amazonaws.com"
        ]
      }
    }
  },
...

EventBridge(events.amazonaws.com) にパス可能なロールがサービスにリンクされた特定のロール("arn:aws:iam::*:role/service-role/cwe-role-*") に制限されています。 許可されていないロール、例えば、ユーザーが作成したロールを利用したい場合は、それらロールの Resource を Allow するポリシーを別途定義してアタッチする必要があります。

AWSサービスに渡すIAMロールを制限しない

上記例とは正反対に、パスするIAMロールやパス先サービスを制限せずに、iam:PassRole をまるっと許可したい場合は、以下の様にします。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Action": [
        "iam:PassRole"
      ],
      "Effect": "Allow",
      "Resource": "*"
    }
  ]
}

参考