ツールのアクセス制御
ツールは、エージェントだけでなくユーザー本人が認可されていることを確認する必要があります — エージェントはプリンシパルではありません。
「ツールのアクセス制御」はCoddyKit上の無料AI Agentsレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはAI Agents学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 AI Agentsコースには全4レッスンが含まれています。
このレッスンの一部はまだ翻訳されておらず、英語で表示されています。
ツールはプリンシパルではありません
モデルは「ツールを呼び出す」だけですが、実際のアクションを実行するのはあなたのコードです。権限の主体となるプリンシパルはエージェントではなくユーザーであり、重要なのはユーザーの権限です。
認可は、単に「エージェントがそう決めたから」ではなく、必ずユーザーのアイデンティティに基づいて行ってください。
Authorise at the Tool Boundary
def refund_order(order_id, *, user):
order = db.get_order(order_id)
if order.customer_id != user.id and not user.is_staff:
raise PermissionError(f'User {user.id} cannot refund order {order_id}')
return stripe.refund(order.payment_id)ユーザーコンテキストを渡す
すべてのツール呼び出しにユーザーオブジェクトを渡してください:
def dispatch(tool_call, user):
args = json.loads(tool_call.function.arguments)
fn = TOOLS[tool_call.function.name]
return fn(**args, user=user)ツールごとの権限
各ロールが使用できるツールを定義してください:
ROLE_TOOLS = {
'customer': ['search_orders', 'open_ticket'],
'support': ['search_orders', 'refund_order', 'cancel_order'],
'admin': ['*']
}
visible_tools = [t for t in ALL_TOOLS if t.name in ROLE_TOOLS[user.role] or 'admin' in ROLE_TOOLS[user.role]]データアクセスの範囲を限定する
データベースを検索するツールでは、自動的にユーザーごとの範囲を指定する必要があります:
def search_orders(query, user):
# NEVER let the model bypass this WHERE clause
return db.query('SELECT * FROM orders WHERE customer_id = %s AND ...', (user.id,))すべてのツール呼び出しを監査する
誰が、何を、いつ、どの引数で実行し、どの結果になったかをログに記録します。問題が発生したときの事後調査の記録になります:
audit_log({
'user_id': user.id,
'tool': tool_name,
'args': args,
'result_status': result.status,
'timestamp': now()
})破壊的な操作を確認する
認可されたユーザーであっても、破壊的な操作は再確認してください:
def delete_account(user_id, confirmed=False, user=None):
if not confirmed:
return {'requires_confirmation': True, 'msg': 'Confirm deletion of account.'}
db.execute('DELETE ...', (user_id,))OAuth/トークンのスコープを限定したツール
外部サービス上でユーザーに代わってエージェントが操作する場合は、OAuthトークンのスコープを必要最小限に限定してください:
# Token only has gmail.send scope, not gmail.read
send_email = build_with_token(user_token_scoped_send)サービスアカウントの境界
エージェント自身のサービスアカウントには、最小限の権限だけを付与してください:
- 分析ツールには読み取り専用のDBユーザー
- 顧客ごとに分離したS3バケット
- VPCで分離されたネットワーク
Rate Limits Per Tool
def ratelimit(key, per_user_per_day=10):
counts = {}
def decorator(func):
def wrapper(user_id, *args, **kwargs):
counts.setdefault(user_id, 0)
if counts[user_id] >= per_user_per_day:
print(f'{key}: user {user_id} rate limited')
return None
counts[user_id] += 1
return func(user_id, *args, **kwargs)
return wrapper
return decorator
@ratelimit(key='tool:refund', per_user_per_day=2)
def refund_order(user_id, order_id):
print(f'refunding order {order_id} for user {user_id}')
return True
for i in range(3):
refund_order('user1', f'order{i}')
ユーザーに表示する権限UI
エージェントがユーザーに代わって実行できることを表示します。ツールごとの権限をユーザーが取り消せるようにしてください。信頼を得るうえで重要です。
重要な操作での再認証
機密性の高いツールでは、直近の認証が5分未満であることを条件に、再認証を要求してください:
if tool.is_sensitive and user.last_auth_age_seconds > 300:
raise StaleAuthError('Please re-authenticate to perform this action.')コードと同じように認可をテストする
「ユーザーAはユーザーBの注文を返金できない」ことを確認するテストを書いてください。アクセス制御が機能すると決めつけてはいけません。アクセス制御は、エージェントのセキュリティバグの最大の原因です。
認可の原則
エージェントがツールを呼び出すとき、誰の権限を確認しますか?
要点の振り返り
プリンシパルはユーザーです。すべてのツールにユーザーのアイデンティティを渡します。データの範囲をユーザーごとに限定します。すべての呼び出しを監査します。破壊的な操作を確認します。コードと同じように認可をテストします。
よくある質問
「ツールのアクセス制御」レッスンは無料ですか?
はい。「ツールのアクセス制御」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、AI Agentsコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 AI Agentsコースには全4レッスンが含まれています。
「ツールのアクセス制御」で何を学びますか?
ツールは、エージェントだけでなくユーザー本人が認可されていることを確認する必要があります — エージェントはプリンシパルではありません。 ブラウザで直接実行するハンズオンコードでAI Agentsを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
AI Agentsを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのAI Agentsは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。
「ツールのアクセス制御」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このAI Agentsレッスンでコードを書いて実行できますか?
はい。すべてのAI Agentsレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。