閱讀1076 返回首頁    go 微信


STS臨時授權訪問__權限管理_最佳實踐_對象存儲 OSS-阿裏雲

之前章節隻用到了RAM的子賬號功能,這些子賬號都是可以長期正常使用的,發生泄露之後如果無法及時解除權限的話會很危險。

繼續上文的例子,當開發者的App被用戶使用之後,用戶的數據要上傳到OSS的ram-test-app這個Bucket,當App的用戶數據很多的時候,需要考慮如何才能安全的授權給眾多的App用戶上傳數據呢,以及如何保證多個用戶之間存儲的隔離。

類似這種需要臨時訪問的場景可以使用STS來完成。STS可以指定複雜的策略來對特定的用戶進行限製,僅提供最小的權限。

創建角色

之前已經解釋過了角色的一些概念,本節將會給出使用角色的實際例子。

繼續上一章節的例子,App用戶有一個名為ram-test-app的Bucket來保存個人數據。創建角色的步驟如下:

  1. 按照上文的流程創建一個子賬號ram_test_app,不需要賦予任何權限,因為在扮演角色的時候會自動獲得被扮演角色的所有權限。

  2. 創建角色。這裏創建兩個角色,一個用於用戶讀取等操作,一個用於用戶上傳文件。

    1. 打開訪問控製的管理控製台,選擇 角色管理 > 新建角色
    2. 選擇角色類型。這裏選擇 用戶角色
    3. 填寫類型信息。因為角色是被阿裏雲賬號使用過的,因此選擇默認的即可。
    4. 配置角色基本信息。
  3. 創建完角色之後,角色是沒有任何權限的,因此這裏和上文所述一樣需要新建一個自定義的授權策略。授權策略如下:

    1. {
    2. "Version": "1",
    3. "Statement": [
    4. {
    5. "Effect": "Allow",
    6. "Action": [
    7. "oss:ListObjects",
    8. "oss:GetObject"
    9. ],
    10. "Resource": [
    11. "acs:oss:*:*:ram-test-app",
    12. "acs:oss:*:*:ram-test-app/*"
    13. ]
    14. }
    15. ]
    16. }

    這裏表示的就是對ram-test-app擁有隻讀權限。

  4. 建立完成之後即可在角色管理裏麵給RamTestAppReadOnly添加上ram-test-app的隻讀授權。

  5. 按照上文同樣的方法,建立一個RamTestAppWrite的角色,並且賦予寫ram-test-app的自定義授權,授權如下:

    1. {
    2. "Version": "1",
    3. "Statement": [
    4. {
    5. "Effect": "Allow",
    6. "Action": [
    7. "oss:DeleteObject",
    8. "oss:ListParts",
    9. "oss:AbortMultipartUpload",
    10. "oss:PutObject"
    11. ],
    12. "Resource": [
    13. "acs:oss:*:*:ram-test-app",
    14. "acs:oss:*:*:ram-test-app/*"
    15. ]
    16. }
    17. ]
    18. }

現在我們新建好了兩個角色:RamTestAppReadOnly和RamTestAppWrite,分別表示了對於ram-test-app的讀寫權限。

臨時授權訪問

創建了角色之後,接下來就可以使用臨時授權來訪問OSS了。

準備工作

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

  1. 在授權管理策略中新建兩個自定義的授權策略,分別如下:

    1. {
    2. "Statement": [
    3. {
    4. "Action": "sts:AssumeRole",
    5. "Effect": "Allow",
    6. "Resource": "acs:ram::1894189769722283:role/ramtestappreadonly"
    7. }
    8. ],
    9. "Version": "1"
    10. }

    1. {
    2. "Statement": [
    3. {
    4. "Action": "sts:AssumeRole",
    5. "Effect": "Allow",
    6. "Resource": "acs:ram::1894189769722283:role/ramtestappwrite"
    7. }
    8. ],
    9. "Version": "1"
    10. }

    這裏Resource後麵填寫的內容表示某個角色ID,角色的ID可以在角色管理 > 角色詳情中找到。

  2. 將這兩個授權賦給ram_test_app這個賬號。

使用STS授權訪問

現在一切準備就緒,可以正式使用STS來授權訪問了。

