Введение
Ассистент уже ограничен documents.read, но разрешённый инструмент всё ещё может запросить запрещённый документ. Вы обслуживаете новую учебную среду, где политика объектов разрешает любое чтение.
Добавьте небольшое правило Python в два этапа: сначала защитите владение, затем сохраните явный общий доступ. Сервер получает личность из подтверждённой сессии, а не аргументов предложения. Все документы синтетические, все предложения явно воспроизводятся; чтение и авторизация реальны. Достаточно навыков терминала предыдущей работы; синтаксис 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): определяет функцию с двумя входами. Строка с отступом return True пока разрешает всем. Словарь Python хранит именованные поля: principal["id"] читает подтверждённую личность, а doc["owner"] — сохранённого владельца. == сравнивает значения и возвращает логическое значение, истину или ложь. Четыре начальных пробела оставляют return внутри функции.
Замените функцию сравнением владельца. Тот же буквальный here-document из прошлой работы записывает весь файл:
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 в интерфейсе лабораторной работы.
Правило владельца блокирует Alice для team-plan, хотя Bob явно предоставил доступ. В 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, principal 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, укажите bob в Untrusted user_id (optional) и нажмите Replay proposal. Убедитесь, что результат сервера всё ещё определяет пользователя как alice и отказывает в частном документе. Измените документ на team-plan, очистите заявление о личности и повторите: полезное общее чтение должно работать.

Сохраните политику только чтения в tools.json. Проверка испытывает обе личности, оба маршрута, владение/общий/закрытый доступ и неизвестные одноразовые документы. Жёсткие ID, разрешение всем, доверие предложенной личности или полный запрет не удовлетворяют этой матрице. Опечатка исправляется полной перезаписью небольшой функции и повтором чтения.
Резюме
Вы обеспечили доступ к документам по подтверждённой личности и сохранённым сведениям о владении или общем доступе. Поддельное поле предложения не становится полномочием. Сервер сохраняет полезное чтение своих и общих документов, запрещая чужие закрытые объекты и лишние операции. Это детерминированная авторизация инструментов, а не надёжность работающей модели.



