Bagikan melalui


Always Encrypted

Berlaku untuk: SQL ServerAzure SQL Database Azure SQL Managed Instance

Diagram of Always Encrypted.

Always Encrypted dan Always Encrypted dengan enklave aman adalah fitur yang dirancang untuk melindungi informasi sensitif, termasuk nomor kartu kredit dan nomor identifikasi nasional atau regional (seperti nomor jaminan sosial AS), di Azure SQL Database, Azure SQL Managed Instance, dan database SQL Server. Ini memungkinkan klien untuk mengenkripsi data sensitif dalam aplikasi klien, memastikan bahwa kunci enkripsi tidak pernah terekspos ke Mesin Database. Ini menyediakan pemisahan antara mereka yang memiliki data dan dapat melihatnya, dan mereka yang mengelola data tetapi seharusnya tidak memiliki akses: administrator database lokal, operator database cloud, atau pengguna tidak sah dengan hak istimewa tinggi lainnya. Akibatnya, Always Encrypted memungkinkan pelanggan untuk menyimpan data sensitif mereka dengan aman di cloud, mengurangi risiko pencurian data oleh orang dalam yang berbahaya.

Always Encrypted memiliki batasan tertentu, seperti ketidakmampuan untuk melakukan operasi pada data terenkripsi, termasuk pengurutan, pemfilteran (kecuali untuk pencarian titik menggunakan enkripsi deterministik), dll. Ini berarti bahwa beberapa kueri dan aplikasi mungkin tidak kompatibel dengan Always Encrypted atau mungkin memerlukan perubahan signifikan pada logika aplikasi.

Untuk mengatasi batasan ini, Always Encrypted dengan enklave aman memungkinkan mesin database memproses data terenkripsi dalam area memori yang dilindungi yang disebut enklave aman. Enklave aman meningkatkan kemampuan komputasi rahasia Always Encrypted dengan mendukung pencocokan pola, berbagai operator perbandingan, dan enkripsi di tempat.

Always Encrypted memastikan bahwa enkripsi mulus untuk aplikasi. Di sisi klien, driver yang didukung Always Encrypted mengenkripsi data sensitif sebelum mengirimkannya ke Mesin Database dan secara otomatis menulis ulang kueri untuk mempertahankan semantik aplikasi. Ini juga secara otomatis mendekripsi hasil kueri dari kolom database terenkripsi.

Gunakan Always Encrypted

Catatan

Untuk aplikasi yang perlu melakukan pencocokan pola, gunakan operator perbandingan, urutkan, dan indeks pada kolom terenkripsi, Anda harus menerapkan Always Encrypted dengan enklave aman.

Bagian ini menyediakan gambaran umum tentang menyiapkan Always Encrypted. Untuk detail dan untuk memulai, lihat Tutorial: Mulai menggunakan Always Encrypted.

Untuk mengonfigurasi Always Encrypted di database Anda, ikuti langkah-langkah berikut:

  1. Provisikan kunci kriptografi untuk melindungi data Anda. Always Encrypted menggunakan dua jenis kunci:

    • Kunci enkripsi kolom.
    • Kunci master kolom.

    Kunci enkripsi kolom digunakan untuk mengenkripsi data dalam kolom terenkripsi. Kunci master kolom adalah kunci pelindung kunci yang mengenkripsi satu atau beberapa kunci enkripsi kolom.

    Anda perlu menyimpan kunci master kolom di penyimpanan kunci tepercaya di luar sistem database, seperti Azure Key Vault, penyimpanan sertifikat Windows, atau modul keamanan perangkat keras. Setelah ini, Anda harus menyediakan kunci enkripsi kolom dan mengenkripsi masing-masing dengan kunci master kolom.

    Terakhir, simpan metadata tentang kunci di database Anda. Metadata kunci master kolom menyertakan lokasi kunci master kolom. Metadata kunci enkripsi kolom berisi nilai terenkripsi kunci enkripsi kolom. Mesin Database tidak menyimpan atau menggunakan kunci apa pun dalam teks biasa.

    Untuk informasi selengkapnya tentang mengelola kunci Always Encrypted, lihat Gambaran umum manajemen kunci untuk Always Encrypted.

  2. Siapkan enkripsi untuk kolom database tertentu yang menyertakan informasi sensitif untuk memastikan perlindungan. Ini mungkin memerlukan pembuatan tabel baru dengan kolom terenkripsi atau mengenkripsi kolom dan data yang ada. Saat mengonfigurasi enkripsi untuk kolom, Anda perlu menentukan detail tentang algoritma enkripsi, kunci enkripsi kolom untuk melindungi data, dan jenis enkripsi. Always Encrypted mendukung dua jenis enkripsi:

    • Enkripsi deterministik selalu menghasilkan nilai terenkripsi yang sama untuk nilai teks biasa tertentu. Menggunakan enkripsi deterministik memungkinkan pencarian titik, gabungan kesetaraan, pengelompokan, dan pengindeksan pada kolom terenkripsi. Namun, mungkin juga memungkinkan pengguna yang tidak sah untuk menebak informasi tentang nilai terenkripsi dengan memeriksa pola di kolom terenkripsi, terutama jika ada sekumpulan kecil kemungkinan nilai terenkripsi, seperti True/False, atau wilayah Utara/Selatan/Timur/Barat.

    • Enkripsi acak menggunakan metode yang mengenkripsi data secara tidak terduga. Setiap input teks biasa yang identik menghasilkan output terenkripsi yang berbeda. Ini meningkatkan keamanan enkripsi acak.

