スイッチロールしたAWSコンソールのセッション時間を1hよりも長くできるようになったので、スイッチロールの有効期限をおさらいする
西澤です。ついにAWS Management Consoleでスイッチロールしたときのセッション時間を12時間まで伸ばせるようになりました。このアップデートを通じてスイッチロールの有効期限について改めて整理してみようと思いました。
スイッチロールとはなんなのか?
スイッチロールという表現はAWS公式ページでも数多く登場しますし、CloudTrailのイベント名にも出てきますが、原則としてはAWS Management Console上でのGUI操作により特定のIAMロール権限に遷移する操作のことを指していると理解しています。ちなみにSwitchRoleというAPIは存在しません。ただ今回の記事では、IAMロールの権限を引き受けた状態に遷移することをスイッチロールと表現することにします。
もう少し具体的に何をしているかを見てみるとわかりやすいと思いますので、イメージを書いてみました。GUIで操作した場合には一切意識されませんが、一時クレデンシャルを発行することを専門とするAWS STSがこの機能を司っています。
- AWS STSサービスに対して、
AssumeRole
APIを利用して、そのIAMロールになる権限があるかを問い合わせます - 権限を有していれば、一時クレデンシャル(
AccessKeyId
/SecretAccessKey
/SessionToken
)が有効期限と共に払い出されます - 一時クレデンシャルを利用して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ロールへの一時クレデンシャルの使い方について理解をさらに深めることができました。
どこかの誰かのお役に立てば嬉しいです。