모델 접근
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 | 모델을 호출(예측)할 수 있는 권한 | 분석가 그룹, 서비스 계정 |
deploy | KServe 배포를 카나리 / 승급 / 롤백 변경 | ML 엔지니어 |
manage | 모델 접근 권한 자체를 발급 / 회수 | 관리자 |
와일드카드 매칭
model_version = NULL→ 모든 버전에 적용model_alias = NULL→ 모든 별칭에 적용- 둘 다 NULL 이면
(workspace × 모델) × 대상 × 액션단순 매칭이 됩니다.
UNIQUE 제약은 (workspace_id, model_name, model_alias, subject_type, subject_id, action) 조합에 걸려 있으므로, 동일한 별칭/대상/액션을 중복 발급하면 409 가 반환됩니다.
사용 방법
권한 발급
- 사이드바 하단 ⚙ 관리 콘솔 → 접근 제어 & 보안 → 모델 접근 메뉴로 이동합니다.
- 신규 권한 부여 버튼을 클릭합니다.
- 다음 정보를 입력합니다:
- 모델 이름: MLflow 에 등록된 모델 이름 (예:
credit_risk) - 모델 버전 / 별칭 (선택): 비워두면 모든 버전 / 별칭에 적용
- 대상 유형: 사용자 / 그룹 / 서비스 계정
- 대상 ID:
- 사용자: 이메일의 로컬파트 (예:
alice). 전체 이메일(alice@genon.ai)을 입력하면@도메인이 자동 제거되어 저장됩니다 — 런타임 호출 시 실제 판정에 쓰이는 식별자(safe_username)와 일치시키기 위함입니다 (#2388). 폼과 권한 평가 위젯이 자동 변환 결과를 안내합니다. - 그룹: 그룹 경로 (예:
/tenants/lng-ops) - 서비스 계정: Keycloak client id
- 사용자: 이메일의 로컬파트 (예:
- 액션: invoke / deploy / manage
- 만료 일시 (선택): UTC 기준. 비워두면 영구.
- ABAC 조건식 (선택): M3 ABAC 엔진이 평가합니다.
- 모델 이름: MLflow 에 등록된 모델 이름 (예:
- 발급 버튼을 클릭합니다.
권한 수정
- 행의 수정 버튼을 클릭하면 다이얼로그가 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-grants | viewer | 권한 목록 (workspace fence + pagination) |
| GET | /api/v1/model-grants/{id} | viewer | 단건 (workspace fence) |
| GET | /api/v1/model-grants/check | viewer | 권한 평가 (boolean only, row 미노출) |
| POST | /api/v1/model-grants | admin | 권한 발급 (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로그에 기록됩니다.