STSを利用すると、一時的なトークンを取得できる。
使用頻度が低い等でIAMアカウントを作成すること無く、IDフェデレーションで一時的にCredentialsを渡すようなことができる。
例えば、LDAP認証などのブローカーサーバーを用意し、そちらで認証に通ったユーザーに対して権限を割り当てる等。
ここでは下記の2つのSTSのAPIについて試してみた。
- AssumeRole
- GetFederationToken
AssumeRoleについて
既存のIAMユーザーの認証情報を⽤いて、IAM Roleのtemporary security credentialsを取得するためのアクション。
aws cliを使う例。下記の投稿がわかりやすかった。
NOTE: IAMロールについて、信頼関係のJSONはPermissionのタブではなく、Trust relationshipsの方に登録する
assume-role APIを実行すると、新規にアクセスキー、シークレットアクセスキー、そしてセッショントークンが送られてくるので、これを環境変数にセットすることでその権限が使用できる。
$ export AWS_ACCESS_KEY_ID = XXXXXXXXXXXX
$ export AWS_SECRET_ACCESS_KEY= XXXXXXXXXXXX
$ export AWS_SESSION_TOKEN= XXXXXXXXXXXX
もし、マネジメントコンソールで利用する場合、コンソール上部の"Switch Role"メニューで設定すれば切り替えられる。
これをboto3でやるとこんな感じ。
import boto3
from boto3.session import Session
profile = 'assume-test-user'
session = Session(profile_name=profile)
sts = session.client('sts')
result = sts.assume_role(RoleArn='arn:aws:iam::XXXXXXXXXXXX:role/assume-role-test',
RoleSessionName='test')
credentials = result['Credentials']
ec2_resource = boto3.resource('ec2',
aws_access_key_id=credentials['AccessKeyId'],
aws_secret_access_key=credentials['SecretAccessKey'],
aws_session_token=credentials['SessionToken'])
for instance in ec2_resource.instances.all():
print(instance)
有効期間ついては下記。(ドキュメントより)
一時的なセキュリティ認証情報の有効期間を指定する期間。最短は 15 分(900 秒)、最長(デフォルト)は 1 時間(3600 秒)です。一時的な認証情報を 1 時間が経過する前に無効にする場合にのみ、この値を渡す必要があります。
GetFederationTokenについて
認証を受けたFederatedユーザーのtemporary security credentialsを取得するためのアクション。
下記の投稿が分かりやすかった。
[JAWS-UG CLI] STS:#2 GetFederationToken
有効期間ついては下記。(ドキュメントより)
この API は、デフォルトの有効期限が大幅に長い(1 時間までではなく 36 時間まで)という点で AssumeRole とは異なります。より長い有効期限により、何度も新しい認証情報を取得する必要がなくなるので、AWS の呼び出しの回数を減らすことができます。
それぞれのAPIの違い
AssumeRoleやGetFederationTokenなどのAPIの使い分けはどうすればよいのだろうか。
下記を見ると、与える権限の範囲やクロスアカウント、MFAの利用で違いがある。
僕はスピンサーブが打てない:Temporary-Security-Credentials-のまとめ
また、Identity and Access Management (IAM)のp.58に概要説明があるので、それを参考に。