加密所有數據的最佳實踐
我在一個項目中工作,客戶害怕他們自己的員工(即:客戶不信任的初級 IT 人員)查詢數據庫以獲取敏感資訊。
該數據庫是一個新的 SQL Server 數據庫,所以我有某種自由。
Google搜尋了一下,我在 SQL Server Transparent Data Encryption登陸,想知道這是否是我需要的,如果不是……
加密數據庫中所有表中的所有列以防止使用者查詢數據庫的最佳實踐是什麼?
您的問題歸結為訪問控制。
我建議的第一道防線是簡單地拒絕不受信任的使用者的訪問。如果他們無法進入數據庫,他們就無法查詢數據庫並獲取敏感數據。
如果必須允許他們訪問數據庫伺服器,您可以查看顯式授予他們對他們必須訪問以執行其工作任務的表的讀取權限。或者,您可以不理會他們目前的權限,而只需撤銷他們查詢包含敏感數據的表或這些表中的列的能力。
我開始採用這種方法的原因是加密存在成本。存在密鑰管理以及加密/解密數據的 CPU 成本。據我了解,如果數據在索引中,將數據作為加密數據查找也會產生性能成本,加密值將被索引而不是源值。最終結果是 2013-06-11 和 2013-06-12 可能已儲存在連續的磁碟位置,但一旦它們被加密,它們可能位於磁碟的另一端,而您的簡單範圍查詢過去表現良好吮吸後乳頭。
綜上所述,Steve Jones 對Encryption Primer做了很好的介紹。我使用了其中的一些內容以及這篇關於在數據庫中而不是在多維數據集中進行加密的文章來啟動和執行我們的加密內容。
正如其他人在評論和其他答案中指出的那樣,儘管將加密作為其名稱的一部分,TDE 並不會保護數據庫本身的數據。TDE 的目的是保護您的備份免受未經授權的訪問。它與流經網路的加密數據包或自動創建 PCI 合規性無關。它只是確保如果我們的異地備份磁帶失去、被盜或只是被窺探,人們將無法在沒有密鑰的情況下使用它們。
我沒有提到的訪問控制的另一點是物理訪問。如果擔心初級管理員訪問他們不應該訪問的數據,那麼除了拒絕他們訪問數據庫之外,不要忽視阻止他們訪問機器本身的基礎知識——無論是通過遠端桌面還是物理登錄到機器。一旦他們能夠進入盒子,就沒有什麼能阻止他們將 SQL Server 重新啟動到單使用者模式並刪除您的訪問控制。
使用加密保護數據免受您自己的管理員/IT 侵害的唯一方法是,使用者每次查詢數據時都輸入自己的解密密碼。如果您的應用程序向使用者顯示一個密碼對話框,然後發出一個
OPEN SYMMETRIC KEY ... DECRYPTION BY CERTIFICATE ... WTIHT PASSWORD ...
(或一些等效的)來打開數據加密密鑰,那麼並且只有這樣,數據才會受到加密保護以防止未經授權的訪問:即使有人可以訪問數據,它不知道解密密鑰,也無法從伺服器上的某個位置檢索密鑰。所有其他方案(包括 TDE)都涉及由後端引擎打開的密鑰層次結構,這意味著密鑰儲存在以DPAPI為根的層次結構中的某個位置。在所有這些情況下,您只有數據訪問控制保護 (GRANT/DENY/REVOKE),而不是加密保護,因為 SQL Server 本身可以訪問解密密鑰,它會為您解密數據。這些方案防止媒體失去,而不是防止訪問。它們非常有價值,並且被廣泛部署,因此。
現在回到第一段,您必須了解注意事項:
- 任何秘密都不能隱藏在系統上以對抗授權管理員。標準可以提高,但管理員可以隨時了解秘密。
- 使用列級加密使數據不可搜尋。加密所有表中的所有列將使數據無法查詢,這是肯定的……我的意思是任何人都無法查詢,包括授權使用者
- 讓應用程序在每次訪問時向最終使用者詢問解密密碼很少可行
在這三者之間,像您嘗試的那樣部署加密幾乎沒有什麼好處。真正沸騰的是其他人所說的:訪問控制和信任。請記住,審計是可用的,並且可以起到威懾作用。