Bucket Policy是阿里云OSS推出的针对云盒Bucket的授权策略,您可以通过Bucket Policy授权其他用户访问您指定的云盒Bucket资源。
使用场景
Bucket Policy通常应用于以下场景的授权访问:
- 需要进行跨账号或对匿名用户授权访问或管理整个Bucket或Bucket内的部分资源。
- 需要对同账号下的不同RAM用户授予访问或管理Bucket资源的不同权限,例如只读、读写或完全控制的权限。
云盒Bucket
方式一:图形化配置Bucket Policy
- 登录OSS管理控制台。
- 在左侧导航栏,单击云盒Bucket,然后单击目标Bucket名称。
- 在左侧导航栏,选择 。
- 在Bucket授权策略页签,单击按图形策略添加,然后单击新增授权。
- 在新增授权面板,按以下说明配置各项参数,然后单击确定。
配置项 说明 授权资源 授权整个Bucket或Bucket内的部分资源供其他用户访问。 - 整个Bucket:授权策略针对整个Bucket生效。
- 指定资源:授权策略只针对指定的资源生效。您可以配置多条针对指定资源的授权策略。
- 针对目录级别授权
授权访问目录下的所有子目录和文件时,需在目录结尾处加上星号(*)。例如授权访问abc目录下的所有子目录和文件,则填写为abc/*。
- 针对指定文件授权
授权访问目录下的指定文件时,需填写不包含Bucket名称在内的文件的完整路径,例如授权访问abc目录下的myphoto.png文件,则填写为abc/myphoto.png。
- 针对目录级别授权
授权用户 通过选择不同类型的账号将资源授权给不同用户进行访问。 - 所有账号(*):如果您需要给所有用户授权访问指定资源,请选中此项。
- 子账号:如果您需要给当前账号下的RAM用户授权访问指定资源,请选中此项,并从下拉菜单中选择目标RAM用户。如果需要授权的RAM用户较多时,建议直接在搜索框输入RAM用户名称关键字进行模糊匹配。
重要 您的账号必须是阿里云账号,或拥有此Bucket管理权限及RAM控制台ListUsers权限的RAM用户,否则无法查看当前账号的RAM用户列表。给RAM用户授予ListUsers权限的具体操作请参见 为RAM用户授权。
- 其他账号:如果您需要给其他阿里云账号、RAM用户以及通过STS生成的临时用户授予访问权限,请选中此项。
- 当您需要给其他阿里云账号或RAM用户授权时,请输入被授权账号的UID。
- 当您需要给STS临时用户授权时,输入格式为
arn:sts::{RoleOwnerUid}:assumed-role/{RoleName}/{RoleSessionName}
。例如生成临时用户时使用的角色为testrole,角色拥有者的阿里云账号UID为12345,生成临时用户时指定的RoleSessionName为testsession。此时应填写arn:sts::12345:assumed-role/testrole/testsession
。当您需要给所有临时用户授权时,请使用通配符星号(*)。例如配置为arn:sts::*:*/*/*
。生成临时授权用户的操作请参见使用STS临时访问凭证访问OSS。
重要 当被授权的用户是STS临时用户时,该账号无法通过OSS控制台访问授权资源,您可以通过命令行工具ossutil、OSS SDK、OSS API访问授权资源。
授权操作 您可以通过简单设置和高级设置两种方式进行授权操作。 - 简单设置
选中此项后,您可以结合实际场景按照如下说明配置相应的访问权限。将鼠标悬停在每一种访问权限右侧对应的
,可获取各访问权限对应的Action列表。
- 只读(不包含ListObject操作):对相关资源拥有查看和下载的权限。
- 只读(包含ListObject操作):对相关资源拥有查看、列举和下载的权限。
- 读/写:对相关资源有读和写权限。
- 完全控制:对相关资源有读、写、删除等所有操作权限。
- 拒绝访问:拒绝对相关资源的所有操作。
重要对开通了OSS-HDFS服务的Bucket配置Bucket Policy时,为确保使用OSS-HDFS服务的用户可正常访问OSS-HDFS的数据存储目录
.dlsdata/
及目录下的任意Object,请确保您在配置Bucket Policy时,授权操作不能选择拒绝访问。- 如果针对某用户同时配置了多条Bucket Policy规则,则该用户所拥有的权限是所有Policy规则的叠加。当这些Bucket Policy中包含拒绝访问权限时,遵循拒绝访问权限优先原则。例如针对某用户第一次设置了只读权限,第二次设置了读/写权限,则该用户最终的权限为读/写。如果第三次设置了拒绝访问权限,则该用户最终的权限为拒绝访问。
- 只读、读/写、完全控制对应的授权效力为Allow,拒绝访问对应的授权效力为Deny。
- 高级设置
选中此项后,您需要根据以下说明完成相关配置。
- 效力:包含允许(Allow)和拒绝(Deny)两种授权效力。
- 操作:支持配置所有OSS支持的Action。关于Action分类的更多信息,请参见RAM Policy概述。
条件(可选) 您还可以在基础设置和高级设置模式下选中此项,用于限定只有满足条件的用户能够访问OSS资源。 - 访问方式:默认支持HTTP和HTTPS两种访问方式。如果您希望当前授权策略通过HTTPS的方式来访问Bucket资源,请选择HTTPS。如果您希望当前授权策略通过HTTP的方式来访问Bucket资源,请选择HTTP。相比HTTP,HTTPS具有更高的安全性。
如果您需要强制Bucket内资源的所有请求访问方式为其中一种,例如HTTPS,您需要通过策略语法的方式来实现。具体设置方法,请参见如何配置HTTPS请求和证书?。
- IP =:设置IP等于某个IP地址或IP地址段。如有多个IP地址,各个IP地址之间用英文逗号(,)分隔。
- IP ≠:设置IP不等于某个IP地址或IP地址段。如有多个IP地址,各个IP地址之间用英文逗号(,)分隔 。
- VPC:下拉选择当前账号下已创建的专有云网络VPC ID,也可以通过下方的输入框填写当前账号或其他账号创建的VPC ID。关于创建专有网络的具体步骤,请参见创建专有网络和交换机。
方式二:通过策略语法配置Bucket Policy
- 登录OSS管理控制台。
- 在左侧导航栏,单击云盒Bucket,然后单击目标Bucket名称。
- 在左侧导航栏,选择 。
- 在Bucket授权策略页签,单击按语法策略添加。
- 单击编辑。
- 示例一:允许匿名用户列举某个云盒Bucket下所有文件的权限。
{ "Statement": [ { "Action": [ "oss-cloudbox:ListObjects", "oss-cloudbox:ListObjectVersions" ], "Effect": "Allow", "Principal": [ "*" ], "Resource": [ "acs:oss-cloudbox:*:174649585760xxxx:cloudbox/cb-f8z7yvzgwfkl9q0h****/bucket/examplebucket" ] }, ], "Version": "1" }
- 示例二:拒绝源IP地址不在192.168.0.0/16范围内的匿名用户对某个云盒Bucket执行任何操作。
{ "Version": "1", "Statement": [ { "Effect": "Deny", "Action": "oss-cloudbox:*", "Principal": [ "*" ], "Resource": [ "acs:oss-cloudbox:*:174649585760xxxx:cloudbox/cb-f8z7yvzgwfkl9q0h****/bucket/examplebucket" ], "Condition":{ "NotIpAddress": { "acs:SourceIp": ["192.168.0.0/16"] } } } ] }
- 示例三:允许指定的RAM用户(UID为20214760404935xxxx)拥有目标存储空间examplebucket下hangzhou/2020和hangzhou/2015目录的只读权限。
{ "Statement": [ { "Action": [ "oss-cloudbox:GetObject", "oss-cloudbox:GetObjectAcl", ], "Effect": "Allow", "Principal": [ "20214760404935xxxx" ], "Resource": [ "acs:oss-cloudbox:*:174649585760xxxx:cloudbox/cb-f8z7yvzgwfkl9q0h****/bucket/examplebucket/object/hangzhou/2020/*", "acs:oss-cloudbox:*:174649585760xxxx:cloudbox/cb-f8z7yvzgwfkl9q0h****/bucket/examplebucket/object/hangzhou/2015/*" ] }, { "Action": [ "oss-cloudbox:ListObjects", "oss-cloudbox:ListObjectVersions" ], "Condition": { "StringLike": { "oss-cloudbox:Prefix": [ "hangzhou/2020/*", "hangzhou/2015/*" ] } }, "Effect": "Allow", "Principal": [ "20214760404935xxxx" ], "Resource": [ "acs:oss-cloudbox:*:174649585760xxxx:cloudbox/cb-f8z7yvzgwfkl9q0h****/bucket/examplebucket" ] } ], "Version": "1" }
- 示例一:允许匿名用户列举某个云盒Bucket下所有文件的权限。
使用阿里云SDK
仅支持通过Java SDK设置Bucket Policy,Java SDK要求3.15.0及以上版本。
import com.aliyun.oss.ClientException;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.OSSException;
public class Demo {
public static void main(String[] args) throws Exception {
// 填写云盒Bucket的数据域名。
String endpoint = "https://cb-f8z7yvzgwfkl9q0h****.cn-hangzhou.oss-cloudbox.aliyuncs.com";
// 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
String accessKeyId = "yourAccessKeyId";
String accessKeySecret = "yourAccessKeySecret";
// 填写云盒Bucket名称,例如examplebucket。
String bucketName = "examplebucket";
// 填写云盒Bucket所在地域。
String region = "cn-hangzhou";
// 填写云盒ID。
String cloudBoxId = "cb-f8z7yvzgwfkl9q0h****";
// 创建OSSClient实例。
ClientBuilderConfiguration conf = new ClientBuilderConfiguration();
conf.setSignatureVersion(SignVersion.V4);
OSS ossClient = OSSClientBuilder.create()
.endpoint(endpoint)
.credentialsProvider(new DefaultCredentialProvider(accessKeyId, accessKeySecret))
.clientConfiguration(conf)
.region(region)
.cloudBoxId(cloudBoxId)
.build();
try {
// 填写policyText。
String policyText = "{\"Statement\": [{\"Effect\": \"Allow\", \"Action\": [\"oss-cloudbox::ListObjectVersions\", \"oss-cloudbox::ListObjects\"], \"Resource\": [\"acs:oss-cloudbox:{region}:{bucket_owner}:cloudbox/{cloudbox_id}/bucket/{bucket_name}/object/{object_name}\"]}], \"Version\": \"1\"}";
// 设置授权策略。
ossClient.setBucketPolicy(bucketName, policyText);
} catch (OSSException oe) {
System.out.println("Caught an OSSException, which means your request made it to OSS, "
+ "but was rejected with an error response for some reason.");
System.out.println("Error Message:" + oe.getErrorMessage());
System.out.println("Error Code:" + oe.getErrorCode());
System.out.println("Request ID:" + oe.getRequestId());
System.out.println("Host ID:" + oe.getHostId());
} catch (ClientException ce) {
System.out.println("Caught an ClientException, which means the client encountered "
+ "a serious internal problem while trying to communicate with OSS, "
+ "such as not being able to access the network.");
System.out.println("Error Message:" + ce.getMessage());
} finally {
if (ossClient != null) {
ossClient.shutdown();
}
}
}
}
使用命令行工具ossutil
关于使用ossutil设置或修改Bucket Policy的具体操作,请参见bucket-policy(授权策略)。
使用REST API
如果您的程序自定义要求较高,您可以直接发起REST API请求。直接发起REST API请求需要手动编写代码计算签名。更多信息,请参见PutBucketPolicy。