1Password CLIでのTouch ID認証によるOTP取得をシェルスクリプトに組み込んでみた

2022.03.17

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは、CX事業本部 IoT事業部の若槻です。

前回のエントリでは、1Password CLI(opコマンド)でTouch IDを使用してOTPの取得を行ってみました。

今回は、1Password CLIでのTouch ID認証によるOTP取得をシェルスクリプトに組み込んでみました。

前提

前回のエントリの内容が実施済みである前提とします。

やってみた

シェルスクリプト

op item get <item id> --otpによりAWSのOTP(MFA Code)を1Passwordから取得するようにしています。

script.sh

SESSION_DURATION_SECONDS=$((60*60*12))

# 1Password CLIによるAWSのOTPの取得
mfa_code=$(op item get ${AWS_OP_ITEM_ID} --otp)

# OTPを使用してAssumeRoleによる一時トークンの取得
AWS_STS_CREDENTIALS=`aws sts assume-role \
  --profile default \
  --role-arn $(aws configure get ${AWS_PROFILE}.role_arn) \
  --role-session-name ${AWS_PROFILE}-session \
  --serial-number $(aws configure get ${AWS_PROFILE}.mfa_serial) \
  --duration-seconds ${SESSION_DURATION_SECONDS} \
  --token-code ${mfa_code}`
export AWS_ACCESS_KEY_ID=`echo "${AWS_STS_CREDENTIALS}" | jq -r '.Credentials.AccessKeyId'`
export AWS_SECRET_ACCESS_KEY=`echo "${AWS_STS_CREDENTIALS}" | jq -r '.Credentials.SecretAccessKey'`
export AWS_SESSION_TOKEN=`echo "${AWS_STS_CREDENTIALS}" | jq -r '.Credentials.SessionToken'`

# 何らかのAWS CLIコマンドを実行
echo $(aws s3api list-buckets --query "Buckets[].CreationDate") | jq .

シェルスクリプトのファイルに実行可能権限を付与します。

$ chmod +x script.sh

使ってみる

必要な環境変数を設定します。アイテムIDはop item listで確認可能です。

$ export AWS_OP_ITEM_ID=<1Password上のAWSログイン情報のアイテムのID>
$ export AWS_PROFILE=<AWSプロファイル名>

シェルスクリプトを実行します。

$ ./script.sh

するとTouch IDによる認証が求められるので、認証します。

認証が正常に完了すれば、スクリプトの続きが実行されます。AWSの認証が行えたのでAWS CLIコマンドが実行できています。

$ ./script.sh
[
  "2022-02-28T15:46:34+00:00",
  "2022-02-20T16:27:56+00:00",
  "2021-05-22T09:33:12+00:00",
  "2021-04-19T12:40:08+00:00"
]

ちなみに既に認証が行われておりセッションが継続していれば、Touch IDなしでopコマンドを実行可能です。

おわりに

1Password CLIでのTouch ID認証によるOTP取得をシェルスクリプトに組み込んでみました。

今までは同様のシェルスクリプトではread mfa_codeと記述してスクリプト実行中に対話式でOTPを入力するようにしていましたが、今回のopコマンドの組み込みにより指をポチッとやるだけで良くなりました。

参考

以上