tencent cloud

对象存储

动态与公告
产品动态
产品公告
产品简介
产品概述
功能概览
应用场景
产品优势
基本概念
地域和访问域名
规格与限制
产品计费
计费概述
计费方式
计费项
免费额度
计费示例
查看和下载账单
欠费说明
常见问题
快速入门
控制台快速入门
COSBrowser 快速入门
用户指南
创建请求
存储桶
对象
数据管理
批量处理
全球加速
监控与告警
运维中心
数据处理
内容审核
智能工具箱
数据工作流
应用集成
工具指南
工具概览
环境安装与配置
COSBrowser 工具
COSCLI 工具
COSCMD 工具
COS Migration 工具
FTP Server 工具
Hadoop 工具
COSDistCp 工具
HDFS TO COS 工具
GooseFS-Lite 工具
在线辅助工具
自助诊断工具
实践教程
概览
访问控制与权限管理
性能优化
使用 AWS S3 SDK 访问 COS
数据容灾备份
域名管理实践
图片处理实践
COS 音视频播放器实践
工作流实践
数据直传
内容审核实践
数据安全
数据校验
大数据实践
COS 成本优化解决方案
在第三方应用中使用 COS
迁移指南
本地数据迁移至 COS
第三方云存储数据迁移至 COS
以 URL 作为源地址的数据迁移至 COS
COS 之间数据迁移
Hadoop 文件系统与 COS 之间的数据迁移
数据湖存储
云原生数据湖
元数据加速
数据加速器 GooseFS
数据处理
数据处理概述
图片处理
媒体处理
内容审核
文件处理
文档处理
故障处理
获取 RequestId 操作指引
通过外网上传文件至 COS 缓慢
访问 COS 时返回403错误码
资源访问异常
POST Object 常见异常
API 文档
简介
公共请求头部
公共响应头部
错误码
请求签名
操作列表
Service 接口
Bucket 接口
Object 接口
批量处理接口
数据处理接口
任务与工作流
内容审核接口
云查毒接口
SDK 文档
SDK 概览
准备工作
Android SDK
C SDK
C++ SDK
.NET(C#) SDK
Flutter SDK
Go SDK
iOS SDK
Java SDK
JavaScript SDK
Node.js SDK
PHP SDK
Python SDK
React Native SDK
小程序 SDK
错误码
鸿蒙(Harmony) SDK
终端 SDK 质量优化
安全与合规
数据容灾
数据安全
访问管理
常见问题
热门问题
一般性问题
计费计量问题
域名合规问题
存储桶配置问题
域名和 CDN 问题
文件操作问题
日志监控问题
权限管理问题
数据处理问题
数据安全问题
预签名 URL 问题
SDK 类问题
工具类问题
API 类问题
服务协议
Service Level Agreement
隐私政策
数据处理和安全协议
联系我们
词汇表

最小权限原则说明

PDF
聚焦模式
字号
最后更新时间: 2024-01-06 11:09:25

概述

在使用对象存储(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://www.tencentcloud.com/document/product/598/37140?from_cn_redirect=1
String secretKey = System.getenv("secretKey");//用户的 SecretKey,建议使用子账号密钥,授权遵循最小权限指引,降低使用风险。子账号密钥获取可参考https://www.tencentcloud.com/document/product/598/37140?from_cn_redirect=1
// 替换为您的 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://www.tencentcloud.com/document/product/436/31923?from_cn_redirect=1
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://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-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"
}

帮助和支持

本页内容是否解决了您的问题?

填写满意度调查问卷,共创更好文档体验。

文档反馈