信頼ポリシーにおいてスイッチロールできるIAMユーザーを複数指定する方法

2022.06.21

Jump アカウントを構築している環境において、スイッチロール先 IAM ロールの信頼ポリシーにおいて、Jump アカウントの複数 IAM ユーザーを信頼する方法を紹介します。

Jump アカウント環境では、次の 2 つの方法によりスイッチロールの可否を制御できます。

  1. Jump アカウントの IAM ユーザー/グルーに付与する IAM ポリシーにおいて、スイッチロールできる IAM ロール先を制限する
  2. スイッチロール先アカウントの 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::939443129894:user/test-user-02",
                    "arn:aws:iam::939443129894:user/test-user-01"
                ]
            },
            "Action": "sts:AssumeRole"
        }
    ]
}

もしくは、次のように AWS アカウントプリンシパルを指定して、Jump アカウントの全ての IAM ユーザーや IAM ロール、フェデレーティッドユーザー等をまとめて指定します。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::939443129894:root"
            },
            "Action": "sts:AssumeRole"
        }
    ]
}

最小権限を実現するためには、複数の IAM ユーザーを列挙することが望ましいですが、アカウント毎にスイッチロールを許可したい IAM ユーザーが異なる場合は、複数アカウントに IAM ロール作成を展開する際の手間が増えるトレードオフがあります。

そこで Condition を利用することで、AWS アカウントプリンシパルの利用と比較して、スイッチロールできる IAM ユーザーを限定できる方法を 2 つ紹介します。


IAM ユーザーの Prefix で制限する方法

1 つ目は、IAM ユーザーの Prefix に基づいてスイッチロールを許可する方法です。IAM ユーザープリンシパルはuser/test-user-*のようにワイルドカードの指定に対応していないため、代わりにConditionStringLikeを利用します。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": "*"
            },
            "Action": "sts:AssumeRole",
            "Condition": {
                "StringLike": {
                    "aws:PrincipalArn": "arn:aws:iam::939443129894: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 ユーザーを再作成)


注意点

紹介した 2 つの方法はConditionの条件に一致する全ての IAM ユーザーに対してsts:AssumeRoleを許可することになるため、IAM ユーザーを列挙する方法と比べて過度に許容される可能性があります。この点も考慮してどの方法を採用するか検討する必要があります。

また、Principal"AWS": "*"指定はあらゆる AWS リソースを信頼する記載のため、誤ってCondionを削除して保存することがないように注意する必要もあります。


さいごに

Jump アカウント環境において、ConditionStringLikeを利用することで、スイッチロールできる IAM ユーザーを複数許可する方法を紹介しました。IAM ユーザーのスイッチロールを許可するためには、IAM ユーザープリンシパルか AWS アカウントプリンシパルを指定する方法しか知らなかったのですが、AWS のブログを見ていると、今回紹介した方法が掲載されていたため試してみました。


参考資料

AWS JSON ポリシーの要素: Principal - AWS Identity and Access Management

IAM 信頼ポリシーエラー「信頼ポリシーの更新に失敗しました」を解決するにはどうすればよいですか。ポリシーのプリンシパルが無効です?