Untuk melakukan pencocokan pola menggunakan operator perbandingan, pengurutan, dan pengindeksan pada kolom terenkripsi, Anda harus mengadopsi Always Encrypted dengan enklave aman dan menerapkan enkripsi acak. Enkripsi acak Always Encrypted (tanpa enklave aman) tidak mendukung pencarian, pengelompokan, pengindeksan, atau gabungan pada kolom terenkripsi. Sebaliknya, untuk kolom yang ditujukan untuk tujuan pencarian atau pengelompokan, penting untuk menggunakan enkripsi deterministik. Ini memungkinkan operasi seperti pencarian titik, gabungan kesetaraan, pengelompokan, dan pengindeksan pada kolom terenkripsi.

Karena sistem database secara desain tidak memiliki akses ke kunci kriptografi, enkripsi kolom apa pun memerlukan pemindahan dan enkripsi data di luar database. Ini berarti bahwa proses enkripsi ini dapat memakan waktu lama dan rentan terhadap gangguan jaringan. Selain itu, jika Anda perlu mengenkripsi ulang kolom nanti, seperti saat memutar kunci enkripsi atau mengubah jenis enkripsi, Anda akan mengalami kesulitan yang sama lagi. Menggunakan Always Encrypted dengan enklave aman menghilangkan kebutuhan untuk memindahkan data dari database. Karena enklave tepercaya, driver klien dalam aplikasi Anda atau alat seperti Azure Data Studio atau SQL Server Management Studio (SSMS) dapat dengan aman berbagi kunci dengan enklave selama operasi kriptografi. Enklave kemudian dapat mengenkripsi atau mengenkripsi ulang kolom di tempat, secara signifikan mengurangi waktu yang diperlukan untuk tindakan ini.

Untuk detail tentang algoritma kriptografi Always Encrypted, lihat Kriptografi Always Encrypted.

Anda dapat melakukan langkah-langkah di atas menggunakan alat SQL:

Untuk memastikan kunci Always Encrypted dan data sensitif yang dilindungi tidak pernah terungkap dalam teks biasa ke lingkungan database, Mesin Database tidak dapat terlibat dalam provisi kunci dan enkripsi data, atau operasi dekripsi. Oleh karena itu, Transact-SQL (T-SQL) tidak mendukung provisi kunci atau operasi kriptografi. Untuk alasan yang sama, mengenkripsi data yang ada atau mengenkripsi ulang (dengan jenis enkripsi yang berbeda atau kunci enkripsi kolom) perlu dilakukan di luar database (alat SQL dapat mengotomatiskannya).

Setelah mengubah definisi kolom terenkripsi, jalankan sp_refresh_parameter_encryption untuk memperbarui metadata Always Encrypted untuk objek.

Batasan

