STS權(quán)限管理系統(tǒng)是比訪問控制(RAM)更為嚴(yán)格的權(quán)限管理系統(tǒng)。使用STS權(quán)限管理系統(tǒng)進(jìn)行資源訪問控制,需通過復(fù)雜的授權(quán)流程,授予RAM用戶臨時(shí)訪問資源的權(quán)限。

背景信息

RAM用戶和授予RAM用戶的權(quán)限均長期有效。刪除RAM用戶或解除RAM用戶權(quán)限,均需手動(dòng)操作。發(fā)生RAM用戶信息泄露后,如果無法及時(shí)刪除該RAM用戶或解除權(quán)限,可能給您的阿里云資源和重要信息帶來危險(xiǎn)。所以,對于關(guān)鍵性權(quán)限或RAM用戶無需長期使用的權(quán)限,您可以通過STS權(quán)限管理系統(tǒng)來進(jìn)行控制。

圖 1. RAM用戶獲得臨時(shí)訪問權(quán)限的操作流程
STS

步驟一:創(chuàng)建角色

RAM角色是一種虛擬用戶,是承載操作權(quán)限的虛擬概念。

  1. 使用阿里云賬號(hào)登錄RAM控制臺(tái)
  2. 在左側(cè)導(dǎo)航欄,選擇身份管理 > 角色。
  3. 角色頁面,單擊創(chuàng)建角色。
  4. 創(chuàng)建角色面板,選擇可信實(shí)體類型為阿里云賬號(hào),然后單擊下一步
  5. 設(shè)置角色信息。
    1. 輸入角色名稱
    2. 可選:輸入備注
    3. 選擇云賬號(hào)。
      • 當(dāng)前云賬號(hào):當(dāng)您允許當(dāng)前阿里云賬號(hào)下的RAM用戶扮演該RAM角色時(shí),您可以選擇當(dāng)前云賬號(hào)
      • 其他云賬號(hào):當(dāng)您允許其他阿里云賬號(hào)下的RAM用戶扮演該RAM角色時(shí),您可以選擇其他云賬號(hào),然后輸入其他阿里云賬號(hào)ID。該項(xiàng)主要針對跨阿里云賬號(hào)的資源授權(quán)訪問場景。
        說明 您可以訪問安全設(shè)置頁面查看阿里云賬號(hào)ID。
  6. 單擊完成
  7. 單擊關(guān)閉

步驟二:創(chuàng)建角色授權(quán)策略

角色授權(quán)策略,即定義要授予角色的資源訪問權(quán)限。

  1. 使用阿里云賬號(hào)登錄RAM控制臺(tái)。
  2. 在左側(cè)導(dǎo)航欄,選擇權(quán)限管理 > 權(quán)限策略。
  3. 權(quán)限策略頁面,單擊創(chuàng)建權(quán)限策略。
  4. 創(chuàng)建權(quán)限策略頁面,單擊腳本編輯頁簽。
  5. 輸入權(quán)限策略內(nèi)容,然后單擊繼續(xù)編輯基本信息
    關(guān)于權(quán)限策略語法結(jié)構(gòu)的詳情,請參見權(quán)限策略語法和結(jié)構(gòu)。

    IoT資源只讀權(quán)限的授權(quán)策略內(nèi)容示例如下:

    {
        "Version":"1",
        "Statement":[
            {
                "Action":[
                    "rds:DescribeDBInstances",
                    "rds:DescribeDatabases",
                    "rds:DescribeAccounts",
                    "rds:DescribeDBInstanceNetInfo"
                ],
                "Resource":"*",
                "Effect":"Allow"
            },
            {
                "Action":"ram:ListRoles",
                "Effect":"Allow",
                "Resource":"*"
            },
            {
                "Action":[
                    "mns:ListTopic"
                ],
                "Resource":"*",
                "Effect":"Allow"
            },
            {
                "Action":[
                    "dhs:ListProject",
                    "dhs:ListTopic",
                    "dhs:GetTopic"
                ],
                "Resource":"*",
                "Effect":"Allow"
            },
            {
                "Action":[
                    "ots:ListInstance",
                    "ots:ListTable",
                    "ots:DescribeTable"
                ],
                "Resource":"*",
                "Effect":"Allow"
            },
            {
                "Action":[
                    "log:ListShards",
                    "log:ListLogStores",
                    "log:ListProject"
                ],
                "Resource":"*",
                "Effect":"Allow"
            },
            {
                "Effect":"Allow",
                "Action":[
                    "iot:Query*",
                    "iot:List*",
                    "iot:Get*",
                    "iot:BatchGet*"
                ],
                "Resource":"*"
            },
            {
                "Action": [
                    "linkwan:GetInstancePacketStat",
                    "linkwan:CountGateways"
                ],
                "Resource": "*",
                "Effect": "Allow"
            }
        ]
    }

    IoT資源讀寫權(quán)限的授權(quán)策略內(nèi)容示例如下:

    {
        "Version":"1",
        "Statement":[
            {
                "Action":[
                    "rds:DescribeDBInstances",
                    "rds:DescribeDatabases",
                    "rds:DescribeAccounts",
                    "rds:DescribeDBInstanceNetInfo"
                ],
                "Resource":"*",
                "Effect":"Allow"
            },
            {
                "Action":"ram:ListRoles",
                "Effect":"Allow",
                "Resource":"*"
            },
            {
                "Action":[
                    "mns:ListTopic"
                ],
                "Resource":"*",
                "Effect":"Allow"
            },
            {
                "Action":[
                    "dhs:ListProject",
                    "dhs:ListTopic",
                    "dhs:GetTopic"
                ],
                "Resource":"*",
                "Effect":"Allow"
            },
            {
                "Action":[
                    "ots:ListInstance",
                    "ots:ListTable",
                    "ots:DescribeTable"
                ],
                "Resource":"*",
                "Effect":"Allow"
            },
            {
                "Action":[
                    "log:ListShards",
                    "log:ListLogStores",
                    "log:ListProject"
                ],
                "Resource":"*",
                "Effect":"Allow"
            },
            {
                "Effect":"Allow",
                "Action":"iot:*",
                "Resource":"*"
            }
        ]
    }
  6. 輸入權(quán)限策略名稱備注。
  7. 單擊確定。

