Шифрование в пути
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
Создайте файлы
- Создайте файл
gen.sh
.
mkdir cert && cd cert
touch gen.sh
- Скопируйте следующий скрипт в папку
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