這裏使用一個簡單的STS的python命令行工具 sts.py。 具體的調用方法如下,更詳細的參數解釋可以參考 STS API文檔

  1. $python ./sts.py AssumeRole RoleArn=acs:ram::1894189769722283:role/ramtestappreadonly RoleSessionName=usr001 Policy='{"Version":"1","Statement":[{"Effect":"Allow","Action":["oss:ListObjects","oss:GetObject"],"Resource":["acs:oss:*:*:ram-test-app","acs:oss:*:*:ram-test-app/*"]}]}' DurationSeconds=1000 --id=id --secret=secret
  • RoleArn表示的是需要扮演的角色ID,角色的ID可以在 角色管理 > 角色詳情 中找到。
  • RoleSessionName是一個用來標示臨時憑證的名稱,一般來說建議使用不同的應用程序用戶來區分。
  • Policy表示的是在扮演角色的時候額外加上的一個權限限製。
  • DurationSeconds指的是臨時憑證的有效期,單位是s,最小為900,最大為3600。
  • id和secret表示的是需要扮演角色的子賬號的AccessKey。

這裏需要解釋一下Policy,這裏傳入的Policy是用來限製扮演角色之後的臨時憑證的權限。最後臨時憑證獲得的權限是角色的權限和這裏傳入的Policy的交集。

在扮演角色的時候傳入Policy的原因是為了靈活性,比如上傳文件的時候可以根據不同的用戶添加對於上傳文件路徑的限製,這點會在下麵的例子展示。

現在我們可以來實際試驗一下STS的作用,作為試驗用的Bucket,先在控製台向ram-test-app傳入一個test.txt的文本,內容為ststest。

首先使用ram_test_app這個子賬號直接來訪問。請將下麵的AccessKey換成自己試驗用的AccessKey。

  1. [admin@NGIS-CWWF344M01C /home/admin/oss_test]
  2. $./osscmd get oss://ram-test-app/test.txt test.txt --host=oss-cn-hangzhou.aliyuncs.com -i oOhuek56i53Frogv -k OmVwFJO3qcT0IWrmqkFhOYpg3p0KnA
  3. Error Headers:
  4. [('content-length', '229'), ('server', 'AliyunOSS'), ('connection', 'keep-alive'), ('x-oss-request-id', '564A94D444F4D8B2225E4AFE'), ('date', 'Tue, 17 Nov 2015 02:45:40 GMT'), ('content-type', 'application/xml')]
  5. Error Body:
  6. <?xml version="1.0" encoding="UTF-8"?>
  7. <Error>
  8. <Code>AccessDenied</Code>
  9. <Message>AccessDenied</Message>
  10. <RequestId>564A94D444F4D8B2225E4AFE</RequestId>
  11. <HostId>ram-test-app.oss-cn-hangzhou.aliyuncs.com</HostId>
  12. </Error>
  13. Error Status:
  14. 403
  15. get Failed!
  16. [admin@NGIS-CWWF344M01C /home/admin/oss_test]
  17. $./osscmd put test.txt oss://ram-test-app/test.txt --host=oss-cn-hangzhou.aliyuncs.com -i oOhuek56i53Frogv -k OmVwFJO3qcT0IWrmqkFhOYpg3p0KnA
  18. 100% Error Headers:
  19. [('content-length', '229'), ('server', 'AliyunOSS'), ('connection', 'keep-alive'), ('x-oss-request-id', '564A94E5B1119B445B9F8C3A'), ('date', 'Tue, 17 Nov 2015 02:45:57 GMT'), ('content-type', 'application/xml')]
  20. Error Body:
  21. <?xml version="1.0" encoding="UTF-8"?>
  22. <Error>
  23. <Code>AccessDenied</Code>
  24. <Message>AccessDenied</Message>
  25. <RequestId>564A94E5B1119B445B9F8C3A</RequestId>
  26. <HostId>ram-test-app.oss-cn-hangzhou.aliyuncs.com</HostId>
  27. </Error>
  28. Error Status:
  29. 403
  30. put Failed!

因為ram_test_app這個子賬號沒有訪問權限,因此訪問失敗。

使用臨時授權下載

