AWS sts:AssumeRoleでIAMユーザからIAMロールになる

2022年9月18日

AWS サービスに設定する IAM ロールの権限が正しいかどうかを手元の PC 上で試したいことがあったので、IAM ユーザから IAM ロールに成り代わる方法の備忘録。sts:AssumeRole を使って IAM ユーザが IAM ロールを引き受けます。

参考ドキュメント

目次

  1. 特定の IAM ユーザが IAM ロールを引き受けることができるようにする
  2. AWS CLI で IAM ロールを引き受ける
  3. 発行されたアクセスキーを環境変数に設定する
  4. IAM ロールの権限で API 呼び出しができるか確認する
  5. IAM ロールの引き受けに 2 要素認証を必須とする

特定の IAM ユーザが IAM ロールを引き受けることができるようにする

IAM ユーザが IAM ロールを引き受けることができるように、IAM ロールの信頼関係に IAM ユーザを設定します。ほとんどの場合、すでに AWS のサービスが設定されている(今回は EC2 との信頼関係が設定されている)と思いますので、以下のように追加をします。AWS のアカウント ID と IAM ユーザ名はご自身のものに置き換えてください。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "",
            "Effect": "Allow",
            "Principal": {
                "Service": "ec2.amazonaws.com"
            },
            "Action": "sts:AssumeRole"
        },
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::123456789012:user/my-user"
            },
            "Action": "sts:AssumeRole"
        }
    ]
}

AWS CLI で IAM ロールを引き受ける

以下のように実行して、現在の AWS アクセスキーが IAM ロールを引き受ける IAM ユーザであることを確認します。

aws sts get-caller-identity
{
    "UserId": "AIDAXXXXXXXXXXXXXXXXX",
    "Account": "123456789012",
    "Arn": "arn:aws:iam::123456789012:user/my-user"
}

AWS CLI で sts assume-role コマンドを実行します。--role-arnはご自身の IAM ロールに置き換えてください。--role-session-nameはロールを引き受けるユーザ名にすると、CloudTrail のユーザ名のところにここで指定した名前が出てきて、誰が API を呼び出したのかすぐに分かるのでおすすめです。

aws sts assume-role \
  --role-arn arn:aws:iam::123456789012:role/my-role \
  --role-session-name my-user \
  --duration-seconds 900 \

実行結果。AWS アクセスキーなどが発行されます。このキーはExpiration の時間まで有効です。

{
    "Credentials": {
        "AccessKeyId": "ASIAXXXXXXXXXXXXXXXX",
        "SecretAccessKey": "CGzyxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
        "SessionToken": "IQoJxxxxxxxxxxxxxxxx",
        "Expiration": "2022-09-18T03:57:12+00:00"
    },
    "AssumedRoleUser": {
        "AssumedRoleId": "AROAXXXXXXXXXXXXXXXXX:my-user",
        "Arn": "arn:aws:sts::123456789012:assumed-role/my-role/my-user"
    }
}

発行されたアクセスキーを環境変数に設定する

さきほど発行されたアクセスキーなどを 3 つの環境変数に設定します。

export AWS_ACCESS_KEY_ID=ASIAXXXXXXXXXXXXXXXX
export AWS_SECRET_ACCESS_KEY=CGzyxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
export AWS_SESSION_TOKEN=IQoJxxxxxxxxxxxxxxxx

AWS Profile の場合は以下のコマンドを参考に。

aws configure set aws_access_key_id ASIAXXXXXXXXXXXXXXXX
aws configure set aws_secret_access_key CGzyxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
aws configure set aws_session_token IQoJxxxxxxxxxxxxxxxx

IAM ロールの権限で API 呼び出しができるか確認する

IAM ロールを引き受けられているか確認をします。

aws sts get-caller-identity
{
    "UserId": "AROAXXXXXXXXXXXXXXXXX:my-user",
    "Account": "123456789012",
    "Arn": "arn:aws:sts::123456789012:assumed-role/my-role/my-user"
}

その他、任意の AWS CLI コマンドを実行し、IAM ロールで設定している権限で API 呼び出しができるかどうかを確認します。

aws ec2 descrive-vpcs

IAM ロールの引き受けに 2 要素認証を必須とする

冒頭で紹介した信頼ポリシーを 2 要素認証を通過した IAM ユーザに限定するには以下のようにします。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::123456789012:user/my-user"
            },
            "Action": "sts:AssumeRole",
            "Condition": {
                "Bool": {
                    "aws:MultiFactorAuthPresent": "true"
                }
            }
        }
    ]
}

慣れないうちはここでハマりやすいので、最初は 2 要素認証無しで動作確認をするのがおすすめです。

-技術ブログ
-