milvus-logo
LFAI
홈페이지
  • 관리 가이드

전송 중 암호화

TLS(전송 계층 보안)는 통신 보안을 보장하기 위한 암호화 프로토콜입니다. Milvus 프록시는 TLS 단방향 및 양방향 인증을 사용합니다.

이 항목에서는 Milvus 프록시에서 gRPC 및 RESTful 트래픽 모두에 대해 TLS를 활성화하는 방법에 대해 설명합니다.

TLS와 사용자 인증은 서로 다른 두 가지 보안 접근 방식입니다. Milvus 시스템에서 사용자 인증과 TLS를 모두 사용 설정한 경우 사용자 이름, 비밀번호 및 인증서 파일 경로를 제공해야 합니다. 사용자 인증을 활성화하는 방법에 대한 자세한 내용은 사용자 액세스 인증을 참조하세요.

나만의 인증서 만들기

전제 조건

OpenSSL이 설치되어 있는지 확인합니다. 설치하지 않은 경우 먼저 OpenSSL을 빌드하여 설치합니다.

openssl version

OpenSSL이 설치되어 있지 않은 경우. 우분투에서 다음 명령을 사용하여 설치할 수 있습니다.

sudo apt install openssl

파일 만들기

  1. gen.sh 파일을 만듭니다.
mkdir cert && cd cert
touch gen.sh
  1. gen.sh 파일에 다음 스크립트를 복사합니다.

gen.sh 파일에서 CommonName 을 구성해야 합니다. CommonName 은 클라이언트가 연결할 때 지정해야 하는 서버 이름을 나타냅니다.

gen.sh

#!/usr/bin/env sh
# your variables
Country="US"
State="CA"
Location="Redwood City"
Organization="zilliz"
OrganizationUnit="devops"
CommonName="localhost"
ExpireDays=3650 # 10 years

# generate private key for ca, server and client
openssl genpkey -quiet -algorithm rsa:2048 -out ca.key
openssl genpkey -quiet -algorithm rsa:2048 -out server.key
openssl genpkey -quiet -algorithm rsa:2048 -out client.key

# create a new ca certificate
openssl req -x509 -new -nodes -key ca.key -sha256 -days 36500 -out ca.pem \
  -subj "/C=$Country/ST=$State/L=$Location/O=$Organization/OU=$OrganizationUnit/CN=$CommonName"

# prepare extension config for signing certificates
echo '[v3_req]
basicConstraints = CA:FALSE
keyUsage = nonRepudiation, digitalSignature, keyEncipherment
extendedKeyUsage = serverAuth
subjectAltName = @alt_names
[alt_names]
DNS = '$CommonName > openssl.cnf

# sign server certificate with ca
openssl req -new -key server.key\
  -subj "/C=$Country/ST=$State/L=$Location/O=$Organization/OU=$OrganizationUnit/CN=$CommonName"\
  | openssl x509 -req -days $ExpireDays -out server.pem -CA ca.pem -CAkey ca.key -CAcreateserial \
    -extfile ./openssl.cnf -extensions v3_req

# sign client certificate with ca
openssl req -new -key client.key\
  -subj "/C=$Country/ST=$State/L=$Location/O=$Organization/OU=$OrganizationUnit/CN=$CommonName"\
  | openssl x509 -req -days $ExpireDays -out client.pem -CA ca.pem -CAkey ca.key -CAcreateserial \
    -extfile ./openssl.cnf -extensions v3_req

gen.sh 파일의 변수는 인증서 서명 요청 파일을 만드는 절차에 중요합니다. 처음 5개의 변수는 국가, 주, 위치, 조직, 조직 단위를 포함한 기본 서명 정보입니다. CommonName 는 클라이언트-서버 통신 중에 확인되므로 구성할 때 주의가 필요합니다.

gen.sh 을 실행하여 인증서 생성

gen.sh 파일을 실행하여 인증서를 생성합니다.

chmod +x gen.sh
./gen.sh

다음 7개의 파일이 생성됩니다: ca.key, ca.pem, ca.srl, server.key, server.pem, client.key, client.pem.

