1 Password ワンタイムパスワードを使った Assume Role をCLIだけで完結するようにしてみた

MFA が設定されている IAM Role に assume role する際に、ワンタイムパスワードを毎回入力するのは面倒ですよね。以下のブログを参考に、 assume role する際に 1 Password からワンタイムパスワードを取得し、assume role コマンドのパラメーターに設定するシェルを作成しました
2020.01.31

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

西田@大阪です

MFA が設定されている IAM Role に assume role する際に、ワンタイムパスワードを毎回入力するのは面倒ですよね。

以下のブログを参考に、 assume role する際に 1 Password からワンタイムパスワードを取得し、assume role コマンドのパラメーターに設定するシェルを作成しました

1Password CLIを使ってワンタイムパスワードをターミナル上に表示する

Assume Roleをいい感じにするスクリプトを書いた

上記のブログにあります、以下が前提条件となります

  • 1Password の CLI Toolがインストールされている
  • fzf がインストールされている

シェルスクリプト

ベースは上記で紹介されたシェルスクリプトをもとに以下の変更をさせていただいてます

  • 1 Password CLI で signin を行います。signinの実行結果にセッションのトークンが含まれるので evalすると環境変数にexportされるため、しばらくパスワードを入力しなくてもいいようにしています
  • 1 Passwrod CLI でワンタイムパスワードを取得し、それを assume-role のパラメーターに指定しています
#!/bin/bash

SERIAL_NUMBER='arn:aws:iam::${YOUR_AWS_COUNT_ID}:mfa/${YOUR_NAME}'
SOURCE_PROFILE='${YOUR_SOURCE_AWS_PROFILE}'
DATE=`date +%s`
DOMAIN='your.1Password.domain'
ITEM_NAME='YOUR 1Password Item Name'

PROFILE=`grep -oP '\[profile *\K[-\w]+' ~/.aws/config  | fzf`

if [ "$PROFILE" = "" ]; then
  return 1
fi

TOKEN_CODE=`op get totp '${ITEM_NAME}'`

if [ $? != 0 ]; then
  eval $(op signin ${DOMAIN})
  TOKEN_CODE=`op get totp '${ITEM_NAME}'`
fi

ROLE_ARN=`aws configure get role_arn --profile $PROFILE`

OUTPUT=`aws sts assume-role \
  --role-arn          ${ROLE_ARN} \
  --serial-number     ${SERIAL_NUMBER} \
  --role-session-name ${DATE}-session \
  --profile           ${SOURCE_PROFILE} \
  --duration-second   3600 \
  --token-code        ${TOKEN_CODE}
`
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`

echo ""

筆者はfishを使っているので fishから bass を使って上記bashを呼べる設定をしてつかっております

参考: edc/bass: Make Bash utilities usable in Fish shell

config.fish

alias assume='bass source ~/bin/assumer.sh'

動作イメージ

コマンドを実行すると以下のように 1Password のパスワードを聞かれるので、パスワードを入力すれば assume role が完了します

さいごに

ちょっとした小ネタですが、この記事が誰かの参考になれば幸いです