IAM ユーザーポリシーの MFA 要件の確認

人によるロール引き受けの MFA 要件を、実際の認証情報とポリシー全体で確認してください。

説明

重要なロールの引き受けを MFA なしで許可すると、漏えいした IAM ユーザーの認証情報が、より強い権限へのアクセスに悪用されるおそれがあります。ユーザーポリシーや対象ロールの信頼ポリシーを含む実際の認可で、MFA が必要か確認してください。

aws:MultiFactorAuthPresent は、すべての認証情報に存在するわけではありません。長期アクセスキー自体には MFA 状態がなく、対応する MFA 一時認証情報やロール引き受け手順が必要です。外部 IdP の MFA は、その認証基盤で別途適用してください。

想定される影響

  • MFA が必要な操作が、漏えいした認証情報だけで許可されるおそれがあります。
  • 他のポリシーの許可があると、一つの文の MFA 条件だけではアクセスを制限できない場合があります。

対処方法

  • 人のロール引き受けに MFA が必要なら、権限と対象ロールの信頼を併せて制限してください。Allow の BoolIfExists はキーがなくても成立するため、MFA を確実に要求する条件にはしないでください。
  • MFA がある要求とない要求をテストし、他の許可ポリシーも確認してください。自動化には適切なワークロードロールを使ってください。

例

既存の IAM ユーザーと実際の対象ロール ARN を用意してください。ユーザーの ID ベースポリシーには Principal を含めず、対象ロールの信頼ポリシーは別途必要です。

変更前

hcl
resource "aws_iam_user_policy" "example" {
  name = "test"
  user = aws_iam_user.example.name

  policy = <<EOF
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Resource": "${var.target_role_arn}",
      "Action": "sts:AssumeRole"
    }
  ]
}
EOF
}

変更後

hcl
resource "aws_iam_user_policy" "example" {
  name = "test"
  user = aws_iam_user.example.name

  policy = <<EOF
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Resource": "${var.target_role_arn}",
      "Action": "sts:AssumeRole",
      "Condition": {
        "Bool": {
          "aws:MultiFactorAuthPresent" : "true"
        }
      }
    }
  ]
}
EOF
}

補足:

  • 変更前: この文にはロール引き受けの MFA 条件がありません。他の制御も確認が必要です。
  • 変更後: この許可文は MFA 値が true の要求だけに適用されます。他のポリシーが MFA なしのアクセスを許可していないか別途確認してください。

参考資料