Mengonfigurasi sertifikat SSL/TLS

Halaman ini menjelaskan cara mengonfigurasi instance untuk menggunakan SSL/TLS. Anda juga dapat mempelajari lebih lanjut cara Cloud SQL menggunakan sertifikat SSL/TLS yang dikelola sendiri untuk terhubung ke instance Cloud SQL dengan aman.

Ringkasan

Cloud SQL membuat sertifikat server (server-ca.pem) secara otomatis saat Anda membuat instance. Sebaiknya menerapkan semua koneksi untuk menggunakan SSL/TLS.

Untuk memvalidasi identitas klien/server menggunakan sertifikat SSL/TLS, Anda harus membuat sertifikat klien dan mendownload sertifikat tersebut ke mesin host klien MySQL Anda.

Jika Anda menerapkan SSL untuk suatu instance, instance tersebut perlu dimulai ulang. Memulai ulang mungkin juga diperlukan setelah Anda mengubah sertifikat SSL/TLS. Saat mulai ulang diperlukan, Cloud SQL akan otomatis memulai ulang instance. Mulai ulang sebuah instance dapat mengakibatkan periode nonaktif.

Menerapkan enkripsi SSL/TLS

Anda dapat menggunakan setelan mode SSL untuk menerapkan enkripsi SSL dengan cara berikut:

  • Izinkan koneksi non-SSL/non-TLS dan SSL/TLS. Sertifikat klien tidak diverifikasi untuk koneksi SSL/TLS. Ini adalah setelan defaultnya.

  • Hanya izinkan koneksi yang dienkripsi dengan SSL/TLS. Sertifikat klien tidak diverifikasi untuk koneksi SSL.

  • Hanya izinkan koneksi yang dienkripsi dengan SSL/TLS dan dengan sertifikat klien yang valid.

Jika Anda memilih Izinkan koneksi non-SSL/non-TLS dan SSL/TLS untuk instance Cloud SQL Anda, koneksi SSL/TLS akan diterima, serta koneksi yang tidak dienkripsi dan tidak aman. Jika Anda tidak memerlukan SSL/TLS untuk semua koneksi, koneksi yang tidak dienkripsi tetap diizinkan. Oleh karena itu, jika Anda mengakses instance menggunakan IP publik, kami sangat menyarankan agar Anda menerapkan SSL untuk semua koneksi.

Anda dapat terhubung langsung ke instance dengan menggunakan sertifikat SSL/TLS, atau menghubungkannya menggunakan Proxy Auth Cloud SQL atau Konektor Cloud SQL. Jika Anda terhubung menggunakan Proxy Auth Cloud SQL atau Cloud SQL Connectors, koneksi akan otomatis dienkripsi dengan SSL/TLS. Dengan Proxy Auth Cloud SQL dan Konektor Cloud SQL, identitas klien dan server juga otomatis diverifikasi, terlepas dari setelan mode SSL.

Untuk mengaktifkan persyaratan SSL/TLS, lakukan hal berikut:

Konsol

  1. Di konsol Google Cloud, buka halaman Instance Cloud SQL.

    Buka Instance Cloud SQL

  2. Untuk membuka halaman Overview instance, klik nama instance.
  3. Klik Connections dari menu navigasi SQL.
  4. Pilih tab Keamanan.
  5. Pilih salah satu opsi berikut:
    • Mengizinkan traffic jaringan yang tidak dienkripsi (tidak direkomendasikan)
    • Hanya izinkan koneksi SSL. Opsi ini hanya mengizinkan koneksi yang menggunakan enkripsi SSL/TLS. Sertifikat tidak divalidasi.
    • Wajibkan sertifikat klien tepercaya. Opsi ini hanya mengizinkan koneksi dari klien yang menggunakan sertifikat klien yang valid dan dienkripsi SSL.

gcloud

   gcloud sql instances patch INSTANCE_NAME \
   --ssl-mode=SSL_ENFORCEMENT_MODE
  

Ganti SSL_ENFORCEMENT_MODE dengan salah satu opsi berikut:

  • ALLOW_UNENCRYPTED_AND_ENCRYPTED mengizinkan koneksi non-SSL/non-TLS dan SSL/TLS. Untuk koneksi SSL, sertifikat klien tidak diverifikasi. Ini adalah nilai defaultnya.
  • ENCRYPTED_ONLY hanya mengizinkan koneksi yang dienkripsi dengan SSL/TLS. Sertifikat klien tidak diverifikasi untuk koneksi SSL.
  • TRUSTED_CLIENT_CERTIFICATE_REQUIRED hanya mengizinkan koneksi yang dienkripsi dengan SSL/TLS dan dengan sertifikat klien yang valid.
  • Untuk mengetahui informasi selengkapnya, lihat Setelan Cloud SQL untuk MySQL.