나중에 인증서를 갱신할 수 있도록 ca.key, ca.pem, ca.srl 파일을 안전하게 보관하세요. server.keyserver.pem 파일은 서버에서 사용하고 client.keyclient.pem 파일은 클라이언트에서 사용합니다.

인증서 갱신(선택 사항)

인증서가 곧 만료될 경우와 같이 인증서를 갱신하려는 경우 다음 스크립트를 사용할 수 있습니다.

작업 디렉터리에 ca.key, ca.pem, ca.srl 가 필요합니다.

renew.sh

#!/usr/bin/env sh
# your variables
Country="US"
State="CA"
Location="Redwood City"
Organization="zilliz"
OrganizationUnit="devops"
CommonName="localhost"
ExpireDays=3650 # 10 years

# generate private key for ca, server and client
openssl genpkey -quiet -algorithm rsa:2048 -out server.key
openssl genpkey -quiet -algorithm rsa:2048 -out client.key

# prepare extension config for signing certificates
echo '[v3_req]
basicConstraints = CA:FALSE
keyUsage = nonRepudiation, digitalSignature, keyEncipherment
extendedKeyUsage = serverAuth
subjectAltName = @alt_names
[alt_names]
DNS = '$CommonName > openssl.cnf

# sign server certificate with ca
openssl req -new -key server.key\
  -subj "/C=$Country/ST=$State/L=$Location/O=$Organization/OU=$OrganizationUnit/CN=$CommonName"\
  | openssl x509 -req -days $ExpireDays -out server.pem -CA ca.pem -CAkey ca.key -CAcreateserial \
    -extfile ./openssl.cnf -extensions v3_req

# sign client certificate with ca
openssl req -new -key client.key\
  -subj "/C=$Country/ST=$State/L=$Location/O=$Organization/OU=$OrganizationUnit/CN=$CommonName"\
  | openssl x509 -req -days $ExpireDays -out client.pem -CA ca.pem -CAkey ca.key -CAcreateserial \
    -extfile ./openssl.cnf -extensions v3_req

renew.sh 파일을 실행하여 인증서를 만듭니다.

chmod +x renew.sh
./renew.sh

TLS로 Milvus 서버 설정하기

이 섹션에서는 TLS 암호화를 사용하여 Milvus 서버를 구성하는 단계를 간략하게 설명합니다.

Docker Compose 설정

1. Milvus 서버 구성 수정하기

외부 TLS를 사용하려면 milvus.yaml 파일에 다음 구성을 추가합니다:

proxy:
  http:
    # for now milvus do not support config restful on same port with grpc
    # so we set to 8080, grpc will still use 19530
    port: 8080 
tls:
  serverPemPath: /milvus/tls/server.pem
  serverKeyPath: /milvus/tls/server.key
  caPemPath: /milvus/tls/ca.pem

common:
  security:
    tlsMode: 1

파라미터

  • serverPemPath: 서버 인증서 파일의 경로입니다.
  • serverKeyPath: 서버 키 파일의 경로입니다.
  • caPemPath: CA 인증서 파일의 경로입니다.
  • tlsMode: 외부 서비스를 위한 TLS 모드입니다. 유효한 값입니다:
    • 1: 서버에만 인증서가 필요하고 클라이언트는 인증서를 확인하는 단방향 인증입니다. 이 모드를 사용하려면 서버 측에서는 server.pemserver.key, 클라이언트 측에서는 server.pem 이 필요합니다.
    • 2: 양방향 인증: 서버와 클라이언트 모두 보안 연결을 설정하기 위해 인증서가 필요합니다. 이 모드에서는 서버 측에 server.pem, server.key, ca.pem, 클라이언트 측에 client.pem, client.key, ca.pem 가 필요합니다.

내부 TLS를 사용하려면 milvus.yaml 파일에 다음 구성을 추가합니다:

internaltls:
  serverPemPath: /milvus/tls/server.pem
  serverKeyPath: /milvus/tls/server.key
  caPemPath: /milvus/tls/ca.pem

common:
  security:
    internaltlsEnabled: true 

