1Password CLIでシークレット参照を使う

1Passwordマニュアル|1Password CLIを使って、シークレット参照で安全に情報を環境へ読み込む方法を詳しく解説します。

1Password CLIを使うと、シークレット参照を使用して、プレーンテキスト(平文)でシークレットを公開することなく、1Passwordに保存されている情報を環境変数、構成ファイル、スクリプトに安全に読み込むことができます。

シークレット参照のURIには、1Passwordアカウントでシークレットが保存されるvault、アイテム、セクション、フィールドの名前が含まれます。

$ op://<①vault-name>/<②item-name>/[③section-name/]<④field-name>

シークレット参照を実行時に参照するシークレットに置き換えるには、op readop run、またはop injectコマンドを使います。

必要条件

1Password CLIでシークレット参照を使って安全にシークレットをロードするには、以下のことが必要です:

1Passwordにサインアップする

1Password CLIをインストールする

③参照したいシークレットを1Passwordアカウントに保存する。

ステップ1:シークレット参照を取得する

シークレット参照を取得するにはいくつかのやり方があります。

ステップ2:平文のシークレットをシークレット参照で置き換える

シークレット参照を作成したら、それをコード中の平文のシークレットの代わりに使ってください。

以下の例では、GitHubの環境ファイルに、平文のトークンではなく、1Password内のGitHub Personal Access Tokenが保存されている場所を指すシークレット参照を指定しています。

ステップ3:シークレット参照を解決する

シークレット参照をランタイムに実際のシークレットで置き換えるには3つの方法があります。

op readコマンドで出力する

op read コマンドとシークレット参照を使ってシークレットを標準出力(stdout)に出力できます。

$ op read op://development/GitHub/credentials/personal_token
結果の例:

ghp_WzgPAEutsFRZH9uxWYtw

シークレットをstdoutではなくファイルに書き込むには、新しいファイルへのパスとともに--out-fileフラグ(または -o)を含めます。例えば、GitHub personal access tokenを含むファイルtoken.txtを作成するには、次のようにします。

$ op read --out-file token.txt op://development/GitHub/credentials/personal_token
結果の例:token.txt
$ ghp_WzgPAEutsFRZH9uxWYtw

また、シークレット参照を指定したop readコマンドを使って、シークレットをスクリプトに読み込むこともできます。例えば、docker loginコマンドでDockerユーザー名とパスワードの代わりにシークレット参照を使うには、次のようにします。

