opxで.envファイルの秘密情報を根絶する — 1Password CLIの実践ガイド

Written by
John Doe
公開日
2026-03-27

目次

.envファイルに平文でAPIキーを書いている。開発者なら一度はやったことがあるはずだ。

# .env(よくある状態)
OPENAI_API_KEY=sk-proj-abc123def456
DATABASE_URL=postgres://admin:P@ssw0rd@db.example.com:5432/myapp
STRIPE_SECRET_KEY=sk_live_xxxxxxxxxxxxxxxx

.gitignoreに入れているから大丈夫? 新しいメンバーに.envをSlackで送っていないか。退職者のローカルマシンにAPIキーが残っていないか。CIのシークレット設定と.envの値がズレていないか。

opx(1Password CLIのラッパー)を使うと、.envからシークレットの平文を完全に排除できる。ファイルに書くのは1Passwordへの参照URLだけ。実際の値はopx経由で実行時に注入される。

仕組み

opxは1Password CLI(opコマンド)のラッパーで、.envファイル内のop://参照を検出し、1Passwordから実際の値を取得して環境変数に注入した上でコマンドを実行する。

.env の op:// 参照 → opx が検出 → 1Password から値を取得 → 環境変数に注入 → コマンド実行

つまり、.envファイルを見ても秘密情報は一切わからない。1Passwordへのアクセス権限がある人だけが、実行時に値を取得できる。

セットアップ手順

1. 1Password CLIのインストール

# macOS(Homebrew)
brew install 1password-cli

# 確認
op --version

2. 1Password CLIにサインイン

# 初回サインイン
op signin

# アカウントを確認
op account list

1Password 8のデスクトップアプリがインストールされていれば、生体認証(Touch ID等)でサインインできる。毎回マスターパスワードを入力する必要はない。

3. opxのインストール

opxは1Password CLIに組み込まれているop runコマンドのエイリアス、またはnpmパッケージとして利用できる。

# npmでインストールする場合
npm install -g opx

# または、op run を直接使う(opxと同等)
op run -- npm run dev

プロジェクトによってはopxをdevDependenciesに入れてnpx opxで使うパターンもある。

4. 1Passwordにシークレットを登録

1Passwordのvault内に「Secure Note」または専用のアイテムを作成し、各シークレットをフィールドとして登録する。

Vault: Development
Item: MyApp Secrets
Fields:
  - OPENAI_API_KEY: sk-proj-abc123def456
  - DATABASE_URL: postgres://admin:P@ssw0rd@db.example.com:5432/myapp
  - STRIPE_SECRET_KEY: sk_live_xxxxxxxxxxxxxxxx

各フィールドの参照URLは、1Passwordアプリでアイテムを開き、フィールドの「参照をコピー」で取得できる。

.envファイルの書き換え: Before → After

Before(平文)

# .env
OPENAI_API_KEY=sk-proj-abc123def456
DATABASE_URL=postgres://admin:P@ssw0rd@db.example.com:5432/myapp
STRIPE_SECRET_KEY=sk_live_xxxxxxxxxxxxxxxx
AWS_ACCESS_KEY_ID=AKIA1234567890ABCDEF
AWS_SECRET_ACCESS_KEY=wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY
SENDGRID_API_KEY=SG.xxxxxxxxxxxxxxxxxxxx

