Enkripsi dalam Perjalanan
TLS (Transport Layer Security) adalah protokol enkripsi untuk memastikan keamanan komunikasi. Proksi Milvus menggunakan autentikasi TLS satu arah dan dua arah.
Topik ini menjelaskan cara mengaktifkan TLS di proxy Milvus untuk lalu lintas gRPC dan RESTful.
TLS dan autentikasi pengguna adalah dua pendekatan keamanan yang berbeda. Jika Anda telah mengaktifkan autentikasi pengguna dan TLS di sistem Milvus Anda, Anda harus menyediakan nama pengguna, kata sandi, dan jalur file sertifikat. Untuk informasi tentang cara mengaktifkan autentikasi pengguna, lihat Mengautentikasi Akses Pengguna.
Membuat sertifikat Anda sendiri
Prasyarat
Pastikan OpenSSL telah terinstal. Jika Anda belum menginstalnya, bangun dan instal OpenSSL terlebih dahulu.
openssl version
Jika OpenSSL tidak diinstal. Ini dapat diinstal dengan perintah berikut di Ubuntu.
sudo apt install openssl
Membuat berkas
- Buat berkas
gen.sh
.
mkdir cert && cd cert
touch gen.sh
- Salin skrip berikut ini ke dalam
gen.sh
.
Anda perlu mengonfigurasi CommonName
dalam berkas gen.sh
. CommonName
mengacu pada nama server yang harus ditentukan oleh klien saat menyambung.
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
Variabel-variabel dalam file gen.sh
sangat penting untuk proses pembuatan file permintaan penandatanganan sertifikat. Lima variabel pertama adalah informasi penandatanganan dasar, termasuk negara, negara bagian, lokasi, organisasi, unit organisasi. Diperlukan kehati-hatian saat mengonfigurasi CommonName
karena akan diverifikasi selama komunikasi klien-server.
Jalankan gen.sh
untuk menghasilkan sertifikat
Jalankan file gen.sh
untuk membuat sertifikat.
chmod +x gen.sh
./gen.sh
Tujuh berkas berikut ini akan dibuat: ca.key
ca.pem
, ca.srl
, server.key
, server.pem
, client.key
, client.pem
.
Pastikan untuk menyimpan ca.key
, ca.pem
, ca.srl
dengan aman untuk memperbarui sertifikat Anda nanti. File server.key
dan server.pem
digunakan oleh server, dan file client.key
dan client.pem
digunakan oleh klien.
Memperbarui sertifikat (opsional)
Jika Anda ingin memperbarui sertifikat dalam beberapa kasus, misalnya jika sertifikat akan segera kedaluwarsa. Anda dapat menggunakan skrip berikut.
Anda membutuhkan ca.key
, ca.pem
, ca.srl
di direktori kerja Anda.
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
Jalankan file renew.sh
untuk membuat sertifikat.
chmod +x renew.sh
./renew.sh
Menyiapkan server Milvus dengan TLS
Bagian ini menguraikan langkah-langkah untuk mengonfigurasi server Milvus dengan enkripsi TLS.
Penyiapan untuk Docker Compose
1. Memodifikasi konfigurasi server Milvus
Untuk mengaktifkan TLS eksternal, tambahkan konfigurasi berikut dalam berkas 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
Parameter
serverPemPath
: Jalur ke file sertifikat server.serverKeyPath
: Jalur ke file kunci server.caPemPath
: Jalur ke berkas sertifikat CA.tlsMode
: Mode TLS untuk layanan eksternal. Nilai yang valid:1
: Otentikasi satu arah, di mana hanya server yang memerlukan sertifikat dan klien memverifikasinya. Mode ini membutuhkanserver.pem
danserver.key
dari sisi server, danserver.pem
dari sisi klien.2
: Otentikasi dua arah, di mana server dan klien memerlukan sertifikat untuk membuat koneksi yang aman. Mode ini memerlukanserver.pem
,server.key
, danca.pem
dari sisi server, danclient.pem
,client.key
, danca.pem
dari sisi klien.
Untuk mengaktifkan TLS internal, tambahkan konfigurasi berikut ini di file milvus.yaml
:
internaltls:
serverPemPath: /milvus/tls/server.pem
serverKeyPath: /milvus/tls/server.key
caPemPath: /milvus/tls/ca.pem
common:
security:
internaltlsEnabled: true
Parameter:
serverPemPath
: Jalur ke file sertifikat server.serverKeyPath
: Jalur ke file kunci server.caPemPath
: Jalur ke berkas sertifikat CA.internaltlsEnabled
: Apakah akan mengaktifkan TLS internal. Untuk saat ini hanya TLS satu arah yang didukung.
2. Memetakan berkas sertifikat ke kontainer
Siapkan berkas sertifikat
Buat folder baru bernama tls
di direktori yang sama dengan docker-compose.yaml
. Salin server.pem
, server.key
, dan ca.pem
ke dalam folder tls
. Tempatkan berkas-berkas tersebut dalam struktur direktori sebagai berikut:
├── docker-compose.yml
├── milvus.yaml
└── tls
├── server.pem
├── server.key
└── ca.pem
Perbarui konfigurasi Docker Compose
Edit berkas docker-compose.yaml
untuk memetakan jalur berkas sertifikat di dalam kontainer seperti yang ditunjukkan di bawah ini:
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
Menerapkan Milvus menggunakan Docker Compose
Jalankan perintah berikut untuk men-deploy Milvus:
sudo docker compose up -d
Penyiapan untuk Operator Milvus
Letakkan berkas sertifikat di dalam direktori kerja Anda. Struktur direktori akan terlihat seperti ini:
├── milvus.yaml (to be created later)
├── server.pem
├── server.key
└── ca.pem
Buat rahasia dengan berkas sertifikat:
kubectl create secret generic certs --from-file=server.pem --from-file=server.key --from-file=ca.pem
Untuk mengaktifkan TLS eksternal, tambahkan konfigurasi berikut ini pada berkas 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
Untuk mengaktifkan TLS internal, tambahkan konfigurasi berikut ini pada berkas milvus.yaml
:
Ingatlah untuk mengganti bidang internaltls.sni
dengan Nama Umum di sertifikat Anda.
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
membuat Milvus CR:
kubectl create -f milvus.yaml
untuk Milvus Helm
Letakkan file sertifikat di direktori kerja Anda. Struktur direktori akan terlihat seperti ini:
├── values.yaml (to be created later)
├── server.pem
├── server.key
└── ca.pem
Buat sebuah rahasia dengan file sertifikat:
kubectl create secret generic certs --from-file=server.pem --from-file=server.key --from-file=ca.pem
Untuk mengaktifkan TLS eksternal, tambahkan konfigurasi berikut ini pada berkas 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
Untuk mengaktifkan TLS internal, tambahkan konfigurasi berikut ini pada berkas values.yaml
:
Ingatlah untuk mengganti bidang internaltls.sni
dengan Nama Umum dalam sertifikat Anda.
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
Buat rilis milvus:
helm repo add milvus https://zilliztech.github.io/milvus-helm/
helm repo update milvus
helm install my-release milvus/milvus -f values.yaml
Memverifikasi TLS internal yang diaktifkan
Sulit untuk memverifikasi TLS internal secara langsung. Anda dapat memeriksa log Milvus untuk melihat apakah TLS internal telah diaktifkan.
Pada log Milvus, Anda akan melihat pesan berikut ini jika TLS internal diaktifkan:
[...date time...] [INFO] [utils/util.go:56] ["Internal TLS Enabled"] [value=true]
Menghubungkan ke server Milvus dengan TLS
Untuk interaksi SDK, gunakan pengaturan berikut ini tergantung pada mode TLS.
Koneksi TLS satu arah
Sediakan jalur ke server.pem
dan pastikan server_name
cocok dengan CommonName
yang dikonfigurasi dalam sertifikat.
from pymilvus import MilvusClient
client = MilvusClient(
uri="https://localhost:19530",
secure=True,
server_pem_path="path_to/server.pem",
server_name="localhost"
)
Koneksi TLS dua arah
Sediakan jalur ke client.pem
, client.key
, dan ca.pem
, dan pastikan server_name
cocok dengan CommonName
yang dikonfigurasi dalam sertifikat.
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"
)
Lihat example_tls1.py dan example_tls2.py untuk informasi lebih lanjut.
Menyambungkan ke server Milvus RESTful dengan TLS
Untuk API RESTful, Anda dapat memeriksa tls dengan menggunakan perintah curl
.
Koneksi TLS satu arah
curl --cacert path_to/ca.pem https://localhost:8080/v2/vectordb/collections/list
Koneksi TLS dua arah
curl --cert path_to/client.pem --key path_to/client.key --cacert path_to/ca.pem https://localhost:8080/v2/vectordb/collections/list