Terraform

Untuk menerapkan enkripsi SSL/TLS, gunakan resource Terraform:

resource "google_sql_database_instance" "mysql_instance" {
  name             = "mysql-instance"
  region           = "asia-northeast1"
  database_version = "MYSQL_8_0"
  settings {
    tier = "db-f1-micro"
    ip_configuration {
      # The following SSL enforcement options only allow connections encrypted with SSL/TLS and with
      # valid client certificates. Please check the API reference for other SSL enforcement options:
      # https://cloud.google.com/sql/docs/postgres/admin-api/rest/v1beta4/instances#ipconfiguration
      require_ssl = "true"
      ssl_mode    = "TRUSTED_CLIENT_CERTIFICATE_REQUIRED"
    }
  }
  # set `deletion_protection` to true, will ensure that one cannot accidentally delete this instance by
  # use of Terraform whereas `deletion_protection_enabled` flag protects this instance at the GCP level.
  deletion_protection = false
}

Menerapkan perubahan

Untuk menerapkan konfigurasi Terraform di project Google Cloud, selesaikan langkah-langkah di bagian berikut.

Menyiapkan Cloud Shell

  1. Luncurkan Cloud Shell.
  2. Tetapkan project Google Cloud default tempat Anda ingin menerapkan konfigurasi Terraform.

    Anda hanya perlu menjalankan perintah ini sekali per project, dan dapat dijalankan di direktori mana pun.

    export GOOGLE_CLOUD_PROJECT=PROJECT_ID

    Variabel lingkungan akan diganti jika Anda menetapkan nilai eksplisit dalam file konfigurasi Terraform.

Menyiapkan direktori

Setiap file konfigurasi Terraform harus memiliki direktorinya sendiri (juga disebut modul root).

  1. Di Cloud Shell, buat direktori dan file baru di dalam direktori tersebut. Nama file harus memiliki ekstensi .tf—misalnya main.tf. Dalam tutorial ini, file ini disebut sebagai main.tf.
    mkdir DIRECTORY && cd DIRECTORY && touch main.tf
  2. Jika mengikuti tutorial, Anda dapat menyalin kode contoh di setiap bagian atau langkah.

    Salin kode contoh ke dalam main.tf yang baru dibuat.

    Atau, salin kode dari GitHub. Tindakan ini direkomendasikan jika cuplikan Terraform adalah bagian dari solusi menyeluruh.

  3. Tinjau dan ubah contoh parameter untuk diterapkan pada lingkungan Anda.
  4. Simpan perubahan Anda.
  5. Lakukan inisialisasi Terraform. Anda hanya perlu melakukan ini sekali per direktori.
    terraform init

    Secara opsional, untuk menggunakan versi penyedia Google terbaru, sertakan opsi -upgrade:

    terraform init -upgrade

Menerapkan perubahan

  1. Tinjau konfigurasi dan pastikan resource yang akan dibuat atau diupdate oleh Terraform sesuai yang Anda inginkan:
    terraform plan

    Koreksi konfigurasi jika diperlukan.

  2. Terapkan konfigurasi Terraform dengan menjalankan perintah berikut dan memasukkan yes pada prompt:
    terraform apply

    Tunggu hingga Terraform menampilkan pesan "Apply complete!".

  3. Buka project Google Cloud Anda untuk melihat hasilnya. Di Konsol Google Cloud, buka resource Anda di UI untuk memastikan bahwa Terraform telah membuat atau mengupdatenya.

Menghapus perubahan

Untuk menghapus perubahan Anda, lakukan langkah-langkah berikut:

  1. Untuk menonaktifkan perlindungan penghapusan, di file konfigurasi Terraform Anda, tetapkan argumen deletion_protection ke false.
    deletion_protection =  "false"
  2. Terapkan konfigurasi Terraform terbaru dengan menjalankan perintah berikut dan memasukkan yes pada perintah:
    terraform apply
  1. Hapus resource yang sebelumnya diterapkan dengan konfigurasi Terraform Anda dengan menjalankan perintah berikut dan memasukkan yes pada prompt:

    terraform destroy