After(op://参照)

# .env
OPENAI_API_KEY=op://Development/MyApp Secrets/OPENAI_API_KEY
DATABASE_URL=op://Development/MyApp Secrets/DATABASE_URL
STRIPE_SECRET_KEY=op://Development/MyApp Secrets/STRIPE_SECRET_KEY
AWS_ACCESS_KEY_ID=op://Development/MyApp Secrets/AWS_ACCESS_KEY_ID
AWS_SECRET_ACCESS_KEY=op://Development/MyApp Secrets/AWS_SECRET_ACCESS_KEY
SENDGRID_API_KEY=op://Development/MyApp Secrets/SENDGRID_API_KEY

op://の形式は op://<vault名>/<アイテム名>/<フィールド名>

この.envファイルはGitにコミットしても安全だ。参照URLだけなので、1Passwordへのアクセス権がなければ値を取得できない。

使い方

開発サーバーの起動

# Before: 平文.envを読み込む
npm run dev

# After: opx経由で起動
opx npm run dev

# または op run を使う場合
op run --env-file=.env -- npm run dev

opxが.envop://参照を解決し、環境変数として注入した状態でコマンドを実行する。アプリケーション側のコード変更は不要。process.env.OPENAI_API_KEYでそのまま取得できる。

特定のコマンドだけ実行

# マイグレーション実行
opx npx prisma migrate deploy

# テスト実行(DB接続が必要な場合)
opx npm test

# シークレットが不要なコマンドにはopx不要
npm install    # opx不要
npm run lint   # opx不要
git push       # opx不要

値の確認(デバッグ用)

# 特定のシークレットの値を確認
op read "op://Development/MyApp Secrets/OPENAI_API_KEY"

# .envの全参照を解決して表示
op run --env-file=.env -- env | grep -E "OPENAI|DATABASE|STRIPE"

チーム導入の手順

Step 1: Vaultの設計

Production Vault(本番用)
  ├── API Keys(外部サービス)
  ├── Database Credentials(DB接続情報)
  └── SSL Certificates(証明書)

Development Vault(開発用)
  ├── API Keys(テスト用キー)
  └── Database Credentials(ローカルDB)

Staging Vault(ステージング用)
  └── (本番とは異なるキーを使用)

Vaultを環境ごとに分けると、開発者に本番のシークレットへのアクセス権を与えずに済む。

Step 2: アクセス権限の設定

1Passwordのチーム機能で、Vaultへのアクセスを役割ベースで管理する。

役割Development VaultStaging VaultProduction Vault
開発者読み取り読み取りアクセス不可
リードエンジニア読み取り/書き込み読み取り/書き込み読み取り
CTO/インフラフルフルフル

Step 3: オンボーディング手順の整備

新しいメンバーが参加したときの手順:

  1. 1Passwordのチームに招待
  2. Development Vaultへのアクセス権を付与
  3. 1Password CLIをインストール(brew install 1password-cli
  4. op signinでサインイン
  5. プロジェクトをクローンしてopx npm run dev

.envファイルをSlackで送る必要がない。1Passwordのアクセス権を付与するだけで、環境構築が完了する。

Step 4: 退職者のアクセス削除

1Passwordのチームから削除するだけで、全プロジェクトのシークレットへのアクセスが一括で無効化される。個別のAPIキーをローテーションする必要はない(ただし、万全を期すなら主要なキーのローテーションは推奨)。

CI/CDとの統合

GitHub Actions

# .github/workflows/deploy.yml
name: Deploy
on:
  push:
    branches: [main]

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      - name: Load secrets from 1Password
        uses: 1password/load-secrets-action@v2
        with:
          export-env: true
        env:
          OP_SERVICE_ACCOUNT_TOKEN: ${{ secrets.OP_SERVICE_ACCOUNT_TOKEN }}
          OPENAI_API_KEY: op://Production/MyApp Secrets/OPENAI_API_KEY
          DATABASE_URL: op://Production/MyApp Secrets/DATABASE_URL

      - name: Deploy
        run: npm run deploy

GitHub Actionsの場合、1Passwordのサービスアカウントトークンを1つだけGitHub Secretsに登録する。個別のシークレットをGitHub Secretsに登録する手間がなくなる。

他のCIサービス

CircleCI、GitLab CI、Vercelでも同様の統合が可能。1Password公式のインテグレーションが提供されている。

コスト

1Passwordの料金(2026年3月時点):

プラン月額/人主な機能
Teams$3.995人〜、Vault共有、管理コンソール
Business$7.99SSO統合、カスタムロール、監査ログ
Enterprise要問合せ専任サポート、SLA

開発チーム5人の場合、Teamsプランで月$20程度。1つのAPIキーの漏洩リスクを考えれば、十分にペイする投資だ。

補足: 経営層への説明

技術的なメリットは明確だが、経営層への説明にはビジネスリスクの観点が必要になる。

  • APIキー漏洩のコスト: OpenAI APIキーが漏洩すれば、数時間で数十万円の不正利用が発生しうる
  • コンプライアンス: ISO 27001やSOC 2の要件として、シークレットの管理は必須項目
  • 退職時のリスク: 平文の.envファイルが退職者のPCに残る問題を構造的に解決

「1Passwordの月額費用」と「漏洩時の損害額」を比較すれば、投資判断としては明快だ。

まとめ

opx(1Password CLI)で.envの平文シークレットを排除する手順:

  1. 1Password CLIをインストール(5分)
  2. シークレットを1Passwordに登録(15分)
  3. .envop://参照に書き換え(10分)
  4. opx経由でコマンドを実行する運用に切り替え

全体で30分程度の作業で、シークレット管理のリスクが大幅に下がる。新しいプロジェクトを始めるとき、最初に.envop://形式で書く習慣をつけるのが一番楽だ。

Relation

関連記事

This is some text inside of a div block.

YouTube運用にAIを導入して分かったこと――効率化できる部分と、できない部分の境界線

This is some text inside of a div block.
7 min read
This is some text inside of a div block.

WordPressからWebflowに移行して半年。正直な感想と移行判断のチェックリスト

This is some text inside of a div block.
7 min read
This is some text inside of a div block.

Webflowとは何か — 使い始めた初日に知りたかった10のこと

This is some text inside of a div block.
7 min read
This is some text inside of a div block.

WebflowとWordPress、どちらを選ぶ?制作現場の判断基準を解説

This is some text inside of a div block.
7 min read
This is some text inside of a div block.

WebflowのSEO、初期設定のままだと損する|f2t.jpで実際にやった改善と効果

This is some text inside of a div block.
7 min read
This is some text inside of a div block.

Webflowの料金プランを日本円で比較|用途別のおすすめと選び方

This is some text inside of a div block.
7 min read

現在【毎月先着5社様】限定無料相談受付ます

大変申し訳ありません。私たちのリソースには限りがあり、一社一社に質の高いサービスを提供するため、現在【毎月先着5社様】限定で、この特別な条件(全額返金保証+無料相談)でのご案内とさせていただいております。

さらに、今このページをご覧のあなただけに、無料相談へお申し込みいただいた方限定で、通常5万円相当の【競合サイト分析&改善提案レポート】を無料でプレゼントいたします。

枠がすぐに埋まる可能性がありますので、お早めにお申し込みください。

プライバシーポリシーに同意し、まずは無料相談をおこないます
Thank you! Your submission has been received!
Oops! Something went wrong while submitting the form.