ai-セキュリティ
AIがあなたのStripeキーを一度も見ずに使う仕組み
あなたのStripeキーで顧客に請求しながら、そのキーはAIモデルのコンテキストに一度も入らない。lodosのランタイムシークレット注入パターンを解説します。
あらゆる「AIエージェント」製品が直面する、居心地の悪いトレードオフがあります。役に立つ仕事をするには、エージェントにあなたの認証情報が必要です。顧客に請求するにはStripeキーが、デプロイするにはクラウドトークンが要ります。よくある答えは、それらのシークレットをモデルに渡して、何も漏れないことを祈ることです。
私たちは祈りたくありませんでした。そこでlodosは、漏洩が構造的に不可能になるよう設計され、誰かがその原則を破った時点でビルドが失敗するようになっています。
モデルにシークレットを渡すことの問題
平文のシークレットがいったん言語モデルのコンテキストに入ると、もう制御は失われます。それはトランスクリプトに、tool callに、ログに、モデルが後で書く要約に、あるいは巧妙に言い回された追質問への回答に、表面化しうるのです。プロンプトインジェクション、つまりエージェントが読むWebページやメール、ドキュメントに仕込まれた悪意ある指示は、その潜在的なリスクを能動的な情報流出経路へと変えてしまいます。
正直な結論はこうです。そもそもモデルがシークレットを見るべきではない。 それ以外はすべて、設計上の欠陥の上に積み重ねた緩和策にすぎません。
参照し、注入し、監査する
lodosはあらゆる認証情報を3つの段階で扱います。
1. 参照(Referenced)
あなたのAIが値そのものを扱うことはありません。扱うのはプレースホルダーです。
{{secrets.stripe.sk_live}}
この参照こそが、チャットでもワークフローでもタスクでも、モデルが目にするすべてです。モデルはStripeキーを使うことについて推論できますが、キーそのものを保持することは一切ありません。
2. 注入(Injected)
実際にジョブが認証情報を必要とするとき、lodosはそれをローカルで復号し、隔離されたサブプロセスに環境変数として渡します。モデルの視界の外で行われ、ジョブが終わった瞬間に消えます。
# The agent asked to run this; lodos resolved the reference and
# injected the real value into the subprocess environment only.
STRIPE_API_KEY={{secrets.stripe.sk_live}} ./charge-customer.sh
モデルが見るのは左側の行です。サブプロセスが受け取るのは右側の値です。この2つがトランスクリプトの中で出会うことは決してありません。
3. 監査(Audited)
すべてのアクセスは、改ざんを検知できるHMACチェーンに追記されます。ログが記録するのは、シークレットが使われたという事実であって、どの値かは決して残しません。フィールドパスは不透明であり、履歴を改変しようとすればチェーンが壊れます。
なぜポリシーをただ信用しないのか
「AIはシークレットを開示しないよう設定されている」と書いて済ませるのは簡単です。しかし私たちは、強制力がなければそれには何の価値もないと考えています。だからこそ、その保証をリリースプロセスそのものに組み込みました。
ビルド時に不変条件のスキャンがすべてのリリースで実行され、次のいずれかが破られた場合にビルドを失敗させます。
- 平文のシークレット値を返すツールは、どこにも存在しない。
- 生のモデルAPIプロバイダーは存在せず、あなた自身のログインで動く埋め込みのClaude Codeのみがある。
- レンダリング経路のどこにも
eval、Function、vm、child_processは存在しない。 - 未知のツールはfail closed(安全側に倒れて拒否)され、暗黙のうちに許可されることはない。
- エージェントは
bashを明示的に無効化した状態で動く。 - いかなる単一の許可も、プライベートデータ + 信頼できないコンテンツ + 情報流出という「致命的な三要素」を完成させられない。
- ワークフローは宣言的(declarative)のみであり、コードを実行する経路は存在しない。
将来のコミットがモデルにシークレットを渡すツールを追加すれば、そのリリースは単に出荷されません。
何を拒み、代わりに何を出荷したか
この制約は、機能を減らすのではなく、より良い設計を強いました。
| 拒んだもの | 代わりに出荷したもの |
|---|---|
| AIが直接呼び出す生のモデルAPI | あなた自身のログインで動く埋め込みのClaude Code |
| AIにホストコマンド(bash)を実行させること | ランタイムのサブプロセス注入、シークレットを見ない方式 |
ワークフロー内の eval() |
宣言的なYAML、実行されるコード経路なし |
| 画像生成のスライド(クラウドへの送信) | オフラインのテキストスライド、ネットワークゼロ |
漏らすことを拒んでも、能力は失われませんでした。むしろ研ぎ澄まされたのです。
まとめ
AIエージェントに認証情報を渡さずに、本物の、認証を伴う仕事を任せることはできます。シークレットはあなたのマシン上で暗号化されたまま留まり、使用の瞬間にだけサブプロセスへ入り、モデルのコンテキストへ越えることは決してありません。
それがlodosの根底にある考え方そのものです。あなたのAIはあなたの仕事を見るが、シークレットは見ない。詳しくはセキュリティアーキテクチャをご覧いただくか、lodosをダウンロードして、あなたのエージェントにキーではなく仕事を与えてみてください。