Membuat deployment dengan enkripsi TLS di VM

Dokumen ini menjelaskan cara menambahkan enkripsi TLS ke deployment Spanner Omni di virtual machine (VM). Deployment dengan fitur keamanan jaringan menggunakan Transport Layer Security (TLS) 1.3 untuk mengenkripsi dan mengautentikasi komunikasi dalam deployment dan dengan kliennya. Spanner Omni menyediakan mutual TLS (mTLS) untuk keamanan yang lebih baik, dengan kedua pihak menetapkan keaslian sebelum bertukar data. mTLS bersifat opsional antara klien dan server, tetapi server Spanner Omni berkomunikasi satu sama lain melalui mTLS.

Sebelum memulai

Sebelum memulai, pastikan lingkungan Anda memenuhi persyaratan berikut:

  • Pastikan Anda memiliki akses SSH ke setiap mesin dalam deployment. Akses ini memungkinkan Anda mendownload dan menjalankan biner Spanner Omni.

  • Jaringan Anda harus mengizinkan komunikasi TCP di port 15000 hingga 15030.

  • Setiap mesin harus memiliki penyimpanan yang memadai untuk menghosting data yang ditangani deployment.

  • Tinjau halaman Persyaratan sistem untuk memastikan penyiapan Anda memenuhi persyaratan.

  • Jika Anda menjalankan biner di platform virtualisasi vSphere, nonaktifkan virtualisasi TSC. Untuk melakukannya, tambahkan setelan monitor_control.virtual_rdtsc = FALSE ke file konfigurasi .vmx virtual machine.

Langkah 1: Buat deployment tanpa enkripsi TLS

Ikuti langkah-langkah di bagian Membuat deployment VM Spanner Omni tanpa enkripsi. Pastikan deployment VM Anda tanpa fitur enkripsi dan keamanan berfungsi dengan baik. Halaman ini mengasumsikan bahwa Anda telah membuat deployment regional dengan tiga zona.

Langkah 2: Buat sertifikat

Anda perlu membuat tiga set sertifikat:

Jenis sertifikat Deskripsi
Sertifikat API Sertifikat API membantu melindungi server Spanner API.
Sertifikat Server Sertifikat server membantu melindungi komunikasi antarserver.
Sertifikat klien Pengguna akhir atau aplikasi menggunakan sertifikat klien untuk menetapkan identitas dan kepercayaan mereka dengan server Spanner Omni.

Certification Authority (CA) menerbitkan sertifikat ini. Spanner Omni menyediakan alat untuk membuat CA dan ketiga jenis sertifikat. Lakukan langkah-langkah berikut di salah satu mesin Anda.

Anda dapat membuat sertifikat ini di workstation menggunakan Spanner Omni CLI, lalu mentransfer file sertifikat ke setiap server Spanner Omni. Untuk mengetahui informasi selengkapnya, lihat Panduan memulai menggunakan Spanner Omni CLI.

Untuk membuat sertifikat, Anda harus menyelesaikan langkah-langkah berikut:

Membuat Certificate Authority (CA)

Otoritas ini adalah CA root untuk semua sertifikat klien dan server yang Anda buat pada langkah-langkah berikut.

spanner certificates create-ca --ca-certificate-directory=certs

Direktori certs berisi sertifikat CA. Buat salinan sertifikat ini untuk digunakan sebagai CA untuk sertifikat API.

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

Direktori $HOME/.spanner/private-keys berisi kunci pribadi untuk CA. Cadangkan dan amankan direktori ini. Pengguna yang memiliki akses ke kunci pribadi dapat menandatangani sertifikat arbitrer yang dipercaya oleh klien yang memercayai CA yang ditandatangani sendiri. Meskipun Anda dapat menggunakan CA yang sama untuk semua sertifikat, sertifikat API dan sertifikat klien wajib menggunakan CA yang sama. Secara opsional, Anda dapat membuat CA tambahan (atau menggunakan CA eksternal tepercaya) untuk sertifikat API. Pastikan Anda menggunakan CA yang tepat dalam langkah-langkah berikut saat membuat sertifikat. Dokumen ini menggunakan CA yang sama untuk semua jenis sertifikat.

Membuat sertifikat server

Anda membuat dua jenis sertifikat server:

Penyiapan ini memberikan pengelolaan sertifikat yang lebih fleksibel, seperti rotasi sertifikat.

Membuat sertifikat server Spanner

Server Spanner Omni menggunakan sertifikat server untuk mengenkripsi komunikasi satu sama lain (komunikasi antarserver).

Buat sertifikat server dengan menjalankan perintah berikut. Ganti SERVER_LIST dengan daftar nama server atau akhiran Spanner yang dipisahkan koma.

SERVER_NAMES=SERVER_LIST
spanner certificates create-server --hostnames=${SERVER_NAMES} --ca-certificate-directory certs --output-directory certs

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

Membuat sertifikat API

Sertifikat API mengenkripsi komunikasi dari sistem yang berinteraksi dengan deployment. Menggunakan sertifikat terpisah untuk API dan komunikasi antarserver memungkinkan Anda mengelola dan merotasi setiap jenis secara independen.

