什麼是運維編排服務?
阿裡雲運維編排服務(Operation Orchestration Service,簡稱OOS)是雲上的自動化運維平台,提供運維任務的管理和執行。典型使用場景包括:事件驅動運維,批量操作運維,定時運維任務,跨地域運維等,OOS為重要運維場景提供審批,通知等功能。OOS幫使用者實作标準化運維任務,進而實踐運維即代碼(Operations as Code)的先進理念。OOS支援跨産品使用,使用者可以使用OOS管理ECS、RDS、SLB、VPC等雲産品。
用大白話講,就是阿裡雲的使用者編寫一個包含運維邏輯的模闆,送出給OOS,然後OOS在雲端,以使用者的身份執行這個模闆裡面的運維邏輯。
阿裡雲OOS的公共模闆已經開源在
github更多的資訊請參考之前的文章
阿裡雲重磅釋出雲上自動化利器——運維編排OOS或參考
運維編排官方幫助文檔權限相關的三個基本概念:使用者,授權政策,角色
先說使用者,使用者就是賬号,這個概念很好了解。使用者分為兩類:主賬号和子賬号。
阿裡雲上的使用者在最開始使用阿裡雲服務的時候,都會注冊一個雲賬号,這個注冊生成的賬号就叫做主賬号,可以了解為root賬号,擁有最高的權限。
接下來,擁有主賬号的使用者如果想要建立子賬号,就需要開通一個叫做RAM (Resource Access Management)的雲産品。開通RAM之後,就可以在RAM控制台上,建立子賬戶。 建立子賬戶的目的,是為了限制子賬戶的權限,避免root賬戶被濫用和洩露的風險。
那麼,子賬戶的權限如何限制呢?這兒就要先引入授權政策的概念。授權政策表示一組權限的集合,比如針對ECS的建立銷毀啟停的權限集合。授權政策也分兩類,一類是阿裡雲内置的系統授權政策,另一類是使用者自定義的授權政策。OOS服務預設包含了兩個系統授權政策,一個叫做OOSFullAccess,相當于擁有了OOS這個服務的全部權限,另一個叫做OOSReadOnlyAccess,相當于隻能讀取OOS的模闆和曆史執行的資料,不能做修改模闆也不能啟動執行。
賬号和授權政策之間,是多對多的關系。主賬戶或者管理者,可以決定,每一個子賬号擁有哪些權限政策。比如,給user1配置設定OOSFullAccess權限政策,而給user2配置設定OOSReadOnlyAccess權限政策。
那麼,什麼是角色(Role)呢?角色是一種虛拟的使用者,它不對應任何可以控制台登入的賬戶,但主賬号或管理者可以建立Role并給Role像普通使用者一樣賦予授權政策。那麼誰來使用這些虛拟使用者(Role)呢?典型的使用場景就是雲産品。主賬戶或者管理者,可以為角色配置“信任關系”,也就是可以決定哪些雲産品能夠使用這些虛拟賬戶。
權限問題1:Assume Role
OOS的核心功能,是要按照使用者的身份去執行使用者提前編寫好的模闆。這裡面就涉及到了一個基本問題:OOS作為一個雲産品,用什麼樣的身份去執行使用者編寫的模闆呢?
如果單從簡單實作的角度,而不考慮安全,那麼阿裡雲直接給OOS賦予一個超級權限就可以了,反正是“自家”産品。這樣做可以嗎?我們認為不可以。使用者需要有能力對OOS進行限制,需要可以決定OOS可以操作哪些資源,不可以操作哪些資源。也就是說,OOS在執行使用者的模闆的時候,一定是“扮演”了某個使用者可控的身份。
相信聰明的讀者已經想到了,這裡用到了前面介紹的角色(Role),以及Assume Role這個功能。Assume Role,就是雲産品,扮演使用者的某個角色。使用者,需要進行兩個操作步驟:第一步,就是建立一個角色(Role),并且信任運維編排服務,如下圖所示:

