IAM Policy の JSON 定義で少しハマったのでメモ。
要約
- 各アクションとリソースタイプの組み合わせでどの条件キーが対応しているかは全てドキュメントに記載されている
- ステートメントを分割して各アクションとリソースタイプに対応する条件キーを定義しよう
各アクションとリソースタイプの組み合わせでどの条件キーを利用できるかは決まっている
IAM Policy のステートメントには Condition
要素を含めることができ、これにより policy を実行するタイミングの条件を指定することができます。その指定する条件として条件キーを利用できます。
この条件キーですが、各アクションとリソースタイプの組み合わせでどの条件キーを利用できるかは決まっています。こちらの一覧は公式ドキュメントにまとまっているので Condition
要素を利用する場合は一読することをおすすめします。
条件キーを利用する場合は対応するアクションとリソースタイプのみを定義したステートメントを用意する
Condition
要素に条件キーを利用する場合は対応するアクションとリソースタイプのみを定義したステートメントを用意しましょう。対応していない条件キーが含まれていると Policy が正常に評価されません。
具体例
AWS IAM Identity Center の sso:CreateAccountAssignment
アクションを例に説明します。
このアクションはリソースタイプとして Account
, Instance
, PermissionSet
の3つを必ず指定する必要があります。そして Instance
と PermissionSet
のみ条件キーとして aws:ResourceTag/${TagKey}
が対応しています。
上記を前提に Project=A
というタグが付いた PermissionSet
に対してのみ sso:CreateAccountAssignment
アクションを実行できる Policy を定義しようとすると以下になります。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "Example1",
"Effect": "Allow",
"Action": "sso:CreateAccountAssignment",
"Resource": [
"arn:aws:sso:::permissionSet/*/*"
],
"Condition": {
"StringEquals": {
"aws:ResourceTag/Project": "A"
}
}
},
{
"Sid": "Example2",
"Effect": "Allow",
"Action": "sso:CreateAccountAssignment",
"Resource": [
"arn:aws:sso:::instance/*",
"arn:aws:sso:::account/*"
]
}
]
}
ポイントとしては PermissionSet
リソースタイプのみに Condition
要素を定義したステートメントと、 Account
と Instance
リソースタイプに Condition
要素を定義していないステートメントの2つを定義している所です。同じアクションを定義したステートメントが複数あるのは個人的に若干違和感を感じたのですが、こういうものだと割り切って Policy を構築していきましょう。