天天看點

etcd之安全性闡述

etcd安全是指安全模式下etcd的運作狀态,接下來從通路安全和傳輸安全兩方面來闡述etcd的安全性通路安全包括使用者的認證和授權,傳輸安全指使用SSL/TLS來加密資料通道

通路安全

使用者權限功能在etcd 2.1之後增加的,在2.1版本之前,etcd是一個完全開放的系統,任何使用者都可以通過REST API修改etcd存儲的資料。etcd在2.1中增加了使用者(User)和角色(Role)的概念,引入了使用者認證的功能。為了保證向後相容和可更新性,etcd的使用者權限功能預設關閉。

無論資料信道是否經過加密(SSL/TLS),etcd都支援安全認證與權限管理,etcd的權限管理借鑒了作業系統的權限管理思想,存在使用者和角色(分組)兩種權限管理方法。在作業系統中,預設存在一個超級管理者root,擁有最高權限,其餘所有的使用者權限都派生于oot。另外,系統還預設存在一個訪客(guest)分組,該分組用于授權無認證登入的使用者,并且該分組預設可以新增,修改以及删除其為該角色建立的資料

etcd認證體系分為User和Role,Role被授予給User,代表User擁有某項權利。etcd的認證體系中有一個特殊的使用者和角色,那就是root

root使用者擁有對etcd通路的全部權限,并且必須在啟動認證之前預先建立。設定root使用者的初衷是為了友善管理-——管理角色和普通使用者。root使用者必須是root角色

root角色可以授權給任何使用者。一旦某個使用者被授予root角色,它就擁有全局的讀寫權限以及修改叢集認證配置的權限。一般情況下,root角色所賦予的特權用于叢集維護,例如,修改叢集member關系,存儲碎片整理,做資料快照等

etcd包括三種類型的資源,具體如下:

  • 權限資源(permission resourses) 表示使用者(User)和角色(Role)資訊
  • 鍵值資源(key-value resoursses):表示鍵值對資料資訊
  • 資源配置(settings resourses):安全配置資訊,權限配置資訊和etcd叢集動态配置資訊(選舉/心跳)

權限資源

User(使用者)是一個被授予權限的身份,每一個使用者都可以擁有多個角色(Role)。使用者操作資源的權限(例如讀寫資源)根據該使用者所擁有的角色來确定的。使用者分為root使用者和非root使用者

root使用者是etcd提供的一個特殊使用者。在安全功能被激活之前必須建立root使用者,否則會無法啟動身份認證功能。root使用者具有root角色功能并允許對etcd内部進行任何操作。root使用者的主要目的是為了進行恢複——它會生成一個密碼并存儲在某一個地方,并且被授予root角色來承擔系統管理者的功能。root使用者在我們對etcd叢集進行故障排查和恢複時很重要

Role(角色)用來關聯權限。etcd每個角色(Role)都具有相對應的權限清單,這個權限清單定義了角色對鍵值資源的通路權限。在etcd中角色主要分為三類:root角色,guest角色和普通角色。etcd預設會建立其中兩種特殊角色——root和guest

etcd預設建立root使用者時即建立root角色,并為其綁定該角色,該角色擁有所有權限;guest角色,預設自動建立,主要用于非認證使用。普通角色,由root使用者建立,并由root使用者配置設定指定權限

root角色具有對所有鍵值資源的通路通路權限,而且隻有root角色具有管理使用者資源和配置資源的權限。root角色是内置的,不需要被建立而且不能被修改,但是可以被授予任何使用者相同得權限

另外一個特殊的角色是guest,這個角色會被自動建立。guest角色針對未經身份驗證的請求提供了通路etcd的權限,即如果沒有指定任何驗證方式和使用者通路etcd資料庫,那麼請求方預設會被設定為guest角色。預設情況下,etcd的guest角色具有所有鍵值資源的全局通路權限——預設情況下允許通路整個key空間是考慮到向後相容

Permission

etcd提供了兩種類型的權限(permission):讀和寫。對權限的所有管理和設定都需要通過root角色來實作。權限清單是一個許可的特定權限(讀或寫)的清單

鍵值資源

鍵值資源是指存儲在etcd中的鍵值對資訊。給定一個用于比對的模式清單,當使用者請求的key值比對模式清單中的某項時,相應的權限就會被授予。