第二步,就是給這個角色賦予權限政策,使用者如果希望OOS來管理ECS,就可以考慮把AliyunECSFullAccess這個權限政策賦予給這個角色。
那麼,接下來,OOS是怎麼Assume Role執行模闆的呢? 在OOS模闆裡面,可以通過“RamRole”這個字段指定一個角色,OOS在背景執行這個模闆的時候,就會嘗試扮演這個Role。如果模闆沒有指定,那麼OOS就會嘗試扮演預設的角色,也就是OOSServiceRole這個角色。
FormatVersion: OOS-2019-06-01
RamRole: 'OOSServiceRole'
Tasks:
- Name: describeRunningInstancesByTag
Action: ACS::ExecuteApi
Description: Views running ECS instances by specifying tag.
Properties:
Service: ECS
API: DescribeInstances
Parameters:
Status: Running
Tags:
- Key: 'tagkey'
Value: 'tagvalue'
如果使用者沒有預先建立相應的角色,那麼在執行的時候,就會報錯,錯誤消息類似于“:Assumes role failed. Code: EntityNotExist.Role, msg: The role not exists: acs::111111:role/OOSServiceRole.”
如果使用者建立了這個角色,但是并沒有信任運維編排服務,那麼,就會報錯,錯誤消息類似于“Assumes role failed. Code: NoPermission, msg: You are not authorized to do this action. You should be authorized by RAM.”
使用者可以手動編輯該Role對應的信任政策
{
"Statement": [
{
"Action": "sts:AssumeRole",
"Effect": "Allow",
"Principal": {
"Service": [
"oos.aliyuncs.com"
]
}
}
],
"Version": "1"
}
權限問題2:Pass Role
如果操作OOS的都是主賬号或者管理者,那麼問題似乎已經解決了。但事實上,企業IT部門,都會有子賬戶的需求。子賬戶的權限,往往各種各樣。雖然管理者信任OOS服務來扮演模闆中指定的角色,但是管理者未必信任所有的子賬戶,通過執行OOS服務來使用上述的角色。這裡面,OOS服務成了一個中間人,子賬戶使用OOS,OOS使用角色。那麼,如何決定子賬戶對于角色的間接使用權限呢?這就利用到了角色傳遞(Pass Role)這個功能。
下面,我們都過兩個不同場景,來解釋和說明。
場景1:子賬戶執行一個公共模闆,比如給一批ECS設定定時啟動,并選擇使用非預設的角色MyOOSRole(我們的公共模闆,是允許使用者在執行時選擇角色的)。這個場景非常常見。管理者要提前做兩步動作:第一步,準備一個權限政策,要允許PassRole調用MyOOSRole這個角色,權限政策具體内容如下:
{
"Version": "1",
"Statement": [
{
"Effect": "Allow",
"Action": "ram:PassRole",
"Resource": "acs:ram::{parent_uid}:role/myoosrole"
}
]
}
第二步,把這個權限政策賦予該子賬戶。
如果子賬戶沒有相應的PassRole權限,會報錯提示“User has no permission to do the action: (PassRole)”。
場景2:委托授權。我們想象一個場景,高規格的ECS是需要部門經理審批後才能建立的,按照前面介紹的PassRole場景,我們可以把“申請-審批-建立ECS-給ECS初始化”的整個工作流編排到一個模闆裡,同時準備一個擁有ECS權限并且信任OOS服務的角色,然後把這個模闆交給普通使用者使用。這裡面有個問題,就是我們既不希望給普通使用者授予PassRole權限,也不希望給普通使用者授予建立ECS的權限,怎麼辦呢?為了同時實作安全性和友善性,我們推薦“委托授權”。在這個場景裡面,有兩類不同的子賬戶,第一類是模闆的管理者,負責自定義模闆的開發和維護工作,比如“申請一台高規格的ECS執行個體”的模闆。另一類子賬戶是模闆的執行者,需要通過執行這個模闆來發起對于ECS的申請。模闆的管理者擁有模闆編輯的權限,給模闆指定了一個角色,并擁有該角色對應的PassRole權限。而模闆的執行者,隻需要擁有該模闆的執行權限就可以了,并不需要感覺模闆後面對應的角色,更不需要該角色的PassRole權限。這種場景,就叫做模闆的管理者把PassRole權限“委托授權”給了模闆的執行者。
在委托授權的場景下,PassRole的鑒權動作,發生在模闆管理者建立模闆的時候,而不是在模闆執行者執行模闆的時候,理由是該模闆的角色(假設為OOSServiceRole)是在建立時刻被模闆管理者指定的,執行者不感覺角色。在權限政策的配置設定上,模闆管理者需要PassRole調用OOSServiceRole的權限 + 編輯模闆的權限,模闆執行者隻需要讀取和執行模闆的權限。請注意,這不适用于場景1中,子賬戶在執行模闆時自主選擇角色的情況。
在實際使用中,管理者可能會建立多個角色,都信任給OOS來扮演。那麼在給子賬戶賦予PassRole權限的時候,如果把角色一個個都列出來,也會很繁瑣。為了簡化,管理者可以決定,隻要是OOS能扮演的角色,就都允許某個子賬戶PassRole調用。比如,AliyunOOSFullAccess這個系統權限政策就是:
{
"Statement": [
{
"Action": "oos:*",
"Effect": "Allow",
"Resource": "*"
},
{
"Action": "ram:PassRole",
"Resource": "*",
"Effect": "Allow",
"Condition": {
"StringEquals": {
"acs:Service": "oos.aliyuncs.com"
}
}
}
],
"Version": "1"
}
歡迎使用OOS
OOS管理控制台的連結:
https://home.console.aliyun.com/redirect.htm?productId=ecs&path=automation/region/ OOS幫助文檔的連結OOS客戶支援釘釘群:23330931