milvus-logo
LFAI
Home
  • Guía de administración

Cifrado en tránsito

TLS (Transport Layer Security) es un protocolo de encriptación para garantizar la seguridad de las comunicaciones. Milvus proxy utiliza la autenticación TLS unidireccional y bidireccional.

Este tema describe cómo habilitar TLS en Milvus proxy tanto para tráfico gRPC como RESTful.

TLS y la autenticación de usuario son dos enfoques de seguridad distintos. Si ha habilitado tanto la autenticación de usuario como TLS en su sistema Milvus, necesitará proporcionar un nombre de usuario, contraseña y rutas de archivos de certificado. Para obtener información sobre cómo habilitar la autenticación de usuario, consulte Autenticar el acceso de usuarios.

Cree su propio certificado

Requisitos previos

Asegúrese de que OpenSSL está instalado. Si no lo ha instalado, compile e instale OpenSSL en primer lugar.

openssl version

Si OpenSSL no está instalado. Se puede instalar con el siguiente comando en Ubuntu.

sudo apt install openssl

Crear archivos

  1. Cree el archivo gen.sh.
mkdir cert && cd cert
touch gen.sh
  1. Copie el siguiente script en el gen.sh.

Es necesario configurar el CommonName en el archivo gen.sh. El CommonName se refiere al nombre del servidor que el cliente debe especificar al conectarse.

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

Las variables del archivo gen.sh son cruciales para el proceso de creación de un archivo de solicitud de firma de certificado. Las primeras cinco variables son la información básica de firma, incluyendo país, estado, ubicación, organización, unidad de organización. Hay que tener cuidado al configurar CommonName, ya que se verificará durante la comunicación cliente-servidor.

Ejecute gen.sh para generar el certificado

Ejecute el archivo gen.sh para crear el certificado.

chmod +x gen.sh
./gen.sh

Se crearán los siete archivos siguientes: ca.key, ca.pem, ca.srl, server.key, server.pem, client.key, client.pem.

Asegúrese de guardar los archivos ca.key, ca.pem, ca.srl para poder renovar los certificados más adelante. Los archivos server.key y server.pem son utilizados por el servidor, y los archivos client.key y client.pem son utilizados por el cliente.

Renovar certificados (opcional)

Si quieres renovar los certificados en algunos casos, por ejemplo si van a caducar pronto. puedes usar el siguiente script.

Necesitas ca.key, ca.pem, ca.srl en tu directorio de trabajo.

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

Ejecute el archivo renew.sh para crear el certificado.

chmod +x renew.sh
./renew.sh

Configurar un servidor Milvus con TLS

Esta sección describe los pasos para configurar un servidor Milvus con encriptación TLS.

Configuración para Docker Compose

1. Modifique la configuración del servidor Milvus

Para habilitar TLS externo, añada las siguientes configuraciones en el archivo 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

Parámetros:

  • serverPemPath: La ruta al archivo del certificado del servidor.
  • serverKeyPath: La ruta al archivo de claves del servidor.
  • caPemPath: La ruta al archivo del certificado de la CA.
  • tlsMode: El modo TLS para el servicio externo. Valores válidos:
    • 1: Autenticación unidireccional, donde sólo el servidor requiere un certificado y el cliente lo verifica. Este modo requiere server.pem y server.key del lado del servidor, y server.pem del lado del cliente.
    • 2: Autenticación bidireccional, en la que tanto el servidor como el cliente necesitan certificados para establecer una conexión segura. Este modo requiere server.pem, server.key, y ca.pem del lado del servidor, y client.pem, client.key, y ca.pem del lado del cliente.

Para habilitar TLS interno, añada las siguientes configuraciones en el archivo milvus.yaml:

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

common:
  security:
    internaltlsEnabled: true 

Parámetros:

  • serverPemPath: La ruta al archivo del certificado del servidor.
  • serverKeyPath: La ruta al archivo de claves del servidor.
  • caPemPath: La ruta al archivo del certificado de la CA.
  • internaltlsEnabled: Si habilitar TLS interno. Por ahora sólo se soporta TLS unidireccional.

2. Asignar archivos de certificado al contenedor

Prepare los archivos de certificado

Cree una nueva carpeta llamada tls en el mismo directorio que su docker-compose.yaml. Copie los archivos server.pem, server.key y ca.pem en la carpeta tls. Colóquelos en una estructura de directorios como la siguiente:

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

Actualizar la configuración de Docker Compose

Edite el archivo docker-compose.yaml para asignar las rutas de los archivos de certificado dentro del contenedor como se muestra a continuación:

  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
Despliegue de Milvus utilizando Docker Compose

Ejecute el siguiente comando para desplegar Milvus:

sudo docker compose up -d

Configuración para Milvus Operator

Coloque los archivos de certificado en su directorio de trabajo. La estructura del directorio debería ser la siguiente:

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

Cree un secreto con los archivos de certificado:

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

Para habilitar TLS externo, añada las siguientes configuraciones en el archivo 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

Para habilitar TLS interno, añada las siguientes configuraciones en el archivo milvus.yaml:

Recuerde sustituir el campo internaltls.sni por el CommonName en sus certificados.

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

cree el CR de Milvus:

kubectl create -f milvus.yaml

configuración para Milvus Helm

Coloque los archivos de certificado en su directorio de trabajo. La estructura del directorio debería ser la siguiente:

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

Cree un secreto con los archivos de certificado:

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

Para habilitar TLS externo, añada las siguientes configuraciones en el archivo 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

Para habilitar TLS interno, añada las siguientes configuraciones en el archivo values.yaml:

Recuerde sustituir el campo internaltls.sni por el CommonName en sus certificados.

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

Cree la versión milvus:

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

Verificar TLS interno habilitado

Es difícil verificar TLS interno directamente. Puede comprobar el registro de Milvus para ver si TLS interno está habilitado.

En el registro de Milvus, debería ver el siguiente mensaje si TLS interno está habilitado:

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

Conectarse al servidor Milvus con TLS

Para interacciones SDK, utilice las siguientes configuraciones dependiendo del modo TLS.

Conexión TLS unidireccional

Proporcione la ruta a server.pem y asegúrese de que server_name coincide con CommonName configurado en el certificado.

from pymilvus import MilvusClient

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

Conexión TLS bidireccional

Proporcione las rutas a client.pem, client.key, y ca.pem, y asegúrese de que server_name coincide con CommonName configurada en el certificado.

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"
)

Consulte example_tls1.py y example_tls2.py para obtener más información.

Conectarse al servidor RESTful de Milvus con TLS

Para las API RESTful, puede comprobar tls utilizando el comando curl.

Conexión TLS unidireccional

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

Conexión TLS bidireccional

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

Traducido porDeepL

Try Managed Milvus for Free

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

Get Started
Feedback

¿Fue útil esta página?