保護(hù)密鑰的安全,統(tǒng)一安全管控之密鑰管理KMS
一、為什么要統(tǒng)一管控密鑰
談到信息安全免不了要解決一個(gè)問題就是數(shù)據(jù)加密。加密就會(huì)涉及到密鑰相關(guān)的問題,比如密鑰的生成、傳輸、保存、泄露等問題。如何保護(hù)好密鑰的安全就成了信息安全的非常重要的一個(gè)部分。某司員工將密鑰泄漏到開源網(wǎng)站導(dǎo)致重要數(shù)據(jù)丟失事件,君們還記得否?如果有完善的KMS系統(tǒng)這種情況很大程度上就可以避免了。
對(duì)于大部分沒有KMS管理系統(tǒng)的公司而言,密鑰本地化會(huì)導(dǎo)致密鑰分散在代碼、配置文件中。缺乏統(tǒng)一管理,造成開發(fā)、維護(hù)成本巨大,而且導(dǎo)致密鑰容易泄露。還有一部分公司采用硬件加密機(jī)來管理密鑰即HSM,全稱Hardware Security Module,這種方式管理密鑰安全性確實(shí)很高,但是因?yàn)楦骷?jí)密鑰都在HSM中管理所以成本過高。
采用軟硬件結(jié)合是比較好的方式,通過項(xiàng)目密鑰管理服務(wù)KMS輕松創(chuàng)建和管理密鑰,同時(shí)提供對(duì)密鑰的保護(hù),避免密鑰泄漏。使開發(fā)者沒有必要投入大量時(shí)間和精力來保證密鑰的保密性、完備性和可用性。通過密鑰管理服務(wù),開發(fā)者在處理密鑰時(shí)會(huì)更安全、更方便簡單,這樣可以更集中時(shí)間精力去研發(fā)如何借助加解密功能來實(shí)現(xiàn)業(yè)務(wù)場景。
二、KMS設(shè)計(jì)
1. 密鑰分級(jí)
這里按密鑰作用劃分為三級(jí):
- 數(shù)據(jù)加密密鑰(DEK):將用于數(shù)據(jù)加密的密鑰,也稱三級(jí)密鑰(DEK);一般公司里面一個(gè)應(yīng)用對(duì)應(yīng)一個(gè)DEK。
- 密鑰加密密鑰(KEK):保護(hù)三級(jí)的密鑰,也稱二級(jí)密鑰(KEK 即對(duì)DEK進(jìn)行加密);一般公司里面一個(gè)部門對(duì)應(yīng)一個(gè)KEK,DEK在KEK管轄之內(nèi)。
- 根密鑰(RootKey):保護(hù)二級(jí)密鑰的密鑰,也稱一級(jí)密鑰(RootKey,即是對(duì)KEK進(jìn)行加密),根密鑰構(gòu)成了整個(gè)密鑰管理系統(tǒng)的關(guān)鍵。
2. 基本架構(gòu)
本文中的KMS由三大部分組成SDK、后臺(tái)服務(wù)、HSM。
SDK:主要提供給服務(wù)的使用者集成到自己開發(fā)的項(xiàng)目中,實(shí)現(xiàn)密鑰的創(chuàng)建、導(dǎo)入、啟用、禁用等相關(guān)密鑰管理和加密以及解密等常見操作。SDK分為:Client模塊、加解密模塊,主要負(fù)責(zé)提供簡單接口完成加密解密功能。
KMS服務(wù):主要負(fù)責(zé)從硬件安全模塊獲取和保存根密鑰,并且安全地保存在后臺(tái)內(nèi)存中,然后通過密鑰的派生算法生成KEK進(jìn)而生成DEK。分為,根密鑰加載模塊、密鑰派生模塊、Server模塊。
HSM:提供根密鑰生成和保管服務(wù)。
架構(gòu)圖
架構(gòu)圖描述:
根密鑰生成,為了生成根密鑰的保密性,由三個(gè)人分別輸入三段約定好算法的隨機(jī)因子到HSM中去生成根密鑰,非法讀取HSM中的根密鑰會(huì)導(dǎo)致HSM被破壞而不可用從而保護(hù)了根密鑰不被泄露。另外為了保存好根密鑰以備及時(shí)恢復(fù),要將三段隨機(jī)因子分別保存到三個(gè)保險(xiǎn)柜中。
為了防止根密鑰被泄露,根密鑰RootKey由密鑰管理服務(wù)KMS從硬件安全模塊即HSM中讀取,按照一定的分散算法打散存儲(chǔ)在內(nèi)存中。
開發(fā)者將SDK集成到自己開發(fā)的服務(wù)或者系統(tǒng)的代碼中,以實(shí)現(xiàn)只需要調(diào)用較為簡單抽象的接口就能夠使用密鑰管理服務(wù)的相關(guān)功能。SDK中進(jìn)行加解密是為了防止業(yè)務(wù)方私自保存密鑰。Client模塊主要是負(fù)責(zé)SDK的Http請(qǐng)求相關(guān)的功能,加解密模塊則是負(fù)責(zé)SDK加解密相關(guān)的功能。
3. 運(yùn)行功能
密鑰派生:
KMS中最為關(guān)鍵的模塊是密鑰派生模塊。根據(jù)用戶ID和隨機(jī)因子通過偽隨機(jī)函數(shù)派生出KEK或者DEK等密鑰。KMS杜絕明文持久化保存密鑰,派生出來的KEK通過Rootkey加密保存在數(shù)據(jù)庫,派生出來的DEK通過KEK加密保存在數(shù)據(jù)庫。
創(chuàng)建密鑰:
- 用戶調(diào)用KMS提供的SDK中的創(chuàng)建用戶數(shù)據(jù)密鑰接
- 用戶傳入用戶ID等必要信息(如果要?jiǎng)?chuàng)建KEK則傳入部門信息,如果創(chuàng)建DEK則傳入應(yīng)用信息)
- KMS服務(wù)器驗(yàn)證請(qǐng)求
- 驗(yàn)證通過,KMS服務(wù)器在該用戶名下創(chuàng)建新的密鑰并返回密鑰ID
密鑰加密(解密同理):
- 服務(wù)調(diào)用方調(diào)用KMS提供的SDK中直接加密的接
- 服務(wù)調(diào)用方傳入用戶ID、密鑰ID、待加密明文
- KMS服務(wù)器驗(yàn)證密鑰ID、用戶ID以及是否為用戶ID名下
- 驗(yàn)證通過,KMS服務(wù)器返回DEK到SDK中
- SDK加密算法中對(duì)明文進(jìn)行加密,并返回密文
三、推動(dòng)業(yè)務(wù)方使用KMS
就算KMS再安全,業(yè)務(wù)方不愿意使用對(duì)于安全來說無疑也是掩耳盜鈴。
如何讓業(yè)務(wù)方愿意使用,需要技術(shù)和管理相結(jié)合去推動(dòng)。管理上:自上往下推動(dòng),通過高管的支持通知業(yè)務(wù)方使用KMS以及講述使用KMS帶來的收益,并通過KMS管理規(guī)范約定不通過KMS來使用密鑰所承擔(dān)的責(zé)任。通過定期安全宣傳和培訓(xùn)從反面和正面去講述其中利害。技術(shù)上:定期進(jìn)行專項(xiàng)檢查,通過代碼掃描查看代碼中存在的密鑰硬編碼,如果存在密鑰硬編碼則說明很有可能業(yè)務(wù)方自行創(chuàng)建保管密鑰;定期去大數(shù)據(jù)平臺(tái)進(jìn)行掃描將個(gè)別字段傳入KMS加密接口查看返回密文跟數(shù)據(jù)庫中的密文對(duì)比,如果一樣說明采用了KMS加密,如果不一樣很有可能就是自行保管密鑰。
現(xiàn)有一切加密技術(shù)都是建立在密鑰破解時(shí)間很長的情況下,暢想下如果量子計(jì)算機(jī)出現(xiàn)了,幾秒鐘就能破解2048位的密鑰,那么現(xiàn)有的加密技術(shù)都將形同虛設(shè)。