Als u vertrouwelijke gegevens in uw database moet opslaan, kunt u gegevensversleuteling . gebruiken . SQL Server ondersteunt versleuteling met symmetrische sleutels, asymmetrische sleutels, certificaten en wachtwoordzinnen. Ik neem aan dat u, de lezer, al bekend bent met deze termen. In dit artikel zal ik me concentreren op twee van de vele coderingsopties die door SQL Server worden geboden:
- Transparante gegevenscodering (TDE)
- Altijd versleuteld (AE)
Transparante gegevenscodering
De Transparante gegevenscodering (TDE) beschermt de gegevens in rust wanneer deze niet worden gebruikt. Wanneer de gegevens worden gebruikt, decodeert SQL Server deze automatisch. U kunt de TDE gebruiken voor realtime codering en decodering van de gegevens en logbestanden. U versleutelt de gegevens met de database-encryptiesleutel (DEK) , wat een symmetrische sleutel is. Het wordt opgeslagen in het opstartrecord van de database en is daarom al beschikbaar tijdens het herstelproces van de database. U beveiligt de DEK met een certificaat in de masterdatabase. U kunt in plaats van het certificaat ook een asymmetrische sleutel gebruiken; de asymmetrische sleutel moet echter worden opgeslagen in een EKM-module. TDE gebruikt alleen de AES- en Triple DES-coderingen. TDE werd voor het eerst geïmplementeerd in SQL Server met versie 2012.
U kunt TDE alleen op gebruikersdatabases gebruiken. U kunt de databasecoderingssleutel niet exporteren. Deze sleutel wordt alleen gebruikt door de SQL Server Database Engine. Eindgebruikers gebruiken het nooit. Zelfs als u de eigenaar van de database wijzigt, hoeft u de DEK niet opnieuw te genereren.
TDE versleutelt gegevens op paginaniveau. Bovendien versleutelt het ook het transactielogboek. U moet onmiddellijk nadat u TDE inschakelt een back-up maken van het certificaat dat wordt gebruikt om de DEK te beschermen en de persoonlijke sleutel die wordt gebruikt om het certificaat te beschermen. Als u de versleutelde database wilt herstellen of koppelen aan een andere SQL Server-instantie, moet u zowel het certificaat als de persoonlijke sleutel herstellen, anders kunt u de database niet openen. Merk nogmaals op dat u de DEK niet exporteert, omdat het een onderdeel is van de database zelf. U moet het certificaat dat wordt gebruikt om de DEK te beschermen, behouden en onderhouden, zelfs nadat u de TDE in de database hebt uitgeschakeld. Dit komt omdat delen van het transactielogboek mogelijk nog steeds versleuteld zijn. Het certificaat is nodig totdat u de volledige databaseback-up hebt uitgevoerd.
Altijd versleuteld
SQL Server 2016 Enterprise Edition introduceert een nieuw coderingsniveau, namelijk de Always Encrypted (AE) functie. Deze functie maakt hetzelfde niveau van gegevensbescherming mogelijk als het versleutelen van de gegevens in de clienttoepassing. Hoewel dit een functie van SQL Server is, worden de gegevens aan de clientzijde versleuteld en ontsleuteld. De coderingssleutels worden nooit onthuld aan de SQL Server Database Engine. Op deze manier kan ook een DBA geen gevoelige gegevens zien zonder de coderingssleutels, alleen door sysadmin-machtigingen te hebben op de SQL Server-instantie met de gecodeerde gegevens. Op deze manier maakt AE een scheiding tussen de beheerders die de gegevens beheren en de gebruikers die de gegevens bezitten.
AE-toetsen
Voor Always Encrypted heb je twee sleutels nodig. Eerst maakt u de kolomhoofdsleutel (CMK) . Vervolgens maakt u de kolomcoderingssleutel (CEK) en bescherm het met de CMK. Een applicatie gebruikt de CEK om de gegevens te versleutelen. SQL Server slaat alleen versleutelde gegevens op en kan deze niet ontsleutelen. Dit is mogelijk omdat de kolomhoofdsleutels niet echt worden opgeslagen in een SQL Server-database. In de database slaat SQL Server alleen de koppeling naar die sleutels op. De kolomhoofdsleutels worden buiten SQL Server opgeslagen, op een van de volgende mogelijke plaatsen:
- Windows-certificaatarchief voor de huidige gebruiker
- Windows-certificaatarchief voor de lokale computer
- Azure Key Vault-service
- Een hardware-beveiligingsmodule (HSM) , die Microsoft CryptoAPI of Cryptography API ondersteunt:Next Generation
De kolomcoderingssleutels worden opgeslagen in de database. Binnen een SQL Server-database wordt alleen het versleutelde deel van de waarden van kolomcoderingssleutels opgeslagen, samen met de informatie over de locatie van kolomhoofdsleutels. CEK's worden nooit als platte tekst in een database opgeslagen. CMK's worden, zoals vermeld, daadwerkelijk opgeslagen in externe vertrouwde sleutelwinkels.
De AE-toetsen gebruiken
Een toepassing kan de AE-sleutels en codering gebruiken door een AE-stuurprogramma te gebruiken, zoals .NET Framework Data Provider voor SQL Server versie 4.6 of hoger, Microsoft JDBC Driver voor SQL Server 6.0 of hoger, of Windows ODBC-stuurprogramma voor SQL Server versie 13.1 of hoger. De applicatie moet geparametriseerde zoekopdrachten send verzenden naar SQL-server. De AE-driver werkt samen met de SQL Server Database Engine om te bepalen welke parameters versleuteld of ontsleuteld moeten worden. Voor elke parameter die versleuteld of ontsleuteld moet worden, verkrijgt de driver de metadata die nodig zijn voor de versleuteling van de Database Engine, inclusief het versleutelingsalgoritme, de locatie van de corresponderende CMK en de versleutelde waarde voor de corresponderende CEK. Vervolgens neemt het stuurprogramma contact op met de CMK-winkel, haalt de CMK op, decodeert de CEK en gebruikt de CEK om de parameter te coderen of te decoderen. Vervolgens slaat de driver de CEK op in de cache om het volgende gebruik van dezelfde CEK te versnellen. De volgende afbeelding toont het proces grafisch.
De figuur geeft het hele proces in stappen weer:
- Clienttoepassing maakt een geparametriseerde query
- Clienttoepassing verzendt de geparametriseerde query naar het AE-stuurprogramma
- Het AE-stuurprogramma neemt contact op met SQL Server om te bepalen welke parameters versleuteling of ontsleuteling nodig hebben, de locatie van de CMK en de versleutelde waarde van de CEK
- Het AE-stuurprogramma haalt de CMK op en decodeert de CEK
- Het AE-stuurprogramma versleutelt de parameter(s)
- Het stuurprogramma stuurt de vraag naar de database-engine
- De Database Engine haalt de gegevens op en stuurt de resultatenset naar de driver
- Het stuurprogramma voert indien nodig decodering uit en stuurt de resultatenset naar de clienttoepassing
AE-coderingstypen
De database-engine werkt nooit op de platte tekstgegevens die zijn opgeslagen in de versleutelde kolommen. Afhankelijk van het type versleuteling zijn echter enkele vragen over de versleutelde gegevens mogelijk. Er zijn twee soorten codering:
- Deterministische codering , die altijd dezelfde versleutelde waarde genereert voor dezelfde invoerwaarde. Met deze versleuteling kunt u de versleutelde kolom indexeren en puntzoekopdrachten, gelijkheidsjoins en groeperingsexpressies in de versleutelde kolom gebruiken. Een kwaadwillende gebruiker kan echter proberen de waarden te raden door de patronen van de versleutelde waarden te analyseren. Dit is vooral gevaarlijk wanneer de reeks mogelijke waarden voor een kolom discreet is, met een klein aantal verschillende waarden.
- Gerandomiseerde codering , die gegevens op een onvoorspelbare manier versleutelt.
AE-demo:de objecten maken
Het is tijd om te laten zien hoe AE werkt door middel van een democode. Laten we eerst een demodatabase maken en gebruiken.
USE master; IF DB_ID(N'AEDemo') IS NULL CREATE DATABASE AEDemo; GO USE AEDemo; GO
Maak vervolgens de CMK in SSMS GUI. Vernieuw in Object Explorer de map Databases om de AEDemo-database te zien. Vouw deze databasemap uit, vouw de submap Beveiliging en vervolgens de submap Always Encrypted Keys uit, klik met de rechtermuisknop op de submap Column Master Key en selecteer de optie New Column Master Key in het pop-upmenu. Schrijf in het tekstvak Naam AE_ColumnMasterKey en zorg ervoor dat u de optie Windows Certificate Store – Local Machine selecteert in de vervolgkeuzelijst Key Store, zoals de volgende afbeelding laat zien.
U kunt controleren of de CMK succesvol is aangemaakt met de volgende vraag.
SELECT * FROM sys.column_master_keys;
Vervolgens maakt u de CEK aan. Klik in SSMS in Objectverkenner met de rechtermuisknop op de submap Kolomcoderingssleutels onder de submap Kolomhoofdsleutel en selecteer de optie Nieuwe kolomcoderingssleutel in het pop-upmenu. Noem de CEK AE_ColumnEncryptionKey en gebruik de AE_ColumnMasterKey CMK om deze te coderen. Met de volgende vraag kunt u controleren of het aanmaken van de CEK is gelukt.
SELECT * FROM sys.column_encryption_keys;
Momenteel zijn alleen de nieuwe binaire sorteringen, de sorteringen met de BIN2 achtervoegsel, worden ondersteund voor AE. Laten we daarom een tabel maken met geschikte sorteringen voor de karakterkolommen.
CREATE TABLE dbo.Table1 (id INT, SecretDeterministic NVARCHAR(10) COLLATE Latin1_General_BIN2 ENCRYPTED WITH (COLUMN_ENCRYPTION_KEY = AE_ColumnEncryptionKey, ENCRYPTION_TYPE = DETERMINISTIC, ALGORITHM = 'AEAD_AES_256_CBC_HMAC_SHA_256') NULL, SecretRandomized NVARCHAR(10) COLLATE Latin1_General_BIN2 ENCRYPTED WITH (COLUMN_ENCRYPTION_KEY = AE_ColumnEncryptionKey, ENCRYPTION_TYPE = RANDOMIZED, ALGORITHM = 'AEAD_AES_256_CBC_HMAC_SHA_256') NULL );
AE-demo:gegevens invoegen
Nu kunt u proberen een rij gegevens in te voegen met de volgende instructie.
INSERT INTO dbo.Table1 (id, SecretDeterministic, SecretRandomized) VALUES (1, N'DeterSec01', N'RandomSec1');
U krijgt de fout 206, fouttekst:"Operand type clash:nvarchar is incompatibel met nvarchar (4000) versleuteld met (encryption_type ='DETERMINISTIC', encryption_algorithm_name ='AEAD_AES_256_CBC_HMAC_SHA_256', column_encryption_keyColumnEncryption_key_name ='AEAD_AES_256_CBC_HMAC_SHA_256', column_encryption_keyColumnEncryption_key_name ='AEAD_AES_256_CBC_HMAC_SHA_256', column_encryption_keyColumnEncryption_key_name ='AE . SQL Server kan de gegevens niet versleutelen of ontsleutelen. U moet de gegevens van een clienttoepassing wijzigen. U kunt een beperkte reeks bewerkingen op de tafel uitvoeren vanuit SQL Server. U kunt bijvoorbeeld de instructie TRUNCATE TABLE gebruiken voor een tabel met AE-kolommen.
Ik heb een zeer eenvoudige client-Windows Console-toepassing gemaakt in Visual C#. De applicatie haalt eigenlijk gewoon de sleutels op en voegt een enkele rij in de tabel in die is gemaakt met de bovenstaande code. Hier is de C#-code.
using System; using System.Collections.Generic; using System.Data; using System.Data.SqlClient; using System.Linq; using System.Text; using System.Threading.Tasks; namespace AEDemo { class Program { static void Main(string[] args) { string connectionString = "Data Source=localhost; “ + “Initial Catalog=AEDemo; Integrated Security=true; ” + “Column Encryption Setting=enabled"; SqlConnection connection = new SqlConnection(connectionString); connection.Open(); if (args.Length != 3) { Console.WriteLine("Please enter a numeric “ + “and two string arguments."); return; } int id = Int32.Parse(args[0]); { using (SqlCommand cmd = connection.CreateCommand()) { cmd.CommandText = @"INSERT INTO dbo.Table1 “ + “(id, SecretDeterministic, SecretRandomized)" + " VALUES (@id, @SecretDeterministic, @SecretRandomized);"; SqlParameter paramid= cmd.CreateParameter(); paramid.ParameterName = @"@id"; paramid.DbType = DbType.Int32; paramid.Direction = ParameterDirection.Input; paramid.Value = id; cmd.Parameters.Add(paramid); SqlParameter paramSecretDeterministic = cmd.CreateParameter(); paramSecretDeterministic.ParameterName = @"@SecretDeterministic"; paramSecretDeterministic.DbType = DbType.String; paramSecretDeterministic.Direction = ParameterDirection.Input; paramSecretDeterministic.Value = "DeterSec1"; paramSecretDeterministic.Size = 10; cmd.Parameters.Add(paramSecretDeterministic); SqlParameter paramSecretRandomized = cmd.CreateParameter(); paramSecretRandomized.ParameterName = @"@SecretRandomized"; paramSecretRandomized.DbType = DbType.String; paramSecretRandomized.Direction = ParameterDirection.Input; paramSecretRandomized.Value = "RandomSec1"; paramSecretRandomized.Size = 10; cmd.Parameters.Add(paramSecretRandomized); cmd.ExecuteNonQuery(); } } connection.Close(); Console.WriteLine("Row inserted successfully"); } } }
U kunt de C#-code uitvoeren vanuit Visual Studio in de foutopsporingsmodus of de toepassing bouwen. Vervolgens kunt u de toepassing AEDemo.exe uitvoeren vanaf de opdrachtprompt of vanaf SSMS in SQMCMD-modus.
AE-demo:de gegevens lezen
Nadat u de toepassing heeft uitgevoerd, moet u proberen de gegevens van dezelfde sessie in SSMS te lezen die u heeft gebruikt om de tabel te maken.
SELECT * FROM dbo.Table1;
U kunt alleen versleutelde gegevens zien. Open nu een tweede queryvenster in SSMS. Klik met de rechtermuisknop in dit venster en kies Verbinding en vervolgens Verbinding wijzigen. Klik in het dialoogvenster Verbinding op de knop Opties onderaan. Typ AEDemo als databasenaam en klik vervolgens op het tabblad Extra verbindingsparameters. Voer in het tekstvak "Kolomcoderingsinstelling =ingeschakeld" in (zonder dubbele aanhalingstekens). Klik vervolgens op Verbinden.
Probeer opnieuw een rij uit SSMS in te voegen. Gebruik de volgende zoekopdracht.
INSERT INTO dbo.Table1 (id, SecretDeterministic, SecretRandomized) VALUES (2, N'DeterSec2', N'RandomSec2');
Ik kreeg weer een fout. Deze SSMS-versie die ik gebruik, kan ad-hoc-inserts nog steeds niet parametriseren. Laten we echter proberen de gegevens te lezen met de volgende vraag.
SELECT * FROM dbo.Table1;
Deze keer werkt de query en krijg je het volgende resultaat:
Id SecretDeterministisch geheimGerandomiseerd
— ——————– —————-
1 DeterSec1 WillekeurigeSec1
2 DeterSec2 WillekeurigeSec2
AE-beperkingen
Je hebt al enkele beperkingen van Always Encrypted gezien, waaronder:
- Alleen BIN2-sorteringen worden ondersteund voor tekenreeksen
- U kunt alleen kolommen indexeren met deterministische codering en een beperkte set T-SQL-bewerkingen op die kolommen gebruiken
- U kunt geen kolommen indexeren met willekeurige versleuteling
- AE is alleen beperkt tot de Enterprise- en Developer-edities
- Werken met AE in SSMS kan pijnlijk zijn
Raadpleeg Books Online voor een meer gedetailleerde lijst met AE-beperkingen. Let echter ook op de sterke punten van AE. Het is eenvoudig te implementeren omdat er geen wijzigingen in een toepassing nodig zijn, behalve de wijziging van verbindingsreeksen. Gegevens worden end-to-end versleuteld, van clientgeheugen via het netwerk tot databaseopslag. Zelfs DBA's kunnen de gegevens niet alleen in SQL Server bekijken; zelfs DBA's hebben toegang nodig tot de sleutelopslag buiten SQL Server om de CMK te lezen. AE en andere coderingsopties in SQL Server bieden een complete reeks mogelijkheden, en het is aan jou en het zakelijke probleem dat je oplost om de juiste methode te selecteren.
Conclusie
Transparante gegevenscodering is uiterst eenvoudig te gebruiken. De gegevensbescherming is echter zeer beperkt. TDE beschermt alleen de gegevens in rust. Always Encrypted is echter echt een krachtige functie. Het is nog steeds niet te ingewikkeld om te implementeren en de gegevens zijn volledig beschermd. Zelfs een DBA kan het niet zien zonder toegang te hebben tot de coderingssleutels. Hopelijk zullen de beperkingen voor AE, met name de collatiebeperking, worden verwijderd in toekomstige versies van SQL Server.