1. 程式人生 > >SQL Server 安全篇——SQL Server加密(1)——加密概念

SQL Server 安全篇——SQL Server加密(1)——加密概念

    加密是一種使用金鑰和證書的演算法來混淆資料的過程。如果沒有金鑰和證書,即使得到了資料,也無法得知資料的本來面貌,資料就沒有價值了。但是由於加解密本身就是一種非常耗資源(特別是CPU跟I/O )的計算操作,同時加密後的資料本質上會增大,所以也往往會帶來效能的下降。所以一般都只能按需使用。

    SQL Server到2016為止,加入了很多種加密技術,比如TDE、cell-level加密和始終加密,下面來介紹一下加密的概念。為後續講解做鋪墊。

常規加密概念:

縱深防禦:

    Defense-in-Depth ,是一種橫跨整個IT範圍的技術,本質就是多層防禦。比如企業會有外圍網路防火牆,內網防火牆等。在SQL Server層,通常使用加密技術來實現這種訪問控制策略。換句話來說,加密通過增加額外的防禦層來實現提高縱深防禦能力。

對稱金鑰:

     Symmetric Keys,雖然是“鑰匙”,但是本質就是加密資料的演算法。並且是加密中最弱的演算法,因為使用相同的演算法來加解密資料。不過即使是最弱的演算法,也能增加縱深防禦的能力,畢竟不是每個攻擊者都是頂級的。對於對稱金鑰,可以使用密碼或者另一個金鑰甚至一個證書來加密。

非對稱金鑰:

    Asymmetric Keys,跟對稱金鑰相對,它使用一對金鑰(演算法),一個加密一個解密,加密的金鑰稱為私鑰(private key),解密的金鑰稱為公鑰(public key)。

證書:

    Certificates,證書由受信任的源 (稱為證書頒發機構 (CA)) 頒發。使用的是非對稱金鑰,但是也提供將公鑰繫結到主體或裝置 (其中包含相應私鑰) 的數字簽名語句。

自簽名證書:

     Self-Signed Certificate,自簽名證書是由其身份證明相同的實體簽署的證書。可以由 SQL Server 建立。

Windows 資料保護API:

 Windows Data Protection API ( DPAPI) ,是與 Windows 作業系統一起執行的加密應用程式程式設計介面 (API)。可以使用使用者安全資訊或者域安全資訊來加密金鑰。DPAPI用於加密服務主金鑰(service master key),服務主金鑰在SQL Server中是高層加密,下面將介紹一下SQL Server加密概念。

SQL Server 加密概念:

    SQL Server加密功能依賴於金鑰和證書的層次結構。層面的根是服務主金鑰(service master key),接下來介紹一下主金鑰(master key)和EKM(Extensible Key Management)及SQL Server的加密層級。

主金鑰:

    master keys,服務主金鑰在例項安裝後自動建立,用於加密資料庫主金鑰、憑證(credentials)和使用DPAPI的連結伺服器的金鑰。在每個例項中有且僅有一個服務主金鑰,從SQL 2012開始,服務主金鑰是由AES 256演算法產生的一個對稱金鑰,在此之前使用Triple DES演算法產生。因此如果從2008R2或者更低階的版本升級例項,最好重新生成金鑰。但是這會導致現有的加密層次結構解密並重新加密。也就是說所有由主金鑰加密的金鑰和證書需要解密和重新加密。這個操作非常耗時。

    對於重新產生服務主金鑰,可以使用下面語句來實現。如果某些操作失敗,可以使用FORCE關鍵字強制錯誤後繼續執行:

ALTER SERVICE MASTER KEY REGENERATE ; 
    由於這個金鑰極其重要,所以在建立或者重建後必須進行備份。並且儲存在安全的地方,用於災難恢復,也可以用來遷移例項時避免加密相關的問題。備份還原服務主金鑰可以使用下面指令碼:
--備份服務主金鑰
BACKUP SERVICE MASTER KEY 
TO FILE = 'c:\keys\service_master_key' 
ENCRYPTION BY PASSWORD = 'Pa$$w0rd' ; 
--還原服務主金鑰
RESTORE SERVICE MASTER KEY 
FROM FILE = 'c:\keys\service_master_key' 
DECRYPTION BY PASSWORD = 'Pa$$ w0rd ' ; 
注意上面c:\keys\後面的service_master_key是金鑰檔案不是目錄。並且沒有後綴名。

    資料庫主金鑰也是一個對稱金鑰,由AES 256演算法加密。服務主金鑰用來加密私鑰和證書並存儲在某個資料庫中。資料庫主金鑰使用密碼來加密,但是會建立一個副本,使用服務主金鑰加密,這樣使得在需要時可以自動開啟服務主金鑰,如果副本不存在,則要手動開啟。如果副本不存在或已損壞, 則需要顯式開啟金鑰, 以便您使用層次結構 (使用服務主金鑰加密的金鑰)下面的金鑰。服務主金鑰的副本儲存在資料庫和主資料庫中。

    所以在備份服務主金鑰的同時,也不要忘記備份資料庫主金鑰,因為金鑰丟失意味著資料丟失。極端情況下可能全庫不可用。下面來演示一下對AdventureWorks2016資料庫建立一個數據庫主金鑰,然後備份及還原。跟服務主金鑰一樣,可以使用FORCE關鍵字來強制在失敗後繼續,但是有丟失資料的風險。

USE  AdventureWorks2016 
GO 
--建立資料庫主金鑰,使用密碼加密
CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'Pa$$w0rd' ; 
--備份金鑰到C盤keys資料夾,備份需要提供密碼
BACKUP MASTER KEY TO FILE = 'c:\keys\DB_master_key' 
ENCRYPTION BY PASSWORD = 'Pa$$w0rd'; 
--還原金鑰,需要提供密碼才能還原(進行解密操作),然後再用這個金鑰(帶有密碼)在庫內加密
RESTORE MASTER KEY 
FROM FILE = 'c:\keys\DB_master_key' 
DECRYPTION BY PASSWORD = 'Pa$$w0rd'  
ENCRYPTION BY PASSWORD = 'Pa$$w0rd' 


EKM和金鑰儲存:

    Extensible Key Management,允許生成和管理用於在第三方硬體安全模組(Hardware Security Module,HSM)中保護SQL Server資料的金鑰和證書。EKM使用Microsoft Cryptographic API(MS-CAPI)與SQL Server互動。由於金鑰和資料不會一起儲存,所以更加安全。當使用HSM時,可以藉助第三方工具的基於硬體的加解密,把效能影響降低。

    金鑰儲存,Key Stores提供了一個安全的儲存空間和可信任的金鑰及證書源。可選的金鑰儲存有本地的Windows證書儲存,Windows Azure中的Azure金鑰庫或者其他第三方金鑰儲存供應商。

SQL Server加密層次結構: