我在最近 10 年職業生涯中的大部分時光從事的是財務服務部門的 IT 運營。在我工作的大多數環境中,基于角色的權限控制(RBAC)和對活動目錄(AD)的集成都是必須的。因此,如果想銷售不包含這兩個特性的產品,用戶通常是不買賬的。不過,Docker EE 具備這兩個特性。下面我們主要討論一下 RBAC。
UCP 通過一種稱為授權(Grant)的東西實現了 RBAC。大體上,一個授權有以下 3 個概念構成。
? 主體(Subject)。
? 角色(Role)。
? 集合(Collection)。
主體即一個或多個用戶,或一個團隊。角色是一系列權限的組合,而集合則是權限作用的資源,如下圖所示。
如下圖所示,SRT 團隊具有對 /zones/dev/srt 集合中所有資源的 container-full-control 權限。
創建一個授權包含如下步驟:
? 創建用戶和團隊。
? 創建一個自定義的角色。
? 創建一個集合。
? 創建一個授權。
只有 UCP 管理員才可以創建和管理用戶、團隊、角色、集合和授權。因此讀者需要以UCP管理員的身份登錄才能進行下面的操作。
將用戶置于團隊中進行組管理,然后為團隊分配授權是一種最佳實踐。當然也可以為單獨的用戶分配授權,但并不推薦。下面創建一些用戶和團隊。
⒈ 登錄到 UCP。
⒉ 展開 User Management(用戶管理),然后單擊 Users(用戶)。這里可以創建用戶。
⒊ 單擊 Organization & Teams(組織&團隊)。這里可以創建組織。在本例后續的步驟中,將會使用一個稱為“manufacturing”的組織。
⒋ 單擊 manufacturing 組織,并創建一個團隊。團隊存在于組織中,不能在組織之外創建一個團隊,并且一個團隊只能存在于一個組織中。
⒌ 向團隊中添加用戶。添加用戶時,單擊進入團隊,然后選擇 Actions(操作)菜單中的 Add Users(添加用戶)。下圖顯示了如何向 manufacturing 組織中的 SRT 團隊添加用戶。
現在已經有用戶和團隊了。UCP 會向 DTR 共享其用戶數據庫,因此在 UCP 中創建的用戶和團隊在 DTR 中也是可見的。
自定義的角色是很強大的,它提供了非常細粒度的權限分配機制。下面將創建一個名為 secret-opt 的新的自定義角色,該角色允許被分配的主體創建、刪除、更新、使用和查看 Docker 密鑰。
⒈ 展開左側導航欄中的 User Management 頁簽,然后選擇 Roles(角色)。
⒉ 創建一個新角色。
⒊ 給角色命名。本例會創建一個名為“secret-opts”的自定義角色,并放開所有與密鑰相關的操作權限。
⒋ 選擇 SECRET OPERATIONS(密鑰選項)并瀏覽可分配給角色的操作項列表。列表較長,可以用來指定具體的某個操作項。
⒌ 選擇希望分配給角色的 API 操作。本例中,分配所有與密鑰相關的 API 操作,下圖所示。
⒍ 單擊 Create(創建)。
這個角色已經在系統中創建好,并可以被分配給多個授權。下面創建一個集合。
通過前面的學習已經了解了網絡、卷、密鑰、服務以及節點都是 Swarm 資源—— 它們保存在 Swarm 配置文件 /var/lib/docker/swarm。使用集合可以根據組織架構和 IT 需要來對資源進行分組。例如,IT 基礎架構可能會分為 3 個域(zone):prod、test 和 dev。這種情況下,就可以創建 3 個集合,然后分別分配資源,如下圖所示。
每一個資源只可以存在于某一個集合中。
下面,創建一個新的名為 zones/dev/srt 的資源,然后給它分配一個密鑰。集合是支持層次結構的,因此本例中應依次創建 3 個嵌套的集合:zones > dev > srt。
在 Docker UCP Web 界面中進行如下操作。
⒈ 在左側導航欄中選擇 Collections(集合),然后選擇 Create Collection(創建集合)。
⒉ 創建名為 zones 的根集合。
⒊ 單擊 /zones 集合的 View Children(查看子集合)。
⒋ 創建一個名為 dev 的內嵌子集合。
⒌ 單擊 /zones/dev 集合的 View Children(查看子集合)。
⒍ 創建名為 srt 的子集合。
到此為止,/zones/dev/srt 集合就創建好了。然而,它還是空的。下面將為其添加一個密鑰。
⒈ 創建一個新的密鑰。可以用命令行或 UCP Web 界面創建它。這里介紹 Web 界面的方式。在 UCP Web 界面單擊 Secrets > Create Secret(創建密鑰)。填寫名稱等信息,然后單擊 Save。在創建密鑰的同時也可以為其配置集合,但是這里并不這樣操作。
⒉ 在 UCP Web 界面中選擇該密鑰。
⒊ 在 Configure(配置)下拉菜單中單擊 Collection。
⒋ 依次進入 View Children 層次結構并最終選擇 /zones/dev/srt,然后單擊 Save。
現在該密鑰已屬于 /zones/dev/srt 集合,并且無法再加入其他集合。
在創建授權之前,關于集合還有一點需要注意。集合采用的是層次結構,適用于某集合的權限同樣適用于其子集合。如下圖所示,dev 團隊具有對 /zones/dev 集合的權限,因此,該團隊自動具有 srt、hellcat 和 daemon 子集合的權限。
現在有用戶、團隊、自定義角色和集合,可以創建授權了。本例會為 srt-dev 團隊創建一個授權,該授權對 /zones/dev/srt 集合中的所有資源擁有自定義角色 secret-ops 的權限。
授權即配置誰,對哪些資源,擁有什么權限,如下圖所示。
⒈ 在左側導航欄展開 User Management 頁簽,然后單擊 Grant(授權)。
⒉ 創建一個新的授權。
⒊ 單擊 Subject(主體),然后選擇 manufacturing 組織下的 SRT 團隊。也可以選擇整個組織。這樣的話,組織中的所有團隊都會被包含在該授權中。
⒋ 單擊 Role,然后選擇自定義的 secret-ops 角色。
⒌ 單擊 Collections,然后選擇 /zones/dev/srt 集合。此時可能需要在頂級 Swarm 集合下查找子集合 /zones。
⒍ 單擊 Save 來創建授權。
現在授權已經創建好了,在系統的所有授權的列表中可以找到它,如下圖所示。manufacturing/SRT 團隊中的所有用戶都有權對 /zones/dev/srt 集合中的資源進行與密鑰相關的操作。
授權生效后仍然可以進行修改。例如,可以添加用戶到團隊或添加資源到集合。但是無法修改分配給角色的 API 操作。當想要修改角色中的權限時,需要創建一個新的配置有所需權限的角色。
這是最后一點關于 RBAC 的介紹。為了調度將集群中的工作節點進行分組是可行的。例如,有時會為開發、測試和 QA 負載運行一個集群——用一個集群可能會減少管理開銷,并且可以輕松地將節點分配給 3 個不同的環境。但此時仍然希望能夠對工作節點進行區分,從而實現諸如僅 dev 團隊的用戶才可以對 dev 集合中的節點進行調度的效果。
這同樣可以基于授權來實現。首先,需要將 UCP 工作節點分配給自定義的集合。然后,基于該集合、內置的 Scheduler 角色以及希望為其分配權限的團隊,來創建授權。
下圖中所示的簡單示例表示允許 dev 團隊中的成員將服務和容器調度到 /zones/dev 集合中的工作節點。