はじめに
アシスタントはすでに documents.read だけを使えますが、許可されたツールも禁止された文書を要求できます。新しい学習インスタンスでは、オブジェクトのポリシーがすべての読み取りを許可しています。
小さな Python 規則を 2 段階で追加します。まず所有者を保護し、次に明示的な共有を維持します。サーバーは提案の引数ではなく認証セッションから識別情報を得ます。文書は合成データで提案は明示された再生ですが、読み取りと認可は実際のものです。前のラボのターミナル技能だけで進められ、Python 構文はここで説明します。
認証済み所有者に読み取りを結び付ける
このステップでは、許可されたツールが他のユーザーの非公開文書へ越境することを防ぎます。
このステップを始めるには、ラボ画面の Test Client タブを選択してください。
次のアクセス表を使います。owner と shared_with は保存済みの文書フィールドであり、提案の値ではありません。
| 文書 | 所有者 | 共有相手 | Alice が読める | Bob が読める |
|---|---|---|---|---|
alice-notes |
alice |
なし | はい | いいえ |
bob-notes |
bob |
なし | いいえ | はい |
team-plan |
bob |
alice |
はい | はい |
Test Client タブで --as bob は準備済みの Bob の認証情報を選び、省略すると Alice を選びます。最初に正常な所有者の読み取りを確認します。
次のコマンドを実行する前に、Test Client タブに切り替えてください。
assistant call documents.read alice-notes
HTTP 200 と Alice の内容が期待されます。次にオブジェクトチェックの欠落を再現します。
assistant call documents.read bob-notes
誤って HTTP 200 と Synthetic Bob private budget が返ります。実際の個人の非公開情報は使っていません。ツール許可リストだけではオブジェクトを保護できませんでした。
Policy Editor タブで小さなポリシーを確認します。
次のコマンドを実行する前に、Policy Editor タブに切り替えてください。
cat /home/labex/project/policy.py
def can_read(principal, doc): は入力が 2 つある関数を定義します。字下げされた return True は現在全員を許可しています。Python の辞書は名前付きフィールドを保存します。principal["id"] は認証済み識別情報、doc["owner"] は保存済み所有者を読みます。== は値を比較し、真か偽のブール値を返します。先頭の空白 4 文字で return を関数内に置きます。
関数を所有者比較に置き換えます。前のラボと同じ文字をそのまま扱うヒアドキュメントでファイル全体を書きます。
cat > /home/labex/project/policy.py <<'EOF'
def can_read(principal, doc):
return doc["owner"] == principal["id"]
EOF
Test Client タブで他のユーザーの非公開文書要求を繰り返します。
次のコマンドを実行する前に、Test Client タブに切り替えてください。
assistant call documents.read bob-notes
HTTP 403 と document_denied が期待されます。tool_denied と異なり、読み取り操作は許可されてもこのオブジェクトは Alice に禁止されています。逆方向も試します。
assistant --as bob call documents.read alice-notes
これも拒否する必要があります。Bob 自身の文書は読み取り可能なままにします。
assistant --as bob call documents.read bob-notes
HTTP 200 が期待されます。すべての読み取りが policy_error で失敗したら Policy Editor タブに切り替え、字下げと引用符を保って編集を繰り返します。読み取りを再試行する前に Test Client タブに戻ってください。サーバーは要求ごとに関数を再読み込みします。この中間の所有者規則は意図的にまだ共有を復旧しません。次のステップで行います。
申告されたユーザーを信じず共有を復旧する
このステップでは保存された共有を許可し、提案内の偽造識別情報を拒否します。
このステップを始めるには、ラボ画面の Policy Editor タブを選択してください。
Bob が明示的にアクセスを許しても、所有者規則は Alice の共有文書 team-plan をブロックします。Python の in はリストへの所属を調べ、or はどちらかの条件が満たされれば許可します。所有者条件と保存された共有リストへの所属を組み合わせます。Policy Editor タブで実行します。
次のコマンドを実行する前に、Policy Editor タブに切り替えてください。
cat > /home/labex/project/policy.py <<'EOF'
def can_read(principal, doc):
return doc["owner"] == principal["id"] or principal["id"] in doc["shared_with"]
EOF
Test Client タブで正当な共有を確認します。
次のコマンドを実行する前に、Test Client タブに切り替えてください。
assistant call documents.read team-plan
HTTP 200 と Synthetic shared project plan が期待されます。次に偽造識別情報を送ります。--claim bob は信頼できないツール引数に user_id: bob を加えるだけで、Bob の認証情報を選択しません。
assistant replay documents.read bob-notes --claim bob
HTTP 403、主体 alice、document_denied が期待されます。サーバーはポリシー呼び出し前に実際の認証情報を Alice に対応付け、引数の身元申告を無視します。直接ハンドラーでも試します。
assistant call documents.read bob-notes --claim bob
同じように拒否しなければなりません。--as bob と --claim bob は意図的に意味が異なります。前者は準備済みの Bob の認証情報を使い、後者は提案の中の単なるテキストです。
Assistant Tool Lab タブに切り替え、alice と training-alice でログインします。documents.read を選び、bob-notes を入力し、Untrusted user_id (optional) に bob を入れて Replay proposal を押します。サーバー結果が依然として alice と識別し、非公開文書を拒否することを確認します。文書を team-plan に変え、申告を消して再生すると、有用な共有読み取りは成功する必要があります。

tools.json の読み取り専用ポリシーを維持します。チェックポイントは両アカウント、両ルート、所有・共有・非公開の各例、未知の使い捨て文書を試します。文書 ID の固定、全許可、提案ユーザーへの信頼、全拒否ではこの組み合わせを満たせません。誤字は小さな関数全体を書き直して読み取りを再試行すれば復旧できます。
まとめ
認証済みの識別情報と保存済み所有・共有関係で文書アクセスを実施しました。提案の偽造フィールドは権限の根拠になりません。サーバーは所有者と共有相手の有用な読み取りを保ち、他人の非公開オブジェクトと不要な操作を拒否します。これは決定的なツール認可であり、ライブモデルの信頼性の実証ではありません。



