Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

SQL Server 2016:Selalu Dienkripsi

SQL Server 2016 menyertakan fitur keamanan database yang disebut Always Encrypted. Karena kami telah menambahkan dukungan Selalu Terenkripsi ke driver SQL Server ODBC, pelanggan kami akan dapat memanfaatkan fitur ini.

Selalu Dienkripsi melindungi data SQL Server pada titik yang paling rentan terhadap serangan:saat data tersebut digunakan. Misalnya pada saat transaksi dan perhitungan. Ini berbeda dari fitur enkripsi SQL Server yang ada karena memerlukan data untuk didekripsi sebelum operasi dapat dilakukan di dalamnya.

Kunci enkripsi yang melindungi kolom Selalu Dienkripsi disimpan di mesin aplikasi. Ini berarti bahwa SQL Server tidak dapat mendekripsi data Selalu Dienkripsi. Jika mesin SQL Server disusupi, penyerang hanya akan dapat mengakses data Selalu Terenkripsi dalam bentuk sandi.

Untuk sebagian besar pengguna, fitur Always Encrypted akan transparan yaitu mereka terisolasi dari cara kerja Always Encrypted dan tidak perlu mengubah apa yang mereka lakukan untuk mendapatkan manfaat dari fitur tersebut.

Pada akhir aplikasi, enkripsi dilakukan oleh driver perangkat lunak yang menyediakan antarmuka klien untuk SQL Server. Di Linux dan UNIX, ini adalah driver ODBC, yang secara transparan mengenkripsi atau mendekripsi data tergantung pada arah perjalanan. Dalam kasus driver Easysoft, Always Encrypted diaktifkan dengan menyetel parameter string koneksi.

Karena orang-orang semakin khawatir bahwa data mereka aman di cloud, Always Encrypted akan tersedia di Azure SQL, versi SQL Server bayar sesuai penggunaan berbasis cloud. Oleh karena itu, driver ODBC Easysoft untuk Azure SQL juga akan mendukung Selalu Dienkripsi.

Panduan:Bekerja dengan data kolom Selalu Terenkripsi di Linux

Driver ODBC SQL Server Easysoft memungkinkan Anda memperbarui dan menanyakan data yang disimpan di kolom Selalu Terenkripsi.

Buat Tabel dan Buat Kunci Enkripsi

Langkah-langkah ini dilakukan pada mesin SQL Server.

  1. Di SQL Server Management Studio 2016 CTP3 atau yang lebih baru, buat database baru.
  2. Di database baru, buat tabel yang berisi satu atau beberapa kolom yang isinya ingin Anda enkripsi. Misalnya:
    CREATE TABLE dbo.EncryptedTable( ID INT IDENTITY(1,1) PRIMARY KEY, Nama Belakang NVARCHAR(32), Gaji INT NOT NULL);
  3. Klik kanan database. Dari menu pop-up, pilih Tugas> Enkripsi Kolom .

    Wizard Selalu Terenkripsi dimulai.

  4. Pada Pilihan Kolom halaman, perluas tabel, dan pilih kolom yang ingin Anda enkripsi.
  5. Pilih jenis enkripsi untuk setiap kolom.

    Deterministik - selalu mengenkripsi ke teks sandi yang sama, memungkinkan pencarian kesetaraan, penggabungan, dan pengelompokan dengan dilakukan.

    Diacak menghasilkan nilai teks sandi yang berbeda untuk teks biasa yang sama, yang lebih aman, tetapi tidak mendukung operasi apa pun.

  6. Pilih CEK_Auto1 (New) sebagai kunci enkripsi untuk setiap kolom, yang merupakan kunci baru yang dibuat secara otomatis. Pilih Berikutnya .
  7. Di halaman Konfigurasi Master Key, terima pengaturan default:
    Field Nilai
    Pilih kunci master kolom Buat kunci master kolom secara otomatis
    Pilih penyedia penyimpanan kunci Penyimpanan sertifikat Windows
    Pilih kunci master kolom Pengguna Saat Ini
  8. Gunakan Berikutnya tombol untuk melanjutkan ke Ringkasan halaman. Pilih Selesai .
  9. Tunggu hingga wizard selesai, lalu pilih Tutup .