授權(quán)策略創(chuàng)建成功后,您就可以將該授權(quán)策略中定義的權(quán)限授予角色。

步驟三:為角色授權(quán)

角色獲得授權(quán)后,才具有資源訪問權(quán)限。您可以在角色頁面,單擊角色對應(yīng)的添加權(quán)限,為單個(gè)角色授權(quán)。具體操作,請參見為RAM角色授權(quán)。本文介紹同時(shí)為多個(gè)角色授權(quán)的操作步驟。

  1. 使用阿里云賬號(hào)登錄RAM控制臺(tái)。
  2. 在左側(cè)導(dǎo)航欄,選擇權(quán)限管理 > 授權(quán)。
  3. 授權(quán)頁面,單擊新增授權(quán)。
  4. 新增授權(quán)頁面,為RAM角色添加權(quán)限。
    1. 選擇授權(quán)范圍。
      • 整個(gè)云賬號(hào):權(quán)限在當(dāng)前阿里云賬號(hào)內(nèi)生效。
      • 指定資源組:權(quán)限在指定的資源組內(nèi)生效。
        說明 指定資源組授權(quán)生效的前提是該云服務(wù)已支持資源組。更多信息,請參見支持資源組的云服務(wù)
    2. 輸入授權(quán)主體。
      授權(quán)主體即需要授權(quán)的RAM角色。
    3. 選擇權(quán)限策略。
      說明 每次最多綁定5條策略,如需綁定更多策略,請分次操作。
  5. 單擊確定
  6. 單擊完成。

下一步,為RAM用戶授予可以扮演該角色的權(quán)限。

步驟四:授予RAM用戶角色扮演權(quán)限

雖然經(jīng)過授權(quán)后,該角色已擁有了授權(quán)策略定義的訪問權(quán)限,但角色本身只是虛擬用戶,需要RAM用戶扮演該角色,才能進(jìn)行權(quán)限允許的操作。若任意RAM用戶都可以扮演該角色,也會(huì)帶來風(fēng)險(xiǎn),因此只有獲得角色扮演權(quán)限的RAM用戶才能扮演角色。