Batasan berikut berlaku untuk kueri pada kolom terenkripsi:

  • Tidak ada komputasi pada kolom yang dienkripsi menggunakan enkripsi acak yang diizinkan. Enkripsi deterministik mendukung operasi berikut yang melibatkan perbandingan kesetaraan - tidak ada operasi lain yang diizinkan.

    Catatan

    Untuk aplikasi yang perlu melakukan pencocokan pola, gunakan operator perbandingan, urutkan, dan indeks pada kolom terenkripsi, Anda harus menerapkan Always Encrypted dengan enklave aman.

  • Pernyataan kueri yang memicu komputasi yang melibatkan data teks biasa dan terenkripsi tidak diizinkan. Contohnya:

    • Membandingkan kolom terenkripsi dengan kolom teks biasa atau harfiah.
    • Menyalin data dari kolom teks biasa ke kolom terenkripsi (atau sebaliknya) UPDATE, BULK INSERT, SELECT INTO, atau INSERT.. PILIH.
    • Menyisipkan literal ke kolom terenkripsi.

    Pernyataan tersebut mengakibatkan kesalahan bentrokan operand seperti ini:

    Msg 206, Level 16, State 2, Line 89
        Operand type clash: char(11) encrypted with (encryption_type = 'DETERMINISTIC', encryption_algorithm_name = 'AEAD_AES_256_CBC_HMAC_SHA_256', column_encryption_key_name = 'CEK_1', column_encryption_key_database_name = 'ssn') collation_name = 'Latin1_General_BIN2' is incompatible with char
    

    Aplikasi perlu menggunakan parameter kueri untuk menyediakan nilai untuk kolom terenkripsi. Misalnya, saat Anda menyisipkan data ke dalam kolom terenkripsi atau memfilternya menggunakan enkripsi deterministik, parameter kueri harus digunakan. Tidak didukung untuk meneruskan literal atau variabel T-SQL yang sesuai dengan kolom terenkripsi. Untuk informasi selengkapnya khusus untuk driver klien yang Anda gunakan, lihat Mengembangkan aplikasi menggunakan Always Encrypted.

    Di Azure Data Studio atau SSMS, penting untuk menerapkan parameterisasi untuk variabel Always Encrypted untuk menjalankan kueri yang menangani nilai yang terkait dengan kolom terenkripsi. Ini termasuk skenario seperti menyisipkan data ke dalam kolom terenkripsi atau menerapkan filter pada mereka (dalam kasus di mana enkripsi deterministik digunakan).

  • Parameter bernilai tabel yang menargetkan kolom terenkripsi tidak didukung.

  • Kueri yang menggunakan klausul berikut ini tidak didukung:

  • Always Encrypted tidak didukung untuk kolom dengan karakteristik di bawah ini:

    • Kolom yang menggunakan salah satu jenis data berikut: xml, tanda waktu, rowversion, gambar, ntext, teks, sql_variant, hierarkiid, geografi, geometri, alias, jenis yang ditentukan pengguna.
    • Kolom FILESTREAM
    • Kolom dengan properti IDENTITY .
    • Kolom dengan properti ROWGUIDCOL .
    • Kolom string (varchar, char, dll.) dengan kolase selain kolase titik kode biner (_BIN2) saat menggunakan enkripsi deterministik.
    • Kolom yang merupakan kunci untuk indeks berkluster dan non-kluster saat menggunakan enkripsi acak (indeks pada kolom yang menggunakan enkripsi deterministik didukung).
    • Kolom yang disertakan dalam indeks teks lengkap (Always Encrypted tidak mendukung Pencarian Teks Lengkap).
    • Tentukan kolom komputasi dalam tabel.
    • Kolom yang direferensikan oleh kolom komputasi (saat ekspresi melakukan operasi yang tidak didukung untuk Always Encrypted).
    • Gunakan kolom jarang.
    • Kolom yang direferensikan oleh statistik saat menggunakan enkripsi acak (enkripsi deterministik didukung).
    • Kolom partisi.
    • Kolom dengan batasan default.
    • Kolom yang direferensikan oleh batasan unik saat menggunakan enkripsi acak (enkripsi deterministik didukung).
    • Kolom kunci primer saat menggunakan enkripsi acak (enkripsi deterministik didukung).
    • Mereferensikan kolom dalam batasan kunci asing saat menggunakan enkripsi acak atau saat menggunakan enkripsi deterministik, jika kolom referensi dan referensi menggunakan kunci atau algoritma yang berbeda.
    • Kolom yang dirujuk oleh batasan pemeriksaan.
    • Kolom yang diambil/dilacak menggunakan tangkapan data perubahan.
    • Kolom kunci utama pada tabel yang memiliki pelacakan perubahan.
    • Kolom yang diselubungi (menggunakan masking data Dinamis).
    • Kolom dalam tabel database stretch. (Tabel dengan kolom yang dienkripsi dengan Always Encrypted dapat diaktifkan untuk Stretch.)

    Penting

    Stretch Database tidak digunakan lagi di SQL Server 2022 (16.x) dan Azure SQL Database. Fitur ini akan dihapus dalam versi Mesin Database di masa mendatang. Hindari menggunakan fitur ini dalam pekerjaan pengembangan baru, dan rencanakan untuk memodifikasi aplikasi yang saat ini menggunakan fitur ini.

    • Kolom dalam tabel eksternal (PolyBase) (catatan: menggunakan tabel dan tabel eksternal dengan kolom terenkripsi dalam kueri yang sama didukung).
  • Fitur berikut ini tidak berfungsi pada kolom terenkripsi:

Referensi Always Encrypted Transact-SQL

Always Encrypted menggunakan pernyataan Transact-SQL berikut, tampilan katalog sistem, prosedur tersimpan sistem, dan izin.

Pernyataan

