Crittografia in transito
TLS (Transport Layer Security) è un protocollo di crittografia che garantisce la sicurezza delle comunicazioni. Milvus proxy utilizza l'autenticazione TLS unidirezionale e bidirezionale.
Questo argomento descrive come abilitare TLS in Milvus proxy per il traffico gRPC e RESTful.
TLS e l'autenticazione utente sono due approcci di sicurezza distinti. Se avete abilitato sia l'autenticazione utente che il TLS nel vostro sistema Milvus, dovrete fornire un nome utente, una password e i percorsi dei file dei certificati. Per informazioni su come abilitare l'autenticazione dell'utente, fate riferimento a Autenticare l'accesso dell'utente.
Creare il proprio certificato
Prerequisiti
Assicurarsi che OpenSSL sia installato. Se non è stato installato, creare e installare prima OpenSSL.
openssl version
Se OpenSSL non è installato. Può essere installato con il seguente comando in Ubuntu.
sudo apt install openssl
Creare i file
- Creare il file
gen.sh
.
mkdir cert && cd cert
touch gen.sh
- Copiare il seguente script nel file
gen.sh
.
È necessario configurare il file CommonName
nel file gen.sh
. CommonName
si riferisce al nome del server che il client deve specificare durante la connessione.
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
Le variabili del file gen.sh
sono fondamentali per il processo di creazione di un file di richiesta di firma del certificato. Le prime cinque variabili sono le informazioni di base sulla firma, tra cui paese, stato, località, organizzazione, unità organizzativa. È necessario prestare attenzione quando si configura CommonName
, poiché sarà verificato durante la comunicazione client-server.
Eseguire gen.sh
per generare il certificato
Eseguire il file gen.sh
per creare il certificato.
chmod +x gen.sh
./gen.sh
Verranno creati i seguenti sette file: ca.key
, ca.pem
, ca.srl
, server.key
, server.pem
, client.key
, client.pem
.
Assicurarsi di tenere al sicuro i file ca.key
, ca.pem
, ca.srl
per poter rinnovare i certificati in seguito. I file server.key
e server.pem
sono utilizzati dal server, mentre i file client.key
e client.pem
sono utilizzati dal client.
Rinnovo dei certificati (opzionale)
Se si desidera rinnovare i certificati in alcuni casi, ad esempio se scadono presto, è possibile utilizzare il seguente script.
È necessario avere ca.key
, ca.pem
, ca.srl
nella propria directory di lavoro.
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
Eseguire il file renew.sh
per creare il certificato.
chmod +x renew.sh
./renew.sh
Configurazione di un server Milvus con TLS
Questa sezione illustra i passaggi per configurare un server Milvus con crittografia TLS.
Configurazione per Docker Compose
1. Modificare la configurazione del server Milvus
Per abilitare TLS esterno, aggiungere le seguenti configurazioni nel file 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
Parametri:
serverPemPath
: Il percorso del file del certificato del server.serverKeyPath
: Il percorso del file della chiave del server.caPemPath
: Il percorso del file del certificato della CA.tlsMode
: La modalità TLS per il servizio esterno. Valori validi:1
: Autenticazione unidirezionale, in cui solo il server richiede un certificato e il client lo verifica. Questa modalità richiedeserver.pem
eserver.key
dal lato server eserver.pem
dal lato client.2
: Autenticazione bidirezionale, in cui sia il server che il client richiedono un certificato per stabilire una connessione sicura. Questa modalità richiedeserver.pem
,server.key
eca.pem
dal lato server eclient.pem
,client.key
eca.pem
dal lato client.
Per abilitare il TLS interno, aggiungere le seguenti configurazioni nel file milvus.yaml
:
internaltls:
serverPemPath: /milvus/tls/server.pem
serverKeyPath: /milvus/tls/server.key
caPemPath: /milvus/tls/ca.pem
common:
security:
internaltlsEnabled: true
Parametri:
serverPemPath
: Il percorso del file del certificato del server.serverKeyPath
: Il percorso del file della chiave del server.caPemPath
: Il percorso del file del certificato della CA.internaltlsEnabled
: Se abilitare il TLS interno. Per ora è supportato solo il tls unidirezionale.
2. Mappare i file dei certificati nel contenitore
Preparare i file dei certificati
Creare una nuova cartella denominata tls
nella stessa directory di docker-compose.yaml
. Copiare i file server.pem
, server.key
e ca.pem
nella cartella tls
. Posizionarli in una struttura di directory come segue:
├── docker-compose.yml
├── milvus.yaml
└── tls
├── server.pem
├── server.key
└── ca.pem
Aggiornare la configurazione di Docker Compose
Modificare il file docker-compose.yaml
per mappare i percorsi dei file dei certificati all'interno del contenitore, come mostrato di seguito:
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
Distribuire Milvus con Docker Compose
Eseguire il seguente comando per distribuire Milvus:
sudo docker compose up -d
Setup per Milvus Operator
Mettere i file dei certificati nella propria directory di lavoro. La struttura della directory dovrebbe essere la seguente:
├── milvus.yaml (to be created later)
├── server.pem
├── server.key
└── ca.pem
Creare un segreto con i file del certificato:
kubectl create secret generic certs --from-file=server.pem --from-file=server.key --from-file=ca.pem
Per abilitare il TLS esterno, aggiungere le seguenti configurazioni nel file 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
Per abilitare il TLS interno, aggiungere le seguenti configurazioni nel file milvus.yaml
:
Ricordate di sostituire il campo internaltls.sni
con il CommonName nei vostri certificati.
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
creare il Milvus CR:
kubectl create -f milvus.yaml
configurazione per Milvus Helm
Mettete i file dei certificati nella vostra directory di lavoro. La struttura della directory dovrebbe essere la seguente:
├── values.yaml (to be created later)
├── server.pem
├── server.key
└── ca.pem
Creare un segreto con i file dei certificati:
kubectl create secret generic certs --from-file=server.pem --from-file=server.key --from-file=ca.pem
Per abilitare il TLS esterno, aggiungere le seguenti configurazioni nel file 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
Per abilitare il TLS interno, aggiungere le seguenti configurazioni nel file values.yaml
:
Ricordate di sostituire il campo internaltls.sni
con il CommonName nei vostri certificati.
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
Creare la release milvus:
helm repo add milvus https://zilliztech.github.io/milvus-helm/
helm repo update milvus
helm install my-release milvus/milvus -f values.yaml
Verificare l'abilitazione del TLS interno
È difficile verificare direttamente il TLS interno. Si può controllare il log di Milvus per vedere se il TLS interno è abilitato.
Nel log di Milvus, se il TLS interno è abilitato, si dovrebbe vedere il seguente messaggio:
[...date time...] [INFO] [utils/util.go:56] ["Internal TLS Enabled"] [value=true]
Connetti al server Milvus con TLS
Per le interazioni con l'SDK, utilizzare le seguenti impostazioni a seconda della modalità TLS.
Connessione TLS unidirezionale
Fornire il percorso di server.pem
e assicurarsi che server_name
corrisponda a CommonName
configurato nel certificato.
from pymilvus import MilvusClient
client = MilvusClient(
uri="https://localhost:19530",
secure=True,
server_pem_path="path_to/server.pem",
server_name="localhost"
)
Connessione TLS bidirezionale
Fornire i percorsi di client.pem
, client.key
e ca.pem
e assicurarsi che server_name
corrisponda a CommonName
configurato nel certificato.
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"
)
Per ulteriori informazioni, vedere esempio_tls1.py e esempio_tls2.py.
Connettersi al server RESTful di Milvus con TLS
Per le API RESTful, è possibile verificare il tls utilizzando il comando curl
.
Connessione TLS unidirezionale
curl --cacert path_to/ca.pem https://localhost:8080/v2/vectordb/collections/list
Connessione TLS bidirezionale
curl --cert path_to/client.pem --key path_to/client.key --cacert path_to/ca.pem https://localhost:8080/v2/vectordb/collections/list