「OSS」阿里云OSS之STS臨時訪問授權(quán)

前言

小白后臺僅僅只是一位小白Java

上一篇文章中端逼,小白介紹了阿里云OSS有關(guān)自定義域名暑认、證書托管的內(nèi)容柏肪,這一片文章我們將著重介紹一下阿里云OSS身份認證相關(guān)的內(nèi)容达皿。

拓展開來說天吓,我們這里介紹的 身份認證 機制其實也是貫穿于阿里云各個產(chǎn)品線的 訪問控制 機制,換句話說就是阿里云為客戶提供的 用戶身份管理資源訪問控制 服務(wù)峦椰,但是這里我們只介紹在阿里云OSS這個產(chǎn)品下如何配置和使用身份認證服務(wù)龄寞,不對阿里云的整套 訪問控制 服務(wù)做深入探討。

介紹

阿里云提供的 權(quán)限管理系統(tǒng)訪問控制服務(wù) 主要包含兩部分们何,RAM(Resource Access Management)和 STS(Security Token Service)萄焦,RAM 主要的作用是控制賬號系統(tǒng)的權(quán)限,你可以使用 RAM 在主賬號的權(quán)限范圍內(nèi)創(chuàng)建子用戶冤竹,給不同的子用戶分配不同的權(quán)限從而達到授權(quán)管理的目的拂封。STS 是一個安全憑證(Token)的管理系統(tǒng),你可以使用 STS 來完成對于臨時用戶的訪問授權(quán)鹦蠕。

RAM 和 STS 需要解決的一個核心問題是如何在不暴露主賬號的 AccessKey 的情況下安全的授權(quán)別人訪問冒签,因為一旦主賬號的 AccessKey 暴露出去的話會帶來極大的安全風險,別人可以隨意操作該賬號下所有的資源钟病,盜取重要信息等萧恕。

RAM 提供一種 長期有效 的權(quán)限控制機制,通過分出不同權(quán)限的 子賬號肠阱,將不同的權(quán)限分給不同的用戶票唆,這樣一旦子賬號泄露也不會造成全局的信息泄露。但是屹徘,由于子賬號在一般情況下是長期有效的走趋,因此,子賬號的 AccessKey 也是不能泄露的噪伊。

相對于 RAM 提供的長效控制機制簿煌,STS 提供的是一種 臨時訪問授權(quán) 。通過 STS 可以返回 臨時的 AccessKey 和 Token鉴吹,這些信息可以直接發(fā)給臨時用戶用來訪問 OSS 姨伟。一般來說,從 STS 獲取的權(quán)限會受到更加嚴格的限制豆励,并且擁有時間限制夺荒,因此這些信息泄露之后對于系統(tǒng)的影響也很小。

場景描述

使用阿里云OSS的過程中,一般大家對于 RAM 會比較了解和熟悉般堆,通常的做法也都是在阿里云的 RAM訪問控制臺 為 OSS 服務(wù)單獨創(chuàng)建一個具備 OSS 相應(yīng)訪問權(quán)限的 RAM子賬號在孝,然后在之后的 API 調(diào)用過程中使用該 RAM子賬號 的 AccessKey 進行簽名等操作。

看起來這種通過 RAM子賬號 實現(xiàn)對 OSS 進行訪問控制的方式是挺安全的淮摔,那么這種方式有沒有什么缺陷呢私沮?或者有沒有更加安全的方式?接下來我們先來給大家舉一個模擬場景的例子和橙。

Example
某個阿里云用戶仔燕,名為 小白,其在 OSS 下有兩個私有的 Bucket魔招,bucket-abucket-b 晰搀。小白對這兩個 Bucket 都擁有完全的權(quán)限。

為了避免阿里云主賬號的 AccessKey 泄露導(dǎo)致安全風險办斑,小白使用 RAM 創(chuàng)建了兩個子賬號 小明小賢外恕,小明對 bucket-a 擁有讀寫權(quán)限,小賢對 bucket-b 擁有讀寫權(quán)限乡翅。小明和小賢都擁有獨立的 AccessKey鳞疲,這樣萬一某個子賬號泄露了也只會影響其中一個 Bucket,而且小白可以很方便的在控制臺取消泄露用戶的授權(quán)蠕蚜。