Pernyataan DDL Keterangan
BUAT KUNCI MASTER KOLOM Membuat objek metadata kunci master kolom dalam database
JATUHKAN KUNCI MASTER KOLOM Menjatuhkan kunci master kolom dari database.
MEMBUAT KUNCI ENKRIPSI KOLOM Membuat objek metadata kunci enkripsi kolom.
UBAH KUNCI ENKRIPSI KOLOM Mengubah kunci enkripsi kolom dalam database, menambahkan atau menghilangkan nilai terenkripsi.
JATUHKAN KUNCI ENKRIPSI KOLOM Menghilangkan kunci enkripsi kolom dari database.
BUAT TABEL (DIENKRIPSI DENGAN) Menentukan kolom enkripsi

Tampilan katalog sistem dan prosedur tersimpan

Tampilan katalog sistem dan prosedur tersimpan Keterangan
sys.column_encryption_keys Mengembalikan informasi tentang kunci enkripsi kolom (CEK)
sys.column_encryption_key_values Mengembalikan informasi tentang nilai terenkripsi kunci enkripsi kolom (CEK)
sys.column_master_keys Mengembalikan baris untuk setiap kunci master database
sp_refresh_parameter_encryption Memperbarui metadata Always Encrypted untuk parameter prosedur tersimpan yang tidak terikat skema yang ditentukan, fungsi yang ditentukan pengguna, tampilan, pemicu DML, pemicu DDL tingkat database, atau pemicu DDL tingkat server
sp_describe_parameter_encryption Menganalisis pernyataan Transact-SQL yang ditentukan dan parameternya, untuk menentukan parameter mana yang sesuai dengan kolom database yang dilindungi dengan menggunakan fitur Always Encrypted.

Lihat juga sys.columns untuk informasi tentang metadata enkripsi yang disimpan untuk setiap kolom.

Izin database

Ada empat izin database untuk Always Encrypted.

Tampilan katalog sistem dan prosedur tersimpan Keterangan
MENGUBAH KUNCI MASTER KOLOM APA PUN Diperlukan untuk membuat dan menghapus metadata kunci master kolom.
MENGUBAH KUNCI ENKRIPSI KOLOM APA PUN Diperlukan untuk membuat dan menghapus metadata kunci enkripsi kolom.
LIHAT DEFINISI KUNCI MASTER KOLOM APA PUN Diperlukan untuk mengakses dan membaca metadata kunci master kolom, yang diperlukan untuk mengkueri kolom terenkripsi.
LIHAT DEFINISI KUNCI ENKRIPSI KOLOM APA PUN Diperlukan untuk mengakses dan membaca metadata kunci enkripsi kolom, yang diperlukan untuk mengkueri kolom terenkripsi.

Tabel berikut ini meringkas izin yang diperlukan untuk tindakan umum.

Skenario MENGUBAH KUNCI MASTER KOLOM APA PUN MENGUBAH KUNCI ENKRIPSI KOLOM APA PUN LIHAT DEFINISI KUNCI MASTER KOLOM APA PUN LIHAT DEFINISI KUNCI ENKRIPSI KOLOM APA PUN
Manajemen kunci (membuat/mengubah/meninjau metadata kunci dalam database) X X X X
Mengkueri kolom terenkripsi X X

Pertimbangan penting

  • Izin LIHAT DEFINISI KUNCI MASTER KOLOM APA PUN dan LIHAT DEFINISI KUNCI ENKRIPSI KOLOM DIPERLUKAN saat memilih kolom terenkripsi, bahkan jika pengguna tidak memiliki izin ke kunci master kolom (di penyimpanan kunci mereka), melindungi kolom dan tidak mengakses upaya teks biasa.

  • Di SQL Server, izin LIHAT DEFINISI KUNCI MASTER KOLOM APA PUN dan LIHAT DEFINISI KUNCI ENKRIPSI KOLOM apa pun diberikan secara default ke peran database tetap publik . Administrator database mungkin memilih untuk mencabut (atau menolak) izin ke peran publik dan memberi mereka peran atau pengguna tertentu untuk menerapkan kontrol yang lebih terbatas.

  • Di SQL Database, izin LIHAT DEFINISI KUNCI MASTER KOLOM APA PUN dan LIHAT DEFINISI KUNCI ENKRIPSI KOLOM APA PUN tidak diberikan secara default ke peran database tetap publik . Ini memungkinkan alat warisan tertentu yang ada (menggunakan versi DacFx yang lebih lama) berfungsi dengan baik. Untuk bekerja dengan kolom terenkripsi (bahkan jika tidak mendekripsinya), administrator database harus secara eksplisit memberikan izin LIHAT DEFINISI KUNCI MASTER KOLOM APA PUN dan LIHAT DEFINISI KUNCI ENKRIPSI KOLOM APA PUN.

Langkah selanjutnya