現在使用STS來下載文件,這裏為了簡單,傳入的Policy和角色的Policy一致,過期時間使用默認的3600s,App的用戶假定為usr001。步驟如下:

  1. 使用STS來獲取臨時的憑證。

    1. [admin@NGIS-CWWF344M01C /home/admin/oss_test]
    2. $python ./sts.py AssumeRole RoleArn=acs:ram::1894189769722283:role/ramtestappreadonly RoleSessionName=usr001 Policy='{"Version":"1","Statement":[{"Effect":"Allow","Action":["oss:ListObjects","oss:GetObject"],"Resource":["acs:oss:*:*:ram-test-app","acs:oss:*:*:ram-test-app/*"]}]}' --id=oOhuek56i53Frogv --secret=OmVwFJO3qcT0IWrmqkFhOYpg3p0KnA
    3. https://sts.aliyuncs.com/?SignatureVersion=1.0&Format=JSON&Timestamp=2015-11-17T03%3A07%3A25Z&RoleArn=acs%3Aram%3A%3A1894189769722283%3Arole%2Framtestappreadonly&RoleSessionName=usr001&AccessKeyId=oOhuek56i53Frogv&Policy=%7B%22Version%22%3A%221%22%2C%22Statement%22%3A%5B%7B%22Effect%22%3A%22Allow%22%2C%22Action%22%3A%5B%22oss%3AListObjects%22%2C%22oss%3AGetObject%22%5D%2C%22Resource%22%3A%5B%22acs%3Aoss%3A%2A%3A%2A%3Aram-test-app%22%2C%22acs%3Aoss%3A%2A%3A%2A%3Aram-test-app%2F%2A%22%5D%7D%5D%7D&SignatureMethod=HMAC-SHA1&Version=2015-04-01&Signature=bshxPZpwRJv5ch3SjaBiXLodwq0%3D&Action=AssumeRole&SignatureNonce=53e1be9c-8cd8-11e5-9b86-008cfa5e4938
    4. {
    5. "AssumedRoleUser": {
    6. "Arn": "acs:ram::1894189769722283:role/ramtestappreadonly/usr001",
    7. "AssumedRoleId": "317446347657426289:usr001"
    8. },
    9. "Credentials": {
    10. "AccessKeyId": "STS.3mQEbNftyc9uOwa180Le",
    11. "AccessKeySecret": "B1w7rCbR4dzGwNYJ2ASsvG3PiPqKZ3gjQhAxb6mB",
    12. "Expiration": "2015-11-17T04:07:25Z",
    13. "SecurityToken": "CAESvAMIARKAASQQUUTSE+7683CGlhdGsv2/di8uI+X1BxG7MDxM5FTd0fp5wpPK/7UctYH2MJ///c4yMN1PUCcEHI1zppCINmpDG2XeNA3OS16JwS6ESmI50sHyWBmsYkCJW15gXnfhz/OK+mSp1bYxlfB33qfgCFe97Ijeuj8RMgqFx0Hny2BzGhhTVFMuM21RRWJOZnR5Yzl1T3dhMTgwTGUiEjMxNzQ0NjM0NzY1NzQyNjI4OSoGdXNyMDAxMJTrgJ2RKjoGUnNhTUQ1QpsBCgExGpUBCgVBbGxvdxI4CgxBY3Rpb25FcXVhbHMSBkFjdGlvbhogCg9vc3M6TGlzdE9iamVjdHMKDW9zczpHZXRPYmplY3QSUgoOUmVzb3VyY2VFcXVhbHMSCFJlc291cmNlGjYKGGFjczpvc3M6KjoqOnJhbS10ZXN0LWFwcAoaYWNzOm9zczoqOio6cmFtLXRlc3QtYXBwLypKEDE4OTQxODk3Njk3MjIyODNSBTI2ODQyWg9Bc3N1bWVkUm9sZVVzZXJgAGoSMzE3NDQ2MzQ3NjU3NDI2Mjg5chJyYW10ZXN0YXBwcmVhZG9ubHk="
    14. },
    15. "RequestId": "8C009F64-F19D-4EC1-A3AD-7A718CD0B49B"
    16. }
  2. 使用臨時憑證來下載文件,這裏sts_token就是上麵STS返回的SecurityToken。

    1. [admin@NGIS-CWWF344M01C /home/admin/oss_test]
    2. $./osscmd get oss://ram-test-app/test.txt test.txt --host=oss-cn-hangzhou.aliyuncs.com -i STS.3mQEbNftyc9uOwa180Le -k B1w7rCbR4dzGwNYJ2ASsvG3PiPqKZ3gjQhAxb6mB --sts_token=CAESvAMIARKAASQQUUTSE+7683CGlhdGsv2/di8uI+X1BxG7MDxM5FTd0fp5wpPK/7UctYH2MJ///c4yMN1PUCcEHI1zppCINmpDG2XeNA3OS16JwS6ESmI50sHyWBmsYkCJW15gXnfhz/OK+mSp1bYxlfB33qfgCFe97Ijeuj8RMgqFx0Hny2BzGhhTVFMuM21RRWJOZnR5Yzl1T3dhMTgwTGUiEjMxNzQ0NjM0NzY1NzQyNjI4OSoGdXNyMDAxMJTrgJ2RKjoGUnNhTUQ1QpsBCgExGpUBCgVBbGxvdxI4CgxBY3Rpb25FcXVhbHMSBkFjdGlvbhogCg9vc3M6TGlzdE9iamVjdHMKDW9zczpHZXRPYmplY3QSUgoOUmVzb3VyY2VFcXVhbHMSCFJlc291cmNlGjYKGGFjczpvc3M6KjoqOnJhbS10ZXN0LWFwcAoaYWNzOm9zczoqOio6cmFtLXRlc3QtYXBwLypKEDE4OTQxODk3Njk3MjIyODNSBTI2ODQyWg9Bc3N1bWVkUm9sZVVzZXJgAGoSMzE3NDQ2MzQ3NjU3NDI2Mjg5chJyYW10ZXN0YXBwcmVhZG9ubHk=
    3. 100% The object test.txt is downloaded to test.txt, please check.
    4. 0.061(s) elapsed
  3. 可見已經可以使用臨時憑證來下載文件了,那再試著使用這個憑證來上傳。

    1. [admin@NGIS-CWWF344M01C /home/admin/oss_test]
    2. $./osscmd put test.txt oss://ram-test-app/test.txt --host=oss-cn-hangzhou.aliyuncs.com -i STS.3mQEbNftyc9uOwa180Le -k B1w7rCbR4dzGwNYJ2ASsvG3PiPqKZ3gjQhAxb6mB --sts_token=CAESvAMIARKAASQQUUTSE+7683CGlhdGsv2/di8uI+X1BxG7MDxM5FTd0fp5wpPK/7UctYH2MJ///c4yMN1PUCcEHI1zppCINmpDG2XeNA3OS16JwS6ESmI50sHyWBmsYkCJW15gXnfhz/OK+mSp1bYxlfB33qfgCFe97Ijeuj8RMgqFx0Hny2BzGhhTVFMuM21RRWJOZnR5Yzl1T3dhMTgwTGUiEjMxNzQ0NjM0NzY1NzQyNjI4OSoGdXNyMDAxMJTrgJ2RKjoGUnNhTUQ1QpsBCgExGpUBCgVBbGxvdxI4CgxBY3Rpb25FcXVhbHMSBkFjdGlvbhogCg9vc3M6TGlzdE9iamVjdHMKDW9zczpHZXRPYmplY3QSUgoOUmVzb3VyY2VFcXVhbHMSCFJlc291cmNlGjYKGGFjczpvc3M6KjoqOnJhbS10ZXN0LWFwcAoaYWNzOm9zczoqOio6cmFtLXRlc3QtYXBwLypKEDE4OTQxODk3Njk3MjIyODNSBTI2ODQyWg9Bc3N1bWVkUm9sZVVzZXJgAGoSMzE3NDQ2MzQ3NjU3NDI2Mjg5chJyYW10ZXN0YXBwcmVhZG9ubHk=
    3. 100% Error Headers:
    4. [('content-length', '254'), ('server', 'AliyunOSS'), ('connection', 'keep-alive'), ('x-oss-request-id', '564A9A2A1790CF0F53C15C82'), ('date', 'Tue, 17 Nov 2015 03:08:26 GMT'), ('content-type', 'application/xml')]
    5. Error Body:
    6. <?xml version="1.0" encoding="UTF-8"?>
    7. <Error>
    8. <Code>AccessDenied</Code>
    9. <Message>Access denied by authorizer's policy.</Message>
    10. <RequestId>564A9A2A1790CF0F53C15C82</RequestId>
    11. <HostId>ram-test-app.oss-cn-hangzhou.aliyuncs.com</HostId>
    12. </Error>
    13. Error Status:
    14. 403
    15. put Failed!

    由於扮演的角色隻有下載的權限,因此上傳失敗。

