1. 程式人生 > >OSS直傳結合STS使用流程—— 授權您的客戶端直接訪問雲端儲存

OSS直傳結合STS使用流程—— 授權您的客戶端直接訪問雲端儲存

摘要:當阿里雲客戶使用雲端儲存服務來儲存來自其客戶端的使用者資料時,現有的解決方案都存在一些問題。針對這一場景及問題,本文介紹了一種輕量級的安全解決方案,即使用STS服務授權客戶端直接訪問雲端儲存。本文闡述了STS方案的基本原理,並且結合具體應用場景,對實施步驟進行了詳細的描述。

1 引言


假設您是阿里雲客戶,您打算使用公共雲服務來構建應用系統,比如為您的使用者提供安防監控視訊儲存解決方案。當您使用雲端儲存服務來儲存來自客戶端的使用者資料(如支援Wifi功能的攝像頭所記錄的資料)時,一種典型設計模式是讓客戶端通過一個前端代理服務來實現資料的上傳下載,如圖1所示。

這個代理服務需要實現對您的客戶端的身份驗證、業務規則驗證,並提供資料快取與中轉功能。這種設計模式存在一個缺點,當客戶端規模較大時,設計這種滿足規模擴充套件且支援大批量事務處理的代理服務是非常困難的,而且研發成本也非常昂貴。

一種改造方案是實現一個輕量級的前端服務(本文稱之為AppServer),它只需要實現對客戶端的身份認證,併為客戶端讀寫OSS資料的呼叫請求提供簽名授權。如圖2所示。

這種改造方案使代理服務能有效避免進行資料中轉,能讓客戶端有許可權直接操作您的雲端儲存。但這一改造方案也存在一個不足,就是這個代理服務會成為整個解決方案的單點,因為您所有的客戶端到OSS的訪問請求都需要通過這個代理服務進行簽名授權。為了避免單點故障,您需要將這個代理服務設計成支援高併發和高可用的線上服務,這個設計和研發成本也比較昂貴。

針對這一場景及現有方案存在的問題,本文將介紹一種更輕量、更安全的基於STS (Security Token Service)的解決方案——使用STS授權您的客戶端直接訪問雲端儲存。

2 阿里雲STS服務簡介

STS是阿里云為客戶提供的一種安全令牌管理服務,它是資源訪問管理(RAM)產品家族中的一員。通過STS,獲得許可的雲服務或RAM使用者可以自主頒發自定義時效和子許可權的一個訪問令牌。獲得訪問令牌的應用程式可以使用令牌直接呼叫阿里雲服務API操作資源。關於STS的更多內容請參考RAM線上文件:https://docs.aliyun.com/#/pub/ram

3 使用STS授權您的客戶端直接訪問雲端儲存

基於STS方案的一個頂層描述如圖3所示。AppServer是一個輕量級的前端服務。它不必做資料中轉工作,也不必為所有的客戶端到OSS的訪問請求計算訊息簽名,而只需進行客戶端認證並且根據需要為客戶端頒發一個具有指定許可權、帶過期時間的訪問令牌,讓客戶端在一定時間內可以使用該令牌直接操作您的OSS儲存。

下面我們假設一個場景:您購買的OSS儲存桶名稱是thevideos,對第1個售出的安防監控裝置命名為Device-001,每個裝置都有自己的OSS儲存目錄。比如,只允許裝置Device-001上傳視訊資料到oss://thevideos/d-001/目錄下,不同裝置之間的資料儲存和訪問是隔離的。

針對這一具體場景,我們來逐步揭開使用STS授權的面紗。(注意:在進行下文的實際操作之前,請確保您的雲賬號已經開通RAM服務。)

3.1初始化配置與部署

在使用STS之前,我們需要在RAM中進行適當的配置,具體流程如圖4所示。

請使用您的雲賬號(或稱為主賬號)身份登陸阿里雲RAM管理控制檯,執行以下操作:

Step 1. 為AppServer建立一個RAM使用者身份

進入RAM控制檯,選擇使用者管理 -> 新建使用者,填寫登入名,並選擇“為該使用者自動生成AccessKey”,選擇確定後RAM會建立使用者併為該使用者建立AccessKeyId和AccessKeySecret(這個金鑰後續將無法)。

Step 2. 為AppServer建立一個RAM角色並授權

進入RAM控制檯,選擇角色管理 -> 新建角色,在建立角色的彈窗中,選擇角色型別為使用者角色 -> 選擇允許扮演此角色的可信身份(這裡按預設值選擇當前雲賬號) -> 填寫角色名稱和備註 ->建立成功。建立角色成功後,可以在角色詳情頁中檢視RoleARN(角色的全域性資源名稱),比如 acs:ram::1234567890123456:role/appserverrole

然後再給角色授權。在角色詳情頁中,選擇“新增授權策略”,這裡選擇“AliyunOSSFullAccess”系統授權策略,完成授權。此處若為了進一步限制角色的許可權,您也可以選擇自定義授權策略來代替“AliyunOSSFullAccess”系統授權策略。

Step 3. 授權AppServer使用者可以扮演該角色

進入使用者授權策略頁面,選擇新增授權策略,選擇AliyunSTSAssumeRoleAccess系統授權策略即可。

Step 4. 部署AppServer

