阿里雲許可權管理機制包括存取控制和臨時安全性權杖,可以根據需求使用不同許可權的RAM使用者來訪問Tablestore,也支援為使用者提供訪問的臨時授權。使用RAM和STS能極大地提高管理的靈活性和安全性。

背景資訊

RAM和STS解決的一個核心問題是如何在不暴露主帳號的AccessKey的情況下安全地授權其他人訪問。因為主帳號的AccessKey泄露會帶來極大的安全風險,其他人可以隨意操作該帳號下所有的資源、盜取重要訊息等。
  • 存取控制(RAM)是阿里雲提供的系統管理使用者身份與資源存取權限的服務。

    RAM允許在一個阿里雲帳號下建立並管理多個身份,並允許給單個身份或一組身份分配不同的許可權,從而實現不同使用者擁有不同資源存取權限的目的。更多資訊,請參見什麼是存取控制

  • 阿里雲臨時安全性權杖(Security Token Service,STS)是阿里雲提供的一種臨時存取權限管理服務。

    通過STS服務,您所授權的身份主體(RAM使用者或RAM角色)可以擷取一個自訂時效和存取權限的臨時存取權杖。更多資訊,請參見什麼是STS

RAM提供了一種長期有效許可權控制機制,通過分出不同許可權的RAM使用者,將不同的許可權分給不同的使用者,即使RAM使用者的AccessKey泄露也不會造成全域的資訊泄露。RAM使用者一般情況也是長期有效。因此RAM使用者的AccessKey也不能泄露。

相對於RAM提供的長效控制機制,STS提供的是一種臨時訪問授權,通過STS可以擷取臨時的AccessKey和Token,這些資訊可以直接發給臨時使用者用來訪問Tablestore。一般來說,從STS擷取的許可權會受到更加嚴格的限制,並且擁有時間限制,因此即使這些資訊泄露,對於系統的影響也很小。

配置RAM使用者權限

  1. 建立RAM使用者。具體操作,請參見建立RAM使用者
  2. 為RAM使用者授權,根據實際配置RAM使用者的許可權。具體操作,請參見為RAM使用者授權
    • 如果需要管理Tablestore,例如建立執行個體等,請授予RAM使用者AliyunOTSFullAccess許可權。
    • 如果需要唯讀訪問Tablestore,例如讀取表中資料等,請授予RAM使用者AliyunOTSReadOnlyAccess許可權。
    • 如果需要唯寫訪問Tablestore,例如建立資料表等,請授予RAM使用者AliyunOTSWriteOnlyAccess許可權。
    说明 如果需要更精細的許可權控制,您可以建立自訂權限原則,進行策略許可權的配置。更多資訊,請參見自訂許可權
  3. 為RAM使用者佈建多因素認證。具體操作,請參見為RAM使用者啟用多因素認證

配置臨時使用者權限

  1. 建立臨時角色及授權。
    1. 建立可信實體為阿里雲帳號的RAM角色。具體操作,請參見建立可信實體為阿里雲帳號的RAM角色

      建立名稱分別為RamTestAppReadOnly和RamTestAppWrite兩個角色,RamTestAppReadOnly用於讀取等操作,RamTestAppWrite用於上傳檔案的操作。

    2. 建立自訂策略。具體操作,請參見建立自訂權限原則
      说明 如果需要更精細的許可權控制,您可以自訂策略的許可權。更多資訊,請參見自訂許可權
      建立名稱分別為ram-test-app-readonly和ram-test-app-write的兩個策略。
      • ram-test-app-readonly策略
        {
        "Statement": [
            {
              "Effect": "Allow",
              "Action": [
                "ots:BatchGet*",
                "ots:Describe*",
                "ots:Get*",
                "ots:List*"
              ],
              "Resource": [
                "acs:ots:*:*:instance/ram-test-app",
                "acs:ots:*:*:instance/ram-test-app/table/*"
              ]
            }
        ],
        "Version": "1"
        }
                                
      • ram-test-app-write策略
            {
         "Statement": [
                {
                  "Effect": "Allow",
                  "Action": [
                    "ots:Create*",
                    "ots:Insert*",
                    "ots:Put*",
                    "ots:Update*",
                    "ots:Delete*",
                    "ots:BatchWrite*"
                  ],
                  "Resource": [
                    "acs:ots:*:*:instance/ram-test-app",
                    "acs:ots:*:*:instance/ram-test-app/table/*"
                  ]
                }
         ],
         "Version": "1"
            }
                                
    3. 為臨時角色授權。具體操作,請參見為RAM角色授權

      為ramtestappreadonly角色賦予ram-test-app-readonly(唯讀訪問Tablestore)策略,為ramtestappwrite角色賦予ram-test-app-write(唯寫Tablestore)策略。

      授權完成後,記錄角色的ARN,即需要扮演角色的ID,如下圖所示。fig_arn
  2. 臨時授權訪問。
    1. 建立自訂策略。具體操作,請參見建立自訂權限原則
      说明 如果需要更精細的許可權控制,您可以自訂策略的許可權。更多資訊,請參見自訂許可權
      建立名稱分別為AliyunSTSAssumeRolePolicy2016011401和AliyunSTSAssumeRolePolicy2016011402的兩個策略。其中Resource為角色的ARN資訊。
      • AliyunSTSAssumeRolePolicy2016011401
        {
        "Version": "1",
        "Statement": [
            {
                "Effect": "Allow",
                "Action": "sts:AssumeRole",
                "Resource": "acs:ram:198***237:role/ramtestappreadonly"
            }
        ]
        }
                                        
      • AliyunSTSAssumeRolePolicy2016011402
        {
        "Version": "1",
        "Statement": [
            {
                "Effect": "Allow",
                "Action": "sts:AssumeRole",
                "Resource": "acs:ram:198***237:role/ramtestappwrite"
            }
        ]
        }
                                        
    2. 授權RAM使用者臨時角色。具體操作,請參見為RAM使用者授權

      將自訂策略AliyunSTSAssumeRolePolicy2016011401和AliyunSTSAssumeRolePolicy2016011402授權給名稱為ram_test_app的RAM使用者。

  3. 從STS擷取的臨時訪問憑證。具體操作,請參見AssumeRole
  4. 使用臨時授權讀寫資料。
    您可以使用臨時授權調用不同語言的SDK訪問Tablestore。Java SDK請參考以下方式建立OTSClient對象,傳入從STS擷取的AccessKeyId、AccessKeySecret和SecurityToken等參數。
    OTSClient client = new OTSClient(otsEndpoint, stsAccessKeyId, stsAccessKeySecret, instanceName, stsToken);