🚀 Coba Zilliz Cloud, Milvus yang sepenuhnya terkelola, secara gratis—rasakan performa 10x lebih cepat! Coba Sekarang>>

milvus-logo
LFAI
Beranda
  • Panduan Administrasi
  • Home
  • Docs
  • Panduan Administrasi

  • Keamanan

  • Enkripsi dalam Perjalanan

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

  1. Buat berkas gen.sh.
mkdir cert && cd cert
touch gen.sh
  1. 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 membutuhkan server.pem dan server.key dari sisi server, dan server.pem dari sisi klien.
    • 2: Otentikasi dua arah, di mana server dan klien memerlukan sertifikat untuk membuat koneksi yang aman. Mode ini memerlukan server.pem, server.key, dan ca.pem dari sisi server, dan client.pem, client.key, dan ca.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

Coba Milvus yang Dikelola secara Gratis

Zilliz Cloud bebas masalah, didukung oleh Milvus dan 10x lebih cepat.

Mulai
Umpan balik

Apakah halaman ini bermanfaat?