Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

SQL Server 2016:zawsze szyfrowany

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.

  1. W SQL Server Management Studio 2016 CTP3 lub nowszym utwórz nową bazę danych.
  2. 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
    );
    
  3. Kliknij prawym przyciskiem myszy bazę danych. Z wyskakującego menu wybierz Zadania> Szyfruj kolumny .

    Uruchomi się Kreator Always Encrypted.

  4. W Wybraniu kolumny stronę, rozwiń tabele i wybierz kolumny, które chcesz zaszyfrować.
  5. 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.

  6. Wybierz CEK_Auto1 (New) jako klucz szyfrowania dla każdej kolumny, który jest nowym kluczem wygenerowanym automatycznie. Wybierz Dalej .
  7. 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
  8. Użyj przycisku Dalej przycisk, aby przejść do Podsumowania strona. Wybierz Zakończ .
  9. 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.

  1. W oknie wiersza poleceń wpisz certmgr , aby uruchomić przystawkę Certyfikaty.
  2. Nowy certyfikat Always Encrypted będzie dostępny w sekcji Certyfikaty — bieżący użytkownik> Osobiste> Certyfikaty .
  3. 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 .

  4. Wybierz Tak, wyeksportuj klucz prywatny .
  5. Zaakceptuj ustawienia domyślne na stronie Format pliku eksportu. Wybierz Dalej .
  6. Podaj hasło, gdy zostaniesz o to poproszony. Wybierz Dalej .
  7. Nazwij i zapisz certyfikat, gdy zostaniesz o to poproszony. Na przykład CMK_Auto1.pfx .
  8. 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:

  1. 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 .
    
  2. 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:
    $
    
  3. 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:

  1. 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).

  2. 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:

  1. SQL Server dostarcza nazwę certyfikatu jako metainformację o kolumnie.
  2. 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

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SPRAWDŹ Ograniczenia w SQL Server

  2. pobierz ciąg rozdzielany przecinkami z wierszy

  3. Wzorzec projektowy dla pól niestandardowych w relacyjnej bazie danych

  4. Jak wyświetlić historię zapytań w SQL Server Management Studio

  5. Sortowanie losowe serwera SQL