ECS例項RAM角色實踐

玄嶽發表於2017-06-06

ECS例項RAM角色快速入門

概述

以往部署在ECS例項中的應用程式如果需要訪問阿里雲其他雲產品的API,通常需要藉助於AccessKeyId和AccessKeySecret(下文簡稱AK)來實現。AK是使用者訪問阿里雲API的金鑰,具有相應賬戶的完整許可權。但是為了方便應用程式對AK的管理,使用者通常需要將AK儲存在應用程式的配置檔案中或以其他方式儲存在例項中。這在一定程度上增加了AK管理上的複雜性且降低了AK的保密性,尤其是對有多地域一致性部署需求的使用者,AK將隨著映象及映象建立的例項擴散出去。在需要更換AK時,也需要逐臺例項(和映象)進行更新和重新部署。此外,使用AK雖然簡單,但AK的許可權過大,無法做到精細的許可權控制。

現在藉助於ECS例項RAM角色,我們可以將RAM角色和ECS例項關聯起來,例項內部的應用程式則通過STS臨時憑證訪問其他雲產品的API。其中臨時憑證由系統自動生成和更新,應用程式可以通過訪問例項後設資料的指定URL獲取臨時憑證,而無須特別的管理。同時藉助於RAM,使用者可以通過對角色和授權策略的管理,達到不同例項對不同雲產品或相同雲產品具有各自訪問許可權的目的。

本文接下來將詳細介紹ECS例項使用RAM角色的正確姿勢,為了方便讀者隨本篇樣例快速入門,全文將基於OpenAPI Explorer操作(OpenAPI Explorer將各產品的API及引數以視覺化的方式展現出來,並能自動生成Java,Python等SDK的樣例程式碼)。具體分為以下幾個步驟:

  1. 通過RAM建立角色,並配置授權策略
  2. 指定RAM角色建立ECS例項
  3. 在例項內部訪問例項後設資料URL獲取STS臨時憑證
  4. 基於臨時憑證,使用Python SDK訪問OSS

注:OpenAPI Explorer通過已登入使用者資訊獲取當前賬號臨時AK,對當前賬號線上資源發起線上資源操作,請小心操作。同時建立例項操作也會產生一定的費用!操作完成後請及時釋放例項。

建立RAM角色&配置策略

  1. 建立RAM角色。找到OpenAPI Explorer RAM產品下CreateRole API。其中RoleName引數可以根據自己的需要填寫,如本文填“RamRoleTest”。AssumeRolePolicyDocument填如下內容,表示該角色為一個服務角色,受信雲服務(此處為ECS)可以扮演該角色:
    
    

{
“Statement”: [

{
  "Action": "sts:AssumeRole",
  "Effect": "Allow",
  "Principal": {
    "Service": [
      "ecs.aliyuncs.com"
    ]
  }
}

],
“Version”: “1”
}

1.png

  1. 建立授權策略。找到CreatePolicy API。其中PolicyName本文填“RamRolePolicyTest”。PolicyDocument填以下內容,表示該角色具有OSS只讀許可權。
    
    

{
“Statement”: [

{
  "Action": [
    "oss:Get*",
    "oss:List*"
  ],
  "Effect": "Allow",
  "Resource": "*"
}

],
“Version”: “1”
}

當希望通過子賬號建立指定RAM角色的ECS例項時,還需要在上述“Statement”節點中額外增加ECS相關的許可權和PassRole許可權,如下所示。其中“…”需要替換成具體的ECS RAM Action,或替換成“ecs:*”表示所有Action。


{
  "Action": ...,
  "Resource": "*",
  "Effect": "Allow"
},
{
  "Action": "ram:PassRole",
  "Resource": "*",
  "Effect": "Allow"
}

2.png

  1. 為角色附加授權。找到AttachPolicyToRole API。其中PolicyType填“Custom”,PolicyName填第2步建立的“RamRolePolicyTest”,RoleName填第1步建立的“RamRoleTest”。
    3.png

指定角色建立例項

  1. 建立例項。找到OpenAPI Explorer ECS產品下的CreateInstance API,引數可根據實際情況進行填寫,主要需要填寫的引數有:RegionId、ImageId、ecs.n1.tiny、VSwitchId和RamRoleName。由於ECS例項RAM角色目前只支援VPC例項,所以VSwitchId是必須的,RamRoleName則填之前建立的RamRoleTest。
    5.png
  2. 設定密碼和啟動例項。從ECS控制檯“例項標籤頁”重置例項密碼,並啟動例項。

獲取STS臨時憑證

從ECS控制檯遠端連線例項,並登陸到例項中。訪問http://100.100.100.200/latest/meta-data/ram/security-credentials/RamRoleTest獲取STS臨時憑證,其中路徑最後為例項名。
6.png

基於臨時憑證訪問OSS

  1. 命令列輸入pip install oss2安裝OSS python SDK
  2. 執行下述命令進行測試,其中oss2.StsAuth中的前三個引數分別對應於上述URL返回的AccessKeyId、AccessKeySecret和SecurityToken。
import oss2
from itertools import islice

auth = oss2.StsAuth(<AccessKeyId>, <AccessKeySecret>, <SecurityToken>)
bucket = oss2.Bucket(auth, "oss-cn-qingdao.aliyuncs.com", "bozhi-qd")

for b in islice(oss2.ObjectIterator(bucket), 10):
    print(b.key)

7.png

相關文件

  1. 支援RAM的雲服務列表
  2. RAM產品文件
  3. RAM中可對ECS資源進行授權的Action
  4. ECS例項後設資料
  5. OSS STS授權訪問
  6. OSS python SDK管理檔案


相關文章