AI エージェント用のシークレットを 1password で管理する方法

更新日:2026/04/27 8:59
X(formerly Twitter)facebook
cover

こんにちは。Rimo CTO の山田です。

今回は、社内でAIエージェントの活用を進めていく中でシークレット管理の問題にぶつかったのでその話を書こうと思います。


社員に適切なツール権限を与え、それをAI エージェントに安全に渡す方法

社内でAI活用を進めるうえで、最近かなり重要になってきたのが「AI エージェントにどのように権限を渡すか」という問題です。

たとえば Claude Code のような AIエージェントを社員に使ってもらうと、単なるコード生成や調査にとどまらず、

  • Slack を操作する

  • 各種SaaSのAPIを叩く

  • 社内ツールをCLI経由で操作する

のようにツールと連携して使いたくなります。

そこで問題になるのが、ツールの認証情報をどう扱うかです。

認証情報を扱う上での課題

AI エージェントにツールの権限を渡す際には、主に以下の3つの観点で問題が出てきます。

1. セキュリティ(シークレットの扱い)

  • .env やローカルファイルにシークレットを置くと、Gitへの誤コミットやプロンプトインジェクションによる漏洩リスクがある

  • ファイルやログを通じて意図せずシークレットが公開される可能性がある

  • そのため、ファイルに残さず、実行時にのみ利用する設計により、よりリスクを低減できます

2. リスク(権限の強さ)

  • 一部のツールは API KEY 1つで広範な操作が可能

    • 例:freee や CloudSign など

  • データ更新・削除・送信などが可能なため、誤操作やプロンプトインジェクション時の影響が大きい

  • エージェントを利用する社員のリテラシーや技術力に合わせて、どこまでの権限を付与するかを決めるといった運用が必要

3. 認証(実行環境の制約)

  • Remote 環境(例:claude.ai)では人間のログイン操作が使えない

  • ローカルの認証状態も共有できない

  • そのため、API KEY やトークンベースの認証に寄せた設計が必要になる

この3点を踏まえた上で、AI エージェントに認証情報をどう渡すかを設計する必要があります。

MCPだけでは足りない

Claude Code には公式のコネクタ(MCP)の仕組みがあり、OAuth ベースでの認証が組み込まれている場合はそれがセキュリティ的にもベストです。

ただ、MCPでは足りない場面がけっこう出てきます。

  • MCPが用意されていないツールを使いたい

  • APIを直接叩きたい

  • SKILLとして既存CLIを呼びたい

ここで必要になるのが、API KEYやトークンをAIエージェントに渡すという作業です。

対象とする2つの実行環境

扱うのは以下の2パターン。

1. Local 環境

  • Claude Code / CoWork をローカルで動かす

  • 手元の環境で自由にCLIが使える

2. Remote 環境

  • claude.ai 上で Claude Code を動かす

  • 環境変数を登録して実行する形式

この2つを同じ思想で扱えるようにしたい、というのが今回のテーマです。


基本方針: シークレットは外に置いて、実行時に注入する

設計のコアはシンプルです。

  • シークレットはファイルに書かない

  • Secret Manager(今回は1Password)に集約する

  • 実行時にだけ1passwordから渡す

これにより、

  • Gitへの誤コミット事故が減る

  • 管理が1ヶ所に集まる

  • local / remote を同じ構成で管理できる

というメリットがあります。

今回はシークレットの管理ツールとして、 1Password を選択しました。

これは以下のような理由があります。

  • セキュリティに関しては実績と信頼のあるツールに利がある

  • 権限管理の仕組みがある

  • 非エンジニアが使う場合でも使いやすい


1Password の基本

1Password はパスワードやシークレットを安全に管理できるサービスで、ざっくり以下の単位で理解するとよいです。

保管庫(Vault)

シークレットを入れておく箱です。
アクセス権は基本的にこの保管庫単位で管理します。

アイテム(Item)

実際の中身です。

  • API KEY

  • パスワード

  • トークン

  • 接続情報

などを1つのアイテムとして保存します。

権限管理

誰がどの保管庫を見られるかを制御します。
ここが重要で、どの社員がどの秘密情報にアクセスできるかを明確にできます。

Service Account(SA)

人間ではなく、AI エージェントやスクリプトが使うための仮想的なユーザーアカウントのようなものです。


実践例: OPENAI_API_KEY を渡す

ここからは OPENAI_API_KEY を例に話します。

検証に使った github の実際のコードはこちらで公開しています。

1password 側でシークレットを登録

ここでは、 yyamada-ai という保管庫を作成し、 OPENAI_API_KEY というアイテムを登録しています。

