op(1password CLI tool)のトークンをキャッシュする

opは1PasswordのCLIツールで簡単なセットアップでCLIから1Passwordの機能を利用可能です。opで各種の操作を行うにはsigninコマンドで取得できるトークンが必要ですがこのトークン自体を管理する機能はopにはありません。 そこで取得したトークンをキャッシュするラッパーツールを作成してみました。
2021.06.29

はじめに

opは1PasswordのCLIツールで簡単なセットアップでCLIから1Passwordの機能を利用可能です。opで各種の操作を行うにはsignin コマンドで取得できるトークンが必要ですがこのトークン自体を管理する機能はopにはありません。そこで取得したトークンをキャッシュするラッパーツールを作成してみました。

opc

作成したツール(opc)のコードはGitHubで公開しています。

使い方は以下の通りです。ACCOUNT にはop signin listで表示されるアカウント名を指定します。

USAGE:
    opc [FLAGS] <ACCOUNT>

FLAGS:
    -h, --help       Prints help information
        --refresh    force refresh token cache
    -V, --version    Prints version information

ARGS:
    <ACCOUNT>    Name of account (see output of `op signin list`)

基本的な使用例と挙動

opcを実行すると1Passwordのマスターパスワードの入力を求められます。ここで入力したパスワードはopへそのままパイプされます。パスワードの検証ができたらopから出力されたトークンをそのまま出力します。

> opc my_account
Enter the password for your_name@example.com at my.1password.com:
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX <- トークン

opcを実行すると$HOME/.config/opc/cache.tomlにトークンがキャッシュされます。現状トークンは平文で保存されるのでファイルの扱いには注意してください。

>ls -l ~/.config/opc
Permissions Size User            Date Modified Name
.rw-------    78 sasaki.kazuhiro 28 6 18:34    cache.toml

キャッシュのTTLは30分でこの期間内に再度opcを実行した場合はキャッシュからトークンを読んで表示します。

応用例

OTPの取得

opと組み合わせて使うことでOTPをCLIで取得できます。以下の例では1Passwordのエントリentry_name_of_1passwordに保存されているOTPを取得します。

#!/bin/bash
OP_TOKEN=`opc your_account`
op get totp --session "$OP_TOKEN" "entry_name_of_1password" | tr -d '\n'

aws-vaultと組み合わせてマネジメントコンソールへログインする

OTPの取得スクリプトをaws-vaultと組み合わせてOTPが必要なプロファイルでマネジメントコンソールへのログインを行うこともできます。

#!/bin/bash
if [ $# -ne 1 ]; then
  echo "no profile specified" 1>&2
  exit 1
fi
aws-vault login -t `get-otp` "$1"

まとめ

opのトークンをキャッシュする小さなツールを作ってみました。