1Password CLI で Vault とアクセス権のあるユーザーを一覧表示する
こんにちは、kenzauros です。
概要
1Password で認証情報を管理していると、便利なのがカテゴリーごとに分けておける Vault 機能です。
ただ、 Vault 自体が多くなってくると、全体を俯瞰しにくくなり、紐付いているユーザーも把握しにくくなります。 今回は Shell Script で Vault とユーザーの一覧を簡単に取得できるようにしてみました。
1Password からの情報取得には、公式 API か公式から提供されている 1Password の CLI ツールが利用できます。 API でもいいのですが、実行環境の準備も面倒なので今回は CLI ツールを利用しました。
前提
- Ubuntu 20.04 on WSL (Windows 10 Pro)
- 1Password CLI: 1.12.4
- jq: 1.6
1Password の CLI はデータを JSON で返しますので、データ操作のために jq をインストールしておきましょう。
1Password CLI の準備
インストール
CLI ツールを公式の手順にしたがってインストールします。
下記のページから CLI ツールの zip ファイル の URL を取得します。今回は WSL 上の Ubuntu で実行するため、 Linux 386 版を使用します。
適当なディレクトリーで wget
して unzip
し、実行ファイルの op
を /usr/local/bin/
に mv
します。
~$ cd /tmp
/tmp$ wget https://cache.agilebits.com/dist/1P/op/pkg/v1.12.4/op_linux_386_v1.12.4.zip 👈 URL は最新のものに変更してください
/tmp$ unzip op_linux_386_v1.12.4.zip
/tmp$ ll op
-rwxr-xr-x 1 hoge hoge 8544256 Jan 15 06:33 op*
/tmp$ sudo mv op /usr/local/bin/
/tmp$ op --version
1.12.4
op --version
でバージョンが確認できれば OK です。
サインイン
まず op signin
コマンドでサインイン します。
ここでは 1Password のアカウントが EXAMPLE
、ユーザー名が user@example.com
とします。
$ op signin EXAMPLE.1password.com user@example.com
Enter the Secret Key for user@example.com at EXAMPLE.1password.com: XX-XXXXXX-XXXXXX-XXXXX-XXXXX-XXXXX-XXXXX
Enter the password for user@example.com at EXAMPLE.1password.com:
# This command is meant to be used with your shell's eval function.
# Run 'eval $(op signin EXAMPLE)' to sign in to your 1Password account.
# Use the --raw flag to only output the session token.
Secret Key と Password は 1Password の自身のものを使用します。メッセージに表示されているように eval
します。
$ eval $(op signin EXAMPLE)
Enter the password for user@example.com at EXAMPLE.1password.com:
ちなみにセッション時間が短く、しばらくすると再認証を求められますので、 再認証はまた eval $(op signin EXAMPLE)
を実行しましょう。
Vault とユーザーのリストアップ スクリプト
スクリプトを実行してみる
好きなディレクトリーに list-vaults.sh
(名前はご自由に) を作成し、下記のような内容で保存します。
#!/bin/bash
ORG_IFS=$IFS
IFS=$'\n'
vaults=(`op list vaults | jq -r -S '.[] | .name' | sort`)
for vault in "${vaults[@]}"; do
detail=`op get vault $vault | jq -r '.name+": "+.desc'`
echo "- $detail"
users=(`op list users --vault $vault | jq -r -S '.[] | select(.state == "A") | .name' | sort`)
for user in "${users[@]}"; do
echo " - $user"
done
done
IFS=$ORG_IFS
さっそく、実行してみましょう。
サインインが終わっている状態なら、下記のように Vault とその Vault にアクセスできるユーザーの一覧が順番に表示されます。
~/$ ./list-vaults.sh
- AWS: AWS 関連
- Kenji YAMADA
- Norikazu MASUDA
- Azure: Microsoft Azure
- Kenji YAMADA
- In House: 社内関連
- Kenji YAMADA
- Kiyoshi KOYAMA
- Norikazu MASUDA
- Soseki NATSUME
- Osamu DAZAI
~以下略~
毎回リクエストが走るので結構時間がかかります。
今回はアクティブなユーザー (.state == "A"
) のみ取得していますが、絞らなければアカウントを停止しているユーザーも表示されます。
ポイント
基本的には下記の 3 コマンドをつなげてリスト形式で echo
しているだけです。
Vault 一覧の取得
Vault 一覧は op list vaults
で取得します。
これで得られる JSON は下記のようなシンプルな内容です。 op list vaults | jq '.'
で表示してみるとわかりやすいでしょう。
[
{
"uuid": "ksbrv6k3lxoiquv3prjiil5644",
"name": "AWS"
},
{
"uuid": "qmqkrqrkft7d2g745b47ttuoq",
"name": "Azure"
},
{
"uuid": "qmqkswskft7d2garpeb47ttuoq",
"name": "In House"
}
]
これを jq で分解して、各 Vault の name
部分のみを取り出します。 name
を取り出すのは、後続のコマンドでこの Vault 名を使用するためです。
下記のようにすれば Vault 名の一覧が出力されるはずです。
$ op list vaults | jq -r -S '.[] | .name' | sort
AWS
Azure
In House
Vault 詳細の取得
今回は Vault の説明を取得したいので、さらに Vault の詳細を調べます。 Vault の詳細は op get vault <Vault名>
で取得します。
得られる JSON は下記のようになります。
$ op get vault "Azure" | jq '.'
{
"uuid": "qmqkrqrkft7d2g745b47ttuoq",
"name": "Azure",
"type": "U",
"desc": "Azure 関連",
"avatar": "qmqkswskft7d2garpeb47ttuoq.png"
}
今回は name
と desc
が取り出せればよいので下記のようにします。
$ op get vault "Azure" | jq -r '.name+": "+.desc'
Azure: Azure 関連
jq の '.name+": "+.desc'
で name
と desc
を結合して出力しているだけです。
Vault に紐付いたユーザー一覧の取得
Vault に紐付いたユーザーは op list users --vault <Vault名>
で取得します。得られる JSON は下記のようになります。
$ op list users --vault "Azure" | jq '.'
[
{
"uuid": "OUX2JSFNPVHUTF8SSRRIPH4CWU",
"firstName": "Kenji",
"lastName": "YAMADA",
"name": "Kenji YAMADA",
"email": "yamada@example.com",
"avatar": "",
"state": "A",
"type": "R"
},
{
"uuid": "M2OTSDZZRTG7VJXVYZJAWCTCFA",
"firstName": "Inai",
"lastName": "HITO",
"name": "Inai HITO",
"email": "unknown@example.com",
"avatar": "gpn5oidwk5amzg6oyqzgzqy75u.png",
"state": "S",
"type": "R"
}
]
ここでアクティブなユーザーは state
が A
(Active)、停止されているユーザーは S
(Suspend) になっています。
そこで state
が A
のみのユーザーをフィルタリングしてから name
のみを取り出します。
$ op list users --vault "Azure" | jq -r -S '.[] | select(.state == "A") | .name' | sort
Kenji YAMADA
まとめ
1Password が公式に提供している CLI ツールを使って、 Vault やユーザーの一覧を取得する方法を紹介しました。
本当はアクセス権 (Read only/Edit) も取得できるとうれしいのですが、リファレンスには記述されておらず、データにもそれらしきものが含まれていないため、難しそうです。
API には 1Password Connect API reference にオブジェクトの詳しいリファレンスがあるものの、 CLI で得られるオブジェクトの詳しい情報はなさそうでした😭
どなたかのお役に立てれば幸いです。