閱讀435 返回首頁    go 阿裏雲 go 技術社區[雲棲]


使用Ecs OpenAPI正確模式

阿裏雲賬號體係

賬號背景

在官網注冊的賬號,就是阿裏雲的普通賬號,普通賬號可以直接在阿裏雲控製台上創建/操作/查詢/刪除各種資源(對於Ecs產品來說,這些資源包括:實例-instance 磁盤-disk 鏡像-image 快照-snapshot 安全組-securitygroup)。當您在阿裏雲擁有的資源數量越來越多,或者使用同一個賬號管理資源的同事越來越多時,單一賬號對資源進行操作就不很方便了。為了解決這個問題,阿裏雲提供了一套子賬號的解決方案。

子賬號概述

在您的普通賬號名下,可以創建多個子賬號,這些子賬號並不是阿裏雲的普通賬號,它完全隸屬於您的阿裏雲賬號,子賬號的操作都將被映射成您阿裏雲賬號的操作。子賬號對您雲賬號中資源的操作權限均由阿裏雲賬號在RAM(控製訪問)中定義。

權限定義

權限的判定過程有2個:授權和鑒權。授權是由用戶雲賬號操作的步驟,對自己的子賬號授予一定的權限(稱為授權策略),子賬號隻能進行在這個權限定義內的操作;鑒權是由後台自動進行的,子賬號在進行每一個操作時,後台都會轉化為一個權限描述(稱為鑒權請求)來與授權策略進行對比,如果鑒權請求要求的權限小於授權策略,鑒權成功,執行用戶請求,否則直接返回失敗。
首先我們簡單看一下授權策略,RAM將每個操作的權限主要分為兩個部分:Action和Resource,一個經典的授權策略如下:

{
  "Version": "1",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "ecs:StartInstance",
      "Resource": "acs:ecs:cn-hangzhou:123456:instance/i-test",
      "Condition": {
        "IpAddress": {
          "acs:SourceIp": "42.120.74.111"
        }
      }
    }
  ]
}
  • Action 主要由兩部分組成,":"前麵部分為產品,一般為產品名稱的小寫,":"後麵部分是具體的操作,一般為操作對應接口的接口名,Ecs產品的接口定義見這裏
  • Resource 主要為5部分組成,各部分定義為:acs:${產品}:${地域}:${賬號ID}:${資源類型}/${資源ID}
  • 附加部分,Effect指本策略為Allow還是Deny行為,其他為對授權策略的進一步細化,詳細取值介紹見這裏
    所以上麵的授權語句翻譯成直白的意思就是允許被授予了這個授權策略的以下操作:從42.120.74.111 IP地址發起的,針對cn-hangzhou Region下用戶ID為123456的用戶實例i-test進行StartInstance操作。注意,這裏用戶ID一般隻能設置自己阿裏雲賬號ID或"*",即隻能給用戶授權操作自己的資源。

操作示例

下麵我們使用一個操作示例來簡單介紹一下子賬號操作的基本步驟。**主賬號** 為登錄您的阿裏雲賬號進行的操作,**子賬號** 為按照下麵第一個步驟使用子賬號登錄的操作。

主賬號 登陸RAM控製台,在“用戶管理”中“新建用戶”,然後在該用戶的管理界麵可以在“Web控製台登錄管理”中“啟用控製台登錄”。在概覽頁可以點擊“RAM用戶登錄鏈接”使用剛剛創建的子賬號登錄。
子賬號 在沒有授權的情況下,子賬號是沒有任何權限的,因此此時打開Ecs控製台是看不到任何資源的。
主賬號策略管理中新建一個策略,策略內容為附件中指定region權限,然後在RAM控製台,在剛創建的子用戶上點授權,授予剛剛創建的權限。
子賬號 返回Ecs控製台,這時已經可以看到華南1下麵的實例,切換其他region,都是無法看到的。

更複雜的操作

剛才的操作是不涉及其他的資源操作,授權規則非常簡單接下來我們就從創建實例開始,完成一個複雜規則的授權。

準備資源

創建實例主要涉及到兩種資源:安全組和鏡像,首先如果沒有安全組,可以創建一個安全組,記住安全組ID(sg-xxxxx);鏡像我們提供了係統鏡像可以使用,您也可以使用自定義鏡像(m-xxxxxx)。

