譯:如何成功恢復TDE加密過的資料庫

来源:https://www.cnblogs.com/wy123/archive/2023/08/30/17666272.html
-Advertisement-
Play Games

原文地址: https://www.mssqltips.com/sqlservertip/3572/recovering-a-sql-server-tde-encrypted-database-successfully/ 問題: 我的任務是在具有敏感信息的SQL Server資料庫上設置透明數據加密 ...


原文地址: https://www.mssqltips.com/sqlservertip/3572/recovering-a-sql-server-tde-encrypted-database-successfully/

 

問題:

我的任務是在具有敏感信息的SQL Server資料庫上設置透明數據加密(TDE)。在我看到的示例中,我知道我需要主資料庫中的主密鑰,然後需要用該主密鑰加密的證書。 一個浮現在腦海中的問題是,如果我選擇將資料庫恢復到不同的伺服器上我的資料庫主密鑰是否必須具有相同的密碼? 我見過的每個例子都包含相同的密碼。為了成功還原,我還需要計劃些什麼?

解決方案:

為SQL Server資料庫啟用TDE加密是一個簡單的過程。它包括: 1,在主資料庫中創建資料庫主密鑰master key。 2,創建由該密鑰master key加密的證書。 3,備份證書和證書的私鑰。雖然加密資料庫不需要這樣做,但您希望立即這樣做。(譯者註:為了在別的機器上還原加密後的資料庫,必須要有證書以及證書的私鑰) 4,在(用戶自定義)資料庫中創建由證書加密的密鑰。 5,修改資料庫以開啟加密。 如果您正在閱讀本文並且不熟悉版本要求,那麼TDE僅適用於Microsoft SQL Server的企業版(譯者註:自SQLServer 2017開始,企業版,標準版 web版均支持TDE )。  

使用TDE創建新的SQL Server資料庫

讓我們用下麵的代碼設置一個示例資料庫:
USE [master];
GO 

-- Create the database master key
-- to encrypt the certificate
CREATE MASTER KEY
  ENCRYPTION BY PASSWORD = 'FirstServerPassw0rd!';
GO 

-- Create the certificate we're going to use for TDE
CREATE CERTIFICATE TDECert
  WITH SUBJECT = 'TDE Cert for Test';
GO 

-- Back up the certificate and its private key
-- Remember the password!
BACKUP CERTIFICATE TDECert
  TO FILE = N'C:\SQLBackups\TDECert.cer'
  WITH PRIVATE KEY ( 
    FILE = N'C:\SQLBackups\TDECert_key.pvk',
 ENCRYPTION BY PASSWORD = 'APrivateKeyP4ssw0rd!'
  );
GO

-- Create our test database
CREATE DATABASE [RecoveryWithTDE];
GO 

-- Create the DEK so we can turn on encryption
USE [RecoveryWithTDE];
GO 

CREATE DATABASE ENCRYPTION KEY
  WITH ALGORITHM = AES_256
  ENCRYPTION BY SERVER CERTIFICATE TDECert;
GO 

-- Exit out of the database. If we have an active 
-- connection, encryption won't complete.
USE [master];
GO 

-- Turn on TDE
ALTER DATABASE [RecoveryWithTDE]
  SET ENCRYPTION ON;
GO 

這將啟動資料庫上的加密過程。請註意我為資料庫主密鑰指定的密碼。正如所暗示的那樣,當我們在第二台伺服器上執行恢復時我將使用不同的密碼,不需要擁有相同的密碼,但需要擁有相同的證書,我們將在查看恢復過程中的“陷阱”時瞭解這一點。即使在基本為空的資料庫上,加密資料庫也需要幾秒鐘的時間。可以通過以下查詢查詢加密的狀態:

-- We're looking for encryption_state = 3
-- Query periodically until you see that state
-- It shouldn't take long
SELECT DB_Name(database_id) AS 'Database', encryption_state 
FROM sys.dm_database_encryption_keys;
正如註釋所示,我們希望資料庫顯示狀態為3,這意味著加密已經完成。下麵是你應該看到的一個例子:

 當encryption_state顯示為3時,您應該對資料庫進行備份,因為我們將需要它來恢復到第二台伺服器(您的路徑可能不同):

-- Now backup the database so we can restore it
-- Onto a second server
BACKUP DATABASE [RecoveryWithTDE]
TO DISK = N'C:\SQLBackups\RecoveryWithTDE_Full.bak';
GO 
現在我們有了備份,讓我們將該備份恢復到SQL Server的另一個實例。  

Failed Restore - No Key, No Certificate