myscript.sh
$ #!/bin/bash
$
$ docker login -u $(op read op://prod/docker/username) -p $(op read op://prod/docker/password)

Query parameters クエリーパラメーターを含むシークレット参照を使用して、アイテムに関する詳細情報を取得できます。 アイテムフィールドまたはファイル添付に関する情報を取得するには、取得する属性とともにattribute(またはattr)クエリーパラメーターを含めて命令します。

$ op://<vault>/<item>[/<section>]/<field>?attribute=<attribute-value>

この方法でフィールドの次の属性を照会できます: typevaluetitleidpurposeotp

さらに照会できる、ファイル添付ファイルの属性は次のとおりです: content, size, id, name, type.

例えば、 GitHubアイテムのワンタイムパスワードフィールドからワンタイムパスワードを取得するには、次のようにします。

$ op read "op://development/GitHub/Security/one-time password?attribute=otp"
結果の例:

359836

OpenSSH形式でSSHキーのプライベートキーを取得するには、SSHキーのprivate keyフィールドのシークレット参照に、値openssh を持つssh-formatクエリーパラメーターを含めます。

$ op read "op://Private/ssh keys/ssh key/private key?ssh-format=openssh"
結果の例:

-----BEGIN OPENSSH PRIVATE KEY----- b3BlbnNzaC1rZXktdjEAAAAACmFlczI1Ni1jdHIAAAAGYmNyeXB0AAAAGAAAABD3rRrf8J ruD0CxZTYfpbTYAAAAEAAAAAEAAAAzAAAAC3NzaC1lZDI1NTE5AAAAIJ5B/GnxX6t9jMwQ G7QE7r5daJLkMKTZhNZhWfvzK2y+AAAAkLgQAivYu/+12/YrZhK5keIAZf4ZgsZsZ2JI2q qbx23PqgO93oGy1iCxXe3kngQL4cM6lwOZPsZPKCinkN6KxEr6RnXqFRHJbMpOiGeZhTuD rjeo77HqFdxDqDeckB77XCKL0Ew28H5JlM/WO31XR3Z4VBAgTe+BQLjrFV8WU5UX38hpBJ PMJyRsK72ZUDDaGQ== -----END OPENSSH PRIVATE KEY-----

次のステップ

シークレットをスクリプトに安全にロードする方法について詳しく学習します。

op runコマンドで出力する

op runは、環境変数をスキャンしてシークレット参照を探し、1Passwordから対応する値をロードし、サブプロセスの実行中は環境変数としてシークレットを使用できるようにして、指定されたコマンドをサブプロセスで実行します。

シークレットをアプリケーションまたはスクリプトに渡す

実行時にスクリプトまたはアプリケーションにシークレットを渡すには、コマンドをop runで囲みます。

例えば、データベースに接続するために資格情報を必要とするNode.js アプリを次に示します。

$ $ node app.js
$ [INFO] Launching Node.js app...
$ [ERROR] Missing credentials DB_USER and DB_PASSWORD
$ [INFO] Exiting with code 1

この例では、DB_USERDB_PASSWORD環境変数をシークレット参照に設定できます。

$ export DB_USER="op://app-dev/db/user"
$ export DB_PASSWORD="op://app-dev/db/password"

次に、op runコマンドを使って、シークレットをnode app.jsコマンドに渡します。

$ op run -- node app.js
$ [INFO] Launching Node.js app…
$ [DEBUG] ✔ Connected to db as user 'mydbuser' with password '<concealed by 1Password>'

環境ファイルと一緒にop runコマンドを使う

環境ファイルでop runコマンドを使うこともできます。これを行うには、環境ファイルでプレーンテキストのシークレットの代わりにシークレット参照を使います

node.envの例
DB_USER="op://app-dev/db/user"
DB_PASSWORD="op://app-dev/db/password"

次に、--env-fileフラグを指定してop runコマンドを使います。

op run --env-file="./node.env" -- node app.js

マスクなしでシークレットをプリントする

op runで使われるサブプロセスがstdoutにシークレットを出力する場合、そのシークレットはデフォルトでは隠されます。--no-maskingフラグを追加すると値を出力できます。

サンプルの環境変数DB_PASSWORDをシークレット参照にエクスポートするには次のように書きます:

$ export DB_PASSWORD=op://app-prod/db/password

op runprintenvコマンドと一緒に使うと、隠蔽されたシークレットを出力できます:

$ op run -- printenv DB_PASSWORD

結果を見る...

<concealed by 1Password>

--no-maskingフラグをつけるとシークレットそのものを出力します:

$ op run --no-masking -- printenv DB_PASSWORD

結果の例(訳注:マスクがない):

fX6nWkhANeyGE27SQGhYQ

次のステップ

テンプレート変数を使用してさまざまな環境のさまざまなシークレット セットを切り替える方法など、op run を使用して環境にシークレットをロードする方法について詳しく学習します。

op injectコマンドで出力する

op injectコマンドを使うと、スクリプトまたはファイル内のシークレット参照を、それらが参照するシークレットに置き換えることができます。

デフォルトでは、op injectstdinからの入力を受け入れ、stdout に出力します。その代わりにファイルから入力を読み込ませるには--in-fileフラグ(または -i)を使い、出力を書き込む場所を指定するには--out-fileフラグ(または -o)を使います。

op injectを使い簡単なコマンドでシークレットを解決するには:

$ echo "here is my GitHub token: op://development/GitHub/credentials/personal_token" | op inject
結果の例:

here is my GitHub token: ghp_WzgPAEutsFRZH9uxWYtw

出力をカレントディレクトリーのtoken.txtファイルに書き込むよう指定するには:

$ echo "here is my GitHub token: op://development/GitHub/credentials/personal_token" >> token.txt | op inject --out-file token.txt
結果の例(token.txt)
$ here is my GitHub token: ghp_WzgPAEutsFRZH9uxWYtw

設定ファイルと一緒に使う

op injectを使うと、シークレット参照でテンプレート化された設定ファイルを渡して、解決されたシークレットを含めた設定ファイルを出力できます。プレーンテキストのシークレットの代わりにシークレット参照を使う設定ファイルは、Gitに安全にチェックインできます。

設定ファイルの例(config.yml.tpl):
database:
    host: http://localhost
    port: 5432
    username: op://prod/mysql/username
    password: op://prod/mysql/password

コードの例:

$ op inject --in-file config.yml.tpl --out-file config.yml

次のステ

ップ テンプレート変数を使用してさまざまな環境のさまざまなシークレット セットを切り替える方法など、op inject を使用してシークレットを構成ファイルに読み込む方法について詳しく学習します。

より深く学習するには

Last updated