今日やったこと

  • Principal ではARNの一部分にワイルドカードを指定できないことを確認した
  • Principal をAWSアカウント単位で広く指定する方法を確認した
  • Conditionaws:PrincipalArn を使って、特定のIAMロールだけに対象を絞る方法を整理した
  • ArnEqualsArnLike の使い分けを確認した

学んだこと

PrincipalではARNの一部をワイルドカードにできない

次のように、ロール名の一部を * にしたPrincipalは指定できない。

{
  "Principal": {
    "AWS": "arn:aws:iam::123456789012:role/dev-*"
  }
}

複数のロールを命名規則でまとめて許可したい場合は、Principal ではなく Condition を使って絞り込む。

Principalで大枠を指定する

まず、Principal には対象のAWSアカウントを指定する。

{
  "Principal": {
    "AWS": "arn:aws:iam::123456789012:root"
  }
}

この root はrootユーザーだけではなく、指定したAWSアカウントを表す。

この状態では対象が広いため、Condition で追加条件を設定する。

aws:PrincipalArnで絞り込む

aws:PrincipalArn は、リクエストを実行しているPrincipalのARNを条件として確認するためのキー。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::123456789012:root"
      },
      "Action": "sts:AssumeRole",
      "Condition": {
        "ArnLike": {
          "aws:PrincipalArn": "arn:aws:iam::123456789012:role/dev-*"
        }
      }
    }
  ]
}

この信頼ポリシーは、次のような意味になる。

123456789012 アカウントを信頼する
ただし、実際にロールを引き受けられるのは
名前が dev- で始まるIAMロールだけ

考え方を整理すると、以下の通り。

Principal:
  対象となるアカウントを大まかに指定する

Condition:
  実際に許可するPrincipalを追加条件で絞り込む

ArnEqualsとArnLikeの違い

特定のARNだけを許可する場合は、ArnEquals を使用する。

"Condition": {
  "ArnEquals": {
    "aws:PrincipalArn": "arn:aws:iam::123456789012:role/dev-application"
  }
}

ロール名の一部にワイルドカードを使いたい場合は、ArnLike を使用する。

"Condition": {
  "ArnLike": {
    "aws:PrincipalArn": "arn:aws:iam::123456789012:role/dev-*"
  }
}

使い分けは以下の通り。

条件演算子 用途
ArnEquals 特定のARNと完全一致させる
ArnLike * などのワイルドカードを使って一致させる

注意点

信頼ポリシーで許可するだけでは、呼び出し元が必ずロールを引き受けられるとは限らない。

呼び出し元のIAMロールやIAMユーザー側にも、対象ロールに対する sts:AssumeRole の許可が必要になる場合がある。

また、Principal を広く指定するため、Condition の記述を間違えると想定以上のPrincipalを許可する可能性がある。

IAMポリシーを確認するときは、次の順番で読むと分かりやすい。

1. Principalで大枠の対象を確認する
2. Conditionで追加の制限を確認する
3. Actionで許可される操作を確認する

次にやること

  • aws:SourceArnaws:SourceAccount の役割を整理する
  • 信頼ポリシーで使われる他のConditionキーを確認する
  • aws sts assume-role を手動で実行する方法を整理する
  • IAM Identity Centerとは何かを整理する