現(xiàn)在因為某些原因尚洽,需要授權(quán)給別人讀取 bucket-a 中的 Object,這種情況下不應(yīng)該直接把 小明AccessKey 透露出去靶累;那么腺毫,這個時候可以新建一個 角色,比如 Bucket-A-Reader挣柬,給這個角色賦予讀取 bucket-a權(quán)限腐螟。但是請注意贤牛,這個時候 Bucket-A-Reader 還是沒法直接用的舰褪,因為并不存在對應(yīng) 角色 Bucket-A-ReaderAccessKey樱衷,Bucket-A-Reader 現(xiàn)在僅僅表示一個擁有訪問 bucket-a 權(quán)限的一個虛擬實體。

為了能獲取 臨時授權(quán)店溢,這個時候可以調(diào)用 STSAssumeRole 接口,告訴 STS 委乌,子賬號 小明 將要扮演 Bucket-A-Reader 這個角色床牧,如果成功,STS 會返回一個 臨時的 AccessKeyId 遭贸、AccessKeySecret 還有 SecurityToken 作為訪問憑證戈咳。將這個 臨時授權(quán)憑證 發(fā)給需要訪問的 臨時用戶 就可以獲得訪問 bucket-a 的臨時權(quán)限了,憑證過期的時間可以在調(diào)用 AssumeRole 接口的時候指定,最大不超過2小時著蛙。

STS臨時訪問授權(quán)

STS臨時訪問授權(quán) 還是少不了 RAM 機制的支撐删铃,一般要實現(xiàn) STS 臨時訪問授權(quán)需要依次完成 創(chuàng)建RAM子賬號 > 創(chuàng)建自定義角色 > 創(chuàng)建自定義授權(quán)策略 > 自定義角色添加自定義授權(quán)策略 > 子賬號授權(quán)STS權(quán)限 > STS簽發(fā)臨時憑證

準備工作

1. 創(chuàng)建 RAM 子賬號

創(chuàng)建一個 RAM 子賬號 ram_test_app踏堡,不需要賦予任何權(quán)限猎唁,因為在扮演角色的時候會自動獲得被扮演角色的所有權(quán)限。

2. 創(chuàng)建角色

這里創(chuàng)建兩個角色顷蟆,一個用于用戶讀取等操作诫隅,一個用于用戶上傳文件。

  • 打開訪問控制的管理控制臺帐偎,選擇 角色管理 > 新建角色 ;
  • 選擇角色類型逐纬,這里選擇用戶角色;
  • 填寫類型信息,因為角色是被阿里云賬號使用過的削樊,因此選擇默認的即可;
  • 配置角色基本信息;
創(chuàng)建角色
配置角色

3. 自定義授權(quán)策略

創(chuàng)建完角色之后豁生,角色是沒有任何權(quán)限的,因此這里和上文所述一樣需要新建一個自定義的授權(quán)策略漫贞。授權(quán)策略如下:

  // 該授權(quán)策略表示對ram-test-app擁有只讀權(quán)限
  {
    "Version": "1",
    "Statement": [
      {
        "Effect": "Allow",
        "Action": [
          "oss:ListObjects",
          "oss:GetObject"
        ],
        "Resource": [
          "acs:oss:*:*:ram-test-app",
          "acs:oss:*:*:ram-test-app/*"
        ]
      }
    ]
  }
創(chuàng)建授權(quán)策略

4. 自定義角色授權(quán)

建立完成自定義授權(quán)策略后甸箱,即可在 角色管理 里面給自定義角色 RamTestAppReadOnly 添加上 ram-test-app 的只讀授權(quán)。

角色管理
添加授權(quán)策略

5. 再次添加角色&授權(quán)

