この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
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サービスも、同様に定義できます。
マネージドポリシーにもこのようなポリシーを確認できます。
arn:aws:iam::aws:policy/AWSCodePipelineFullAccess
...
{
"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": "*"
}
]
}