恢復受TDE保護的資料庫的第一種情況是,我們嘗試進行恢復,但沒有任何加密塊被恢復。我們沒有資料庫主密鑰,當然也沒有證書。 這就是為什麼TDE是偉大的。如果沒有這些部分,恢復就無法工作。讓我們嘗試恢復(註意:您的路徑可能不同):
-- Attempt the restore without the certificate installed
RESTORE DATABASE [RecoveryWithTDE]
  FROM DISK = N'C:\SQLBackups\RecoveryWithTDE_Full.bak'
  WITH MOVE 'RecoveryWithTDE' TO N'C:\SQLData\RecoveryWithTDE_2ndServer.mdf',
       MOVE 'RecoveryWithTDE_log' TO N'C:\SQLData\RecoveryWithTDE_2ndServer_log.mdf';
GO
這將會失敗。下麵是嘗試恢復時應該看到的內容:

當SQL Server嘗試恢復時,它會意識到它需要一個證書,一個特定的證書。由於證書不存在,因此恢復失敗。  

Failed Restore - The Same Certificate Name, But Not the Same Certificate

第二種情況是存在資料庫主密鑰,並且存在與第一個伺服器(甚至是相同的主題)名稱相同的證書,但它不是來自第一個伺服器的證書。讓我們設置並嘗試恢復:
-- Let's create the database master key and a certificate with the same name
-- But not from the files. Note the difference in passwords
CREATE MASTER KEY
  ENCRYPTION BY PASSWORD = 'SecondServerPassw0rd!';
GO 

-- Though this certificate has the same name, the restore won't work
CREATE CERTIFICATE TDECert
  WITH SUBJECT = 'TDE Cert for Test';
GO 

-- Since we don't have the corrected certificate, this will fail, too.
RESTORE DATABASE [RecoveryWithTDE]
  FROM DISK = N'C:\SQLBackups\RecoveryWithTDE_Full.bak'
  WITH MOVE 'RecoveryWithTDE' TO N'C:\SQLData\RecoveryWithTDE_2ndServer.mdf',
       MOVE 'RecoveryWithTDE_log' TO N'C:\SQLData\RecoveryWithTDE_2ndServer_log.mdf';
GO

請註意資料庫主密鑰密碼(與第一臺機器上的主密鑰密碼)是的不同,這兩個主密鑰的密碼這是不同的,但這不是我們在恢復中失敗的原因。和之前的情況一樣,我們沒有正確的證書。結果,您將得到與前一種情況相同的錯誤。

Failed Restore - The Right Certificate, but Without the Private Key

下一個場景是完成證書恢復,但沒有私鑰。這也將失敗。但是,在嘗試T-SQL代碼之前,可能必須修複證書文件和私鑰文件上的文件許可權。如果您試圖在與第一個實例位於同一系統上的SQL Server實例上執行恢復,則可能會出現這種情況。 為了確保第二個實例可以訪問這些文件,請轉到文件的位置並調出文件屬性(右鍵單擊文件,然後從彈出菜單中選擇properties)。單擊“安全”選項卡,然後單擊“高級”按鈕。當SQL Server寫這些文件時,它可能破壞了許可權的繼承,我們將修複這個問題。

 這將出現一個不同的界面,您應該查看許可權選項卡。如果您看到它,請單擊Continue按鈕。如果UAC打開,你會看到它。

 現在您將打繼承選項。註意我圈出來的東西。如果框未選中,如下圖所示,這意味著取消繼承。如果您的文件就是這種情況,請單擊覆選框,併在每個介面單擊OK以重新打開繼承。

 現在讓我們嘗試恢復證書,但故意忘記使用私鑰進行恢復。在從文件創建證書之前,必須先刪除剛剛創建的證書。

-- Let's drop the certificate and do the restore of it...
-- But without the private key
DROP CERTIFICATE TDECert;
GO 

-- Restoring the certificate, but without the private key.
CREATE CERTIFICATE TDECert
  FROM FILE = 'C:\SQLBackups\TDECert.cer'
GO

-- We have the correct certificate, but not the private key.
-- This should fail as well.
RESTORE DATABASE [RecoveryWithTDE]
  FROM DISK = N'C:\SQLBackups\RecoveryWithTDE_Full.bak'
  WITH MOVE 'RecoveryWithTDE' TO N'C:\SQLData\RecoveryWithTDE_2ndServer.mdf',
       MOVE 'RecoveryWithTDE_log' TO N'C:\SQLData\RecoveryWithTDE_2ndServer_log.mdf';
GO

我們有正確的證書,但是沒有私鑰,SQL Server不能用它來解密資料庫。結果,我們得到一個不同的錯誤,告訴我們這個鍵有問題。錯誤提示密鑰似乎已損壞,但我們知道真正的問題:我們沒有恢復密鑰。

 

The Successful Restore

