1Password Secrets Automationを情シスメンバーの助力を得つつ試してみた

1Passwordからリリースされた新機能、Secrets Automationを試してみました。設定時の権限等で少々手間取るかもしれませんが、プロダクトに1Password.com内の情報を用いる際にはとても便利なサービスです。
2021.05.11

1Password.comからSecrets Automationという新機能が公開されました。AWSのEC2インスタンス等から1Password専用サーバ接続を経由して1Password.com上のデータを読み取ったり、生成したパスワード等の秘匿データを直接1Password.com上に保存することが可能になります。

概要については大まかに把握したものの、実際の利用にはTeams及びBusinessプランが必須で、個人利用のアカウントでは試用不可能でした。やむなく社内アカウントにて試みたものの、設定時に管理者権限が必要でした。弊社情シス担当者の協力を得て、実際に1Password.comからのデータ取得までを試してみました。

1password-credentials.jsonとaccess-tokenを取得する

現時点で取得には管理者権限が必要ですが、利用自体は管理者でなくても可能です。

取得にあたっては、1Password.com右側のメニューから「Integrations」を選択します。このメニューは管理者のみ選択可能です。

手続きとしては以下の手順で行います。

  1. 環境を設定する
  2. access-tokenを作成する
  3. Connect Serverをデプロイする

環境を設定する

項目 説明
Environment Name 環境名を指定します。後から変更可能です。
Vaults 取得したいデータのあるVaultを選択します。管理者が所属していないVaultも選択可能です。

Vaultsについては、読み書きの権限指定が可能です。今回は読み取り専用にしています。

access-tokenを作成する

項目 説明
Token Name トークン名を指定します。トークンは複数作成可能なため、ユニークなものにしておきます。
Expires After 有効期限を指定します。今回は期限無しとしています。

Connect Serverをデプロイする

項目 説明
Credentials File Connect ServerDeploy時に必要です。
Access Token アプリケーションからConnect Serverへ接続する際に必要です。

それぞれ生成後に直接1Passwordに保存可能で、ダウンロードせずに1Password上にて管理者権限を持たないユーザにコピーも可能です。今回作業するにあたっては、1Passwordに保存した後に1Password上でコピーする手続きをとっていただきました。

ここまで手続きを終えることで、以下の設定が作成されます。

Access Tokenについては以下のドロップダウンメニューにて、リネーム及び再生成が可能です。

Vaultsについては以下の通りに権限変更が可能です。

1Password.comからデータを取得してみる

公式ガイドではDockerとKubernetesが例に上がっています。今回はDockerにて。

公式提供のサンプルを用います。

version: "3.4"

services:
  op-connect-api:
    image: 1password/connect-api:latest
    ports:
      - "8080:8080"
    volumes:
      - "./1password-credentials.json:/home/opuser/.op/1password-credentials.json"
      - "data:/home/opuser/.op/data"
  op-connect-sync:
    image: 1password/connect-sync:latest
    ports:
      - "8081:8080"
    volumes:
      - "./1password-credentials.json:/home/opuser/.op/1password-credentials.json"
      - "data:/home/opuser/.op/data"

volumes:
  data:

docker-compose.yaml自体は特に弄る必要がありません。先程生成した1password-credentials.jsondocker-compose.yamlと同じディレクトリに置きます。

次にConnectServerを立ち上げます。

