0Pricing
AI Agents · レッスン

ツールのアクセス制御

ツールは、エージェントだけでなくユーザー本人が認可されていることを確認する必要があります — エージェントはプリンシパルではありません。

「ツールのアクセス制御」は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フィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. Prompt Injection対策
  2. 出力フィルタリング(Llama Guard、NeMo)
  3. コードエージェントのサンドボックス実行
  4. ツールのアクセス制御
← AI Agentsに戻る