Kvalitetsgranskning av databasmodell, SQL kod, databassäkerhet, backup/restore rutiner, utvecklingsrutiner och driftrutiner. Denna granskning syftar till…
För att höja säkerheten i SQL Server så kan du kryptera din databas med Transparent Data Encryption (TDE). Denna kryptering är precis som namnet antyder transparent för applikationerna. Att aktivera TDE på en databas är relativt enkelt med några få steg:
- Skapa en master database key som skyddas av service key
- Skapa ett certificat som skyddas av master database key
- Ta en backup av certificatet. Detta är mycket viktigt för att kunna återläsa en krypterad databas
- Skapa en database key i databasen som skall krypteras
- Aktivera krypteringen
För att testa TDE så kan du använda koden nedan för att sätta upp kryptering, ta en backup av certifikatet och databasen, ta bort dessa och återläsa den krypterade databasen.
USE MASTER; GO IF EXISTS(SELECT * FROM sys.[databases] AS d WHERE name ='EncryptedDatabaseTest') BEGIN DROP DATABASE [EncryptedDatabaseTest] END -- create the master database key IF NOT EXISTS (select * from sys.symmetric_keys WHERE name ='##MS_DatabaseMasterKey##') CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'MyMasterPassword'; IF EXISTS (SELECT * FROM sys.[certificates] AS c WHERE c.[name]='MyCert1') DROP CERTIFICATE MyCert1; -- Statement 1 CREATE CERTIFICATE MyCert1 WITH SUBJECT='My test'; SELECT * FROM [sys].[certificates] AS c WHERE name ='MyCert1'; -- Backup the certificate!!! Very important, don't loose it!!!-- BACKUP CERTIFICATE MyCert1 TO FILE ='E:SQLFilesSQL2012CertificatesMyCert1.cer' WITH PRIVATE KEY( FILE = 'E:SQLFilesSQL2012CertificatesMyCert1.key', ENCRYPTION BY PASSWORD='MyPassword1'); GO CREATE DATABASE EncryptedDatabaseTest GO USE [EncryptedDatabaseTest] GO -- Create the database encryption key CREATE DATABASE ENCRYPTION KEY WITH ALGORITHM = AES_128 ENCRYPTION BY SERVER CERTIFICATE MyCert1; --Turn encryption on! ALTER DATABASE [EncryptedDatabaseTest] SET ENCRYPTION ON; GO --Backup the database BACKUP DATABASE [EncryptedDatabaseTest] TO DISK = N'E:SQLFilesSQL2012BackupsEncryptedDatabaseTest.bak' WITH NOFORMAT, INIT, NAME = N'EncryptedDatabaseTest-Full Database Backup', SKIP, NOREWIND, NOUNLOAD, STATS = 10 GO USE master; GO DROP DATABASE [EncryptedDatabaseTest] DROP CERTIFICATE MyCert1; GO PRINT 'Restore certificate' -- restore the certificate from backup file CREATE CERTIFICATE MyCert1 FROM FILE = 'E:SQLFilesSQL2012CertificatesMyCert1.cer' WITH PRIVATE KEY (FILE = 'E:SQLFilesSQL2012CertificatesMyCert1.key', DECRYPTION BY PASSWORD='MyPassword1'); GO PRINT 'Restored certificate' SELECT * FROM [sys].[certificates] AS c WHERE name ='MyCert1'; -- STATEMENT 6 RESTORE DATABASE [EncryptedDatabaseTest] FROM DISK = N'E:SQLFilesSQL2012BackupsEncryptedDatabaseTest.bak' --check the encryption-- SELECT db.name, is_encrypted, encryptor_type, encryptor_thumbprint, c.name FROM sys.databases db INNER JOIN sys.dm_database_encryption_keys dek ON dek.database_id = db.database_id LEFT JOIN sys.certificates c ON dek.encryptor_thumbprint = c.thumbprint WHERE db.name = 'EncryptedDatabaseTest';
/Håkan Winther
Twitter: @h_winther