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:PassedToService
が ec2.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": "*" } ] }