REST v1

  1. Sebelum menggunakan salah satu data permintaan, lakukan penggantian berikut:

    • PROJECT_ID: ID project
    • SSL_ENFORCEMENT_MODE: Gunakan salah satu opsi berikut:
      • ALLOW_UNENCRYPTED_AND_ENCRYPTED: mengizinkan koneksi non-SSL/non-TLS dan SSL/TLS. Untuk koneksi SSL, sertifikat klien tidak diverifikasi. Ini adalah nilai defaultnya.
      • ENCRYPTED_ONLY: hanya mengizinkan koneksi yang dienkripsi dengan SSL/TLS.
      • TRUSTED_CLIENT_CERTIFICATE_REQUIRED: hanya mengizinkan koneksi yang dienkripsi dengan SSL/TLS dan dengan sertifikat klien yang valid.
    • INSTANCE_ID: ID instance

    Metode HTTP dan URL:

    PATCH https://sqladmin.googleapis.com/v1/projects/PROJECT_ID/instances/INSTANCE_ID

    Meminta isi JSON:

    
    {
      "settings": {
        "ipConfiguration": {"sslMode": "SSL_ENFORCEMENT_MODE"}
      }
    }
    

    Untuk mengirim permintaan Anda, perluas salah satu opsi berikut:

    Anda akan melihat respons JSON seperti berikut:

REST v1beta4

  1. Sebelum menggunakan salah satu dari data permintaan, lakukan penggantian berikut:

    • PROJECT_ID: ID project
    • SSL_ENFORCEMENT_MODE: Gunakan salah satu opsi berikut:
      • ALLOW_UNENCRYPTED_AND_ENCRYPTED: mengizinkan koneksi non-SSL/non-TLS dan SSL/TLS. Untuk koneksi SSL, sertifikat klien tidak diverifikasi. Ini adalah nilai defaultnya.
      • ENCRYPTED_ONLY: hanya mengizinkan koneksi yang dienkripsi dengan SSL/TLS.
      • TRUSTED_CLIENT_CERTIFICATE_REQUIRED: hanya mengizinkan koneksi yang dienkripsi dengan SSL/TLS dan dengan sertifikat klien yang valid.
    • INSTANCE_ID: ID instance

    Metode HTTP dan URL:

    PATCH https://sqladmin.googleapis.com/sql/v1beta4/projects/PROJECT_ID/instances/INSTANCE_ID

    Meminta isi JSON:

    {
      "settings": {
        "ipConfiguration": {"sslMode": "SSL_ENFORCEMENT_MODE"}
      }
    }
    

    Untuk mengirim permintaan Anda, perluas salah satu opsi berikut:

    Anda akan melihat respons JSON seperti berikut:

Sertifikat Server

Cloud SQL membuat sertifikat server secara otomatis saat Anda membuat instance. Selama sertifikat server valid, Anda tidak perlu mengelola sertifikat server secara aktif. Namun, masa berlaku sertifikat adalah 10 tahun; setelah tanggal itu, sertifikat tidak lagi valid, dan klien tidak dapat membuat koneksi yang aman ke instance Anda menggunakan sertifikat tersebut. Anda akan diberi tahu secara berkala bahwa sertifikat server hampir habis masa berlakunya. Notifikasi dikirim dalam jumlah hari sebagai berikut sebelum tanggal habis masa berlaku: 90, 30, 10, 2, dan 1.

Anda dapat memperoleh informasi tentang sertifikat server, seperti kapan sertifikat dibuat dan habis masa berlakunya, atau membuat sertifikat baru secara manual.

Konsol

  1. Di konsol Google Cloud, buka halaman Instance Cloud SQL.

    Buka Instance Cloud SQL

  2. Untuk membuka halaman Overview instance, klik nama instance.
  3. Klik Connections dari menu navigasi SQL.
  4. Pilih tab Keamanan.
  5. Buka bagian Mengelola sertifikat server.

    Anda dapat melihat tanggal habis masa berlaku sertifikat server pada tabel.

gcloud

  1. Dapatkan informasi tentang sertifikat layanan:
    gcloud beta sql ssl server-ca-certs list \
    --instance=INSTANCE_NAME
    
  2. Buat sertifikat server:
    gcloud beta sql ssl server-ca-certs create \
    --instance=INSTANCE_NAME
    
  3. Download informasi sertifikat ke file PEM lokal:
    gcloud beta sql ssl server-ca-certs list \
    --format="value(cert)" \
    --instance=INSTANCE_NAME > \
    FILE_PATH/FILE_NAME.pem
    
  4. Perbarui semua klien Anda untuk menggunakan informasi baru dengan menyalin file yang didownload ke mesin host klien Anda, sehingga mengganti file server-ca.pem yang sudah ada.

