信頼ポリシーにおいてスイッチロールできるIAMユーザーを複数指定する方法
Jump アカウントを構築している環境において、スイッチロール先 IAM ロールの信頼ポリシーにおいて、Jump アカウントの複数 IAM ユーザーを信頼する方法を紹介します。
Jump アカウント環境では、次の 2 つの方法によりスイッチロールの可否を制御できます。
- Jump アカウントの IAM ユーザー/グルーに付与する IAM ポリシーにおいて、スイッチロールできる IAM ロール先を制限する
- スイッチロール先アカウントの IAM ロールの信頼ポリシーにおいて、Jump アカウントからスイッチロールできる IAM ユーザーを制限する
本ブログは2
の方法に関するブログであり、信頼ポリシーにおいて、Conditon を利用することで Jump アカウントの複数の IAM ユーザーを信頼する方法を紹介します。
複数の IAM ユーザーを信頼する方法
現時点では、IAM ロールの信頼ポリシーのプリンシパルとして IAM グループを指定することに対応していません。
そのため、Jump アカウントの複数 IAM ユーザーに対して、スイッチロールできる IAM ユーザーを指定するためには次のようにPrincipal
に IAM ユーザーを列挙します。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": [ "arn:aws:iam::111122223333:user/test-user-02", "arn:aws:iam::111122223333:user/test-user-01" ] }, "Action": "sts:AssumeRole" } ] }
もしくは、次のように AWS アカウントプリンシパルを指定して、Jump アカウントの全ての IAM ユーザーや IAM ロール、フェデレーティッドユーザー等をまとめて指定します。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::111122223333:root" }, "Action": "sts:AssumeRole" } ] }
最小権限を実現するためには、複数の IAM ユーザーを列挙することが望ましいですが、アカウント毎にスイッチロールを許可したい IAM ユーザーが異なる場合は、複数アカウントに IAM ロール作成を展開する際の手間が増えるトレードオフがあります。
そこで Condition を利用することで、AWS アカウントプリンシパルの利用と比較して、スイッチロールできる IAM ユーザーを限定できる方法を 2 つ紹介します。
IAM ユーザーの Prefix で制限する方法
1 つ目は、IAM ユーザーの Prefix に基づいてスイッチロールを許可する方法です。IAM ユーザープリンシパルはuser/test-user-*
のようにワイルドカードの指定に対応していないため、代わりにCondition
でStringLike
を利用します。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "*" }, "Action": "sts:AssumeRole", "Condition": { "StringLike": { "aws:PrincipalArn": "arn:aws:iam::111122223333:user/test-user-*" } } } ] }
IAM ユーザープリンシパルのワイルドカードの使用に関しては次のユーザーガイドに記載があります。
AWS JSON ポリシーの要素: Principal - AWS Identity and Access Management
Principal
要素内でユーザーを指定する際に、"すべてのユーザー" の意味でワイルドカード (*
) を使用することはできません。プリンシパルには、常に複数の特定ユーザーを指定する必要があります。
この方法は AWS のブログでも紹介されており、参考になります。
IAM 信頼ポリシーエラー「信頼ポリシーの更新に失敗しました」を解決するにはどうすればよいですか。ポリシーのプリンシパルが無効です?
IAM ユーザーのパスで制限する方法
2 つ目は、IAM ユーザーのパスを利用して特定のパスを持つ IAM ユーザーに対してスイッチロールを許可する方法です。次の例では/test/
パスを持つ IAM ユーザーを設定しています。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "*" }, "Action": "sts:AssumeRole", "Condition": { "StringLike": { "aws:PrincipalArn": "arn:aws:iam::111122223333:user/test/*" } } } ] }
IAM のパスについては、次のブログが参考になります。
パスを利用するメリットとしては、ユーザー名をシンプルにできる点があります。例えば、次の図の IAM ユーザーはパスを含めると/tsest/user-01
というユーザー名ですが、IAM のマネジメントコンソール上ではパスは表示されません。また、サインインするときに指定するユーザー名もuser-01
です。
一方で、次の点に注意する必要もあります。
- パスの設定はマネジメントコンソールではなく AWS CLI や SDK を利用する必要がある
後からパスを変更することはできない(変更する場合は IAM ユーザーを再作成)
2022.8.20 追記
IAM ユーザーのパス設定は変更可能であったため訂正いたします
IAM ユーザーのパス設定を変更したい場合は次のブログをご参照ください。
注意点
紹介した 2 つの方法はCondition
の条件に一致する全ての IAM ユーザーに対してsts:AssumeRole
を許可することになるため、IAM ユーザーを列挙する方法と比べて許可される範囲が広くなります。この点も考慮してどの方法を採用するか検討する必要があります。
また、Principal
の"AWS": "*"
指定はあらゆる AWS リソースを信頼する記載のため、誤ってCondion
を削除して保存することがないように注意する必要もあります。
さいごに
Jump アカウント環境において、Condition
でStringLike
を利用することで、スイッチロールできる IAM ユーザーを複数許可する方法を紹介しました。IAM ユーザーのスイッチロールを許可するためには、IAM ユーザープリンシパルか AWS アカウントプリンシパルを指定する方法しか知らなかったのですが、AWS のブログを見ていると、今回紹介した方法が掲載されていたため試してみました。
参考資料
AWS JSON ポリシーの要素: Principal - AWS Identity and Access Management
IAM 信頼ポリシーエラー「信頼ポリシーの更新に失敗しました」を解決するにはどうすればよいですか。ポリシーのプリンシパルが無効です?