milvus-logo
LFAI
Casa
  • Guida all'amministrazione

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

  1. Creare il file gen.sh.
mkdir cert && cd cert
touch gen.sh
  1. 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à richiede server.pem e server.key dal lato server e server.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à richiede server.pem, server.key e ca.pem dal lato server e client.pem, client.key e ca.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

Tradotto daDeepL

Try Managed Milvus for Free

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

Get Started
Feedback

Questa pagina è stata utile?