Ограничьте каждого пользователя его документами

КибербезопасностьBeginner
Практиковаться сейчас

Введение

Ассистент уже ограничен 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, очистите заявление о личности и повторите: полезное общее чтение должно работать.

Assistant Tool Lab отказывает в частном документе другого пользователя несмотря на поддельный аргумент личности

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

Резюме

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