Skip to main content

왜 모델 권한 관리가 중요한가

머신러닝 모델은 단순한 코드 파일이 아닙니다. 프로덕션 환경에서 실행되는 모델은 비즈니스 의사결정 에 직접 영향을 미치며, 잘못된 모델이 배포되면 금전적 손실이나 규제 위반으로 이어질 수 있습니다.

무분별한 모델 배포의 위험성

  • 검증되지 않은 모델 배포: 실험 중인 모델이 실수로 프로덕션에 배포되어 예측 품질 저하
  • 모델 오염 (Model Poisoning): 악의적 사용자가 학습 데이터나 모델 가중치를 변조
  • 규제 위반: 금융/의료 도메인에서 승인되지 않은 모델 사용 시 법적 제재 (GDPR, HIPAA 등)
  • 추적 불가: 누가 언제 어떤 모델을 배포했는지 기록이 없으면 사고 원인 분석 불가

규제 준수 (Compliance) 요구사항

규제관련 요구사항
GDPR자동화된 의사결정 모델의 설명 가능성, 접근 권한 기록
HIPAA의료 데이터를 사용한 모델의 접근 제어 및 감사 로그
SOC 2모델 변경 이력, 배포 승인 프로세스 문서화
금융 규제신용 심사 모델의 변경 통제 및 독립적 검증 요구

Unity Catalog (UC)가 제공하는 보호

Unity Catalog 기반 Model Registry는 테이블과 동일한 거버넌스 체계 를 모델에 적용합니다. 단일 접근 제어 계층에서 데이터 → 피처 → 모델 → 엔드포인트까지 일관된 권한 관리가 가능합니다.

Unity Catalog 기반 모델 권한 체계

권한 계층 구조

UC 모델 권한은 Catalog → Schema → Model 3단계 네임스페이스를 따릅니다. 상위 레벨 권한이 없으면 하위 레벨에 접근할 수 없습니다.
-- 1단계: Catalog 접근 권한 (모든 하위 객체 접근의 전제 조건)
GRANT USE CATALOG ON CATALOG ml_catalog TO `ds_team`;

-- 2단계: Schema 접근 권한
GRANT USE SCHEMA ON SCHEMA ml_catalog.fraud_models TO `ds_team`;

-- 3단계: 모델 등록 권한 (새 모델 생성)
GRANT CREATE MODEL ON SCHEMA ml_catalog.fraud_models TO `ds_team`;

-- 3단계: 모델 실행 권한 (추론/예측 호출)
GRANT EXECUTE ON MODEL ml_catalog.fraud_models.fraud_detection TO `inference_service`;

-- 권한 확인
SHOW GRANTS ON MODEL ml_catalog.fraud_models.fraud_detection;

-- 권한 회수
REVOKE EXECUTE ON MODEL ml_catalog.fraud_models.fraud_detection FROM `inference_service`;

주요 권한 설명

권한적용 대상허용 작업
USE CATALOGCatalogCatalog 내 객체 탐색
USE SCHEMASchemaSchema 내 객체 탐색
CREATE MODELSchema새 모델 등록 (새 버전 포함)
EXECUTEModel모델 버전 조회, 추론 호출
APPLY TAGModel모델에 태그 추가/수정
ALL PRIVILEGESModel모든 작업 (소유자 수준)
참고: EXECUTE 권한은 모델 가중치 파일 다운로드를 허용하지 않습니다. 모델 아티팩트 (Artifact) 접근은 별도의 Storage Credential 권한으로 제어됩니다.
참고 링크: Unity Catalog privileges for ML models

역할별 권한 설계

실제 조직에서는 역할 (Role) 기반으로 권한을 그룹화하는 것이 권장됩니다.

데이터 사이언티스트 (Data Scientist)

실험을 수행하고 모델을 등록하는 역할. 프로덕션 배포 권한은 없습니다.
-- DS 팀 그룹에 최소 권한 부여
GRANT USE CATALOG ON CATALOG ml_catalog TO `data_scientists`;
GRANT USE SCHEMA ON SCHEMA ml_catalog.experiments TO `data_scientists`;
GRANT USE SCHEMA ON SCHEMA ml_catalog.staging_models TO `data_scientists`;

-- 실험용 Schema에 모델 등록 허용
GRANT CREATE MODEL ON SCHEMA ml_catalog.staging_models TO `data_scientists`;

-- 스테이징 모델 읽기/실행 허용
GRANT EXECUTE ON SCHEMA ml_catalog.staging_models TO `data_scientists`;

ML 엔지니어 (ML Engineer)

승인된 모델을 프로덕션에 배포하고 모니터링하는 역할.
-- ML 엔지니어는 프로덕션 Schema에 대한 쓰기 권한 보유
GRANT USE CATALOG ON CATALOG ml_catalog TO `ml_engineers`;
GRANT USE SCHEMA ON SCHEMA ml_catalog.production_models TO `ml_engineers`;
GRANT CREATE MODEL ON SCHEMA ml_catalog.production_models TO `ml_engineers`;
GRANT EXECUTE ON SCHEMA ml_catalog.production_models TO `ml_engineers`;

-- Alias 관리를 위한 ALL PRIVILEGES (champion/challenger 전환)
GRANT ALL PRIVILEGES ON SCHEMA ml_catalog.production_models TO `ml_engineers`;