Terraform

Untuk memberikan informasi sertifikat server sebagai output, gunakan sumber data Terraform:

  1. Tambahkan kode berikut ke file konfigurasi Terraform Anda:
       data "google_sql_ca_certs" "ca_certs" {
         instance = google_sql_database_instance.default.name
       }
    
       locals {
         furthest_expiration_time = reverse(sort([for k, v in data.google_sql_ca_certs.ca_certs.certs : v.expiration_time]))[0]
         latest_ca_cert           = [for v in data.google_sql_ca_certs.ca_certs.certs : v.cert if v.expiration_time == local.furthest_expiration_time]
       }
    
       output "db_latest_ca_cert" {
         description = "Latest CA certificate used by the primary database server"
         value       = local.latest_ca_cert
         sensitive   = true
       }
       
  2. Untuk membuat file server-ca.pem, jalankan perintah berikut:
       terraform output db_latest_ca_cert > server-ca.pem
       

Sertifikat klien

Membuat sertifikat klien baru

Anda dapat membuat hingga 10 sertifikat klien untuk setiap instance. Untuk membuat sertifikat klien, Anda harus memiliki peran IAM Cloud SQL Admin.

Berikut adalah beberapa hal penting yang perlu diketahui tentang sertifikat klien:

  • Jika kunci pribadi untuk sertifikat hilang, Anda harus membuat yang baru; kunci pribadi tidak dapat dipulihkan.
  • Secara default, sertifikat klien memiliki tanggal habis masa berlaku selama 10 tahun.
  • Anda tidak akan menerima notifikasi saat sertifikat klien hampir habis masa berlakunya.
  • Instance Cloud SQL harus dalam keadaan berjalan untuk membuat sertifikat SSL.

Konsol

  1. Di konsol Google Cloud, buka halaman Instance Cloud SQL.

    Buka Instance Cloud SQL

  2. Untuk membuka halaman Overview instance, klik nama instance.
  3. Klik Connections dari menu navigasi SQL.
  4. Pilih tab Security.
  5. Klik Create client certificate.
  6. Di kotak dialog Create a client certificate, tambahkan nama yang unik.
  7. Klik Create.
  8. Di bagian pertama kotak dialog New SSL certificate created, klik Download client-key.pem untuk mendownload kunci pribadi ke file bernama client-key.pem.
  9. Di bagian kedua, klik Download client-cert.pem untuk mendownload sertifikat klien ke file bernama client-cert.pem.
  10. Di bagian ketiga, klik Download server-ca.pem untuk mendownload sertifikat server ke file bernama server-ca.pem.
  11. Klik Close.

gcloud

  1. Buat sertifikat klien menggunakan perintah ssl client-certs create:

    gcloud sql ssl client-certs create CERT_NAME client-key.pem \
    --instance=INSTANCE_NAME
    
  2. Ambil kunci publik untuk sertifikat yang baru saja Anda buat dan salin ke dalam file client-cert.pem menggunakan perintah ssl client-certs describe:

    gcloud sql ssl client-certs describe CERT_NAME \
    --instance=INSTANCE_NAME \
    --format="value(cert)" > client-cert.pem
    
  3. Salin sertifikat server ke dalam file server-ca.pem menggunakan perintah instances describe:

    gcloud sql instances describe INSTANCE_NAME \
    --format="value(serverCaCert.cert)" > server-ca.pem
    

Terraform

Untuk membuat sertifikat klien, gunakan resource Terraform:

resource "google_sql_ssl_cert" "mysql_client_cert" {
  common_name = "mysql_common_name"
  instance    = google_sql_database_instance.mysql_instance.name
}

