详情页标题前

腾讯云对象存储最小权限原则说明

详情页1

概述

在使用对象存储(Cloud Object Storage,COS)时,您可能需要使用临时密钥授予用户相应的资源操作权限,或者为您的子用户或者协作者授予相应的用户策略,允许他们协助您操作 COS 上的资源,或者需要为存储桶添加相应的存储桶策略,允许指定的用户能够在您的存储桶中进行指定的操作,操作指定的资源。在进行这些权限配置的时候,请务必遵循最小权限原则,以保障您的数据资产安全。最小权限原则指的是,当您在授权的时候,请务必明确权限范围,需要明确授予指定用户何种条件下,执行何种操作,访问何种资源的权限。

注意事项

当您在授权的时候,建议严格遵循最小权限,限定用户执行受限的操作(例如授权 action:GetObject),访问受限的资源(例如授权 resource:examplebucket-1250000000/exampleobject.txt)。
为避免授予过大的权限,导致预期外的越权操作,引起数据安全风险。我们强烈建议您尽量避免授予用户访问所有资源(例如
resource:*),或者进行所有操作(例如 action:*)的权限。潜在的数据安全风险举例如下:数据泄露:授予用户下载指定资源,例如下载 examplebucket-1250000000/data/config.jsonexamplebucket-1250000000/video/,但如果在权限策略中配置了examplebucket-1250000000/*,将导致该存储桶下的所有对象均被允许下载,出现越权操作行为,导致预期外的数据被泄漏。数据被覆盖写:授予用户上传资源权限,例如上传 examplebucket-1250000000/data/config.jsonexamplebucket-1250000000/video/,但如果在权限策略中配置了examplebucket-1250000000/*,将导致该存储桶下的所有对象均被允许上传,出现越权操作行为,导致预期外的对象被覆盖。防范该风险,除了遵循最小权限原则,您可以通过 版本控制 来保留数据的所有历史版本以便追溯。权限泄露:授予用户列出存储桶的对象列表cos:GetBucket,但如果在权限策略中配置了 cos:*,将导致该存储桶的所有操作均被允许,包括对存储桶再授权、删除对象和删除存储桶,您的数据将存在巨大风险。

使用指引

在最小权限原则下,您需要在策略中明确指定以下信息:委托人(principal):必须明确指定您需要授予哪些子用户(需要填写用户 ID)、协作者(需要填写用户 ID)、匿名用户或者用户组权限。如果您使用临时密钥进行访问,则不需要指定此项。语句(statement):在以下几项参数中明确填写相应的参数。效力(effect):必须明确声明该策略是“允许”还是“显式拒绝”,包括 allow 和 deny 两种情况。操作(action):必须明确声明该策略允许或拒绝的操作。操作可以是单个 API 操作或者多个 API 操作的集合。资源(resource):必须明确声明该策略授权的具体资源。资源是用六段式描述。您可以指定资源范围为指定的文件,例如 exampleobject.jpg,或者指定的目录,例如 examplePrefix/*。除非业务需要,否则请不要随意授予用户访问所有资源的权限,即通配符*条件(condition):描述策略生效的约束条件。条件包括操作符、操作键和操作值组成。条件值可包括时间、IP 地址等信息。

临时密钥最小权限指引

申请临时密钥过程中,您可以通过设置权限策略 Policy 字段,限制操作和资源,将权限限制在指定的范围内。有关临时密钥的生成说明,可参见 临时密钥生成和使用指引 文档。

授权示例

使用 Java SDK 授权访问某个对象的权限

假设需要使用 Java SDK 授权下载存储桶 examplebucket-1250000000 中对象 exampleObject.txt 的权限,则相应的需要配置代码如下:

// 根据 github 提供的 maven 集成方法导入 java sts sdk import 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://cloud.tencent.com/document/product/598/37140 String secretKey = System.getenv("secretKey");//用户的 SecretKey,建议使用子账号密钥,授权遵循最小权限指引,降低使用风险。子账号密钥获取可参考https://cloud.tencent.com/document/product/598/37140 // 替换为您的 SecretId config.put("SecretId", secretId); // 替换为您的 SecretKey config.put("SecretKey", secretKey);
// 临时密钥有效时长,单位是秒,默认1800秒,最长可设定有效期为7200秒 config.put("durationSeconds", 1800);
// 换成您的 bucket config.put("bucket", "examplebucket-1250000000"); // 换成 bucket 所在地区 config.put("region", "ap-guangzhou");
// 这里改成允许的路径前缀,可以根据自己网站的用户登录态判断允许上传的具体路径,例子:a.jpg 或者 a/* 或者 * 。 // 如果填写了“*”,将允许用户访问所有资源;除非业务需要,否则请按照最小权限原则授予用户相应的访问权限范围。 config.put("allowPrefix", "exampleObject.txt");
// 密钥的权限列表。简单上传、表单上传和分片上传需要以下的权限,其他权限列表请看 https://cloud.tencent.com/document/product/436/31923 String[] 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 !"); } }}

使用 API 授权访问某个对象的权限

假设需要使用 API 授权下载存储桶 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/*"      ]    }  ]}

预签名最小权限指引

您可以通过预签名 URL 的方式实现临时上传和下载操作。此外也可将预签名 URL 提交给任何人,收到有效预签名 URL 的任何人都可以上传或下载对象。注意临时密钥和永久密钥都可以用于生成预签名 URL,但强烈建议您遵循最小权限指引原则 生成临时密钥,并使用临时密钥计算预签名;尽量不要使用权限过大的永久密钥,以免造成安全风险。

授权示例

授予用户使用预签名 URL 下载对象的权限

使用临时密钥生成一个带签名的下载链接,并设置覆盖要返回的一些公共头部(例如 content-type,content-language),以下为 Java 示例代码:

// 传入获取到的临时密钥 (tmpSecretId, tmpSecretKey, sessionToken)String tmpSecretId = "SECRETID";String tmpSecretKey = "SECRETKEY";String sessionToken = "TOKEN";COSCredentials cred = new BasicSessionCredentials(tmpSecretId, tmpSecretKey, sessionToken);// 设置 bucket 的区域, COS 地域的简称请参照 https://cloud.tencent.com/document/product/436/6224// 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-APPID String 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();

用户策略最小权限指引

用户策略是指在 CAM 控制台 添加的用户权限策略,用于授予用户访问 COS 资源的权限。用户访问策略概述的配置说明,可参见 访问策略语言概述 文档。

授权示例

授予账户访问某个对象的权限

假设需要授予账户 UIN 为 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"            ]        }    ]}

授予子账户访问某个目录的权限

假设需要授予子账户 UIN 为 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/*"            ]        }    ]}

存储桶策略最小权限指引

存储桶策略是指在存储桶中配置的访问策略,允许指定用户对存储桶及桶内的资源进行指定的操作。配置存储桶策略可参见 添加存储桶策略 文档。

授权示例

授予子账号访问特定对象的权限

假设需要授予子账户 UIN 为 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"}



对象存储官网1折活动,限时活动,即将结束,速速收藏
同尘科技为腾讯云授权服务中心。
购买腾讯云产品享受折上折,更有现金返利。同意关联立享优惠

转转请注明出处:https://www.yunxiaoer.com/144764.html

(0)
上一篇 2023年12月9日 上午1:51
下一篇 2023年12月9日 上午1:51
详情页2

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信
本站为广大会员提供阿里云、腾讯云、华为云、百度云等一线大厂的购买,续费优惠,保证底价,买贵退差。