iT邦幫忙

2017 iT 邦幫忙鐵人賽
DAY 7
2
Security

資料安全與簡單加密演算法見面會 系列 第 7

[Day07] 資料儲存安全(SQL Always Encrypted)上

我們在第4天複習資料儲存安全(SQL加密函數)時,我們曾實作了SQL欄位加密來保護敏感性資料,如果觀察前面的加密流程,資料庫其實同時保管著解密金鑰及加密資料,這因此出現了雞蛋放同個籃子的系統風險。

老外說:

Never put all your eggs in one basket

今年推出的SQL Server 2016多了一個能讓AP與DB分權而治的加密新功能:一律加密(Always Encrypted),可以讓守衛金庫的工作避免過度集權在資料庫身上,分散資料外洩的風險。

一律加密(Always Encrypted)


資料的加解密會在AP端的ADO.NET應用程式端就開始執行,資料庫只負責接收或儲存AP端加密後的資料。

聽起來和AP端直接使用.NET加密演算法沒有不同?
*雖然都在AP端實施加密,但在金鑰這邊有些不同,加密金鑰在執行前會從資料庫端提供。

這樣資料庫不就還是擁有金庫和打開金庫的金鑰?
*還是有些不同,在資料庫內的這把加密金鑰被一個小寶箱鎖住,打開寶箱的金鑰被分開保管在AP端的憑證中。

MSDN Always Encrypted

Always Encrypted 是一個設計來保護儲存於 Azure SQL Database 或 SQL Server 資料庫中之敏感性資料的功能,像是信用卡號碼或全國性的身分證字號 (例如美國社會安全號碼)。 Always Encrypted 可讓用戶端將用戶端應用程式內的敏感性資料進行加密,且絕不會顯示 Database Engine (SQL Database 或 SQL Server) 的加密金鑰。 如此一來,「永遠加密」在資料擁有者 (且可以檢視資料) 和資料管理者 (但應該不具備存取權) 之間做出區隔。 透過確定內部部署資料庫系統管理員,雲端資料庫操作員,或其他高權限但未經授權的使用者則無法存取加密資料,「永遠加密」可讓客戶有信心地將機密資料存放在他們無法直接控制的位置。 這讓組織能夠加密 Azure 中的靜止資料以及用來存放的資料,以將內部部署資料庫管理委派給第三方,或是降低組織本身 DBA 人員的安全性許可需求。

我們來觀察查詢加密資料的流程:

http://ithelp.ithome.com.tw/upload/images/20161222/20103434DaNjxRRPUO.png

首先從圖上可以理解,AP端持有CMK金鑰(Column Master Key),DB端持有被CMK加密後的CEK(Column Encryption Key)。

假設我們要找資料庫找jim gray的CIF資料。
(jim gray是微軟研究科學家,1998年獲得圖靈獎(電腦界的諾貝爾獎))

1.AP先輸入SSN社會安全編號(美國公民的身分證字號)。
2.由於SSN使用了一律加密,AP會將條件資料使用欄位加密金鑰(CEK)進行對稱式加密。

  • 加密使用的CEK會在交易前從資料庫傳送過來,不過資料庫只有被加密的版本
  • 接著AP端透過CMK取出並解開DB傳送過來的加密版CEK作為資料加解密操作金鑰。

3.資料庫使用AP端加密後的條件查CIF。
4.資料庫回傳結果集。姓名:jim gray

  • 帶走整個資料庫伺服器,少了解開欄位加密金鑰(CEK)的主要金鑰(CMK);
  • 帶走整個應用程式伺服器,少了已加密的資料和加密後的欄位加密金鑰(CEK)。
  • 當然如果資料庫伺服器和應用程式伺服器在同一台,就比較傷腦筋了。
    (根據PCI PA DSS標準要求第9項有提到,我們應該在不同的伺服器上安裝資料庫及網站伺服器)
  • 必須要.NET Framework 4.6以上才支援

https://msdn.microsoft.com/en-us/library/mt163865(v=sql.130).aspx

啟用一律加密(Always Encrypted)步驟


1.建立憑證及欄位加密主要金鑰(CMK:Column Master Key)。
2.建立欄位加密金鑰(CEK:Column Encryption Key)並且CMK加密。
3.建立資料表並指定欄位使用 Always Encrypted一律加密。
4.DB Server 匯出憑證
5.AP Server匯入憑證
6.刪除DB Server憑證。

