Milvus
Zilliz
  • Home
  • Blog
  • Milvus RBAC 설명: 역할 기반 액세스 제어로 벡터 데이터베이스 보안 유지

Milvus RBAC 설명: 역할 기반 액세스 제어로 벡터 데이터베이스 보안 유지

  • Tutorials
December 31, 2025
Juan Xu

데이터베이스 시스템을 구축할 때 엔지니어들은 인덱스 유형, 리콜, 지연 시간, 처리량, 확장 등 성능에 대부분의 시간을 할애합니다. 하지만 시스템이 한 개발자의 노트북을 넘어서는 순간, Milvus 클러스터 내에서 누가 무엇을 할 수 있는가라는 또 다른 중요한 질문이 생깁니다. 다시 말해, 액세스 제어입니다.

업계 전반에 걸쳐 많은 운영 사고는 단순한 권한 실수에서 비롯됩니다. 스크립트가 잘못된 환경에서 실행됩니다. 서비스 계정에 의도한 것보다 더 광범위한 액세스 권한이 있습니다. 공유된 관리자 자격 증명이 CI에 포함됩니다. 이러한 문제는 대개 매우 실용적인 질문으로 드러납니다:

  • 개발자가 프로덕션 컬렉션을 삭제할 수 있는가?

  • 테스트 계정에서 프로덕션 벡터 데이터를 읽을 수 있는 이유는 무엇인가요?

  • 여러 서비스가 동일한 관리자 역할로 로그인하는 이유는 무엇인가요?

  • 분석 작업에 쓰기 권한이 없는 읽기 전용 액세스 권한을 가질 수 있나요?

Milvus는 역할 기반 액세스 제어(RBAC)로 이러한 문제를 해결합니다. 모든 사용자에게 슈퍼 관리자 권한을 부여하거나 애플리케이션 코드에서 제한을 적용하는 대신, RBAC를 사용하면 데이터베이스 계층에서 정확한 권한을 정의할 수 있습니다. 각 사용자 또는 서비스에는 필요한 기능만 제공됩니다.

이 게시물에서는 Milvus에서 RBAC의 작동 방식, 구성 방법, 프로덕션 환경에서 안전하게 적용하는 방법에 대해 설명합니다.

Milvus를 사용할 때 액세스 제어가 중요한 이유

팀의 규모가 작고 AI 애플리케이션이 제한된 수의 사용자에게만 서비스를 제공하는 경우 인프라는 일반적으로 단순합니다. 소수의 엔지니어가 시스템을 관리하고 Milvus는 개발 또는 테스트에만 사용하며 운영 워크플로우가 간단합니다. 이 초기 단계에서는 위험 표면이 작고 실수를 쉽게 되돌릴 수 있기 때문에 액세스 제어가 시급하게 느껴지는 경우가 드뭅니다.

Milvus가 프로덕션으로 전환되고 사용자, 서비스 및 운영자의 수가 증가함에 따라 사용 모델이 빠르게 변경됩니다. 일반적인 시나리오는 다음과 같습니다:

  • 동일한 Milvus 인스턴스를 공유하는 여러 비즈니스 시스템

  • 여러 팀이 동일한 벡터 컬렉션에 액세스하는 경우

  • 테스트, 스테이징, 프로덕션 데이터가 단일 클러스터에 공존하는 경우

  • 읽기 전용 쿼리부터 쓰기 및 운영 제어에 이르기까지 서로 다른 수준의 액세스가 필요한 다양한 역할

액세스 경계를 명확하게 정의하지 않으면 이러한 설정은 예측 가능한 위험을 초래합니다:

  • 테스트 워크플로우가 실수로 프로덕션 컬렉션을 삭제할 수 있습니다.

  • 개발자가 라이브 서비스에서 사용하는 인덱스를 의도치 않게 수정할 수 있습니다.

  • root 계정의 광범위한 사용으로 인해 작업 추적이나 감사가 불가능해집니다.

  • 손상된 애플리케이션이 모든 벡터 데이터에 제한 없이 액세스할 수 있습니다.

사용량이 증가함에 따라 비공식적인 관행이나 공유 관리자 계정에 의존하는 것은 더 이상 지속 가능하지 않습니다. 일관되고 시행 가능한 액세스 모델이 필수적인데, 이것이 바로 Milvus RBAC가 제공하는 기능입니다.

Milvus의 RBAC란?

