はじめに
AWSへのアクセス管理のためにAWS SSOを導入している場合など、IAMロールベースで複数のAWSアカウントを運用するシチュエーションでは、スイッチロールの起点となるAWSアカウントをあまり増やしたくないなどの課題から、ロール連鎖の形で権限を振り出す運用方法を取りたい場合があります。
しかし、ロール連鎖で得た権限を扱う際の実運用上の大きな問題として、AWSコンソールがロール連鎖のスイッチロールに対応していない、という点があります。
APIベースではロール連鎖に対応しているので、AWS CLIなどで一時クレデンシャルベースでAssumeRoleしていけば、最終的に目的のIAMロールの一時クレデンシャルを得ることは可能ではありますが、AWSに対する操作を行ううえで、すべてCLIなどで賄うのは大分つらいものがあります。
幸いAWSは、一時クレデンシャルを元に、そのクレデンシャルの権限でコンソール操作を行えるAWSコンソールのログイン用URLを生成するための仕組み及び利用手順をドキュメントで公開しています。
が、その利用手順の中には、エンドポイントにリクエストを送って受け取った値の中身を再度エンドポイントにリクエストする、であったり、エンドポイントのURLに付けるパラメータをURLエンコードしておく必要があったり、と地味に面倒な部分があります。
本記事は、その面倒さをサクっと軽減するシェルスクリプトを書いたので、そのシェルの紹介をするものになります。
シェルの機能としては、「一時クレデンシャルを渡すとAWSコンソールのログイン用URLを返してくれる」というものになります。
ブラウザで、生成されたログイン用URLへアクセスすれば、そのままAWSコンソールへアクセスでき、権限を得た状態でAWSコンソール上での操作を行うことができます。
作ったものと解説
作成したシェルスクリプトは以下になります。 (nkf
やjq
などが必要です)
シェルスクリプト
#!/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文字列を指定することで、例えばセッション有効期限切れページ内に、以下画像のようにリンクが表示されるようになります。
参考URL