🚀 Попробуйте Zilliz Cloud, полностью управляемый Milvus, бесплатно — ощутите 10-кратное увеличение производительности! Попробовать сейчас>

milvus-logo
LFAI
Главная
  • Руководство по администрированию
  • Home
  • Docs
  • Руководство по администрированию

  • Безопасность

  • Шифрование в пути

Шифрование в пути

TLS (Transport Layer Security) - это протокол шифрования, обеспечивающий безопасность связи. Milvus proxy использует TLS для односторонней и двусторонней аутентификации.

В этой теме описывается, как включить TLS в Milvus proxy для gRPC и RESTful трафика.

TLS и аутентификация пользователя - это два разных подхода к безопасности. Если вы включили аутентификацию пользователя и TLS в своей системе Milvus, вам нужно будет указать имя пользователя, пароль и путь к файлу сертификата. Информацию о том, как включить аутентификацию пользователей, см. в разделе Аутентификация доступа пользователей.

Создание собственного сертификата

Необходимые условия

Убедитесь, что OpenSSL установлен. Если он не установлен, сначала соберите и установите OpenSSL.

openssl version

Если OpenSSL не установлен. В Ubuntu его можно установить с помощью следующей команды.

sudo apt install openssl

Создайте файлы

  1. Создайте файл gen.sh.
mkdir cert && cd cert
touch gen.sh
  1. Скопируйте следующий скрипт в папку gen.sh.

Необходимо настроить CommonName в файле gen.sh. 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 имеют решающее значение для процесса создания файла запроса на подписание сертификата. Первые пять переменных - это основная информация о подписи, включая страну, штат, местоположение, организацию, подразделение организации. При настройке CommonName необходимо соблюдать осторожность, поскольку эта информация будет проверяться во время взаимодействия клиента и сервера.

Запустите файл gen.sh для создания сертификата

Запустите файл gen.sh для создания сертификата.

chmod +x gen.sh
./gen.sh

Будут созданы следующие семь файлов: 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

Настройка сервера Milvus с TLS

В этом разделе описаны шаги по настройке сервера Milvus с шифрованием TLS.

Настройка для 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: Путь к файлу сертификата центра сертификации.
  • 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: Путь к файлу сертификата центра сертификации.
  • internaltlsEnabled: Включать ли внутренний TLS. На данный момент поддерживается только односторонний tls.

2. Соотнесите файлы сертификатов с контейнером

Подготовьте файлы сертификатов

Создайте новую папку с именем tls в том же каталоге, что и docker-compose.yaml. Скопируйте файлы 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
Развертывание Milvus с помощью Docker Compose

Выполните следующую команду для развертывания Milvus:

sudo docker compose up -d

Setup for Milvus Operator

Поместите файлы сертификатов в рабочий каталог. Структура каталога должна выглядеть следующим образом:

├── 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 на CommonName в ваших сертификатах.

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 Helm

Поместите файлы сертификатов в рабочий каталог. Структура каталога должна выглядеть следующим образом:

├── 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 на CommonName в ваших сертификатах.

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

Создайте выпуск milvus:

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.

В журнале Milvus вы должны увидеть следующее сообщение, если внутренний TLS включен:

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

Connect to the Milvus server with TLS

Для взаимодействия с 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"
)

Дополнительные сведения см. в файлах example_tls1.py и example_tls2.py.

Подключение к RESTful-серверу Milvus с помощью TLS

Для RESTful API можно проверить TLS с помощью команды curl.

Одностороннее 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

Попробуйте Managed Milvus бесплатно

Zilliz Cloud работает без проблем, поддерживается Milvus и в 10 раз быстрее.

Начать
Обратная связь

Была ли эта страница полезной?