本文共 9983 字,大约阅读时间需要 33 分钟。
控制台上,授权策略管理界面,如下图所示。
系统授权策略,阿里云提供的一组通用授权策略,主要针对不同产品的只读权限、所有权限。对于阿里云提供的这组授权策略,用户只能用于授权,不能编辑和修改。更详细的解释,请参看 。
有4个重要的系统授权策略您需要了解,应该会使用到它们。系统授权策略 | 说明 | 备注 |
---|---|---|
AdministratorAccess | 管理所有阿里云资源的权限 | 用户下所有阿里云服务的所有权限 |
AliyunOSSFullAccess | 管理开放存储服务(OSS)权限 | 用户下OSS所有Bucket和Object的所有权限 |
AliyunOSSReadOnlyAccess | 只读访问开放存储服务(OSS)的权限 | 可以读取/列举OSS的所有Bucket和Object |
AliyunSTSAssumeRoleAccess | 调用STS服务AssumeRole接口的权限 | 子用户角色扮演需要拥有该权限 |
如果您有更细粒度的授权需求,需要创建自定义授权策略。创建OSS的自定义授权策略,强烈建议使用 生成。控制台上授权策略管理的路径如下:
后宫中人员充当角色,需要皇后的遴选或批准。阿里云访问控制中临时用户怎么扮演角色呢?流程如下:
上述步骤详细说明如下表:
步骤 | 说明 |
---|---|
1.创建角色并授权 | 在控制台完成,步骤请参考“授权->授权->角色授权”。 |
2.创建子用户并授权AliyunSTSAssumeRoleAccess | 在控制台完成,步骤请参考“授权->授权->子用户授权”。只能由子用户申请角色扮演,主用户、临时用户不可以。子用户必须授予AliyunSTSAssumeRoleAccess权限后,才能申请角色扮演。 在后宫,皇上是不管理宫女、宦官等角色的。皇上许可后,皇后管理后宫各角色。皇上许可相当于授予了AliyunSTSAssumeRoleAccess权限。 |
3.申请临时用户扮演角色 | 需要使用STS SDK的完成,调用AssumeRole接口。下面重点讲述,给出Java SDK的示例。临时用户的权限跟扮演的角色有关,跟子用户的权限没有关系。 |
4.临时用户密钥 | AssumeRole接口会返回密钥,即AccessKeyID、AccessKeySecret、SecurityToken。 |
5.密钥返回给临时用户 | 临时用户获取到密钥。 |
6.使用密钥访问OSS | 临时用户使用密钥访问OSS等阿里云服务。 |
第3步,需要使用STS SDK完成。以Java SDK说明使用方法。在Maven工程中添加如下依赖。
com.aliyun aliyun-java-sdk-sts 2.1.6 com.aliyun aliyun-java-sdk-core 2.1.7
代码如下:
public class StsServiceSample { // 目前只有"cn-hangzhou"这个region可用, 不要使用填写其他region的值 public static final String REGION_CN_HANGZHOU = "cn-hangzhou"; // 当前 STS API 版本 public static final String STS_API_VERSION = "2015-04-01"; // STS服务必须为 HTTPS public static final ProtocolType STS_PROTOCOL_TYPE = ProtocolType.HTTPS;static AssumeRoleResponse assumeRole(String accessKeyId,String accessKeySecret, String roleArn, String roleSessionName, String policy, long expired, ProtocolType protocolType)throws ClientException { // 创建一个 Aliyun Acs Client, 用于发起 OpenAPI 请求 IClientProfile profile = DefaultProfile.getProfile(REGION_CN_HANGZHOU, accessKeyId, accessKeySecret); DefaultAcsClient client = new DefaultAcsClient(profile); // 创建一个 AssumeRoleRequest 并设置请求参数 final AssumeRoleRequest request = new AssumeRoleRequest(); request.setVersion(STS_API_VERSION); request.setMethod(MethodType.POST); request.setProtocol(protocolType); request.setRoleArn(roleArn); request.setRoleSessionName(roleSessionName); request.setPolicy(policy); request.setDurationSeconds(expired); // 发起请求,并得到response return client.getAcsResponse(request); } public static void main(String[] args) { // 只有 子账号才能调用 AssumeRole接口 // 阿里云主账号的AccessKeys不能用于发起AssumeRole请求 // 请首先在RAM控制台创建子用户,并为这个用户创建AccessKeys String accessKeyId = "b6R5********SQmR"; String accessKeySecret = "QzubQ****Dzzc****eCdD****LPjF4"; // AssumeRole API 请求参数: RoleArn, RoleSessionName, Policy, and // DurationSeconds // RoleArn可以到控制台上获取,路径是 访问控制 > 角色管理 > 角色名称 > 基本信息 > Arn String roleArn = "acs:ram::10858****7845250:role/accessossforinnerrole"; // RoleSessionName 是临时Token的会话名称,自己指定用于标识你的用户,主要用于审计,或者用于区分Token颁发给谁 // 但是注意RoleSessionName的长度和规则,不要有空格,只能有'-' '_' 字母和数字等字符 // 具体规则请参考API文档中的格式要求 String roleSessionName = "alice-001"; // 如何定制你的policy,如果policy为null,则STS的权限与roleArn的policy的定义的权限 String policy = null; // 过期时间设置默认是一小时,单位秒有效值是[900, 3600],即15分钟到60分钟。 long expired = 3600; try { AssumeRoleResponse response = assumeRole(accessKeyId,accessKeySecret, roleArn, roleSessionName, policy, expired, STS_PROTOCOL_TYPE); System.out.println("Expiration: " + response.getCredentials().getExpiration()); System.out.println("Access Key Id: " + response.getCredentials().getAccessKeyId()); System.out.println("Access Key Secret: " + response.getCredentials().getAccessKeySecret()); System.out.println("Security Token: " + response.getCredentials().getSecurityToken()); } catch (ClientException e) { System.out.println("Error code: " + e.getErrCode()); System.out.println("Error message: " + e.getErrMsg()); } }}
上面代码的完整示例,请参看 ;
其它的STS SDK的使用示例,请参考:
STS SDK使用更详细的说明,请参看 。
角色扮演场景错误及原因如下:
序号 | 问题 | 原因 |
---|---|---|
1 | ErrorCode: NoPermission ErrorMessage: Roles may not be assumed by root accounts. | 使用主用户的密钥调用AssumeRole,请使用子用户的密钥。 |
2 | ErrorCode: MissingSecurityToken ErrorMessage: SecurityToken is mandatory for this action. | 使用临时用户的密钥调用AssumeRole,请使用子用户的密钥。 |
3 | Error code: InvalidAccessKeyId.NotFound Error message: Specified access key is not found | AccessKeyId无效,请检查是否写错,特别是前后不能后空格。 |
4 | Error code: InvalidAccessKeyId.Inactive Error message: Specified access key is disabled. | 使用的子用户的密钥,已经被禁止,请启用密钥或更换密钥。 密钥是否被禁止,请控制台的“访问控制->用户管理->管理->用户详情->用户AccessKey”确认,并开启。 |
5 | ErrorCode: InvalidParameter.PolicyGrammar ErrorMessage: The parameter Policy has not passed grammar check. | 角色扮演时指定的授权策略无效。AssumeRole时可以指定授权(Policy),也可以不指定。如果指定授权策略,则临时用户的权限是指定的授权策略和角色权限的交集;如果不指定授权策略,临时用户的权限是角色的权限。报该错误时,请检查指定的授权策略Policy。不推荐临时用户扮演角色时指定授权策略。如果的确需要使用授权策略,强烈建使用 生成授权策略。 |
6 | ErrorCode: InvalidParameter.RoleSessionNameErrorMessage: The parameter RoleSessionName is wrongly formed. | 角色扮演时指定RoleSessionName无效。此参数用来区分不同的Token,以标明谁在使用此Token,便于审计; 格式:^[a-zA-Z0-9.@-_]+$,2-32个字符,了解更多请参看 。如命名a,1,abc\*abc,忍者神龟 等都是非法的 |
7 | ErrorCode: InvalidParameter.DurationSeconds Error message: The Min/Max value of DurationSeconds is 15min/1hr. | 角色扮演时指定的过期时间无效,即AssumeRoleRequest.setDurationSeconds参数无效。角色扮演时可以指定过期时间,单位为秒,有效时间是900 ~ 3600,如assumeRoleRequest.setDurationSeconds(60L * 20); 20分钟内有效。 |
8 | ErrorCode: NoPermissionErrorMessage: No permission perform sts:AssumeRole on this Role. Maybe you are not authorized to perform sts:AssumeRole or the specified role does not trust you | 原因1:AssumeRole的子用户没有权限,请给子用户授予AliyunSTSAssumeRoleAccess系统授权策略。请在“访问控制->用户管理->授权->可选授权策略名称”中给子用户授权AliyunSTSAssumeRoleAccess。原因2:申请角色扮演的子用户的云账号ID与角色的“受信云账号ID”不符,请角色创建者确认并修改。子用户的云账号ID,即创建子用户的主用户的ID;角色的云账号ID,即创建角色的主用户的云账号ID。请在如下位置确认修改 访问控制 -> 角色管理 -> 管理 -> 角色详细 -> 编辑基本信息 中确认修改。原因3:角色的类型错误,如果角色的类型分为“用户角色”和“服务角色”,服务角色不能使用AssumeRole扮演临时用户。 |
典型使用场景,请参看 。
最佳实践原则,请参看 。
最佳实践补充:
OSS返回的常见错误,请参看 。
其中403错误及原因如下表:| 错误 | 错误码错误信息 | 错误原因 | 解决办法 |
| -------------- | --------------------------- | ---------------------------------------- | ------------------ | | UserDisable.UserDisable | ErrorCode: UserDisableErrorMessage: UserDisable | 用户欠费或者因为安全原因被禁止访问 | || RequestTimeTooSkewed | ErrorCode: RequestTimeTooSkewedErrorMessage: The difference between the request time and the current time is too large. | 发起请求的时间和服务器时间超出15分钟,一般是客户端系统时间错误 | || InvalidAccessKeyId | ErrorCode: InvalidAccessKeyIdErrorMessage: The OSS Access Key Id you provided does not exist in our records. | AccessKeyId无效/被禁止或者过期。 | || SignatureDoesNotMatch | ErrorCode: SignatureDoesNotMatchErrorMessage: The request signature we calculated does not match the signature you provided. Check your key and signing method. | 客户端和服务计算的签名不符 | || PostObject | ErrorCode: AccessDeniedErrorMessage: Invalid according to Policy: Policy expired.ErrorCode: AccessDenied ErrorMessage: Invalid according to Policy: Policy Condition failed: … | PostObject中Policy无效 | || Cors | ErrorCode: AccessForbiddenErrorMessage: CORSResponse: This CORS request is not allowed. This is usually because the evalution of Origin, request method / Access-Control-Request-Method or Access-Control-Requet-Headers are not whitelisted by the resource's CORS spec. | CORS没有配置或配置不对 | | | Refers | ErrorCode: AccessDeniedErrorMessage: You are denied by bucket referer policy. | 请检查Bucket的Refers配置 | || AccessDenied | 见下面表权限问题错误及原因 | 无权限 | 下面详细讲述 | | 其它小类错误 | | | |权限问题错误及原因见下表:
序号 | 错误 | 原因 |
---|---|---|
1 | ErrorCode: AccessDeniedErrorMessage: The bucket you are attempting to access must be addressed using the specified endpoint. Please send all future requests to this endpoint. | Bucket和Endpoint不符 |
2 | ErrorCode: AccessDeniedErrorMessage: You are forbidden to list buckets. | 没有listBuckets权限 |
3 | ErrorCode: AccessDeniedErrorMessage: You do not have write acl permission on this object | 无setObjectAcl权限 |
4 | ErrorCode: AccessDeniedErrorMessage: You do not have read acl permission on this object. | 无getObjectAcl权限 |
5 | ErrorCode: AccessDeniedErrorMessage: The bucket you visit is not belong to you. | 子用户没有Bucket管理的权限(如getBucketAcl CreateBucket、deleteBucket setBucketReferer、 getBucketReferer等) |
6 | ErrorCode: AccessDeniedErrorMessage: You have no right to access this object because of bucket acl. | 子用户/临时用户没有访问Object的权限(如putObject getObject、appendObject deleteObject、postObject)等 |
7 | ErrorCode: AccessDeniedErrorMessage: Access denied by authorizer's policy. | 临时用户访问无权限,该临时用户角色扮演指定授权策略,该授权策略无权限 |
8 | ErrorCode: AccessDeniedErrorMessage: You have no right to access this object. | 子用户/临时用户无当前操作权限(如initiateMultipartUpload等) |
先熟悉如下操作:
访问权限错误流程如下图。
权限检查流程一般如下:
如果检查不出来需要调试,步骤如下:
OSS常见错误及排查
OSS授权常见问题阿里云官网
阿里云控制台 控制台访问控制主页面 控制台主用户密钥 阿里云访问控制帮助与文档 阿里云授权策略语言 访问控制系统授权策略 访问控制角色扮演示例 对象存储OSS常见错误 对象存储OSS帮助与文档 对象存储OSS安全管理 对象存储OSS常用授权策略 OSS上做RAM主子账号的授权 OSS授权策略生成工具RAM Policy Editor OSS常见错误及排查转载地址:http://pdyla.baihongyu.com/