모델 소비자 (Model Consumer)

추론 API를 호출하는 애플리케이션 또는 팀. 읽기 전용 권한만 부여합니다.
-- 추론만 허용 (모델 수정 불가)
GRANT USE CATALOG ON CATALOG ml_catalog TO `analytics_team`;
GRANT USE SCHEMA ON SCHEMA ml_catalog.production_models TO `analytics_team`;
GRANT EXECUTE ON MODEL ml_catalog.production_models.fraud_detection TO `analytics_team`;

관리자 (Admin)

전체 모델 생명주기를 관리하는 역할. 서비스 프린시펄 (Service Principal) 계정으로 운영하는 것을 권장합니다.
-- Catalog 소유자 지정 (일반적으로 관리자 그룹)
ALTER CATALOG ml_catalog SET OWNER TO `ml_platform_admins`;

-- Schema 소유자 지정
ALTER SCHEMA ml_catalog.production_models SET OWNER TO `ml_platform_admins`;

Model Serving 연동

모델 → 엔드포인트 배포 워크플로

[Model Registry (UC)]
    ↓ Alias: "champion"
[Model Serving Endpoint]
    ↓ REST API
[애플리케이션 / 대시보드]
Alias (별칭) 를 활용하면 엔드포인트 설정을 변경하지 않고 새 모델 버전으로 무중단 전환 이 가능합니다.
import mlflow
from databricks.sdk import WorkspaceClient

w = WorkspaceClient()

# Alias를 참조하여 배포 → Alias 변경 시 자동 전환
w.serving_endpoints.create(
    name="fraud-detection-endpoint",
    config={
        "served_entities": [{
            "entity_name": "ml_catalog.production_models.fraud_detection",
            "entity_version": "champion",  # Alias 사용 (버전 번호 대신)
            "workload_size": "Small",       # Small / Medium / Large
            "scale_to_zero_enabled": True   # 비용 최적화
        }]
    }
)

서비스 프린시펄 (Service Principal) 설정

엔드포인트가 UC 모델에 접근하려면 서비스 프린시펄 에 권한을 부여해야 합니다. 개인 계정 대신 서비스 프린시펄을 사용하면 담당자 이직/퇴사 시에도 서비스가 중단되지 않습니다.
# 1. 서비스 프린시펄 ID 확인
sp = w.service_principals.get(application_id="<app-id>")
print(f"Service Principal ID: {sp.id}")
-- 2. 서비스 프린시펄에 모델 접근 권한 부여
GRANT USE CATALOG ON CATALOG ml_catalog TO `<service-principal-name>`;
GRANT USE SCHEMA ON SCHEMA ml_catalog.production_models TO `<service-principal-name>`;
GRANT EXECUTE ON MODEL ml_catalog.production_models.fraud_detection TO `<service-principal-name>`;
참고 링크: Model Serving with Unity Catalog

엔드포인트 권한 관리

Model Serving 엔드포인트 자체에도 별도의 권한 체계가 있습니다. UC 모델 권한과는 독립적으로 관리됩니다.

엔드포인트 권한 레벨

권한허용 작업
CAN_MANAGE엔드포인트 생성/수정/삭제, 권한 관리
CAN_QUERY엔드포인트에 추론 요청 전송 (REST API 호출)
CAN_VIEW엔드포인트 상태 및 설정 조회
from databricks.sdk.service.serving import ServingEndpointAccessControlRequest, ServingEndpointPermissionLevel

# 엔드포인트 권한 설정
w.serving_endpoints.set_permissions(
    serving_endpoint_id="fraud-detection-endpoint",
    access_control_list=[
        ServingEndpointAccessControlRequest(
            group_name="analytics_team",
            permission_level=ServingEndpointPermissionLevel.CAN_QUERY
        ),
        ServingEndpointAccessControlRequest(
            group_name="ml_engineers",
            permission_level=ServingEndpointPermissionLevel.CAN_MANAGE
        )
    ]
)

PAT (Personal Access Token) vs OAuth 토큰

방식장점단점
PAT설정 간단만료 관리 필요, 개인 계정에 종속
OAuth M2M서비스 프린시펄 기반, 자동 갱신초기 설정 복잡
Instance Profile (AWS)IAM 기반, 자격증명 불필요EC2/클러스터에서만 사용 가능
프로덕션 환경에서는 OAuth M2M (Machine-to-Machine) 방식을 권장합니다.
# OAuth M2M 토큰으로 엔드포인트 호출
import requests

# 1. 서비스 프린시펄 클라이언트 자격증명으로 OAuth 토큰 발급
token_response = requests.post(
    "https://<workspace-url>/oidc/v1/token",
    data={
        "grant_type": "client_credentials",
        "client_id": "<client-id>",
        "client_secret": "<client-secret>",
        "scope": "all-apis"
    }
)
access_token = token_response.json()["access_token"]

# 2. 토큰으로 엔드포인트 호출
response = requests.post(
    "https://<workspace-url>/serving-endpoints/fraud-detection-endpoint/invocations",
    headers={"Authorization": f"Bearer {access_token}"},
    json={"inputs": [{"feature_1": 0.5, "feature_2": 1.2}]}
)