image.png

local 環境で参照

ローカルでは、Service Account は基本不要で、op signin で人間がそのまま認証します。

ここでは、 1password アプリを CLI と連携させて認証をしています。

実行イメージ

必要時に 1password から認証情報を取得する方法を SKILL にしており、

以下のように OpenAI の API 呼び出しを指示すると、SKILL 経由で 1password のシークレットに安全にアクセスされます。

image.png

1password では `op://<保管庫>/<アイテム>/<フィールド名>` のような文字列が、 op run コマンド実行時に実際のシークレット文字列に置換される仕組みになっています。

ref: https://developer.1password.com/docs/cli/secret-references

image.png

remote 環境での課題

一方、claude.ai 上の remote 環境では op signin ができません。
op signin ではインタラクティブな操作が必要なため、 remote 環境だとエラーになってしまいます。

ここで初めて Service Account(SA)の出番になります。

Service Account(SA) の位置づけ

Service Account を使えば、人間によるログイン不要で、op コマンドを実行できます。

ローカル、remote での棲み分けは以下の通りです。

  • ローカル → 人間のログインを使う(SA不要)

  • remote → 人間ログインができないのでSAで代替

remote 環境の組み立て

ステップ1: SAを作る

1Password で Service Account を作成。

ステップ2: SAに保管庫を紐づける

エージェントが触ってよいシークレットが入った保管庫を紐付けます。

image.png

ステップ3: SAトークンを環境変数に

claude.ai 側に Service Account の トークンを環境変数として登録します。

ステップ4: opコマンド経由でシークレットを取得

ここでもローカル環境と同様のSKILLで、 1password のシークレットを取得してもらっています。

image.png

セキュリティ設計

1. opコマンドの直接実行は塞ぐ

Claude Code の .claude/settings.json で

  • op の直接実行は禁止 (deny)

  • 必要な処理だけ wrapper スクリプト経由で許可

という構成にします。

op item get コマンドなどシークレットの実際の文字列を直接出力するコマンドもあるため、 エージェントに直接任意の op コマンドを叩けるようにしてしまうと、プロンプト経由で任意のシークレットを閲覧・出力される余地が出てしまいます。

そこで、特定の op コマンド(op run など)だけを実行可能な shellscript を作ることで回避できます。

例: https://github.com/yyamada12/claude-code-secret-management-sample/blob/main/.claude/skills/1password/op-safe.sh

2. シークレットの取得は op run に寄せる

1password はシークレット管理に力を入れていて、op run コマンドを使うと実際のシークレットの内容がそのまま出力されないようになっています。

例えば、以下のように printenv した場合にも、 パスワードは表示されず、 <concealed by 1Password> という文字列が出力されます

export DB_PASSWORD="op://app-prod/db/password"
op run -- printenv DB_PASSWORD

https://developer.1password.com/docs/cli/reference/commands/run/#examples

運用イメージ

基本

  • 各社員は1Passwordアカウントを持つ

  • 業務で使うシークレットは保管庫に入れる

  • エージェントはその保管庫の中身を使う

remote用

  • 必要に応じてSAを作る

  • SAにアクセス権を与える

応用: Agentごとに権限を分けたい

ここまでの前提は、1つのエージェントに対して使ってよいツールの権限はまとめて渡す、というものでした。

ただ、場合によってはエージェントごとにアクセスできる権限を分けたいケースもあると思います。

そのような場合は、SAを複数作成し、それに合わせて保管庫も複数作ることを想定しています。

気をつけておきたい1password の制限

1. Service Account は最大100

1Password の制約として、 1つのアカウントで Service Account は100個までしか作れません。

https://developer.1password.com/docs/service-accounts

ここが最大の制約です。
今後 1password 側が制約を緩めてくれることに期待しています。

2. 権限管理は手動が多い

1Password では、SA 経由でユーザーのグループ管理をしたり、SA 経由で既存の保管庫の権限を管理したりするのは難しいです。

つまり「誰にアクセス権を与えるか」の権限管理は、基本的に 1Password 上での人手管理になり、権限管理自体をAIエージェントに任せることはできません。

まとめ

AI エージェントを本気で業務に入れると、「どう権限を渡すか」が問題になってきます。

今回の要点だけ並べると、

  • シークレットを1Passwordに集める

  • localでは人間の認証(op signin)を使う

  • remoteではService Account で代替する

  • AIエージェントによるopの実行コマンドは制限する

このへんを押さえておくと、実用と安全のバランスがとれた運用に落とせる、というのが今の自分の結論です。

AI エージェント用のシークレットを 1password で管理する方法 | Rimo