📌

aws-vaultのsessionの時間制限

2024/04/09に公開

初めに

aws-vaultを使っているんだけど、長い時間がかかる処理に対してセッションがタイム・アウトしてしまって困った。aws-vaultを使うと1hしかセッションを維持できないとか、オプション指定で延長できるとか、挙動がよくわからなかったので整理してみた。

結論

以下のコマンドでaws-vaultを使ってセッション時間を指定することができる。

aws-vault exec profile --duration=12h -- 実行したい処理

スイッチ先ロールのスイッチ制限時間が延長されている必要がある。

整理

スイッチ先ロールの制限時間はデフォルトでは1h。これをmax session durationによって伸ばすことができる。aws-vaultと連携して使う時は例えば以下のように使う。

aws-vault exec profile --duration=4h -- aws s3api list-buckets

この時durationがroleの制限を超えた場合、例えばロールには4時間の制限がかかっている場合に12hを指定すると、以下のように最大制限時間を越えているエラーとなる。

$ aws-vault exec profile --duration=12h -- aws s3api list-buckets
aws-vault: error: exec: Failed to get credentials for profile: operation error STS: AssumeRole, https
response error StatusCode: 400, RequestID: abf2d18d-f4c3-4763-a3ee-665fe7a1968f, api error ValidationError: The
requested DurationSeconds exceeds the MaxSessionDuration set for this role.

注意点として、aws-vaultはセッションをキャッシュしているので、一度有効な時間設定(今回の例では4h)でセッション作成後に、無効な時間設定(今回の例では12h)を指定すると、キャッシュを使ってしまい問題なく動作しているように見えてしまう。

動作確認の前にキャッシュを消す必要がある。以下のようにセッションを確認し、

$ aws-vault list --sessions
sts.AssumeRole:3h58m38s

セッションのみを削除する

$ aws-vault remove profile --sessions-only

なお、長い時間の処理をする前はセッションの作り直しをする必要がある。そうしないと、以前作成したいつ切れるかわからないセッションで実行してしまうから。常に作り直すようなオプションは見当たらなかった。

ロールチェイニングについて

aws-vaultのgithubのドキュメントに以下の記載がある。

If you try to assume a role from a temporary session or another role, AWS considers that as role chaining and limits your ability to assume the target role to 1h. Trying to use a duration longer than 1h may result in an error:
...
For that reason, AWS Vault will not use GetSessionToken if --duration or the role's duration_seconds is longer than 1h.

ざっくり訳すと

一時セッションや他のロールからスイッチを試みるとロールの連鎖と判断され、スイッチできる時間は1hに限られ、それ以上を指定するとエラーとなります。そのため、aws vaultは1h以上の時間を設定した場合はGetSessionTokenを使いません

という感じか。またawsの解説ページに以下の記載がある。

ロールの連鎖では、AWS CLI または AWS API ロールセッションは最長 1 時間に制限されます。

ロールの連鎖っていうのはつまり、ロールAにスイッチしてからロールBにスイッチする。というような意味合いだと思うんだけど、aws-vaultを使う時にロールの連鎖してなくない?新しいロールはできていないっぽいけど。。。

考えてみると、、、

GetSessionTokenを使って一時的なクレデンシャルを取得し、次にその一時的なクレデンシャルを使用してAssumeRoleを通じて別のロールの権限を一時的に引き受けるという、一連の権限引き継ぎが行われている。ということか?つまり、ロールの連鎖ではなくセッションの連鎖、セッション内セッション?みたいな状態だと1hに制限されるのかな?

んでもって、--durationに1hより長い時間を設定すると、GetSessionTokenを使った一時的なクレデンシャルを使ったAssumeRoleではなく、ユーザーの長期クレデンシャル(IAMユーザーのアクセスキーIDとシークレットアクセスキー)を使ってスイッチしているということか。その分だけ少しセキュリティ性が下がるということですね。

profileを使ってaws sdkを使う

boto3を使う場合にprofileを指定すれば、セッションをauto refreshしてくれるみたい。
https://boto3.amazonaws.com/v1/documentation/api/latest/guide/credentials.html

When you specify a profile that has an IAM role configuration, Boto3 will make an AssumeRole call to retrieve temporary credentials. Subsequent Boto3 API calls will use the cached temporary credentials until they expire, in which case Boto3 will then automatically refresh the credentials.

自分で組もうね、と言っている時代もあるようですが、boto3が進化したということかな?
https://repost.aws/questions/QU-tAtxo2uQp-10bHXHccyTg/python-boto3-auto-refresh-credentials-when-assuming-role
https://stackoverflow.com/questions/63724485/how-to-refresh-the-boto3-credentials-when-python-script-is-running-indefinitely

ただ、codeにprofile名を書くのって嫌ですよね。
製品状態だと要らないわけだし、人によってprofile名は違うわけだし。

参考ページ

https://dev.classmethod.jp/articles/understanding-iam-role-and-switch-role/

最後に

なんとなく使ってなんとなくセッションが切れていたaws-vaultを少し理解できました。

Discussion