Database
 sql >> Teknologi Basis Data >  >> RDS >> Database

Enkripsi Data Transparan dan Selalu Terenkripsi

Jika Anda perlu menyimpan data rahasia di database Anda, Anda dapat menggunakan enkripsi data . SQL Server mendukung enkripsi dengan kunci simetris, kunci asimetris, sertifikat, dan frasa sandi. Saya berasumsi bahwa Anda, pembaca, sudah akrab dengan istilah-istilah ini. Pada artikel ini, saya akan fokus pada dua dari banyak opsi enkripsi yang disediakan oleh SQL Server:

  • Enkripsi Data Transparan (TDE)
  • Selalu Dienkripsi (AE)

Enkripsi Data Transparan

Enkripsi Data Transparan (TDE) melindungi data saat tidak digunakan saat tidak digunakan. Saat data digunakan, SQL Server mendekripsi secara otomatis. Anda dapat menggunakan TDE untuk enkripsi dan dekripsi data dan file log secara real-time. Anda mengenkripsi data dengan kunci enkripsi basis data (DEK) , yang merupakan kunci simetris. Itu disimpan dalam catatan boot basis data dan oleh karena itu sudah tersedia selama proses pemulihan basis data. Anda melindungi DEK dengan sertifikat di database master. Anda juga dapat menggunakan kunci asimetris sebagai ganti sertifikat; namun, kunci asimetris harus disimpan dalam modul EKM. TDE hanya menggunakan enkripsi AES dan Triple DES. TDE pertama kali diimplementasikan di SQL Server dengan versi 2012.

Anda hanya dapat menggunakan TDE pada database pengguna. Anda tidak dapat mengekspor kunci enkripsi database. Kunci ini hanya digunakan oleh SQL Server Database Engine. Pengguna akhir tidak pernah menggunakannya. Bahkan jika Anda mengubah pemilik database, Anda tidak perlu membuat ulang DEK.

TDE mengenkripsi data pada tingkat halaman. Selain itu, ia juga mengenkripsi log transaksi. Anda harus mencadangkan sertifikat yang digunakan untuk melindungi DEK dan kunci pribadi yang digunakan untuk melindungi sertifikat segera setelah Anda mengaktifkan TDE. Jika Anda perlu memulihkan atau melampirkan database terenkripsi ke contoh SQL Server lain, Anda perlu memulihkan keduanya, sertifikat dan kunci pribadi, atau Anda tidak dapat membuka database. Perhatikan lagi bahwa Anda tidak mengekspor DEK, karena itu adalah bagian dari database itu sendiri. Anda harus menyimpan dan memelihara sertifikat yang digunakan untuk melindungi DEK bahkan setelah Anda menonaktifkan TDE di database. Ini karena bagian dari log transaksi mungkin masih dienkripsi. Sertifikat diperlukan hingga Anda melakukan pencadangan basis data lengkap.

Selalu Dienkripsi

SQL Server 2016 Enterprise Edition memperkenalkan tingkat enkripsi baru, yaitu Always Encrypted (AE) fitur. Fitur ini memungkinkan tingkat perlindungan data yang sama dengan mengenkripsi data di aplikasi klien. Sebenarnya, meskipun ini adalah fitur SQL Server, data dienkripsi dan didekripsi di sisi klien. Kunci enkripsi tidak pernah diungkapkan ke SQL Server Database Engine. Dengan cara ini, DBA juga tidak dapat melihat data sensitif tanpa kunci enkripsi, hanya dengan memiliki izin sysadmin pada instance SQL Server dengan data terenkripsi. Dengan cara ini, AE membuat pemisahan antara administrator yang mengelola data dan pengguna yang memiliki data.

Tombol AE

Anda memerlukan dua kunci untuk Selalu Dienkripsi. Pertama, Anda membuat kunci master kolom (CMK) . Kemudian Anda membuat kunci enkripsi kolom (CEK) dan lindungi dengan CMK. Aplikasi menggunakan CEK untuk mengenkripsi data. SQL Server hanya menyimpan data terenkripsi, dan tidak dapat mendekripsinya. Ini dimungkinkan karena kunci master kolom tidak benar-benar disimpan dalam database SQL Server. Dalam database, SQL Server hanya menyimpan tautan ke kunci tersebut. Kunci master kolom disimpan di luar SQL Server, di salah satu tempat berikut yang memungkinkan:

  • Toko Sertifikat Windows untuk pengguna saat ini
  • Toko Sertifikat Windows untuk mesin lokal
  • Layanan Azure Key Vault
  • Modul keamanan perangkat keras (HSM) , yang mendukung Microsoft CryptoAPI atau Cryptography API:Next Generation

