天天看點

SQL Server安全(8/11):資料加密(Data Encryption)

在保密你的伺服器和資料,防備目前複雜的攻擊,SQL Server有你需要的一切。但在你能有效使用這些安全功能前,你需要了解你面對的威脅和一些基本的安全概念。這篇文章提供了基礎,是以你可以對SQL Server裡的安全功能充分利用,不用在面對特定威脅,不能保護你資料的功能上浪費時間。

從讓人眼花缭亂的用戶端使用連接配接,通過到處分布的網絡,尤其是網際網路,關系資料庫在各種應用程式裡廣泛使用。這使資料對任何人,在任何地方都可通路。資料庫可以儲存人類知識的很大部分,包括高度敏感的個人資訊和讓國際商務工作的關鍵資料。

對于想要偷取資料或通過篡改資料來傷害資料的擁有者的 人來說,這些功能使資料庫成為有吸引力的目标。確定你的資料安全是SQL Server配置和使用它來儲存資料的程式的重要部分。這個系列會探尋SQL Server 2012安全的基本,這樣的話你可以保護你的資料和伺服器資源,按你需要的安全等級來保護資料,免受這些威脅對你資料的影響。大部分資訊對SQL Server的早期版本也适用,回到SQL Server 2005也可以,因為那是微軟在産品裡徹底檢查安全的時候。但我也會談論隻在SQL Server 2012和後續版本裡才有的功能。

一個重要的安全概念是深度防禦,這就是說最好的安全分層保護而不是單靠一層保護。在你的網絡,伺服器,SQL Server執行個體,資料庫都做了安全防護後,你可以添加最後一個通過加密敏感資料的強大資料保護層。這篇文章會探尋通過加密的資料庫保護,同時包括資料在網絡傳輸或記憶體裡,和在表裡休息。你會學到加密密匙的層級和你可以用來加密資料的各種密匙,還有你如何管理密匙,讓伺服器為你服務。

資料加密

到目前為止,你學習了SQL Server内建的很多強大安全功能,你可以用來保護你的資料和其它資料庫對象。當你把這些和強大的網絡完全結合,例如防火牆,最小特權使用者賬号和其它工具,你的資料應該非常安全,是不是?

答案還是不安全。雖然SQL Server 2012和SQL Server 2014目前已經是最安全的了(現在已經有SQL Server 2016了)——假設你充分并有效使用了安全功能——成功的攻擊還是可能的。黑客是聰明的,是以很有可能會有某些人,在某個時間,找出黑入你資料庫伺服器的方法,并通路你的資料。即使你有100%的自信,這樣的攻擊還是可能的,你會在内部攻擊的接收端發現自己——信任的員工做壞事了。

可以幫你了解為你的資料和你需要保護的其它資源,如何獲得安全的最進階别的安全主體是深度防禦。深度防禦意味着你從未依賴于單個手段來保護任何有價值的。你加入層層不同的安全,這樣的話,任何攻擊者在拿到你的資料前,需要突破多個困難障礙。

這也是很多中世紀的城堡有個護城河作為第一道防線,裡面有很多讨厭的動物在遊泳。接下來一層是戒備森嚴,厚的的橡木門和幾米厚的石牆。經常有另一個厚的,戒備森嚴的牆在外牆裡。層層安全保護着裡面的人和寶藏。

同樣的方法,SQL Server有很多層安全,它有很多來建造和維護它們。但當你的資料是極其寶貴時,你可以加最後一層防護:加密。

SQL Server 2015是第一個豐富支援資料加密的版本,自那後的每個版本都做了一些改進。你可以使用各種加密類型,包括各種加密密匙,可以秘密傳輸資料為看不懂的胡言亂語,除非使用者有密匙來解密。SQL Server支援各類加密算法。而且最重要的是,你可以讓伺服器來做管理密匙和的保持它們絕密的所有工作,這是加密最困難的部分。

提示:

加密是極其密集處理的操作,因為它需要複雜的計算。現代的計算機裝置都很快,對于包含75個加密列,有1億條資料的表,完成計算需要多個處理能力,對于設計不好的查詢,你會有巨大的負擔,會把動力不足的伺服器累趴。使用加密來保護隻值得終層保護的資料。

加密密匙(Encryption keys)

