スイッチロールしたAWSコンソールのセッション時間を1hよりも長くできるようになったので、スイッチロールの有効期限をおさらいする

ついにAWS Management Consoleでスイッチロールしたときのセッション時間を12時間まで伸ばせるようになりました。このアップデートを通じてスイッチロールの有効期限について改めて整理してみようと思いました。
2020.08.01

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

西澤です。ついにAWS Management Consoleでスイッチロールしたときのセッション時間を12時間まで伸ばせるようになりました。このアップデートを通じてスイッチロールの有効期限について改めて整理してみようと思いました。

スイッチロールとはなんなのか?

スイッチロールという表現はAWS公式ページでも数多く登場しますし、CloudTrailのイベント名にも出てきますが、原則としてはAWS Management Console上でのGUI操作により特定のIAMロール権限に遷移する操作のことを指していると理解しています。ちなみにSwitchRoleというAPIは存在しません。ただ今回の記事では、IAMロールの権限を引き受けた状態に遷移することをスイッチロールと表現することにします。

もう少し具体的に何をしているかを見てみるとわかりやすいと思いますので、イメージを書いてみました。GUIで操作した場合には一切意識されませんが、一時クレデンシャルを発行することを専門とするAWS STSがこの機能を司っています。

  1. AWS STSサービスに対して、AssumeRoleAPIを利用して、そのIAMロールになる権限があるかを問い合わせます
  2. 権限を有していれば、一時クレデンシャル(AccessKeyId/SecretAccessKey/SessionToken)が有効期限と共に払い出されます
  3. 一時クレデンシャルを利用してAWSリソースにアクセスすることでスイッチロールの完成です

スイッチロールするときの有効期限は何で決定されるのか?

では、このスイッチロールするときの有効期限は何で決定されるのでしょうか?

APIベースでスイッチロールする場合

有効期限を決定する要素は2種類あります。

  • IAMロールのMaxSessionDuration
  • AssumeRoleするときのSessionDuration

この2つのより小さい値 が有効期限となります。

AWS Management Consoleでスイッチロールする場合

一方でGUIでのスイッチロールでは、有効期限を決定する要素は1つだけです。これがつい先日のアップデートで有効となったところです。

  • IAMロールのMaxSessionDuration

ちなみにこのMaxSessionDurationはGUIからIAMロールを作成する場合には指定ができず、デフォルト値は1hです。もう少し長くセッションを利用したい方はこちらを変更してみてください。

IAMロールはAWSサービスからもスイッチロールされる場合もありますが、その場合にはこの指定によって制限されることは無いとのことです。本記事執筆時点では、日本語版ドキュメントの更新が追いついていないようでしたので、最新は英語版ドキュメントをご覧ください。

APIベースでのスイッチロールを動作確認してみた

まずは、MaxSessionDurationを4hにしたIAMロールを用意します

$ aws iam get-role \
    --profile cm-nishizawa \
    --role-name SwitchedRole \
    --query Role.MaxSessionDuration
14400

それではまず、MaxSessionDurationが4hに対して、SessionDurationを2hで指定してAssumeRoleしてみます。

$ date -u
2020年 7月31日 金曜日 15時13分17秒 UTC
$ aws sts assume-role \
    --role-arn "arn:aws:iam::${AWS_ACCOUNT_ID}:role/SwitchedRole" \
    --role-session-name hoge \
    --duration-seconds $((60*60*2))
{
    "Credentials": {
        "AccessKeyId": "ASIAxxxx...",
        "SecretAccessKey": "Y1cxxx...",
        "SessionToken": "IQoJxxx...",
        "Expiration": "2020-07-31T17:13:20+00:00"
    },
    "AssumedRoleUser": {
        "AssumedRoleId": "AROA2EZZYHWW6JAD2AJC7:hoge",
        "Arn": "arn:aws:sts::123456789012:assumed-role/SwitchedRole/hoge"
    }
}

Expirationを見れば、2hの指定が有効となっていることがわかります。

続けて、MaxSessionDurationが4hに対して、SessionDurationを8hで指定してAssumeRoleしてみます。

$ date -u
2020年 7月31日 金曜日 15時15分35秒 UTC
$ aws sts assume-role \
    --role-arn "arn:aws:iam::${AWS_ACCOUNT_ID}:role/SwitchedRole" \
    --role-session-name hoge \
    --duration-seconds $((60*60*8))
An error occurred (ValidationError) when calling the AssumeRole operation: The requested DurationSeconds exceeds the MaxSessionDuration set for this role.

ValidationErrorとなりました。SessionDurationは、MaxSessionDurationを超過する値を指定できないことがわかりました。

また、IAMロールから異なるIAMロールへスイッチする(チェインする)ことも可能ですが、この場合には1hを超えるSessionDuration指定はできません。

An error occurred (ValidationError) when calling the AssumeRole operation: The requested DurationSeconds exceeds the 1 hour session limit for roles assumed by role chaining.

補足

AWS CLIで頻繁にスイッチロールを利用される場合は、設定ファイルに書いている方も多いはず。1hよりも長めにセッションを利用したい方はこちらにもduration_secondsを追記しておくと良いでしょう。

$ cat ~/.aws/config
:::
[profile hoge]
role_arn = arn:aws:iam::123456789012:role/SwitchedRole
mfa_serial = arn:aws:iam::987654321098:mfa/IamUser
source_profile = fuga
duration_seconds = 43200
:::

一方でいたずらにセッション時間を長くすることはリスクとなることも理解しておきましょう。万一のときには一時クレデンシャルを無効化する手段も抑えておけば安心ですね。

まとめ

今回の有用なアップデートを契機に、時限付きIAMロールへの一時クレデンシャルの使い方について理解をさらに深めることができました。

どこかの誰かのお役に立てば嬉しいです。