按照上文同樣的方法绕辖,建立一個 RamTestAppWrite 的角色摇肌,并且賦予寫 ram-test-app 的自定義授權(quán),授權(quán)如下:

  {
    "Version": "1",
    "Statement": [
      {
        "Effect": "Allow",
        "Action": [
          "oss:DeleteObject",
          "oss:ListParts",
          "oss:AbortMultipartUpload",
          "oss:PutObject"
        ],
        "Resource": [
          "acs:oss:*:*:ram-test-app",
          "acs:oss:*:*:ram-test-app/*"
        ]
      }
    ]
  }

目前新建的兩個角色為:RamTestAppReadOnlyRamTestAppWrite仪际,分別表示了對于 Bucket ram-test-app 的讀寫權(quán)限围小。

自定義角色

臨時授權(quán)訪問憑據(jù)

創(chuàng)建了角色之后,接下來就可以使用臨時授權(quán)來訪問OSS了树碱。

在正式使用之前肯适,還有一些工作需要完成。扮演角色 也是需要授權(quán)的成榜,否則任意子賬號都可以扮演這些角色會帶來不可預(yù)計的風險框舔,因此有扮演對應(yīng)角色需求的子賬號需要顯式的配置權(quán)限。

1. 在授權(quán)管理策略中新建兩個自定義的授權(quán)策略赎婚,分別如下:

  {
    "Statement": [
      {
        "Action": "sts:AssumeRole",
        "Effect": "Allow",
        "Resource": "acs:ram::1894******722283:role/ramtestappreadonly"
      }
    ],
    "Version": "1"
  }

使用相同的方法創(chuàng)建另一個自定義授權(quán)策略:

  {
    "Statement": [
      {
        "Action": "sts:AssumeRole",
        "Effect": "Allow",
        "Resource": "acs:ram::1894******722283:role/ramtestappwrite"
      }
    ],
    "Version": "1"
  }

這里 Resource 后面填寫的內(nèi)容表示某個角色 ID刘绣,角色的 ID 可以在 角色管理 > 角色詳情 中找到。

2. 將這兩個授權(quán)賦給 ram_test_app 這個賬號

現(xiàn)在一切準備就緒挣输,可以正式使用STS來授權(quán)訪問了纬凤。

RAM進行STS臨時授權(quán)

這里小白給出基于 SpringBoot 的 Java SDK 源碼實現(xiàn)

  <!-- OSS Maven Dependency -->
  <dependency>
    <groupId>com.aliyun.oss</groupId>
    <artifactId>aliyun-sdk-oss</artifactId>
    <version>3.4.2</version>
  </dependency>
  public AssumeRoleResponse buildAliyunSTSCredentials() throws ClientException {
    // STS
    DefaultProfile.addEndpoint("", "", "Sts", "sts.cn-hangzhou.aliyuncs.com");
    IClientProfile profile = DefaultProfile.getProfile("cn-hangzhou", accessKeyId, accessKeySecret);
    DefaultAcsClient client = new DefaultAcsClient(profile);

    final AssumeRoleRequest request = new AssumeRoleRequest();
    request.setMethod(MethodType.POST);
    request.setProtocol(ProtocolType.HTTPS);
    request.setDurationSeconds(60 * 60 * 1L);
    request.setRoleArn("acs:ram::12************41:role/RamTestAppReadOnly");  // 要扮演的角色ID
    request.setRoleSessionName("external-username");
    // request.setPolicy(policy);

    // 生成臨時授權(quán)憑證
    final AssumeRoleResponse response = client.getAcsResponse(request);

    String appKey = response.getCredentials().getAccessKeyId();  // 臨時憑據(jù)AccessKeyId
    String appSecret = response.getCredentials().getAccessKeySecret();  // 臨時憑據(jù)AccessKeySecret
    String securityToken = response.getCredentials().getSecurityToken();  
    String expiration = response.getCredentials().getExpiration();
    return response;
  }

