action:GetObject
),访问受限的资源(例如授权 resource:examplebucket-1250000000/exampleobject.txt
)。
为避免授予过大的权限,导致预期外的越权操作,引起数据安全风险。我们强烈建议您尽量避免授予用户访问所有资源(例如 resource:*
),或者进行所有操作(例如 action:*
)的权限。examplebucket-1250000000/data/config.json
和 examplebucket-1250000000/video/
,但如果在权限策略中配置了examplebucket-1250000000/*
,将导致该存储桶下的所有对象均被允许下载,出现越权操作行为,导致预期外的数据被泄漏。examplebucket-1250000000/data/config.json
和 examplebucket-1250000000/video/
,但如果在权限策略中配置了examplebucket-1250000000/*
,将导致该存储桶下的所有对象均被允许上传,出现越权操作行为,导致预期外的对象被覆盖。防范该风险,除了遵循最小权限原则,您可以通过 版本控制 来保留数据的所有历史版本以便追溯。cos:GetBucket
,但如果在权限策略中配置了 cos:*
,将导致该存储桶的所有操作均被允许,包括对存储桶再授权、删除对象和删除存储桶,您的数据将存在巨大风险。exampleobject.jpg
,或者指定的目录,例如 examplePrefix/*
。除非业务需要,否则请不要随意授予用户访问所有资源的权限,即通配符*
。examplebucket-1250000000
中对象 exampleObject.txt
的权限,则相应的需要配置代码如下:// 根据 github 提供的 maven 集成方法导入 java sts sdkimport java.util.*;import org.json.JSONObject;import com.tencent.cloud.CosStsClient;public class Demo {public static void main(String[] args) {TreeMap<String, Object> config = new TreeMap<String, Object>();try {String secretId = System.getenv("secretId");//用户的 SecretId,建议使用子账号密钥,授权遵循最小权限指引,降低使用风险。子账号密钥获取可参考https://www.tencentcloud.com/document/product/598/37140?from_cn_redirect=1String secretKey = System.getenv("secretKey");//用户的 SecretKey,建议使用子账号密钥,授权遵循最小权限指引,降低使用风险。子账号密钥获取可参考https://www.tencentcloud.com/document/product/598/37140?from_cn_redirect=1// 替换为您的 SecretIdconfig.put("SecretId", secretId);// 替换为您的 SecretKeyconfig.put("SecretKey", secretKey);// 临时密钥有效时长,单位是秒,默认1800秒,最长可设定有效期为7200秒config.put("durationSeconds", 1800);// 换成您的 bucketconfig.put("bucket", "examplebucket-1250000000");// 换成 bucket 所在地区config.put("region", "ap-guangzhou");// 这里改成允许的路径前缀,可以根据自己网站的用户登录态判断允许上传的具体路径,例子:a.jpg 或者 a/* 或者 * 。// 如果填写了“*”,将允许用户访问所有资源;除非业务需要,否则请按照最小权限原则授予用户相应的访问权限范围。config.put("allowPrefix", "exampleObject.txt");// 密钥的权限列表。简单上传、表单上传和分片上传需要以下的权限,其他权限列表请看 https://www.tencentcloud.com/document/product/436/31923?from_cn_redirect=1String[] allowActions = new String[] {// 下载数据"name/cos:GetObject"};config.put("allowActions", allowActions);JSONObject credential = CosStsClient.getCredential(config);//成功返回临时密钥信息,如下打印密钥信息System.out.println(credential);} catch (Exception e) {//失败抛出异常throw new IllegalArgumentException("no valid secret !");}}}
examplebucket-1250000000
中对象 exampleObject.txt
和目录为 examplePrefix
下所有对象的权限,则相应的需要写入的 Policy 如下:{"version": "2.0","statement": [{"action": ["name/cos:GetObject"],"effect": "allow","resource": ["qcs::cos:ap-beijing:uid/1250000000:examplebucket-1250000000/exampleObject.txt","qcs::cos:ap-beijing:uid/1250000000:examplebucket-1250000000/examplePrefix/*"]}]}
// 传入获取到的临时密钥 (tmpSecretId, tmpSecretKey, sessionToken)String tmpSecretId = "SECRETID";String tmpSecretKey = "SECRETKEY";String sessionToken = "TOKEN";COSCredentials cred = new BasicSessionCredentials(tmpSecretId, tmpSecretKey, sessionToken);// 设置 bucket 的区域, COS 地域的简称请参照 https://www.tencentcloud.com/document/product/436/6224?from_cn_redirect=1// clientConfig 中包含了设置 region, https(默认 http), 超时, 代理等 set 方法, 使用可参见源码或者常见问题 Java SDK 部分Region region = new Region("COS_REGION");ClientConfig clientConfig = new ClientConfig(region);// 如果要生成一个使用 https 协议的 URL,则设置此行,推荐设置。// clientConfig.setHttpProtocol(HttpProtocol.https);// 生成 cos 客户端COSClient cosClient = new COSClient(cred, clientConfig);// 存储桶的命名格式为 BucketName-APPIDString bucketName = "examplebucket-1250000000";// 此处的key为对象键,对象键是对象在存储桶内的唯一标识String key = "exampleobject";GeneratePresignedUrlRequest req =new GeneratePresignedUrlRequest(bucketName, key, HttpMethodName.GET);// 设置下载时返回的 http 头ResponseHeaderOverrides responseHeaders = new ResponseHeaderOverrides();String responseContentType = "image/x-icon";String responseContentLanguage = "zh-CN";// 设置返回头部里包含文件名信息String responseContentDispositon = "filename=\\"exampleobject\\"";String responseCacheControl = "no-cache";String cacheExpireStr =DateUtils.formatRFC822Date(new Date(System.currentTimeMillis() + 24L * 3600L * 1000L));responseHeaders.setContentType(responseContentType);responseHeaders.setContentLanguage(responseContentLanguage);responseHeaders.setContentDisposition(responseContentDispositon);responseHeaders.setCacheControl(responseCacheControl);responseHeaders.setExpires(cacheExpireStr);req.setResponseHeaders(responseHeaders);// 设置签名过期时间(可选),若未进行设置,则默认使用 ClientConfig 中的签名过期时间(1小时)// 这里设置签名在半个小时后过期Date expirationDate = new Date(System.currentTimeMillis() + 30L * 60L * 1000L);req.setExpiration(expirationDate);URL url = cosClient.generatePresignedUrl(req);System.out.println(url.toString());cosClient.shutdown();
100000000001
,下载存储桶 examplebucket-1250000000
中对象 exampleObject.txt
的权限,则相应的访问策略为:{"version": "2.0","principal": {"qcs": ["qcs::cam::uin/100000000001:uin/100000000001"]},"statement": [{"action": ["name/cos:GetObject"],"effect": "allow","resource": ["qcs::cos:ap-guangzhou:uid/1250000000:examplebucket-1250000000.ap-guangzhou.myqcloud.com/exampleObject.txt"]}]}
100000000011
(主账户 UIN 为 100000000001
),下载存储桶 examplebucket-1250000000
中目录为 examplePrefix
下的对象的权限,则相应的访问策略为:{"version": "2.0","principal": {"qcs": ["qcs::cam::uin/100000000001:uin/100000000011"]},"statement": [{"action": ["name/cos:GetObject"],"effect": "allow","resource": ["qcs::cos:ap-guangzhou:uid/1250000000:examplebucket-1250000000.ap-guangzhou.myqcloud.com/examplePrefix/*"]}]}
100000000011
(主账户 UIN 为 100000000001
),下载存储桶 examplebucket-1250000000
中的对象 exampleObject.txt
和目录 examplePrefix
下所有对象的权限,则相应的访问策略为:{"Statement": [{"Action": ["name/cos:GetObject"],"Effect": "allow","Principal": {"qcs": ["qcs::cam::uin/100000000001:uin/100000000011"]},"Resource": ["qcs::cos:ap-beijing:uid/1250000000:examplebucket-1250000000/exampleObject.txt","qcs::cos:ap-beijing:uid/1250000000:examplebucket-1250000000/examplePrefix/*"]}],"version": "2.0"}
本页内容是否解决了您的问题?