사용자마다 문서 접근 경계 유지

사이버 보안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 탭을 선택합니다.

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으로 바꾸고 신원 주장을 지운 후 다시 재실행합니다. 유용한 공유 읽기는 성공해야 합니다.

위조한 신원 인수에도 다른 사용자의 비공개 문서를 거부하는 Assistant Tool Lab

tools.json의 읽기 전용 정책을 유지합니다. 체크포인트는 두 계정과 두 경로, 소유·공유·비공개 사례와 처음 보는 폐기 문서를 시험합니다. 문서 ID 하드코딩, 전체 허용, 제안 사용자 신뢰, 전체 거부로는 이 조합을 만족하지 못합니다. 오타는 작은 함수 전체를 다시 쓰고 읽기를 재시도해 복구할 수 있습니다.

요약

인증된 신원과 저장된 소유권 또는 공유 관계로 문서 접근을 적용했습니다. 위조 제안 필드는 권한이 될 수 없습니다. 서버는 소유자와 공유 대상의 유용한 읽기를 유지하고 다른 사용자의 비공개 객체와 불필요한 작업을 거부합니다. 이는 결정적 도구 권한 적용이며 실시간 모델의 신뢰성 증명이 아닙니다.