做者介绍:
javascript
杨冠军:腾讯云 COS 首席解决方案架构师,现负责腾讯云对象存储 COS 华东区域客户的解决方案架构工做。java
随着互联网和公有云的发展,愈来愈多的企业把数据放到公有云上,COS(Cloud Object Storage)做为腾讯云的对象存储产品,提供了高容量、高可靠、低成本的存储解决方案,也使得客户把愈来愈多的业务数据放到了 COS 上。python
在数字化时代,数据逐渐成为了公司的核心资产,存储到对象存储 COS 上的数据安全性也愈来愈受到了重视,COS 自己提供了一系列高安全性的防御,包括:数据加密、链路加密、权限控制、版本控制、跨地域复制等等。
git
结合最近互联网上出现的安全事故,咱们发现 COS 的权限控制和管理是用户最容易形成疏漏的地方,本文将从 COS 的权限介绍和最佳实践等方面来对 COS 的权限管理作深刻分析,但愿对你理解 COS 的权限控制和有效管理 COS 的权限有所帮助。github
COS 相关权限vim
首先咱们先从逻辑上介绍下 COS 权限的分类,并对每一分类详细分析。api
分为公共权限和用户权限两类:安全
公共权限是 COS 最基本的权限配置,包括:继承权限、私有读写、公有读私有写和公有读写,支持的配置对象和说明以下:服务器
权限类型架构 |
配置项 |
说明 |
---|---|---|
继承权限 |
虚拟目录、Object |
存储桶里对象权限的默认值,继承存储桶的权限 |
私有读写 |
Bucket、虚拟目录、Object |
仅主帐号可写可读,非主帐号用户(子帐号、其余用户的主帐号或者匿名用户)不可访问 |
公有读私有写 |
Bucket、虚拟目录、Object |
主帐号可写可读,非主帐号用户(子帐号、其余用户的主帐号或者匿名用户)能够读取,可是不可写入新数据 |
公有读写 |
Bucket、虚拟目录 |
主帐号和非主帐号用户(子帐号、其余用户的主帐号或者匿名用户)都可写可读 |
这里着重对 Bucket 支持的公有权限作下说明:
私有读写:默认建立 Bucket 的权限,这个是比较安全的权限配置,也是咱们推荐的!
公有读私有写:若你须要公开 Bucket 里的数据,能够这样配置,容许任何用户不携带签名来读取 Bucket 里的 Object。
公有读写:这个是最不安全的权限配置了,至关于你把修改数据的权限都暴露了,请谨慎配置!
COS 对存储桶的公共权限配置,在存储桶的权限管理页面,参考下图:
公共权限配置
用户权限,这里指的是 ACL,全称:Access Control List,即权限控制列表,它是一种比较传统的权限管理方式。
与常见的 Linux 的 ACL 有所不一样,对象存储的 ACL 有本身的控制粒度和权限集合。COS 支持向每一个存储桶和对象都设置关联的 ACL,支持向其余主帐号、子帐号和用户组,授予基本的读、写权限。
ACL 支持的控制粒度分类以下:
存储桶(Bucket)
对象键前缀(Prefix)
对象(Object)
ACL 支持的权限操做组介绍以下:
操做组 |
授予存储桶 |
授予前缀 |
授予对象 |
---|---|---|---|
READ |
列出和读取存储桶中的对象 |
列出和读取目录下的对象 |
读取对象 |
WRITE |
建立、覆盖和删除存储桶中的任意对象 |
建立、覆盖和删除目录下的任意对象 |
不支持 |
READ_ACP |
读取存储桶的 ACL |
读取目录下的 ACL |
读取对象的 ACL |
WRITE_ACP |
修改存储桶的 ACL |
修改目录下的 ACL |
修改对象的 ACL |
FULL_CONTROL |
对存储桶和对象的任何操做 |
对目录下的对象作任何操做 |
对对象执行任何操做 |
另外 ACL 的管理权限还有如下限制:
仅支持对腾讯云的帐户赋予权限
仅支持读对象、写对象、读 ACL、写 ACL 和所有权限等五个操做组
不支持赋予生效条件
不支持显式拒绝效力
因此经过 ACL,咱们能够方便的授予其余用户访问存储桶或对象的权限,好比:
与其余主帐号的数据共享
示例:容许另外一个主帐号对某个存储桶的读取权限:
user-read-acl
授予子帐号访问的权限,作到权限的下放
示例:授予一个子帐号对某个存储桶的数据读写权限:
subuser-read-write-acl
相比简单的 COS 访问权限配置,COS 还支持配置较为复杂的 Bucket 粒度的 Policy 权限。
Bucket Policy 权限使用 JSON 语言描述,支持向匿名身份或腾讯云任何 CAM 帐户授予对存储桶、存储桶操做、对象或对象操做的权限。Bucket Policy 权限能够用于管理该存储桶内的几乎全部操做,推荐你使用存储桶策略来管理经过 ACL 没法表述的访问策略。
Bucket Policy 权限的配置界面以下:
bucket-policy
效力:容许/禁止
用户:单击添加用户,用户类型包括:全部用户/根帐号/子帐号/云服务
资源:根据须要选择,默认为整个存储桶,也可指定资源
资源路径:仅指定资源时须要填写,根据须要填写,仅支持使用*作前缀匹配
操做:单击添加操做,选择全部操做,如仅需受权部分操做,也能够选择一个或多个实际须要的操做
条件:根据须要填写,如不须要可留空。当前条件名支持:IP 和 VPC ID
注意:上述用户配置中的全部用户,通常是针对匿名用户的意思。
配置容许全部用户访问,则匿名的请求会被容许访问
配置拒绝全部用户访问,则匿名的请求会被拒绝,携带签名的请求会以基于身份的策略进行鉴权
访问管理(Cloud Access Management,CAM)是腾讯云提供的一套 Web 服务,用于帮助客户安全地管理腾讯云帐户的访问权限,资源管理和使用权限。经过 CAM,你能够建立、管理和销毁用户(组),并经过身份管理和策略管理控制哪些人可使用哪些腾讯云资源。
COS 做为腾讯云的一种资源,能够经过 CAM 策略来管理用户、用户组对 COS 资源的访问权限,使得不一样团队或人员可以相互协做。
首先,咱们须要先了解几个关键概念:主帐号、子帐号和用户组。
主帐号:
用户申请腾讯云帐号时,系统会建立一个用于登陆腾讯云服务的主帐号身份
主帐号默认拥有其名下所拥有的资源的彻底访问权限
子帐号:
子帐号是由主帐号建立的实体,有肯定的身份 ID 和身份凭证,拥有登陆腾讯云控制台的权限
子帐号默认不拥有资源,必须由所属主帐号进行受权
用户组:
多个相同职能的用户(子帐号)的集合
能够根据业务需求建立不一样的用户组,为用户组关联适当的策略,以分配不一样权限
赋予子帐号或用户组访问 COS 资源的权限,能够经过下面两种方式:
1)COS 预设策略
COS 提供了不少种 COS 资源的预设策略,能够知足你大部分的需求,这些预设策略仅仅是从 COS 的操做权限的粒度来作区分,好比:QcloudCOSFullAccess、QcloudCOSDataFullControl、QcloudCOSListOnly 等。
2)自定义策略
顾名思义,自定义策略就是你来根据策略语法,制定本身的规则,这个的灵活性很大,功能性也最丰富。在实践中,客户针对不一样 Bucket,或不一样前缀的访问控制,均可以经过自定义策略来实现。
因此基于 CAM,咱们能够完成更复杂的权限管理,结合用户组、子帐号、COS 预设策略和自定义策略,能够更灵活、更精细的来管理用户访问的 COS 权限,这也是咱们推荐客户使用的!
角色(Role)是腾讯云访问管理(Cloud Access Management,CAM)提供的拥有一组权限的虚拟身份,主要用于对角色载体授予腾讯云中服务、操做和资源的访问权限,这些权限附加到角色后,经过将角色赋予腾讯云的服务,容许服务代替用户完成对受权资源的操做。
目前腾讯云支持的角色载体类型为:
腾讯云帐号
支持角色的腾讯云服务
从上面的描述能够看出,角色主要是用在如下两种场景:
1)受权资源访问权限给其余腾讯云主帐号,而又不指望把永久访问密钥直接给对方,能够配置角色的载体为腾讯云主帐号,绑定相关权限策略。好比你指望把 COS 全部 Buckets 的只读权限受权给另外一个腾讯云主帐号:100000xxxx,则能够经过建立下面的角色来实现:
角色载体:腾讯云主帐号100000xxxx
角色策略:仅仅指定 QcloudCOSDataReadOnly
2)受权其余腾讯云服务访问指定资源的权限。好比你指望经过云函数(SCF)来对 COS Bucket 上传对象作进一步处理,就须要 SCF 有建立 COS 触发器,拉取代码包等的权限,这时候你就能够经过建立下面的角色来实现:
角色载体:腾讯云的 SCF 服务
角色策略:包含建立 COS 触发器,拉取代码包等的权限
权限策略判断规则
上文中咱们提到,COS 的相关权限有不少种:访问权限、Policy 权限、CAM 策略等,那用户的访问请求发到 COS 端,是按照什么规则来检查权限的呢?
首先介绍下要对访问用户分为两类:
匿名用户:不带签名的访问
认证用户:携带签名的用户,解析出对应的帐号信息
而认证用户的访问策略又分以下两类:
用户组策略
用户策略
另外,COS 自身的访问策略也分为两类:
存储桶和对象的 ACL
存储桶的 Policy
基于上面用户、访问策略和 COS 自身策略的分类,从流程上来看,COS 端收到用户请求后的权限判断以下:
访问策略评估流程
另外,在访问权限的判断中,有下面的几项原则,也须要咱们注意:
主帐号默认有帐号下全部 bucket 的访问权限;
默认全部匿名用户访问都被拒绝;
显式拒绝的优先级最大;
生效权限范围为基于身份策略和基于资源策略的并集。
最佳实践
从上文的介绍来看,COS 的权限管理这块仍是很是复杂的。而不少管理员为了方便,相信会有直接配置 COSFullAccess 策略的冲动 -_-||,这个还请慎重,它会给你带来很大的安全隐患!
下面从管理的便捷性和数据的安全性出发,咱们推荐一些 COS 权限的最佳实践原则。
如以前描述,CAM 支持子帐号和分组,那在实际使用中,为了管理的方便,咱们能够根据组织规则来建立出对应的用户组和子帐号,而后再作权限分配。
这里的原则是:
先建立用户组,并关联适当的 COS 权限
再建立子用户,把子用户添加到用户组里
好比咱们指望某员工有对 COS 全部资源的读写权限,则能够操做以下:
1) 建立用户组:cos-buckets-read-write-group1,而后给其关联上 COS 资源的 read 和 write 权限:QcloudCOSDataReadOnly 和 QcloudCOSDataWriteOnly;
2) 建立子用户:cos-subuser1,并把它添加到用户组 cos-buckets-read-write-group1;
3) 把子用户的 SecretId 和 SecretKey 授予具体使用的员工。
最小权限原则是 COS 权限安全的最重要策略,就是针对用户的需求,授予他最小访问资源的访问权限。
把握最小权限原则,能够从下面几个方面考虑:
指定用户:针对每一个子用户授予权限
指定 bucket:不要随便赋予全部 bucket 的访问权限
指定 bucket 里 objects 的前缀:能明确只有固定资源,就经过前缀规则限制
指定操做:明确对 bucket/object 的操做集合,好比:GetBucket、HeadBucket、GetObject 等
指定条件:明确策略生效的约束条件,好比 IP 地址、VPCID 等
客户端使用 COS 时,经过固定密钥计算签名方式不能有效地控制权限,同时把永久密钥放到客户端代码中有极大的泄露风险。如若经过临时密钥方式,则能够方便、有效地解决权限控制问题。
例如,在客户端申请临时密钥过程当中,能够经过设置权限策略 policy 字段,限制操做和资源范围,将权限限制在指定的范围内。
使用临时密钥访问 COS 资源的总体架构图以下:
cos 接入 cam 框架图
上述架构图中各个组件的功能以下:
一、用户客户端:用户服务的客户端;
向用户服务器发送申请临时密钥请求
根据获取的临时密钥,携带签名访问 COS 对象存储
二、用户服务端:提供临时密钥服务;
配置永久密钥,向 CAM 权限系统申请临时密钥
向客户端提供临时密钥 API
三、CAM 权限系统:腾讯云的 CAM 服务;
响应用户服务端的临时密钥请求
与 COS 对象存储同步临时密钥
四、COS 对象存储
支持临时密钥签名的访问
分析 COS 权限的脚本
如上文描述,COS 相关的权限,咱们能够从 COS 和 CAM 的控制台上来分别获取。
基于最佳实践原则,咱们推荐 COS Bucket 配置为私有读写,这也就要求访问 COS 须要是 CAM 的主帐号、子帐号或角色等。而 CAM 和 COS 都提供了 API 来获取到权限相关的信息,基于这些 API 的返回结果,咱们能够从 CAM USER 和 CAM ROLE 的维度来分析帐号下全部 COS Bucket 的权限配置。
从 Bucket 的维度分析用户权限,请到 COS 控制台,选取 bucket 后,到权限管理页面查看
CAM 和 COS 都提供了不少语言的 SDK 支持,这里选择 Python 语言的 SDK,调用 CAM 和 COS 的 API,来分析一个帐户下全部 COS Bucket 的权限配置信息。
脚本下载连接:https://github.com/ictfox/tools/blob/master/cos-auth-analyse.py
参考 API 和 Python SDK 的连接以下:
COS
API:https://cloud.tencent.com/document/product/436/12269
Python SDK:https://github.com/tencentyun/cos-python-sdk-v5
CAM:
API:https://cloud.tencent.com/document/api/598/43337
Python SDK:https://github.com/TencentCloud/tencentcloud-sdk-python
# vim cos-auth-analyse.py ... # Config with your own secretid/secretkey secret_id = 'your secret id' secret_key = 'your secret key' ...
配置有 CAM 相关权限和 COS 全部 Buckets 访问权限的 CAM 子帐号的 SecretId 和 SecretKey。
比较方便的权限为:QcloudCamFullAccess 和 QcloudCOSFullAccess,或仅仅用主帐号运行
# python cos-auth-analyse.py Initialize user related cos buckets and cam group info, waiting... Response Error Msg Is INVALID ============ Input: user-name/uin/bucket-name? or r(camrole)? or a(all)? or q(quit)? a ...
Response Error Msg Is INVALID - 错误信息输出多是由于 cos bucket 没有配置 policy,能够忽略
在提示输出栏输入:a,便可获取到全部 CAM USER 的分析输出。
分析单个 user,输入:user-name 或 uin 便可。
该脚本主要从 CAM USER 和 CAM ROLE 两个维度输出其相关 COS Bucket 的权限,下面分别介绍以下:
CAM USER 输出
输出示例以下:
CamUser: { "ConsoleLogin" : 0, "CosPolicy" : [ { "PolicyName" : "QcloudCOSDataWriteOnly", "PolicyType" : "", "Remark" : "对象存储(COS)数据只写的访问权限(不含删除)" }, ... ], "Name" : "cosnew", "Remark" : "", "Uid" : xxxxx, "Uin" : xxxxxxxxx } COS Buckets: [ { "Bucket" : "picture-123456789", "acl" : [], "policy" : [ { "Action" : [ "name/cos:GetBucketACL", "name/cos:GetObjectACL" ], "Effect" : "Allow", "Principal" : { "qcs" : [ "qcs::cam::uin/10000067xxxx:uin/1000107xxxx" ] }, "Resource" : [ "qcs::cos:na-ashburn:uid/123456789:picture-123456789/*" ], "Sid" : "costs-158684633500000xxxxx-11615-2" } ] } ] COS Related CamGroup: [ { "Name" : "cos", "Policy" : [ { "PolicyName" : "QcloudCOSFullAccess", "PolicyType" : "QCS", "Remark" : "对象存储(COS)全读写访问权限" } ] } ]
基于 CAM USER 的输出,与 COS 权限相关的有以下三个:
CamUser 里的 CosPolicy:直接绑定在 CamUser 上与 COS 相关的 policies,能够从 PolicyName 中获取大概的 COS 权限信息,详细的请到 CAM 的策略管理里查询;
COS Buckets:该 CamUser 有访问权限的 COS Buckets,里面的 Policy 里是详细的权限信息;
COS Related CamGroup:该 CamUser 关联到的有 COS 访问权限的 CamGroup,能够从 Policy 里的 PolicyName 中获取到大概的 COS 权限信息,详细的请到 CAM 的策略管理里查询;
CAM ROLE 输出
输出示例以下:
CamRole: { "ID" : "xxxxxxxxx", "Name" : "test-cos-role", "Type" : "user", "description" : "", "policy" : [ { "Description" : "对象存储(COS)数据读、写、删除、列出的访问权限", "PolicyId" : 52xxxxxxx, "PolicyName" : "QcloudCOSDataFullControl", "PolicyType" : "QCS" } ], "policy document" : [ { "action" : "name/sts:AssumeRole", "effect" : "allow", "principal" : { "qcs" : [ "qcs::cam::uin/100000xxxxxx:root" ] } } ] }
基于 CAM ROLE 的输出,咱们主要关注如下两个方面:
policy:与 COS 相关的 policies,能够从 Description 上获取大概信息,详细的请经过 PolicyId 调用相关 API 查询
policy document:角色绑定的载体信息,能够看出角色受权给了哪一个腾讯云主帐号或腾讯云服务
本文系做者受权发表,未经许可,不得转载。
若有侵权,请联系小编删除,谢谢。
点击阅读原文,领取 COS 限时1元礼包!