授權(quán)RAM用戶扮演角色的方法:先新建一個(gè)Resource參數(shù)值為角色I(xiàn)D的自定義授權(quán)策略,然后用該授權(quán)策略為RAM用戶授權(quán)。

  1. 使用阿里云賬號(hào)登錄RAM控制臺(tái)
  2. 在左側(cè)導(dǎo)航欄,選擇權(quán)限管理 > 權(quán)限策略。
  3. 權(quán)限策略頁面,單擊創(chuàng)建權(quán)限策略。
  4. 創(chuàng)建權(quán)限策略頁面,單擊腳本編輯頁簽。
  5. 輸入權(quán)限策略內(nèi)容,然后單擊繼續(xù)編輯基本信息
    說明 授權(quán)策略內(nèi)容中,參數(shù)Resource 的值需為角色Arn。在RAM角色管理頁面,單擊角色名稱,進(jìn)入基本信息頁,查看角色的Arn 。

    角色授權(quán)策略示例:

    {
        "Version":"1",
        "Statement":[
            {
                "Effect":"Allow",
                "Action":"iot:QueryProduct",
                "Resource":"角色Arn"
            }
        ]
    }
  6. 輸入權(quán)限策略名稱備注。
  7. 單擊確定
  8. 授權(quán)策略創(chuàng)建成功后,返回RAM訪問控制主頁面。
    1. 在左側(cè)導(dǎo)航欄,選擇身份管理 > 用戶。
    2. 在RAM用戶列表中,選中要授權(quán)的RAM用戶前的復(fù)選框,然后單擊下方的添加權(quán)限。
    3. 在授權(quán)對話框中,選中剛新建的角色授權(quán)策略,再單擊確定。

授權(quán)完成后,RAM用戶便有了可以扮演該角色的權(quán)限,就可以使用STS獲取扮演角色的臨時(shí)身份憑證和進(jìn)行資源訪問。

步驟五:RAM用戶獲取臨時(shí)身份憑證

獲得角色授權(quán)的RAM用戶,可以通過直接調(diào)用API或使用SDK來獲取扮演角色的臨時(shí)身份憑證:AccessKey ID、AccessKey Secret和SecurityToken。STS API和STS SDK詳情,請參見STS APISTS SDK

使用API和SDK獲取扮演角色的臨時(shí)身份憑證需傳入以下參數(shù):

  • RoleArn:需要扮演的角色Arn。
  • RoleSessionName:臨時(shí)憑證的名稱(自定義參數(shù))。
  • Policy:授權(quán)策略,即為角色增加一個(gè)權(quán)限限制。通過此參數(shù)限制生成的Token的權(quán)限。不指定此參數(shù),則返回的Token將擁有指定角色的所有權(quán)限。
  • DurationSeconds:臨時(shí)憑證的有效期。單位是秒,最小為900,最大為3600,默認(rèn)值是3600。
  • id和secret:指需要扮演該角色的RAM用戶的AccessKey ID和AccessKey Secret。

獲取臨時(shí)身份憑證示例

API示例:RAM用戶通過調(diào)用STS的AssumeRole接口獲得扮演該角色的臨時(shí)身份憑證。

https://sts.aliyuncs.com?Action=AssumeRole
&RoleArn=acs:ram::1234567890123456:role/iotstsrole
&RoleSessionName=iotreadonlyrole
&DurationSeconds=3600
&Policy=<url_encoded_policy>
&<公共請求參數(shù)>

SDK示例:RAM用戶使用STS的Python命令行工具接口獲得扮演該角色的臨時(shí)身份憑證。

$python ./sts.py AssumeRole RoleArn=acs:ram::1234567890123456:role/iotstsrole RoleSessionName=iotreadonlyrole Policy='{"Version":"1","Statement":[{"Effect":"Allow","Action":"iot:*","Resource":"*"}]}' DurationSeconds=3600 --id=id --secret=secret

請求成功后,將返回扮演該角色的臨時(shí)身份憑證:AccessKey ID、AccessKey Secret和SecurityToken。

步驟六:RAM用戶臨時(shí)訪問資源

獲得扮演角色的臨時(shí)身份憑證后,RAM用戶便可以在調(diào)用SDK的請求中傳入該臨時(shí)身份憑證信息,扮演角色。

Java SDK示例:RAM用戶在調(diào)用請求中,傳入臨時(shí)身份憑證的AccessKey ID、AccessKey Secret和SecurityToken參數(shù),創(chuàng)建IAcsClient對象。

IClientProfile  profile = DefaultProfile.getProfile("cn-hangzhou", AccessKeyId,AccessKeySecret);
RpcAcsRequest request.putQueryParameter("SecurityToken", Token);
IAcsClient client = new DefaultAcsClient(profile);
AcsResponse response = client.getAcsResponse(request);