SQL Server 2016 Selalu Dienkripsi: Mudah Diimplementasikan, Sulit Diretas
Diterbitkan: 2022-03-11Data adalah aset utama setiap perusahaan, terutama data transaksional yang menyimpan rahasia bisnis seperti catatan keuangan atau kesehatan. Data paling rentan saat transit antara server yang menyimpannya dan klien yang memintanya.
Pendekatan standar untuk memastikan keamanan adalah dengan mengenkripsi data di server dan menggunakan protokol HTTPS berkemampuan SSL untuk mengamankan data dalam pengangkutan. Namun, bagaimana jika kita dapat meningkatkan tingkat keamanan lebih jauh, dengan menggunakan HTTPS dan mengirimkan data dalam format terenkripsi melalui jalur komunikasi, hanya untuk mendekripsi data pada klien yang memiliki sertifikat yang valid? Pendekatan itu akan membuat serangan man-in-the-middle (MITM) tradisional jauh lebih sulit.
Solusi Microsoft untuk masalah ini adalah Selalu Dienkripsi, cara untuk mengirim data terenkripsi melalui jalur pipa dan mendekripsinya hanya oleh pengguna yang memiliki akses ke sertifikat yang valid. Jadi, bahkan jika penyerang mendapatkan data, tanpa sertifikat yang tepat disimpan di mesin klien, data tidak akan berguna.
Artikel ini menjelaskan cara menyiapkan dan menggunakan Selalu Terenkripsi, dan disarankan untuk dibaca oleh siapa saja yang mengirim data penting melalui jalur komunikasi publik, meskipun data tersebut diamankan dengan SSL.
Konsep Dibalik Selalu Terenkripsi
Always Encrypted adalah teknologi enkripsi sisi klien yang diperkenalkan Microsoft dengan SQL Server 2016. Always Encrypted membuat data terenkripsi secara otomatis, tidak hanya saat ditulis, tetapi juga saat dibaca oleh aplikasi yang disetujui. Tidak seperti Enkripsi Data Transparan, yang mengenkripsi data dan file log pada disk secara real time tetapi memungkinkan data dibaca oleh aplikasi apa pun yang menanyakan data, Always Encrypted mengharuskan aplikasi klien Anda untuk menggunakan driver berkemampuan Always Encrypted untuk berkomunikasi dengan basis data. Dengan menggunakan driver ini, aplikasi secara aman mentransfer data terenkripsi ke database yang kemudian dapat didekripsi hanya oleh aplikasi yang memiliki akses ke kunci enkripsi. Aplikasi lain yang menanyakan data juga dapat mengambil nilai terenkripsi, tetapi aplikasi tersebut tidak dapat menggunakan data tanpa kunci enkripsi, sehingga membuat data menjadi tidak berguna. Karena arsitektur enkripsi ini, contoh SQL Server tidak pernah melihat versi data yang tidak terenkripsi.
Saat ini, satu-satunya pengandar yang selalu terenkripsi adalah Penyedia Data .NET Framework untuk SQL Server, yang memerlukan penginstalan .NET Framework versi 4.6 di komputer klien, dan pengandar JDBC 6.0. Itu mungkin akan berubah seiring waktu, tetapi ini adalah persyaratan resmi Selalu Dienkripsi mulai April 2017.
Tetapi mengapa kita membutuhkan teknologi ini? Ada beberapa alasan bagus mengapa Always Encrypted harus digunakan:
- Keamanan — Data selalu dibutuhkan agar aman. Sekarang SSL sedang dikompromikan, Always Encrypted mengisi celah dengan lapisan perlindungan pipa transportasi lainnya.
- Dukungan peraturan — Data perlu dienkripsi dan dijaga agar tidak mengintip DBA oleh semakin banyak peraturan industri, terutama di industri keuangan dan telekomunikasi. Hal ini dijelaskan dalam standar PII (“Informasi Identifikasi Pribadi”) yang menyatakan bahwa hal-hal seperti nomor kartu kredit, nomor jaminan sosial, nama, dan alamat harus dilindungi, atau pemilik data dapat dihukum berat.
Cara Menggunakan Selalu Terenkripsi
Menggunakan Always Encrypted memerlukan sedikit persiapan dalam server database yang menyimpan tabel terenkripsi. Persiapan adalah proses dua langkah:
- Buat definisi kunci master kolom
- Buat kunci enkripsi kolom
Kunci Utama Kolom
Jadi apa itu kunci master kolom?
Kunci master kolom adalah sertifikat yang disimpan dalam penyimpanan sertifikat Windows (yang digunakan demo sebagai opsi penyimpanan sertifikat), modul keamanan perangkat keras pihak ketiga (nama umum untuk solusi pihak ketiga untuk menginstal, mengelola, dan menggunakan sertifikat ), atau Azure Key Vault (solusi berbasis cloud Microsoft untuk manajemen sertifikat).
Aplikasi yang mengenkripsi data menggunakan kunci master kolom untuk melindungi berbagai kunci enkripsi kolom yang menangani enkripsi data dalam kolom tabel database. Menggunakan penyimpanan sertifikat dari SQL Server, yang terkadang disebut sebagai Enterprise Key Manager , memerlukan penggunaan SQL Server Enterprise Edition.
Pada artikel ini, kami menjelaskan penggunaan sertifikat yang ditandatangani sendiri yang Anda simpan di Microsoft Certificate Store dari sistem operasi Windows. Meskipun pendekatan ini bukan konfigurasi yang optimal, pendekatan ini menunjukkan konsep Selalu Terenkripsi—tetapi juga perlu dinyatakan bahwa pendekatan ini tidak dapat diterima untuk lingkungan produksi , di mana manajemen sertifikat harus dilakukan dengan akun pengguna yang terpisah dan aman, dan sebaiknya , di server terpisah.
Anda dapat membuat definisi kunci master kolom dengan menggunakan antarmuka grafis dalam SQL Server Management Studio (SSMS) atau dengan menggunakan T-SQL. Di SSMS, sambungkan ke contoh database SQL Server 2016 di mana Anda ingin menggunakan Selalu Dienkripsi untuk melindungi tabel database.
Membuat dan Menggunakan Kunci Master Kolom
Di Object Explorer, navigasikan terlebih dahulu ke database, lalu ke Keamanan, lalu luaskan folder Always Encrypted Keys untuk menampilkan dua subfoldernya, seperti yang ditunjukkan pada gambar berikut:
Untuk membuat master key kolom, klik kanan folder Column Master Keys
dan pilih New Column Master Key
. Di kotak dialog New Column Master Key
, ketik nama untuk kunci master kolom, tentukan apakah akan menyimpan kunci di penyimpanan sertifikat mesin lokal atau pengguna saat ini atau Azure Key Vault, lalu pilih sertifikat dalam daftar. Jika tidak ada sertifikat, atau jika Anda ingin menggunakan sertifikat baru yang ditandatangani sendiri, klik tombol Generate Certificate
, lalu klik OK
. Langkah ini membuat sertifikat yang ditandatangani sendiri dan memuatnya ke penyimpanan sertifikat akun pengguna saat ini yang menjalankan SSMS.
Catatan: Anda harus melakukan langkah-langkah ini pada mesin tepercaya, tetapi tidak pada komputer yang menghosting instans SQL Server Anda. Dengan begitu, data tetap terlindungi di SQL Server bahkan jika komputer host disusupi.
Jadi, setelah membuat sertifikat dan mengonfigurasinya sebagai kunci master kolom, Anda harus mengekspor dan mendistribusikannya ke semua komputer yang menghosting klien yang memerlukan akses ke data. Jika aplikasi klien berbasis web, Anda harus memuat sertifikat di server web. Jika ini adalah aplikasi yang diinstal pada komputer pengguna, maka Anda harus menyebarkan sertifikat ke komputer masing-masing pengguna satu per satu.
Anda dapat menemukan petunjuk yang berlaku untuk mengekspor dan mengimpor sertifikat untuk sistem operasi Anda di URL berikut:
- Mengekspor sertifikat
- Windows 7 dan Windows Server 2008 R2
- Windows 8 dan Windows Server 2012
- Windows 8.1 dan Windows Server 2012 R2
- Windows 10 dan Windows Server 2016
- Mengimpor sertifikat
- Windows 7 dan Windows Server 2008 R2
- Windows 8 dan Windows Server 2012
- Windows 8.1 dan Windows Server 2012 R2
- Windows 10 dan Windows Server 2016
Saat Anda mengimpor sertifikat ke penyimpanan sertifikat di komputer dengan aplikasi yang mengenkripsi dan mendekripsi data, Anda harus mengimpor sertifikat ke penyimpanan sertifikat mesin atau penyimpanan sertifikat akun domain yang menjalankan aplikasi.
Kunci Enkripsi Kolom
Setelah membuat kunci master kolom, Anda siap membuat kunci enkripsi untuk kolom tertentu. Pengandar SQL Server 2016 ADO.NET menggunakan kunci enkripsi kolom untuk mengenkripsi data sebelum mengirimnya ke SQL Server, dan untuk mendekripsi data setelah mengambilnya dari contoh SQL Server 2016. Seperti halnya kunci master kolom, Anda dapat membuat kunci enkripsi kolom dengan menggunakan T-SQL atau SSMS. Sementara kunci master kolom lebih mudah dibuat menggunakan T-SQL, kunci enkripsi kolom lebih mudah dibuat menggunakan SSMS.
Untuk membuat kunci enkripsi kolom, gunakan Object Explorer
untuk menyambungkan ke instance database, navigasikan ke database, lalu ke Security
, dan perluas folder Always Encrypted Keys
. Klik kanan Column Encryption Keys
, lalu pilih New Column Encryption Key
. Di kotak dialog New Column Encryption Key
, ketik nama untuk kunci enkripsi baru, pilih Column Master Key Definition
di daftar turun bawah, lalu klik OK
. Anda sekarang dapat menggunakan kunci enkripsi kolom dalam definisi tabel baru.

