Principal を広く指定し、Condition と aws:PrincipalArn で対象を絞り込む方法を整理する
IAMロールの信頼ポリシーで Principal を広く指定し、Condition と aws:PrincipalArn を使って特定のIAMロールだけに絞り込む方法を整理する
今日やったこと
PrincipalではARNの一部分にワイルドカードを指定できないことを確認したPrincipalをAWSアカウント単位で広く指定する方法を確認したConditionとaws:PrincipalArnを使って、特定のIAMロールだけに対象を絞る方法を整理したArnEqualsとArnLikeの使い分けを確認した
学んだこと
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:SourceArnとaws:SourceAccountの役割を整理する- 信頼ポリシーで使われる他のConditionキーを確認する
aws sts assume-roleを手動で実行する方法を整理する- IAM Identity Centerとは何かを整理する