- Published on
AWS CLIの認証情報だけでコンソールにログインするマジックリンクを作る
パスワードレス認証の1種であるマジックリンクっていいですよね。ユーザーは認証の手間なく、かつID・パスワード管理や漏洩のリスクの無いログイン基盤を提供できます。
AWSでも似たことができないかと思い、色々漁ってみたネタ記事になります。フェデレーテッドログインで近いことができそうなので試してみました。スクリプトはgithubに上げましたが、肝は以下の部分です。
結論:コマンドはこちら
USERNAME=$(aws sts get-caller-identity --output text --query 'Arn' | awk -F/ '{print $NF}')
TEMP_CRED=$(aws sts get-federation-token \
--name $USERNAME$(date +%s) \
--policy '{"Statement": [{"Effect": "Allow", "Action": "*", "Resource": "*"}]}' \
--output text \
--query 'Credentials.[AccessKeyId,SecretAccessKey,SessionToken]' \
| sed $'s/\t/ /g')
SIGNIN_TOKEN=$(curl -sG \
--data-urlencode "Action=getSigninToken" \
--data-urlencode "SessionDuration=1800" \
--data-urlencode "Session={\"sessionId\":\"$(echo $TEMP_CRED | cut -d ' ' -f1)\",\"sessionKey\":\"$(echo $TEMP_CRED | cut -d ' ' -f2)\",\"sessionToken\":\"$(echo $TEMP_CRED | cut -d ' ' -f3)\"}" \
https://signin.aws.amazon.com/federation | jq -r .SigninToken)
CONSOLE_URL="https://console.aws.amazon.com/"
LOGIN_URL="https://signin.aws.amazon.com/federation?Action=login&Destination=${CONSOLE_URL}&SigninToken=${SIGNIN_TOKEN}"
echo $LOGIN_URL
AWS CLIが有効なシェル上でスクリプトを実行すると、最後に長いリンクが吐き出されます。これでブラウザを叩くと、ログインを完了してくれるマジックリンクになります。
複数のAWSアカウントを日頃から細かく分けて作業している方なんかは、AWS_PROFILEを引数にショートカットを複数登録しておくとGUIに入るのが楽になるかもしれません。最後にopen -a 'Google Chrome' $LOGIN_URL
と足せばchromeが自動で開いてくれるようになります。
また、ログインは発行元のIAMユーザーではなくフェデレーテッドユーザーになり、IAMまわりに制約もでます。他の使途も提示こそしましたが、マジックリンクの実現という観点ではネタの域を出ることは難しそうでした。
個人的な学びはSSO系のログイン基盤の実装方法を知れたことと、aws-cliの--output text --query
はカンマ区切りでキーを複数指定できて、タブ区切り出力できること、そしてターミナル上だとタブ区切りなのにシェル上の戻り値だとスペースに変換されるbashの挙動でした(今更すぎる)
参考文献
- https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_providers_enable-console-custom-url.html
- https://dev.classmethod.jp/articles/aws-management-console-login-without-iam-password/
- https://www.simpline.co.jp/recruit/blog/tech_ty/bash%E3%81%A7federated%E3%83%A6%E3%83%BC%E3%82%B6%E7%94%A8aws%E3%82%B3%E3%83%B3%E3%82%BD%E3%83%BC%E3%83%AB%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9url%E3%82%92%E7%94%9F%E6%88%90/
- https://stackoverflow.com/questions/296536/how-to-urlencode-data-for-curl-command