RBAC(역할 기반 액세스 제어) 는 개별 사용자가 아닌 역할을 기반으로 액세스를 제어하는 권한 모델입니다. Milvus에서 RBAC를 사용하면 사용자 또는 서비스가 수행할 수 있는 작업과 특정 리소스에 대한 작업을 정확하게 정의할 수 있습니다. 단일 개발자에서 전체 프로덕션 환경으로 시스템이 성장함에 따라 보안을 관리할 수 있는 구조적이고 확장 가능한 방법을 제공합니다.

Milvus RBAC는 다음과 같은 핵심 구성 요소를 중심으로 구축됩니다:

Users Roles Privileges 사용자 역할 권한

  • 리소스: 액세스되는 엔터티. Milvus에서 리소스에는 인스턴스, 데이터베이스컬렉션이 포함됩니다.

  • 권한: 리소스에 대해 허용된 특정 작업(예: 컬렉션 만들기, 데이터 삽입 또는 엔티티 삭제)입니다.

  • 권한 그룹: "읽기 전용" 또는 "쓰기"와 같이 미리 정의된 관련 권한 집합입니다.

  • 역할: 역할: 권한과 해당 권한이 적용되는 리소스의 조합입니다. 역할에 따라 수행할 수 있는 작업과 위치가 결정됩니다.

  • 사용자: Milvus의 ID입니다. 각 사용자에게는 고유 ID가 있으며 하나 이상의 역할이 할당됩니다.

이러한 구성 요소는 명확한 계층 구조를 형성합니다:

  1. 사용자에게는 역할이 할당됩니다.

  2. 역할은 권한을 정의합니다.

  3. 권한은 특정 리소스에 적용됩니다.

Milvus의 핵심 설계 원칙은 사용자에게 직접 권한이 할당되지 않는다는 것입니다. 모든 액세스는 역할을 통해 이루어집니다. 이러한 간접 방식은 관리를 간소화하고, 구성 오류를 줄이며, 권한 변경을 예측 가능하게 만듭니다.

이 모델은 실제 배포에서 깔끔하게 확장됩니다. 여러 사용자가 하나의 역할을 공유하는 경우 역할의 권한을 업데이트하면 각 사용자를 개별적으로 수정할 필요 없이 모든 사용자의 권한이 즉시 업데이트됩니다. 이는 최신 인프라가 액세스를 관리하는 방식과 일치하는 단일 제어 지점입니다.

Milvus에서 RBAC의 작동 방식

클라이언트가 Milvus에 요청을 보내면 시스템은 일련의 인증 단계를 통해 이를 평가합니다. 각 단계를 통과해야만 작업을 진행할 수 있습니다:

How RBAC Works in Milvus Milvus에서 RBAC 작동 방식

  1. 요청을 인증합니다: Milvus는 먼저 사용자 신원을 확인합니다. 인증에 실패하면 인증 오류와 함께 요청이 거부됩니다.

  2. 역할 할당 확인: 인증 후 Milvus는 사용자에게 하나 이상의 역할이 할당되어 있는지 확인합니다. 역할이 없는 경우 권한 거부 오류와 함께 요청이 거부됩니다.

  3. 필요한 권한을 확인합니다: 그런 다음 Milvus는 사용자의 역할이 대상 리소스에 대해 필요한 권한을 부여하는지 여부를 평가합니다. 권한 확인에 실패하면 권한 거부 오류와 함께 요청이 거부됩니다.

  4. 작업을 실행합니다: 모든 검사가 통과되면 Milvus는 요청된 작업을 실행하고 결과를 반환합니다.

Milvus에서 RBAC을 통해 접근 제어를 구성하는 방법

1. 전제 조건

RBAC 규칙을 평가하고 적용하려면 먼저 Milvus에 대한 모든 요청을 특정 사용자 ID와 연결할 수 있도록 사용자 인증을 사용하도록 설정해야 합니다.

다음은 두 가지 표준 배포 방법입니다.

  • Docker Compose로 배포

Milvus를 Docker Compose를 사용하여 배포하는 경우 milvus.yaml 구성 파일을 편집하고 common.security.authorizationEnabledtrue 으로 설정하여 인증을 활성화한다:

common:
  security:
    authorizationEnabled: true
  • 헬름 차트로 배포하기

헬름 차트로 배포하는 경우, values.yaml 파일을 편집하고 extraConfigFiles.user.yaml 아래에 다음 구성을 추가합니다:

extraConfigFiles:
  user.yaml: |+
    common:
      security:
        authorizationEnabled: true

2. 초기화

기본적으로 Milvus는 시스템이 시작될 때 기본 제공 root 사용자를 생성합니다. 이 사용자의 기본 비밀번호는 Milvus 이다.

초기 보안 단계로 root 사용자를 사용하여 Milvus에 연결하고 기본 비밀번호를 즉시 변경하세요. 무단 액세스를 방지하기 위해 복잡한 비밀번호를 사용할 것을 강력히 권장합니다.

