Membuat deployment dengan enkripsi TLS di Kubernetes

Spanner Omni menggunakan TLS 1.3 untuk mengenkripsi data yang mengalir antara klien dan server, serta antara server Spanner Omni. Spanner Omni menyediakan mTLS untuk keamanan yang ditingkatkan, di mana kedua pihak saling menetapkan keaslian sebelum bertukar data. Jika Anda menggunakan enkripsi, server Anda harus berkomunikasi melalui mTLS. Anda dapat memilih apakah klien dan server Anda juga menggunakan mTLS.

Sebelum memulai

Pastikan Anda memenuhi persyaratan berikut:

  • Membuat cluster Kubernetes Konfigurasi ini mendukung Google Kubernetes Engine (GKE) dan Amazon Elastic Kubernetes Service (Amazon EKS). Anda mungkin perlu menyesuaikan konfigurasi agar berfungsi di lingkungan lain.

  • Pastikan cluster Kubernetes dapat mengakses artefak Artifact Registry yang menghosting container Spanner Omni.

  • Instal dan konfigurasi alat command line kubectl dan Helm.

  • Jika Anda menyiapkan lingkungan Kubernetes di mesin platform virtualisasi vSphere, nonaktifkan virtualisasi Time Stamp Counter (TSC) dengan menambahkan monitor_control.virtual_rdtsc = FALSE ke file konfigurasi .vmx virtual machine. Hal ini memastikan TrueTime berfungsi dengan benar.

  • Pastikan lingkungan Anda memenuhi persyaratan sistem Spanner Omni.

Langkah 1: Buat sertifikat

Anda harus membuat tiga set sertifikat:

  • Sertifikat API: Sertifikat ini membantu melindungi server Spanner Omni API.

  • Sertifikat server: Sertifikat ini membantu melindungi komunikasi antarserver.

  • Sertifikat klien: Pengguna akhir atau aplikasi menggunakan sertifikat ini untuk menetapkan identitas dan kepercayaan mereka dengan server Spanner Omni.

Certification Authority (CA) menerbitkan sertifikat ini. Spanner Omni menyediakan alat untuk membuat CA yang ditandatangani sendiri dan ketiga jenis sertifikat.

Lakukan langkah-langkah berikut di salah satu mesin Anda. Langkah-langkah ini mengasumsikan bahwa namespace-nya adalah spanner-ns. Ubah ini ke namespace yang ingin Anda gunakan dalam deployment.

Anda dapat membuat sertifikat ini di workstation menggunakan Spanner Omni CLI.

1. Membuat Certificate Authority (CA)

Certification Authority (CA) menerbitkan semua sertifikat. Organisasi Anda mungkin memiliki CA pusat, atau Anda dapat menggunakan CA publik. Meskipun Anda dapat menggunakan CA yang sama untuk semua sertifikat, sertifikat API dan sertifikat klien harus menggunakan CA yang sama.

Spanner Omni memungkinkan Anda membuat CA pribadi.

./google/spanner/bin/spanner certificates create-ca --ca-certificate-directory=certs

Perintah create-ca akan membuat sertifikat CA di direktori certs. Anda dapat menyalin sertifikat ini untuk digunakan sebagai CA untuk sertifikat API, atau membuat CA yang berbeda. Pastikan Anda menggunakan CA yang benar saat membuat sertifikat.

cp certs/ca.crt certs/ca-api.crt

Direktori $HOME/.spanner/private-keys berisi kunci pribadi untuk CA. Sangat penting untuk mencadangkan dan mengamankan direktori ini. Pengguna yang memiliki akses ke kunci pribadi dapat menandatangani sertifikat arbitrer yang dipercaya oleh klien yang memercayai CA yang ditandatangani sendiri. Jika ingin, Anda dapat membuat CA tambahan (atau menggunakan CA tepercaya eksternal) untuk sertifikat API. Dokumen ini menggunakan CA yang sama untuk semua jenis sertifikat.