Mengekspor Sertifikat

Untuk mentransfer sertifikat ke mesin Linux, Anda harus mengekspornya terlebih dahulu di Windows.

  1. Di jendela prompt perintah, ketik certmgr , untuk meluncurkan snap-in Sertifikat.
  2. Sertifikat Selalu Terenkripsi yang baru akan tersedia di bawah Sertifikat - Pengguna Saat Ini> Pribadi> Sertifikat .
  3. Klik kanan sertifikat (yang akan disebut seperti Always Encrypted Auto Certificate1 ). Dari menu pop-up, pilih Semua Tugas> Ekspor .

    Wisaya Ekspor Sertifikat dimulai. Pilih Berikutnya .

  4. Pilih Ya, ekspor kunci pribadi .
  5. Terima default di halaman Format File Ekspor. Pilih Berikutnya .
  6. Berikan sandi saat diminta. Pilih Berikutnya .
  7. Beri nama dan simpan sertifikat saat diminta. Misalnya, CMK_Auto1.pfx .
  8. Gunakan Berikutnya dan Selesai tombol untuk menyelesaikan wizard.

Memasang Sertifikat di Linux

Transfer sertifikat yang diekspor ke mesin Linux tempat Anda ingin mengakses kolom Selalu Terenkripsi:

  1. Salin sertifikat yang baru saja Anda ekspor ke ~/ssl/private di mesin Linux atau UNIX tempat Anda menginstal driver SQL Server ODBC.

    ~ merupakan home directory dari user yang akan menjalankan aplikasi yang terhubung ke SQL Server melalui driver Easysoft ODBC. ~/ssl/private adalah lokasi di mana lapisan OpenSSL yang dibangun ke dalam driver akan mencoba memuat sertifikat pribadi. Buat direktori jika tidak ada. Misalnya:

    $ mkdir -p ~/ssl/private$ cd ~/ssl/private$ mv /tmp/CMK_Auto1.pfx .
  2. Untuk menggunakan sertifikat dengan pengandar SQL Server ODBC, Anda harus menghapus frasa sandi yang ada di dalamnya. Untuk melakukan ini, OpenSSL harus diinstal pada mesin. (Ini hanya diperlukan untuk menghapus frasa sandi, untuk operasi lain, pengandar SQL Server ODBC menggunakan lapisan OpenSSL bawaan.) Hapus frasa sandi dengan perintah berikut. Saat dimintai kata sandi setelah detik perintah, tekan RETURN tanpa memasukkan apa pun. Ini akan mengatur frasa sandi menjadi tidak ada.
    $ openssl pkcs12 -in CMK_Auto1.pfx -nodes -out temp.pemMasukkan Kata Sandi Impor:*******MAC terverifikasi OK$ openssl pkcs12 -ekspor -masuk temp.pem -keluar nopassphrase.p12Masukkan Kata Sandi Ekspor:Memverifikasi - Masukkan Kata Sandi Ekspor:$
  3. Untuk memuat sertifikat, pengandar SQL Server ODBC menggunakan informasi meta yang diterimanya dari SQL Server tentang kolom terenkripsi. Nama sertifikat yang diterima driver dari SQL Server dalam bentuk my/thumbprint . Anda perlu menggunakan konvensi penamaan ini untuk sertifikat. Gunakan OpenSSL untuk menampilkan cap jempol sertifikat dan kemudian ganti nama sertifikat dalam subdirektori bernama my:
    $ openssl x509 -in temp.pem -fingerprint -noout | tr -d ":"SHA1 Fingerprint=EFC1940E545941D6C05C763361403F55A5DEF0E8$ mkdir my$ cp nopassphrase.p12 my/EFC1940E545941D6C05C763361403F55A5DEF0E8$ ln -s my My

    Catatan Selama pengujian, kami melihat bahwa SQL Server terkadang memberi nama sertifikat My/thumbprint . Tautan simbolis dalam contoh di atas mengatasi ketidakkonsistenan ini.

Menginstal Driver ODBC SQL Server

Driver SQL Server ODBC tidak hanya menyediakan lapisan konektivitas antara aplikasi dan SQL Server, tetapi juga menangani enkripsi/dekripsi data yang disimpan di kolom Always Encrypted.