from pymilvus import MilvusClient
# Connect to Milvus using the default root user
client = MilvusClient(
    uri='http://localhost:19530', 
    token="root:Milvus"
)
# Update the root password
client.update_password(
    user_name="root",
    old_password="Milvus", 
    new_password="xgOoLudt3Kc#Pq68"
)

3. 핵심 작업

사용자 생성

매일 사용하는 경우 root 계정을 사용하는 대신 전용 사용자를 생성하는 것이 좋습니다.

client.create_user(user_name="user_1", password="P@ssw0rd")

역할 생성

Milvus는 전체 관리 권한이 있는 기본 제공 admin 역할을 제공합니다. 그러나 대부분의 프로덕션 시나리오에서는 세분화된 액세스 제어를 위해 사용자 지정 역할을 만드는 것이 좋습니다.

client.create_role(role_name="role_a")

권한 그룹 만들기

권한 그룹은 여러 권한의 집합입니다. 권한 관리를 간소화하기 위해 관련 권한을 그룹화하여 함께 부여할 수 있습니다.

Milvus에는 다음과 같은 기본 제공 권한 그룹이 포함되어 있습니다:

  • COLL_RO, COLL_RW, COLL_ADMIN

  • DB_RO, DB_RW, DB_ADMIN

  • Cluster_RO, Cluster_RW, Cluster_ADMIN

이러한 기본 제공 권한 그룹을 사용하면 권한 설계의 복잡성을 크게 줄이고 역할 간 일관성을 향상시킬 수 있습니다.

기본 제공 권한 그룹을 직접 사용하거나 필요에 따라 사용자 지정 권한 그룹을 만들 수 있습니다.