Membuat Tabel dengan Nilai Terenkripsi
Setelah membuat definisi kunci master kolom dan kunci enkripsi kolom, Anda dapat membuat tabel untuk menyimpan nilai terenkripsi.
Sebelum melakukan ini, Anda harus memutuskan jenis enkripsi yang akan digunakan, kolom mana yang akan dienkripsi, dan apakah Anda dapat mengindeks kolom ini. Dengan fitur Selalu Terenkripsi , Anda menentukan ukuran kolom secara normal, dan SQL Server menyesuaikan ukuran penyimpanan kolom berdasarkan pengaturan enkripsi. Setelah membuat tabel, Anda mungkin perlu mengubah aplikasi untuk menjalankan perintah pada tabel ini menggunakan Always Encrypted .
Jenis Enkripsi SQL Server 2016
Sebelum membuat tabel yang berisi nilai terenkripsi, Anda harus memutuskan apakah setiap kolom harus dienkripsi atau tidak.
Pertama, apakah kolom ini akan digunakan untuk mencari nilai atau hanya mengembalikan nilai tersebut?
Jika kolom akan digunakan untuk pencarian, kolom harus menggunakan jenis enkripsi deterministik , yang memungkinkan operasi kesetaraan. Namun, ada batasan dalam mencari data yang telah dienkripsi dengan menggunakan fitur Always Encrypted . SQL Server 2016 hanya mendukung operasi kesetaraan, yang mencakup equal to
, not equal to
, joins
(yang menggunakan kesetaraan), dan menggunakan nilai dalam klausa GROUP BY
. Pencarian apa pun yang menggunakan LIKE
tidak didukung. Selain itu, pengurutan data yang dienkripsi menggunakan Selalu Dienkripsi harus dilakukan di tingkat aplikasi, karena SQL Server akan mengurutkan berdasarkan nilai terenkripsi daripada nilai yang didekripsi.
Jika kolom tidak akan digunakan untuk mencari catatan, maka kolom tersebut harus menggunakan jenis enkripsi acak. Jenis enkripsi ini lebih aman, tetapi tidak mendukung operasi pencarian, penggabungan, atau pengelompokan.
Membuat Tabel dengan Kolom Terenkripsi
Saat membuat tabel, Anda menggunakan sintaks CREATE TABLE
normal dengan beberapa parameter tambahan dalam definisi kolom. Tiga parameter digunakan dalam sintaks ENCRYPTED WITH
untuk pernyataan CREATE TABLE
.
Yang pertama adalah parameter ENCRYPTION_TYPE
, yang menerima nilai RANDOMIZED
atau DETERMINISTIC
. Yang kedua adalah parameter ALGORITHM
, yang hanya menerima nilai RAEAD_AES_256_CBC_HMAC_SHA_256
. Parameter ketiga adalah COLUMN_ENCRYPTION_KEY
, yang merupakan kunci enkripsi yang Anda gunakan untuk mengenkripsi nilai.
CREATE TABLE [dbo].[Customers] ( [CustomerId] [int] IDENTITY(1,1), [TaxId] [varchar](11) COLLATE Latin1_General_BIN2 ENCRYPTED WITH (ENCRYPTION_TYPE = DETERMINISTIC, ALGORITHM = 'AEAD_AES_256_CBC_HMAC_SHA_256', COLUMN_ENCRYPTION_KEY = YOUR_COLUMN_ENCRYPTION_KEY) NOT NULL, [FirstName] [nvarchar](50) NULL, [LastName] [nvarchar](50) NULL, [MiddleName] [nvarchar](50) NULL, [Address1] [nvarchar](50) NULL, [Address2] [nvarchar](50) NULL, [Address3] [nvarchar](50) NULL, [City] [nvarchar](50) NULL, [PostalCode] [nvarchar](10) NULL, [State] [char](2) NULL, [BirthDate] [date] ENCRYPTED WITH (ENCRYPTION_TYPE = RANDOMIZED, ALGORITHM = 'AEAD_AES_256_CBC_HMAC_SHA_256', COLUMN_ENCRYPTION_KEY = YOUR_COLUMN_ENCRYPTION_KEY) NOT NULL PRIMARY KEY CLUSTERED ([CustomerId] ASC) ON [PRIMARY] ); GO
Pengindeksan dengan Selalu Terenkripsi
Kolom yang berisi data terenkripsi dapat digunakan sebagai kolom kunci dalam indeks, asalkan kolom tersebut dienkripsi dengan menggunakan tipe enkripsi DETERMINISTIC
. Kolom yang dienkripsi dengan menggunakan tipe enkripsi RANDOMIZED
mengembalikan pesan galat saat Anda mencoba membuat indeks pada kolom tersebut. Kolom yang dienkripsi dengan menggunakan salah satu jenis enkripsi dapat digunakan sebagai kolom INCLUDE
dalam indeks nonclustered.
Karena nilai terenkripsi dapat berupa indeks, tidak ada ukuran penyesuaian kinerja tambahan yang diperlukan untuk nilai yang dienkripsi dengan Always Encrypted di luar pengindeksan dan penyetelan yang biasanya Anda lakukan. Bandwidth jaringan tambahan dan I/O yang lebih besar adalah satu-satunya efek samping yang dihasilkan dari peningkatan ukuran nilai yang dikembalikan.
Performa Selalu Terenkripsi
Performa selalu menjadi faktor kunci, terutama dalam hal ini, ketika kami menambahkan overhead enkripsi ke lalu lintas basis data biasa. Situs terbaik untuk menguji kinerja adalah Kinerja SQL, yang menguji eksekusi kueri dan penggunaan disk dalam berbagai skenario:
Karena ada pekerjaan CPU dan hard drive yang perlu dilakukan dengan proses enkripsi dan dekripsi, ada dampak yang jelas pada jumlah ruang penyimpanan yang digunakan dan durasi kueri. Karena hal ini dipengaruhi oleh lingkungan Anda—fitur CPU, RAM, dan disk—Anda harus menguji apakah ini akan menimbulkan masalah dalam produksi.
Catatan: Jika Anda ingin mempelajari lebih lanjut tentang pengoptimalan kinerja Microsoft SQL Sever, silakan lihat salah satu artikel kami sebelumnya, Cara Menyetel Microsoft SQL Server untuk Kinerja.
Perubahan Aplikasi
Apa yang harus Anda lakukan untuk menerapkan Selalu Dienkripsi dengan benar dalam kode lama?
Salah satu hal yang menyenangkan tentang fitur Selalu Terenkripsi dari SQL Server 2016 adalah bahwa aplikasi yang sudah menggunakan prosedur tersimpan, ORM, atau perintah T-SQL berparameter seharusnya tidak memerlukan perubahan aplikasi untuk menggunakan Selalu Terenkripsi, kecuali operasi non-kesetaraan sudah digunakan. Aplikasi yang membuat pernyataan SQL sebagai SQL dinamis dalam aplikasi dan menjalankan perintah tersebut terhadap database secara langsung perlu dimodifikasi untuk menggunakan parameterisasi kuerinya, praktik terbaik keamanan yang disarankan untuk semua aplikasi, sebelum mereka dapat memanfaatkan fitur Selalu Terenkripsi.
Perubahan lain yang diperlukan untuk membuat Always Encrypted berfungsi adalah penambahan atribut string koneksi ke string koneksi aplikasi yang terhubung ke database: Column Encryption Setting=enabled
.
Dengan pengaturan ini ditambahkan ke string koneksi, driver ADO.NET menanyakan SQL Server apakah perintah yang dijalankan menyertakan kolom terenkripsi, dan jika demikian, kolom mana yang dienkripsi. Untuk aplikasi beban tinggi, penggunaan pengaturan ini mungkin bukan praktik terbaik, terutama jika sebagian besar perintah eksekusi tidak menyertakan nilai terenkripsi.
Akibatnya, .NET Framework menyediakan metode baru pada objek SqlConnection yang disebut SqlCommandColumnEncryptionSetting
, yang memiliki tiga kemungkinan nilai:
-
Disabled
— Tidak ada kolom atau parameter yang selalu dienkripsi untuk digunakan untuk kueri yang dijalankan dengan menggunakan objek koneksi ini. -
Enabled
— Selalu ada kolom dan/atau parameter terenkripsi yang digunakan untuk kueri yang dijalankan dengan menggunakan objek koneksi ini. -
ResultSet
— Tidak ada parameter Selalu Dienkripsi. Namun, menjalankan kueri menggunakan objek koneksi ini mengembalikan kolom yang dienkripsi dengan menggunakan Selalu Dienkripsi.
Catatan: Ketahuilah bahwa penggunaan metode ini berpotensi memerlukan sejumlah besar perubahan pada kode aplikasi Anda. Pendekatan alternatif adalah memfaktorkan ulang aplikasi Anda untuk menggunakan koneksi yang berbeda.
Untuk kinerja terbaik SQL Server, sebaiknya hanya meminta metadata tentang Selalu Dienkripsi untuk kueri yang menggunakan Selalu Dienkripsi. Ini berarti bahwa dalam aplikasi yang sebagian besar kuerinya menggunakan Always Encrypted, string koneksi harus diaktifkan dan kueri spesifik dalam aplikasi harus menetapkan SqlCommandColumnEncryptionSetting
sebagai Disabled
. Untuk aplikasi yang sebagian besar kuerinya tidak menggunakan nilai Selalu Terenkripsi, string koneksi tidak boleh diaktifkan, dan SqlCommandColumnEncryptionSetting
harus disetel untuk Enabled
atau ResultSet
sebagaimana diperlukan untuk kueri yang menggunakan kolom Selalu Terenkripsi. Dalam kebanyakan kasus, aplikasi hanya dapat mengaktifkan atribut string koneksi, dan kinerja aplikasi akan tetap tidak berubah saat menggunakan data terenkripsi.
Apakah Selalu Dienkripsi Sepadan dengan Usaha?
Jawaban singkat? Iya tentu saja!
Tidak hanya membantu mencegah banyak potensi masalah keamanan dan menyediakan pengembang SQL dengan fitur keamanan tambahan, tetapi juga membuat sistem Anda lebih patuh, yang sangat penting di berbagai industri, mulai dari telekomunikasi hingga perbankan dan asuransi. Penting juga untuk dicatat bahwa mengingat prasyarat teknis yang disebutkan dalam artikel, Selalu Terenkripsi dapat diimplementasikan dengan sedikit perubahan aplikasi pada sistem yang ada .
Meskipun Anda mungkin menggunakan solusi kustom untuk mendapatkan efek yang sama, teknologi ini dibundel dengan versi baru SQL Server, dan dapat digunakan langsung. Penting juga untuk dicatat, karena ini adalah teknologi baru, masih ada beberapa batasan dalam penggunaannya, dan menambahkan beberapa tuntutan perangkat keras tambahan.
Namun, kecuali mereka adalah pemecah kesepakatan untuk lingkungan Anda, dan Anda memiliki aplikasi yang didistribusikan di luar Intranet perusahaan Anda, hampir tidak ada alasan untuk tidak menggunakan Always Encrypted.