SQL Server允許使用三種加密密匙的任何之一。加密密匙是小塊資料,當插入到算法後,轉化資料為密文,這個密文如果沒有正确的加密密匙,通常不能轉為明文。

  • 非對稱密匙(Asymmetric Key):這種加密類型使用比對的公共/私有密匙。一個密匙來加密資料,另一個解密它。你可以和任何人共享公共密匙,這樣他們就加密任何資料,隻有你才可以使用私密密匙來解密。SQL Server使用長度512、1024 或 2048 位私密密匙的RSA加密算法。關于這個算法,可以參考下維基百科。
  • 對稱密匙(Symmetric Key):在這個加密類型裡,加密和解密資料的密匙資料是一樣的。這有時被稱為公有密匙,因為雙方共享資料必須有相同的密匙。在某些情況下,很難使用對稱密匙,因為安全傳輸秘密從一個地方到另一個地方是個問題。對稱密匙在資料庫裡使用是個好主意,因為他們從未離開資料庫。SQLServer支援RC4,RC2算法,也支援DES,AES算法家族。你可以在這個網站了解這些算法的概要資訊。

微軟在SQL Server 2012裡已經明智的取消了RC4對稱密匙,隻有資料庫的相容級别為90或100(SQL Server 2005和SQL Server2008)才可以,這是為了保持向後相容。RC4有很多弱點,最重要的是算法不散列話密匙——在加密前加些随機的文本到明文——這樣在同樣的密文裡加密值是重複的。這讓解密比應該有的難度更簡單。即使你維護SQL Server的老版本,也不要使用RC4!

  • 證書(Certificate):證書是對公共密匙的數字封裝,作為非對稱密匙加密的一部分。SQL Server可以為你建立使用的證書,或者你可以使用第三方證書授權。SQL Server使用網際網路工程任務組(Internet Engineering Task Force)的X.509規格。

 SQL Server使用如下的加密密匙層級,如插圖8.1所示,來加密和保護你存儲在資料庫裡的密匙。

SQL Server安全(8/11):資料加密(Data Encryption)

插圖8.1:加密密匙層級

在伺服器級别,SQL Server的每個執行個體有個服務主密匙(Service Master Key),你用來加密低一層的其它密匙。這個密匙在SQL Server執行個體安裝時建立。你可以備份和還原它,如果它已經洩露的話,也可以重新生成它,但絕大部分時間你可以不理會它。SQL Server會為你管理它,你也從不會直接使用它。服務主密匙在系統底層存儲并保護,使用Windows資料保護API或DPAPI。

服務主密匙有一些内部使用,但我們這裡的目的是SQL Server用它來加密和保護你建立的任何資料庫主密匙(Database Master Keys)。在你加密的任何資料庫裡都需要資料庫主密匙。它是加密和保護任何你建立密匙的對稱密匙。你需要在資料庫上下文裡使用代碼8.1的語句建立它。

1 USE EncryptionDB;
2 GO
3 
4 CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'gK#3hbQKDFQY0oF';      

代碼8.1:在EncryptionDB資料庫裡建立一個資料庫主密匙的代碼

如果你沒有按這個系列文章逐篇閱讀的話,你可以執行下列代碼來初始化測試環境。

1 -- *** Beginning of setup code ***
 2 -- *******************************
 3 
 4 -- Set up sample encryption database
 5 USE master;
 6 GO
 7 
 8 -- Set up a login
 9 IF SUSER_SID('User1') IS NOT NULL DROP LOGIN User1;
10 CREATE LOGIN User1 WITH password = '3f@$fWDY3QvP&K0';
11 GO
12 
13 IF DB_ID('EncryptionDB') IS NOT NULL DROP DATABASE EncryptionDB;
14 CREATE DATABASE EncryptionDB;
15 GO
16 USE EncryptionDB;
17 GO
18 
19 CREATE USER User1 FOR LOGIN User1;
20 
21 CREATE TABLE Customer (
22     CustId int, 
23     Name nvarchar(30), 
24     City varchar(20), 
25     CreditCardType varbinary(1000),
26     CreditCardNumber varbinary(1000), 
27     Notes varbinary(4000));
28 GO
29 
30 -- Grant access on the table to user
31 GRANT SELECT, INSERT ON Customer to User1;
32 
33 -- *** End of setup code ***
34 -- *************************      

資料庫主密匙儲存2次:服務主密匙加密一次并儲存,用你提供的密碼再次加密。你可以移除其中一個,但不能同時移除。通常我們都2個都保留。

作為對稱密匙,資料庫主密匙在你使用它之前必須打開。打開密匙把它載入記憶體并解密它,這樣就可以使用了。因為伺服器的服務主密匙加密資料庫主密匙,SQL Server可以Wie你自動打開密匙,這樣的話你基本不需要直接打開它。想服務主密匙,你可以備份和還原它,想要的話也可以修改它。