Kunci enkripsi kolom disimpan dalam database. Di dalam database SQL Server, hanya bagian terenkripsi dari nilai kunci enkripsi kolom yang disimpan, bersama dengan informasi tentang lokasi kunci master kolom. CEK tidak pernah disimpan sebagai teks biasa dalam database. CMK, sebagaimana disebutkan, sebenarnya disimpan di penyimpanan kunci tepercaya eksternal.

Menggunakan Tombol AE

Aplikasi dapat menggunakan kunci AE dan enkripsi dengan menggunakan pengandar berkemampuan AE, seperti .NET Framework Data Provider untuk SQL Server versi 4.6 atau lebih tinggi, Pengandar Microsoft JDBC untuk SQL Server 6.0 atau lebih tinggi, atau pengandar Windows ODBC untuk SQL Server versi 13.1 atau lebih tinggi. Aplikasi harus mengirim kueri berparameter ke SQL Server. Driver berkemampuan AE bekerja sama dengan SQL Server Database Engine untuk menentukan parameter mana yang harus dienkripsi atau didekripsi. Untuk setiap parameter yang perlu dienkripsi atau didekripsi, driver memperoleh metadata yang diperlukan untuk enkripsi dari Mesin Basis Data, termasuk algoritme enkripsi, lokasi CMK terkait, dan nilai terenkripsi untuk CEK terkait. Kemudian driver menghubungi toko CMK, mengambil CMK, mendekripsi CEK, dan menggunakan CEK untuk mengenkripsi atau mendekripsi parameter. Kemudian driver meng-cache CEK, untuk mempercepat penggunaan CEK yang sama berikutnya. Gambar berikut menunjukkan proses secara grafis.

Angka tersebut mewakili seluruh proses dalam langkah-langkah:

  1. Aplikasi klien membuat kueri berparameter
  2. Aplikasi klien mengirimkan kueri berparameter ke driver yang mendukung AE
  3. Driver berkemampuan AE menghubungi SQL Server untuk menentukan parameter mana yang memerlukan enkripsi atau dekripsi, lokasi CMK, dan nilai CEK yang dienkripsi
  4. Driver berkemampuan AE mengambil CMK dan mendekripsi CEK
  5. Driver berkemampuan AE mengenkripsi parameter
  6. Pengemudi mengirimkan kueri ke Mesin Basis Data
  7. Mesin Database mengambil data dan mengirimkan hasil yang disetel ke driver
  8. Driver melakukan dekripsi, jika diperlukan, dan mengirimkan hasil yang disetel ke aplikasi klien

Jenis Enkripsi AE

Mesin Database tidak pernah beroperasi pada data teks biasa yang disimpan dalam kolom terenkripsi. Namun, beberapa kueri pada data terenkripsi dimungkinkan, tergantung pada jenis enkripsi. Ada dua jenis enkripsi:

  • Enkripsi deterministik , yang selalu menghasilkan nilai terenkripsi yang sama untuk nilai input yang sama. Dengan enkripsi ini, Anda dapat mengindeks kolom terenkripsi dan menggunakan pencarian titik, gabungan kesetaraan, dan ekspresi pengelompokan pada kolom terenkripsi. Namun, pengguna jahat dapat mencoba menebak nilai dengan menganalisis pola nilai terenkripsi. Ini sangat berbahaya jika kumpulan nilai yang mungkin untuk kolom bersifat diskrit, dengan sejumlah kecil nilai yang berbeda.
  • Enkripsi acak , yang mengenkripsi data dengan cara yang tidak terduga.

Demo AE:Membuat Objek

Saatnya untuk menunjukkan bagaimana AE bekerja melalui beberapa kode demo. Pertama, mari buat dan gunakan database demo.

USE master;
IF DB_ID(N'AEDemo') IS NULL
   CREATE DATABASE AEDemo;
GO
USE AEDemo;
GO

Selanjutnya, buat CMK di SSMS GUI. Di Object Explorer, refresh folder Databases untuk melihat database AEDemo. Perluas folder database ini, perluas subfolder Keamanan, lalu subfolder Always Encrypted Keys, dan klik kanan subfolder Column Master Key dan pilih opsi New Column Master Key dari menu pop-up. Di kotak teks Name, tulis AE_ColumnMasterKey, dan pastikan Anda memilih opsi Windows Certificate Store – Local Machine di daftar drop-down Key Store, seperti yang ditunjukkan gambar berikut.