為了執行成功的恢復,我們需要主資料庫中的資料庫主密鑰,我們需要恢復用於加密資料庫的證書,但我們需要確保使用私鑰恢復它。以核對錶形式: 1,在主資料庫中有一個資料庫主密鑰master key。 2,用於加密資料庫的證書將與其私鑰一起恢復(譯者註:還原證書時需要與創建證書時的私鑰的密碼一致,也即 DECRYPTION BY PASSWORD必須與創建證書時一致,否則無法還原證書)。 3,完成資料庫恢復。 既然有了資料庫主密鑰master key,那麼讓我們執行最後兩個步驟。當然,由於我們必須清除以前的證書,我們將在我們發出的命令中有一個刪除證書:
-- Let's do this one more time. This time, with everything,
-- Including the private key.
DROP CERTIFICATE TDECert;
GO 

-- Restoring the certificate, but without the private key.
CREATE CERTIFICATE TDECert
  FROM FILE = 'C:\SQLBackups\TDECert.cer'
  WITH PRIVATE KEY ( 
    FILE = N'C:\SQLBackups\TDECert_key.pvk',
 DECRYPTION BY PASSWORD = 'APrivateKeyP4ssw0rd!'
  );
GO

-- We have the correct certificate and we've also restored the 
-- private key. Now everything should work. Finally!
RESTORE DATABASE [RecoveryWithTDE]
  FROM DISK = N'C:\SQLBackups\RecoveryWithTDE_Full.bak'
  WITH MOVE 'RecoveryWithTDE' TO N'C:\SQLData\RecoveryWithTDE_2ndServer.mdf',
       MOVE 'RecoveryWithTDE_log' TO N'C:\SQLData\RecoveryWithTDE_2ndServer_log.mdf';
GO

一切就緒,我們終於成功了!

如果在執行恢復時沒有看到升級步驟消息,請不要驚慌。 對於這個例子,我在SQL Server 2008 R2實例上創建了初始資料庫,並將其恢復到SQL Server 2014實例上。 因此,如果您有關於是否可以將受TDE保護的資料庫恢復到不同版本的SQL Server的問題,那麼答案是肯定的,只要新實例運行的是企業版,並且新實例具有相同或更高版本的SQL Server(包括服務包、累積更新和任何熱修複程式/補丁)。

第二個要求不應該令人驚訝,因為這是將資料庫恢復到不同伺服器的標準要求。

 

Next Steps

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 本文探討了進程調度的原理和演算法,並提供了全面的概述。進程調度是操作系統中的重要組成部分,用於決定進程的執行順序和分配CPU時間。我們討論了優先順序調度和時間片輪轉調度演算法。優先順序調度根據進程的優先順序確定執行順序,可以分為搶占式和非搶占式。時間片輪轉調度將CPU時間劃分為固定大小的時間片,每個進程在一個... ...
  • ![](https://img2023.cnblogs.com/blog/3076680/202308/3076680-20230829150945972-2083299480.png) # 1. 精心設計的應用程式通常會在保持實現細節私有的同時公開公有介面,以便未來在不影響最終用戶的情況下修改設計 ...
  • 眾所周知,Mysql的事務隔離級別分為4個,分別是READ-UNCOMMITED,READ-COMMITED,REPEATABLE-READ,SERIALIZABLE,在常規資料庫概論中,前三種事務隔離級別會帶來臟讀、不可重覆讀、幻讀的問題,對應關係如下: ||臟讀|不可重覆讀|幻讀 | | | | ...
  • MySQL 到 SelectDB 的實時數據同步技術,通過 NineData 的數據複製控制台,僅需輕點滑鼠,即可輕鬆完成 MySQL 到 SelectDB 的同步任務配置。NineData 採用先進的數據同步技術,確保數據實時同步到 SelectDB,極大地降低了數據延遲,讓您的決策基於最新數據。 ...
  • 在這個燥熱的夏天,又突然收到告警,分庫分表的主鍵衝突了,這還能忍?不,堅決不能忍,必須解決掉!後面咱們慢慢道來是如何破局的,如何走了一條坎坷路…… ...
  • - 0.寫在前面 - 1.準備工作 - 1.1 準備Docker環境 - 1.2 下載源碼包 - 1.3 修改MySQL Shell源碼包 - 1.4 編譯相關軟體包 - 2.準備編譯MySQL Shell - 2.1 編譯MySQL 8.0.32 - 2.2 編譯MySQL Shell 8.0.3 ...
  • 今天來說一個老生常談的問題,來看一個實際案例:業務中往往都會通過緩存來提高查詢效率,降低資料庫的壓力,尤其是在分散式高併發場景下,大量的請求直接訪問Mysql很容易造成性能問題。 ...
  • 在mybatis的xml中使用MySQL的`DATE_FORMAT` 函數可以將日期類型的數據格式化為字元串。然而,儘管這個函數很方便,但在處理大量數據時可能會引起性能問題,特別是在複雜查詢中。這是因為 `DATE_FORMAT` 函數的計算是在資料庫引擎層級進行的,而不是在應用程式代碼中。 以下是 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...