天天看點

使用STS授權您的用戶端直接通路雲存儲

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

1 引言

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

使用STS授權您的用戶端直接通路雲存儲

圖1. 使用代理服務進行資料中轉

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

一種改造方案是實作一個輕量級的前端服務(本文稱之為appserver),它隻需要實作對用戶端的身份認證,并為用戶端讀寫oss資料的調用請求提供簽名授權。如圖2所示。

使用STS授權您的用戶端直接通路雲存儲

圖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存儲。

使用STS授權您的用戶端直接通路雲存儲

圖3. 基于sts方案的頂層描述

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

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

3.1初始化配置與部署

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

使用STS授權您的用戶端直接通路雲存儲

圖4. 配置ram與部署

請使用您的雲賬号(或稱為主賬号)身份登陸阿裡雲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所示。

使用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小時,建議用戶端裝置每半小時就要請求一次新的臨時授權令牌。

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可以幫助客戶有效解決移動領域、遊戲領域或物聯網領域的一類典型應用場景或解決方案的最小授權問題,進而有效控制業務上雲所帶來的資訊安全風險。