sql >> Database teknologi >  >> RDS >> Sqlserver

SQL Server 2016:Altid krypteret

SQL Server 2016 indeholder en databasesikkerhedsfunktion kaldet Always Encrypted. Da vi har tilføjet Always Encrypted support til SQL Server ODBC driveren, vil vores kunder kunne drage fordel af denne funktion.

Altid krypteret beskytter SQL Server-data på det punkt, hvor de er mest modtagelige for angreb:når disse data bliver brugt. For eksempel under transaktioner og beregninger. Dette adskiller sig fra eksisterende SQL Server-krypteringsfunktioner, da de kræver, at data dekrypteres, før der kan udføres operationer på dem.

Krypteringsnøglen, der beskytter Always Encrypted-kolonner, gemmes på applikationsmaskinen. Dette betyder, at SQL Server ikke kan dekryptere de Altid krypterede data. Hvis SQL Server-maskinen er kompromitteret, vil angriberen kun være i stand til at få adgang til Altid krypterede data i krypteringsform.

For de fleste brugere vil Always Encrypted-funktionen være gennemsigtig, dvs. de er isoleret fra Always Encrypteds funktion og behøver ikke at ændre, hvad de gør for at drage fordel af funktionen.

I applikationsslutningen udføres krypteringen af ​​softwaredriveren, der leverer klientgrænsefladen til SQL Server. På Linux og UNIX er dette en ODBC-driver, som gennemsigtigt krypterer eller dekrypterer data afhængigt af kørselsretningen. I tilfælde af Easysoft-driveren aktiveres Always Encrypted ved at indstille en forbindelsesstrengparameter.

Da folk i stigende grad er bekymrede for, at deres data er sikre i skyen, vil Always Encrypted være tilgængelig i Azure SQL, den skybaserede pay-as-you-go-version af SQL Server. Easysofts ODBC-driver til Azure SQL vil derfor også understøtte Always Encrypted.

Gennemgang:Arbejde med altid krypterede kolonnedata på Linux

Easysofts SQL Server ODBC-driver gør dig i stand til at opdatere og forespørge på data, der opbevares i Always Encrypted-kolonner.

Opret tabellen og generer krypteringsnøglerne

Disse trin udføres på SQL Server-maskinen.

  1. Opret en ny database i SQL Server Management Studio 2016 CTP3 eller nyere.
  2. I den nye database skal du oprette en tabel, der indeholder en eller flere kolonner, hvis indhold du vil kryptere. For eksempel:
    CREATE TABLE dbo.EncryptedTable( ID INT IDENTITY(1,1) PRIMARY KEY, Efternavn NVARCHAR(32), Løn INT IKKE NULL);
  3. Højreklik på databasen. Fra pop op-menuen skal du vælge Opgaver> Krypter kolonner .

    Always Encrypted Wizard starter.

  4. Kolonnevalg side, udvid tabellerne, og vælg de kolonner, du vil kryptere.
  5. Vælg en krypteringstype for hver kolonne.

    Deterministisk - krypterer altid til den samme krypteringstekst, hvilket gør det muligt at udføre lighedsopslag, joinforbindelser og grupper efter.

    Randomiseret genererer en anden krypteringstekstværdi for den samme almindelige tekst, som er mere sikker, men som ikke understøtter nogen handlinger.

  6. Vælg CEK_Auto1 (New) som krypteringsnøgle for hver kolonne, som er en ny autogenereret nøgle. Vælg Næste .
  7. Accepter standardindstillingerne på hovednøglekonfigurationssiden:
    Felt Værdi
    Vælg kolonnehovednøgle Generer automatisk kolonnehovednøgle
    Vælg nøglelagerudbyderen Windows-certifikatlager
    Vælg kolonnehovednøgle Nuværende bruger
  8. Brug Næste knappen for at fortsætte til Oversigt side. Vælg Udfør .
  9. Vent på, at guiden er færdig, og vælg derefter Luk .

Eksport af certifikaterne

For at overføre certifikaterne til Linux-maskinen skal du først eksportere dem til Windows.

  1. Indtast certmgr i et kommandopromptvindue , for at starte snap-in'en Certifikater.
  2. Det nye Altid krypterede certifikat vil være tilgængeligt under Certifikater - Nuværende bruger> Personligt> Certifikater .
  3. Højreklik på certifikatet (som vil blive kaldt noget i stil med Always Encrypted Auto Certificate1 ). Fra pop op-menuen skal du vælge Alle opgaver> Eksporter .

    Guiden Certifikateksport starter. Vælg Næste .

  4. Vælg Ja, eksporter den private nøgle .
  5. Accepter standardindstillingerne på siden Eksporter filformat. Vælg Næste .
  6. Skriv en adgangskode, når du bliver bedt om det. Vælg Næste .
  7. Navngiv og gem certifikatet, når du bliver bedt om det. For eksempel CMK_Auto1.pfx .
  8. Brug Næste og Afslut knapper for at fuldføre guiden.