# Create a privilege group
client.create_privilege_group(group_name='privilege_group_1'# Add privileges to the privilege group
client.add_privileges_to_group(group_name='privilege_group_1', privileges=['Query', 'Search'])

역할에 권한 또는 권한 그룹 부여하기

역할을 만든 후에는 해당 역할에 권한 또는 권한 그룹을 부여할 수 있습니다. 이러한 권한의 대상 리소스는 인스턴스, 데이터베이스 또는 개별 컬렉션 등 다양한 수준에서 지정할 수 있습니다.

client.grant_privilege_v2(
    role_name="role_a",
    privilege="Search",
    collection_name='collection_01',
    db_name='default',
)
client.grant_privilege_v2(
    role_name="role_a",
    privilege="privilege_group_1",
    collection_name='collection_01',
    db_name='default',
)
client.grant_privilege_v2(
    role_name="role_a",
    privilege="ClusterReadOnly",
    collection_name='*',
    db_name='*',
)

사용자에게 역할 부여

사용자에게 역할이 할당되면 사용자는 리소스에 액세스하고 해당 역할에 정의된 작업을 수행할 수 있습니다. 필요한 액세스 범위에 따라 단일 사용자에게 하나 또는 여러 개의 역할을 부여할 수 있습니다.

client.grant_role(user_name="user_1", role_name="role_a")

4. 액세스 권한 검사 및 취소

사용자에게 할당된 역할 검사

client.describe_user(user_name="user_1")

역할에 할당된 권한 검사하기

client.describe_role(role_name="role_a")

역할에서 권한 해지하기

client.revoke_privilege_v2(
    role_name="role_a",
    privilege="Search",
    collection_name='collection_01',
    db_name='default',
)
client.revoke_privilege_v2(
    role_name="role_a",
    privilege="privilege_group_1",
    collection_name='collection_01',
    db_name='default',
)

사용자로부터 역할 해지하기

client.revoke_role(
    user_name='user_1',
    role_name='role_a'
)

사용자 및 역할 삭제

client.drop_user(user_name="user_1")
client.drop_role(role_name="role_a")

예시 Milvus 기반 RAG 시스템을 위한 액세스 제어 설계

Milvus를 기반으로 구축된 검색 증강 세대(RAG) 시스템을 생각해 보세요.

이 시스템에서는 여러 구성 요소와 사용자가 명확하게 분리된 책임을 가지고 있으며, 각각 다른 수준의 액세스가 필요합니다.

액터책임필수 액세스 권한
플랫폼 관리자시스템 운영 및 구성인스턴스 수준 관리
벡터 수집 서비스벡터 데이터 수집 및 업데이트읽기 및 쓰기 액세스
검색 서비스벡터 검색 및 검색읽기 전용 액세스
from pymilvus import MilvusClient
client = MilvusClient(
    uri='http://localhost:19530',
    token="root:xxx"  # Replace with the updated root password
)
# 1. Create a user (use a strong password)
client.create_user(user_name="rag_admin", password="xxx")
client.create_user(user_name="rag_reader", password="xxx")
client.create_user(user_name="rag_writer", password="xxx")
# 2. Create roles
client.create_role(role_name="role_admin")
client.create_role(role_name="role_read_only")
client.create_role(role_name="role_read_write")
# 3. Grant privileges to the role
## Using built-in Milvus privilege groups
client.grant_privilege_v2(
    role_name="role_admin",
    privilege="Cluster_Admin",
    collection_name='*',
    db_name='*',
)
client.grant_privilege_v2(
    role_name="role_read_only",
    privilege="COLL_RO",
    collection_name='*',
    db_name='default',
)
client.grant_privilege_v2(
    role_name="role_read_write",
    privilege="COLL_RW",
    collection_name='*',
    db_name='default',
)
# 4. Assign the role to the user
client.grant_role(user_name="rag_admin", role_name="role_admin")
client.grant_role(user_name="rag_reader", role_name="role_read_only")
client.grant_role(user_name="rag_writer", role_name="role_read_write")

빠른 팁: 프로덕션 환경에서 안전하게 액세스 제어를 운영하는 방법

장기간 운영되는 프로덕션 시스템에서 액세스 제어를 효과적이고 관리하기 쉽게 유지하려면 다음 실용적인 지침을 따르세요.

1. 기본 root 비밀번호를 변경하고 root 계정의 사용을 제한합니다.

초기화 후 즉시 기본 root 비밀번호를 업데이트하고 관리 작업에만 사용하도록 제한하세요. 일상적인 작업에는 루트 계정을 사용하거나 공유하지 마세요. 대신 일상적인 액세스를 위한 전용 사용자와 역할을 만들어 위험을 줄이고 책임을 강화하세요.

2. 여러 환경에서 Milvus 인스턴스를 물리적으로 격리하세요.

개발, 스테이징 및 프로덕션을 위해 별도의 Milvus 인스턴스를 배포하세요. 물리적 격리는 논리적 액세스 제어만 사용하는 것보다 더 강력한 안전 경계를 제공하며 환경 간 실수의 위험을 크게 줄여줍니다.

3. 최소 권한 원칙 준수

각 역할에 필요한 권한만 부여하세요:

  • 개발 환경: 반복 작업 및 테스트를 지원하기 위해 권한을 더 허용할 수 있습니다.

  • 프로덕션 환경: 권한은 꼭 필요한 권한으로 엄격하게 제한해야 합니다.

  • 정기 감사: 기존 권한을 주기적으로 검토하여 여전히 필요한지 확인합니다.

4. 더 이상 필요하지 않은 권한은 적극적으로 취소하세요.

액세스 제어는 한 번 설정하면 끝나는 것이 아니라 지속적인 유지 관리가 필요합니다. 사용자, 서비스 또는 책임이 변경되면 즉시 역할과 권한을 취소하세요. 이렇게 하면 사용하지 않는 권한이 시간이 지나면서 누적되어 숨겨진 보안 위험이 되는 것을 방지할 수 있습니다.

결론

Milvus에서 액세스 제어를 구성하는 것은 본질적으로 복잡하지는 않지만 프로덕션 환경에서 시스템을 안전하고 안정적으로 운영하기 위해서는 필수적입니다. 잘 설계된 RBAC 모델을 사용하면 다음과 같이 할 수 있습니다:

  • 우발적이거나 파괴적인 작업을 방지하여위험 감소

  • 벡터 데이터에 대한 최소 권한 액세스를 시행하여보안 강화

  • 명확한 책임 분리를 통한운영 표준화

  • 안심하고 확장하여 멀티테넌트 및 대규모 배포를 위한 기반 마련

액세스 제어는 선택적 기능이나 일회성 작업이 아닙니다. Milvus를 장기간 안전하게 운영하기 위한 기초적인 부분입니다.

Milvus 배포를 위한 RBAC로 견고한 보안 기준선을 구축하세요.

최신 Milvus의 기능에 대해 궁금한 점이 있거나 자세히 알아보고 싶으신가요? Discord 채널에 참여하거나 GitHub에 이슈를 제출하세요. 또한 Milvus 오피스 아워를 통해 20분간의 일대일 세션을 예약하여 인사이트, 안내 및 질문에 대한 답변을 얻을 수도 있습니다.

    Try Managed Milvus for Free

    Zilliz Cloud is hassle-free, powered by Milvus and 10x faster.

    Get Started

    Like the article? Spread the word

    계속 읽기