Halaman ini menjelaskan cara mengimplementasikan enkripsi sisi klien di Cloud SQL.
Ringkasan
Enkripsi sisi klien adalah tindakan mengenkripsi data sebelum menulisnya ke Cloud SQL. Anda dapat mengenkripsi data Cloud SQL dengan cara yang hanya dapat didekripsi oleh aplikasi Anda.
Untuk mengaktifkan enkripsi sisi klien, Anda memiliki opsi berikut ini:
- Menggunakan kunci enkripsi yang disimpan di Cloud Key Management Service (Cloud KMS).
- Menggunakan kunci enkripsi yang disimpan secara lokal di aplikasi Anda.
Dalam topik ini, kami menjelaskan cara menggunakan opsi pertama, yang memberikan opsi pengelolaan kunci paling lancar. Kami membuat kunci enkripsi di Cloud KMS dan menerapkan enkripsi menyeluruh menggunakan Tink, library kriptografi open source Google.
Mengapa Anda memerlukan enkripsi sisi klien?
Anda memerlukan enkripsi sisi klien jika ingin melindungi data Cloud SQL di tingkat kolom 1. Bayangkan Anda memiliki tabel nama dan nomor kartu kredit. Anda ingin memberi pengguna akses ke tabel ini, tetapi tidak ingin mereka melihat nomor kartu kredit. Anda dapat mengenkripsi nomor menggunakan enkripsi sisi klien. Selama pengguna tidak diberi akses ke kunci enkripsi di Cloud KMS, mereka tidak dapat membaca informasi kartu kredit.
Membuat kunci menggunakan Cloud KMS
Cloud KMS memungkinkan Anda untuk membuat dan mengelola kunci di Google Cloud Platform.
Cloud KMS mendukung berbagai jenis kunci yang berbeda. Untuk enkripsi sisi klien, Anda perlu membuat kunci simetris.
Untuk memberi aplikasi Anda akses ke kunci di Cloud KMS, Anda perlu
memberikan peran cloudkms.cryptoKeyEncrypterDecrypter
ke akun layanan yang digunakan
aplikasi Anda. Di gcloud, Anda menggunakan perintah berikut
untuk melakukannya:
gcloud kms keys add-iam-policy-binding key \ --keyring=key-ring \ --location=location \ --member=serviceAccount:service-account-name@example.domain.com \ --role=roles/cloudkms.cryptoKeyEncrypterDecrypter
Meskipun Anda dapat menggunakan kunci KMS untuk langsung mengenkripsi data, di sini kami menggunakan solusi yang lebih fleksibel yang disebut enkripsi menyeluruh. Dengan begitu, kami dapat mengenkripsi pesan yang lebih panjang dari 64KB, yang merupakan ukuran pesan maksimum yang dapat didukung oleh Cloud Key Management Service API.
Enkripsi menyeluruh Cloud KMS
Dalam enkripsi menyeluruh, kunci KMS bertindak sebagai kunci enkripsi kunci (KEK). Artinya, hal ini digunakan untuk mengenkripsi kunci enkripsi data (DEK) yang kemudian digunakan untuk mengenkripsi data sebenarnya.
Setelah membuat KEK di Cloud KMS, untuk mengenkripsi setiap pesan, Anda perlu:
- Membuat kunci enkripsi data (DEK) secara lokal.
- Gunakan DEK ini secara lokal untuk mengenkripsi pesan.
- Memanggil Cloud KMS untuk mengenkripsi (menggabungkan) DEK dengan KEK.
- Menyimpan data terenkripsi dan DEK yang digabungkan.
Alih-alih menerapkan enkripsi menyeluruh dari awal, kami menggunakan Tink dalam topik ini.
Tink
Tink adalah library multi-bahasa dan lintas platform yang menyediakan API kriptografi tingkat tinggi. Untuk mengenkripsi data dengan enkripsi menyeluruh Tink, Anda perlu menyediakan Tink dengan URI kunci yang mengarah ke KEK Anda di Cloud KMS, dan kredensial yang memungkinkan Tink untuk menggunakan KEK. Tink menghasilkan DEK, mengenkripsi data, menggabungkan DEK, dan menampilkan satu ciphertext dengan data terenkripsi dan DEK yang digabungkan.
Tink mendukung enkripsi menyeluruh di C++, Java, Go, dan Python menggunakan AEAD API:
public interface Aead{
byte[] encrypt(final byte[] plaintext, final byte[] associatedData)
throws…
byte[] decrypt(final byte[] ciphertext, final byte[] associatedData)
throws…
}
Selain argumen pesan/ciphertext normal, metode enkripsi dan dekripsi
mendukung data terkait yang bersifat opsional. Argumen ini dapat digunakan untuk mengaitkan
ciphertext ke sebuah data. Misalnya, Anda memiliki database dengan
kolom user-id
dan kolom encrypted-medical-history
. Dalam hal ini, kolom
user-id
mungkin harus digunakan sebagai data terkait saat mengenkripsi histori
medis. Hal ini memastikan bahwa penyerang tidak dapat memindahkan histori medis dari satu pengguna
ke pengguna lain. Hal ini juga digunakan untuk memverifikasi bahwa Anda memiliki baris data yang benar saat menjalankan kueri.
Sampel
Di bagian ini, kami akan membahas kode contoh untuk database informasi pemilih yang menggunakan enkripsi sisi klien. Kode contoh menunjukkan cara:
- Membuat tabel database dan kumpulan koneksi
- Menyiapkan Tink untuk enkripsi menyeluruh
- Mengenkripsi dan mendekripsi data menggunakan enkripsi menyeluruh Tink dengan KEK di Cloud KMS
Sebelum memulai
Buatlah Instance Cloud SQL dengan mengikuti petunjuk ini. Catatlah string koneksi, pengguna database, dan sandi database yang Anda buat.
Buatlah database untuk aplikasi Anda dengan mengikuti petunjuk ini. Catatlah nama database.
Buatlah kunci KMS untuk aplikasi Anda dengan mengikuti petunjuk ini. Salinlah nama resource dari kunci yang Anda buat.
Buatlah akun layanan dengan izin 'Klien Cloud SQL' dengan mengikuti petunjuk ini.
Tambahkan izin 'Encrypter/Decrypter Cloud KMS CryptoKey' untuk kunci tersebut ke akun layanan Anda dengan mengikuti petunjuk ini.