2. Membuat sertifikat server

Anda harus membuat dua jenis sertifikat server:

  • Sertifikat API: Gunakan sertifikat ini untuk mengenkripsi komunikasi dari sistem yang berinteraksi dengan deployment.

  • Sertifikat server Spanner: Server Spanner Omni menggunakan sertifikat ini untuk mengenkripsi komunikasi satu sama lain.

Konfigurasi ini memberikan fleksibilitas dalam mengelola sertifikat tersebut. Misalnya, Anda dapat menggunakan rotasi sertifikat.

Membuat sertifikat server Spanner

Untuk membuat sertifikat server, jalankan perintah berikut:

# Comma-separate names of the Spanner servers; wildcards are supported.
SERVER_NAMES=*.pod.NAMESPACE
./google/spanner/bin/spanner certificates create-server --hostnames=${SERVER_NAMES} --ca-certificate-directory certs --output-directory certs

Perintah ini akan membuat server.crt dan server.key di direktori certs.

Membuat sertifikat API

Untuk membuat sertifikat API, jalankan perintah berikut:

OMNI_ENDPOINT=spanner.NAMESPACE
./google/spanner/bin/spanner certificates create-server --filename-prefix=api --hostnames=${OMNI_ENDPOINT} --ca-certificate-directory certs --output-directory certs

Perintah ini akan membuat api.crt dan api.key di direktori certs. Jika perlu, gunakan CA tepercaya eksternal untuk sertifikat API.

3. Membuat sertifikat klien

Anda dapat menggunakan sertifikat klien untuk mengautentikasi pengguna dan aplikasi. Sertifikat klien mengaktifkan mTLS antara klien dan server. Anda dapat melewati langkah ini jika tidak berencana menggunakan mTLS.

CA yang sama yang menandatangani sertifikat API harus menandatangani sertifikat klien, yang juga harus berisi nama pengguna untuk otorisasi. Untuk contoh ini, gunakan pengguna admin, yang merupakan pengguna default untuk setiap database baru. Untuk mengetahui informasi selengkapnya, lihat Autentikasi dan otorisasi di Spanner Omni.

USERNAME=admin
./google/spanner/bin/spanner certificates create-client $USERNAME --output-directory clientcerts --ca-certificate-directory certs

Perintah ini akan membuat client.crt dan client.key di direktori clientcerts. Kirim file ini ke mesin mana pun yang terhubung ke deployment.

Jika Anda berencana menggunakan sertifikat klien dengan library klien Java, Anda harus membuat kunci sertifikat dalam format PKCS#8. Gunakan perintah berikut:

USERNAME=admin
./google/spanner/bin/spanner certificates create-client $USERNAME --output-directory clientcerts --ca-certificate-directory certs --generate-pkcs8-key

4. Membuat keyset wrapper

Spanner Omni menggunakan keyset wrapper Kunci Enkripsi Kunci (KEK) yang dipasang di /spanner/kms/wrapper_key di setiap pod server untuk mengenkripsi kunci internal, seperti kunci penandatanganan dan enkripsi token.

Untuk membuat file keyset wrapper baru menggunakan spanner keys create-keyset, jalankan perintah berikut:

./google/spanner/bin/spanner keys create-keyset --output-file=kms/wrapper_key

Secara default, spanner keys create-keyset menghasilkan kunci AES256_GCM. Untuk membuat jenis kunci yang berbeda, gunakan flag --key-template dengan salah satu nilai jenis kunci berikut: AES256_GCM, AES128_GCM, AES256_GCM_RAW, CHACHA20_POLY1305, atau XCHACHA20_POLY1305.

Langkah 2: Kirim sertifikat, keyset wrapper, dan sandi administrator ke cluster Kubernetes

