3
Help us understand the problem. What are the problem?

AWSの一時クレデンシャルを使ってAWSコンソールにアクセスする方法

はじめに

AWSへのアクセス管理のためにAWS SSOを導入している場合など、IAMロールベースで複数のAWSアカウントを運用するシチュエーションでは、スイッチロールの起点となるAWSアカウントをあまり増やしたくないなどの課題から、ロール連鎖の形で権限を振り出す運用方法を取りたい場合があります。
しかし、ロール連鎖で得た権限を扱う際の実運用上の大きな問題として、AWSコンソールがロール連鎖のスイッチロールに対応していない、という点があります。
APIベースではロール連鎖に対応しているので、AWS CLIなどで一時クレデンシャルベースでAssumeRoleしていけば、最終的に目的のIAMロールの一時クレデンシャルを得ることは可能ではありますが、AWSに対する操作を行ううえで、すべてCLIなどで賄うのは大分つらいものがあります。

幸いAWSは、一時クレデンシャルを元に、そのクレデンシャルの権限でコンソール操作を行えるAWSコンソールのログイン用URLを生成するための仕組み及び利用手順をドキュメントで公開しています。
が、その利用手順の中には、エンドポイントにリクエストを送って受け取った値の中身を再度エンドポイントにリクエストする、であったり、エンドポイントのURLに付けるパラメータをURLエンコードしておく必要があったり、と地味に面倒な部分があります。

本記事は、その面倒さをサクっと軽減するシェルスクリプトを書いたので、そのシェルの紹介をするものになります。
シェルの機能としては、「一時クレデンシャルを渡すとAWSコンソールのログイン用URLを返してくれる」というものになります。
ブラウザで、生成されたログイン用URLへアクセスすれば、そのままAWSコンソールへアクセスでき、権限を得た状態でAWSコンソール上での操作を行うことができます。

作ったものと解説

作成したシェルスクリプトは以下になります。 (nkfjqなどが必要です)

シェルスクリプト
#!/bin/bash

function urlencode {
  echo "$1" | nkf -WwMQ | sed 's/=$//g' | tr = % | tr -d '\n'
}

echo "access key IDを入力してください"
read sessionId
echo "secret access keyを入力してください"
read sessionKey
echo "sessionTokenを入力してください"
read sessionToken

encodedSessionId=$(urlencode $sessionId)
encodedSessionKey=$(urlencode $sessionKey)
encodedSessionToken=$(urlencode $sessionToken)

SigninToken=$(curl "https://signin.aws.amazon.com/federation?Action=getSigninToken&Session=%7B%22sessionId%22%3A+%22${encodedSessionId}%22%2C+%22sessionKey%22%3A+%22${encodedSessionKey}%22%2C+%22sessionToken%22%3A+%22${encodedSessionToken}%22%7D" | jq .SigninToken -r)

echo "https://signin.aws.amazon.com/federation?Action=login&Issuer=https%3A%2F%2Floginurlgeneratepage.yourcompany.com&Destination=https%3A%2F%2Fconsole.aws.amazon.com%2F&SigninToken=${SigninToken}"

流れとしては、まず一時クレデンシャルをユーザーから対話的に受け取ります。
次に、一時クレデンシャルをAWSフェデレーションエンドポイントにgetSigninTokenアクションを指定してリクエストすることで、レスポンスとしてSigninTokenを受け取ります。
最後に、受け取ったSigninTokenを元にAWSコンソールにアクセスするURLを組み立て、echoで標準出力する、というものになっています。

フェデレーションエンドポイントに引き渡すパラメータはURLエンコードが必要なので、参考URLに載せたfunctionを流用させていただいています。

また、最終的なログイン用URLのパラメータについて。
Destinationは認証情報の受け渡し先を示すパラメータで、つまりAWSコンソールへのサインインである、ということを示すためのものなので、URLエンコードされたAWSコンソールのURLを渡せばよい、ということになります。
Issuerは認証情報の発行者を示すパラメータです。AWSのドキュメントにもthe form-urlencoded URL for your internal sign-in pageとあるように、このAWSコンソールログイン用URLの生成をWebベースのアプリケーションの機能として提供するような場合に、そのアプリケーションのURLを指定しておけるものです。
(今回のように、個々のユーザーの手元においてシェルベースなどでURL生成を行う場合は、Issuerとしては任意の値を指定すればよいです。)
IssuerにURLエンコードされたURL文字列を指定することで、例えばセッション有効期限切れページ内に、以下画像のようにリンクが表示されるようになります。
スクリーンショット 2022-08-04 205923.png

参考URL

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Sign upLogin
3
Help us understand the problem. What are the problem?