Changes for page sql-tde
Last modified by Nikhil Singh on 2026/07/03 08:32
Change comment:
There is no comment for this version
Summary
-
Page properties (1 modified, 0 added, 0 removed)
-
Objects (0 modified, 0 added, 1 removed)
Details
- Page properties
-
- Content
-
... ... @@ -1,324 +1,5 @@ 1 -= TDE( backup from smss to azure) =1 += TDE(1) = 2 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 322 1 CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'YourStrongPasswordHere!'; 323 323 GO 324 324 ... ... @@ -329,18 +329,18 @@ 329 329 2 USE master; 330 330 GO 331 331 332 -SELECT 13 +SELECT 333 333 cert.name AS Certificate_Name, 334 334 cert.subject AS Certificate_Subject, 335 335 cert.issuer_name AS Issuer_Name, 336 336 cert.pvt_key_encryption_type AS Private_Key_Encryption_Type 337 -FROM 18 +FROM 338 338 sys.certificates cert 339 -WHERE 20 +WHERE 340 340 cert.name LIKE 'TDE%'; 341 341 342 342 343 -3 BACKUP CERTIFICATE TDE_Certificate24 +3 BACKUP CERTIFICATE TDE_Certificate 344 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 345 WITH PRIVATE KEY ( 346 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', ... ... @@ -356,7 +356,7 @@ 356 356 CREATE DATABASE ENCRYPTION KEY 357 357 WITH ALGORITHM = AES_256 358 358 ENCRYPTION BY SERVER CERTIFICATE TDE_Certificate; 359 -GO --40 +GO 360 360 361 361 USE [dba] 362 362 GO ... ... @@ -405,7 +405,7 @@ 405 405 -- 7. Enable Transparent Data Encryption (TDE) on the database 406 406 ALTER DATABASE dba 407 407 SET ENCRYPTION ON; 408 -GO --89 +GO 409 409 410 410 411 411 select name, database_id, state_desc ... ... @@ -412,14 +412,14 @@ 412 412 from sys.databases 413 413 414 414 415 -SELECT 96 +SELECT 416 416 database_id, 417 417 key_algorithm, 418 418 key_length, 419 419 encryption_state_desc 420 - encryptor_type101 + encryptor_type 421 421 422 -FROM 103 +FROM 423 423 sys.dm_database_encryption_keys; 424 424 425 425 ... ... @@ -426,40 +426,41 @@ 426 426 Select * from sys.dm_database_encryption_keys 427 427 428 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']]110 + BACKUP DATABASE [dba2] 111 +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' 431 431 With copy_only 432 432 GO 433 433 434 434 435 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 117 +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', 118 + 119 + COPY_ONLY, -- Ensures the backup does not affect the regular backup chain 120 + COMPRESSION, -- Optional: Compresses the backup to save storage space 439 439 STATS = 10 -- Optional: Provides backup progress status 440 -GO --122 +GO 441 441 442 442 443 443 444 444 -- Step 1: Drop the existing credential (if needed) 445 445 DROP CREDENTIAL [https://zagpebslab.blob.core.windows.net/sql-backups]; 446 -GO --128 +GO 447 447 448 448 -- Step 2: Create a new credential with the SAS token 449 449 CREATE CREDENTIAL [https://zagpebslab.blob.core.windows.net/sql-backups] 450 450 WITH IDENTITY = 'SHARED ACCESS SIGNATURE', 451 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 --134 +GO 453 453 454 454 -- Step 3: Perform the database backup with the provided parameters 455 455 EXECUTE dba.dbo.DatabaseBackup 456 - @Databases = 'dba', -- Replace with your database name457 - @URL = ' [[https:~~/~~/zagpebslab.blob.core.windows.net/sql-backups'>>https://zagpebslab.blob.core.windows.net/sql-backups']], -- Azure Blob Storage URL458 - @BackupType = 'Full', -- Full backup138 + @Databases = 'dba', -- Replace with your database name 139 + @URL = 'https://zagpebslab.blob.core.windows.net/sql-backups', -- Azure Blob Storage URL 140 + @BackupType = 'Full', -- Full backup 459 459 @CopyOnly = 'Y', -- Copy-only backup to avoid breaking backup chain 460 - @Compress = 'Y', -- Compress the backup142 + @Compress = 'Y', -- Compress the backup 461 461 @Verify = 'N'; -- No verification of backup 462 -GO --144 +GO 463 463 464 464 465 465 ... ... @@ -469,14 +469,14 @@ 469 469 from sys.databases 470 470 471 471 472 -SELECT 154 +SELECT 473 473 database_id, 474 474 key_algorithm, 475 475 key_length, 476 476 encryption_state_desc 477 - encryptor_type159 + encryptor_type 478 478 479 -FROM 161 +FROM 480 480 select * from sys.dm_database_encryption_keys; 481 481 482 482 ... ... @@ -483,17 +483,17 @@ 483 483 select name, is_encrypted from sys.databases 484 484 485 485 486 - SELECT 168 + SELECT 487 487 cert.name AS Certificate_Name, 488 488 cert.subject AS Certificate_Subject, 489 489 cert.issuer_name AS Issuer_Name, 490 490 cert.pvt_key_encryption_type AS Private_Key_Encryption_Type 491 -FROM 173 +FROM 492 492 sys.certificates cert 493 -WHERE 175 +WHERE 494 494 cert.name LIKE 'TDE%'; 495 495 496 - ALTER DATABASE dba1178 + ALTER DATABASE dba1 497 497 SET ENCRYPTION off; 498 498 GO 499 499 ... ... @@ -534,39 +534,10 @@ 534 534 535 535 536 536 537 -{{code language="sql"}} 538 -USE master; 539 -GO 540 -CREATE MASTER KEY ENCRYPTION BY PASSWORD = '******'; 541 -GO 542 542 543 -CREATE CERTIFICATE EBSphere_TDE_SQL2019_Cert WITH SUBJECT = 'Database_Encryption'; 544 -GO 545 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 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 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 570 571 571 572 572 ... ... @@ -579,7 +579,6 @@ 579 579 580 580 581 581 582 - 583 583 {{code language="sql"}} 584 584 USE master; 585 585 GO ... ... @@ -613,7 +613,3 @@ 613 613 SET ENCRYPTION ON; 614 614 GO 615 615 {{/code}} 616 - 617 - 618 - 619 -
- XWiki.XWikiComments[0]
-
- Author
-
... ... @@ -1,1 +1,0 @@ 1 -XWiki.rudim - Comment
-
... ... @@ -1,1 +1,0 @@ 1 -put the sql code in code tags to start with otherwise its very hard to read - Date
-
... ... @@ -1,1 +1,0 @@ 1 -2025-02-26 16:00:04.223