envrcに1Password-CLIへのアクセスを埋め込んでMFA取得操作にかかる手間を減らしてみる

envrcに1Password-CLIへのアクセスを埋め込んでMFA取得操作にかかる手間を減らしてみる

aws-cliにて一時的なセッションを取得するために必要なMFA Tokenを取得する手間を減らすため、1Password-CLI経由での自動取得を試してみました。
Clock Icon2025.03.05

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から都度取得するのが面倒な場合にはおすすめです。

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.