전송 중 암호화
TLS(전송 계층 보안)는 통신 보안을 보장하기 위한 암호화 프로토콜입니다. Milvus 프록시는 TLS 단방향 및 양방향 인증을 사용합니다.
이 항목에서는 Milvus 프록시에서 gRPC 및 RESTful 트래픽 모두에 대해 TLS를 활성화하는 방법에 대해 설명합니다.
TLS와 사용자 인증은 서로 다른 두 가지 보안 접근 방식입니다. Milvus 시스템에서 사용자 인증과 TLS를 모두 사용 설정한 경우 사용자 이름, 비밀번호 및 인증서 파일 경로를 제공해야 합니다. 사용자 인증을 활성화하는 방법에 대한 자세한 내용은 사용자 액세스 인증을 참조하세요.
나만의 인증서 만들기
전제 조건
OpenSSL이 설치되어 있는지 확인합니다. 설치하지 않은 경우 먼저 OpenSSL을 빌드하여 설치합니다.
openssl version
OpenSSL이 설치되어 있지 않은 경우. 우분투에서 다음 명령을 사용하여 설치할 수 있습니다.
sudo apt install openssl
파일 만들기
gen.sh
파일을 만듭니다.
mkdir cert && cd cert
touch gen.sh
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.key
및 server.pem
파일은 서버에서 사용하고 client.key
및 client.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.pem
및server.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.key
및 ca.pem
를 tls
폴더에 복사합니다. 다음과 같이 디렉토리 구조에 배치합니다:
├── 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.key
및 ca.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