IAMロールの信頼ポリシーでロールセッション名を制限する


はじめに

2020/4/21 に IAMロールの信頼ポリシーで利用可能な AWS STS の条件キーに
sts:RoleSessionName が追加されました。

IAM ロールを使用して実行されたアクションを担当する ID を簡単に特定
https://aws.amazon.com/jp/about-aws/whats-new/2020/04/now-easily-identify-the-identity-responsible-for-the-actions-performed-using-iam-roles/

この条件キーを 信頼ポリシーの Condition に記述することで
AssumeRole でロールを引き受ける際に設定する必要のあるロールセッション名指定できます。

何が嬉しいか

ロールセッション名とは AssumeRole 時にオプションで指定可能な文字列です。
この値は CloudTrail にも記載されるため、セッションの識別に使用できます。

条件キー sts:RoleSessionName によりロールセッション名を強制できるため
例えば以下のような信頼ポリシーを記述することで、AssumeRole を行ったIAM ユーザー名を
確実に CloudTrail の証跡に残すことができます。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "sts:AssumeRole",
            "Principal": {
                "AWS": "arn:aws:iam::0123456789012:root"
            },
            "Condition": {
                "StringLike": {
                    "sts:RoleSessionName": "${aws:username}"
                }
            }
        }
    ]
}

やってみる

test_user という IAM ユーザーが 同一アカウント内で IAMTEST_ROLE という
ロールに切り替えるというケースで考えます。

IAMTEST_ROLE の信頼ポリシーを前述のように書き換えて保存します。
Principal のアカウントID は 実際のものに変更してください。

AWSCLI で検証してみます。
default プロファイルに test_user のアクセスキー/シークレットアクセスキーを設定します。

$ aws configure
AWS Access Key ID [None]: AKIAXXXXXXXXXEXAMPLE
AWS Secret Access Key [None]: xxxxxxxxxxxxx/xxxxxxx/xxxxxxxxEXAMPLEKEY
Default region name [None]: ap-northeast-1
Default output format [None]: json

~/.aws/config に テスト用のプロファイルを iamtest と iamtest2 という名前で追加します。

[profile iamtest]
region = ap-northeast-1
role_arn = arn:aws:iam::0123456789012:role/IAMTEST_ROLE
role_session_name = hogehoge
source_profile = default

[profile iamtest2]
region = ap-northeast-1
role_arn = arn:aws:iam::0123456789012:role/IAMTEST_ROLE
role_session_name = test_user
source_profile = default

--profile iamtest では ロールセッション名が呼び出し元の IAM ユーザーと
一致しない (role_session_name = hogehoge) ため、AccessDenied になります。

$ aws sts get-caller-identity --profile iamtest
An error occurred (AccessDenied) when calling the AssumeRole operation: User:
arn:aws:iam::0123456789012:user/test_users is not authorized to perform: 
sts:AssumeRole on resource: arn:aws:iam::0123456789012:role/IAMTEST_ROLE

--profile iamtest2 ではロールセッション名が呼び出し元の IAM ユーザーと
一致する (role_session_name = test_user) ため、get-caller-identity の結果が返ります。

$ aws sts get-caller-identity --profile iamtest2
{
    "UserId": "AROAXXXXXXXXXXXXXXXXX:test_user",
    "Account": "0123456789012",
    "Arn": "arn:aws:sts::0123456789012:assumed-role/IAMTEST_ROLE/test_user"
}

ちなみに マネージドコンソールからのスイッチロールの場合、ロールセッション名は自動的に
IAM ユーザー名に設定されるため、今回の例では問題なくスイッチできます。

参考

IAM and AWS STS Condition Context Keys
https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_iam-condition-keys.html#condition-keys-sts

簡単ですが以上です。
参考になれば幸いです。