AWS IAMユーザーに対して一時的な認証情報をリクエストする(STS:GetSessionToken)

2019.11.06

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

IAM ロールに対して STS:AssumeRole 系APIを実行すると、そのロールを引き受ける一時的な認証情報が発行されます。アクセス許可を委任したいときなどに利用され、利用頻度・利用パターンが非常に多いため、本サイトでも大量にブログが書かれています。

同様に STS:GetSessionToken API を実行すると、IAM ユーザーの一時的な認証情報が発行されます。

  • MFA 付きリクエストを実行する場合
  • モバイルデバイスやウェブブラウザのような安全性の低い環境から IAM ユーザーで AWS リソースにアクセスする場合

などに利用されます。

本ブログでは、あまり触れられることのない STS:GetSessionToken API についてかんたんに紹介します。

やってみた

IAM ユーザーの一時認証情報を利用するには、STS:GetSessionToken API で発行された一時認証情報を環境変数に設定するだけです。

AWS CLI/SDK を利用して MFA 付きリクエストをする場合、以下の様に明示的に API 操作する必要はありません。 一時クレデンシャルの発行・設定や有効期限が切れた時の再発行は、CLI/SDK レベルで行われます。

以下では動作を理解するために、明示的に API を呼び出します。

一時認証情報の発行

一時認証情報を発行するには STS:GetSessionToken API を利用します。

$ aws sts get-session-token \
  --duration-seconds 3600
{
    "Credentials": {
        "AccessKeyId": "ASIA...",
        "SecretAccessKey": "...",
        "SessionToken": "...",
        "Expiration": "2014-05-07T23:47:00Z"
    }
}

レスポンスには

  • アクセスキー(AccessKeyId)
  • シークレットアクセスキー(SecretAccessKey)
  • セッショントークン(SessionToken)
  • 有効期限(UTC)(Expiration)

が含まれます。

認証情報の有効期間を指定するには --duration-seconds(単位は秒) を引数で渡します。デフォルトの有効期間は 12 時間です。

MFA が有効な認証情報を発行

MFA を利用するには

  • --serial-number : デバイスのシリアルナンバー(例 GAHT12345678) または 仮想デバイスの ARN(例 arn:aws:iam::123456789012:mfa/user)
  • --token-code : デバイスに出力されている6桁の数字

を引数で渡します。

$ aws sts get-session-token \
  --serial-number GAHT12345678 \
  --token-code 123456
{
    "Credentials": {
        "AccessKeyId": "ASIA...",
        "SecretAccessKey": "...",
        "SessionToken": "...",
        "Expiration": "2014-05-07T23:47:00Z"
    }
}

一時認証情報の設定

以下の認証情報を環境変数や設定ファイル( ~/.aws/credentials など)で設定します。

  • アクセスキー(AccessKeyId)
  • シークレットアクセスキー(SecretAccessKey)
  • セッショントークン(SessionToken)

環境変数に設定してみます。

Linux

$ export AWS_ACCESS_KEY_ID=example-access-key-as-in-previous-output
$ export AWS_SECRET_ACCESS_KEY=example-secret-access-key-as-in-previous-output
$ export AWS_SESSION_TOKEN=example-session-token-as-in-previous-output

Windows

> set AWS_ACCESS_KEY_ID=example-access-key-as-in-previous-output
> set AWS_SECRET_ACCESS_KEY=example-secret-access-key-as-in-previous-output
> set AWS_SESSION_TOKEN=example-session-Token-as-in-previous-output

一時認証情報で API の実行

認証情報が正しく設定されていれば、特別なオプションは不要です。

$ aws s3 ls
...

認証情報の有効期限を超過すると ExpiredToken エラーが発生します。

$ aws s3 ls

An error occurred (ExpiredToken) when calling the ListBuckets operation:
  The provided token has expired.

ルートユーザーに対しては実行しないこと

AWSアカウントのルートユーザーのアクセスキーが有効になっていると、この API はルートユーザーに対しても実行可能です。

ルートユーザーから派生した一時認証情報はルート権限で実行可能なため、認証情報が漏洩すると一大事となります。そのため、ルートユーザーのトークンの有効期間は IAM ユーザーのトークンに比べてはるかに短くなっています。

有効期限 ルートユーザー IAMユーザー
最小 15分(900秒) 15分(900秒)
最大 1時間(3600秒) 36時間(129600秒)
デフォルト 1時間(3600秒) 12時間(43200秒)

運用している AWS アカウントのルートユーザーがアクセスキーを使用している場合、即座に無効化し、次の IAM ベストプラクティスを熟読してください。

IAM のベストプラクティス - AWS Identity and Access Management

得られた一時的な認証情報に対する注意事項

リクエストに適用される IAM ポリシー

一時的認証情報でリクエストすると、リクエスト時点の IAM ユーザーに設定されている IAM ポリシーが利用されます。 一時的認証情報発行時の IAM ポリシーではありません。

IAM API の制限

リクエストに MFA 情報が含まれていない場合は、IAM API オペレーションを呼び出せません。

$ aws iam list-users

An error occurred (InvalidClientTokenId) when calling the ListUsers operation:
  The security token included in the request is invalid

STS API の制限

AssumeRole または GetCallerIdentity を除く AWS STS API オペレーションを呼び出せません。

$ aws sts get-session-token

An error occurred (AccessDenied) when calling the GetSessionToken operation:
  Cannot call GetSessionToken with session credentials

コンソールSSO未対応

フェデレーションンドポイントを呼び出し、一時的なセキュリティ認証情報を指定しても、サインイントークンを取得できません。

一時認証情報を無効化

何らかの理由により発行された一時認証情報を無効化したい場合、発行元 IAM ユーザーに次の様なインラインポリシーを追加してください。

AWSRevokeOlderSessions

{
  "Version": "2012-10-17",
  "Statement": {
    "Effect": "Deny",
    "Action": "*",
    "Resource": "*",
    "Condition": {
      "DateLessThan": {
        "aws:TokenIssueTime": "2014-05-07T23:47:00Z"
      }
    }
  }
}

このポリシーは aws:TokenIssueTime よりも以前に発行された認証情報を無効化します。日時は UTC で指定します。

参考 AWS IAMの一時クレデンシャルを無効化する | Developers.IO

参考