Instal dan lisensikan pengandar SQL Server ODBC. Untuk instruksi tentang cara melakukannya, lihat dokumentasi driver ODBC SQL Server. Jika aplikasi Anda 64-bit, unduh driver ODBC versi 64-bit. Jika tidak, gunakan driver versi 32-bit, apa pun arsitektur sistem operasinya.

Sumber data ODBC berisi informasi string koneksi yang memungkinkan pengandar ODBC SQL Server untuk menyambung ke contoh SQL Server target. Di mesin kami, sumber data ODBC disimpan di /etc/odbc.ini . Ekstrak sumber data ini menunjukkan pengaturan yang relevan untuk kolom Selalu Terenkripsi:

[SQLSERVER_2016]Driver=Easysoft ODBC-SQL Server SSL # Harus menggunakan versi SSL driverServer=machine\sqlserver_instanceDatabase=database_with_always_encrypted_dataUser=pengguna # Ini dapat berupa login Windows atau SQL Server.Password=passwordTrusted_Connection=Ya # Setel ini ke Tidak untuk SQL Server loginColumnEncryption=Diaktifkan # Untuk melihat data yang Selalu Dienkripsi atau untuk # menyisipkan ke dalam kolom Selalu Terenkripsi yang disetel ke Diaktifkan

Catatan Jika koneksi Anda gagal dengan kesalahan "koneksi SSL gagal di syscall", sistem Anda tidak memiliki "perangkat acak". Lihat Entropy atribut di manual driver SQL Server ODBC untuk informasi tentang apa yang harus dilakukan tentang hal ini.

Memasukkan Data ke Kolom Selalu Terenkripsi

Kami sekarang telah membuat tabel kosong dengan kolom Selalu Terenkripsi dan mengatur mesin klien Linux kami sehingga driver SQL Server ODBC dapat bekerja dengan Data Selalu Terenkripsi. Selanjutnya, kita perlu mengisi tabel dengan data.

Untuk memasukkan data ke dalam kolom Selalu Terenkripsi, aplikasi harus:

  1. Gunakan sisipan berparameter, yaitu INSERT INTO EncryptedTable VALUES (?, ?).

    Ini memungkinkan pengandar SQL Server ODBC untuk membedakan antara nilai kolom (yang perlu dienkripsi) dan teks pernyataan SQL (yang harus tetap dalam teks biasa; dengan Selalu Dienkripsi, ingat, SQL Server tidak melakukan dekripsi apa pun).

  2. Jelaskan secara eksplisit tipe data parameter.

    SQL Server tidak menyediakan informasi yang diperlukan tentang kolom selalu dienkripsi untuk pengandar SQL Server ODBC untuk menemukan tipe data dengan menggunakan SQLDescribeParam .

Berikut adalah contoh Perl yang menunjukkan cara melakukannya:

# Gunakan Perl DBI / DBD:ODBC untuk memasukkan data ke kolom Selalu Terenkripsi.gunakan ketat;gunakan peringatan;gunakan DBI;$data_source saya =q/dbi:ODBC:SQLSERVER_2016/;$h saya =DBI->koneksi( $data_source) atau die "Tidak dapat terhubung ke $data_source:$DBI::errstr";$h->{RaiseError} =1;my $s =$h->prepare(q/insert into EncryptedTable values(?, ?)/);my $lastname='Smith';my $salary=25000;# Tetapkan tipe data kolom target.# Tidak dapat menggunakan SQLDescribeParam dengan kolom Always Encrypted.$s->bind_param(1, $lastname, DBI ::SQL_WVARCHAR);$s->bind_param(2, $salary, DBI::SQL_INTEGER);$s->execute($lastname,$salary);$h->disconnect;

Berikut adalah contoh C yang menunjukkan cara melakukannya:

