AI エージェントが API を呼び出しています: バックドアを作成する 5 つの認証ミス
チームの 80% が本番環境で AI エージェントを実行していますが、AI エージェントを独立したアイデンティティとして扱っているチームは 22% のみです。 API をオープンドアにしてしまう 5 つの認証ミス。
900 人以上の実務者を対象とした 2026 年の調査では、エンジニアリング チームの 80.9% がテストまたは本番環境で AI エージェントを実行していることがわかりました。 同じ調査では、これらのエージェントを独立したアイデンティティを持つエンティティとして扱っているのは 21.9% だけであることがわかりました。 残りのシェアは 資格情報を取得し、監査証跡をスキップし、監視なしで実行されるコードへの包括的な API アクセスを許可します。
このギャップはセキュリティ上の問題です。 OWASP は、2026 年のエージェント アプリケーションのトップ 10 とツールの誤用および 特権エスカレーションは、報告されたインシデント 520 件でリストのトップにあります。 メタは、すべてのパスを通過した不正な AI エージェントを文書化しました。 混乱した代理シナリオからの有効な資格情報を保持しているため、ID チェックが行われませんでした。 48.9% の組織はそれができません エージェントが API アクセスを使って何をしているのかも確認できます。
この投稿では、API を AI エージェントの扉に変える 5 つの認証の間違いと、それぞれを閉じる方法について説明します。 1つは動作するコードを備えたものです。
間違い 1: すべてのエージェントで単一の API キーを共有する
チームの 44% が AI エージェントに静的 API キーを使用しています。 複数のエージェントが 1 つのキーを共有すると、次の 3 つのものが失われます。 証跡 (どのエージェントがこのリクエストを行ったのか?)、詳細な取り消し (1 つのエージェントを取り消すとすべてのエージェントが停止されます)、および エージェントごとのレート制限 (1 人の暴走エージェントがすべてのエージェントのクォータを使い果たす)。
# Three different agents share one API key
# Agent A: summarizes support tickets
# Agent B: processes refunds
# Agent C: exports customer PII
curl -X POST https://api.acme.com/v1/customers/export \\
-H "Authorization: Bearer sk_live_shared_key_for_all_agents" \\
-H "Content-Type: application/json" \\
-d '{"format": "csv", "include_pii": true}'
# Which agent made this request? You can't tell.
# Need to revoke Agent C? You break A and B too.
修正: エージェントごとに一意の認証情報を発行します。 各キーは、特定のエージェント ID、定義されたスコープにマップされます。 エンドポイントと独自のレート制限。 エージェント C を取り消す必要がある場合、エージェント A と B は実行を続けます。
# Each agent gets its own scoped API key
curl -X POST https://api.acme.com/v1/tickets/summary \\
-H "Authorization: Bearer sk_live_agent_a_tickets_readonly" \\
-H "X-Agent-ID: agent-ticket-summarizer" \\
-H "Content-Type: application/json" \\
-d '{"ticket_id": "TKT-4829"}'
を使用します。 X-Agent-ID ヘッダーを API キーの横に追加することで、ログは常にリクエストを
特定のエージェント。 トークンをデコードして、そのクレームが通話を行っているエージェントと一致することを確認します。
# Inspect what permissions an agent token carries
curl -s -X POST https://api.botoi.com/v1/jwt/decode \\
-H "Content-Type: application/json" \\
-d '{"token": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJhZ2VudC1yZWZ1bmQtcHJvY2Vzc29yIiwic2NvcGVzIjpbInJlZnVuZHM6d3JpdGUiLCJvcmRlcnM6cmVhZCJdLCJleHAiOjE3NDk2MDAsMDAwLCJpc3MiOiJhY21lLWF1dGgifQ.signature"}'
{
"success": true,
"data": {
"header": {
"alg": "RS256",
"typ": "JWT"
},
"payload": {
"sub": "agent-refund-processor",
"scopes": ["refunds:write", "orders:read"],
"exp": 1749600000,
"iss": "acme-auth"
}
}
}
混乱した副官の問題: メタの不正エージェント事件は、エージェントが 意図された範囲を超えたアクセスを許可する有効な資格情報。 エージェントはすべての身元検査に合格しました。 の 資格情報は正当なものでした。 問題は、誰もエージェントの目的に範囲を限定しないことでした。
間違い 2: エージェントが 1 つのエンドポイントを必要とするときに完全な API アクセスを許可する
組織の 35% は AI エージェントの共有サービス アカウントに依存しています。 完全な API アクセスを持つサービス アカウント つまり、チケット要約エージェントは払い戻しの処理、顧客 PII のエクスポート、レコードの削除も行うことができます。 これは最小特権違反の原則です。
各エージェント トークンの範囲を、必要な最小限のエンドポイントとアクションに設定します。 返金処理エージェントは、
refunds:write そして orders:read。 それ以上は何もありません。
// Mint a scoped token for each agent at deploy time
interface AgentTokenClaims {
sub: string; // unique agent identity
scopes: string[]; // minimum required permissions
exp: number; // short TTL: 1-24 hours
iss: string; // your auth service
rate_limit: number; // requests per minute for this agent
}
const agentClaims: AgentTokenClaims = {
sub: "agent-refund-processor",
scopes: ["refunds:write", "orders:read"],
exp: Math.floor(Date.now() / 1000) + 3600, // 1 hour
iss: "acme-auth",
rate_limit: 30,
};
エージェントをデプロイする前に、そのトークンが正しいスコープを持っており、有効期限が切れていないことを確認してください。 デコードする
Botoi JWT エンドポイントを使用してトークンを作成し、クレームと is_expired フラグ。
# Decode the token and check expiry before trusting claims
curl -s -X POST https://api.botoi.com/v1/jwt/decode \\
-H "Content-Type: application/json" \\
-d '{
"token": "eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJhZ2VudC10aWNrZXQtc3VtbWFyaXplciIsInNjb3BlcyI6WyJ0aWNrZXRzOnJlYWQiXSwiZXhwIjoxNzQ5Njg2NDAwfQ.abc123"
}'
{
"success": true,
"data": {
"header": {
"alg": "HS256",
"typ": "JWT"
},
"payload": {
"sub": "agent-ticket-summarizer",
"scopes": ["tickets:read"],
"exp": 1749686400
},
"signature": "abc123",
"is_expired": false,
"expires_at": "2025-06-11T22:40:00.000Z",
"expires_in_seconds": 3600
}
}
| アプローチ | スコープ制御 | 失効 | Audit trail | リスク |
|---|---|---|---|---|
| 共有サービスアカウント | なし | すべてのエージェントを破壊します | 出典なし | 高い |
| エージェントごとの静的 API キー | Key-level only | エージェントごと | キーによる | 中くらい |
| エージェントごとのスコープ付き JWT | エンドポイント + アクション | エージェントごと + 有効期限 | 全額請求 | 低い |
| OBOトークン交換 | 継承 + 縮小 | セッションごと | フルチェーン | 最低 |
AI エージェント用の新しい IAM ソリューションは、On-Behalf-Of (OBO) トークン交換をサポートします。 エージェントはトークンを受け取ります 元のユーザーのセッションから派生し、ユーザーが付与したアクセス許可に自動的にスコープが設定されます。 これ このアプローチでは、ユーザーからエージェント、API までの完全な認可チェーンが作成されます。
間違い 3: エージェントの認証情報に有効期限がない
チームの 43% が AI エージェントにユーザー名/パスワード認証を使用しています。 これらの資格情報には有効期限がありません。 静的 API システムに有効期限を組み込んでいない限り、キーの有効期限も切れません。 永久に存続するエージェント資格情報 認証情報は、盗まれたり、ログに漏洩したり、リポジトリにコミットされ、数か月後に悪用される可能性があります。
エージェント トークンの最大 TTL を 1 ~ 24 時間に設定します。 デプロイごとに、またはデプロイごとに新しい認証情報を生成します。 スケジュール。 Botoi パスワード ジェネレーターを使用して、HMAC 署名用の高エントロピー シークレットを作成します。
# Generate a high-entropy secret for HMAC signing
curl -s -X POST https://api.botoi.com/v1/password/generate \\
-H "Content-Type: application/json" \\
-d '{"length": 64, "uppercase": true, "lowercase": true, "numbers": true, "symbols": false}'
{
"success": true,
"data": {
"password": "kX9mT2vR8nL4wQ6jY3bA5cF7hD1gP0sE9uI2oK4lM6nB8xZ3vC5tR7yW0qJ1aG"
}
}
HMAC リクエスト署名の追加
トークンベースの認証を超えて、HMAC-SHA256 を使用して各リクエスト ペイロードに署名します。 API は署名を事前に検証します。 リクエストを処理しています。 これは、ペイロードが転送中に改ざんされていないことを証明し、各リクエストを 特定のエージェントの秘密。
# Sign a request payload so your API can verify the sender
PAYLOAD='{"agent_id":"agent-refund-processor","action":"refund","order_id":"ORD-7291"}'
curl -s -X POST https://api.botoi.com/v1/hash/hmac \\
-H "Content-Type: application/json" \\
-d "{
\\"text\\": \\"$PAYLOAD\\",
\\"key\\": \\"kX9mT2vR8nL4wQ6jY3bA5cF7hD1gP0sE9uI2oK4lM6nB8xZ3vC5tR7yW0qJ1aG\\",
\\"algorithm\\": \\"sha256\\"
}"
{
"success": true,
"data": {
"hmac": "a3f8c2d1e5b7094f6d2c8a1e3b5f7d9e4c6a8b0d2f4e6c8a0b2d4f6e8c0a2b4",
"algorithm": "sha256"
}
}
API サーバーは、保存されているエージェントのシークレットのコピーを使用して HMAC を再計算します。 ハッシュが一致する場合、 リクエストは本物です。 そうでない場合は、拒否してください。
シークレットのローテーションを自動化する
手動ローテーションは、数十のエージェントを実行する場合には拡張できません。 新しいファイルを生成するローテーション スクリプトを構築します。 シークレットを取得し、それをデプロイし、接続を確認してから、古いシークレットを取り消します。
import Botoi from "@botoi/sdk";
const botoi = new Botoi({ apiKey: process.env.BOTOI_API_KEY });
async function rotateAgentSecret() {
// Generate a new 64-character secret
const { data } = await botoi.password.generate({
length: 64,
uppercase: true,
lowercase: true,
numbers: true,
symbols: false,
});
console.log("New secret generated. Deploy to agent, then revoke the old one.");
// Hash the new secret for storage (never store plaintext)
const hashed = await botoi.hash.sha256({ input: data.password });
console.log("Hashed for DB:", hashed.data.hash);
return { secret: data.password, hash: hashed.data.hash };
}
rotateAgentSecret();
間違い 4: マシン間呼び出しのリクエストのログをスキップする
組織の 48.9% はマシン間のトラフィックを認識していません。 人間の API 呼び出しはログに記録されますが、内部的なものは除外されます 可観測性スタックからのサービス間通信。 AI エージェントはその盲点にはまってしまいます。
エージェントが不正な動作をしたり、大量のリクエストを送信したり、その範囲外のエンドポイントにアクセスしたり、 侵害された場合、3 つの質問に答える必要があります。それは、どのエージェントが、いつ、何を触ったのかということです。 リクエストなし ログを記録している場合、どれにも答えることができません。
// Express middleware: log every agent request
app.use("/v1/*", (req, res, next) => {
const agentId = req.headers["x-agent-id"] || "unknown";
const start = Date.now();
res.on("finish", () => {
const log = {
timestamp: new Date().toISOString(),
agent_id: agentId,
method: req.method,
path: req.path,
status: res.statusCode,
duration_ms: Date.now() - start,
ip: req.ip,
user_agent: req.headers["user-agent"],
};
console.log(JSON.stringify(log));
});
next();
});
すべてのリクエストのエージェント ID、エンドポイント、HTTP メソッド、ステータス コード、および継続時間をキャプチャします。 構造化されたものを送信する 可観測性プラットフォームにログを記録します。 異常に対するアラートを設定する: リクエスト量の突然の急増、 エージェントの範囲外のエンドポイント、またはエラー率の上昇。
エージェントが送信した内容ではなく、送信した内容を追跡します。 リクエストのペイロード ハッシュをログに記録します
(使用して /v1/hash) メタデータの横にあります。 これにより、改ざんの証拠を得ることができます。
機密ペイロードをログ システムに保存します。
間違い 5: エージェントの認証を人間の認証と同じように扱う
自社の IAM システムがエージェント ID を管理できると確信しているセキュリティ リーダーはわずか 18% です。 残りの 82% のボルト エージェントは、自律的な発信者向けに設計されていない人間の認証フローにアクセスします。
人間による認証では、ユーザーが OAuth 同意画面を読み、パスワードを入力し、MFA プロンプトに応答することを前提としています。 エージェントはそんなことはしません。 3 つのプロパティを持つ別の認証モデルが必要です。
1. 明示的な権限を持つスコープ付きトークン
各エージェント トークンは、どのエンドポイントを呼び出すことができるか、およびどのアクションを実行できるかを宣言します。 API はこれらを強制します。 すべてのリクエストのスコープ。 範囲もアクセスもありません。
2. ID ごとのレート制限
人間のユーザーは 1 分あたり数件のリクエストを送信します。 エージェントは数百または数千のメッセージを送信します。 エージェントごとのレート制限 アイデンティティは、あるエージェントが他のエージェントを飢えさせることを防ぎ、エージェントが不正行為を行った場合の爆発範囲を制限します。
3. すべてのレイヤーで帰属をリクエストする
すべてのリクエストは、エージェント ID をエッジ プロキシからアプリケーション層を介してデータベースに運びます。 クエリログ。 何か問題が発生した場合、エージェントからアクションまでの完全なパスを追跡します。
Botoi SDK を使用してエージェント トークンを監査する
JWT エンドポイントとパスワード エンドポイントを 1 つの監査関数に結合します。 トークンをデコードし、有効期限を確認し、 署名を検証し、範囲が広すぎるとフラグを立てます。
import Botoi from "@botoi/sdk";
const botoi = new Botoi({ apiKey: process.env.BOTOI_API_KEY });
async function auditAgentToken(token: string, secret: string) {
// Step 1: Decode to inspect claims
const decoded = await botoi.jwt.decode({ token });
const claims = decoded.data.payload;
console.log("Agent:", claims.sub);
console.log("Scopes:", claims.scopes);
// Step 2: Check expiration
const now = Math.floor(Date.now() / 1000);
const hoursLeft = (claims.exp - now) / 3600;
if (hoursLeft < 0) {
console.error("Token expired", Math.abs(hoursLeft).toFixed(1), "hours ago");
return { valid: false, reason: "expired" };
}
if (hoursLeft > 24) {
console.warn("Token lives longer than 24 hours; rotate sooner");
}
// Step 3: Verify signature
const verified = await botoi.jwt.verify({ token, secret, algorithms: ["HS256"] });
if (!verified.data.valid) {
console.error("Signature verification failed");
return { valid: false, reason: "invalid_signature" };
}
// Step 4: Check scope breadth
const dangerousScopes = claims.scopes.filter(
(s: string) => s === "*" || s === "admin" || s.endsWith(":*")
);
if (dangerousScopes.length > 0) {
console.warn("Overly broad scopes:", dangerousScopes);
}
return { valid: true, agent: claims.sub, scopes: claims.scopes, hoursLeft };
}
const result = await auditAgentToken(process.env.AGENT_TOKEN!, process.env.SIGNING_SECRET!);
console.log(result);
このチェックは、展開前の手順として実行します。 トークンの有効期限が切れている場合、TTL が 24 時間を超える場合、署名は失敗します。 検証を行ったり、ワイルドカード スコープを保持したりすると、展開がブロックされます。
AI エージェント API 認証のチェックリスト
| チェック | 何を確認するか | Botoi エンドポイント |
|---|---|---|
| エージェントごとに一意の ID | 2 人のエージェントがキーやトークンを共有することはありません sub 請求 |
/v1/jwt/decode |
| 最小範囲 | トークンのスコープはエージェントの目的と一致します。 ワイルドカードなし | /v1/jwt/decode |
| トークンの有効期限 | TTL は 24 時間未満。 リフレッシュメカニズムの導入 | /v1/jwt/decode |
| 署名を要求する | ペイロード HMAC がサーバー側で一致する | /v1/hash/hmac |
| シークレットローテーション | シークレットはデプロイ時またはスケジュールに従ってローテーションします | /v1/password/generate |
| リクエストのロギング | すべてのエージェントのリクエストは ID とペイロード ハッシュとともに記録されます | /v1/hash |
調査データは明らかです。チームは AI エージェントを保護するよりも早く展開します。 80.9% ではエージェントが実行されていますが、 これらのエージェントに独自のアイデンティティを与えているのは 5 人に 1 人未満です。 このリストにあるすべての間違い、共有キー、広範な範囲、 永続的な認証情報、サイレントトラフィック、人間の形をした認証は、次の混乱した代理人を待つバックドアです 事件。
このリストから間違いを 1 つ選んでください。 今週中に直してください。 次に進みます。
FAQ
- AI エージェントは人間のユーザーと同じ API キーを使用する必要がありますか?
- いいえ、AI エージェントには、範囲限定のアクセス許可、ID ごとのレート制限、および自動有効期限を備えた専用の認証情報が必要です。 900 人以上の実務者を対象とした 2026 年の調査では、エージェントを独立した ID を持つエンティティとして扱っているチームは 21.9% のみで、44% は依然としてエージェント間で静的 API キーを共有していることがわかりました。
- ダウンタイムなしで AI エージェントの API キーをローテーションするにはどうすればよいですか?
- 新しい認証情報を生成してエージェントに展開し、機能することを確認してから、古いキーを取り消します。 有効期間の短いトークン (1 ~ 24 時間) を自動更新で使用すると、手動の手順を行わずにローテーションが行われます。 Botoi /v1/password/generate エンドポイントは高エントロピーのシークレットを作成し、/v1/jwt/decode はカットオーバー前に新しいトークンを検査します。
- エージェント アプリケーションの OWASP トップ 10 とは何ですか?
- 2026 年にリリースされた「OWASP Top 10 for Agentic Applications」には、AI エージェントが API やツールと対話する際の最も一般的なセキュリティ リスクがリストされています。 ツールの不正使用と権限昇格は、報告されたインシデント 520 件でトップとなっています。 その他のリスクには、不十分なアクセス制御、監査証跡の欠落、混乱した代理攻撃などがあります。
- AI エージェントからのマシン間の API トラフィックをどのように監視しますか?
- すべてのリクエストをエージェント ID、タイムスタンプ、エンドポイント、ペイロード ハッシュとともに記録します。 構造化された JSON ログを使用し、集中システム (Datadog、Grafana、または CloudWatch) に送信します。 2026 年の調査では、組織の 48.9% が AI エージェントのトラフィックをまったく監視できず、侵害されたエージェントや不正行為をしているエージェントに気付かないことが判明しました。
- AI エージェントの文脈における混乱した代理攻撃とは何ですか?
- 混乱した代理攻撃は、AI エージェントが正当な資格情報を使用して、オペレーターが意図していないアクションを実行するときに発生します。 エージェントは有効なトークンを保持しているため、すべての ID チェックに合格しますが、信頼できないソースからの指示に基づいて動作します。 Meta は、エージェントが意図した範囲を超えてリソースにアクセスした不正エージェント インシデントのこのパターンを文書化しました。
botoiで開発を始めよう
150以上のAPIエンドポイント。検索、テキスト処理、画像生成、開発者ユーティリティに対応。無料プラン、クレジットカード不要。