Jalankan perintah berikut untuk membuat namespace dan mengirim sertifikat, keyset wrapper, dan sandi administrator ke cluster Kubernetes Anda:

  1. Buat namespace:

    kubectl create namespace NAMESPACE
    
  2. Kirim sertifikat TLS ke secret:

    kubectl create secret generic tls-certs \
      --from-file=ca.crt="certs/ca.crt" \
      --from-file=ca-api.crt="certs/ca-api.crt" \
      --from-file=server.crt="certs/server.crt" \
      --from-file=server.key="certs/server.key" \
      --from-file=api.crt="certs/api.crt" \
      --from-file=api.key="certs/api.key" \
      -n NAMESPACE
    
  3. Kirim keyset wrapper ke secret (wrapper-key), yang dipasang di /spanner/kms di setiap pod server:

    kubectl create secret generic wrapper-key \
      --from-file=wrapper_key="kms/wrapper_key" \
      -n NAMESPACE
    
  4. Buat file sandi yang berisi sandi untuk pengguna admin default, dengan izin terbatas (hanya dapat dibaca oleh pemiliknya, izin 600):

    printf '%s' 'PASSWORD' > admin_password.txt
    chmod 600 admin_password.txt
    

    Sandi harus memenuhi persyaratan berikut:

    • Panjangnya antara 8 dan 32 karakter.
    • Minimal satu karakter huruf besar.
    • Minimal satu karakter huruf kecil.
    • Minimal satu angka.
    • Setidaknya satu karakter khusus.
  5. Buat secret untuk sandi administrator:

    kubectl create secret generic spanner-admin-password \
      --from-file=password=admin_password.txt \
      -n NAMESPACE
    

Langkah 3: Buat deployment dengan enkripsi TLS

Ikuti langkah-langkah berikut untuk membuat deployment dengan enkripsi TLS.

1. Menyiapkan konfigurasi Helm

Lihat Membuat konfigurasi diagram Helm dan buat konfigurasi deployment untuk lingkungan Anda.

Untuk mengaktifkan TLS dan mengonfigurasi sandi administrator, tetapkan nilai berikut dalam konfigurasi chart Helm Anda:

# Enables TLS
global:
  insecureMode: false

# Enables client certificate authentication (mTLS)
deployment:
  enableClientCertificateAuthentication: true
  # Name of the secret containing the administrator password
  adminPasswordSecret: spanner-admin-password

2. Membuat deployment

Jalankan perintah berikut untuk membuat deployment:

kubectl create ns monitoring

helm upgrade --install spanner-omni oci://us-docker.pkg.dev/spanner-omni/charts/spanner-omni \
  --version VERSION \
  --set global.platform=gke \
  --set global.insecureMode=false \
  --set deployment.enableClientCertificateAuthentication=true \
  --set deployment.adminPasswordSecret=spanner-admin-password \
  --namespace NAMESPACE \
  --set monitoring.enabled=true

Perintah ini memicu tugas bootstrap. Anda dapat melacak progresnya dengan melihat log tugas ini:

kubectl logs -n NAMESPACE -l app.kubernetes.io/component=bootstrap -f

Output akan menunjukkan progresnya. Setelah selesai, Anda akan melihat pesan yang menyatakan "Deployment created successfully".

3. Memeriksa status pod

Jalankan perintah berikut untuk memverifikasi status pod:

kubectl get pods --watch --namespace NAMESPACE

Semua pod berada dalam status READY.

4. Memperbarui sertifikat dan deployment dengan detail load balancer

Langkah ini diperlukan jika Anda ingin klien terhubung dari luar cluster Kubernetes.

# Get the service details
kubectl get service spanner -n NAMESPACE

# The EXTERNAL-IP:PORT is the API or deployment endpoint for your deployment.
# Update the API certificate with these details.
OMNI_ENDPOINT=EXTERNAL_IP,spanner.NAMESPACE.svc
./google/spanner/bin/spanner certificates update \
    --certificate-file=certs/api.crt \
    --certificate-key-file=certs/api.key \
    --hostnames=${OMNI_ENDPOINT} \
    --ca-certificate-directory=certs