매개변수

  • serverPemPath: 서버 인증서 파일의 경로입니다.
  • serverKeyPath: 서버 키 파일의 경로입니다.
  • caPemPath: CA 인증서 파일의 경로입니다.
  • internaltlsEnabled: 내부 TLS 사용 여부. 현재는 단방향 TLS만 지원됩니다.

2. 인증서 파일을 컨테이너에 매핑하기

인증서 파일 준비

docker-compose.yaml 과 같은 디렉터리에 tls 이라는 새 폴더를 만듭니다. server.pem , server.keyca.pemtls 폴더에 복사합니다. 다음과 같이 디렉토리 구조에 배치합니다:

├── docker-compose.yml
├── milvus.yaml
└── tls
     ├── server.pem
     ├── server.key
     └── ca.pem

Docker Compose 구성 업데이트

docker-compose.yaml 파일을 편집하여 아래와 같이 컨테이너 내부의 인증서 파일 경로를 매핑합니다:

  standalone:
    container_name: milvus-standalone
    image: milvusdb/milvus:latest
    command: ["milvus", "run", "standalone"]
    security_opt:
    - seccomp:unconfined
    environment:
      ETCD_ENDPOINTS: etcd:2379
      MINIO_ADDRESS: minio:9000
    volumes:
      - ${DOCKER_VOLUME_DIRECTORY:-.}/volumes/milvus:/var/lib/milvus
      - ${DOCKER_VOLUME_DIRECTORY:-.}/tls:/milvus/tls
      - ${DOCKER_VOLUME_DIRECTORY:-.}/milvus.yaml:/milvus/configs/milvus.yaml
Docker Compose를 사용하여 Milvus 배포하기

다음 명령을 실행하여 Milvus를 배포합니다:

sudo docker compose up -d

Milvus 오퍼레이터 설정

인증서 파일을 작업 디렉터리에 넣습니다. 디렉토리 구조는 다음과 같아야 합니다:

├── milvus.yaml (to be created later)
├── server.pem
├── server.key
└── ca.pem

인증서 파일로 비밀을 만듭니다:

kubectl create secret generic certs --from-file=server.pem --from-file=server.key --from-file=ca.pem

외부 TLS를 사용하려면 milvus.yaml 파일에 다음 구성을 추가합니다:

apiVersion: milvus.io/v1beta1
kind: Milvus
metadata:
  name: my-release
spec:
  config:
    proxy:
      http:
        # for now not support config restful on same port with grpc
        # so we set to 8080, grpc will still use 19530
        port: 8080 
    common:
      security:
        tlsMode: 1 # tlsMode for external service 1 for one-way TLS, 2 for Mutual TLS, 0 for disable
    tls:
      serverPemPath: /certs/server.pem
      serverKeyPath: /certs/server.key
      caPemPath: /certs/ca.pem
  components:
    # mount the certs secret to the milvus container
    volumes:
      - name: certs
        secret:
          secretName: certs
    volumeMounts:
      - name: certs
        mountPath: /certs
        readOnly: true

내부 TLS를 사용하려면 milvus.yaml 파일에 다음 구성을 추가합니다:

internaltls.sni 필드를 인증서의 일반 이름으로 바꾸는 것을 잊지 마세요.

apiVersion: milvus.io/v1beta1
kind: Milvus
metadata:
  name: my-release
spec:
  config:
    proxy:
      http:
        # for now not support config restful on same port with grpc
        # so we set to 8080, grpc will still use 19530
        port: 8080 
    common:
      security:
        internaltlsEnabled: true # whether to enable internal tls
    # Configure tls certificates path for internal service
    internaltls:
      serverPemPath: /certs/server.pem
      serverKeyPath: /certs/server.key
      caPemPath: /certs/ca.pem
      sni: localhost # the CommonName in your certificates
  components:
    # mount the certs secret to the milvus container
    volumes:
      - name: certs
        secret:
          secretName: certs
    volumeMounts:
      - name: certs
        mountPath: /certs
        readOnly: true

Milvus CR을 생성한다:

kubectl create -f milvus.yaml

Milvus 헬름 설정

