SQL Server 2016 obsahuje funkci zabezpečení databáze s názvem Always Encrypted. Protože jsme do ovladače SQL Server ODBC přidali podporu Always Encrypted, naši zákazníci budou moci tuto funkci využívat.
Always Encrypted chrání data SQL Server v bodě, ve kterém jsou nejvíce náchylná k útoku:když jsou tato data používána. Například při transakcích a výpočtech. To se liší od stávajících funkcí šifrování SQL Serveru, protože vyžadují dešifrování dat, než na nich lze provádět operace.
Šifrovací klíč, který chrání sloupce Always Encrypted, je uložen na aplikačním počítači. To znamená, že SQL Server nemůže dešifrovat data Always Encrypted. Pokud je počítač SQL Server kompromitován, útočník bude mít přístup pouze k vždy šifrovaným datům ve formě šifry.
Pro většinu uživatelů bude funkce Always Encrypted transparentní, tj. jsou izolováni od fungování Always Encrypted a nemusí měnit, co dělají, aby z této funkce měli prospěch.
Na konci aplikace je šifrování provedeno softwarovým ovladačem, který poskytuje klientské rozhraní pro SQL Server. Na Linuxu a UNIXu se jedná o ovladač ODBC, který transparentně šifruje nebo dešifruje data v závislosti na směru jízdy. V případě ovladače Easysoft je možnost Always Encrypted povolena nastavením parametru připojovacího řetězce.
Protože se lidé stále více obávají, že jejich data jsou v cloudu v bezpečí, Always Encrypted bude k dispozici v Azure SQL, cloudové placené verzi SQL Serveru. Ovladač ODBC společnosti Easysoft pro Azure SQL bude proto také podporovat Always Encrypted.
Návod:Práce s daty sloupce Always Encrypted v systému Linux
Ovladač ODBC pro SQL Server společnosti Easysoft vám umožňuje aktualizovat a dotazovat se na data uložená ve sloupcích Always Encrypted.
Vytvořte tabulku a vygenerujte šifrovací klíče
Tyto kroky se provádějí na počítači SQL Server.
- V SQL Server Management Studio 2016 CTP3 nebo novějším vytvořte novou databázi.
- V nové databázi vytvořte tabulku obsahující jeden nebo více sloupců, jejichž obsah chcete zašifrovat. Například:
CREATE TABLE dbo.EncryptedTable( ID INT IDENTITY(1,1) PRIMÁRNÍ KLÍČ, Příjmení NVARCHAR(32), Plat INT NOT NULL);
- Klikněte pravým tlačítkem na databázi. Z rozbalovací nabídky vyberte Úkoly> Šifrovat sloupce .
Spustí se Průvodce vždy šifrováním.
- Na Výběr sloupce stránku, rozbalte tabulky a vyberte sloupce, které chcete zašifrovat.
- Pro každý sloupec vyberte typ šifrování.
deterministický - vždy zašifruje do stejného šifrovaného textu, což umožňuje provádět vyhledávání rovnosti, spojení a seskupení podle.
Náhodné generuje jinou hodnotu šifrovaného textu pro stejný prostý text, což je bezpečnější, ale nepodporuje žádné operace.
- Vyberte
CEK_Auto1 (New)
jako šifrovací klíč pro každý sloupec, což je nový automaticky generovaný klíč. Zvolte Další . - Na stránce Konfigurace hlavního klíče přijměte výchozí nastavení:
Pole Hodnota Vyberte hlavní klíč sloupce Automaticky generovat hlavní klíč sloupce Vyberte poskytovatele úložiště klíčů Úložiště certifikátů systému Windows Vyberte hlavní klíč sloupce Aktuální uživatel - Použijte tlačítko Další přejděte na Přehled strana. Zvolte Dokončit .
- Počkejte na dokončení průvodce a poté zvolte Zavřít .
Export certifikátů
Chcete-li přenést certifikáty do počítače se systémem Linux, musíte je nejprve exportovat do systému Windows.
- V okně příkazového řádku zadejte
certmgr
, čímž spustíte modul snap-in Certifikáty. - Nový vždy šifrovaný certifikát bude dostupný v části Certifikáty – aktuální uživatel> Osobní> Certifikáty .
- Klikněte pravým tlačítkem na certifikát (který se bude nazývat něco jako
Always Encrypted Auto Certificate1
). Z rozbalovací nabídky zvolte Všechny úkoly> Exportovat .Spustí se Průvodce exportem certifikátu. Zvolte Další .
- Vyberte Ano, exportovat soukromý klíč .
- Přijměte výchozí nastavení na stránce Export File Format. Zvolte Další .
- Po zobrazení výzvy zadejte heslo. Zvolte Další .
- Po zobrazení výzvy certifikát pojmenujte a uložte. Například
CMK_Auto1.pfx
. - Použijte tlačítko Další a Dokončit dokončete průvodce.
Instalace certifikátů v systému Linux
Přeneste exportované certifikáty do počítače se systémem Linux, ze kterého chcete přistupovat ke sloupcům Always Encrypted:
- Zkopírujte certifikát, který jste právě exportovali, do
~/ssl/private
na počítači se systémem Linux nebo UNIX, kde jste nainstalovali ovladač SQL Server ODBC.~
je domovský adresář uživatele, který bude spouštět aplikaci, která se připojuje k serveru SQL prostřednictvím ovladače Easysoft ODBC.~/ssl/private
je umístění, odkud se vrstva OpenSSL zabudovaná v ovladači pokusí načíst osobní certifikát. Vytvořte adresář, pokud neexistuje. Například:$ mkdir -p ~/ssl/private$ cd ~/ssl/private$ mv /tmp/CMK_Auto1.pfx .
- Chcete-li použít certifikát s ovladačem SQL Server ODBC, musíte odebrat přístupovou frázi, kterou obsahuje. Chcete-li to provést, musí být na počítači nainstalováno OpenSSL. (Toto je nutné pouze k odstranění přístupové fráze, pro ostatní operace používá ovladač SQL Server ODBC vestavěnou vrstvu OpenSSL.) Odstraňte přístupovou frázi pomocí následujících příkazů. Až budete vyzváni k zadání přístupové fráze po sekundě stiskněte RETURN, aniž byste cokoli zadávali. Tím nastavíte přístupovou frázi na nic.
$ openssl pkcs12 -in CMK_Auto1.pfx -nodes -out temp.pemZadejte heslo pro import:*******MAC ověřeno OK$ openssl pkcs12 -export -in temp.pem -out nopassphrase.p12Zadejte heslo pro export:Ověření - Zadejte heslo pro export:$
- K načtení certifikátu používá ovladač ODBC serveru SQL Server metainformace o zašifrovaném sloupci, které obdrží od serveru SQL Server. Název certifikátu, který ovladač obdrží ze serveru SQL Server, je ve tvaru
my/thumbprint
. Pro certifikát musíte použít tuto konvenci pojmenování. Pomocí OpenSSL zobrazte miniaturu certifikátu a poté certifikát přejmenujte v podadresáři s názvem my:$ openssl x509 -in temp.pem -fingerprint -noout | tr -d ":"Otisk prstu SHA1=EFC1940E545941D6C05C763361403F55A5DEF0E8$ mkdir my$ cp nopassphrase.p12 my/EFC1940E545941D6C05C763355>A myMEFAn
Poznámka Během testování jsme si všimli, že SQL Server někdy pojmenoval certifikát
My/thumbprint
. Symbolický odkaz ve výše uvedeném příkladu tuto nekonzistenci řeší.
Instalace ovladače SQL Server ODBC Driver
Ovladač SQL Server ODBC neposkytuje pouze vrstvu připojení mezi aplikací a SQL Serverem, ale také zajišťuje šifrování / dešifrování dat uložených ve sloupcích Always Encrypted.
Nainstalujte a licencujte ovladač SQL Server ODBC. Pokyny, jak to provést, naleznete v dokumentaci ovladače SQL Server ODBC. Pokud je vaše aplikace 64bitová, stáhněte si 64bitovou verzi ovladače ODBC. V opačném případě použijte 32bitovou verzi ovladače bez ohledu na architekturu operačního systému.
Zdroj dat ODBC obsahuje informace o připojovacím řetězci, které umožňují ovladači SQL Server ODBC připojit se k cílové instanci SQL Server. Na našem počítači jsou zdroje dat ODBC uloženy v /etc/odbc.ini
. Tento výpis zdroje dat zobrazuje příslušná nastavení pro sloupce Always Encrypted:
[SQLSERVER_2016]Driver=Easysoft ODBC-SQL Server SSL # Musí použít SSL verzi driverServer=machine\sqlserver_instanceDatabase=database_with_always_encrypted_dataUser=user # Toto může být přihlášení k Windows nebo SQL Server.Password=passwordTrusted_Connection=Ano # Nastavte toto na Ne pro SQL Server loginColumnEncryption=Vždy zapnuto # zobrazení dat to # vložit do sloupce Always Encrypted nastaveného na Enabled
Poznámka Pokud vaše připojení selže s chybou „Spojení SSL selhalo v syscall“, váš systém postrádá „náhodné zařízení“. Viz Entropy
v příručce ovladače SQL Server ODBC, kde najdete informace o tom, co s tím dělat.
Vkládání dat do vždy šifrovaného sloupce
Nyní jsme vytvořili prázdnou tabulku se sloupci Always Encrypted a nastavili náš klientský počítač Linux tak, aby ovladač SQL Server ODBC mohl pracovat se vždy šifrovanými daty. Dále musíme tabulku naplnit daty.
Chcete-li vložit data do sloupce Always Encrypted, aplikace musí:
- Použijte parametrizované vložení, tj. INSERT INTO EncryptedTable VALUES (?, ?).
To umožňuje ovladači SQL Server ODBC rozlišovat mezi hodnotami sloupců (které potřebuje zašifrovat) a textem příkazu SQL (který musí zůstat v prostém textu; s Always Encrypted si pamatujte, že SQL Server neprovádí žádné dešifrování).
- Explicitně popište datový typ parametrů.
SQL Server neposkytuje potřebné informace o sloupci Always Encrypted pro ovladač SQL Server ODBC pro zjištění datového typu pomocí
SQLDescribeParam
.
Zde je ukázka v Perlu, která ukazuje, jak to udělat:
# Použijte Perl DBI / DBD:ODBC k vložení dat do sloupců Always Encrypted.use strict;use warnings;use DBI;my $data_source =q/dbi:ODBC:SQLSERVER_2016/;my $h =DBI->connect( $data_source) nebo zemřít "Nelze se připojit k $data_source:$DBI::errstr";$h->{RaiseError} =1;my $s =$h->prepare(q/insert into EncryptedTable values(?, ?)/);my $lastname='Smith';my $salary=25000;# Nastavte datový typ cílových sloupců.# Nelze použít SQLDescribeParam se sloupci Always Encrypted.$s->bind_param(1, $lastname, DBI ::SQL_WVARCHAR);$s->bind_param(2, $plat, DBI::SQL_INTEGER);$s->execute($lastname,$plat);$h->odpojit;
Zde je ukázka C, která ukazuje, jak to udělat:
#include#include #include #include #include #include #include #define LASTNAME_LEN 6SQLHENV henv =SQL_NULL_HENV; // EnvironmentSQLHDBC hdbc =SQL_NULL_HDBC; // Handle pro připojeníSQLHSTMT hstmt =SQL_NULL_HSTMT; // Příkaz handleSQLRETURN retcode;SQLCHAR strLastName[]="Jones";SQLINTEGER pSalary=25000;SQLLEN lenLastName=0;int main () { // Alokace retcode prostředí =SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv); // Nastavení verze ODBC retcode =SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (SQLPOINTER*)SQL_OV_ODBC3, 0); // Přidělit připojení retcode =SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc); // Připojení k DSN retcode =SQLConnect(hdbc, (SQLCHAR*) "MyDSN", SQL_NTS, (SQLCHAR*) NULL, 0, NULL, 0); // Handle pro přidělení příkazu retcode =SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt); // Naváže parametry na všechna pole 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] ([Příjmení],[Plat]) VALUES (?,?)", SQL_NTS); lenLastName=strlen((char*)strLastName); retcode =SQLExecute(hstmt);exit:printf ("\nDokončeno.\n"); // Volné úchyty // Příkaz if (hstmt !=SQL_NULL_HSTMT) SQLFreeHandle(SQL_HANDLE_STMT, hstmt); // Připojení if (hdbc !=SQL_NULL_HDBC) { SQLDisconnect(hdbc); SQLFreeHandle(SQL_HANDLE_DBC, hdbc); } // Prostředí if (henv !=SQL_NULL_HENV) SQLFreeHandle(SQL_HANDLE_ENV, henv); návrat 0;}
Nyní jsou sloupce naplněny, můžeme použít isql k načtení dat:
$ /usr/local/easysoft/unixODBC/bin/isql.sh -v SQLSERVER_2016SQL> vyberte * z EncryptedTable+----+----------+-------- ----+| ID | Příjmení | Plat |+----+----------+------------+| 1 | Smith | 25000 |+----+----------+------------+
V našem zdroji dat jsme měli zapnuté protokolování ovladačů. Následující výpis z protokolu ovladače ukazuje, že:
- SQL Server poskytuje název certifikátu jako metainformace o sloupci.
- Data sloupce jsou šifrována na konci serveru SQL, a proto zůstávají šifrována i při přenosu. Ovladač SQL Server ODBC na klientovi dešifruje hodnoty sloupců a poté je vrátí aplikaci jako prostý text.
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.25.FBB.5.C.. .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:Šifrovaný sloupec.);...'A..zs..I..N.]r..p.-..$....S;.].km6.....3cr.OhR ..j*.....fj....ARN{V.F.....DETAIL:EVP_DecryptInit vrátí 1DETAIL:EVP_DecryptUpdate vrátí 1, 0DETAIL:EVP_DecryptUpdate vrátí 1, 16DETAIL:EVP_DecryptFinal vrátí 1, 0PKTDUMP:dataS...hm.. před>Viz také
- Používání dat chráněných pomocí Azure Key Vault z Linuxu
- Používání dat chráněných vlastním úložištěm klíčů z Linuxu