SQL Server 2016 bevat een databasebeveiligingsfunctie genaamd Always Encrypted. Omdat we Always Encrypted-ondersteuning hebben toegevoegd aan de SQL Server ODBC-driver, kunnen onze klanten profiteren van deze functie.
Always Encrypted beschermt SQL Server-gegevens op het punt waarop ze het meest vatbaar zijn voor aanvallen:wanneer die gegevens worden gebruikt. Bijvoorbeeld tijdens transacties en berekeningen. Dit verschilt van bestaande SQL Server-coderingsfuncties, omdat ze vereisen dat gegevens worden gedecodeerd voordat er bewerkingen op kunnen worden uitgevoerd.
De coderingssleutel die Always Encrypted-kolommen beschermt, wordt opgeslagen op de toepassingscomputer. Dit betekent dat SQL Server de Always Encrypted-gegevens niet kan ontsleutelen. Als de SQL Server-machine is gecompromitteerd, heeft de aanvaller alleen toegang tot Always Encrypted-gegevens in gecodeerde vorm.
Voor de meeste gebruikers zal de Always Encrypted-functie transparant zijn, d.w.z. ze zijn geïsoleerd van de werking van Always Encrypted en hoeven niet te veranderen wat ze doen om van de functie te profiteren.
Aan het einde van de toepassing wordt de codering uitgevoerd door het softwarestuurprogramma dat de clientinterface voor SQL Server biedt. Op Linux en UNIX is dit een ODBC-stuurprogramma dat gegevens transparant codeert of decodeert, afhankelijk van de reisrichting. In het geval van het Easysoft-stuurprogramma wordt Always Encrypted ingeschakeld door een verbindingsreeksparameter in te stellen.
Omdat mensen zich steeds meer zorgen maken dat hun gegevens veilig zijn in de cloud, zal Always Encrypted beschikbaar zijn in Azure SQL, de cloudgebaseerde pay-as-you-go-versie van SQL Server. De ODBC-driver van Easysoft voor Azure SQL ondersteunt daarom ook Always Encrypted.
Walkthrough:werken met Always Encrypted-kolomgegevens op Linux
Met de SQL Server ODBC-driver van Easysoft kunt u gegevens in Always Encrypted-kolommen bijwerken en opvragen.
Maak de tabel en genereer de versleutelingssleutels
Deze stappen worden uitgevoerd op de SQL Server-machine.
- Maak in SQL Server Management Studio 2016 CTP3 of hoger een nieuwe database.
- Maak in de nieuwe database een tabel die een of meer kolommen bevat waarvan u de inhoud wilt versleutelen. Bijvoorbeeld:
CREATE TABLE dbo.EncryptedTable ( ID INT IDENTITY(1,1) PRIMARY KEY, LastName NVARCHAR(32), Salary INT NOT NULL );
- Klik met de rechtermuisknop op de database. Kies in het pop-upmenu Taken> Kolommen versleutelen .
De Wizard Altijd versleuteld wordt gestart.
- Op de Kolomselectie pagina, vouw de tabellen uit en selecteer de kolommen die u wilt versleutelen.
- Kies een coderingstype voor elke kolom.
Deterministisch - versleutelt altijd naar dezelfde gecodeerde tekst, waardoor gelijkheidszoekacties, samenvoegingen en groeperen op kunnen worden uitgevoerd.
Gerandomiseerd genereert een andere cijfertekstwaarde voor dezelfde platte tekst, wat veiliger is, maar geen bewerkingen ondersteunt.
- Kies
CEK_Auto1 (New)
als de coderingssleutel voor elke kolom, wat een nieuwe automatisch gegenereerde sleutel is. Kies Volgende . - Accepteer de standaardinstellingen op de hoofdsleutelconfiguratiepagina:
Veld Waarde Selecteer kolomhoofdsleutel Automatisch kolomhoofdsleutel genereren Selecteer de leverancier van de sleutelwinkel Windows-certificaatarchief Selecteer kolomhoofdsleutel Huidige gebruiker - Gebruik de Volgende knop om door te gaan naar de Samenvatting bladzijde. Kies Voltooien .
- Wacht tot de wizard is voltooid en kies vervolgens Sluiten .
De certificaten exporteren
Om de certificaten over te zetten naar de Linux-machine, moet u ze eerst naar Windows exporteren.
- Typ in een opdrachtpromptvenster
certmgr
, om de module Certificaten te starten. - Het nieuwe Always Encrypted-certificaat is beschikbaar onder Certificaten - Huidige gebruiker> Persoonlijk> Certificaten .
- Klik met de rechtermuisknop op het certificaat (dat zoiets als
Always Encrypted Auto Certificate1
zal heten) ). Kies in het pop-upmenu Alle taken> Exporteren .De wizard Certificaat exporteren wordt gestart. Kies Volgende .
- Kies Ja, exporteer de privésleutel .
- Accepteer de standaardinstellingen op de pagina Bestandsindeling exporteren. Kies Volgende .
- Geef een wachtwoord op wanneer daarom wordt gevraagd. Kies Volgende .
- Geef het certificaat een naam en sla het op wanneer daarom wordt gevraagd. Bijvoorbeeld
CMK_Auto1.pfx
. - Gebruik de Volgende en Voltooien knoppen om de wizard te voltooien.
De certificaten installeren op Linux
Breng de geëxporteerde certificaten over naar de Linux-machine van waaruit u toegang wilt krijgen tot de Always Encrypted-kolommen:
- Kopieer het certificaat dat u zojuist hebt geëxporteerd naar
~/ssl/private
op de Linux- of UNIX-computer waarop u het SQL Server ODBC-stuurprogramma hebt geïnstalleerd.~
is de homedirectory van de gebruiker die de applicatie zal uitvoeren die verbinding maakt met SQL Server via het Easysoft ODBC-stuurprogramma.~/ssl/private
is de locatie waar de OpenSSL-laag die in het stuurprogramma is ingebouwd, zal proberen een persoonlijk certificaat te laden. Maak de map aan als deze niet bestaat. Bijvoorbeeld:$ mkdir -p ~/ssl/private $ cd ~/ssl/private $ mv /tmp/CMK_Auto1.pfx .
- Als u het certificaat wilt gebruiken met het SQL Server ODBC-stuurprogramma, moet u de wachtwoordzin die het bevat, verwijderen. Hiervoor moet OpenSSL op de machine zijn geïnstalleerd. (Dit is alleen nodig om de wachtwoordzin te verwijderen, voor andere bewerkingen gebruikt het SQL Server ODBC-stuurprogramma een ingebouwde OpenSSL-laag.) Verwijder de wachtwoordzin met de volgende opdrachten. Wanneer na de seconde . om de wachtwoordzin wordt gevraagd commando, druk op RETURN zonder iets in te voeren. Hiermee wordt de wachtwoordzin op niets ingesteld.
$ 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: $
- Om het certificaat te laden, gebruikt het SQL Server ODBC-stuurprogramma meta-informatie die het van SQL Server ontvangt over de versleutelde kolom. De certificaatnaam die het stuurprogramma van SQL Server ontvangt, heeft de vorm
my/thumbprint
. U moet deze naamgevingsconventie gebruiken voor het certificaat. Gebruik OpenSSL om de vingerafdruk van het certificaat weer te geven en wijzig de naam van het certificaat in een submap met de naam my:$ openssl x509 -in temp.pem -fingerprint -noout | tr -d ":" SHA1 Fingerprint=EFC1940E545941D6C05C763361403F55A5DEF0E8 $ mkdir my $ cp nopassphrase.p12 my/EFC1940E545941D6C05C763361403F55A5DEF0E8 $ ln -s my My
Opmerking Tijdens het testen merkten we dat SQL Server soms het certificaat
My/thumbprint
. De symbolische link in het bovenstaande voorbeeld werkt om deze inconsistentie heen.
Het SQL Server ODBC-stuurprogramma installeren
Het SQL Server ODBC-stuurprogramma biedt niet alleen de verbindingslaag tussen de toepassing en SQL Server, het zorgt ook voor de versleuteling/ontsleuteling van gegevens die zijn opgeslagen in Always Encrypted-kolommen.
Installeer en licentieer het SQL Server ODBC-stuurprogramma. Raadpleeg de documentatie van het SQL Server ODBC-stuurprogramma voor instructies over hoe u dit doet. Als uw toepassing 64-bits is, downloadt u de 64-bits versie van het ODBC-stuurprogramma. Gebruik anders de 32-bits versie van het stuurprogramma, ongeacht de architectuur van het besturingssysteem.
Een ODBC-gegevensbron bevat de verbindingsreeksinformatie waarmee het SQL Server ODBC-stuurprogramma verbinding kan maken met het doel-SQL Server-exemplaar. Op onze computer worden ODBC-gegevensbronnen opgeslagen in /etc/odbc.ini
. Dit uittreksel van de gegevensbron toont de relevante instellingen voor Always Encrypted-kolommen:
[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
Opmerking Als uw verbinding mislukt met de foutmelding "SSL-verbinding mislukt in syscall", mist uw systeem een "randomness device". Zie de Entropy
attribuut in de handleiding van het SQL Server ODBC-stuurprogramma voor informatie over wat u hieraan kunt doen.
Gegevens invoegen in een altijd versleutelde kolom
We hebben nu een lege tabel gemaakt met Always Encrypted-kolommen en onze Linux-clientcomputer zo ingesteld dat de SQL Server ODBC-driver kan werken met Always Encrypted Data. Vervolgens moeten we de tabel vullen met gegevens.
Om gegevens in een Always Encrypted-kolom in te voegen, moet een toepassing:
- Gebruik een invoer met parameters, d.w.z. INSERT INTO EncryptedTable VALUES (?, ?).
Hierdoor kan het SQL Server ODBC-stuurprogramma onderscheid maken tussen de kolomwaarden (die het moet coderen) en de SQL-instructietekst (die in platte tekst moet blijven; met Always Encrypted onthoud dat SQL Server geen decodering uitvoert).
- Beschrijf expliciet het gegevenstype van de parameters.
SQL Server levert niet de benodigde informatie over een Always Encrypted-kolom voor het SQL Server ODBC-stuurprogramma om het gegevenstype te ontdekken met behulp van
SQLDescribeParam
.
Hier is een Perl-voorbeeld dat laat zien hoe u dit moet doen:
# 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;
Hier is een C-voorbeeld dat laat zien hoe u dit moet doen:
#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; }
Nu de kolommen gevuld zijn, kunnen we isql gebruiken om de gegevens op te halen:
$ /usr/local/easysoft/unixODBC/bin/isql.sh -v SQLSERVER_2016 SQL> select * from EncryptedTable +----+----------+------------+ | ID | LastName | Salary | +----+----------+------------+ | 1 | Smith | 25000 | +----+----------+------------+
We hadden stuurprogrammaregistratie ingeschakeld in onze gegevensbron. Het volgende uittreksel uit het chauffeurslogboek laat zien dat:
- SQL Server levert de certificaatnaam als meta-informatie over de kolom.
- De kolomgegevens worden versleuteld aan het SQL Server-einde en blijven daarom versleuteld tijdens het transport. Het SQL Server ODBC-stuurprogramma op de client decodeert de kolomwaarden en stuurt ze vervolgens in platte tekst terug naar de toepassing.
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.
Zie ook
- Gegevens gebruiken die zijn beveiligd met een Azure Key Vault van Linux
- Gegevens gebruiken die zijn beveiligd met een aangepaste sleutelopslag van Linux