% docker-compose up
Starting 1password_deploy_op-connect-sync_1 ... done
Starting 1password_deploy_op-connect-api_1  ... done
Attaching to 1password_deploy_op-connect-sync_1, 1password_deploy_op-connect-api_1
op-connect-sync_1  | {"log_message":"(I) starting 1Password Connect Sync ...","timestamp":"2021-05-11T08:18:49.7666643Z","level":3}
op-connect-sync_1  | {"log_message":"(I) serving on :8080","timestamp":"2021-05-11T08:18:49.7699796Z","level":3}
op-connect-sync_1  | {"log_message":"(I) [discovery-local] starting discovery, advertising endpoint 8080 /meta/message","timestamp":"2021-05-11T08:18:49.7666643Z","level":3}
op-connect-sync_1  | {"log_message":"(I) database initialization complete","timestamp":"2021-05-11T08:18:49.7783592Z","level":3}
op-connect-sync_1  | {"log_message":"(I) ### syncer credentials bootstrap ### ","timestamp":"2021-05-11T08:18:49.7790249Z","level":3}
op-connect-api_1   | {"log_message":"(I) [discovery-local] starting discovery, advertising endpoint 8080 /meta/message","timestamp":"2021-05-11T08:18:49.7901087Z","level":3}
op-connect-api_1   | {"log_message":"(I) starting 1Password Connect API ...","timestamp":"2021-05-11T08:18:49.7902617Z","level":3}
op-connect-api_1   | {"log_message":"(I) serving on :8080","timestamp":"2021-05-11T08:18:49.7908552Z","level":3}

APIを利用する

ローカル上のConnect Serverの受付が可能となりましたが、単にアクセスしても蹴られます。ヘッダにaccess-tokenの設定が必要となりますが、手間を省くためPythonのライブラリを用います。

READMEに従って、access-tokenを環境設定に入れておきます。

% direnv edit .
export OP_CONNECT_TOKEN=XXXXXXXXXXXXXX.......
% direnv allow .

とても長いトークンですが、手動で改行はしないでください。次に1Password REST APIリクエスト用のモジュールをインストールします。

% pipenv install onepasswordconnectsdk
Installing onepasswordconnectsdk...
Adding onepasswordconnectsdk to Pipfile's [packages]...
✔ Installation Succeeded
Pipfile.lock not found, creating...
Locking [dev-packages] dependencies...
Locking [packages] dependencies...
Building requirements...
Resolving dependencies...
✔ Success!
Updated Pipfile.lock (7b65ef)!
Installing dependencies from Pipfile.lock (7b65ef)...
  🐍   ▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉ 0/0 — 00:00:00
To activate this project's virtualenv, run pipenv shell.
Alternatively, run a command inside the virtualenv with pipenv run.

最後にリクエストしてみます。今回のトークン発行を行うにあたって、読み込み専用の権限となっているためGET系の処理にします。

% vim run.py
from onepasswordconnectsdk.client import (
    Client,
    new_client_from_environment
)

# creating client using OP_CONNECT_TOKEN environment variable
client: Client = new_client_from_environment(
     "http://localhost:8080")
vaults = client.get_vaults()
for vault in vaults:
    print(vault)
% pipenv run python run.py
Loading .env environment variables...
{'attribute_version': X,
 'content_version': XX,
 'created_at': datetime.datetime(2019, 6, 19, 6, 24, 32, tzinfo=tzutc()),
 'description': 'AWS事業本部サービスグループ',
 'id': 'XXXXXXXXXXXXXXXXXXXXXX',
 'items': YYY,
 'name': '[AWS]サービスG',
 'type': 'USER_CREATED',
 'updated_at': datetime.datetime(2021, 5, 11, 6, 17, 52, tzinfo=tzutc())}

今回はVaultですが、1Password.com上から取得できました。

他にも色々と取得が可能です。詳細はAPIリファレンスを参照してください。

Secrets Automationの利用料金

Secrets Automationを用いるVaults数が3つまでは無料となっています。4 Vaults以降は有料です。

Vault数 料金
〜25 $29/Month
〜100 $99/Month
〜500 $299/Month

あとがき

初期設定には管理者権限が必要であるものの、実際の利用については管理者権限が求められないため、利用者がシステム管理担当者に設定を依頼する形になるかと思われます。

ポイントとしては毎回1Passwordへのリクエストが発生するところです。1Password自体はリクエスト回数ベースでの請求ではありませんが、AWSからの利用はトラフィックに応じてAWS利用費が発生します。一度取得したデータを適切に保存して再利用するなど、リクエスト回数を減らす工夫は行うべきでしょう。