1Password CLI編:.envをセキュアに管理する
.env をローカル環境に置かず、1Password に環境変数を保存して CLI 経由で読み込む。
プロジェクトごとに .env を作らず、必要な値を 1Password から注入する形へ移行する。
ローカル環境で.envの環境変数を1Password CLIで読み込む
Get started with 1Password CLI
1password-cliのインストールと設定
WSLでlinux brewを使用しているので、MavcとWSLで以下を実行。
brew install 1password-cli以下のエラーが出たのでunzipをインストール
Error: Failure while executing; .../usr/bin/env: ‘unzip’: No such file or directorysudo apt updatesudo apt install -y unzip1PasswordデスクトップアプリをCLIと連携
次に、デスクトップアプリ「開発者」セクションから「1Password CLIと連携」を有効にする。
CLIでの認証をデスクトップで担うことができる。
有効化後、適当にopコマンドを実行すると1Passwordが開いて認証が走るらしいが、
op vault listNo accounts configured for use with 1Password CLI. - Turn on the 1Password desktop app integration to sign in with the accounts you've added to the app: https://developer.1password.com/docs/cli/app-integration/ for details. - Add an account manually with 'op account add' and sign in by entering your password on the command line. See 'op account add --help' for details. - Authenticate using a 1Password service account by setting the 'OP_SERVICE_ACCOUNT_TOKEN' environment variable to your service account token. Learn more: https://developer.1password.com/docs/service-accounts/ - Use 1Password CLI with a Connect server by setting the 'OP_CONNECT_HOST' and 'OP_CONNECT_TOKEN' environment variables to your Connect host and token, respectively. Learn more: https://developer.1password.com/docs/connect/というエラーが出たので手動で既存アカウントを追加した。
TIP
ドメイン(xxx.1password.com)はデスクトップアプリの「アカウント情報」から確認できる
op account add --address xxx.1password.com --email xxx@gmail.com求められる入力を行う。
Enter the Secret Key for xxx@gmail.com on my.1password.com: XXXEnter the password for xxx@gmail.com at my.1password.com:Now run 'eval $(op signin)' to sign in.サインインしろと言われるのでサインインを実行。
eval $(op signin)Enter the password for xxx@gmail.com at xxx.1password.com:アカウントが登録されてるか確認し、登録できていたら成功。
> op whoami
URL: https://xxx.comEmail: XXX@gmail.comUser ID: XXXUser Type: HUMANop vault listをたたけば保管庫一覧が表示される
> op vault list
ID NAMEXXX PersonalXXX XXX.envの環境変数を1Passwordで管理し、1PasswordCLIで参照
まず、既存の.envに記述している環境変数を1Passwordに保持する。
登録方法はコマンドで追加か手動で行う。
1. コマンドでの追加
op item create \ --vault "XXX" \ --category "Secure Note" \ --title "repo-name" \ 'VITE_GITHUB_TOKEN[concealed]=ghp_XXX'vaultは対象の保管庫名、categoryは登録形式(セキュアノート)、タイトルはリポジトリ名だとわかりやすい。
2. 1Passwordに手動で登録
個人的にはこっちが楽なのでGUIで追加している。
登録したい保管庫で「新規アイテム」を押下し、セキュアノートを作成してリポジトリ名をタイトルに入れ、テキストフィールドにVITE_GITHUB_TOKEN などの環境変数名をラベルに記述し、値に環境変数値を入力して保存するだけ。
1Passwordに環境変数の保持が完了したら、プロジェクト内で.envは不要なので削除。
.env.1passwordなどのファイルを作成し、以下のようにopコマンドで参照を行う。
VITE_GITHUB_TOKEN=op://<保管庫名>/<タイトル名>/VITE_GITHUB_TOKENこれだけだとローカルサーバ起動しても環境変数は注入されないので、以下のように1Passwordで管理してる環境変数を読み込んでから、Viteの開発サーバーを起動する
"scripts": { "dev": "op run --env-file=.env.1password -- vite", "build": "tsc -b && vite build", "build:local": "op run --env-file=.env.1password -- bash -c 'tsc -b &&vite build'", ...}buildコマンドなどについて、サーバー側には1PasswordCLIを入れていないと思うので、CI/CDで使用しているコマンドとは別に用意しておくことをお勧めする。(ローカルでbuildしてpreviewすることはあまりないと思うが一応)
基本的にはnpm run devなどの時にop run --env-file=.env.1passwordで.envに環境変数を注入するで十分。
サービスアカウントの追加
サービスアカウントとは、個人と関連付けられない認証方法を用いて1Passwordに保管しているシークレット情報を使用できるようにすること。
主にCI/CDや本番環境などで使用することを想定されているもの。
トークンを発行(Service Account Token)してそのトークンを用いてアクセス可能とする。
Vaultの権限を指定できるので、漏洩した時の被害は最小限に抑えることができる。
ホストで使用したい場合
推奨はされてないはずだと思うが、SATはログイン認証を挟まないためホストで使用するとログイン認証せずともシークレット情報を使用できる。
SATを厳重にセキュアに管理しつつ、Vaultを適切に絞ることができればやってもよいが、漏洩時のリスクを考えるとホストでSATを使うのは避けたほうがよさそう。
ただ、もしやりたい場合は以下の順でまずは1Password CLIに追加したアカウントを削除するところから始める(1Passwordアカウントの削除ではなく、1Password CLIに追加したアカウントなのでデータが消えるなどは無い)。
op account listop account forget --allop signout --allそして次のサービスアカウント作成に進む。
サービスアカウントの作成
Web版の1Passwordを開き、プロフィールから「アカウントの管理」を開く。
「開発者」タブを開くと「サービスアカウント」が出てくるので手順通りに追加する。
その時、保管庫のアクセス権限も決めることができるのでサービスアカウントでアクセス可能にしたい保管庫を選択する。
一時的に表示されるトークンを1Passwordに保存。
使用する際はその環境で、
- 1Password CLIを入れる
OP_SERVICE_ACCOUNT_TOKENという環境変数にトークンを入れる
上記を行うことでopコマンドでシークレット情報にアクセスすることができる。
個人的に感じるメリット・デメリット
メリット
- .env(機密になりえる情報)を端末ごとにローカルマシンに残さなくて済む
- 1Password にまとめて保存しておけば、Mac / Windows / WSL どの環境でもサインインだけで同じ値を参照でき、異なる端末間の情報共有がスムーズ
デメリット
- ローカルサーバーを起動するたび(またはターミナルのセッション切れなど)に 1Password CLI の認証が必要になるのが少し手間