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
- Cree el archivo
gen.sh
.
mkdir cert && cd cert
touch gen.sh
- 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 requiereserver.pem
yserver.key
del lado del servidor, yserver.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 requiereserver.pem
,server.key
, yca.pem
del lado del servidor, yclient.pem
,client.key
, yca.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