Installation af certifikaterne på Linux

Overfør de eksporterede certifikater til den Linux-maskine, hvorfra du vil have adgang til Always Encrypted-kolonnerne:

  1. Kopiér det certifikat, du lige har eksporteret til ~/ssl/private på den Linux- eller UNIX-maskine, hvor du har installeret SQL Server ODBC-driveren.

    ~ er hjemmebiblioteket for den bruger, der skal køre programmet, der opretter forbindelse til SQL Server via Easysoft ODBC-driveren. ~/ssl/private er det sted, hvor OpenSSL-laget indbygget i driveren vil forsøge at indlæse et personligt certifikat fra. Opret mappen, hvis den ikke findes. For eksempel:

    $ mkdir -p ~/ssl/private$ cd ~/ssl/private$ mv /tmp/CMK_Auto1.pfx .
  2. For at bruge certifikatet med SQL Server ODBC-driveren skal du fjerne den adgangssætning, den indeholder. For at gøre dette skal OpenSSL være installeret på maskinen. (Dette er kun nødvendigt for at fjerne adgangssætningen, til andre operationer bruger SQL Server ODBC-driveren et indbygget OpenSSL-lag.) Fjern adgangssætningen med følgende kommandoer. Når du bliver bedt om adgangssætningen efter anden kommando, tryk på RETURN uden at indtaste noget. Dette vil sætte adgangssætningen til ingenting.
    $ openssl pkcs12 -in CMK_Auto1.pfx -nodes -out temp.pemEnter Import Password:*******MAC verificeret OK$ openssl pkcs12 -export -in temp.pem -out nopassphrase.p12Enter Export Password:Bekræfter - Indtast eksportkodeord:$
  3. For at indlæse certifikatet bruger SQL Server ODBC-driveren metaoplysninger, den modtager fra SQL Server om den krypterede kolonne. Certifikatnavnet, som driveren modtager fra SQL Server, er i formen my/thumbprint . Du skal bruge denne navnekonvention til certifikatet. Brug OpenSSL til at vise certifikatets tommelfingeraftryk og omdøb derefter certifikatet i en undermappe ved navn my:
    $ openssl x509 -in temp.pem -fingerprint -noout | tr -d ":"SHA1 Fingerprint=EFC1940E545941D6C05C763361403F55A5DEF0E8$ mkdir my$ cp nopassphrase.p12 my/EFC1940E545941D6C05C7633561$ mypress 

    Bemærk Under testen har vi bemærket, at SQL Server nogle gange navngav certifikatet My/thumbprint . Det symbolske link i ovenstående eksempel fungerer uden om denne inkonsekvens.

Installation af SQL Server ODBC-driveren

SQL Server ODBC-driveren leverer ikke kun forbindelseslaget mellem applikationen og SQL Server, den håndterer også kryptering/dekryptering af data gemt i Always Encrypted-kolonner.

Installer og licenser SQL Server ODBC-driveren. For instruktioner om, hvordan du gør dette, henvises til SQL Server ODBC-driverdokumentationen. Hvis dit program er 64-bit, skal du downloade 64-bit-versionen af ​​ODBC-driveren. Ellers skal du bruge 32-bit versionen af ​​driveren, uanset operativsystemets arkitektur.

En ODBC-datakilde indeholder forbindelsesstrengoplysningerne, der gør det muligt for SQL Server ODBC-driveren at oprette forbindelse til SQL Server-målforekomsten. På vores maskine er ODBC-datakilder gemt i /etc/odbc.ini . Dette datakildeudtræk viser de relevante indstillinger for Altid krypterede kolonner:

[SQLSERVER_2016]Driver=Easysoft ODBC-SQL-server SSL # Skal bruge SSL-version af driverServer=machine\sqlserver_instanceDatabase=database_with_always_encrypted_dataUser=bruger # Dette kan være et Windows- eller SQL Server-login.Password=passwordTrusted_Connection=Ja # Indstil dette til Nej for en SQL Server loginColumnEncryption=Altid aktiveret #Krypteret data til # indsæt i en Altid krypteret kolonne sat til Aktiveret

Bemærk Hvis din forbindelse fejler med fejlen "SSL-forbindelse mislykkedes i syscall", mangler dit system en "tilfældig enhed". Se Entropy attribut i SQL Server ODBC-drivermanualen for at få oplysninger om, hvad du skal gøre ved dette.

Indsættelse af data i en altid krypteret kolonne

Vi har nu lavet en tom tabel med Always Encrypted-kolonner og sat vores Linux-klientmaskine op, så SQL Server ODBC-driveren kan arbejde med Always Encrypted Data. Dernæst skal vi udfylde tabellen med data.