Buat sertifikat API dengan menjalankan perintah berikut. Ganti LB_DNS dengan DNS load balancer.

SERVER_NAMES=LB_DNS
spanner certificates create-server --filename-prefix=api --hostnames=${SERVER_NAMES} --ca-certificate-directory certs --output-directory certs

Perintah ini akan membuat dua file lagi, api.crt dan api.key, di direktori certs. Jika diperlukan, Anda dapat menggunakan CA eksternal tepercaya untuk sertifikat API.

Mendistribusikan sertifikat ke semua server

Salin direktori certs ke semua server lain dalam deployment untuk memulainya dengan fitur keamanan jaringan.

scp -r certs REMOTE_HOST:SPANNER_DIR/certs

Langkah 3: Buat sertifikat klien

Anda dapat menggunakan sertifikat klien untuk mengautentikasi pengguna dan aplikasi di Spanner. Sertifikat klien memungkinkan mTLS antara klien dan server.

Sertifikat klien harus ditandatangani oleh CA yang sama dengan sertifikat API dan harus berisi nama pengguna untuk otorisasi. Contoh ini menggunakan pengguna admin, yang merupakan pengguna default untuk setiap database. Untuk mengetahui informasi selengkapnya tentang pengguna, peran, dan opsi autentikasi, lihat Autentikasi dan otorisasi di Spanner Omni.

USERNAME=admin
spanner certificates create-client $USERNAME --output-directory clientcerts --ca-certificate-directory certs

Perintah ini akan membuat file client.crt dan client.key di direktori clientcerts. Kirim file ini ke komputer mana pun yang terhubung ke server 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
spanner certificates create-client $USERNAME \
    --output-directory clientcerts \
    --ca-certificate-directory certs \
    --generate-pkcs8-key

Langkah 4: Buat keyset wrapper

Spanner Omni menggunakan keyset wrapper Kunci Enkripsi Kunci (KEK) untuk mengenkripsi kunci internal, seperti kunci penandatanganan dan enkripsi token. Server Spanner Omni membaca keyset ini dari BASE_DIR/kms/wrapper_key.

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

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.

Mendistribusikan keyset wrapper ke semua server

Salin direktori kms ke direktori dasar di semua server dalam deployment sebelum memulainya:

scp -r kms REMOTE_HOST:BASE_DIR/kms

Langkah 5: Mulai server

Untuk memulai server dalam deployment Anda, ikuti langkah-langkah berikut:

  1. Pastikan Anda telah membuat sertifikat dan keyset wrapper serta menyalinnya ke semua server dalam deployment Anda.
  2. Buat direktori dasar di setiap server untuk menyimpan data, metadata, dan log. Jika server perlu dimulai ulang, tentukan direktori dasar yang sama untuk kontinuitas.
  3. Mulai setiap server menggunakan petunjuk untuk jenis deployment Anda di bagian berikut.

Deployment server tunggal

Untuk memulai deployment server tunggal dengan enkripsi, buat file sandi untuk pengguna admin awal dan mulai server dengan metode dan sertifikat autentikasi yang didukung.

  1. Buat file sandi dengan izin yang ditetapkan ke 600 agar hanya dapat dibaca oleh pemiliknya:

    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.
  2. Mulai server tunggal dengan TLS dan autentikasi yang dikonfigurasi:

    nohup spanner start-single-server \
        --base-dir=BASE_DIR \
        --certificate-directory=${HOME}/.spanner/certs \
        --auth-methods=password,client-certificate \
        --password-protocol=opaque \
        --initial-admin-password-file=admin_password.txt &
    

    Saat startup awal, spanner start-single-server menetapkan metode autentikasi dan protokol sandi yang didukung, serta membuat pengguna admin awal dengan peran roles/spanner.admin menggunakan file sandi yang ditentukan.

Untuk mengetahui informasi tentang cara berinteraksi dengan deployment Anda, lihat Langkah 8: Berinteraksi dengan deployment.

Deployment penyebaran skala

Untuk deployment penyebaran skala, mulai server di setiap mesin. Nilai untuk server-address dan zone harus cocok dengan nilai dalam konfigurasi deployment. Jaringan harus me-resolve server-address. Server menggunakan server-address untuk komunikasi internal. Jalankan perintah berikut untuk memulai server root:

nohup spanner start \
    --root \
    --server-address=HOST_NAME \
    --zone=ZONE_NAME \
    --base-dir=BASE_DIR \
    --certificate-directory=${HOME}/.spanner/certs &

Perintah berikut menunjukkan contoh dengan nilai tertentu:

nohup spanner start \
    --root \
    --server-address=rootserver1 \
    --zone=us-central-1a \
    --base-dir=./spanbasedir \
    --certificate-directory=${HOME}/.spanner/certs &

Setelah server berjalan di setiap mesin, Anda siap membuat deployment.

Langkah 6: Buat deployment dengan enkripsi TLS