Anda dapat memeriksa apakah CMK berhasil dibuat dengan kueri berikut.

SELECT * 
FROM sys.column_master_keys;

Selanjutnya, Anda membuat CEK. Di SSMS, di Object Explorer, klik kanan subfolder Column Encryption Keys tepat di bawah subfolder Column Master Key dan pilih opsi New Column Encryption Key dari menu pop-up. Beri nama CEK AE_ColumnEncryptionKey dan gunakan AE_ColumnMasterKey CMK untuk mengenkripsinya. Anda dapat memeriksa apakah pembuatan CEK berhasil dengan kueri berikut.

SELECT * 
FROM sys.column_encryption_keys;

Saat ini, hanya susunan biner baru, susunan dengan BIN2 akhiran, didukung untuk AE. Oleh karena itu, mari buat tabel dengan susunan yang sesuai untuk kolom karakter.

CREATE TABLE dbo.Table1
(id INT,
 SecretDeterministic NVARCHAR(10) COLLATE Latin1_General_BIN2 
  ENCRYPTED WITH (COLUMN_ENCRYPTION_KEY = AE_ColumnEncryptionKey,
   ENCRYPTION_TYPE = DETERMINISTIC,
   ALGORITHM = 'AEAD_AES_256_CBC_HMAC_SHA_256') NULL,
 SecretRandomized NVARCHAR(10) COLLATE Latin1_General_BIN2
  ENCRYPTED WITH (COLUMN_ENCRYPTION_KEY = AE_ColumnEncryptionKey,
   ENCRYPTION_TYPE = RANDOMIZED,
   ALGORITHM = 'AEAD_AES_256_CBC_HMAC_SHA_256') NULL
);

Demo AE:Memasukkan Data

Sekarang Anda dapat mencoba menyisipkan baris data dengan pernyataan berikut.

INSERT INTO dbo.Table1
 (id, SecretDeterministic, SecretRandomized)
VALUES (1, N'DeterSec01', N'RandomSec1');

Anda mendapatkan kesalahan 206, teks kesalahan:“Operand type clash:nvarchar is incompatible with nvarchar(4000) terenkripsi dengan (encryption_type ='DETERMINISTIC', encryption_algorithm_name ='AEAD_AES_256_CBC_HMAC_SHA_256', column_encryption_key_name')'key_dataen_name_keyEncryption_AES_Columion ='AE_Columion_ . SQL Server tidak dapat mengenkripsi atau mendekripsi data. Anda perlu mengubah data dari aplikasi klien. Anda dapat melakukan serangkaian operasi terbatas pada tabel dari SQL Server. Misalnya, Anda dapat menggunakan pernyataan TRUNCATE TABLE pada tabel dengan kolom AE.

Saya membuat aplikasi Konsol Windows klien yang sangat sederhana di Visual C#. Aplikasi sebenarnya hanya mengambil kunci dan memasukkan satu baris ke dalam tabel yang dibuat dengan kode di atas. Ini kode C#nya.

using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace AEDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            string connectionString = "Data Source=localhost; “ +
              “Initial Catalog=AEDemo; Integrated Security=true; ” +
              “Column Encryption Setting=enabled";
            SqlConnection connection = new SqlConnection(connectionString);
            connection.Open();
            if (args.Length != 3)
            {
                Console.WriteLine("Please enter a numeric “ + 
                                  “and two string arguments.");
                return;
            }
            int id = Int32.Parse(args[0]);
            {
                using (SqlCommand cmd = connection.CreateCommand())
                {
                    cmd.CommandText = @"INSERT INTO dbo.Table1 “ +
                        “(id, SecretDeterministic, SecretRandomized)" +
                        " VALUES (@id, @SecretDeterministic, @SecretRandomized);";

                    SqlParameter paramid= cmd.CreateParameter();
                    paramid.ParameterName = @"@id";
                    paramid.DbType = DbType.Int32;
                    paramid.Direction = ParameterDirection.Input;
                    paramid.Value = id;
                    cmd.Parameters.Add(paramid);

                    SqlParameter paramSecretDeterministic = cmd.CreateParameter();
                    paramSecretDeterministic.ParameterName = 
                      @"@SecretDeterministic";
                    paramSecretDeterministic.DbType = DbType.String;
                    paramSecretDeterministic.Direction = ParameterDirection.Input;
                    paramSecretDeterministic.Value = "DeterSec1";
                    paramSecretDeterministic.Size = 10;
                    cmd.Parameters.Add(paramSecretDeterministic);

                    SqlParameter paramSecretRandomized = cmd.CreateParameter();
                    paramSecretRandomized.ParameterName =
                      @"@SecretRandomized";
                    paramSecretRandomized.DbType = DbType.String;
                    paramSecretRandomized.Direction = ParameterDirection.Input;
                    paramSecretRandomized.Value = "RandomSec1";
                    paramSecretRandomized.Size = 10;
                    cmd.Parameters.Add(paramSecretRandomized);

                    cmd.ExecuteNonQuery();
                }
            }
            connection.Close();
            Console.WriteLine("Row inserted successfully");            
        }
    }
}