For at indsætte data i en Altid krypteret kolonne skal en applikation:

  1. Brug en parametriseret indsættelse, dvs. INSERT INTO EncryptedTable VALUES (?, ?).

    Dette gør det muligt for SQL Server ODBC-driveren at skelne mellem kolonneværdierne (som den skal kryptere) og SQL-sætningsteksten (som skal forblive i almindelig tekst; med Always Encrypted, husk, at SQL Server ikke dekrypterer).

  2. Beskriv eksplicit datatypen for parametrene.

    SQL Server leverer ikke de nødvendige oplysninger om en Always Encrypted-kolonne til SQL Server ODBC-driver til at finde datatypen ved at bruge SQLDescribeParam .

Her er en Perl-eksempel, der viser, hvordan du gør dette:

# Brug Perl DBI / DBD:ODBC til at indsætte data i Always Encrypted columns.use strict;use warnings;use DBI;my $data_source =q/dbi:ODBC:SQLSERVER_2016/;my $h =DBI->connect( $data_source) eller "Kan ikke oprette forbindelse til $data_source:$DBI::errstr";$h->{RaiseError} =1;my $s =$h->prepare(q/insert into EncryptedTable values(?, ?)/);my $lastname='Smith';my $salary=25000;# Indstil datatypen for målkolonnerne.# Kan ikke bruge SQLDescribeParam med 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;

Her er en C-eksempel, der viser, hvordan du gør dette:

#include #include #include #include #include #include #include #define LASTNAME_LEN 6SQLHENV henv =SQL_NULL_HENV; // EnvironmentSQLHDBC hdbc =SQL_NULL_HDBC; // ForbindelseshåndtagSQLHSTMT hstmt =SQL_NULL_HSTMT; // Statement handleSQLRETURN retcode;SQLCHAR strLastName[]="Jones";SQLINTEGER pSalary=25000;SQLLEN lenLastName=0;int main () { // Allocate environment retcode =SQLAllocHandle(SQL_HANDLE_ENV, SQL, &henv_HANDLE); // Indstil ODBC Version retcode =SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (SQLPOINTER*)SQL_OV_ODBC3, 0); // Allocate Connection retcode =SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc); // Opret forbindelse til DSN retcode =SQLConnect(hdbc, (SQLCHAR*) "MyDSN", SQL_NTS, (SQLCHAR*) NULL, 0, NULL, 0); // Allocate Statement Handle retcode =SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt); // Bind parametre til alle felter 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, &pLøn, 0, NULL); retcode =SQLPrepare(hstmt, (SQLCHAR*)"INSERT INTO [dbo].[EncryptedTable] ([Efternavn],[Løn]) VALUES (?,?)", SQL_NTS); lenLastName=strlen((char*)strEfternavn); retcode =SQLExecute(hstmt);exit:printf ("\nComplete.\n"); // Frie håndtag // Statement if (hstmt !=SQL_NULL_HSTMT) SQLFreeHandle(SQL_HANDLE_STMT, hstmt); // Forbindelse if (hdbc !=SQL_NULL_HDBC) { SQLDisconnect(hdbc); SQLFreeHandle(SQL_HANDLE_DBC, hdbc); } // Miljø if (henv !=SQL_NULL_HENV) SQLFreeHandle(SQL_HANDLE_ENV, henv); returner 0;} 

Nu er kolonnerne udfyldt, vi kan bruge isql til at hente dataene:

$ /usr/local/easysoft/unixODBC/bin/isql.sh -v SQLSERVER_2016SQL> vælg * fra EncryptedTable+----+----------+-------- ----+| ID | Efternavn | Løn |+----+-----------+-------+| 1 | Smith | 25000 |+----+---------------+

Vi havde aktiveret driverlogning i vores datakilde. Følgende uddrag fra driverloggen viser, at:

  1. SQL Server leverer certifikatnavnet som metainformation om kolonnen.
  2. Kolonnedataene er krypteret i SQL Server-enden og forbliver derfor krypteret under overførsel. SQL Server ODBC-driveren på klienten dekrypterer kolonneværdierne og returnerer dem derefter i almindelig tekst til applikationen.
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.B.B.4.C.2.C.B.B.6 .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:Krypteret kolonne.);...'A..zs..I..N.]r..p.-..$....S;.].km6.....3cr.OhR ..j*.....fj....ARN{V.F.....DETAIL:EVP_DecryptInit returnerer 1DETAIL:EVP_DecryptUpdate returnerer 1, 0DETAIL:EVP_DecryptUpdate returnerer 1, 16DETAIL:EVP_DecryptFinal returnerer 1, 0PKTDUMP:dataS.h. 

Se også

  • Brug af data beskyttet med en Azure Key Vault fra Linux
  • Brug af data beskyttet med et tilpasset nøglelager fra Linux

  1. Sammenlign to rækker og identificer kolonner, hvis værdier er forskellige

  2. Gør det nemmere at administrere en PostgreSQL-produktionsdatabase

  3. PDO mysql:Sådan ved du, om indsættelsen lykkedes

  4. SQL LIKE betingelse for at kontrollere for heltal?