
envrcに1Password-CLIへのアクセスを埋め込んでMFA取得操作にかかる手間を減らしてみる
aws-cliにて一時的なアクセスキーを取得するためにaws sts get-session-token
を実行することがあります。
OUTPUT=$(aws sts get-session-token \
--serial-number arn:aws:iam::0000000000000:mfa/xxxxxxxxxxxx \
--token-code 000000 \
--profile mfa)
export AWS_ACCESS_KEY_ID=$(echo $OUTPUT | jq -r .Credentials.AccessKeyId)
export AWS_SECRET_ACCESS_KEY=$(echo $OUTPUT | jq -r .Credentials.SecretAccessKey)
export AWS_SESSION_TOKEN=$(echo $OUTPUT | jq -r .Credentials.SessionToken)
この操作にて手間となるのはtoken-code
の取得です。コマンド内を書き換えるのではなく引数として渡す手もありますが、それでもcodeの取得操作が発生することには変わりません。
1Password-CLIでVaultからデータは取れるものの、MFA Tokenについてはどんな形になっていたか未確認だったため次いでに試してみました。
1Password-CLI経由でMFA Tokenを取得する
手続きは以下の通り。
% op item get XXXXXX
Fields:
password: [use 'op item get xxxxxxxxxxxxxxxxxxxxxxx --reveal' to reveal]
username: cm-xxxxx.xxxxx
: 000000
account: classmethod
ターミナル上だとこのままでは使いづらいためフォーマットを変更します。
% op item get XXXXXX --format json
{
....
"fields": [
{
"id": "username",
"type": "STRING",
.....
},
{
"id": "TOTP_XXXXXXXXXXXXXXX",
"section": {
"id": "Section_XXXXXXXXXXXXXXX"
},
"type": "OTP",
"value": ""
"totp": "0000",
"reference": ""
},
....
],
....
}
MFA Tokenを取得する場合、Vault上のアイテムはユーザ名・パスワード等を配列として保持しているため、配列位置に左右されずに取得できることが重要になります。totp以外の項目は.totp
のプロパティを所持していないため、select
での絞り込みへ用います。
% op item get XXXXXX --format json | jq -r '.fields[] | select(.totp) | .totp'
000000
.envrcでよみこむ
.envrcに追記します
export TOKEN_CODE=`op item get XXXXXX --format json | jq -r '.fields[] | select(.totp) | .totp'`
一時セッションを取得する処理も、token-code部分を差し替えます。
OUTPUT=$(aws sts get-session-token \
--serial-number arn:aws:iam::0000000000000:mfa/xxxxxxxxxxxx \
--token-code $TOKEN_CODE \
--profile mfa)
export AWS_ACCESS_KEY_ID=$(echo $OUTPUT | jq -r .Credentials.AccessKeyId)
export AWS_SECRET_ACCESS_KEY=$(echo $OUTPUT | jq -r .Credentials.SecretAccessKey)
export AWS_SESSION_TOKEN=$(echo $OUTPUT | jq -r .Credentials.SessionToken)
これでディレクトリへ移動した時点でMFA Tokenが反映されるようになりました。
あとがき
MFA Tokenを毎回貼り付けるのがやや手間でしたが、必要に応じてディレクトリの移動を行ったり等で更新が可能になりました。
MFA Tokenを1PasswordのUIから都度取得するのが面倒な場合にはおすすめです。