Anda dapat menjalankan kode C# dari Visual Studio dalam mode debug atau membangun aplikasi. Kemudian Anda dapat menjalankan aplikasi AEDemo.exe dari command prompt, atau dari SSMS dalam mode SQMCMD.

Demo AE:Membaca Data

Setelah menjalankan aplikasi, Anda harus mencoba membaca data dari sesi yang sama di SSMS yang Anda gunakan untuk membuat tabel.

SELECT *
FROM dbo.Table1;

Anda hanya dapat melihat data terenkripsi. Sekarang buka jendela kueri kedua di SSMS. Klik kanan di jendela ini dan pilih Connection, lalu Change Connection. Dalam dialog Koneksi, klik tombol Opsi di bagian bawah. Ketik AEDemo untuk nama database dan kemudian klik tab Parameter Koneksi Tambahan. Di kotak teks, masukkan "Pengaturan Enkripsi Kolom =diaktifkan" (tanpa tanda kutip ganda). Kemudian klik Hubungkan.

Coba lagi untuk menyisipkan baris dari SSMS. Gunakan kueri berikut.

INSERT INTO dbo.Table1
 (id, SecretDeterministic, SecretRandomized)
VALUES (2, N'DeterSec2', N'RandomSec2');

Saya mendapat kesalahan lagi. Versi SSMS yang saya gunakan ini masih tidak dapat memparametrikan sisipan ad-hoc. Namun, mari kita coba membaca data dengan kueri berikut.

SELECT * 
FROM dbo.Table1;

Kali ini, kueri berfungsi, dan Anda mendapatkan hasil berikut:

Rahasia IdRahasia DeterministikAcak

— ——————– —————-

1 DeterSec1 RandomSec1

2 DeterSec2 RandomSec2

Batasan AE

Anda telah melihat beberapa batasan dari Always Encrypted, termasuk:

  • Hanya susunan BIN2 yang didukung untuk string
  • Anda hanya dapat mengindeks kolom dengan enkripsi deterministik, dan menggunakan serangkaian operasi T-SQL terbatas pada kolom tersebut
  • Anda tidak dapat mengindeks kolom dengan enkripsi acak
  • AE terbatas hanya untuk edisi Perusahaan dan Pengembang
  • Bekerja dengan AE di SSMS bisa menyakitkan

Silakan merujuk ke Buku Online untuk daftar lebih rinci tentang batasan AE. Namun, harap perhatikan juga kekuatan AE. Sederhana untuk diimplementasikan karena tidak memerlukan modifikasi dalam aplikasi, kecuali modifikasi string koneksi. Data dienkripsi end-to-end, dari memori klien melalui jaringan ke penyimpanan database. Bahkan DBA tidak dapat melihat data dalam SQL Server saja; bahkan DBA memerlukan akses ke penyimpanan kunci di luar SQL Server untuk membaca CMK. AE dan opsi enkripsi lainnya di SQL Server menyediakan serangkaian kemungkinan yang lengkap, dan terserah Anda dan masalah bisnis yang Anda pecahkan untuk memilih metode yang sesuai.

Kesimpulan

Enkripsi Data Transparan sangat mudah digunakan. Namun, perlindungan data sangat terbatas. TDE hanya melindungi data saat istirahat. Namun, Always Encrypted benar-benar fitur yang kuat. Implementasinya masih tidak terlalu rumit, dan datanya benar-benar terlindungi. Bahkan DBA tidak dapat melihatnya tanpa memiliki akses ke kunci enkripsi. Mudah-mudahan, batasan untuk AE, terutama batasan collation, akan dihapus di versi SQL Server yang akan datang.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Kejutan dan Asumsi Kinerja :DATEDIFF

  2. Bagaimana cara mengambil satu set karakter menggunakan SUBSTRING dalam SQL?

  3. Menggunakan AT TIME ZONE untuk memperbaiki laporan lama

  4. PL/SQL Strong Ref Cursor Dengan Tipe Data Rekam Buatan Pengguna

  5. Apakah awalan sp_ masih tidak-tidak?