操作流程部分取自史丹利個人部落格:Stanley好熱

1.建立憑證及欄位加密主要金鑰(CMK:Column Master Key)。


指定資料庫 > 安全性 > Always Encrypted Key > CMK > 右鍵 > New Column Master Key
http://ithelp.ithome.com.tw/upload/images/20161222/20103434zwYm4Zdv49.png

建立憑證
http://ithelp.ithome.com.tw/upload/images/20161222/20103434NC4iIZa2hh.png

建立CMK
http://ithelp.ithome.com.tw/upload/images/20161222/2010343424c74U5pPo.png

2.建立欄位加密金鑰(CEK:Column Encryption Key)並且CMK加密。


指定資料庫 > 安全性 > Always Encrypted Key > CEK > 右鍵 > New Column Encryption Key
http://ithelp.ithome.com.tw/upload/images/20161222/20103434dh5RURmIZd.png

建立欄位加密金鑰(CEK:Column Encryption Key)並且CMK加密
http://ithelp.ithome.com.tw/upload/images/20161222/20103434Ye3QaJGV6k.png

3.建立資料表並指定欄位使用 Always Encrypted一律加密。


建立病人資料表Patients,其中SSN社會安全號碼使用一律加密功能,加密演算法選AES256

USE SecurityDB
CREATE TABLE [dbo].[Patients](
 [Name][varchar] (20), 
 [SSN] [char](11) COLLATE Latin1_General_BIN2 
 ENCRYPTED WITH (ENCRYPTION_TYPE = DETERMINISTIC, 
 ALGORITHM = 'AEAD_AES_256_CBC_HMAC_SHA_256', 
 COLUMN_ENCRYPTION_KEY = CEK1) NOT NULL,
 [Country] [varchar](50) NULL)

如果遇到定序問題,可以試試修改資料庫定序。

ALTER DATABASE SecurityDB  
COLLATE Latin1_General_BIN2 ;  
GO  

4.DB Server 匯出憑證


Windows鍵 + R 輸入 certmgr.msc 啟動憑證管理員
http://ithelp.ithome.com.tw/upload/images/20161222/20103434qJxcEZ4mAl.png

包含Private key
http://ithelp.ithome.com.tw/upload/images/20161222/20103434A7rZLgNWBV.png

編碼
http://ithelp.ithome.com.tw/upload/images/20161222/20103434Iyyc0E1lFF.png

輸入憑證密碼(待會匯入時會使用)
http://ithelp.ithome.com.tw/upload/images/20161222/20103434VAnGXDPphv.png

憑證名稱
http://ithelp.ithome.com.tw/upload/images/20161222/20103434hTktEKJma4.png

完成憑證匯出
http://ithelp.ithome.com.tw/upload/images/20161222/20103434PzuDQQhfC2.png

5.AP Server匯入憑證


把DB Server匯出的憑證上傳到AP Server,然後安裝。
http://ithelp.ithome.com.tw/upload/images/20161222/201034343QCFnX1Vx7.png

下一步之後輸入剛剛在db server上的憑證密碼。

6.刪除DB Server憑證。


回到DB Server刪除憑證。

http://ithelp.ithome.com.tw/upload/images/20161222/20103434lZLCuEYtYv.png

我們今天先花一些時間理解一律加密的原理並把AP Server/DB Server分權而治的一律加密環境準備好,明天我們就來觀察寫入資料及查詢資料的內容。

參考

Data Driven- SQL Server 2016 Keeping Sensitive Data Secure with Always Encrypted
https://channel9.msdn.com/events/datadriven/sqlserver2016/alwaysencrypted

MSDN 一律加密 (Database Engine)
https://msdn.microsoft.com/en-us/library/mt163865(v=sql.130).aspx


一天尬兩場戲真的有累到..

好想去澳洲黃金海岸悠閒的慢跑
http://ithelp.ithome.com.tw/upload/images/20161222/20103434zKatC48xuF.jpg
2014.02攝於黃金海岸


上一篇
[Day06] 資料儲存安全(SQL備份檔案加密)
下一篇
[Day08] 資料儲存安全(SQL Always Encrypted)下
系列文
資料安全與簡單加密演算法見面會 30

尚未有邦友留言

立即登入留言