sql >> Database >  >> RDS >> Sqlserver

SQL Server 2016:altijd versleuteld

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.

  1. Maak in SQL Server Management Studio 2016 CTP3 of hoger een nieuwe database.
  2. 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
    );
    
  3. Klik met de rechtermuisknop op de database. Kies in het pop-upmenu Taken> Kolommen versleutelen .

    De Wizard Altijd versleuteld wordt gestart.

  4. Op de Kolomselectie pagina, vouw de tabellen uit en selecteer de kolommen die u wilt versleutelen.
  5. 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.

  6. Kies CEK_Auto1 (New) als de coderingssleutel voor elke kolom, wat een nieuwe automatisch gegenereerde sleutel is. Kies Volgende .
  7. 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
  8. Gebruik de Volgende knop om door te gaan naar de Samenvatting bladzijde. Kies Voltooien .
  9. 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.

  1. Typ in een opdrachtpromptvenster certmgr , om de module Certificaten te starten.
  2. Het nieuwe Always Encrypted-certificaat is beschikbaar onder Certificaten - Huidige gebruiker> Persoonlijk> Certificaten .
  3. 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 .

  4. Kies Ja, exporteer de privésleutel .
  5. Accepteer de standaardinstellingen op de pagina Bestandsindeling exporteren. Kies Volgende .
  6. Geef een wachtwoord op wanneer daarom wordt gevraagd. Kies Volgende .
  7. Geef het certificaat een naam en sla het op wanneer daarom wordt gevraagd. Bijvoorbeeld CMK_Auto1.pfx .
  8. 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:

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

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

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

  1. SQL Server levert de certificaatnaam als meta-informatie over de kolom.
  2. 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

  1. Automatisch databasediagram genereren MySQL

  2. Walkthrough:SQL Server High Availability instellen

  3. Hoe LOG() werkt in MariaDB

  4. SQL Server Rebuild Index Query