1Password CLIでシークレット参照を使う
1Passwordマニュアル|1Password CLIを使って、シークレット参照で安全に情報を環境へ読み込む方法を詳しく解説します。
1Password CLIを使うと、シークレット参照を使用して、プレーンテキスト(平文)でシークレットを公開することなく、1Passwordに保存されている情報を環境変数、構成ファイル、スクリプトに安全に読み込むことができます。
シークレット参照のURIには、1Passwordアカウントでシークレットが保存されるvault、アイテム、セクション、フィールドの名前が含まれます。
$ op://<①vault-name>/<②item-name>/[③section-name/]<④field-name>
シークレット参照を実行時に参照するシークレットに置き換えるには、op read
、op run
、またはop inject
コマンドを使います。
TIP
最小特権の原則に従って、1Password Service Accountsを使うことをお勧めします。 各サービスアカウントは、1Password CLIを特定のvaultに制限することをサポートしているので、許可されたターミナルセッションのプロセスが、特定の目的に必要なアイテムにのみアクセスできるようにします。
必要条件
1Password CLIでシークレット参照を使って安全にシークレットをロードするには、以下のことが必要です:
③参照したいシークレットを1Passwordアカウントに保存する。
ステップ1:シークレット参照を取得する
シークレット参照を取得するにはいくつかのやり方があります。
1Passwordデスクトップアプリで取得する: アプリからシークレット参照を入手してください。
1Password for VS Codeで取得する:コードを編集する際に、1Passwordからシークレット参照を挿入してください。
1Password CLIで取得する:
op item get
コマンドを使うと、1つまたは複数のフィールドのシークレット参照を取得できます。シークレット参照構文で取得する:手作業でシークレット参照を書くこともできます。
ステップ2:平文のシークレットをシークレット参照で置き換える
シークレット参照を作成したら、それをコード中の平文のシークレットの代わりに使ってください。
以下の例では、GitHubの環境ファイルに、平文のトークンではなく、1Password内のGitHub Personal Access Tokenが保存されている場所を指すシークレット参照を指定しています。

ステップ3:シークレット参照を解決する
シークレット参照をランタイムに実際のシークレットで置き換えるには3つの方法があります。
op read
コマンドで出力する
op read
コマンドで出力するop read
コマンドとシークレット参照を使ってシークレットを標準出力(stdout
)に出力できます。
$ op read op://development/GitHub/credentials/personal_token
シークレットをstdout
ではなくファイルに書き込むには、新しいファイルへのパスとともに--out-file
フラグ(または -o
)を含めます。例えば、GitHub personal access tokenを含むファイルtoken.txt
を作成するには、次のようにします。
$ op read --out-file token.txt op://development/GitHub/credentials/personal_token
$ ghp_WzgPAEutsFRZH9uxWYtw
また、シークレット参照を指定したop read
コマンドを使って、シークレットをスクリプトに読み込むこともできます。例えば、docker login
コマンドでDockerユーザー名とパスワードの代わりにシークレット参照を使うには、次のようにします。
$ #!/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>
この方法でフィールドの次の属性を照会できます: type
、value
、title
、id
、purpose
、otp
さらに照会できる、ファイル添付ファイルの属性は次のとおりです: content
, size
, id
, name
, type
.
例えば、 GitHubアイテムのワンタイムパスワードフィールドからワンタイムパスワードを取得するには、次のようにします。
$ op read "op://development/GitHub/Security/one-time password?attribute=otp"
OpenSSH形式でSSHキーのプライベートキーを取得するには、SSHキーのprivate keyフィールドのシークレット参照に、値openssh を持つssh-formatクエリーパラメーターを含めます。
$ op read "op://Private/ssh keys/ssh key/private key?ssh-format=openssh"
op run
コマンドで出力する
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_USER
とDB_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
コマンドを使うこともできます。これを行うには、環境ファイルでプレーンテキストのシークレットの代わりにシークレット参照を使います
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 run
をprintenv
コマンドと一緒に使うと、隠蔽されたシークレットを出力できます:
$ op run -- printenv DB_PASSWORD
結果を見る...
<concealed by 1Password>
--no-masking
フラグをつけるとシークレットそのものを出力します:
$ op run --no-masking -- printenv DB_PASSWORD
結果の例(訳注:マスクがない):
fX6nWkhANeyGE27SQGhYQ
op inject
コマンドで出力する
op inject
コマンドで出力するop inject
コマンドを使うと、スクリプトまたはファイル内のシークレット参照を、それらが参照するシークレットに置き換えることができます。
デフォルトでは、op inject
は stdin
からの入力を受け入れ、stdout
に出力します。その代わりにファイルから入力を読み込ませるには--in-file
フラグ(または -i
)を使い、出力を書き込む場所を指定するには--out-file
フラグ(または -o
)を使います。
op inject
を使い簡単なコマンドでシークレットを解決するには:
$ echo "here is my GitHub token: op://development/GitHub/credentials/personal_token" | op inject
出力をカレントディレクトリーのtoken.txt
ファイルに書き込むよう指定するには:
$ echo "here is my GitHub token: op://development/GitHub/credentials/personal_token" >> token.txt | op inject --out-file token.txt
$ here is my GitHub token: ghp_WzgPAEutsFRZH9uxWYtw
設定ファイルと一緒に使う
op injectを使うと、シークレット参照でテンプレート化された設定ファイルを渡して、解決されたシークレットを含めた設定ファイルを出力できます。プレーンテキストのシークレットの代わりにシークレット参照を使う設定ファイルは、Gitに安全にチェックインできます。
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
より深く学習するには
Last updated