SQL Server 2016 zawiera funkcję zabezpieczeń bazy danych o nazwie Always Encrypted. Ponieważ dodaliśmy obsługę Always Encrypted do sterownika ODBC SQL Server, nasi klienci będą mogli skorzystać z tej funkcji.
Always Encrypted chroni dane programu SQL Server w momencie, w którym są najbardziej podatne na atak:kiedy te dane są używane. Na przykład podczas transakcji i obliczeń. Różni się to od istniejących funkcji szyfrowania SQL Server, ponieważ wymagają one odszyfrowania danych przed wykonaniem na nich operacji.
Klucz szyfrowania, który chroni kolumny Always Encrypted, jest przechowywany na komputerze aplikacji. Oznacza to, że SQL Server nie może odszyfrować danych Always Encrypted. Jeśli komputer SQL Server zostanie naruszony, atakujący będzie mógł uzyskać dostęp do danych Always Encrypted tylko w postaci zaszyfrowanej.
Dla większości użytkowników funkcja Always Encrypted będzie przezroczysta, tj. będą oni odizolowani od działania Always Encrypted i nie będą musieli zmieniać tego, co robią, aby skorzystać z tej funkcji.
Po stronie aplikacji szyfrowanie jest realizowane przez sterownik oprogramowania, który zapewnia interfejs klienta dla SQL Server. W systemach Linux i UNIX jest to sterownik ODBC, który w sposób przezroczysty szyfruje lub odszyfrowuje dane w zależności od kierunku podróży. W przypadku sterownika Easysoft, Always Encrypted jest włączane poprzez ustawienie parametru ciągu połączenia.
Ponieważ ludzie coraz bardziej obawiają się, że ich dane są bezpieczne w chmurze, funkcja Always Encrypted będzie dostępna w Azure SQL, opartej na chmurze wersji programu SQL Server z płatnością zgodnie z rzeczywistym użyciem. Sterownik ODBC firmy Easysoft dla Azure SQL będzie również obsługiwał Always Encrypted.
Instrukcja:praca z zawsze zaszyfrowanymi danymi kolumn w systemie Linux
Sterownik ODBC dla SQL Server firmy Easysoft umożliwia aktualizację i wyszukiwanie danych przechowywanych w kolumnach Always Encrypted.
Utwórz tabelę i wygeneruj klucze szyfrowania
Te kroki są wykonywane na maszynie SQL Server.
- W SQL Server Management Studio 2016 CTP3 lub nowszym utwórz nową bazę danych.
- W nowej bazie danych utwórz tabelę zawierającą co najmniej jedną kolumnę, której zawartość chcesz zaszyfrować. Na przykład:
CREATE TABLE dbo.EncryptedTable ( ID INT IDENTITY(1,1) PRIMARY KEY, LastName NVARCHAR(32), Salary INT NOT NULL );
- Kliknij prawym przyciskiem myszy bazę danych. Z wyskakującego menu wybierz Zadania> Szyfruj kolumny .
Uruchomi się Kreator Always Encrypted.
- W Wybraniu kolumny stronę, rozwiń tabele i wybierz kolumny, które chcesz zaszyfrować.
- Wybierz typ szyfrowania dla każdej kolumny.
Deterministyczny - zawsze szyfruje do tego samego tekstu zaszyfrowanego, umożliwiając przeprowadzanie wyszukiwania równości, łączenia i grupowania według.
Losowo generuje inną wartość tekstu zaszyfrowanego dla tego samego zwykłego tekstu, który jest bezpieczniejszy, ale nie obsługuje żadnych operacji.
- Wybierz
CEK_Auto1 (New)
jako klucz szyfrowania dla każdej kolumny, który jest nowym kluczem wygenerowanym automatycznie. Wybierz Dalej . - Na stronie Konfiguracja klucza głównego zaakceptuj ustawienia domyślne:
Pole Wartość Wybierz klucz główny kolumny Automatycznie generuj klucz główny kolumny Wybierz dostawcę magazynu kluczy magazyn certyfikatów Windows Wybierz klucz główny kolumny Bieżący użytkownik - Użyj przycisku Dalej przycisk, aby przejść do Podsumowania strona. Wybierz Zakończ .
- Poczekaj, aż kreator zakończy działanie, a następnie wybierz Zamknij .
Eksportowanie certyfikatów
Aby przenieść certyfikaty na komputer z systemem Linux, musisz je najpierw wyeksportować do systemu Windows.
- W oknie wiersza poleceń wpisz
certmgr
, aby uruchomić przystawkę Certyfikaty. - Nowy certyfikat Always Encrypted będzie dostępny w sekcji Certyfikaty — bieżący użytkownik> Osobiste> Certyfikaty .
- Kliknij prawym przyciskiem myszy certyfikat (który będzie się nazywał mniej więcej
Always Encrypted Auto Certificate1
). Z wyskakującego menu wybierz Wszystkie zadania> Eksportuj .Uruchomi się Kreator eksportu certyfikatów. Wybierz Dalej .
- Wybierz Tak, wyeksportuj klucz prywatny .
- Zaakceptuj ustawienia domyślne na stronie Format pliku eksportu. Wybierz Dalej .
- Podaj hasło, gdy zostaniesz o to poproszony. Wybierz Dalej .
- Nazwij i zapisz certyfikat, gdy zostaniesz o to poproszony. Na przykład
CMK_Auto1.pfx
. - Użyj przycisku Dalej i Zakończ przyciski, aby ukończyć kreatora.
Instalowanie certyfikatów w systemie Linux
Przenieś wyeksportowane certyfikaty na komputer z systemem Linux, z którego chcesz uzyskać dostęp do kolumn Always Encrypted:
- Skopiuj certyfikat, który właśnie wyeksportowałeś do
~/ssl/private
na komputerze z systemem Linux lub UNIX, na którym zainstalowano sterownik ODBC programu SQL Server.~
to katalog domowy użytkownika, który będzie uruchamiał aplikację łączącą się z SQL Server za pomocą sterownika Easysoft ODBC.~/ssl/private
to lokalizacja, z której warstwa OpenSSL wbudowana w sterownik będzie próbowała załadować certyfikat osobisty. Utwórz katalog, jeśli nie istnieje. Na przykład:$ mkdir -p ~/ssl/private $ cd ~/ssl/private $ mv /tmp/CMK_Auto1.pfx .
- Aby użyć certyfikatu ze sterownikiem ODBC programu SQL Server, należy usunąć zawarte w nim hasło. Aby to zrobić, na komputerze musi być zainstalowany OpenSSL. (Jest to konieczne tylko do usunięcia hasła, w przypadku innych operacji sterownik ODBC programu SQL Server korzysta z wbudowanej warstwy OpenSSL). Usuń hasło za pomocą następujących poleceń. Po wyświetleniu monitu o hasło po drugiej polecenie, naciśnij RETURN bez wprowadzania czegokolwiek. To spowoduje, że hasło będzie puste.
$ openssl pkcs12 -in CMK_Auto1.pfx -nodes -out temp.pem Enter Import Password: ******* MAC verified OK $ openssl pkcs12 -export -in temp.pem -out nopassphrase.p12 Enter Export Password: Verifying - Enter Export Password: $
- Aby załadować certyfikat, sterownik ODBC programu SQL Server używa metainformacji, które otrzymuje z programu SQL Server na temat zaszyfrowanej kolumny. Nazwa certyfikatu, który sterownik otrzymuje od SQL Server, ma postać
my/thumbprint
. Musisz użyć tej konwencji nazewnictwa dla certyfikatu. Użyj OpenSSL, aby wyświetlić odcisk palca certyfikatu, a następnie zmień nazwę certyfikatu w podkatalogu o nazwie my:$ openssl x509 -in temp.pem -fingerprint -noout | tr -d ":" SHA1 Fingerprint=EFC1940E545941D6C05C763361403F55A5DEF0E8 $ mkdir my $ cp nopassphrase.p12 my/EFC1940E545941D6C05C763361403F55A5DEF0E8 $ ln -s my My
Uwaga Podczas testów zauważyliśmy, że SQL Server czasami nazywał certyfikat
My/thumbprint
. Dowiązanie symboliczne w powyższym przykładzie działa wokół tej niespójności.
Instalowanie sterownika ODBC serwera SQL
Sterownik ODBC SQL Server zapewnia nie tylko warstwę łączności między aplikacją a SQL Server, ale także obsługuje szyfrowanie/deszyfrowanie danych przechowywanych w kolumnach Always Encrypted.
Zainstaluj i uzyskaj licencję na sterownik ODBC programu SQL Server. Aby uzyskać instrukcje, jak to zrobić, zapoznaj się z dokumentacją sterownika ODBC programu SQL Server. Jeśli aplikacja jest 64-bitowa, pobierz 64-bitową wersję sterownika ODBC. W przeciwnym razie użyj 32-bitowej wersji sterownika, niezależnie od architektury systemu operacyjnego.
Źródło danych ODBC zawiera informacje o parametrach połączenia, które umożliwiają sterownikowi ODBC programu SQL Server nawiązanie połączenia z docelową instancją programu SQL Server. Na naszym komputerze źródła danych ODBC są przechowywane w /etc/odbc.ini
. Ten wyciąg ze źródła danych pokazuje odpowiednie ustawienia dla kolumn Always Encrypted:
[SQLSERVER_2016] Driver=Easysoft ODBC-SQL Server SSL # Must use SSL version of driver Server=machine\sqlserver_instance Database=database_with_always_encrypted_data User=user # This can be a Windows or SQL Server login. Password=password Trusted_Connection=Yes # Set this to No for a SQL Server login ColumnEncryption=Enabled # To view Always Encrypted data or to # insert into an Always Encrypted column set to Enabled
Uwaga Jeśli połączenie nie powiedzie się z powodu błędu „Połączenie SSL nie powiodło się w wywołaniu syscall”, w systemie brakuje „urządzenia losowego”. Zobacz Entropy
w instrukcji sterownika ODBC serwera SQL Server, aby uzyskać informacje o tym, co z tym zrobić.
Wstawianie danych do zawsze zaszyfrowanej kolumny
Utworzyliśmy teraz pustą tabelę z kolumnami Always Encrypted i skonfigurowaliśmy nasz komputer kliencki z systemem Linux tak, aby sterownik ODBC programu SQL Server mógł pracować z zawsze szyfrowanymi danymi. Następnie musimy wypełnić tabelę danymi.
Aby wstawić dane do kolumny Always Encrypted, aplikacja musi:
- Użyj sparametryzowanej wstawki, tj. INSERT INTO EncryptedTable VALUES (?, ?).
Umożliwia to sterownikowi ODBC SQL Server rozróżnianie między wartościami kolumn (które muszą być zaszyfrowane) a tekstem instrukcji SQL (który musi pozostać w postaci zwykłego tekstu; w przypadku Always Encrypted należy pamiętać, że SQL Server nie wykonuje żadnego deszyfrowania).
- Jasno opisz typ danych parametrów.
SQL Server nie dostarcza niezbędnych informacji o kolumnie Always Encrypted dla sterownika ODBC SQL Server do wykrywania typu danych przy użyciu
SQLDescribeParam
.
Oto przykład Perla, który pokazuje, jak to zrobić:
# Use Perl DBI / DBD:ODBC to insert data into Always Encrypted columns. use strict; use warnings; use DBI; my $data_source = q/dbi:ODBC:SQLSERVER_2016/; my $h = DBI->connect($data_source) or die "Can't connect to $data_source: $DBI::errstr"; $h->{RaiseError} = 1; my $s = $h->prepare(q/insert into EncryptedTable values(?,?)/); my $lastname='Smith'; my $salary=25000; # Set the data type of the target columns. # Cannot use SQLDescribeParam with Always Encrypted columns. $s->bind_param(1, $lastname, DBI::SQL_WVARCHAR); $s->bind_param(2, $salary, DBI::SQL_INTEGER); $s->execute($lastname,$salary); $h->disconnect;
Oto przykład w języku C, który pokazuje, jak to zrobić:
#include <stdio.h> #include <stdlib.h> #include <sql.h> #include <sqlucode.h> #include <sqlext.h> #include <string.h> #include <wchar.h> #define LASTNAME_LEN 6 SQLHENV henv = SQL_NULL_HENV; // Environment SQLHDBC hdbc = SQL_NULL_HDBC; // Connection handle SQLHSTMT hstmt = SQL_NULL_HSTMT; // Statement handle SQLRETURN retcode; SQLCHAR strLastName[]="Jones"; SQLINTEGER pSalary=25000; SQLLEN lenLastName=0; int main () { // Allocate environment retcode = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv); // Set ODBC Version retcode = SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (SQLPOINTER*)SQL_OV_ODBC3, 0); // Allocate Connection retcode = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc); // Connect to DSN retcode = SQLConnect(hdbc, (SQLCHAR*) "MyDSN", SQL_NTS, (SQLCHAR*) NULL, 0, NULL, 0); // Allocate Statement Handle retcode = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt); // Bind Parameters to all fields 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, &pSalary, 0, NULL); retcode = SQLPrepare(hstmt, (SQLCHAR*)"INSERT INTO [dbo].[EncryptedTable] ([LastName],[Salary]) VALUES (?,?)", SQL_NTS); lenLastName=strlen((char*)strLastName); retcode = SQLExecute(hstmt); exit: printf ("\nComplete.\n"); // Free handles // Statement if (hstmt != SQL_NULL_HSTMT) SQLFreeHandle(SQL_HANDLE_STMT, hstmt); // Connection if (hdbc != SQL_NULL_HDBC) { SQLDisconnect(hdbc); SQLFreeHandle(SQL_HANDLE_DBC, hdbc); } // Environment if (henv != SQL_NULL_HENV) SQLFreeHandle(SQL_HANDLE_ENV, henv); return 0; }
Teraz kolumny są zapełnione, możemy użyć isql do pobrania danych:
$ /usr/local/easysoft/unixODBC/bin/isql.sh -v SQLSERVER_2016 SQL> select * from EncryptedTable +----+----------+------------+ | ID | LastName | Salary | +----+----------+------------+ | 1 | Smith | 25000 | +----+----------+------------+
W naszym źródle danych było włączone logowanie sterowników. Poniższy wyciąg z dziennika kierowcy pokazuje, że:
- SQL Server dostarcza nazwę certyfikatu jako metainformację o kolumnie.
- Dane kolumny są szyfrowane na końcu programu SQL Server i dlatego pozostają zaszyfrowane podczas przesyłania. Sterownik ODBC SQL Server na kliencie odszyfrowuje wartości kolumn, a następnie zwraca je w postaci zwykłego tekstu do aplikacji.
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. B.2.C.6.E.B.F.C. 2.5.3.D.B.C.1.2. 2.8.5.B.6.A.D.9. 4.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: Encrypted column .);...'A..zs..I. .N.]r..p.-..$... .S;.].km6.....3c r.OhR..j*.....fj ....ARN{V.F..... DETAIL: EVP_DecryptInit returns 1 DETAIL: EVP_DecryptUpdate returns 1, 0 DETAIL: EVP_DecryptUpdate returns 1, 16 DETAIL: EVP_DecryptFinal returns 1, 0 PKTDUMP: data S.m.i.t.h.
Zobacz też
- Korzystanie z danych chronionych za pomocą Azure Key Vault z systemu Linux
- Korzystanie z danych chronionych za pomocą niestandardowego magazynu kluczy z systemu Linux