尹譽衡
(華北計算技術(shù)研究所,北京 100089)
隨著互聯(lián)網(wǎng)和計算機技術(shù)的高速發(fā)展,為了滿足人們對數(shù)據(jù)處理速度和數(shù)據(jù)存儲容量越來越高的要求,云計算平臺應(yīng)運而生。云計算平臺通過整合分布式資源,構(gòu)建靈活、可擴展的虛擬計算環(huán)境[1],根據(jù)用戶的需求提供理想的服務(wù)與資源。目前金融、政務(wù)、郵政等重要領(lǐng)域已經(jīng)廣泛應(yīng)用云計算平臺,大量云計算平臺的用戶選擇將數(shù)據(jù)甚至是隱私數(shù)據(jù)保存在云端[2],因此用戶迫切希望有一個安全可靠的云計算平臺。
非對稱加密算法是一種將數(shù)據(jù)進行加密處理的算法。數(shù)據(jù)收發(fā)雙方都有一套相互匹配的公鑰(public key)和私鑰(private key)[3]。數(shù)據(jù)發(fā)送方和數(shù)據(jù)接收方在正式傳送數(shù)據(jù)前會交換公鑰,傳送數(shù)據(jù)前發(fā)送方先用接收方的公鑰對數(shù)據(jù)進行加密處理,接收方接收到數(shù)據(jù)后,用自己的私鑰對數(shù)據(jù)進行解密,從而獲取原本的數(shù)據(jù)。
OpenStack是一個開源的、便于使用的、可擴展的云計算平臺,由多個功能各不相同的組件構(gòu)成,各組件之間分工協(xié)作,共同構(gòu)成云計算平臺[4]。目前為止發(fā)布了從A到T共20個版本,從Essex版本之后開始全面支持使用Keystone完成身份管理、訪問控制和統(tǒng)一授權(quán)的功能[5]。
OpenStack由一系列開源項目組成,是一種提供基礎(chǔ)設(shè)施即服務(wù)(infrastructure as a service,IaaS)的虛擬化管理平臺,能夠提供可靠的云部署方案[6]。OpenStack主要使用池化虛擬資源來構(gòu)建和管理私有云和公有云,通過多種功能不同的組件提供計算、網(wǎng)絡(luò)、存儲、認(rèn)證和鏡像等服務(wù),其中提供認(rèn)證服務(wù)的就是Keystone組件。各組件之間采用Restfull API接口規(guī)范,實現(xiàn)了模塊之間的低耦合,各個組件可以靈活配置,易于二次開發(fā)[7]。
用戶在申請OpenStack的資源和服務(wù)時都由Keystone對用戶進行身份驗證并對用戶授權(quán),同時還會向用戶提供一個該用戶可以使用的服務(wù)的列表,用以明確用戶使用資源的權(quán)限范圍[8]。在OpenStack中,無論是管理員還是用戶,要想使用各項服務(wù),都必須先通過Keystone的認(rèn)證。并且,OpenStack的認(rèn)證工作都交由Keystone完成,因此,提高Keystone的安全性是十分必要的。
下文會介紹Keystone中涉及的一些基本概念。
(1)用戶(User):使用OpenStack服務(wù)的個人或是系統(tǒng),需要向Keystone發(fā)送憑證以通過Keystone的驗證。Keystone會向通過驗證的用戶分配一個該用戶特有的令牌(Token),該令牌就是在OpenStack中請求其他服務(wù)時的憑證。
(2)令牌(Token):Keystone驗證用戶憑證后,向用戶分發(fā)特定的、在OpenStack各組件之間使用的通行證,用戶可以以此令牌訪問被授權(quán)的其他的OpenStack服務(wù)。令牌具有有效時間,可以隨時被云平臺管理員取消。Keystone的作用就是對外提供一個可以訪問資源的令牌。
(3)項目租戶(TenantProject):表示一組資源,資源范圍由Keystone授權(quán)給用戶的資源列表界定。
(4)憑證(Credential):用于證明用戶身份或權(quán)限,也就是用戶的用戶名和密碼,用戶將其發(fā)送給Keystone,以換取令牌。一個用戶可以有多個憑證,一個憑證與一個項目關(guān)聯(lián)。
Keystone通過這些基本概念,對外提供認(rèn)證、令牌、目錄和安全策略四個方面的核心服務(wù)。Keystone組件工作流程如圖1所示。
圖1 Keystone工作流程
(1)用戶發(fā)送自己的憑證(即用戶名和密碼)到Keystone,Keystone通過認(rèn)證后,返回一個臨時令牌和通用服務(wù)目錄。
(2)用戶通過臨時令牌向Keystone查詢當(dāng)前環(huán)境下的項目列表。Keystone通過驗證后返回給用戶一個項目列表。
(3)用戶選擇一個項目后,發(fā)送憑證給Keystone申請正式令牌。
(4)用戶憑借正式令牌發(fā)送API請求到相應(yīng)的服務(wù)端點,服務(wù)端點將令牌交由Keystone驗證后響應(yīng)請求,向用戶返回請求狀態(tài)。
以上是Keystone完整的工作流程,該文就認(rèn)證過程的安全性進行研究,并給出加強安全性的方法。
OpenStack身份認(rèn)證分為兩個部分,首先云平臺用戶需要先從Keystone申請到令牌,以令牌作為與各組件的API接口進行交互的憑證,使用該令牌完成單點登錄和委派驗證[9],從而獲取其他組件提供的服務(wù)。Keystone組件作為OpenStack云平臺的身份認(rèn)證核心[10],可以與其他后端授權(quán)系統(tǒng)進行集成,其身份認(rèn)證機制通過token來實現(xiàn),主要包括了UUID token(universally unique identifier token)和PKI(public key infrastructure token)兩種認(rèn)證機制。
當(dāng)用戶需要進行操作時,用戶提供有效的用戶名和口令給Keystone,Keystone經(jīng)過認(rèn)證后返回給用戶一個令牌[11]。之后用戶對其他組件進行其他操作時,先出示這個令牌給相應(yīng)的API,組件收到請求后,用這個令牌去向Keystone進行請求驗證。Keystone通過比對令牌,以及檢查令牌的有效期,判斷令牌的有效性,最后返回結(jié)果給相應(yīng)的組件。
OpenStack在G版本之前只有UUID令牌認(rèn)證機制這一種方式。G版本及之后版本使用PKI令牌機制[12],Keystone會利用PKI對令牌相關(guān)的數(shù)據(jù)進行簽名,對UUID機制進行了改進,減少了交互開銷。
1.2.1 UUID令牌認(rèn)證機制
UUID令牌認(rèn)證機制基于用戶提供的用戶名和口令完成認(rèn)證[13]。Keystone生成的令牌保存在后端數(shù)據(jù)庫中,每個令牌都有一個獨一無二的ID。用戶向Keystone提交驗證申請,Keystone經(jīng)過驗證后將令牌ID傳給用戶。用戶在申請云平臺資源時,會在API請求中附加上自己的令牌ID,Keystone通過比對API請求和后端數(shù)據(jù)庫中的令牌ID來驗證用戶身份,之后再響應(yīng)用戶的API請求。這種方式的設(shè)計決定了用戶每次發(fā)起API請求之前都要向Keystone發(fā)起驗證請求,造成極大的開銷,對網(wǎng)絡(luò)和Keystone資源都是一種極大的消耗。Keystone生成令牌和用戶使用令牌發(fā)起API請求的過程如圖2所示。
圖2 UUID認(rèn)證過程
1.2.2 PKI令牌認(rèn)證機制
PKI令牌認(rèn)證機制中Keystone被設(shè)計為一個數(shù)字簽名認(rèn)證中心。Keystone使用簽名密鑰和數(shù)字證書對用戶的令牌簽名,每一個API端點都會保存一份簽名公鑰證書、CA公鑰證書和證書吊銷列表的Keystone拷貝,用以驗證用戶的請求[13]。在這種機制下,當(dāng)用戶發(fā)起API請求時,每個API端點都可以使用這份拷貝離線響應(yīng)請求,節(jié)省了為每個驗證直接請求Keystone的開銷,解決了UUID機制中客戶端與Keystone頻繁交互造成的性能瓶頸,緩解了對網(wǎng)絡(luò)帶寬和Keystone資源的壓力。PKI令牌認(rèn)證機制的流程如圖3所示。
圖3 PKI認(rèn)證過程
通過對Keystone認(rèn)證機制的分析,可以發(fā)現(xiàn)Keystone在認(rèn)證過程中存在一些缺陷,這些缺陷可能會使Keystone和其他組件遭受安全問題。本節(jié)針對Keystone認(rèn)證機制的安全性進行分析,指出其中存在的問題。
(1)Keystone是OpenStack身份認(rèn)證中心,使用用戶名和口令來驗證用戶,但在驗證過程中,用戶名和口令都是以明文形式傳輸?shù)?。Keystone默認(rèn)使用HTTP協(xié)議進行通信,HTTP不會加密通信內(nèi)容,攻擊者可以針對HTTP協(xié)議發(fā)起諸如中間人攻擊等的攻擊行為,導(dǎo)致泄露用戶的用戶名和口令等信息。
(2)Keystone會向經(jīng)過認(rèn)證的用戶發(fā)送一個令牌,用戶憑此令牌進行后續(xù)的資源訪問和使用,其他的組件不會再對用戶的身份加以驗證。這種做法意味著攻擊者一旦通過某些途徑拿到某個用戶的令牌,就相當(dāng)于擁有了此用戶在云平臺的所有權(quán)利,攻擊者可以不再經(jīng)過Keystone的身份驗證而直接以該用戶的身份使用云平臺的資源,甚至對云平臺本身發(fā)動攻擊。
(3)用戶在請求其他組件的服務(wù)時,發(fā)送的API請求包括了令牌和請求信息。由于API請求在傳輸過程中是以明文傳輸?shù)?,所以攻擊者一旦截獲了用戶的任意一條API請求,都可以通過該請求中的信息對API接口發(fā)動重放攻擊。
(4)Keystone作為OpenStack平臺唯一一個強制服務(wù),同時還具備管理認(rèn)證的功能,這使得它成為攻擊者的首選攻擊目標(biāo)。在Keystone的基礎(chǔ)上結(jié)合其他安全手段無疑是提高其安全性的一個重要方式。
綜上所述,Keystone組件的認(rèn)證機制中仍然存在很多安全問題[14],尤其是通信過程中的明文傳輸,這是一個很大的隱患,使得OpenStack無法應(yīng)用于對數(shù)據(jù)保密有極高要求的場景,因此需要將Keystone結(jié)合其他安全手段來保障Keystone數(shù)據(jù)傳輸?shù)碾[蔽性,而非對稱加密作為一種經(jīng)過驗證的可靠方式,無疑是最佳的選擇。
針對Keystone現(xiàn)有的安全問題,該文介紹一種基于非對稱加密的認(rèn)證機制改進方案,該方法可以有效地解決上文中指出的問題。
非對稱加密算法使用公鑰和私鑰對數(shù)據(jù)進行加密和解密。公鑰作為對信息進行加密的密鑰,對數(shù)據(jù)發(fā)送方公布,同時數(shù)據(jù)接收方應(yīng)妥善保管私鑰,任何人都無法通過公鑰推測出私鑰。被數(shù)據(jù)接收方的公鑰加密過的數(shù)據(jù)只能通過接收方的私鑰解密,其他人無法解密獲取其中的信息,由此可見,使用非對稱加密算法可以有效地防止信息泄露,將其與Keystone認(rèn)證機制相結(jié)合,可以大大提高Keystone認(rèn)證機制的安全性。
表1給出了改進方案相關(guān)的符號記法。
表1 改進方案符號記法
在設(shè)計改進方案時,考慮到需要交換公鑰,并且讓用戶驗證Keystone的身份,所以在認(rèn)證過程的前三個階段仍然使用明文傳輸。在交換了公鑰并驗證了Keystone的身份之后再使用非對稱加密算法對傳輸?shù)拿舾行畔⑦M行加密處理,完成認(rèn)證工作,增強認(rèn)證機制的安全性。
圖4給出改進方案的工作流程。
圖4 改進方案工作流程
(1)用戶向Keystone發(fā)送hello消息:用戶發(fā)送包含了用戶公鑰K_PUBC的hello消息給Keystone。
(2)Keystone向用戶發(fā)送hello消息:Keystone收到用戶發(fā)送的hello消息后,將用戶公鑰和用戶隨機數(shù)保存在本地,然后將用戶的hello消息再發(fā)還給用戶,作為收到hello消息的確認(rèn)。
(3)Keystone發(fā)送證書:Keystone將自己的CA證書和公鑰K_PUBK發(fā)給用戶。
(4)用戶發(fā)送身份信息:用戶驗證證書通過后,將自己的用戶名和密碼用Keystone的公鑰K_PUBK加密,發(fā)送給Keystone。
(5)發(fā)放令牌:Keystone用私鑰K_PRIK解密消息,獲取用戶名和密碼并驗證后,發(fā)送用戶公鑰K_PUBC加密過的令牌給用戶。
(6)發(fā)送API請求和令牌:用戶基于隨機數(shù)生成會話密鑰,將API請求、令牌和時間戳T用Keystone的公鑰K_PUBK加密,并發(fā)送給Keystone。
(7)API請求處理:Keystone用私鑰K_PRIK解密后,驗證令牌和T,驗證通過后,將API請求的結(jié)果和時間戳T用K_PUBC加密后發(fā)送給用戶。
實驗環(huán)境:物理機win 7,使用VMware Workstations安裝兩臺CentOS 7.7虛擬機,分別作為Controller節(jié)點和Compute節(jié)點,并在Controller節(jié)點和Compute節(jié)點上安裝OpenStack Stein。
在物理機上使用wireshark抓包,追蹤http流,未加密流量中可以直接獲取用戶名和密碼,而在對數(shù)據(jù)流進行加密之后,無法解密數(shù)據(jù)流,只能獲取到亂碼,從而有效地保障了通信過程的機密性。
上文所述的改進方案通過在Keystone認(rèn)證過程中增加非對稱加密機制,對認(rèn)證過程中所涉及的用戶名、密碼和令牌等重要信息進行加密傳輸,對這些重要信息的傳輸進行了保護。該方案實現(xiàn)了一個安全有效的改進方案,解決了第2節(jié)提出的安全問題。以下從三個方向?qū)υ摳倪M方案進行了詳細(xì)具體的安全分析。
3.3.1 防消息泄漏
從改進方案的工作流程可以看出,只有在前三個階段沒有用公鑰加密,而前三個階段包含的有效信息只有用戶公鑰、Keystone公鑰和Keystone的CA證書,沒有用戶名和密碼,在后續(xù)向Keystone發(fā)送認(rèn)證請求的過程中無法通過Keystone的驗證,從而就無法獲取令牌和時間戳,因此即使攻擊者截獲了前三個階段交互的信息,也不會泄露用戶名和密碼、令牌、API請求等信息。
通過對認(rèn)證過程中的敏感信息使用安全性較高的非對稱加密算法進行加密,有效地防止了敏感信息的泄露,攻擊者即使截獲了信息也無法破解出有效信息。
3.3.2 防重放攻擊
重放攻擊是指攻擊者向目標(biāo)主機發(fā)送一個合法的包,但是這個包是該主機事先已經(jīng)接收過的包,利用他人的合法身份來欺騙目標(biāo)主機[15]。這種攻擊方式主要用于身份認(rèn)證過程,從而造成目標(biāo)主機對攻擊者錯誤的身份認(rèn)證。
發(fā)動重放攻擊的可以是普通的合法用戶,也可以是將合法用戶的請求攔截了的攻擊者。攻擊者可以通過竊聽合法用戶的網(wǎng)絡(luò)流量或其他途徑獲取到認(rèn)證過程中的憑證,然后再將這個憑證發(fā)給認(rèn)證服務(wù)器,從而獲取經(jīng)過認(rèn)證的合法身份。
若將重放攻擊運用在欺騙Keystone,攻擊者就可以在沒有破解出傳輸數(shù)據(jù)的真實含義時,也能夠用加密過的認(rèn)證信息欺騙Keystone,從而獲取到令牌。
在改進方案中,在用戶發(fā)送API請求時,同時會發(fā)送一個時間戳。由于攻擊者無法破解傳輸?shù)募用?,所以無法定點修改時間戳,因此信息中的時間戳必定是合法用戶發(fā)送的。所以當(dāng)Keystone收到兩個相同的消息時,Keystone可以通過對比信息中包含的時間戳和接收到信息的時間來確定哪一個API請求是由合法用戶發(fā)出的,從而防止有效的重放攻擊。
3.3.3 雙向認(rèn)證
在Keystone過程中,不僅是Keystone需要確定用戶的身份,用戶同樣也需要確定Keystone的身份,防止攻擊者通過偽裝成Keystone來欺騙用戶。
在該文的改進方案中,用戶會在通信過程前期收到Keystone的CA證書,從而確認(rèn)Keystone的身份,為下一步的認(rèn)證過程提供保障。CA證書由第三方可信機構(gòu)簽署頒發(fā),具有極高的可信度,用戶通過CA證書驗證身份后可確定對方身份。同時因為該證書是公開證書,所以可以在認(rèn)證過程的明文傳輸階段就對Keystone進行驗證。
而Keystone驗證用戶的身份則是通過用戶名和密碼,在信息不被泄露的前提下,使用用戶特有的用戶名和密碼來驗證用戶身份不失為一個傳統(tǒng)但有效的方法。
在認(rèn)證機制中加入這樣的雙向認(rèn)證可以保障用戶和Keystone雙方都不被欺騙,極大地增強了認(rèn)證機制的安全性。
通過分析Keystone的工作流程以及UUID token和PKI token兩種認(rèn)證機制,指出其中存在的缺陷和可能受到的攻擊,再針對這些缺陷,給出一種改進方案,將非對稱加密機制與Keystone的認(rèn)證機制結(jié)合,并加入雙向認(rèn)證和時間戳證明,保證通信過程的數(shù)據(jù)安全。然后對這種改進方案進行安全分析,可以看出該方案對信息泄露和重放攻擊有很好的防御,同時增加的雙向認(rèn)證也加強了通信雙方的互信度,不失為一個一舉多得的方案。下一步工作是對該方案的性能進行評估,并通過適當(dāng)?shù)牟呗越档驼J(rèn)證服務(wù)器負(fù)載量,提高整個系統(tǒng)的工作效率。