你會使用插圖8.1裡的其它密匙來加密資料。箭頭表示你用來加密和保護其它密匙的密匙。例如,你可以使用資料主密匙來加密其它證書或對稱密匙。證書和非對稱密匙隻能保護對稱密匙,對稱密匙可以被證書,非對稱密匙和其它對稱密匙保護。

密匙管理

插圖8.1戰士了加密密匙的其它方面:你可以使用任何另一個密匙或密碼來建立任何密匙。這個稱為密匙管理,這是SQL Server可以為你處理一個主要服務。

密匙管理最困難的一部分選擇正确的加密。曆史上有很多密匙被攔截後,有很多國家秘密被破解。在二戰期間,美國、英國和其它聯盟國家把大量資源放入截取德國和日本的加密密匙,這樣的話,他們可以截取并得到高機密的資訊。在最近,很多安全性的應用程式被瓦解,因為攻擊能找到在應用程式裡或電腦上嵌入的密匙。安全共享秘密非常困難。

你可以自己管理SQL Server加密密匙,如果你選擇使用密碼,那秘密儲存好密匙就是你的責任。大多數人不想這樣做,因為它需要高度專業的技術技能。但如果你想承擔任務,當你建立密匙時直接使用密碼選項。密碼就是基本的密匙,你要確定你可以安全的地方儲存這個密匙,當你需要它的時候,可以密碼傳輸它。

但你沒必要處理這些細節,因為SQL Server會為你管理好密匙。它會為你加密新的密匙,使用你指定的任何方法作為CREATE語句的一部分,安全儲存資料如同它儲存任何敏感資訊。

你有管理密匙的選項,但沒事就不要亂動。

加密資料

現在我們來看一個在SQL Server裡加密的一個例子。在這個場景裡,Customer表有一些客戶的正常資訊。一些資訊,例如客戶名稱和它們所在的城市,不是敏感的資料,不值得加密。其它資料,例如信用卡類型和号碼及備注會包含特定敏感的個人資訊,需要加密。

你會使用對稱密匙來加密表的資料,但記住對稱密匙需要資料庫裡一個證書或非對稱密匙來保護它。是以,首先使用代碼8.2來建立保護對稱密匙的非對稱密匙。

1 CREATE ASYMMETRIC KEY User1AsymmetricKey
2     AUTHORIZATION User1
3     WITH ALGORITHM = RSA_2048      

代碼8.2:建立使用RSA 2048位算法,屬于User1的非對稱密匙。

非對稱密匙稱為User1AsymmetricKey,AUTHORIZATION子句指定User1擁有密匙。這個密匙使用2048位的RSA加密,非常強的加密。這個必須是真的,真的重要資料!

接下來,使用代碼8.3出阿健對稱密匙User1SymmetricKey。(你必須為你的密匙取更有描述性的名稱!)。在這個例子裡,它使用TRIPLE_DES算法,用你剛建立的非對稱密匙保護它。

1 CREATE SYMMETRIC KEY User1SymmetricKey
2     WITH ALGORITHM = TRIPLE_DES
3     ENCRYPTION BY ASYMMETRIC KEY User1AsymmetricKey;      

代碼8.3:建立使用Triple DES算法的對稱密匙,用剛才的非對稱密匙。

如果你想在資料庫列出對稱的加密密匙,你可以使用sys.symmetric_keys目錄視圖來檢視它們。代碼8.4生成了如插圖8.2所示的結果。注意,因為資料庫主密匙是對稱密匙,他在清單裡也顯示了,你可以看到它用AES_256加密的。

1 SELECT * FROM sys.symmetric_keys;      

代碼8.4:在資料庫列出對稱密匙

SQL Server安全(8/11):資料加密(Data Encryption)

插圖8.2:檢視 sys.symmetric_keys目錄視圖

代碼8.5展示了EncryptionDB資料庫裡的表結構。(這個建立表的代碼和剛才初始化環境代碼是一樣的):

1 CREATE TABLE Customer (
2     CustId int, 
3     Name nvarchar(30), 
4     City varchar(20), 
5     CreditCardType varbinary(1000),
6     CreditCardNumber varbinary(1000), 
7     Notes varbinary(4000));      

代碼8.5:建立Customer表,varbinary字段用來加密資料。

注意,因為最後三個字段會包含位元組流的原始字元資料的加密資料,字段類型是varbinary類型。字段長度取決于資料的大小和保護它的算法。資料庫有User1使用者,它在表上有SELECT和INSERT許可。

