본문으로 건너뛰기

워크스페이스 격리 — 보증 범위 (#2721)

이 문서는 GenD 의 워크스페이스 격리가 어디까지 보증되고 어디부터 보증되지 않는지를 코드 근거와 함께 고정합니다. 고객 문서·보안심사 답변서의 문장은 여기서 가져다 쓰고, 여기 없는 주장은 하지 않습니다.

이 문서의 목적

초과 주장을 막는 것입니다. "격리됩니다" 를 넓게 쓰면 실사에서 무너지고, 그때는 코드를 고쳐도 신뢰가 돌아오지 않습니다. 좁게 쓰고 정확하게 쓰는 것이 이 문서의 규칙입니다.

기준 커밋: main @ 9054b884 (#2703 SDK·MCP 인가, #2711 PS 버킷 펜스, #2713 마켓플레이스 publish 게이트, #2725 impersonation 감사 머지 후).

0. 근거 등급 — 모든 문장에 붙는다

주장의 강도는 근거의 출처가 결정합니다. 등급 없이 쓰인 문장은 이 문서의 문장이 아닙니다.

등급의미고객 문서 사용
[코드]소스에서 확인. 배포 설정에 따라 달라질 수 있음조건절과 함께만
[배포정의]리포의 Helm/매니페스트 값. 머지 ≠ prod 반영조건절과 함께만
[실측 YYYY-MM-DD]라이브 클러스터에서 확인단정형 가능
AKS 는 GitOps 가 아니다

kubectl apply 수동 배포이므로 리포 병합이 prod 반영을 뜻하지 않습니다. [배포정의] 등급 문장을 고객에게 단정형으로 제출하기 전 반드시 [실측] 으로 승격하십시오.

본 배포 실측값 (2026-07-30, aks-genos-prod / ns gend)

항목실측 결과
감사 무결성 체인활성 — 서명 키 Secret 존재, 라이브 로그에 hmac 필드 실재
쿼리 엔진 외부 노출없음 — Trino 백엔드 인그레스 0건, Service ClusterIP
NetworkPolicy 시행기활성 — Calico 파드 12개
권한 차단 모드whitelist / 대상 = 학습 데이터셋 테이블(접두어 ds_, 스키마 무관) + CSV 지정 스키마
SDK·MCP 인가 모드ConfigMap 미지정 → 코드 기본값 observe(관측)
크로스 워크스페이스 게시ConfigMap 미지정 → 코드 기본값 허용

1. 지금 보증할 수 있는 것

GenD 의 워크스페이스 격리는 애플리케이션(GenD API) 계층에서 시행됩니다. 최종 사용자(UI·CLI·MCP·SDK)의 데이터 조회는 모두 GenD API 를 경유하며, 카탈로그 탐색 목록은 워크스페이스별 데이터 권한(DataGrant)으로 필터링되고 — 권한을 해석할 수 없으면 아무것도 보이지 않습니다(fail-closed) — PII 컬럼 마스킹과 행 수준 필터가 적용됩니다. 쿼리 엔진은 외부에 노출되지 않으며 [실측 2026-07-30], 애플리케이션 네임스페이스에서 엔진에 도달할 수 있는 워크로드는 GenD API 와 파이프라인 오케스트레이터로 한정되어 있습니다(NetworkPolicy) [배포정의].

단서 2가지. ① 인그레스·모니터링 등 플랫폼 시스템 네임스페이스는 별도 정책으로 엔진 접근이 열려 있어, 해당 네임스페이스의 운영 통제가 함께 전제됩니다. ② 플랫폼 관리자 역할은 카탈로그 가시성과 워크스페이스 행 범위를 우회합니다(§2 참조).

이 문단 바깥은 초과 주장입니다. 인용할 때 단서 2가지를 함께 인용하십시오.

2. 쓰면 안 되는 문장

❌ "모든 데이터 조회가 GenD API 를 경유합니다"

플랫폼 자체의 배치/ETL 워크로드(Dagster)가 엔진에 직접 접속합니다. NetworkPolicy 도 이 경로를 명시적으로 허용합니다. [코드]

최종 사용자(UI·CLI·MCP·SDK)의 데이터 조회는 모두 GenD API 를 경유하며, API 계층에서 컬럼 마스킹·행 필터가 적용됩니다. 플랫폼 자체의 배치/ETL 워크로드는 예외로 엔진에 직접 접속하며, 이 경로는 사용자 입력이 아니라 플랫폼이 배포한 파이프라인 코드만 실행합니다. 통제는 코드 변경 리뷰·배포 형상관리에 의존합니다.

정정

과거 내부 분석은 "Pipeline Studio 의 사용자 작성 SQL 이 Dagster 에서 Trino 로 직접 실행된다"고 기술했으나 사실이 아닙니다. db_source 노드는 GenD API 내부 엔드포인트로 위임되어 읽기 전용 검증·카탈로그 범위 제한·공개 등급 데이터소스 제한 3중 가드를 통과합니다. [코드]

❌ "엔진 접근에 사용자 인증이 강제됩니다"

현재 쿼리 엔진에는 GenD API 서비스 계정 단일 신원으로 접속합니다. 최종 사용자 단위 신원 전파는 코드에 있으나 기본값이 비활성이고, 엔진 계층 접근제어(파일 기반 ACL)는 아직 활성화되어 있지 않습니다. [코드]

✅ 데이터 접근 통제(컬럼 마스킹·행 필터·권한 기반 차단)는 GenD API 계층에서 시행됩니다. 쿼리 엔진 자체의 접근제어 활성화는 신원 전파·규칙 파이프라인 완료 후 단계적으로 적용될 예정입니다.

❌ "모든 열람이 기록되며 무엇을 봤는지까지 남습니다"

감사 체인이 서명하는 것은 요청 메타데이터(엔드포인트·상태·사용자 등)이고, 조회 결과 데이터(행·응답 본문)는 서명 대상이 아닙니다. SQL 본문은 특정 경로에서만, 길이 제한과 함께 기록됩니다. [코드]

✅ 모든 API 요청은 감사 로그에 기록되며, 전용 서명 키가 배포된 환경에서는 변조 불가 체인(HMAC-SHA256)으로 서명되어 사후 변조를 탐지할 수 있습니다 (본 배포는 활성 [실측 2026-07-30]). 조회 결과 데이터 자체는 저장되지 않습니다.

서명은 키가 없으면 조용히 꺼진다

서명 키는 선택적(optional) 주입이라 Secret 이 없어도 파드는 정상 기동하고 체인만 비활성화됩니다. 신규 환경마다 키 배포와 서명 실물을 확인하십시오. [코드]

❌ "관리자도 다른 워크스페이스 데이터를 볼 수 없습니다"

✅ 관리자의 데이터 열람은 별도 역할(ws_break_glass)과 사유 입력을 요구하며, 그 행위가 감사 로그에 기록됩니다. 워크스페이스·권한 관리와 감사 조회 같은 관리 기능은 관리자가 그대로 수행할 수 있습니다.

:::caution 절대 보증은 성립하지 않는다 Keycloak 관리자는 자기에게 그 역할을 부여할 수 있습니다. "관리자도 열람할 수 없습니다"는 어느 모델로도 보증되지 않습니다. [코드] :::

★ 전환 단계에 따라 다릅니다 — observe 모드에서는 관리자가 여전히 전사 데이터를 조회하며 그 사실이 관측됩니다. enforce 로 전환한 뒤에만 위 문장을 쓰십시오. [실측 2026-07-31: observe] 관리자의 워크스페이스 전환(멤버십 밖 진입)은 서명된 감사 레코드로 남습니다(#2725). [코드]

PII 마스킹 면제는 관리자 권한과 분리되어 있어, 별도 역할(unmask)을 명시적으로 부여받은 사용자만 원본을 조회할 수 있습니다. 면제 사용은 감사 이벤트로 남으나 현재 서명 대상이 아닙니다(미상환 부채). [코드]

❌ "SDK·MCP 경로는 기본적으로 차단됩니다"

권한 기반 가시성 필터는 현재 관측(observe) 모드가 기본입니다. [실측 2026-07-30]

✅ MCP·SDK·CLI 경로는 REST API 와 동일한 정책 엔진을 통과하며 컬럼 마스킹과 행 필터가 동일하게 적용됩니다. 권한 기반 조회 차단은 지정된 스키마 범위에 우선 적용되고 있으며 순차 확대 중입니다.

❌ "명시 동의 없이 워크스페이스 간 데이터가 공유되지 않습니다"

설계상 전사 공유인 계층이 존재합니다 — §3 참조.

✅ 워크스페이스가 생성·업로드한 데이터는 해당 워크스페이스에만 귀속됩니다. 기업·공시· 시세 등 사실(Fact)성 원천 데이터공용 메타데이터(온톨로지 L1~L3, 용어집, 리니지)는 설계상 전사 공유 자산입니다.

3. 설계상 전사 공유되는 계층

명시 동의를 거치지 않고 모든 워크스페이스에 보이는 것들입니다. 고객 문서에 이 목록을 그대로 싣습니다. 전부 [코드] 등급 — 설정이 아니라 설계입니다.

계층내용고객 설명
Fact 원천 데이터기업·공시·시세 등 워크스페이스가 비어 있는 행전사 공유 자산. 워크스페이스가 만든 파생물(브리핑·리스크 리포트·추정치)은 해당 워크스페이스 전용
시세 silver 파티션분봉·체결 등 공유 파티션모든 워크스페이스가 동일 데이터 조회. 워크스페이스별 사설 시세 피드 미제공
온톨로지 L1~L3코어·산업표준·패키지 계층DB 제약상 워크스페이스를 가질 수 없음. 읽기뿐 아니라 수정도 공용. 워크스페이스 전용 온톨로지는 L4
용어집·리니지 그래프비즈니스 용어, 테이블 관계전사 공용 메타데이터. 테이블의 내용이 아니라 이름·정의·관계
MCP 리소스 응답플랫폼 정보, 품질 점수 집계, PII 컬럼 목록MCP 리소스 조회는 전사 메타데이터를 반환. 노출되는 것은 테이블·컬럼 이름과 집계 점수이며 행 데이터는 포함되지 않음
온톨로지 L1~L3 의 쓰기 노출

읽기 공유는 설계이지만, 어느 워크스페이스 관리자든 수정·삭제할 수 있다는 점은 별도로 인지해야 합니다. 워크스페이스 접근 검사가 워크스페이스 없는 행을 통과시키기 때문입니다.

4. 정정된 사항

과거 내부 분석의 오류를 바로잡습니다. 이 항목들을 근거로 한 서술은 쓰지 마십시오.

과거 주장판정실제
"카탈로그 트리가 전면 공유된다"거짓라우터 파일에 workspace 문자열이 없는 것은 사실이나, 가시성은 위임된 서비스가 워크스페이스 스코프로 시행한다(권한 해석 실패 시 fail-closed). 예외 2건 — 관리자 전면 우회, 카탈로그 /export 는 스키마·테이블 단위 권한 필터 미적용
"마켓플레이스 publish 가 무동의 공유다"변경됨#2713 이후 데이터 접근에는 게시 측·구독 측 양쪽 관리자 행위가 모두 필요하고, 게시 대상은 전사 공유 스키마로 제한된다. 단 메타데이터 노출은 게시만으로 발생(§6 Q4)
"MCP 감사에 사용자·도구명 뿐이다"부분 변경#2703 이후 MCP 서버 도구 호출 경로에 한해 워크스페이스와 인자 지문이 기록된다. 레거시 MCP 클라이언트 라우터·리소스 읽기·AI 에이전트 경로는 아직 도구명 수준
"Pipeline Studio SQL 이 엔진에 직결된다"거짓API 내부 엔드포인트 3중 가드를 경유한다
"Trino 가 외부에 노출된다"변경됨외부 인그레스 제거됨. 내부 ClusterIP 전용 [실측 2026-07-30]

5. 범위 밖 계층

격리가 적용되지 않는 영역입니다. 고객 문서 첫 페이지에 싣습니다.

오브젝트 스토리지 (S3/Ceph)

사용자별 임시 자격증명 발급(credential vending)을 사용하지 않습니다. 쿼리 엔진이 공용 정적 자격증명으로 스토리지에 접근하며, 워크스페이스 경계는 스토리지 계층이 아니라 그 위의 쿼리·API 계층에서 시행됩니다. 자격증명은 플랫폼 단위 단일 계정입니다. [코드]

AI 문서 검색 (RAG)

AI 답변 생성 시 참조되는 문서 청크 검색은 보안등급(clearance) 기준으로 동작하며 워크스페이스 단위 분리는 적용되지 않습니다. 업로드 문서 목록은 워크스페이스별로 분리되어 표시되지만, 다른 워크스페이스가 올린 문서가 AI 답변의 근거로 검색될 수 있습니다. [코드]

벡터 검색 API 의 테넌트 축은 워크스페이스가 아니다

/rag 계열 API 는 서버가 생성한 보안 필터(보안등급 + 테넌트 + 권한 화이트리스트)를 클라이언트 필터와 AND 로 강제합니다. 다만 여기서의 테넌트 축은 Keycloak 그룹이며 워크스페이스는 권한 조회 단계에만 반영됩니다. 워크스페이스 단위 문서 분리가 필요하면 그룹 매핑 설계 또는 컬렉션 분리가 별도로 필요합니다.

지식그래프 (스키마·용어집·리니지)

전사 공용 메타데이터로 운영되며 워크스페이스 단위로 분리되지 않습니다. 자연어→SQL 생성 경로에서는 사용자가 권한을 가진 테이블만 컨텍스트로 사용됩니다. AI 에이전트 채팅 경로에는 현재 동일한 테이블 가시성 필터가 적용되지 않아, 권한 없는 테이블의 이름·스키마가 컨텍스트에 포함될 수 있습니다(행 데이터는 별도 실행 단계에서 마스킹·행 필터를 거칩니다). [코드]

SQL 직접 실행의 권한 차단 범위

카탈로그 목록은 권한으로 필터링되지만, 테이블 전체 이름을 아는 사용자가 SQL 로 직접 조회할 때의 권한 차단은 학습 데이터셋 테이블 전체(접두어 ds_ — 어느 워크스페이스 스키마에 있든)와 별도로 지정된 스키마에 적용되고 있습니다 [실측 2026-08-08]. 컬럼 마스킹과 행 필터는 범위와 무관하게 항상 적용됩니다.

내부 PostgreSQL 카탈로그 (gendpg)

여기는 오히려 강한 보증이 있으므로 함께 싣습니다.

GenD 내부 PostgreSQL 을 SQL 로 조회하는 카탈로그는 읽기 전용 전용 계정으로 접속하며, 인증·감사·토큰/시크릿/자격증명 계열 테이블은 데이터베이스 권한 수준에서 회수(REVOKE) 되어 조회 자체가 불가능합니다. 멀티테넌트 테이블에는 워크스페이스 조건이 서버에서 강제 주입되고, 안전하게 재작성할 수 없는 형태의 SQL 은 거부됩니다 (fail-closed). [코드]

운영 절차가 조건이다

신규 테이블에는 기본 권한이 자동 부여되므로, 민감 테이블 추가 시 권한 회수 스크립트를 재실행해야 합니다. 또한 엔진 측 접근제어 규칙은 정확 목록만 담고 있어 패턴 규칙 (*_secret, *_credential 등)을 반영하지 않습니다 — 실효 차단은 데이터베이스 권한이 담당합니다.

6. 보안심사 표준 답변

한국 금융·공공 실사에서 반복되는 항목입니다. 법무·PO 검토 후 사용하십시오.

Q. 접근제어 솔루션을 우회하는 경로가 있습니까?

애플리케이션 네임스페이스에서 쿼리 엔진에 도달할 수 있는 워크로드는 GenD API 와 파이프라인 오케스트레이터 2종으로 NetworkPolicy 상 제한되어 있습니다. 쿼리 엔진은 외부에 노출되지 않습니다 [실측 2026-07-30].

다만 플랫폼 시스템 네임스페이스(인그레스·모니터링 등)는 별도 정책으로 접근이 열려 있어, 해당 네임스페이스의 운영 통제가 함께 전제됩니다. 또한 파이프라인 오케스트레이터는 API 인가 게이트를 경유하지 않고 플랫폼 서비스 계정으로 실행되며, 이 경로는 사용자 입력이 아니라 플랫폼이 배포한 파이프라인 코드만 실행합니다 — 통제는 코드 변경 리뷰·배포 형상관리에 의존합니다.

엔진 계층 자체의 접근제어는 현재 적용되어 있지 않습니다. 신원 전파와 규칙 파이프라인 완료 후 단계적으로 적용할 계획이며, 일정은 확약하지 않습니다.

Q. 처리 대상을 식별할 수 있는 접속기록이 남습니까?

모든 API 요청이 감사 로그에 기록되며, 본 배포에서는 변조 불가 체인(HMAC)으로 서명되어 있습니다 [실측 2026-07-30]. 기록에는 사용자, 엔드포인트, 시각, 결과 상태, 활성 워크스페이스가 포함됩니다.

MCP 도구 호출은 대상 데이터셋 좌표를 별도 접근 이력 테이블에 기록합니다. 좌표 추출은 완전 수식(카탈로그.스키마.테이블) 참조 기준의 best-effort 이며, 이 이력은 무결성 체인이 아닌 보조 이력이라 고부하 시 유실될 수 있습니다. 감사 정본은 API 감사 로그입니다.

조회 결과 데이터 자체는 저장하지 않습니다. SQL 본문은 쿼리 실행 API 경로에서 길이 제한과 함께 기록됩니다.

플랫폼 자체의 배치/ETL 워크로드는 API 를 경유하지 않으므로 API 감사 로그에 남지 않으며, 서비스 계정 단일 신원으로 동작합니다. 엔진 레벨 전수 쿼리 감사는 구성 가능하나 현재 기본 활성이 아닙니다.

Q. 관리자의 데이터 접근은 어떻게 통제됩니까?

플랫폼 관리자는 운영을 위해 전사 카탈로그를 조회할 수 있으며, 그 조회는 감사 로그에 기록됩니다. 관리자의 워크스페이스 전환(멤버십 밖 진입)은 서명된 감사 레코드로 남습니다.

PII 마스킹 면제는 관리자 권한과 분리되어 있어, 별도 역할을 명시적으로 부여받은 사용자만 원본을 조회할 수 있고 그 사용은 감사됩니다(현재 이 이벤트는 서명 대상이 아닙니다).

(계획) 관리자 권한을 상시 부여에서 사유 기반 일시 부여(break-glass)로 전환하는 것은 로드맵 항목입니다 — Epic #2700 D2.

Q. 워크스페이스 간 데이터 공유는 어떻게 이루어집니까?

MCP 도구 마켓플레이스를 통한 공유에서, 데이터 접근에는 게시 측과 구독 측 양쪽 관리자의 명시적 행위가 모두 필요합니다. 게시 대상은 전사 공유가 확인된 스키마로 제한되며, 워크스페이스 사설 테이블·데이터마트 출력·임의 SQL 도구는 게시가 거부됩니다. 구독자에게는 실행 결과만 전달되고 원본 테이블 접근 권한은 부여되지 않습니다.

다만 게시 측의 게시만으로 도구의 이름·설명·출처 메타데이터는 다른 워크스페이스 목록에 노출됩니다. 크로스 워크스페이스 게시는 기본 허용이므로, 서로 다른 고객사가 동거하는 배포에서는 설정으로 명시적으로 차단해야 합니다 [실측 2026-07-30: 본 배포는 기본 허용].

§3 의 전사 공유 계층은 이 동의 절차를 거치지 않는 설계상 공용 자산입니다.

7. 이 문서의 유지 규칙

  • 격리 관련 PR 은 이 문서의 해당 항목을 같은 PR 에서 갱신합니다.
  • 새 보증 문장을 추가하려면 코드 근거(파일:라인) 를 확인한 뒤에만 씁니다. 미래 계획 서술은 (계획) 표식과 이슈 번호를 답니다.
  • 원 조사에서 판정이 PARTIAL 인 항목은 고객 문서에 단정형으로 쓰지 않습니다.
  • 모든 주장에 §0 의 근거 등급을 답니다. [코드]·[배포정의] 등급을 고객에게 단정형으로 제출하기 전 [실측] 으로 승격하십시오.
  • §0 실측 표는 환경마다 다시 측정합니다 — 이 표는 aks-genos-prod 전용입니다.

관련