Contents
前提条件と環境構築
このセクションでは、1Password AI ツール連携の全体像を把握し、実装に必要な最小限の準備を行います。
まずは 1Password アカウントの取得から CLI のインストール・API トークンの発行までを順番に確認し、以降のスクリプトやコードで安全にシークレットを扱える土台を作ります。
1Password アカウントの作成とサインイン方法
公式サイト(https://1password.com/)からチームまたは個人向けアカウントを作成します。
- 「サインアップ」ボタン → メールアドレス・マスターパスワードを入力
- 受信したメールのリンクで認証完了 → ブラウザでサインインし、デフォルトの Vault(保管庫) が自動作成されます
- 初回ログイン時に 多要素認証 (MFA) を有効化しておくと、以後の操作が安全になります
注記:本稿執筆時点(2026‑05)では 1Password の最新 CLI バージョンは 2.12 系 です。正確なバージョン番号は公式ダウンロードページ(https://developer.1password.com/docs/cli/install)で随時確認してください。
公式 CLI (op) のインストール手順
この章では、主要 OS 向けに op コマンドをインストールする方法と、インストール後のバリデーション手順を解説します。
各プラットフォームごとの注意点(エラー処理や PATH 設定)も併せて示すので、失敗した場合でも対処しやすくなります。
macOS(Homebrew)
macOS では Homebrew が最もシンプルです。インストール後はバージョン確認とパスの自動設定が行われます。
|
1 2 3 4 5 6 |
# インストール brew install --cask 1password/tap/op # バージョン確認 op --version |
ポイント:Homebrew が未インストールの場合は、公式サイト(https://brew.sh)から導入してください。
Linux(Debian / Ubuntu 系)
Linux では curl と dpkg を組み合わせた手順が一般的です。ネットワーク障害や権限不足に備えてエラーハンドリングを追加しています。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
set -euo pipefail # ダウンロード先ディレクトリ作成(必要ならば) TMPDIR=$(mktemp -d) cd "$TMPDIR" # 最新 .deb パッケージ取得 curl -fsSL https://downloads.1password.com/linux/static/latest/op_linux_amd64.deb -o op.deb || { echo "ダウンロードに失敗しました。ネットワークと URL を確認してください。" >&2 exit 1 } # インストール(sudo が必要) if sudo dpkg -i op.deb; then echo "インストール成功" else echo "dpkg によるインストールに失敗しました。依存関係を解決してください。" >&2 exit 1 fi # クリーンアップ cd / rm -rf "$TMPDIR" # バージョン確認 op --version |
Windows(PowerShell)
Windows 環境では PowerShell スクリプトでエラーハンドリングとパス設定を行います。$env:USERPROFILE\op.exe に配置し、システム PATH へ自動追加する例です。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
# エラーが起きたら即座に停止 $ErrorActionPreference = "Stop" # ダウンロード先ディレクトリ作成 $tempDir = New-Item -ItemType Directory -Path ([IO.Path]::GetTempPath()) -Name ("op_download_{0}" -f [guid]::NewGuid()) $exePath = Join-Path $tempDir.FullName "op.exe" try { # 最新バイナリ取得 Invoke-WebRequest -Uri "https://downloads.1password.com/windows/static/latest/op.exe" ` -OutFile $exePath # 実行ファイルをユーザープロファイル直下にコピー $dest = "$env:USERPROFILE\op.exe" Move-Item -Path $exePath -Destination $dest -Force # PATH に追加(永続的) $newPath = [Environment]::GetEnvironmentVariable("PATH","User") if (-not ($newPath -like "*$env:USERPROFILE*")) { $newPath += ";$env:USERPROFILE" [Environment]::SetEnvironmentVariable("PATH",$newPath,"User") Write-Host "PATH に $env:USERPROFILE を追加しました。PowerShell 再起動後に有効になります。" } # バージョン確認 & "$dest" --version } catch { Write-Error "インストール中にエラーが発生しました: $_" exit 1 } finally { Remove-Item -Recurse -Force $tempDir -ErrorAction SilentlyContinue } |
ヒント:PowerShell を管理者権限で実行すると、システム全体の PATH にも自動追加できますが、セキュリティ上はユーザー単位で留めておく方が安全です。
API トークンの取得と安全な保存先比較
1Password の Service Account から発行した API トークンは、外部システムや CI/CD パイプラインからシークレットへアクセスする際に必須です。
ここではトークン取得手順と、OS 標準のシークレットストア と 1Password の op vault で管理する2つの保存方法を比較します。
API トークンの発行フロー
| 手順 | 操作内容 |
|---|---|
| 1 | 1Password Web ダッシュボード → 「Settings」→「Developer」へ移動 |
| 2 | New Service Account をクリックし、名前・説明を入力 |
| 3 | 最小権限(例:MyVault の read)を選択し、必要に応じて有効期限(30日推奨)を設定 |
| 4 | 「Create Token」ボタンでトークン文字列が一度だけ表示されるので、直ちに安全な場所へコピー |
重要:トークンは再表示できません。紛失した場合は新規作成してください。
保存先比較表
| 項目 | OS 標準シークレットストア(Keychain / Secret Service / Credential Manager) | 1Password op vault |
|---|---|---|
| 導入コスト | 各 OS に既に組み込まれているため追加インストール不要 | op vault create が必要だが、CLI と同一管理領域になる |
| アクセス方法 | security, secret-tool, cmdkey など OS 固有コマンド |
op read "op://<vault>/<item>/password" のように統一インターフェイス |
| ローテーション支援 | 手動で上書きする必要がある | op item edit でトークン更新、履歴保持あり |
| 監査ログ | OS によっては取得困難(特に macOS) | op event list --type token で取得可能 |
| 推奨シナリオ | ローカルスクリプトだけで完結する軽量環境 | 複数サービス・CI/CD パイプラインで共通管理したい場合 |
OS シークレットストアに保存する例(macOS)
|
1 2 3 |
# Keychain に保存 security add-generic-password -a "$USER" -s "1Password-API-Token" -w "$OP_TOKEN" |
op vault にトークンを格納する手順
|
1 2 3 4 5 6 7 8 9 10 11 12 |
# 1. 専用 Vault を作成(例: ai-tools) op vault create ai-tools --description "AI ツール連携用トークン保管庫" # 2. トークンをアイテムとして保存 op item add "API Token" \ --vault=ai-tools \ password="$OP_TOKEN" \ --category=Password # 3. 取得例(スクリプト内で使用) TOKEN=$(op read "op://ai-tools/API Token/password") |
ベストプラクティス:CI/CD 環境では
op vaultに格納したアイテムをOP_SESSION_<ACCOUNT>が有効な状態で読み出すと、OS のシークレットストアに依存しない一貫性のある管理が実現できます。
公式 CLI (op) の基本操作
この章では、取得したトークンを使って op コマンドでシークレットを安全に取り出す方法と、取得結果を 環境変数 や 一時ファイル に注入するベストプラクティスを解説します。
シークレット取得コマンド例(op read / op get item)
| コマンド | 用途 | 取得形式 |
|---|---|---|
op read "op://Vault/Item/field" |
単一フィールドだけを標準出力に返す | プレーンテキスト |
op get item "Vault/Item" --format json |
アイテム全体(メタデータ含む)を JSON で取得 | JSON |
実装例
|
1 2 3 4 5 6 7 |
# セッション開始(--raw はトークン文字列だけ取得) export OP_SESSION_MYTEAM=$(op signin myteam.1password.com --raw) # パスワードだけ取得 DB_PASSWORD=$(op read "op://MyVault/DatabaseCredentials/password") echo "取得完了 (表示はしません)" |
注意:
op readの出力は標準出力に直接流れるため、ログに残らないようset -o pipefailでパイプラインエラーを検知しつつ、echo等で意図的に出力しないようにします。
環境変数・一時ファイルへの安全な注入
| 方法 | メリット | デメリット |
|---|---|---|
| 環境変数(例: CI のシークレット) | プロセス間で簡単に受け渡し可能、$ENV だけで利用できる |
プロセス終了後に unset が必要、メモリ上に残存 |
| 一時ファイル(例: Docker ビルド) | ファイルベースのツールと相性が良い | ディスクに残留しやすいため削除必須 |
GitHub Actions で環境変数として利用する例
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
name: Deploy with 1Password secret on: push: branches: [ main ] jobs: deploy: runs-on: ubuntu-latest steps: - name: Sign in to 1Password env: OP_SESSION_MYTEAM: ${{ secrets.OP_SESSION_MYTEAM }} run: | echo "$OP_SESSION_MYTEAM" > $HOME/.op-session - name: Export DB_PASSWORD env: OP_SESSION_MYTEAM: ${{ secrets.OP_SESSION_MYTEAM }} run: | export DB_PASSWORD=$(op read "op://MyVault/DatabaseCredentials/password") # 以下のステップで $DB_PASSWORD が利用可能 |
Docker ビルド時に一時ファイルを使う例
|
1 2 3 4 5 6 |
TMP_ENV=$(mktemp) trap 'rm -f "$TMP_ENV"' EXIT # スクリプト終了時に自動削除 op read "op://MyVault/.env" > "$TMP_ENV" docker build --build-arg ENV_FILE="$TMP_ENV" . |
ポイント:
trapによる自動クリーンアップは忘れがちなファイル残存リスクを低減します。
Node.js SDK を用いた実装例と暗号化サンプル
Node.js 開発者向けに、公式 SDK (@1password/op-sdk) のインストールからシークレット取得、さらに AES‑256‑GCM によるペイロード暗号化までをフルスタックで示します。これにより、AI ツールへ送信する情報が通信路上でも保護されます。
SDK のインストールと初期化
|
1 2 |
npm install @1password/op-sdk dotenv |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
// src/opsdk.js import { OpClient } from '@1password/op-sdk'; import * as dotenv from 'dotenv'; dotenv.config(); // .env に OP_API_TOKEN が設定されている前提 const client = new OpClient({ token: process.env.OP_API_TOKEN, // 環境変数からトークン取得 vault: 'MyVault' // デフォルト Vault 名 }); export default client; |
シークレット取得コード(非同期/例外処理付き)
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
// src/getSecret.js import client from './opsdk.js'; /** * DatabaseCredentials アイテムの password フィールドを取得 * @returns {Promise<string|null>} パスワード文字列、取得失敗時は null */ export async function getDatabasePassword() { try { const item = await client.getItem('DatabaseCredentials'); const pwField = item.fields.find(f => f.label === 'password' || f.designation === 'password'); return pwField?.value ?? null; } catch (err) { console.error('[ERROR] 1Password からパスワード取得失敗:', err); throw err; // 呼び出し側でハンドリングさせる } } |
AES‑256‑GCM によるペイロード暗号化ユーティリティ
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
// src/cryptoUtil.js import crypto from 'node:crypto'; /** * AES-256-GCM で文字列を暗号化し、Base64 エンコードした JSON を返す * @param {string} plaintext 暗号化対象テキスト * @param {Buffer} key 32 バイト (256 ビット) のシークレットキー * @returns {{iv: string, ciphertext: string, authTag: string}} Base64 エンコード済み */ export function encryptAESGCM(plaintext, key) { const iv = crypto.randomBytes(12); // GCM 推奨サイズ const cipher = crypto.createCipheriv('aes-256-gcm', key, iv); const ciphertext = Buffer.concat([cipher.update(plaintext, 'utf8'), cipher.final()]); const authTag = cipher.getAuthTag(); return { iv: iv.toString('base64'), ciphertext: ciphertext.toString('base64'), authTag: authTag.toString('base64') }; } /** * 復号(デバッグ用) */ export function decryptAESGCM(encObj, key) { const { iv, ciphertext, authTag } = encObj; const decipher = crypto.createDecipheriv( 'aes-256-gcm', key, Buffer.from(iv, 'base64') ); decipher.setAuthTag(Buffer.from(authTag, 'base64')); const plaintext = Buffer.concat([ decipher.update(Buffer.from(ciphertext, 'base64')), decipher.final() ]); return plaintext.toString('utf8'); } |
環境変数で暗号化キーを管理する例
|
1 2 3 4 |
# .env に設定(安全に保管) ENCRYPTION_KEY=$(openssl rand -hex 32) # 256 ビット鍵 export ENCRYPTION_KEY |
Node.js 側では process.env.ENCRYPTION_KEY を Buffer.from(..., 'hex') で使用します。
AI ツール(Claude Code 等)への暗号化ペイロード送信例
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
// src/invokeClaude.js import fetch from 'node-fetch'; import { getDatabasePassword } from './getSecret.js'; import { encryptAESGCM } from './cryptoUtil.js'; export async function callClaude(prompt) { const dbPwd = await getDatabasePassword(); if (!dbPwd) throw new Error('DB パスワードが取得できません'); // 暗号化キーは環境変数から取得(32 バイト十六進文字列) const keyHex = process.env.ENCRYPTION_KEY; if (!keyHex) throw new Error('ENCRYPTION_KEY が未設定です'); const key = Buffer.from(keyHex, 'hex'); // ペイロード全体を暗号化 const payload = JSON.stringify({ prompt, extra_context: { db_password: dbPwd } }); const encrypted = encryptAESGCM(payload, key); const response = await fetch('https://api.anthropic.com/v1/complete', { method: 'POST', headers: { 'Content-Type': 'application/json', 'x-api-key': process.env.CLAUDE_API_KEY, // 暗号化情報をヘッダーで付与(例: X-Enc-Meta) 'X-Enc-IV': encrypted.iv, 'X-Enc-Tag': encrypted.authTag }, body: JSON.stringify({ ciphertext: encrypted.ciphertext }) }); if (!response.ok) { const errBody = await response.text(); throw new Error(`Claude API エラー (${response.status}): ${errBody}`); } // 必要なら復号(ここでは例示のみ) const result = await response.json(); return result; } |
ポイント
TLS (HTTPS) が必須:暗号化は「防御層の重複」になるが、通信路の盗聴をさらに低減できる。
鍵管理は最重要項目。CI ではop read "op://ai-tools/EncryptionKey/password"のように1Password に格納し、実行時に取得する方法が推奨されます。
AI ツール(Claude Code 等)への安全な連携パターン
この章では、認証情報・機密データの送信方式を選択する際の指針と、実装上のベストプラクティスをまとめます。
送信方式の比較表と選定基準
| 方式 | 推奨シーン | 主なセキュリティ考慮点 |
|---|---|---|
HTTP ヘッダー(Authorization: Bearer <token>) |
外部 API 呼び出しが主目的、トークンだけを送信したいケース | TLS 必須。サーバ側でヘッダーのロギングを無効化。 |
| JSON ペイロード(暗号化済み or プレーン) | 複数パラメータ同時送信、AI のプロンプトに機密情報を埋め込む必要がある場合 | 送信前に AES‑256‑GCM 等で全体暗号化。受取側は復号ロジック必須。 |
| 環境変数(CI / コンテナ) | スクリプト内だけで使用し、外部へ露出させたくないケース | プロセス終了後に unset VAR。Docker イメージには埋め込まない。 |
具体的な選定フロー
- データの種類:単一トークンか複合情報か
- 受信側の実装可否:暗号化ペイロードを復号できるか
- 運用上の管理コスト:鍵ローテーションやログマスキングが必要か
このフローに従えば、過剰な権限付与や不要な暗号化・復号実装を避けられます。
最小権限で発行した API トークンの管理例
|
1 2 3 4 5 |
# 1Password CLI を使って最小権限トークンを取得し、Vault に保存 op item add "AI Service Token" \ --vault=ai-tools \ password="$(op create token --scope="read:MyVault/DatabaseCredentials")" |
- スコープは
read:<vault>/<item>の形式で絞り込み - 有効期限は 30 日程度に設定し、CI 用ジョブが失敗したら自動ローテーションするスクリプトを用意
アクセス・監査ログの活用例
|
1 2 3 4 |
# CLI 実行履歴(JSON)取得 → CloudWatch Logs に送信例 op event list --type token --format json | aws logs put-log-events \ --log-group-name "1Password/CLI" --log-stream-name "$(date +%Y-%m-%d)" |
- 重要ポイント:ログにはトークン文字列は含めず、
tokenIdのみ記録してマスク処理を徹底 - AI 側のリクエスト IDと突き合わせることで「不正利用」の疑いがあるケースを自動検知できる
セキュリティベストプラクティスとトラブルシューティング
実運用でよく直面する問題と、その対策をまとめます。ここまでの手順を踏んでも、環境差異や権限設定ミスでエラーになるケースがあります。
最小権限原則の具体的適用例(粒度別)
| 粒度 | 設定例 | 効果 |
|---|---|---|
| Vault | MyVault にだけ read 権限付与、他 Vault は none |
不要データへのアクセス遮断 |
| Item | DatabaseCredentials のみ対象にスコープ指定 (read:MyVault/DatabaseCredentials) |
アイテム単位で漏洩リスク低減 |
| Permission(Service Account) | CI 用 Service Account に限定し、ユーザーインタラクション不要 | 人的ミス・社内情報流出防止 |
CLI バージョン差異とアップデート手順
- 2.9 系以下:
op readが非推奨。代わりにop get item --field passwordを使用 - 最新バージョンへの更新(例: macOS)
|
1 2 |
brew upgrade 1password/tap/op |
- Linux (apt)
|
1 2 |
sudo apt-get update && sudo apt-get install -y op |
公式情報確認先:https://developer.1password.com/docs/cli/install
よくあるエラーと対処法(実践的チェックリスト)
| エラー | 主な原因 | 推奨対策 |
|---|---|---|
Authentication failed |
トークン期限切れ、またはスコープ不足 | 新しいトークンを取得し、OP_SESSION_… を再設定 |
Permission denied |
アイテムへの read 権限が無い |
管理コンソールで対象アイテムの権限を追加 |
Network timeout |
社内プロキシ未設定、DNS 解決失敗 | 環境変数 OP_PROXY, HTTPS_PROXY を設定 |
CLI version mismatch |
スクリプトが古い構文を使用 | op --version で確認し、公式リリースノートに従って修正 |
自動通知:CI が失敗したら Slack/Webhook にエラーログを送信する仕組みを追加すると、早期検知が可能です。
まとめ
- 前提条件と環境構築では、公式アカウント作成・CLI インストール・API トークン取得までの流れを網羅し、最新バージョンは公式ダウンロードページで随時確認することが重要です。
- インストール手順は OS 毎にエラーハンドリングと PATH 設定を明示し、特に Windows PowerShell では例外処理と自動クリーンアップを実装しました。
- トークン保存先比較で、OS 標準シークレットストアと 1Password の
op vaultを対比し、CI/CD では統一的にop vaultを利用することを推奨します。 - CLI 基本操作は取得コマンド例と、環境変数・一時ファイルへの安全な注入パターンを示しました。
- Node.js SDK と暗号化サンプルでは、AES‑256‑GCM によるペイロード暗号化実装を提供し、AI ツール(Claude Code 等)へ送信する際の安全性を強化しました。
- AI 連携パターンはヘッダー・JSON・環境変数の選択基準と最小権限トークン管理例、監査ログ活用方法を網羅しています。
- セキュリティベストプラクティス & トラブルシューティングでは、粒度別権限設定、CLI バージョン差異への対処、典型的エラーのチェックリストを提供し、実運用での障害復旧を容易にします。
上記手順とベストプラクティスを遵守すれば、1Password AI ツール連携は安全・自動化された形で実装でき、機密情報が漏洩するリスクを最小限に抑えることが可能です。
本稿の内容は 2026‑05 時点の公式情報に基づいていますが、バージョンや UI が変わる可能性があります。必ず公式ドキュメント(https://developer.1password.com/docs/cli)を最新状態で確認してください。