应用场景
某企业X开发了一款移动应用(App),并使用OOS服务。App需要直连OOS上传或下载数据,但是App运行在用户自己的移动设备上,这些设备不受企业X的控制。企业X有如下要求:
- 直传数据:企业X不希望所有App都通过企业的服务端应用服务器(Application Server)来进行数据中转,而希望能够直连OOS上传或下载数据。
- 安全管控:企业X不希望将访问密钥(AccessKey)保存到移动设备中,因为移动设备是归属于用户控制,属于不可信的运行环境。
- 风险控制:企业X希望将风险控制到最小,每个App直连OOS时都必须拥有最小的访问权限且访问时效需要很短。
前提条件
已开通对象存储(经典版)Ⅰ型服务。
具体操作
应用服务器在OOS上为每个APP创建一个IAM用户,并为每个IAM用户附加最小的访问权限(如调用STS接口、仅对自己目录下的资源有所有权,对于其他用户的目录无权限)。当移动应用(App)直连OOS上传或下载数据时,App需要向应用服务器申请访问凭证。应用服务器以该APP的IAM用户身份,调用STS API接口获取临时安全访问凭证,并将临时安全访问凭证传递给App,App使用临时安全访问凭证访问OOS。
具体步骤如下所示:
-
OOS为应用服务器创建IAM用户并附加权限策略。具体策略可参考下列示例:
{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowListAllBuckets", "Effect": "Allow", "Action": [ "oos:ListAllMyBucket" ], "Resource": "*" }, { "Sid": "AllowListYourselfFolder", "Effect": "Allow", "Action": [ "oos:ListBucket" ], "Resource": [ "arn:ctyun:oos::2hlo7dkswa22t:bucketname" ], "Condition": { "StringLike": { "oos:prefix": [ "${ctyun:username}/*" ] } } }, { "Sid": "AllowControleYourselfFolder", "Effect": "Allow", "Action": [ "oos:GetObject", "oos:ListMultipartUploadParts", "oos:DeleteObject", "oos:PutObject", "oos:DeleteMultipleObjects", "oos:AbortMultipartUpload" ], "Resource": [ "arn:ctyun:oos::2hlo7dkswa22t:bucketname/${ctyun:username}/*" ] }, { "Sid": "AllowCallSTS", "Effect": "Allow", "Action": [ "iam:GetSessionToken" ], "Resource": "*" } ] }
-
APP向应用服务器申请临时访问凭证。
-
应用服务器调用STS接口获取临时安全访问凭证。
请求示例POST / HTTP/1.1 Host: oos-cn-iam.ctyunapi.cn x-amz-date: Tue, 21 Aug 2012 17:54:50 GMT Content-MD5: 8dYiLewFWZyGgV2Q5FNI4W== Authorization:AWS fad0e782cd5132563e38:xQE0diMbLRepdf3YB+FIEXAMPLE= Content-Length: 445 Action=GetSessionToken&DurationSeconds=129600
响应示例
HTTP/1.1 200 OK x-amz-request-id: 996c76696e6727732072657175657374 Date: Mon, 1 Nov 2010 20:34:56 GMT Content-Type:text/xml;charset=UTF-8 Content-Length: 533 Server: CTYUN <GetSessionTokenResponse> <GetSessionTokenResult> <Credentials> <SessionToken>8b2b75f5a04e458b0da3a01602*********************************************e78b089528b915c2</SessionToken> <AccessKeyId>sts.6************b7fd</AccessKeyId> <SecretAccessKey>17b69******************c15f</SecretAccessKey> <Expiration>2023-04-27T13:52:08.282Z</Expiration> </Credentials> </GetSessionTokenResult> <ResponseMetadata> <RequestId>62c80e3868a14804</RequestId> </ResponseMetadata> </GetSessionTokenResponse>
-
应用服务器将获取的临时安全访问凭证传递给APP。
-
APP使用临时安全访问凭证访问OOS资源,进行数据直传。
调用时输入步骤3返回的信息:
AccessKeyId:sts.6************b7fd SecretAccessKey:17b69******************c15f SessionToken:8b2b75f5a04e458b0da3a01602*********************************************e78b089528b915c2
注意由于生成的临时安全访问凭证是默认继承IAM用户的权限,所以我们在为IAM用户创建策略的时候,仅分配STS接口权限和所需操作的最小权限,不推荐分配CreateUser、CreateAccessKey、UpdateLoginProfile等权限,以防止临时安全访问凭证权限过大。