由於AppServer訪問Aliyun服務時是以RAM使用者身份,而且需要使用到上述角色的許可權,所以部署時需要配置(AccessKeyId, AccessKeySecret)及RoleARN。由於這些配置屬於敏感資訊,我們建議您對該配置資訊進行加密。

3.2 臨時授權令牌的頒發與使用

RAM配置完成後,AppServer便可以使用STS為客戶端頒發臨時授權令牌,具體流程如圖5所示。

我們假設當客戶端裝置連線到AppServer之後,開始向AppServer請求訪問OSS的臨時授權令牌。臨時授權令牌的頒發和使用流程如下:

Step 1. 獲取臨時授權令牌

當客戶端裝置向AppServer請求訪問OSS的臨時授權臨牌時,AppServer呼叫STS的AssumeRole介面來申請一個滿足客戶端裝置所需的臨時授權令牌。AppServer呼叫AssumeRole的一個Java程式碼樣例如下:(完整樣例 )
複製程式碼
    public static void main(String[] args)
    {
        String accessKeyId = "************"; // RAM使用者(代表AppServer)的AccessKeyId
        String accessKeySecret = "*******************"; // RAM使用者(代表AppServer)的AccessKeySecret
        String roleArn = "acs:ram::1234567890123456:role/appserverrole"; //角色的全域性資源名稱
        String roleSessionName = "device-001"; //此處可以自定義令牌的使用者身份,方便你完成操作審計
        String sessionAccessPolicy =   // 當角色許可權過大是,此處可以進一步限制令牌的許可權
            "{" +
            "    \"Version\": \"1\", " +
            "    \"Statement\": [{" +
            "            \"Action\": \"oss:PutObject\"" +
            "            \"Resource\": \"acs:oss:*:*:thevideos/d-001/*\"" +
            "            \"Effect\": \"Allow\"" +
            "     }]" +
            "}";
        ProtocolType protocolType = ProtocolType.HTTPS; // 必須使用HTTPS協議訪問STS服務
        try
        {
            final AssumeRoleResponse response = (AssumeRoleResponse)assumeRole(
                  accessKeyId,
                  accessKeySecret,
                  roleArn,
                  roleSessionName,
                  sessionAccessPolicy,
                  protocolType);
            System.out.println("STS AccessKeyId: " + response.getCredentials().getAccessKeyId());
            System.out.println("STS AccessKeySecret: " + response.getCredentials().getAccessKeySecret());
            System.out.println("STS SecurityToken: " + response.getCredentials().getSecurityToken());
            System.out.println("Expiration: " + response.getCredentials().getExpiration());
        }
        catch (ClientException e)
        {
            System.out.println("Failed to get a STS token.");
            System.out.println("Error code: " + e.getErrCode());
            System.out.println("Error message: " + e.getErrMsg());
        }
    }
    ...

Step 2. 獲得一個臨時授權令牌

在上述例子中,AssumeRole執行成功後將返回有效的臨時授權令牌。臨時授權令牌包括AccessKeyId, AccessKeySecret, SecurityToken以及令牌的過期時間。令牌的最長有效期是1小時,如果需要更長時間的授權,建議AppServer每30分鐘為客戶端頒發新的授權令牌。

Step 3. AppServer安全傳遞令牌給客戶端裝置,比如使用HTTPS。

Step 4. 客戶端裝置可以直接使用令牌訪問OSS,新版本OSS SDK已經支援STS授權令牌來訪問OSS服務。

4. 安全性分析

避免安全風險的最佳實踐原則之一是讓每個子系統在執行時都使用最小許可權。那麼,當一個子系統被攻破時,它不會對全域性造成系統性破壞。

(1) 在本文的案例中,您的使用者購買裝置之後,這個裝置就可以由您的使用者完全控制。滿足該裝置工作所需要的最小許可權是能上傳資料到指定的目錄(如oss://thevideos/d-001/ )。由於AppServer的角色擁有OSS完全訪問許可權,所以您在實施中應使用sessionAccessPolicy來進一步限制STS令牌的許可權,從而滿足最小授權原則。假設該裝置被不可信使用者攻破,那麼攻擊者獲得的能力應是最小的。

(2) AppServer也有可能被攻擊,所以您也應該對代表AppServer的RAM使用者及RAM角色授予最小許可權。如果檢測到有攻擊發生,您可以隨時撤銷RAM角色的許可權。一旦撤銷RAM角色的授權,那麼AppServer將會立即失去訪問許可權,而且由AppServer所頒發的那些STS令牌也會立即失去訪問許可權,即使那些STS令牌還沒有過期。

5. 結語

STS是阿里云為客戶提供的一種安全令牌管理服務。通過STS,您可以給您的客戶端或任意第三方應用頒發一個自定義時效和子許可權的訪問令牌,客戶端或第三方應用可以直接使用STS令牌訪問您的雲服務。STS可以幫助客戶有效解決移動領域、遊戲領域或物聯網領域的一類典型應用場景或解決方案的最小授權問題,進而有效控制業務上雲所帶來的資訊保安風險。

------------------------------更多資訊請參考------------------------------
RAM線上文件:https://docs.aliyun.com/#/pub/ram/ram-user-guide/role&intro
STS SDK文件:https://docs.aliyun.com/#/pub/ram/sts-sdk/sts_java_sdk&usage