授權規則

給子用戶授權附件中創建實例權限,其中image和securitygroup後麵填寫的資源就是剛剛準備好的資源(如果使用係統鏡像則可以不寫鏡像這種資源的授權)。這裏"Action": "ecs:Describe*",意思是授權子賬號進行Describe開頭的操作,也就是查詢操作。授權完成後,可以使用子賬號操作。

操作

子賬號登錄API控製台,選擇ECS的創建實例接口,在RegionId/ImageId/SecurityGroupId中填寫相應的值(地域/鏡像/安全組),如果創建VPC實例,需要再填VSwitchId參數,然後發送請求,在右側可以看到請求結果,如果成功返回新的實例ID,說明授權無誤。
然後修改其中一個參數(比如更換一個沒有授權的安全組),發送請求後就可以看到沒有授權的錯誤碼。

進階內容

其他幾種典型授權

  • 啟動實例
"Action": "ecs:StartInstance",
  • 關閉實例
"Action": "ecs:StopInstance",
  • 控製台創建實例
"Action": ["ecs:RunInstances","ecs:CreateInstance"],

授權中可使用的幾種其他限製

  1. acs:CurrentTime

授權的有效時間,用於限定定時有效的授權,授權時使用如下,代表此條授權在2017-06-23T23:59:59Z前有效:

{
  "Version": "1",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "*",
      "Resource": "*",
      "Condition": {
        "DateLessThan": {
          "acs:CurrentTime": "2017-06-23T23:59:59Z"
        }
      }
    }
  ]
}

典型使用場景 在授權子用戶訪問資源時,需要限定子賬號在某段時間內有權限,可以達到權限的最小化控製,授權可以自動失效。

  1. acs:SecureTransport

是否使用https進行調用,授權時使用如下,代表訪問授權的接口時必須使用https協議:

{
  "Version": "1",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "*",
      "Resource": "*",
      "Condition": {
        "Bool": {
          "acs:SecureTransport": "true"
        }
      }
    }
  ]
}

典型使用場景 對於安全性要求較高的應用,公司可能會要求阿裏雲資源的管控操作必須使用安全的https連接,我們提供了對子賬號可以限製調用協議的能力,可以讓您限製實際的操作子賬號的請求協議完全走安全的https。

  1. acs:SourceIp

來源ip限定,授權時使用如下,代表授權了此規則的用戶,隻能由"42.120.88.10", "42.120.66.0/24"兩個IP(段)發起請求。

{
  "Version": "1",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "*",
      "Resource": "*",
      "Condition": {
        "IpAddress": {
          "acs:SourceIp": ["42.120.88.10", "42.120.66.0/24"]
        }
      }
    }
  ]
}

典型使用場景 對於安全性要求較高的應用,公司可能會要求阿裏雲資源的管控操作必須在公司或從特定VPN操作,這時,就需要設定這種IP限定,把公司的出口IP設置在授權策略中。

終極操作

我們還提供了批量資源授權的功能(同種資源分批授權),詳見下一期。

附件

  • 指定region權限
{
  "Version": "1",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "ecs:DescribeInstances",
      "Resource": "acs:ecs:cn-shanghai:*:instance/*"
    }
  ]
}
  • 創建實例權限
{
  "Version": "1",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "ecs:CreateInstance",
      "Resource": [
        "acs:ecs:cn-hangzhou:*:image/m-xxxxxx",
        "acs:ecs:cn-hangzhou:*:securitygroup/sg-xxxxx",
        "acs:ecs:cn-hangzhou:*:instance/*"
      ]
    },
    {
      "Effect": "Allow",
      "Action": "ecs:Describe*",
      "Resource": [
        "acs:ecs:cn-hangzhou:*:images/*",
        "acs:ecs:cn-hangzhou:*:securitygroup/*"
      ]
    }
  ]
}

最後更新:2017-06-26 15:33:20

  上一篇:go  SQL Server Parameter Sniffing及其改進方法
  下一篇:go  《數據結構與抽象:Java語言描述(原書第4版)》一1.2 說明一個包