하나의 Amazon Bedrock Knowledge Base 인스턴스를 공유하면서 Cedar 정책과 이중 Lambda Authorizer로 부서별 문서 접근을 제어하는 RAG 보안 아키텍처를 다룬다. 부서별 별도 Knowledge Base 인스턴스 대신 메타데이터 태그로 논리 격리하고 런타임 인가로 접근을 제어해 인프라 비용과 운영 오버헤드를 줄인다.
핵심 포인트- 이중 인가 레이어: Layer 1(Lambda Authorizer — API 호출 가능 여부)과 Layer 2(미들웨어 Lambda — 어떤 Knowledge Base에 접근 가능한지)가 독립적으로 Verified Permissions를 호출하고 기본-거부 원칙으로 동작한다.
- Cedar 정책이 런타임에 적용되므로 코드 재배포 없이 정책 변경 즉시 반영된다.
- 메타데이터 사이드카 파일(.metadata.json)이 모든 문서 업로드에 대해 검증된 후에만 Bedrock 인제스션을 트리거한다.
- 벡터 유사도 검색 전에 메타데이터 필터를 적용해 미인가 문서가 검색 결과에 포함되지 않도록 한다.
- Bedrock Guardrails로 응답이 검색된 문서에 근거하는지(contextual grounding) 추가 검증한다.
상세 정리- 아키텍처 결정: 부서별 별도 Knowledge Base 대신 단일 인스턴스 공유 + 메타데이터 태그 논리 격리. 인프라 비용과 운영 오버헤드 절감이 목적. 단, 규제 요구 컴플라이언스 경계가 필요한 경우는 부서별 별도 KB 권장.
- 인제스션 파이프라인: S3 부서 접두사(docs/dept-a/report.pdf)→EventBridge ObjectCreated→SQS→Lambda가 .metadata.json 사이드카 생성→5분마다 스케줄링 Lambda가 Bedrock 인제스션 잡 트리거.
- 메타데이터 무결성: 인제스션 전에 모든 문서에 대한 사이드카 존재 여부를 검증. S3 버전 관리 + CloudTrail로 메타데이터 변조 감지. Lambda 역할 외 주체의 .metadata.json 수정 시 CloudWatch 알람 발동.
- Cedar 정책 구조: Principal(UserGroup) / Action(query, invokeModel) / Resource(KnowledgeBase, Model) 세 엔티티 타입. 부서별 허용 정책과 임원용 크로스-부서 접근 정책을 별도 관리.
- Lambda Authorizer(Layer 1): Cognito JWKS에서 JWT 서명 검증→cognito:groups 클레임 추출→그룹별 Verified Permissions IsAuthorized 호출→403 또는 통과. TTL 0이면 매 요청 평가(최신 정책), TTL 300이면 최대 5분간 폐기된 정책이 허용될 수 있다.
- 미들웨어 Lambda(Layer 2): 인증된 요청→부서별 KB 리소스에 대해 Verified Permissions 호출→허용된 부서 목록으로 메타데이터 필터 구성(단일: equals, 복수: orAll)→RetrieveAndGenerate에 필터 적용.
- 청크 설정: 300 토큰, 20% 오버랩. 임베딩 모델: Amazon Titan Text Embeddings V2.
- 모니터링: Layer 1/2 인가 거부율, Verified Permissions 지연, SQS 데드레터 큐 메시지 수, 인제스션 잡 실패율을 CloudWatch로 추적.
- 인제스션 레이스 컨디션: 문서 업로드와 사이드카 생성 사이의 짧은 창이 잠재적 취약점. 배치 처리와 사전 검증으로 완화.
왜 읽나RAG 시스템에서 멀티 부서/테넌트 접근 제어를 구현하거나, Cedar 정책 기반 동적 인가와 Bedrock Knowledge Base를 연동하려는 아키텍처/백엔드 엔지니어에게 단계별 구현 가이드.