目前,etcd隻支援key值的字首和精确比對,其中字首字元串以“ * ”結尾。例如“/foo”表示一個精确的key值或者目錄,那麼隻能該key值或者目錄授予權限,而不能為它的子節點授予權限,而“/foo*”表示所有以foo開頭的key值或者目錄都具有該權限。單獨一個“ * ”表示具有該鍵值資源的完整權限

傳輸安全

etcd支援TLS協定加密通信。TLS通道技能用于加密etcd叢集内部通信,也能加密用戶端與服務端的通信。如果etcd服務啟動時傳入參數“–client-cert-auth=true”,那麼用戶端TLS證書的CN子段就能被用于辨別一個etcd使用者,預設使用該證書登入的使用者即為權限管理系統中對應的使用者,這樣就無需在用戶端在輸入密碼進行權限認證

etcd的傳輸層安全模型使用非對稱加密模型,由公鑰,私鑰,證書。通信基礎是公私鑰以及證書系統。

TLS/SSL工作原理

最新版本的TLS是IETF指定的一種新協定,TLS建立在SSL 3.0協定規範之上,是SSL 3.0的後續版本。TLS與SSL3.0之間的差異主要是他們所支援的加密算法不同,基本原理基本相同

SSL是一個安全協定,它基于TCP/IP通信應用程式提供了隐私與完整性。HTTPS便是使用SSL實作安全通信的。在用戶端與伺服器之間傳輸的資料是通過對稱算法(DES或者RC4)進行加密的。公用密鑰算法(RSA)用來擷取加密密鑰交換和數字簽名,此算法使用伺服器的SSL數字證書的公鑰。有了伺服器的SSL數字證書,用戶端便可以便可以驗證伺服器的身份了。

SSL/TLS認證分為單向認證和雙向認證兩種方式。SSL協定的版本1和版本2隻提供用戶端對伺服器的認證,即單向認證。版本3支援用戶端和伺服器端互相進行身份驗證,即雙向認證,此認證同時需要用戶端和服務端的數字證書。

SSL連接配接總是由用戶端啟動的。SSL會話開始時會先進行SSL握手。用戶端和服務端的SSL握手流程如下:

etcd之安全性闡述
  1. 用戶端向伺服器發送消息“你好”,消息中包含SSL版本,用戶端支援的密碼對和用戶端支援的資料壓縮方法(哈希函數)等,此外,還包括28子節二點随機數
  2. 服務端以消息“您好”響應用戶端,此消息包含密碼對和由伺服器選擇的資料壓縮方法,以及會話辨別和另外一個随機數。
  3. 伺服器端向用戶端發送其SSL數字證書。如果伺服器端需要通過數字證書與用戶端進行認證,則用戶端會發出“數字證書請求”的消息。在“數字證書請求中”,服務端發出支援用戶端數字證書類型的清單和可接受的CA名稱
  4. 伺服器端發出“您好完成”的消息并等待用戶端響應
  5. 已接受到伺服器“您好完成”消息,用戶端就會驗證伺服器的SSL數字證書的有效性,并檢查伺服器的“您好”消息參數是否可以接受。如果伺服器請求用戶端數字證書,那麼用戶端将發送數字證書;如果沒有合适的數字證書可用,那麼用戶端将發送“沒有數字證書”的警告。此警告僅僅是警告而已,但是如果用戶端數字證書認證是強制性的,那麼伺服器應用程式将會使會話失敗。
  6. 用戶端發送“用戶端密鑰交換”消息。此消息包含pre-master secret(一個用于對稱加密密鑰生成的46位元組的随機數字)和消息認證代碼(MAC)密鑰(用伺服器的公鑰加密的)。如果用戶端向伺服器發送數字證書,用戶端将發出簽有用戶端u你的專用密鑰的“數字證書認證”消息。通過驗證此消息的簽名,伺服器可以顯示驗證用戶端數字證書的所有權
  7. 用戶端使用一系列的加密算法将pre-master secret 轉換為master secret,其中将派生出所有用于加密和消息認證的密鑰。然後,用戶端發出“更改密碼規範”消息将伺服器轉換為新協商的密碼對。用戶端發出的下一個消息為用此密碼方法和密鑰加密的第一條消息
  8. 伺服器以自己的“更改密碼規範”消息響應
  9. SSL握手結束,并且可以發送加密的使用者資料