Open9

1Passwordでenvchainっぽいことができないか調べる

kobakazu0429kobakazu0429

モチベーション

  • インターンでenvchainを知った
  • インターンで1Passwordを使って便利さを感じた
  • 個人で1Passwordを使い始めた
  • envchainで満足しているが1Passwordに全て寄せたい
kobakazu0429kobakazu0429

方針

  • .envという名前のVaultsを作成する
  • <namespace>という名前のItemを.env内に作成する
  • op item createでセキュアな値は保存しない
    • (勉強を始めたばかりで詳しくなく自信ないが)容易に自分以外から覗けるため
kobakazu0429kobakazu0429

Itemの作成

ここでは入力欄のみを作成し、値はアプリ上で登録する

op item create --vault .env --category "Secure Note" --title <namespace> "<key1>[password]=" "<key2>[password]="

kobakazu0429kobakazu0429

実行

流れ

  • op item get で Secret referenceを取得する
  • .envファイルに書き込む
  • op run --env-file="./.env" -- <command> で実行する

.envファイルの作成

op item get --vault .env --format json <namespace> | jq -r ".fields[] | select(.type == \"CONCEALED\") |.label + \"=\" + .reference"

  • namespaceはfooとする
  • 値はアプリ上で入力済み
$ op item get --vault .env --format json foo | jq -r ".fields[] | select(.type == \"CONCEALED\") |.label + \"=\" + .reference" > .env

$ cat .env
ABC=op://.env/foo/Section_hogehoge/ABC
DEF=op://.env/foo/Section_hogehoge/DEF

$ op run --env-file="./.env" -- printenv
ABC=<concealed by 1Password>
DEF=<concealed by 1Password>
kobakazu0429kobakazu0429

感想

色々調べた結果こんな感じになったけど...

  • CLIで完結しないのでめんどくさい
  • envファイルを作るところが従来の方法と変わらない
  • 気軽にnamespaceの変更ができないので、例えば.env.devと.env.testみたいな切り替えができない
    • ここはいい感じにスクリプト書けば解決できそうではある

もっといい方法があれば教えてください🙇

https://zenn.dev/link/comments/2cb4dc4b6f70f5 で値の登録以外は解決した

kobakazu0429kobakazu0429

.envファイルを作らない方法

ABC=op://.env/foo/Section_hogehoge/ABC \
DEF=op://.env/foo/Section_hogehoge/DEF \
op run -- printenv

これでもできるので

function opr() {
  OP_ENV=`op item get --vault .env --format json $1 | jq -r '[(.fields[] | select(.type == "CONCEALED") | [.label, "\"" + .reference + "\""]) | join("=")] | join(" ")'`
  shift
  env -S"$OP_ENV" op run -- $*
}

みたいにしておくと

$ opr foo node -e "console.log(process.env.ABC)"

で実行できる

kobakazu0429kobakazu0429

一連の流れをきちんとCLIで使えるようにすればまぁまぁ使えそう