使用臨時授權上傳

現在可以來試驗一下使用STS上傳。步驟如下:

  1. 獲取STS的臨時憑證,App用戶為usr001。

    1. [admin@NGIS-CWWF344M01C /home/admin/oss_test]
    2. $python ./sts.py AssumeRole RoleArn=acs:ram::1894189769722283:role/ramtestappwrite RoleSessionName=usr001 Policy='{"Version":"1","Statement":[{"Effect":"Allow","Action":["oss:PutObject"],"Resource":["acs:oss:*:*:ram-test-app/usr001/*"]}]}' --id=oOhuek56i53Frogv --secret=OmVwFJO3qcT0IWrmqkFhOYpg3p0KnA
    3. https://sts.aliyuncs.com/?SignatureVersion=1.0&Format=JSON&Timestamp=2015-11-17T03%3A16%3A10Z&RoleArn=acs%3Aram%3A%3A1894189769722283%3Arole%2Framtestappwrite&RoleSessionName=usr001&AccessKeyId=oOhuek56i53Frogv&Policy=%7B%22Version%22%3A%221%22%2C%22Statement%22%3A%5B%7B%22Effect%22%3A%22Allow%22%2C%22Action%22%3A%5B%22oss%3APutObject%22%5D%2C%22Resource%22%3A%5B%22acs%3Aoss%3A%2A%3A%2A%3Aram-test-app%2Fusr001%2F%2A%22%5D%7D%5D%7D&SignatureMethod=HMAC-SHA1&Version=2015-04-01&Signature=Y0OPUoL1PrCqX4X6A3%2FJvgXuS6c%3D&Action=AssumeRole&SignatureNonce=8d0798a8-8cd9-11e5-9f49-008cfa5e4938
    4. {
    5. "AssumedRoleUser": {
    6. "Arn": "acs:ram::1894189769722283:role/ramtestappwrite/usr001",
    7. "AssumedRoleId": "355407847660029428:usr001"
    8. },
    9. "Credentials": {
    10. "AccessKeyId": "STS.rtfx13DYMUbcNlIJlS4U",
    11. "AccessKeySecret": "2fsaM8E2maB2dngj7S2KwpsKTyK4ajo7TxFr0zIM",
    12. "Expiration": "2015-11-17T04:16:10Z",
    13. "SecurityToken": "CAESkwMIARKAAUh3/Uzcg13YLRBWxy0IZjGewMpg31ITxCleBFU1eO/3Sgpudid+GVs+Olvu1vXJn6DLcvPa8azKJKtzV0oKSy+mwUrxSvUSRVDntrs78CsNfWoOJUMJKjLIxdWnGi1pgxJCBzNZ2YV/6ycTaZySSE1V6kqQ7A+GPwYoBSnWmLpdGhhTVFMucnRmeDEzRFlNVWJjTmxJSmxTNFUiEjM1NTQwNzg0NzY2MDAyOTQyOCoGdXNyMDAxMOPzoJ2RKjoGUnNhTUQ1QnYKATEacQoFQWxsb3cSJwoMQWN0aW9uRXF1YWxzEgZBY3Rpb24aDwoNb3NzOlB1dE9iamVjdBI/Cg5SZXNvdXJjZUVxdWFscxIIUmVzb3VyY2UaIwohYWNzOm9zczoqOio6cmFtLXRlc3QtYXBwL3VzcjAwMS8qShAxODk0MTg5NzY5NzIyMjgzUgUyNjg0MloPQXNzdW1lZFJvbGVVc2VyYABqEjM1NTQwNzg0NzY2MDAyOTQyOHIPcmFtdGVzdGFwcHdyaXRl"
    14. },
    15. "RequestId": "19407707-54B2-41AD-AAF0-FE87E8870B0D"
    16. }
  2. 試驗一下能否使用這個憑證來上傳下載。

    1. [admin@NGIS-CWWF344M01C /home/admin/oss_test]
    2. $./osscmd get oss://ram-test-app/test.txt test.txt --host=oss-cn-hangzhou.aliyuncs.com -i STS.rtfx13DYMUbcNlIJlS4U -k 2fsaM8E2maB2dngj7S2KwpsKTyK4ajo7TxFr0zIM --sts_token=CAESkwMIARKAAUh3/Uzcg13YLRBWxy0IZjGewMpg31ITxCleBFU1eO/3Sgpudid+GVs+Olvu1vXJn6DLcvPa8azKJKtzV0oKSy+mwUrxSvUSRVDntrs78CsNfWoOJUMJKjLIxdWnGi1pgxJCBzNZ2YV/6ycTaZySSE1V6kqQ7A+GPwYoBSnWmLpdGhhTVFMucnRmeDEzRFlNVWJjTmxJSmxTNFUiEjM1NTQwNzg0NzY2MDAyOTQyOCoGdXNyMDAxMOPzoJ2RKjoGUnNhTUQ1QnYKATEacQoFQWxsb3cSJwoMQWN0aW9uRXF1YWxzEgZBY3Rpb24aDwoNb3NzOlB1dE9iamVjdBI/Cg5SZXNvdXJjZUVxdWFscxIIUmVzb3VyY2UaIwohYWNzOm9zczoqOio6cmFtLXRlc3QtYXBwL3VzcjAwMS8qShAxODk0MTg5NzY5NzIyMjgzUgUyNjg0MloPQXNzdW1lZFJvbGVVc2VyYABqEjM1NTQwNzg0NzY2MDAyOTQyOHIPcmFtdGVzdGFwcHdyaXRl
    3. Error Headers:
    4. [('content-length', '254'), ('server', 'AliyunOSS'), ('connection', 'keep-alive'), ('x-oss-request-id', '564A9C31FFFC811F24B6E7E3'), ('date', 'Tue, 17 Nov 2015 03:17:05 GMT'), ('content-type', 'application/xml')]
    5. Error Body:
    6. <?xml version="1.0" encoding="UTF-8"?>
    7. <Error>
    8. <Code>AccessDenied</Code>
    9. <Message>Access denied by authorizer's policy.</Message>
    10. <RequestId>564A9C31FFFC811F24B6E7E3</RequestId>
    11. <HostId>ram-test-app.oss-cn-hangzhou.aliyuncs.com</HostId>
    12. </Error>
    13. Error Status:
    14. 403
    15. get Failed!
    16. [admin@NGIS-CWWF344M01C /home/admin/oss_test]
    17. $./osscmd put test.txt oss://ram-test-app/test.txt --host=oss-cn-hangzhou.aliyuncs.com -i STS.rtfx13DYMUbcNlIJlS4U -k 2fsaM8E2maB2dngj7S2KwpsKTyK4ajo7TxFr0zIM --sts_token=CAESkwMIARKAAUh3/Uzcg13YLRBWxy0IZjGewMpg31ITxCleBFU1eO/3Sgpudid+GVs+Olvu1vXJn6DLcvPa8azKJKtzV0oKSy+mwUrxSvUSRVDntrs78CsNfWoOJUMJKjLIxdWnGi1pgxJCBzNZ2YV/6ycTaZySSE1V6kqQ7A+GPwYoBSnWmLpdGhhTVFMucnRmeDEzRFlNVWJjTmxJSmxTNFUiEjM1NTQwNzg0NzY2MDAyOTQyOCoGdXNyMDAxMOPzoJ2RKjoGUnNhTUQ1QnYKATEacQoFQWxsb3cSJwoMQWN0aW9uRXF1YWxzEgZBY3Rpb24aDwoNb3NzOlB1dE9iamVjdBI/Cg5SZXNvdXJjZUVxdWFscxIIUmVzb3VyY2UaIwohYWNzOm9zczoqOio6cmFtLXRlc3QtYXBwL3VzcjAwMS8qShAxODk0MTg5NzY5NzIyMjgzUgUyNjg0MloPQXNzdW1lZFJvbGVVc2VyYABqEjM1NTQwNzg0NzY2MDAyOTQyOHIPcmFtdGVzdGFwcHdyaXRl
    18. 100% Error Headers:
    19. [('content-length', '254'), ('server', 'AliyunOSS'), ('connection', 'keep-alive'), ('x-oss-request-id', '564A9C3FB8DE437A91B16772'), ('date', 'Tue, 17 Nov 2015 03:17:19 GMT'), ('content-type', 'application/xml')]
    20. Error Body:
    21. <?xml version="1.0" encoding="UTF-8"?>
    22. <Error>
    23. <Code>AccessDenied</Code>
    24. <Message>Access denied by authorizer's policy.</Message>
    25. <RequestId>564A9C3FB8DE437A91B16772</RequestId>
    26. <HostId>ram-test-app.oss-cn-hangzhou.aliyuncs.com</HostId>
    27. </Error>
    28. Error Status:
    29. 403
    30. put Failed!

    這裏出現了問題,上傳test.txt失敗了。將本小節開始的時候傳入的Policy格式化之後如下:

    1. {
    2. "Version": "1",
    3. "Statement": [
    4. {
    5. "Effect": "Allow",
    6. "Action": [
    7. "oss:PutObject"
    8. ],
    9. "Resource": [
    10. "acs:oss:*:*:ram-test-app/usr001/*"
    11. ]
    12. }
    13. ]
    14. }

    這個Policy的意義是僅允許用戶向ram-test-app這個Bucket上傳類似usr001/的文件,如果App用戶是usr002的時候,就可以修改Policy為僅允許上傳類似usr002/這種類型的文件,通過這種對不同的App用戶設定不同的Policy的方式,可以做到不同App用戶之間擁有獨立的存儲空間互不幹擾的目的。

  3. 重新試驗,將上傳的目標指定為ram-test-app/usr001/test.txt。

    1. [admin@NGIS-CWWF344M01C /home/admin/oss_test]
    2. $./osscmd put test.txt oss://ram-test-app/usr001/test.txt --host=oss-cn-hangzhou.aliyuncs.com -i STS.rtfx13DYMUbcNlIJlS4U -k 2fsaM8E2maB2dngj7S2KwpsKTyK4ajo7TxFr0zIM --sts_token=CAESkwMIARKAAUh3/Uzcg13YLRBWxy0IZjGewMpg31ITxCleBFU1eO/3Sgpudid+GVs+Olvu1vXJn6DLcvPa8azKJKtzV0oKSy+mwUrxSvUSRVDntrs78CsNfWoOJUMJKjLIxdWnGi1pgxJCBzNZ2YV/6ycTaZySSE1V6kqQ7A+GPwYoBSnWmLpdGhhTVFMucnRmeDEzRFlNVWJjTmxJSmxTNFUiEjM1NTQwNzg0NzY2MDAyOTQyOCoGdXNyMDAxMOPzoJ2RKjoGUnNhTUQ1QnYKATEacQoFQWxsb3cSJwoMQWN0aW9uRXF1YWxzEgZBY3Rpb24aDwoNb3NzOlB1dE9iamVjdBI/Cg5SZXNvdXJjZUVxdWFscxIIUmVzb3VyY2UaIwohYWNzOm9zczoqOio6cmFtLXRlc3QtYXBwL3VzcjAwMS8qShAxODk0MTg5NzY5NzIyMjgzUgUyNjg0MloPQXNzdW1lZFJvbGVVc2VyYABqEjM1NTQwNzg0NzY2MDAyOTQyOHIPcmFtdGVzdGFwcHdyaXRl
    3. 100%
    4. Object URL is: https://ram-test-app.oss-cn-hangzhou.aliyuncs.com/usr001%2Ftest.txt
    5. Object abstract path is: oss://ram-test-app/usr001/test.txt
    6. ETag is "946A0A1AC8245696B9C6A6F35942690B"
    7. 0.071(s) elapsed

    可見上傳成功了。

總結

本章主要介紹了使用STS來臨時授權用戶訪問OSS。在典型的移動開發場景中,使用STS可以做到不同的App用戶需要訪問App的時候,可以通過獲取到的臨時授權來訪問OSS。臨時授權可以指定過期時間,因此大大降低了泄露的危害。在獲取臨時授權的時候,可以根據App用戶的不同,傳入不同的授權策略來限製用戶的訪問權限,比如限製用戶訪問的Object路徑,從而達到隔離不同App用戶的存儲空間的目的。

最後更新:2016-11-23 16:04:09

  上一篇:go Bucket權限分離__權限管理_最佳實踐_對象存儲 OSS-阿裏雲
  下一篇:go 通過crc64校驗數據傳輸的完整性__數據安全_最佳實踐_對象存儲 OSS-阿裏雲