天天看點

玩轉運維編排服務的權限:Assume Role+Pass Role什麼是運維編排服務?權限相關的三個基本概念:使用者,授權政策,角色權限問題1:Assume Role權限問題2:Pass Role歡迎使用OOS系列文章

什麼是運維編排服務?

阿裡雲運維編排服務(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),并且信任運維編排服務,如下圖所示:

玩轉運維編排服務的權限:Assume Role+Pass Role什麼是運維編排服務?權限相關的三個基本概念:使用者,授權政策,角色權限問題1:Assume Role權限問題2:Pass Role歡迎使用OOS系列文章

第二步,就是給這個角色賦予權限政策,使用者如果希望OOS來管理ECS,就可以考慮把AliyunECSFullAccess這個權限政策賦予給這個角色。

玩轉運維編排服務的權限:Assume Role+Pass Role什麼是運維編排服務?權限相關的三個基本概念:使用者,授權政策,角色權限問題1:Assume Role權限問題2:Pass Role歡迎使用OOS系列文章

那麼,接下來,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權限“委托授權”給了模闆的執行者。

玩轉運維編排服務的權限:Assume Role+Pass Role什麼是運維編排服務?權限相關的三個基本概念:使用者,授權政策,角色權限問題1:Assume Role權限問題2:Pass Role歡迎使用OOS系列文章

在委托授權的場景下,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

系列文章

主題文章

場景系列

運維編排場景系列-----給ECS執行個體自動打TAG 運維編排場景系列----從執行個體中拷貝檔案到OSS 運維編排場景系列----給執行個體加到SLS機器組