# Update the secrets in Kubernetes
kubectl patch secret tls-certs -n NAMESPACE -p "{\"data\":{\"api.crt\":\"$(base64 -w 0 certs/api.crt)\"}}"

Langkah 4: Berinteraksi dengan Spanner Omni

Anda dapat berinteraksi dengan deployment Spanner Omni dari VM mana pun menggunakan Spanner Omni CLI.

Jika Anda mengaktifkan mTLS untuk klien, gunakan flag berikut dengan setiap perintah:

  • --client-certificate-directory=CLIENT_CERTIFICATE_DIRECTORY

  • --ca-certificate-file=API_CA_CERT_FILE_PATH

1. Login ke Spanner Omni (opsional)

Login ke Spanner Omni (langkah ini opsional jika Anda menggunakan sertifikat klien):

./google/spanner/bin/spanner auth login admin \
    --ca-certificate-file=certs/ca-api.crt \
    --deployment-endpoint=DEPLOYMENT_ENDPOINT

Saat diminta, masukkan sandi yang dikonfigurasi di admin_password.txt.

Successfully logged in as "admin"

2. Buat database

Jalankan perintah berikut untuk membuat database:

./google/spanner/bin/spanner --deployment-endpoint=DEPLOYMENT_ENDPOINT databases create DATABASE_NAME --ca-certificate-file=certs/ca-api.crt --client-certificate-directory=clientcerts

3. Membuka SQL Shell

Jalankan perintah berikut untuk membuka shell:

./google/spanner/bin/spanner sql --database=DATABASE_NAME --deployment-endpoint=DEPLOYMENT_ENDPOINT --ca-certificate-file=certs/ca-api.crt --client-certificate-directory=clientcerts

4. Membuat tabel dan menambahkan data

Jalankan perintah SQL berikut:

spanner> CREATE TABLE names (nameId INT64 NOT NULL, name String(100)) PRIMARY KEY (nameId);
Query OK, 0 rows affected (4.62 sec)

spanner> INSERT names (nameId, name) VALUES (1, "Jack");
Query OK, 1 rows affected (0.18 sec)

5. Memverifikasi deployment

Untuk mencantumkan database, jalankan perintah berikut:

./google/spanner/bin/spanner databases list --ca-certificate-file=certs/ca-api.crt --client-certificate-directory=clientcerts --deployment-endpoint=DEPLOYMENT_ENDPOINT

Outputnya akan terlihat mirip seperti berikut:

NAMA STATUS VERSION_RETENTION_PERIOD EARLIEST_VERSION_TIME ENABLE_DROP_PROTECTION
DATABASE_NAME SIAP 1j 2025-02-07T12:25:30Z false

Untuk mengkueri data, jalankan perintah berikut:

./google/spanner/bin/spanner sql --database=DATABASE_NAME --ca-certificate-file=certs/ca-api.crt --client-certificate-directory=clientcerts --deployment-endpoint=DEPLOYMENT_ENDPOINT

Jalankan perintah SQL berikut:

SHOW TABLES;
SELECT * FROM names;

Atau, Anda dapat mengikuti petunjuk di Menggunakan PGAdapter dengan Spanner Omni untuk mengonfigurasi PGAdapter dan berinteraksi menggunakan alat seperti psql.

Langkah 5: Memantau deployment

Jika Anda menginstal Spanner Omni dengan monitoring.enabled=true, Prometheus akan mengumpulkan metrik. Anda dapat menggunakan Grafana untuk memvisualisasikan metrik ini.

1. Mendapatkan detail layanan

Jalankan perintah berikut untuk mendapatkan detail layanan:

# Prometheus service details. Default port is 9090.
kubectl get service prometheus-service -n monitoring

# Grafana service details. Default port is 3000.
kubectl get service grafana -n monitoring

Langkah berikutnya