Rekommendera när du ska använda Azure SQL Database Always Encrypted
Always Encrypted är en funktion som är utformad för att skydda känsliga data, till exempel kreditkortsnummer eller nationella/regionala ID-nummer (till exempel socialförsäkringsnummer i USA), lagrade i Azure SQL Database, Azure SQL Managed Instance och SQL Server-databaser. Always Encrypted gör att klienter kan kryptera känsliga data i klientprogram och aldrig avslöja krypteringsnycklarna för databasmotorn. Detta ger en separation mellan dem som äger data och kan visa dem, och de som hanterar data men inte bör ha någon åtkomst – lokala databasadministratörer, molndatabasoperatörer eller andra högprivilegierade obehöriga användare. Därför gör Always Encrypted det möjligt för kunder att tryggt lagra känsliga data i molnet och minska risken för datastöld av skadliga insiders.
Always Encrypted kan konfigureras för att stödja begränsade konfidentiella frågor på krypterade data, de frågor som omfattar likhetsjämförelser. Till exempel punktsökningssökningar eller likhetskopplingar. Sådana frågor utnyttjar deterministisk kryptering.
Kommentar
Säkra enklaver utökar funktionerna för konfidentiell databehandling i Always Encrypted med mönstermatchning, andra jämförelseoperatorer och kryptering på plats.
Always Encrypted gör kryptering transparent för program. En Always Encrypted-aktiverad drivrutin som är installerad på klientdatorn uppnår detta genom att automatiskt kryptera och dekryptera känsliga data i klientprogrammet. Drivrutinen krypterar data i känsliga kolumner innan data skickas till databasmotorn och skriver automatiskt om frågor så att semantiken till programmet bevaras. På samma sätt dekrypterar drivrutinen transparent data, lagrade i krypterade databaskolumner, som finns i frågeresultat.
Konfigurera Always Encrypted
Om du vill konfigurera Always Encrypted i databasen måste du:
Etablera kryptografiska nycklar för att skydda dina data. Always Encrypted använder två typer av nycklar:
- Kolumnkrypteringsnycklar.
- Kolumnhuvudnycklar.
En kolumnkrypteringsnyckel används för att kryptera data i en krypterad kolumn. En kolumnhuvudnyckel är en nyckelskyddande nyckel som krypterar en eller flera kolumnkrypteringsnycklar.
Du måste lagra kolumnhuvudnycklar i ett betrott nyckelarkiv utanför databassystemet, till exempel Azure Key Vault, Windows-certifikatarkiv eller en maskinvarusäkerhetsmodul.
Sedan behöver du etablera kolumnkrypteringsnycklar och kryptera var och en av dem med en kolumnhuvudnyckel.
Slutligen måste du lagra metadata om nycklarna i databasen.
- Kolumnhuvudnyckelmetadata avbildar platsen för kolumnhuvudnyckeln.
- Kolumnkrypteringsnyckelmetadata innehåller det krypterade värdet för kolumnkrypteringsnyckeln. Databasmotorn lagrar eller använder aldrig nycklarna av någon av typerna i klartext.
- Kolumnkrypteringsnycklar.
Konfigurera kryptering för valda databaskolumner som innehåller känsliga data som ska skyddas. Detta kan innebära att skapa nya tabeller med krypterade kolumner eller kryptera befintliga databaskolumner och befintliga data. När du konfigurerar kryptering för en kolumn anger du information om en krypteringsalgoritm, en kolumnkrypteringsnyckel för att skydda data i kolumnen och en krypteringstyp. Always Encrypted stöder två krypteringstyper:
- Deterministisk kryptering genererar alltid samma krypterade värde för ett angivet klartextvärde. Med deterministisk kryptering kan punktsökningar, likhetskopplingar, gruppering och indexering på krypterade kolumner användas. Men det kan också göra det möjligt för obehöriga användare att gissa information om krypterade värden genom att undersöka mönster i den krypterade kolumnen, särskilt om det finns en liten uppsättning möjliga krypterade värden, till exempel Sant/Falskt eller Region nord/syd/öst/väst.
- Randomiserad kryptering använder en metod som krypterar data på ett mindre förutsägbart sätt. Randomiserad kryptering är säkrare, men förhindrar sökning, gruppering, indexering och anslutning till krypterade kolumner.
Använd deterministisk kryptering för kolumner som ska användas som sök- eller grupperingsparametrar. Till exempel ett myndighets-ID-nummer. Använd randomiserad kryptering för data som konfidentiella undersökningskommentarer, som inte är grupperade med andra poster och inte används för att koppla tabeller.
Mer information om krypteringsalgoritmer med Always Encrypted finns i Always Encrypted cryptography (Alltid krypterad kryptografi).
Du kan utföra stegen ovan med hjälp av SQL-verktyg:
- SQL Server Management Studio (SSMS)
- SQL Server PowerShell
- sqlpackage – som automatiserar installationsprocessen
För att säkerställa att Always Encrypted-nycklar och skyddade känsliga data aldrig visas i klartext till databasmiljön kan databasmotorn inte vara involverad i nyckeletablering och datakryptering eller dekrypteringsåtgärder. Transact-SQL (T-SQL) stöder därför inte nyckeletablering eller kryptografiska åtgärder. Av samma anledning måste kryptering av befintliga data eller omkryptering av dem (med en annan krypteringstyp eller en kolumnkrypteringsnyckel) utföras utanför databasen (SQL-verktyg kan automatisera det).
Kommentar
Always Encrypted med säkra enklaver lyfter vissa av ovanstående begränsningar genom att tillåta kryptografiska åtgärder på befintliga data med hjälp av T-SQL, och eliminerar behovet av att flytta data utanför databasen.
- Deterministisk kryptering genererar alltid samma krypterade värde för ett angivet klartextvärde. Med deterministisk kryptering kan punktsökningar, likhetskopplingar, gruppering och indexering på krypterade kolumner användas. Men det kan också göra det möjligt för obehöriga användare att gissa information om krypterade värden genom att undersöka mönster i den krypterade kolumnen, särskilt om det finns en liten uppsättning möjliga krypterade värden, till exempel Sant/Falskt eller Region nord/syd/öst/väst.
Så här fungerar frågor mot krypterade kolumner
Om du vill köra en fråga på krypterade databaskolumner infogar du data i krypterade kolumner, hämtar oformaterade värden från krypterade kolumner eller utför åtgärder som stöds (till exempel punktsökningssökningar) på kolumner med deterministisk kryptering, en användare eller ett program som utfärdar frågan måste uppfylla följande krav:
- Ha åtkomst till kolumnhuvudnyckeln som skyddar data. Nyckelåtkomst krävs utöver behörigheter på databasnivå, till exempel
SELECT
i tabellen som innehåller data. - Anslut till databasen med Always Encrypted aktiverat i databasanslutningen. De flesta SQL-verktyg och SQL-klientdrivrutiner stöder aktivering av Always Encrypted för databasanslutningar.
Kommentar
Om användaren har nödvändiga databasbehörigheter för att läsa data, men inte har åtkomst till nycklarna som skyddar dem, kan användaren fortfarande hämta cyphertextdata (krypterade) genom att ansluta till databasen utan att aktivera Always Encrypted i databasanslutningen.
Så här fungerar frågor om krypterade kolumner:
När ett program utfärdar en parameteriserad fråga kontaktar SQL-klientdrivrutinen i programmet transparent databasmotorn (genom att anropa sp_describe_parameter_encryption (Transact-SQL) för att avgöra vilka parametrar som är avsedda för krypterade kolumner och ska krypteras. För varje parameter som behöver krypteras tar drivrutinen emot krypteringsalgoritmen, krypteringstypen och nyckelmetadata, inklusive krypteringsnyckeln för krypterad kolumn och platsen för motsvarande kolumnhuvudnyckel.
Drivrutinen anropar nyckelarkivet som innehåller kolumnhuvudnycklar för att dekryptera de krypterade kolumnkrypteringsnyckelvärdena. De resulterande krypteringsnycklarna för klartextkolumner cachelagras för att minska antalet turer till nyckelarkivet vid efterföljande användning av samma kolumnkrypteringsnycklar.
Drivrutinen använder de hämtade krypteringsnycklarna för klartextkolumner för att kryptera frågeparametrarna som motsvarar krypterade kolumner.
Drivrutinen ersätter klartextvärdena för parametrarna som riktar sig mot krypterade kolumner med deras krypterade värden och skickar frågan till databasmotorn för bearbetning.
Databasmotorn kör frågan, vilket kan innebära likhetsjämförelser i kolumner med deterministisk kryptering.
Om frågeresultaten innehåller data från krypterade kolumner bifogar databasmotorn krypteringsmetadata för varje kolumn, inklusive information om krypteringsalgoritmen, krypteringstypen och nyckelmetadata till resultatuppsättningen.
Databasmotorn skickar resultatuppsättningen till klientprogrammet.
För varje krypterad kolumn i den mottagna resultatuppsättningen försöker drivrutinen först hitta krypteringsnyckeln för oformaterad kolumn i den lokala cachen och gör bara en tur och retur till ett nyckelarkiv med kolumnhuvudnyckeln om den inte hittar nyckeln i cacheminnet.
Drivrutinen dekrypterar resultatet och returnerar klartextvärden till programmet.
En klientdrivrutin interagerar med ett nyckelarkiv som innehåller en kolumnhuvudnyckel med hjälp av en kolumnhuvudnyckellagringsprovider, som är en programvarukomponent på klientsidan som kapslar in ett nyckellager som innehåller kolumnhuvudnyckeln. Leverantörer för vanliga typer av nyckellager är tillgängliga i drivrutinsbibliotek på klientsidan från Microsoft eller som fristående nedladdningar. Du kan också implementera din egen leverantör. Always Encrypted-funktioner, inklusive inbyggda huvudnyckellagringsleverantörer för kolumner, varierar beroende på ett drivrutinsbibliotek och dess version.
Se Utveckla program med Always Encrypted för en lista över klientdrivrutiner som stöder Always Encrypted och för information om hur du utvecklar program som kör frågor mot krypterade kolumner.
Du kan också köra frågor mot krypterade kolumner med hjälp av SQL-verktyg, till exempel Azure Data Studio eller SSMS.
Begränsningar
Följande begränsningar gäller för frågor i krypterade kolumner:
- Deterministisk kryptering stöder följande åtgärder som omfattar likhetsjämförelser – inga andra åtgärder tillåts.
- = (Är lika med) i punktsökningar.
- IN.
- VÄLJ – GRUPPERA EFTER.
- DISTINCT.
- = (Är lika med) i punktsökningar.
- Inga beräkningar på kolumner som krypterats med randomiserad kryptering tillåts.
Kommentar
Always Encrypted med säkra enklaver minskar ovanstående begränsning genom att tillåta mönstermatchning, jämförelseoperatorer, sortering och indexering på kolumner med hjälp av randomiserad kryptering.
- Frågeinstruktioner som utlöser beräkningar med både klartext och krypterade data tillåts inte. Till exempel:
- Jämföra en krypterad kolumn med en oformaterad kolumn eller en literal.
- Kopiera data från en oformaterad kolumn till en krypterad kolumn (eller tvärtom) UPDATE, BULK INSERT, SELECT INTO eller INSERT.. VÄLJ.
- Infoga literaler i krypterade kolumner.
- Jämföra en krypterad kolumn med en oformaterad kolumn eller en literal.
Sådana instruktioner resulterar i operand-konfliktfel så här:
Output
Msg 206, Level 16, State 2, Line 89
Operand type clash: char(11) encrypted with (encryption_type = 'DETERMINISTIC', encryption_algorithm_name = 'AEAD_AES_256_CBC_HMAC_SHA_256', column_encryption_key_name = 'CEK_1', column_encryption_key_database_name = 'ssn') collation_name = 'Latin1_General_BIN2' is incompatible with char
Program måste använda frågeparametrar för att skicka värden som motsvarar krypterade kolumner. När du till exempel infogar data i krypterade kolumner eller filtrerar efter krypterade kolumner (när du använder deterministisk kryptering). Det går inte att skicka literaler eller T-SQL-variabler som motsvarar krypterade kolumner. Mer information om en klientdrivrutin som du använder finns i Utveckla program med Always Encrypted.
Du måste använda parameterisering för Always Encrypted-variabler i Azure Data Studio eller SSMS för att utfärda frågor som skickar värden som motsvarar krypterade kolumner i dessa verktyg. När du till exempel infogar data i krypterade kolumner eller filtrerar efter krypterade kolumner (när du använder deterministisk kryptering).
Tabellvärdesparametrar som riktar sig till krypterade kolumner stöds inte.
Frågor som använder följande satser stöds inte:
När du har ändrat definitionen av en krypterad kolumn kör du sp_refresh_parameter_encryption för att uppdatera Always Encrypted-metadata för objektet.
Always Encrypted stöds inte för kolumnerna med nedanstående egenskaper:
- Kolumner som använder någon av följande datatyper: xml, tidsstämpel, radversion, bild, ntext, text, sql_variant, hierarchyid, geografi, geometri, alias, användardefinierade typer.
- FILESTREAM-kolumner
- Kolumner med egenskapen IDENTITY .
- Kolumner med egenskapen ROWGUIDCOL .
- Strängkolumner (varchar, tecken osv.) med andra sorteringar än binärkodspunktsortering (_BIN2) vid användning av deterministisk kryptering.
- Kolumner som är nycklar för klustrade och icke-grupperade index när du använder randomiserad kryptering (index på kolumner som använder deterministisk kryptering stöds).
- Kolumner som ingår i fulltextindex (Always Encrypted stöder inte fulltextsökning).
- Beräknade kolumner.
- Kolumner som refereras av beräknade kolumner (när uttrycket utför åtgärder som inte stöds för Always Encrypted).
- Gles kolumnuppsättning.
- Kolumner som refereras till av statistik när du använder randomiserad kryptering (deterministisk kryptering stöds).
- Partitionering av kolumner.
- Kolumner med standardbegränsningar.
- Kolumner som refereras till av unika begränsningar när du använder randomiserad kryptering (deterministisk kryptering stöds).
- Primära nyckelkolumner när du använder randomiserad kryptering (deterministisk kryptering stöds).
- Referera till kolumner i sekundärnyckelbegränsningar när du använder randomiserad kryptering eller när du använder deterministisk kryptering, om de refererade och refererande kolumnerna använder olika nycklar eller algoritmer.
- Kolumner som refereras till av kontrollbegränsningar.
- Kolumner som samlas in/spåras med hjälp av insamling av ändringsdata.
- Primära nyckelkolumner i tabeller som har ändringsspårning.
- Kolumner som är maskerade (med dynamisk datamaskering).
- Kolumner i stretchdatabastabeller. (Tabeller med kolumner krypterade med Always Encrypted kan aktiveras för Stretch.)
-
Viktigt!
Stretch Database är inaktuell i SQL Server 2022 (16.x) och Azure SQL Database. Den här funktionen tas bort i en framtida version av databasmotorn. Undvik att använda den här funktionen i nya utvecklingsprojekt, och överväg att ändra befintliga program där den här funktionen används.
Följande funktioner fungerar inte på krypterade kolumner:
- SQL Server-replikering (transaktions-, sammanslagnings- eller ögonblicksbildsreplikering). Fysiska replikeringsfunktioner, inklusive Always, stöds.
- Distribuerade frågor (länkade servrar, OPENROWSET (Transact-SQL), OPENDATASOURCE (Transact-SQL)).
- Frågor mellan databaser som utför kopplingar på kolumner (med deterministisk kryptering) från olika databaser.
Always Encrypted Transact-SQL-referens
Always Encrypted använder följande Transact-SQL-instruktioner, systemkatalogvyer, system lagrade procedurer och behörigheter.
Utdrag
- SKAPA KOLUMNHUVUDNYCKEL (Transact-SQL)
- DROP COLUMN MASTER KEY (Transact-SQL)
- SKAPA KOLUMNKRYPTERINGSNYCKEL (Transact-SQL)
- ÄNDRA KOLUMNKRYPTERINGSNYCKEL (Transact-SQL)
- SLÄPP KOLUMNKRYPTERINGSNYCKEL (Transact-SQL)
- SKAPA TABELL (KRYPTERAD MED)
Systemkatalogvyer och lagrade procedurer
- sys.column_encryption_keys (Transact-SQL)
- sys.column_encryption_key_values (Transact-SQL)
- sys.column_master_keys (Transact-SQL)
- sp_refresh_parameter_encryption (Transact-SQL)
- sp_describe_parameter_encryption (Transact-SQL)
Se även sys.columns (Transact-SQL) för information om krypteringsmetadata som lagras för varje kolumn.
Databasbehörigheter
Det finns fyra databasbehörigheter för Always Encrypted:
- ÄNDRA VALFRI KOLUMNHUVUDNYCKEL – krävs för att skapa och ta bort huvudnyckelmetadata för kolumner.
- ÄNDRA VALFRI KOLUMNKRYPTERINGSNYCKEL – krävs för att skapa och ta bort kolumnkrypteringsnyckelmetadata.
- VISA VALFRI KOLUMN HUVUDNYCKELDEFINITION – krävs för att komma åt och läsa kolumnhuvudnyckelmetadata, som behövs för att köra frågor mot krypterade kolumner.
- VISA VALFRI DEFINITION AV KOLUMNKRYPTERINGSNYCKEL – krävs för att få åtkomst till och läsa kolumnhuvudnyckelmetadata, som behövs för att köra frågor mot krypterade kolumner.
I följande tabell sammanfattas de behörigheter som krävs för vanliga åtgärder.
Scenario | ÄNDRA VALFRI KOLUMNHUVUDNYCKEL | ÄNDRA VALFRI KOLUMNKRYPTERINGSNYCKEL | VISA VALFRI KOLUMNHUVUDNYCKELDEFINITION | VISA VALFRI KOLUMNKRYPTERINGSNYCKELDEFINITION |
---|---|---|---|---|
Nyckelhantering (skapa/ändra/granska viktiga metadata i databasen) | X | X | X | X |
Köra frågor mot krypterade kolumner | X | X |
Viktigt!
- BEHÖRIGHETERNA VIEW ANY COLUMN MASTER KEY DEFINITION och VIEW ANY COLUMN ENCRYPTION KEY DEFINITION krävs när du väljer krypterade kolumner, även om användaren inte har behörighet till kolumnhuvudnycklarna (i deras nyckellager), skyddar kolumnerna och kommer inte åt klartextförsök.
- I SQL Server beviljas både VIEW ANY COLUMN MASTER KEY DEFINITION och VIEW ANY COLUMN ENCRYPTION KEY DEFINITION permissions by default to the public fixed database role (VISA ALLA KOLUMNHUVUDNYCKELDEFINITIONER) och VISA BEHÖRIGHETER FÖR KOLUMNKRYPTERINGSNYCKEL SOM standard till den offentliga fasta databasrollen. En databasadministratör kan välja att återkalla (eller neka) behörigheterna till den offentliga rollen och ge dem till specifika roller eller användare för att implementera mer begränsad kontroll.
- I SQL Database beviljas inte DEFINITIONsbehörigheterna VISA KOLUMNHUVUDNYCKEL OCH VISA EVENTUELLA KOLUMNKRYPTERINGSNYCKLAR SOM standard till den offentliga fasta databasrollen. Detta gör att vissa befintliga äldre verktyg (med äldre versioner av DacFx) kan fungera korrekt. Om du vill arbeta med krypterade kolumner (även om de inte dekrypterar dem) måste en databasadministratör uttryckligen bevilja BEHÖRIGHETERNA VISA HUVUDNYCKEL FÖR VISA KOLUMNER OCH VISA ALLA DEFINITIONsbehörigheter FÖR KOLUMNKRYPTERINGSNYCKEL.