본문으로 건너뛰기

모델 접근

MLflow 등록 모델에 대한 ABAC (Attribute-Based Access Control) 권한을 관리하는 기능입니다. 데이터 접근 권한과 동일한 Unity Catalog 패턴을 따르지만, 대상이 테이블이 아닌 MLflow registered model 이라는 점이 다릅니다.

  • 메뉴: 사이드바 하단 ⚙ 관리 콘솔접근 제어 & 보안모델 접근
  • 경로: /admin/model-grants
  • 관련 이슈: Theme G #1214 (G-2 ABAC ModelGrant) — M1 PoC (#1221) + M2 mutation contract (#1228) + M3 UI (이 PR)

주요 기능

  • 세분화된 권한 부여: (workspace × 모델 × 별칭 × 버전) × (대상 유형 × 대상 ID) × 액션 조합으로 발급합니다.
  • 다양한 대상 유형: 사용자(user), 그룹(group), 서비스 계정(service_account) 단위.
  • 3가지 액션: invoke (모델 호출), deploy (배포 변경), manage (전체 관리).
  • 만료 일시: 선택. 비워두면 영구 권한.
  • ABAC 조건식: M2 에서 verbatim 기록만 됩니다 (M3 ABAC 엔진이 평가).
  • 권한 평가 위젯: (모델 × 대상 × 액션) 조합으로 즉시 결과 확인 — KServe /predict 프록시가 사용하는 것과 동일한 엔드포인트.

액션 수준

액션설명적용 예시
invoke모델을 호출(예측)할 수 있는 권한분석가 그룹, 서비스 계정
deployKServe 배포를 카나리 / 승급 / 롤백 변경ML 엔지니어
manage모델 접근 권한 자체를 발급 / 회수관리자

와일드카드 매칭

  • model_version = NULL → 모든 버전에 적용
  • model_alias = NULL → 모든 별칭에 적용
  • 둘 다 NULL 이면 (workspace × 모델) × 대상 × 액션 단순 매칭이 됩니다.

UNIQUE 제약은 (workspace_id, model_name, model_alias, subject_type, subject_id, action) 조합에 걸려 있으므로, 동일한 별칭/대상/액션을 중복 발급하면 409 가 반환됩니다.

사용 방법

권한 발급

  1. 사이드바 하단 ⚙ 관리 콘솔접근 제어 & 보안모델 접근 메뉴로 이동합니다.
  2. 신규 권한 부여 버튼을 클릭합니다.
  3. 다음 정보를 입력합니다:
    • 모델 이름: MLflow 에 등록된 모델 이름 (예: credit_risk)
    • 모델 버전 / 별칭 (선택): 비워두면 모든 버전 / 별칭에 적용
    • 대상 유형: 사용자 / 그룹 / 서비스 계정
    • 대상 ID:
      • 사용자: 이메일의 로컬파트 (예: alice). 전체 이메일(alice@genon.ai)을 입력하면 @도메인 이 자동 제거되어 저장됩니다 — 런타임 호출 시 실제 판정에 쓰이는 식별자(safe_username)와 일치시키기 위함입니다 (#2388). 폼과 권한 평가 위젯이 자동 변환 결과를 안내합니다.
      • 그룹: 그룹 경로 (예: /tenants/lng-ops)
      • 서비스 계정: Keycloak client id
    • 액션: invoke / deploy / manage
    • 만료 일시 (선택): UTC 기준. 비워두면 영구.
    • ABAC 조건식 (선택): M3 ABAC 엔진이 평가합니다.
  4. 발급 버튼을 클릭합니다.

권한 수정

  • 행의 수정 버튼을 클릭하면 다이얼로그가 EDIT 모드로 열립니다.
  • 변경 가능한 필드: 액션, 만료 일시, ABAC 조건식
  • 변경 불가능한 필드: 모델 이름 / 버전 / 별칭 / 대상 유형 / 대상 ID (서버에서 422 로 차단)
  • 대상이나 모델 식별 컬럼을 바꿔야 한다면, 신규 권한 발급 + 기존 권한 회수 절차를 거쳐야 합니다. 이는 감사 로그에 두 이벤트(발급, 회수)가 모두 기록되도록 강제하기 위한 의도된 정책입니다.

권한 회수

  • 행의 회수 버튼을 클릭한 뒤 확인 다이얼로그에서 회수 를 누릅니다.
  • M2 는 hard delete 입니다. M3 에서 soft-delete tombstone 으로 전환될 예정입니다.
  • 회수 작업은 감사 로그에 기록됩니다.

권한 평가 (Access Check)

페이지 하단의 권한 평가 위젯에서 임의의 (모델 × 대상 × 액션) 조합을 입력하면 즉시 allowed=true/false 결과를 확인할 수 있습니다. 이 위젯은 KServe /predict 프록시가 사용하는 것과 동일한 GET /api/v1/model-grants/check 엔드포인트를 호출합니다.

API 엔드포인트

메서드경로권한설명
GET/api/v1/model-grantsviewer권한 목록 (workspace fence + pagination)
GET/api/v1/model-grants/{id}viewer단건 (workspace fence)
GET/api/v1/model-grants/checkviewer권한 평가 (boolean only, row 미노출)
POST/api/v1/model-grantsadmin권한 발급 (409 UNIQUE 위반)
PUT/api/v1/model-grants/{id}admin권한 수정 (action / expires_at / condition_expr 만, 422 immutable)
DELETE/api/v1/model-grants/{id}admin권한 회수 (M2: hard delete)

보안 가드레일

  • Workspace fence: 비-admin 호출자는 자신의 tenant workspace + legacy NULL 행만 봅니다.
  • Fail-closed: tenant_slug 가 JWT 에 있지만 매핑되는 Workspace 가 없으면 403.
  • Admin-only 변경: POST / PUT / DELETE 는 모두 require_admin 으로 보호됩니다.
  • granted_by 스푸핑 방지: 발급자 ID 는 서버가 JWT 에서 stamp 합니다 — 클라이언트가 body 로 전달할 수 없습니다.
  • 감사 로그: 모든 mutation 은 AuditMiddleware + 구조화된 gend.audit 로그에 기록됩니다.

관련 문서