인증서 파일을 작업 디렉터리에 넣습니다. 디렉토리 구조는 다음과 같아야 합니다:

├── values.yaml (to be created later)
├── server.pem
├── server.key
└── ca.pem

인증서 파일로 비밀을 생성합니다:

kubectl create secret generic certs --from-file=server.pem --from-file=server.key --from-file=ca.pem

외부 TLS를 사용하려면 values.yaml 파일에 다음 구성을 추가합니다:

extraConfigFiles:
  user.yaml: |+
    proxy:
      http:
        # for now not support config restful on same port with grpc
        # so we set to 8080, grpc will still use 19530
        port: 8080 
    common:
      security:
        tlsMode: 1 # tlsMode for external service 1 means set to 2 to enable Mutual TLS
    # Configure tls certificates path for external service
    tls:
      serverPemPath: /certs/server.pem
      serverKeyPath: /certs/server.key
      caPemPath: /certs/ca.pem
# mount the certs secret to the milvus container
volumes:
  - name: certs
    secret:
      secretName: certs
volumeMounts:
  - name: certs
    mountPath: /certs
    readOnly: true

내부 TLS를 사용하려면 values.yaml 파일에 다음 구성을 추가합니다:

internaltls.sni 필드를 인증서의 일반 이름으로 바꾸는 것을 잊지 마세요.

extraConfigFiles:
  user.yaml: |+
    common:
      security:
        internaltlsEnabled: true # whether to enable internal tls
    # Configure tls certificates path for internal service
    internaltls:
      serverPemPath: /certs/server.pem
      serverKeyPath: /certs/server.key
      caPemPath: /certs/ca.pem
      sni: localhost
# mount the certs secret to the milvus container
volumes:
  - name: certs
    secret:
      secretName: certs
volumeMounts:
  - name: certs
    mountPath: /certs
    readOnly: true

밀버스 릴리스를 만듭니다:

helm repo add milvus https://zilliztech.github.io/milvus-helm/
helm repo update milvus
helm install my-release milvus/milvus -f values.yaml

내부 TLS 사용 확인

내부 TLS를 직접 확인하기는 어렵습니다. Milvus 로그를 확인하여 내부 TLS가 사용 설정되어 있는지 확인할 수 있습니다.

내부 TLS가 활성화된 경우 Milvus 로그에 다음과 같은 메시지가 표시됩니다:

[...date time...] [INFO] [utils/util.go:56] ["Internal TLS Enabled"] [value=true]

TLS를 사용하여 Milvus 서버에 연결합니다.

SDK 상호 작용의 경우 TLS 모드에 따라 다음 설정을 사용합니다.

단방향 TLS 연결

server.pem 경로를 제공하고 server_name 이 인증서에 구성된 CommonName 과 일치하는지 확인합니다.

from pymilvus import MilvusClient

client = MilvusClient(
    uri="https://localhost:19530",
    secure=True,
    server_pem_path="path_to/server.pem",
    server_name="localhost"
)

양방향 TLS 연결

client.pem, client.keyca.pem 경로를 제공하고 server_name 이 인증서에 구성된 CommonName 과 일치하는지 확인합니다.

from pymilvus import MilvusClient

client = MilvusClient(
    uri="https://localhost:19530",
    secure=True,
    client_pem_path="path_to/client.pem",
    client_key_path="path_to/client.key",
    ca_pem_path="path_to/ca.pem",
    server_name="localhost"
)

자세한 내용은 예제_tls1.py예제_tls2.py를 참조하세요.

TLS를 사용하여 Milvus RESTful 서버에 연결하기

RESTful API의 경우 curl 명령을 사용하여 tls를 확인할 수 있습니다.

단방향 TLS 연결

curl --cacert path_to/ca.pem https://localhost:8080/v2/vectordb/collections/list

양방향 TLS 연결

curl --cert path_to/client.pem --key path_to/client.key --cacert path_to/ca.pem https://localhost:8080/v2/vectordb/collections/list

번역DeepL

Try Managed Milvus for Free

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

Get Started
피드백

이 페이지가 도움이 되었나요?