背景
AWS CLIでもMFAでセキュアに利用したいする場合、取得したトークンをCLIの情報として設定する必要があるが、これを手作業でやるととても大変なので自動的にセットしてくれるシェルスクリプトを作成した。
公式には以下の手順で設定する。
https://aws.amazon.com/jp/premiumsupport/knowledge-center/authenticate-mfa-cli/
必要なもの
AWS CLI (https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-chap-install.html)
jq (https://stedolan.github.io/jq/download/)
IAMのクレデンシャル(aws_accesskey_id, aws_secret_access_key)
今回の環境
Mac
AWS CLI (aws-cli/2.0.42 Python/3.7.3 Linux/4.19.76-linuxkit docker/x86_64.amzn.2)
jq (1.6)
使用するIAMユーザは__仮想デバイス__でのMFA設定をしておく (https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_credentials_mfa_enable_virtual.html)
やること
通常使うプロファイルとクレデンシャルを登録しておく
今回は foo というプロファイル名で登録しておくとする。
[profile foo]
output=json
region=ap-northeast-1
[foo]
aws_access_key_id = XXXXXXXXXXXXXXXXXXXXXXXXx
aws_secret_access_key = zzzzzzzzzzzzzzzzzzzzzzzzzzzzz
MFA認証後に使うプロファイルを登録しておく
今回は foo-mfa というプロファイル名で登録しておくとする。
[profile foo-mfa]
output=json
region=ap-northeast-1
MFAのクレデンシャルを自動セットしてくれるシェルスクリプト
#!/bin/bash
# MFAクレデンシャル情報取得
SESSION_JSON=$(aws --profile $1 sts get-session-token --serial-number arn:aws:iam::$2:mfa/$3 --token-code $4 --output json)
if [ $? -ne 0 ]; then
exit 1
fi
# jqで必要な項目を変数にセットする
MFA_ACCESS_KEY=$(echo $SESSION_JSON | jq -r '.Credentials.AccessKeyId')
MFA_SECRET_ACCESS_KEY=$(echo $SESSION_JSON | jq -r '.Credentials.SecretAccessKey')
MFA_SESSION_TOKEN=$(echo $SESSION_JSON | jq -r '.Credentials.SessionToken')
MFA_EXPIRATION=$(echo $SESSION_JSON | jq -r '.Credentials.Expiration')
# MFA用クレデンシャルをセットするプロファイル名
MFA_PROFILE_NAME=$1-mfa
# MFA用プロファイルにクレデンシャルをセット
aws --profile $MFA_PROFILE_NAME configure set aws_access_key_id $MFA_ACCESS_KEY
aws --profile $MFA_PROFILE_NAME configure set aws_secret_access_key $MFA_SECRET_ACCESS_KEY
aws --profile $MFA_PROFILE_NAME configure set aws_session_token $MFA_SESSION_TOKEN
echo "New credentials have been set successfully. (profile: $MFA_PROFILE_NAME, expiration: $MFA_EXPIRATION)"
第一引数: プロファイル名(今回はfoo)
第二引数: AWSアカウントID
第三引数: IAMユーザID
第四引数: MFAトークン(MFAアプリなどで発行された6桁の数字)
説明
sts get-session-token
でMFAのクレデンシャル情報をJSONで取得する。
この結果を jq コマンドで必要な項目のみ取得する。
configure set
で credentialファイルにセットする。
実行してみる
AWSアカウントIDが 123456789012、 IAMユーザが myid 、仮装デバイスで発行されたトークンが 123456 の場合
$ ./aws_mfa_login.sh foo 123456789012 myid 123456
New credentials have been set successfully. (profile: foo-mfa, expiration: 2020-08-02T20:20:52+00:00)
この時点で、credentialファイルに以下の行が追加されている。
[foo-mfa]
aws_access_key_id = XXXXXXXXXXXXXXXXXXXXXXXXx
aws_secret_access_key = zzzzzzzzzzzzzzzzzzzzzzzzzzzzz
aws_session_token = ssssssssssssssssssssssssssssssssssssssssssssss
これ以降のコマンド実行には --profile に foo-mfa を指定する。
s3バケットリストを取得する場合は以下のように実行する。
$ aws --profile foo-mfa s3 ls
:
:
補足
私は同時に複数のAWSアカウントを取り扱うため、プロファイルは環境変数ではなく--profileオプションでコマンドに明示的に指定するようにしています。