accessKeyId表示RAM子賬號的AccessKeyId;
accessKeySecret表示RAM子賬號的AccessKeySecret撩嚼;
RoleArn表示的是需要扮演的角色ID停士,角色的ID可以在 角色管理 > 角色詳情 中找到挖帘;
RoleSessionName是一個用來標示臨時憑證的名稱,一般來說建議使用不同的應(yīng)用程序用戶來區(qū)分恋技;
DurationSeconds指的是臨時憑證的有效期拇舀,單位是s,最小為900蜻底,最大為3600骄崩;
Policy表示的是在扮演角色的時候額外加上的一個權(quán)限限制;
appKey表示創(chuàng)建的臨時憑據(jù)AccessKeyId朱躺;
appSecret表示創(chuàng)建的臨時憑據(jù)AccessKeySecret刁赖;

總結(jié)

其實實現(xiàn)STS臨時訪問授權(quán)的過程就是 創(chuàng)建RAM子賬號 > RAM子賬號授予STS權(quán)限 > RAM子賬號扮演指定角色,拿到臨時授權(quán)憑證就可以進行服務(wù)端相關(guān)的簽名/上傳等權(quán)限內(nèi)的操作了长搀。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末宇弛,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子源请,更是在濱河造成了極大的恐慌枪芒,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,402評論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件谁尸,死亡現(xiàn)場離奇詭異舅踪,居然都是意外死亡,警方通過查閱死者的電腦和手機良蛮,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評論 3 392
  • 文/潘曉璐 我一進店門抽碌,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人决瞳,你說我怎么就攤上這事货徙。” “怎么了皮胡?”我有些...
    開封第一講書人閱讀 162,483評論 0 353
  • 文/不壞的土叔 我叫張陵痴颊,是天一觀的道長。 經(jīng)常有香客問我屡贺,道長蠢棱,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,165評論 1 292
  • 正文 為了忘掉前任甩栈,我火速辦了婚禮泻仙,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘量没。我一直安慰自己玉转,他們只是感情好,可當我...
    茶點故事閱讀 67,176評論 6 388
  • 文/花漫 我一把揭開白布允蜈。 她就那樣靜靜地躺著冤吨,像睡著了一般。 火紅的嫁衣襯著肌膚如雪饶套。 梳的紋絲不亂的頭發(fā)上漩蟆,一...
    開封第一講書人閱讀 51,146評論 1 297
  • 那天,我揣著相機與錄音妓蛮,去河邊找鬼怠李。 笑死,一個胖子當著我的面吹牛蛤克,可吹牛的內(nèi)容都是我干的捺癞。 我是一名探鬼主播,決...
    沈念sama閱讀 40,032評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼构挤,長吁一口氣:“原來是場噩夢啊……” “哼髓介!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起筋现,我...
    開封第一講書人閱讀 38,896評論 0 274
  • 序言:老撾萬榮一對情侶失蹤唐础,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后矾飞,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體一膨,經(jīng)...
    沈念sama閱讀 45,311評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,536評論 2 332
  • 正文 我和宋清朗相戀三年洒沦,在試婚紗的時候發(fā)現(xiàn)自己被綠了豹绪。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,696評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡申眼,死狀恐怖瞒津,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情豺型,我是刑警寧澤仲智,帶...
    沈念sama閱讀 35,413評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站姻氨,受9級特大地震影響钓辆,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜肴焊,卻給世界環(huán)境...
    茶點故事閱讀 41,008評論 3 325
  • 文/蒙蒙 一前联、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧娶眷,春花似錦似嗤、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽乘粒。三九已至,卻和暖如春伤塌,著一層夾襖步出監(jiān)牢的瞬間灯萍,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評論 1 269
  • 我被黑心中介騙來泰國打工每聪, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留旦棉,地道東北人。 一個月前我還...
    沈念sama閱讀 47,698評論 2 368
  • 正文 我出身青樓药薯,卻偏偏與公主長得像绑洛,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子童本,可洞房花燭夜當晚...
    茶點故事閱讀 44,592評論 2 353

推薦閱讀更多精彩內(nèi)容