REST v1

  1. Buat sertifikat SSL/TLS, dengan memberikan nama unik untuk instance ini:

    Sebelum menggunakan salah satu data permintaan, lakukan penggantian berikut:

    • project-id: ID project
    • instance-id: ID instance
    • client-cert-name: Nama sertifikat klien

    Metode HTTP dan URL:

    POST https://sqladmin.googleapis.com/v1/projects/project-id/instances/instance-id/sslCerts

    Meminta isi JSON:

    {
      "commonName" : "client-cert-name"
    }
    

    Untuk mengirim permintaan Anda, perluas salah satu opsi berikut:

    Anda akan melihat respons JSON seperti berikut:

  2. Salin semua konten sertifikat dalam tanda kutip (tetapi tidak dengan tanda kutipnya) dari respons ke file lokal seperti berikut:
    1. Salin serverCaCert.cert ke server-ca.pem.
    2. Salin clientCert.cert ke client-cert.pem.
    3. Salin certPrivateKey ke client-key.pem.
  3. Sebelum menggunakan salah satu data permintaan, lakukan penggantian berikut:

    • project-id: ID project
    • instance-id: ID instance
    • activation-policy: Kebijakan aktivasi adalah SELALU atau TIDAK PERNAH

    Metode HTTP dan URL:

    POST https://sqladmin.googleapis.com/v1/projects/project-id/instances/instance-id/restart

    Meminta isi JSON:

    {
      "settings": {
        "activationPolicy": "activation-policy"
      }
    }
    

    Untuk mengirim permintaan Anda, perluas salah satu opsi berikut:

    Anda akan melihat respons JSON seperti berikut:

    {
      "kind": "sql#operation",
      "targetLink": "https://sqladmin.googleapis.com/v1/projects/project-id/instances/instance-id",
      "status": "PENDING",
      "user": "user@example.com",
      "insertTime": "2020-01-20T21:30:35.667Z",
      "operationType": "RESTART",
      "name": "operation-id",
      "targetId": "instance-id",
      "selfLink": "https://sqladmin.googleapis.com/v1/projects/project-id/operations/operation-id",
      "targetProject": "project-id"
    }
    

REST v1beta4

  1. Buat sertifikat SSL/TLS, dengan memberikan nama unik untuk instance ini:

    Sebelum menggunakan salah satu data permintaan, lakukan penggantian berikut:

    • project-id: ID project
    • instance-id: ID instance
    • client-cert-name: Nama sertifikat klien

    Metode HTTP dan URL:

    POST https://sqladmin.googleapis.com/sql/v1beta4/projects/project-id/instances/instance-id/sslCerts

    Meminta isi JSON:

    {
      "commonName" : "client-cert-name"
    }
    

    Untuk mengirim permintaan Anda, perluas salah satu opsi berikut:

    Anda akan melihat respons JSON seperti berikut:

  2. Salin semua konten sertifikat dalam tanda kutip (tetapi tidak dengan tanda kutipnya) dari respons ke file lokal seperti berikut:
    1. Salin serverCaCert.cert ke server-ca.pem.
    2. Salin clientCert.cert ke client-cert.pem.
    3. Salin certPrivateKey ke client-key.pem.
  3. Sebelum menggunakan salah satu data permintaan, lakukan penggantian berikut:

    • project-id: ID project
    • instance-id: ID instance
    • activation-policy: Kebijakan aktivasi adalah SELALU atau TIDAK PERNAH

    Metode HTTP dan URL:

    POST https://sqladmin.googleapis.com/sql/v1beta4/projects/project-id/instances/instance-id/restart

    Meminta isi JSON:

    {
      "settings": {
        "activationPolicy": "activation-policy"
      }
    }
    

    Untuk mengirim permintaan Anda, perluas salah satu opsi berikut:

    Anda akan menerima respons JSON seperti berikut:

    {
      "kind": "sql#operation",
      "targetLink": "https://sqladmin.googleapis.com/sql/v1beta4/projects/project-id/instances/instance-id",
      "status": "PENDING",
      "user": "user@example.com",
      "insertTime": "2020-01-20T21:30:35.667Z",
      "operationType": "RESTART",
      "name": "operation-id",
      "targetId": "instance-id",
      "selfLink": "https://sqladmin.googleapis.com/sql/v1beta4/projects/project-id/operations/operation-id",
      "targetProject": "project-id"
    }
    

Pada tahap ini, Anda memiliki:

  • Sertifikat server yang disimpan sebagai server-ca.pem.
  • Sertifikat kunci publik klien yang disimpan sebagai client-cert.pem.
  • Kunci pribadi klien yang disimpan sebagai client-key.pem.

Bergantung pada alat yang Anda gunakan untuk terhubung, ketiga item ini ditentukan dengan cara yang berbeda. Misalnya, saat terhubung menggunakan klien MySQL, ketiga file ini masing-masing adalah nilai untuk opsi perintah --ssl-ca, --ssl-cert, dan --ssl-key. Untuk contoh koneksi yang menggunakan klien MySQL dan SSL/TLS, baca Terhubung dengan Klien MySQL.

Langkah selanjutnya