IAM ロールの iam:PutRolePolicy 権限の確認

ロール自身や他のロールのインラインポリシーを変更できる範囲を制限してください。

説明

広い iam:PutRolePolicy を持つロールを使う主体は、そのロール自身や他のロールのインラインポリシーを追加・上書きできます。同じロールの権限を拡大したり、制御可能なワークロードのロールを変更したりして、権限昇格に利用できるおそれがあります。

別のロールのポリシーを変更するだけで、そのロールを引き受けられるわけではありません。信頼設定とロールの利用権限は別であり、境界、組織ポリシー、明示的な拒否も維持されます。

想定される影響

  • 実行中のアプリケーションに、未承認のリソースアクセスが許可される可能性があります。
  • 再利用されるロールのポリシー変更が、複数のサービスに影響するおそれがあります。

対処方法

不要な iam:PutRolePolicy を削除し、管理操作を専用ロールに分離してください。必要な場合は Resource を承認済みの対象ロール ARN に限定してください。自身の権限を変更できる経路と変更ログを確認し、正常な作業が成功し、未承認の変更が阻止されることを確認してください。

例

同じロールとインラインポリシーを維持した抜粋です。省略した信頼ポリシーは、実際の構成に別途定義してください。

変更前

hcl
resource "aws_iam_role" "example" {
  name = "cosmic"
}

resource "aws_iam_role_policy" "example" {
  name = "test_inline_policy"
  role = aws_iam_role.example.name

  policy = jsonencode({
    Version = "2012-10-17"
    Statement = [
      {
        Action = [
          "iam:PutRolePolicy",
        ]
        Effect   = "Allow"
        Resource = "*"
      },
    ]
  })
}

このロールを使う主体が、同じロールを含むロール全体のインラインポリシーを追加・更新できます。

変更後

hcl
resource "aws_iam_role" "example" {
  name = "cosmic"
}

resource "aws_iam_role_policy" "example" {
  name = "test_inline_policy"
  role = aws_iam_role.example.name

  policy = jsonencode({
    Version = "2012-10-17"
    Statement = [
      {
        Action = [
          "ec2:Describe*",
        ]
        Effect   = "Allow"
        Resource = "*"
      },
    ]
  })
}

この許可文には EC2 の参照操作だけを残します。他のポリシーを通じたロール変更権限と、実際に必要な参照範囲も確認してください。

参考資料