iam:CreateLoginProfile による権限昇格のおそれがある IAM ロール

他の IAM ユーザーのコンソールログインプロファイル作成権限を、必要な管理範囲に限定してください。

説明

iam:CreateLoginProfile では、まだログインプロファイルがない IAM ユーザーにコンソールパスワードを設定できます。ロールの利用者が高権限ユーザーを対象にこの操作を行えると、新たなコンソールアクセス経路を作れる場合があります。

実際のログインには、MFA などの他の制御が引き続き適用されます。プロファイルの作成自体は対象ユーザーの権限を増やしませんが、その権限を使う別の経路を作ります。

想定される影響

  • アカウントへの接続経路の追加: コンソールパスワードのなかったユーザーに、ブラウザーからのアクセス経路を作れます。
  • 権限昇格: 他のログイン制御が許す場合、高権限ユーザーとしてコンソールへアクセスできるおそれがあります。
  • 発見の遅れ: 未承認のプロファイル作成を通常の管理作業と区別しにくい場合があります。

対処方法

  • ログインプロファイルを管理しないロールから iam:CreateLoginProfile を削除してください。
  • 必要な権限を専用管理者と承認済みの対象ユーザーに限定してください。
  • プロファイル作成イベントを確認し、対象ユーザーの MFA などのログイン制御を維持してください。

例

権限ポリシーの抜粋であり、ロールの信頼ポリシーは別途必要です。

変更前

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:CreateLoginProfile",
        ]
        Effect   = "Allow"
        Resource = "*"
      },
    ]
  })
}

変更後

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

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

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

変更後は、同じロールのこのポリシーからログインプロファイル作成権限を削除し、EC2 の情報取得権限だけを残します。既存のログインプロファイルや他のポリシーを削除する変更ではありません。

参考資料