Skip to content

[Audit/Tracing] 실행·RAG·배포 감사 이벤트의 조직 스코프 정합성 보강 #387

Description

@yoonki1207

목적

실행·RAG·배포 감사 이벤트에 DB 리소스를 기준으로 확정한 조직 범위와 안전한 추적 메타데이터를 기록한다.

내부 챗봇의 실제 로그인 사용자가 수행한 실행을 현재 조직의 관리자 감사 화면에서 workflow·KB·모델·비용과 함께 조회할 수 있도록 한다.

문제

관리자 감사 조회는 audit_metadata.organization_id를 기준으로 조직 범위를 제한하지만, workflow 실행·RAG 검색·배포 이벤트 일부가 해당 값을 기록하지 않는다.

그 결과 이벤트가 저장돼도 조직 감사 화면에 나타나지 않으며, 실행 사용자와 workflow·KB·선택 모델·비용을 하나의 흐름으로 추적할 수 없다.

구현 범위

조직 범위

  • audit_logs에 별도 organization 컬럼을 추가하지 않는다.
  • 기존 규칙인 audit_metadata.organization_id를 사용한다.
  • organization ID는 요청이나 실행 context 값을 그대로 신뢰하지 않는다.
  • Workflow·App·Knowledge Base의 DB 값을 조회해 조직 범위를 확정한다.

대상 이벤트

workflow.deploy

  • organization ID
  • workflow ID
  • deployment ID
  • request ID
  • correlation ID

workflow.execute

  • organization ID
  • workflow ID
  • workflow run ID
  • 실제 로그인 사용자 actor
  • 선택 모델
  • 입력·출력 토큰
  • 실행 비용
  • request ID
  • correlation ID

rag.retrieve

  • organization ID
  • workflow run ID
  • node ID
  • Knowledge Base ID
  • 허용된 검색 결과 수
  • request ID
  • correlation ID

Actor 기록

  • 내부 챗봇 실행에서는 App 또는 Workflow 소유자가 아닌 실제 로그인 사용자를 actor로 기록한다.
  • 실행 context의 execution_subject와 DB 리소스 범위를 검증해 actor와 organization을 연결한다.

관리자 조회

  • 필요한 실행·RAG·배포 필드를 감사 상세 metadata allowlist에 추가한다.
  • 현재 선택한 조직의 감사 목록과 상세에서만 이벤트를 조회할 수 있어야 한다.
  • 다른 조직의 이벤트는 목록에서 제외하고 직접 상세 조회도 404로 숨긴다.
  • 기존 감사 이벤트를 중복 생성하지 않고 현재 producer를 보강한다.

보안

다음 정보는 감사 metadata, API 응답, 일반 로그 및 화면에 노출하지 않는다.

  • 원문 질문과 답변
  • 문서 및 RAG chunk 내용
  • 권한 없는 문서의 ID·제목·개수
  • credential 원문
  • API key, token, encrypted config
  • raw provider request·response

완료 조건

  • workflow.deploy, workflow.execute, rag.retrieve 이벤트에 audit_metadata.organization_id가 기록된다.
  • organization ID가 요청값이 아닌 Workflow·App·KB의 DB 값으로 확정된다.
  • 내부 챗봇 실행 actor가 실제 로그인 사용자로 기록된다.
  • 배포 이벤트에 workflow·deployment ID가 포함된다.
  • 실행 이벤트에 workflow run·선택 모델·토큰·비용이 포함된다.
  • RAG 이벤트에 workflow run·node·KB ID와 허용된 검색 결과 수가 포함된다.
  • request ID와 correlation ID로 관련 이벤트를 연결할 수 있다.
  • 관리자 감사 상세의 allowlist를 통과한 필드만 반환된다.
  • 동일한 사용자 동작에 감사 이벤트가 중복 기록되지 않는다.
  • 원문 질문·답변·문서·chunk·credential이 노출되지 않는다.
  • 현재 조직에서는 이벤트가 조회되고 타 조직에서는 목록 제외 및 상세 404가 적용된다.
  • 내부 챗봇 실행 → RAG 검색 → 실행 완료 → 조직 감사로그 조회 E2E 테스트가 통과한다.
  • 타 조직 비노출 및 민감정보 미노출 테스트가 통과한다.

제외 범위

  • audit_logs.organization_id 전용 컬럼 및 인덱스 추가
  • 기존 감사로그 backfill
  • audit outbox 및 내구성 구조 일반화
  • 배포 활성화·비활성화·삭제 lifecycle 보강
  • 모든 trigger mode별 E2E 테스트
  • 조직 전환 race 및 자동 갱신 UI 개선
  • 가격 미등록 모델의 비용 표현 개선

참고

  • docs/demo/onboarding-chatbot-demo-required-features.md(6.) 조직 단위 감사로그 정합성
  • docs/features/audit-tracing/
  • docs/features/admin-dashboard/
  • MBA-234: 인증 기반 내부 챗봇 배포

2026-07-17 최신 구현 매트릭스

PR #490의 Generic Audit Outbox 및 Workflow correlation 병합 결과를 현재 baseline으로 사용한다.

부분 구현됨

  • workflow.execute 경로에 DB resource에서 확정한 organization context를 전달하는 기반
  • workflow_run_id, workflow_node_run_id와 correlation 식별자를 typed field로 전달·저장하는 기반
  • 일반 비동기 audit producer의 durable audit_event_outbox 전달 경로

이 이슈에 남은 범위

  • 내부 챗봇 실행의 실제 로그인 사용자를 canonical actor로 확정
  • workflow.execute에 실제 선택 모델, input/output token과 실행 비용 기록
  • workflow.deploy의 organization/workflow/deployment/request/correlation 계약 완성
  • rag.retrieve의 organization, run, node, 허용된 KB와 result count 계약 완성
  • 관리자 audit detail allowlist와 cross-organization 목록·상세 404 검증
  • 기존 producer와 PR feat(audit): Outbox 기반 감사 이벤트 전달과 Workflow 실행 연계 구현 #490 Outbox가 같은 사용자 동작을 중복 기록하지 않는 idempotency 검증
  • 내부 챗봇 실행 → RAG → 실행 완료 → 조직 감사 조회 PostgreSQL/E2E 검증

PR #490의 구현을 되돌리거나 별도 audit delivery 구조를 만들지 않는다. 기존 producer와 Outbox envelope를 확장해 남은 필드를 채우며, 위 미완료 항목이 끝나기 전에는 이 이슈를 완료로 보지 않는다.

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Fields

    Priority

    None yet

    Projects

    Status
    Backlog

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions