Wiki source code of sql-tde

Version 8.1 by Nikhil Singh on 2025/02/28 12:42

Show last authors
1 = TDE(backup from smss to azure) =
2
3
4 1 Create master key in master database (set master key)
5
6 2 Create TDE certificate (encrypted by MK)
7
8 3 Backup the Certificate and private key, By encryption with a password ( did not do it in this case due to storage blog problems)
9
10 4 Choose DB to create the DEK ,Create database encryption key (DEK) with algorithm ( AES= 256) and encryption by certificate
11
12 5 Set encryption on for the database
13
14
15 6 Create credential with SAS token
16
17 {{code language="sql"}}
18 drop credential [https://zagpebslab.blob.core.windows.net/sql-backups]
19 CREATE CREDENTIAL [https://zagpebslab.blob.core.windows.net/sql-backups]
20 WITH IDENTITY='SHARED ACCESS SIGNATURE'
21 , SECRET = 'sp=racwdli&st=2025-02-25T13:28:42Z&se=2026-02-25T21:28:42Z&spr=https&sv=2022-11-02&sr=c&sig=kBFwlj5S5eqBEE32LM1EFebBY0W94uEFiwOXo3R0yt4%3D'
22 GO
23
24 {{/code}}
25
26
27 7
28
29 {{code language="sql"}}
30 EXECUTE dba.dbo.DatabaseBackup
31 @Databases = @DatabaseName,
32 @URL = @BackupContainerURL,
33 @BackupType = 'Full',
34 @CopyOnly = 'Y',
35 @Compress = 'Y',
36 @Verify = 'N';
37 {{/code}}
38
39 The backup was unable to be done from smss to azure ( the MI does not support encrypted DBs to be backed up from smss to azure)
40
41 We have unencrypted a database and backed it up from ssms to azure blob successfully
42
43
44 Conclusion: Can be done with and unencrypted DB but not with an Encrypted one>
45
46
47
48
49
50 = **Using TDE directly from azure portal** =
51
52
53 ===== 1 Go to azure key vault ( DemoTestRudi) to generate a key =====
54
55
56 - Go to keys and click generate
57
58 - Name your key (mysqlmikey)
59
60 - Choose a key type (RSA)
61
62 -Choose RSA key size (2048-bit)
63
64 Note:
65
66 * switching from 2048-bit RSA to 4096-bit RSA for TDE will affect performance, but the actual impact might be minor, especially on modern hardware and typical workloads.
67 * **It will likely affect CPU usage** more than disk I/O, and the impact might be more noticeable during key management operations (key generation, encryption, etc.).
68 * If your database is not under heavy load and your hardware can handle the extra processing, the trade-off for better security may be worth it.
69
70 - Click create
71
72
73 [[image:image-20250228120622-1.png||height="236" width="542"]]
74
75
76 ===== 2 Enable TDE =====
77
78
79 - Go to your Managed instance ( sqlmi-ebs-lab)
80
81 - Click on security and choose Transparent data encryption
82
83 - Select the type of managed key ( Customer-managed key0
84
85 - Select the key from the key vault we generated in the key vault( mysqlmikey)
86
87 - Make the key the default TDE protector
88
89 -Click save
90
91
92 [[image:image-20250228122106-2.png||height="19" width="241"]]
93
94
95 - TDE has now been enabled on the Managed instance
96
97
98 Conclusion: All the databases have been encrypted by an asymmetric key. The key is the same for each database ( same encryption thumbprint).
99
100 We are now able to backup databases from SSMS to Azure storage.
101
102
103
104 === Backup specific databases using SQL server agent jobs ===
105
106
107 we are creating a job to automatically backup only the DBA databases in the instance via the SQL server agent.
108
109 The backup will be done daily at 3am. The backups will be backed up in the Azure storage account.
110
111
112 1 Create the script
113
114
115 === **1. Declaring Variables** ===
116
117 {{code language="sql"}}
118 DECLARE @DatabaseName NVARCHAR(128)
119 DECLARE @BackupContainerURL NVARCHAR(512)
120 {{/code}}
121
122 DECLARE @DatabaseName NVARCHAR(128) DECLARE @BackupContainerURL NVARCHAR(512)
123
124 * **@DatabaseName**: A variable to hold the name of the database during each iteration of the loop.
125 * **@BackupContainerURL**: A variable to store the URL of the Azure Blob Storage container where the database backups will be stored.
126
127 ----
128
129 === **2. Setting the Azure Blob Storage URL** ===
130
131 {{code language="sql"}}
132 SET @BackupContainerURL = 'https://<your_storage_account>.blob.core.windows.net/sql-backups/'
133 {{/code}}
134
135
136 ----
137
138 === **3. Declaring the Cursor** ===
139
140
141 {{code language="sql"}}
142 DECLARE db_cursor CURSOR FOR
143 SELECT name
144 FROM sys.databases
145 WHERE name LIKE 'dba%' -- Only pick databases that start with 'dba'
146 {{/code}}
147
148 * **Cursor Declaration**:
149 ** The cursor db_cursor is declared to loop through the list of databases in the sys.databases system view.
150 ** The **WHERE name LIKE 'dba%'** clause ensures that only databases with names starting with dba will be processed. For example, databases like dbaTest, dbaProd, etc., will be included in the loop.
151 ** **sys.databases**: A system catalog view that contains information about each database in the SQL Server instance.
152
153 ----
154
155 === **4. Opening the Cursor** ===
156
157 {{code language="sql"}}
158 OPEN db_cursor
159 FETCH NEXT FROM db_cursor INTO @DatabaseName
160 {{/code}}
161
162 OPEN db_cursor FETCH NEXT FROM db_cursor INTO @DatabaseName
163
164 * **OPEN db_cursor**: This opens the cursor for reading the results.
165 * **FETCH NEXT**: The FETCH NEXT statement retrieves the first database name that meets the LIKE 'dba%' condition and stores it in the @DatabaseName variable. This will be used in the next step where the backup procedure is executed.
166
167 ----
168
169 === **5. Looping Through Databases** ===
170
171 {{code language="sql"}}
172 -- Loop through each database and execute the stored procedure
173 WHILE @@FETCH_STATUS = 0
174 BEGIN
175 -- Print current database for logging/debugging
176 PRINT 'Backing up database: ' + @DatabaseName
177
178 -- Execute the DatabaseBackup stored procedure for each database
179 EXECUTE dba.dbo.DatabaseBackup
180 @Databases = @DatabaseName, -- Specify the current database
181 @URL = @BackupContainerURL, -- Azure Blob Storage URL
182 @BackupType = 'Full', -- Full backup type
183 @CopyOnly = 'Y', -- Use copy-only backup (this doesn’t affect the transaction log chain)
184 @Compress = 'Y', -- Enable compression
185 @Verify = 'N'; -- Skip verification after backup
186
187 {{/code}}
188
189
190 * **WHILE @@FETCH_STATUS = 0**: The loop will continue as long as the FETCH command successfully retrieves a database name. @@FETCH_STATUS is a system function that returns 0 if the fetch operation is successful.
191 * **PRINT**: This line prints the name of the database that is currently being backed up. It helps with logging or debugging purposes, as you can track which database is being processed at any given time.
192 * (((
193 **EXECUTE dba.dbo.DatabaseBackup**:
194
195 * This calls a stored procedure named dba.dbo.DatabaseBackup for each database.
196 * The parameters passed to the stored procedure:
197 ** **@Databases = @DatabaseName**: Specifies which database to back up (the current database being processed).
198 ** **@URL = @BackupContainerURL**: Specifies the destination Azure Blob Storage URL.
199 ** **@BackupType = 'Full'**: Specifies the backup type, which is a **Full** backup (this means all data in the database is backed up).
200 ** **@CopyOnly = 'Y'**: Specifies that this is a **copy-only backup**. This ensures that the backup does not affect the transaction log chain and does not interfere with regular backups.
201 ** **@Compress = 'Y'**: Enables compression of the backup, reducing the size of the backup file.
202 ** **@Verify = 'N'**: Specifies that the backup verification step should be skipped. (Verification can be added if needed for additional safety.)
203 )))
204
205 ----
206
207 === **6. Fetch the Next Database** ===
208
209 {{code language="sql"}}
210 -- Fetch the next database in the cursor
211 FETCH NEXT FROM db_cursor INTO @DatabaseName
212
213 {{/code}}
214
215 ~-~- Fetch the next database in the cursor FETCH NEXT FROM db_cursor INTO @DatabaseName
216
217 * **FETCH NEXT**: After executing the backup for the current database, this statement retrieves the next database from the cursor and stores it in the @DatabaseName variable. The loop will continue until all matching databases have been processed.
218
219 ----
220
221 === **7. Closing and Deallocating the Cursor** ===
222
223 {{code language="sql"}}
224 -- Close and deallocate the cursor to clean up resources
225 CLOSE db_cursor
226 DEALLOCATE db_cursor
227
228
229 {{/code}}
230
231 * **CLOSE db_cursor**: This closes the cursor once the loop finishes processing all databases.
232 * **DEALLOCATE db_cursor**: This deallocates the cursor, freeing up any resources used by the cursor. It’s a good practice to always deallocate cursors to avoid resource leaks.
233
234
235 ===== 8. Full Script =====
236
237
238 {{code language="sql"}}
239 DECLARE @DatabaseName NVARCHAR(128)
240 DECLARE @BackupContainerURL NVARCHAR(512)
241
242 SET @BackupContainerURL = 'https://zagpebslab.blob.core.windows.net/sql-backups'
243
244 DECLARE db_cursor CURSOR FOR
245 SELECT name
246 FROM sys.databases
247 WHERE name LIKE 'dba%'
248
249 OPEN db_cursor
250 FETCH NEXT FROM db_cursor INTO @DatabaseName
251
252 WHILE @@FETCH_STATUS = 0
253 BEGIN
254
255 PRINT 'Backing up database: ' + @DatabaseName
256
257 EXECUTE dba.dbo.DatabaseBackup
258 @Databases = @DatabaseName,
259 @URL = @BackupContainerURL,
260 @BackupType = 'Full',
261 @CopyOnly = 'Y',
262 @Compress = 'Y',
263 @Verify = 'N';
264
265 FETCH NEXT FROM db_cursor INTO @DatabaseName
266 END
267
268 CLOSE db_cursor
269 DEALLOCATE db_cursor
270
271 {{/code}}
272
273
274 === 2. Set up a new job ===
275
276
277 - Go to SSMS and click on SQL Server Agent
278
279 Drop down menu and left click jobs and select new job
280
281
282 ====== General: ======
283
284 - Enter Job name (DBA databases backup)
285
286 -  Owner (ebssqladmin)
287
288 -  Category (Database maintenance)
289
290 - Description (Description of the job)
291
292
293 ====== Steps: Create the steps for the job to follow ======
294
295 - Step name (Backup only DBA database)
296
297 - Type (Transact-SQL script)
298
299 - Database (master)
300
301 - Command (paste the script we created)
302
303
304 Schedule: Create a schedule for the job to run
305
306 - Name (DBA database backup)
307
308 - Schedule Type (recurring)
309
310 - Frequency (Occurs: Daily)
311
312 (Recurs every: 1 day(s))
313
314
315
316
317
318
319
320
321
322 1 CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'YourStrongPasswordHere!';
323 GO
324
325 CREATE CERTIFICATE TDE_Certificate
326 WITH SUBJECT = 'TDE Certificate';
327 GO
328
329 2 USE master;
330 GO
331
332 SELECT
333 cert.name AS Certificate_Name,
334 cert.subject AS Certificate_Subject,
335 cert.issuer_name AS Issuer_Name,
336 cert.pvt_key_encryption_type AS Private_Key_Encryption_Type
337 FROM
338 sys.certificates cert
339 WHERE
340 cert.name LIKE 'TDE%';
341
342
343 3 BACKUP CERTIFICATE TDE_Certificate
344 TO FILE = https://zagpebslab.blob.core.windows.net/sql-backups?sp=racwl&st=2025-02-25T13:28:42Z&se=2026-02-25T21:28:42Z&spr=https&sv=2022-11-02&sr=c&sig=eQKxB%2F0bg5cX71PmhUTlGHLCnIwSbe5CLOWVVkaDR1g%3D\TDE_Certificate.cer'
345 WITH PRIVATE KEY (
346 FILE = https://zagpebslab.blob.core.windows.net/sql-backups?sp=racwl&st=2025-02-25T13:28:42Z&se=2026-02-25T21:28:42Z&spr=https&sv=2022-11-02&sr=c&sig=eQKxB%2F0bg5cX71PmhUTlGHLCnIwSbe5CLOWVVkaDR1g%3D\TDE_PrivateKey.pvk',
347 ENCRYPTION BY PASSWORD = 'AnotherStrongPasswordHere!'
348 );
349 GO
350
351
352 USE Normal;
353 GO
354
355 -- 6. Create a Database Encryption Key (DEK) and encrypt it with the TDE certificate
356 CREATE DATABASE ENCRYPTION KEY
357 WITH ALGORITHM = AES_256
358 ENCRYPTION BY SERVER CERTIFICATE TDE_Certificate;
359 GO--
360
361 USE [dba]
362 GO
363
364 CREATE DATABASE ENCRYPTION KEY
365 WITH ALGORITHM = AES_256
366 ENCRYPTION BY SERVER CERTIFICATE TDE_Certificate;
367 GO
368
369
370 USE [dba1]
371 GO
372
373 CREATE DATABASE ENCRYPTION KEY
374 WITH ALGORITHM = AES_256
375 ENCRYPTION BY SERVER CERTIFICATE TDE_Certificate;
376 GO
377
378
379 USE [dba2]
380 GO
381
382 CREATE DATABASE ENCRYPTION KEY
383 WITH ALGORITHM = AES_256
384 ENCRYPTION BY SERVER CERTIFICATE TDE_Certificate;
385 GO
386
387
388 USE [dba3]
389 GO
390
391 CREATE DATABASE ENCRYPTION KEY
392 WITH ALGORITHM = AES_256
393 ENCRYPTION BY SERVER CERTIFICATE TDE_Certificate;
394 GO
395
396 USE [xwiki]
397 GO
398
399 CREATE DATABASE ENCRYPTION KEY
400 WITH ALGORITHM = AES_256
401 ENCRYPTION BY SERVER CERTIFICATE TDE_Certificate;
402 GO
403
404
405 -- 7. Enable Transparent Data Encryption (TDE) on the database
406 ALTER DATABASE dba
407 SET ENCRYPTION ON;
408 GO--
409
410
411 select name, database_id, state_desc
412 from sys.databases
413
414
415 SELECT
416 database_id,
417 key_algorithm,
418 key_length,
419 encryption_state_desc
420 encryptor_type
421
422 FROM
423 sys.dm_database_encryption_keys;
424
425
426 Select * from sys.dm_database_encryption_keys
427
428
429 BACKUP DATABASE [dba2]
430 TO URL = '[[https:~~/~~/zagpebslab.blob.core.windows.net/sql-backups?sp=racwl&st=2025-02-25T13:28:42Z&se=2026-02-25T21:28:42Z&spr=https&sv=2022-11-02&sr=c&sig=eQKxB%2F0bg5cX71PmhUTlGHLCnIwSbe5CLOWVVkaDR1g%3D'>>https://zagpebslab.blob.core.windows.net/sql-backups?sp=racwl&st=2025-02-25T13:28:42Z&se=2026-02-25T21:28:42Z&spr=https&sv=2022-11-02&sr=c&sig=eQKxB%2F0bg5cX71PmhUTlGHLCnIwSbe5CLOWVVkaDR1g%3D']]
431 With copy_only
432 GO
433
434
435 BACKUP DATABASE [dba2]
436 TO URL = '[[https:~~/~~/zagpebslab.blob.core.windows.net/sql-backups?sp=racwl&st=2025-02-25T13:28:42Z&se=2026-02-25T21:28:42Z&spr=https&sv=2022-11-02&sr=c&sig=eQKxB%2F0bg5cX71PmhUTlGHLCnIwSbe5CLOWVVkaDR1g%3D'>>https://zagpebslab.blob.core.windows.net/sql-backups?sp=racwl&st=2025-02-25T13:28:42Z&se=2026-02-25T21:28:42Z&spr=https&sv=2022-11-02&sr=c&sig=eQKxB%2F0bg5cX71PmhUTlGHLCnIwSbe5CLOWVVkaDR1g%3D']],
437 \\ COPY_ONLY, -- Ensures the backup does not affect the regular backup chain
438 COMPRESSION,  -- Optional: Compresses the backup to save storage space
439 STATS = 10 -- Optional: Provides backup progress status
440 GO--
441
442
443
444 -- Step 1: Drop the existing credential (if needed)
445 DROP CREDENTIAL [https://zagpebslab.blob.core.windows.net/sql-backups];
446 GO--
447
448 -- Step 2: Create a new credential with the SAS token
449 CREATE CREDENTIAL [https://zagpebslab.blob.core.windows.net/sql-backups]
450 WITH IDENTITY = 'SHARED ACCESS SIGNATURE',
451 SECRET = 'sp=racwdli&st=2025-02-25T13:28:42Z&se=2026-02-25T21:28:42Z&spr=https&sv=2022-11-02&sr=c&sig=kBFwlj5S5eqBEE32LM1EFebBY0W94uEFiwOXo3R0yt4%3D';
452 GO--
453
454 -- Step 3: Perform the database backup with the provided parameters
455 EXECUTE dba.dbo.DatabaseBackup
456 @Databases = 'dba',                          -- Replace with your database name
457 @URL = '[[https:~~/~~/zagpebslab.blob.core.windows.net/sql-backups'>>https://zagpebslab.blob.core.windows.net/sql-backups']], -- Azure Blob Storage URL
458 @BackupType = 'Full',                        -- Full backup
459 @CopyOnly = 'Y', -- Copy-only backup to avoid breaking backup chain
460 @Compress = 'Y',                             -- Compress the backup
461 @Verify = 'N'; -- No verification of backup
462 GO--
463
464
465
466
467
468 select name, database_id, state_desc
469 from sys.databases
470
471
472 SELECT
473 database_id,
474 key_algorithm,
475 key_length,
476 encryption_state_desc
477 encryptor_type
478
479 FROM
480 select * from sys.dm_database_encryption_keys;
481
482
483 select name, is_encrypted from sys.databases
484
485
486 SELECT
487 cert.name AS Certificate_Name,
488 cert.subject AS Certificate_Subject,
489 cert.issuer_name AS Issuer_Name,
490 cert.pvt_key_encryption_type AS Private_Key_Encryption_Type
491 FROM
492 sys.certificates cert
493 WHERE
494 cert.name LIKE 'TDE%';
495
496 ALTER DATABASE dba1
497 SET ENCRYPTION off;
498 GO
499
500
501 Use dba1;
502 DROP DATABASE ENCRYPTION KEY;
503
504
505 USE [dba1]
506 GO
507
508 CREATE DATABASE ENCRYPTION KEY
509 WITH ALGORITHM = AES_256
510 ENCRYPTION BY SERVER CERTIFICATE TDE_Certificate;
511 GO
512
513
514
515 ALTER DATABASE dba1
516 SET ENCRYPTION ON
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537 {{code language="sql"}}
538 USE master;
539 GO
540 CREATE MASTER KEY ENCRYPTION BY PASSWORD = '******';
541 GO
542
543 CREATE CERTIFICATE EBSphere_TDE_SQL2019_Cert WITH SUBJECT = 'Database_Encryption';
544 GO
545
546 BACKUP CERTIFICATE EBSphere_TDE_SQL2019_Cert TO FILE = 'D:\temp\EBSphere_TDE_SQL2019_Cert'
547 WITH PRIVATE KEY (file = 'D:\temp\EBSphere_TDE_SQL2019_Cert_Key.pvk',
548 ENCRYPTION BY PASSWORD='*****')
549
550 USE Everest_TDE_Master;
551 GO
552 CREATE DATABASE ENCRYPTION KEY
553 WITH ALGORITHM = AES_256
554 ENCRYPTION BY SERVER CERTIFICATE EBSphere_TDE_SQL2019_Cert;
555 GO
556 ALTER DATABASE Everest_TDE_Master
557 SET ENCRYPTION ON;
558 GO
559
560 USE Everest_TDE_Master_Documents;
561 GO
562 CREATE DATABASE ENCRYPTION KEY
563 WITH ALGORITHM = AES_256
564 ENCRYPTION BY SERVER CERTIFICATE EBSphere_TDE_SQL2019_Cert;
565 GO
566 ALTER DATABASE Everest_TDE_Master_Documents
567 SET ENCRYPTION ON;
568 GO
569 {{/code}}
570
571
572
573
574
575
576
577
578
579
580
581
582
583 {{code language="sql"}}
584 USE master;
585 GO
586 CREATE MASTER KEY ENCRYPTION BY PASSWORD = '******';
587 GO
588
589 CREATE CERTIFICATE EBSphere_TDE_SQL2019_Cert WITH SUBJECT = 'Database_Encryption';
590 GO
591
592 BACKUP CERTIFICATE EBSphere_TDE_SQL2019_Cert TO FILE = 'D:\temp\EBSphere_TDE_SQL2019_Cert'
593 WITH PRIVATE KEY (file = 'D:\temp\EBSphere_TDE_SQL2019_Cert_Key.pvk',
594 ENCRYPTION BY PASSWORD='*****')
595
596 USE Everest_TDE_Master;
597 GO
598 CREATE DATABASE ENCRYPTION KEY
599 WITH ALGORITHM = AES_256
600 ENCRYPTION BY SERVER CERTIFICATE EBSphere_TDE_SQL2019_Cert;
601 GO
602 ALTER DATABASE Everest_TDE_Master
603 SET ENCRYPTION ON;
604 GO
605
606 USE Everest_TDE_Master_Documents;
607 GO
608 CREATE DATABASE ENCRYPTION KEY
609 WITH ALGORITHM = AES_256
610 ENCRYPTION BY SERVER CERTIFICATE EBSphere_TDE_SQL2019_Cert;
611 GO
612 ALTER DATABASE Everest_TDE_Master_Documents
613 SET ENCRYPTION ON;
614 GO
615 {{/code}}
616
617
618
619