Untuk membuat deployment, ikuti langkah-langkah berikut:

  1. Buat file sandi yang berisi sandi untuk pengguna admin default dengan izinnya ditetapkan ke 600 (hanya dapat dibaca oleh pemiliknya):

    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.
  2. Pastikan deployment.yaml menyertakan metode autentikasi dan protokol sandi yang Anda pilih:

    deployment_settings:
      security_settings:
        authentication_methods:
          - AUTHENTICATION_METHOD_PASSWORD
          - AUTHENTICATION_METHOD_CLIENT_CERTIFICATE
        password_authentication_protocol: PASSWORD_AUTHENTICATION_PROTOCOL_OPAQUE
    

    Anda dapat menentukan satu atau beberapa metode autentikasi berikut:

    • AUTHENTICATION_METHOD_PASSWORD: autentikasi sandi
    • AUTHENTICATION_METHOD_CLIENT_CERTIFICATE: autentikasi sertifikat klien

    Anda dapat menentukan protokol sandi berikut:

    • PASSWORD_AUTHENTICATION_PROTOCOL_OPAQUE: Protokol OPAQUE
  3. Jalankan perintah spanner deployment create dari salah satu server root untuk membuat deployment. Tentukan direktori dasar dengan flag --base-dir (menggunakan BASE_DIR yang sama yang ditentukan saat memulai server root), dan berikan file sandi administrator dengan flag --admin-password-file:

    spanner deployment create \
        --config-file=deployment.yaml \
        --base-dir=BASE_DIR \
        --admin-password-file=admin_password.txt
    

Konsol untuk setiap mesin menampilkan pesan yang menunjukkan bahwa deployment kini mencakup enkripsi TLS. Semua server berkomunikasi satu sama lain melalui saluran terenkripsi.

Langkah 7: (Opsional) Mengonfigurasi load balancer

Untuk mengelola dan mendistribusikan traffic klien di seluruh server dalam deployment Anda, siapkan load balancer. Pastikan konfigurasi load balancer untuk health check menggunakan HTTPS, bukan HTTP. Gunakan detail konfigurasi berikut:

Parameter Nilai
Protokol TCP
IP Backend Alamat IP server Anda.
Port 15000 (Ini adalah port default. Jika Anda menggunakan port lain dalam flag --server-address, gunakan port tersebut.)
URL health check https://IP_ADDRESS:15012/healthz
Strategi penyeimbangan roundrobin (mendistribusikan permintaan secara berurutan di seluruh server)

Langkah 8: Berinteraksi dengan deployment

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

Anda harus menyertakan flag berikut dengan setiap perintah untuk membuat koneksi terenkripsi:

  • --ca-certificate-file=certs/ca-api.crt

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

  • --client-certificate-directory=clientcerts

Untuk login dan berinteraksi dengan deployment Anda, ikuti langkah-langkah berikut:

  1. Login ke Spanner Omni

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

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

    Successfully logged in as "admin"
    
  2. Buat database

    spanner --deployment-endpoint=ENDPOINT databases create mydb --ca-certificate-file=certs/ca-api.crt
    
    Creating database...done.
    
  3. Membuka SQL Shell

    spanner sql --database=mydb --ca-certificate-file=certs/ca-api.crt
    
    Connected.
    spanner>
    
  4. Membuat tabel dan menambahkan data

    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 data

    Cantumkan database:

    spanner databases list --ca-certificate-file=certs/ca-api.crt
    
    NAME  STATE  VERSION_RETENTION_PERIOD  EARLIEST_VERSION_TIME  KMS_KEY_NAME  ENABLE_DROP_PROTECTION
    mydb  READY  1h                        2025-02-07T12:25:30Z                 false
    

    Dapatkan data dari tabel:

    spanner sql --database=mydb --ca-certificate-file=certs/ca-api.crt
    
    Connected.
    spanner> show tables;
    +----------------+
    | Tables_in_mydb |
    +----------------+
    | names          |
    +----------------+
    1 rows in set (0.14 sec)
    
    spanner> select * from names;
    +--------+--------+
    | nameId | name   |
    +--------+--------+
    | 1      | Jack   |
    +--------+--------+
    1 rows in set (18.69 msecs)
    

Langkah 9: (Opsional) Menskalakan deployment

Anda dapat menambahkan server non-root ke zona untuk menskalakan kapasitasnya. Untuk menambahkan server non-root, ikuti langkah-langkah berikut:

  1. Buat sertifikat server untuk server non-root dan salin sertifikat ke server tersebut. Untuk mengetahui informasi selengkapnya, lihat Langkah 2: Buat sertifikat.

  2. Salin keyset wrapper ke server non-root. Untuk mengetahui informasi selengkapnya, lihat Langkah 4: Buat keyset wrapper.

  3. Mulai server non-root:

    spanner start \
        --server-address=NON_ROOT_MACHINE \
        --join-servers=ROOT_SERVER1,ROOT_SERVER2,ROOT_SERVER3 \
        --zone=us-central1-a \
        --base-dir=./spandir \
        --certificate-directory=${HOME}/.spanner/certs
    

Langkah berikutnya