最後,是時候加密一些資料了,我們忘表裡插入一些資料。第一步使用如代碼8.6的語句打開對稱密匙。這一步讓SQL Server從内部獲得密匙,請确定使用者有用這個密匙的許可,然後解密密匙到記憶體就可以開始使用了。

1 OPEN SYMMETRIC KEY User1SymmetricKey
2     DECRYPTION BY ASYMMETRIC KEY User1AsymmetricKey;      

代碼8.6:第一步使用對稱密匙,使用OPEN SYMMETRIC KEY打開它

資料加密使用T-SQL的EncryptByKey函數,它生成唯一的GUID來辨別密匙。你可以使用Key_GUID函數來獲得GUID,而不必自己直接傳入值。代碼8.7是正常的T-SQL插入語句,往表裡插入一些資料。

1 INSERT INTO Customer VALUES (1, 'Sally Roe', 'Chatinika',
2     EncryptByKey(Key_GUID('User1SymmetricKey'), 'Visa'),
3     EncryptByKey(Key_GUID('User1SymmetricKey'), '1234-5678-9009-8765'),
4     EncryptByKey(Key_GUID('User1SymmetricKey'), 
5         'One of our best customers. Treat like royalty.'));      

代碼8.7:插入加密資料到表,使用EncryptByKey和Key_GUID函數。

最後一步是關閉對稱密匙,使用代碼8.8。這個會從記憶體移除密匙,釋放這些資源給其它使用者。你應該經常在用完後就關閉密匙,因為它留在記憶體裡的話,就會被不小心被攻擊者利用。

1 CLOSE SYMMETRIC KEY User1SymmetricKey;      

代碼8.8:CLOSE SYMMETRIC KEY語句關閉密匙,從記憶體中移除它。

如果你要在批處理裡使用加密和解密很多資料,可以留着它打開。打開和關閉密匙需要一點處理,這樣的話你可以更高效。但不要忘記關閉它在你完成的時候!

現在運作SELECT語句看看表裡有什麼,如插圖8.3所示。你可以看到在沒加密字段看到明文,但加密字段是随機的位元組流資料。你的資料現在是安全的!

SQL Server安全(8/11):資料加密(Data Encryption)

插圖8.3:在表裡存儲的加密資料。

在表裡的資料是毫無用處的,除非有方法取出它。在這個例子裡,你需要使用正常的SELECT語句,使用DecryptByKey函數來解密資料。這個函數傳回varbinary資料,以為加密資料可以是任何資料類型。是以獲得原始文本需要DecryptByKey函數的轉化結果為合适的文本字元。

代碼8.9打開密匙,運作SELECT語句。

1 OPEN SYMMETRIC KEY User1SymmetricKey
2     DECRYPTION BY ASYMMETRIC KEY User1AsymmetricKey;
3 SELECT CustID, Name, City,
4     CONVERT(VARCHAR, DecryptByKey(CreditCardType)) AS CardType,
5     CONVERT(VARCHAR, DecryptByKey(CreditCardNumber)) AS CardNumber,
6     CONVERT(VARCHAR, DecryptByKey(Notes)) AS Notes
7 FROM Customer;
8 CLOSE SYMMETRIC KEY User1SymmetricKey;      

代碼8.9:打開對稱密匙,然後使用DecryptByKey函數的SELECT語句獲得加密資料

這會顯示如插圖8.4的結果。

SQL Server安全(8/11):資料加密(Data Encryption)

插圖8.4:使用SELECT和DecryptByKey後的解密資料

相同的EncryptByAsymKey,EncryptByCert和其它方法都可以用作其它密匙,都有對應的Decrypt函數。

小結

SQL Server的資料加密功能為你的資料提供了額外一層保護,給你在全面的深度保護。像老的中世紀城堡有多層的要塞,SQL Server攻擊者需要突破網絡安全,伺服器安全,SQL Server執行個體安全和資料庫安全才可以拿到你的資料。然後,勝利就在眼前,它們還要處理資料強悍加密來拿到有用的資料。加上強悍的資料庫安全,使用細微度的許可來提供最小特權,讓主體隻能通路它們需要的資料,你可以為你最敏感的資料建立堅不可摧的保護。

原文連結:

http://www.sqlservercentral.com/articles/Stairway+Series/123777/

注:此文章為

WoodyTu

學習MS SQL技術,收集整理相關文檔撰寫,歡迎轉載,請在文章頁面明顯位置給出此文連結!

若您覺得這篇文章還不錯請點選下右下角的推薦,有了您的支援才能激發作者更大的寫作熱情,非常感謝!

繼續閱讀