#include #include #include #include #include #include #include #define LASTNAME_LEN 6SQLHENV henv =SQL_NULL_HENV; // EnvironmentSQLHDBC hdbc =SQL_NULL_HDBC; // Sambungan handleSQLHSTMT hstmt =SQL_NULL_HSTMT; // Pernyataan handleSQLRETURN retcode;SQLCHAR strLastName[]="Jones";SQLINTEGER pSalary=25000;SQLLEN lenLastName=0;int main () { // Alokasikan environment retcode =SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv); // Setel retcode Versi ODBC =SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (SQLPOINTER*)SQL_OV_ODBC3, 0); // Alokasikan Retcode Koneksi =SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc); // Hubungkan ke DSN retcode =SQLConnect(hdbc, (SQLCHAR*) "MyDSN", SQL_NTS, (SQLCHAR*) NULL, 0, NULL, 0); // Alokasikan Pernyataan Menangani retcode =SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt); // Mengikat Parameter ke semua bidang retcode =SQLBindParameter(hstmt, 1, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_WVARCHAR, LASTNAME_LEN, 0, strLastName, LASTNAME_LEN, &lenLastName); retcode =SQLBindParameter(hstmt, 2, SQL_PARAM_INPUT, SQL_C_LONG, SQL_INTEGER, 0, 0, &pGaji, 0, NULL); retcode =SQLPrepare(hstmt, (SQLCHAR*)"INSERT INTO [dbo].[EncryptedTable] ([LastName],[Gaji]) NILAI (?,?)", SQL_NTS); lenNamaLast=strlen((char*)strNamaLast); retcode =SQLExecute(hstmt);keluar:printf("\nSelesai.\n"); // Pegangan gratis // Pernyataan if (hstmt !=SQL_NULL_HSTMT) SQLFreeHandle(SQL_HANDLE_STMT, hstmt); // Koneksi jika (hdbc !=SQL_NULL_HDBC) { SQLDisconnect(hdbc); SQLFreeHandle(SQL_HANDLE_DBC, hdbc); } // Lingkungan jika (henv !=SQL_NULL_HENV) SQLFreeHandle(SQL_HANDLE_ENV, henv); kembali 0;} 

Sekarang kolom terisi, kita dapat menggunakan isql untuk mengambil data:

$ /usr/local/easysoft/unixODBC/bin/isql.sh -v SQLSERVER_2016SQL> pilih * dari EncryptedTable+----+----------+-------- ----+| ID | Nama Belakang | Gaji |+----+----------+------------+| 1 | Smith | 25000 |+----+----------+------------+

Kami mengaktifkan logging driver di sumber data kami. Ekstrak berikut dari log driver menunjukkan bahwa:

  1. SQL Server menyediakan nama sertifikat sebagai informasi meta tentang kolom.
  2. Data kolom dienkripsi pada akhir SQL Server dan oleh karena itu tetap dienkripsi saat transit. Driver SQL Server ODBC pada klien mendekripsi nilai kolom dan kemudian mengembalikannya dalam teks biasa ke aplikasi.
1. M.S.S.Q.L._.C.E.R.T.I.F.I.C.A.T.E._.S.T.O.R.E.7.C.u.r.r.e.n.t.U.s.e.r./.m.y./.7.2.8.8.1.8.C.5.F.6.E. .8.9.0.8.3.E..R.S.A._.O.A.E.P.......8.I.D..................@.......... L.a.s.t.N.a.m.e........Q.......8....S.a.l.a.r.y...........2. PKTDUMP:Kolom terenkripsi.);...'A..zs..I..N.]r..p.-..$....S;.].km6.....3cr.OhR ..j*.....fj....ARN{V.F.....DETAIL:EVP_DecryptInit mengembalikan 1DETAIL:EVP_DecryptUpdate mengembalikan 1, 0DETAIL:EVP_DecryptUpdate mengembalikan 1, 16DETAIL:EVP_DecryptFinal mengembalikan 1, 0PKTDUMP:dataS.m.i.t.h. 

Lihat Juga

  • Menggunakan Data yang Dilindungi dengan Azure Key Vault dari Linux
  • Menggunakan Data yang Dilindungi dengan Penyimpanan Kunci Khusus dari Linux

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Perbedaan dua tanggal waktu di sql server

  2. Apakah Penyedia Microsoft OLE DB untuk SQL Server mendukung TLS 1.2?

  3. SQL Server Konversi bilangan bulat ke string biner

  4. Kolom Jarang di SQL Server:Dampak pada Waktu &Ruang

  5. Cara Memperbaiki "Hanya satu ekspresi yang dapat ditentukan dalam daftar pilih ..." di SQL Server