【玩转腾讯云】对象存储COS的权限管理分析

一、需求概述

随着互联网和公有云的发展,越来越多的企业把数据放到公有云上,COS(Cloud Object Storage)作为腾讯云的对象存储产品,提供了高容量、高可靠、低成本的存储解决方案,也使得客户把越来越多的业务数据放到了COS上。

在数字化时代,数据逐渐成为了公司的核心资产,存储到对象存储COS上的数据安全性也越来越受到了重视,COS本身提供了一系列高安全性的防护,包括:数据加密、链路加密、权限控制、版本控制、跨地域复制等等,详细请参考:https://cloud.tencent.com/document/product/436

结合最近互联网上出现的安全事故,我们发现COS的权限控制和管理是用户最容易造成疏漏的地方,本章将从COS的权限介绍和最佳实践等方面来对COS的权限管理做深入分析,希望对你理解COS的权限控制和有效管理COS的权限有所帮助。

二、COS相关权限

首先我们先从逻辑上介绍下COS权限的分类,并对每一分类详细分析。

1、访问权限

分为公共权限和用户权限两类:

1)公共权限

公共权限是COS最基本的权限配置,它包括:继承权限、私有读写、公有读私有写和公有读写。它支持的配置对象和说明如下:

权限类型

配置项

说明

继承权限

虚拟目录、Object

存储桶里对象权限的默认值,继承存储桶的权限

私有读写

Bucket、虚拟目录、Object

仅主账号可写可读,非主账号用户(子账号、其他用户的主账号或者匿名用户)不可访问

公有读私有写

Bucket、虚拟目录、Object

主账号可写可读,非主账号用户(子账号、其他用户的主账号或者匿名用户)可以读取,但是不可写入新数据

公有读写

Bucket、虚拟目录

主账号和非主账号用户(子账号、其他用户的主账号或者匿名用户)均可写可读

这里着重对Bucket支持的公有权限做下说明:

  • 私有读写:默认创建Bucket的权限,这个是比较安全的权限配置,也是我们推荐的!
  • 公有读私有写:若你需要公开Bucket里的数据,可以这样配置,允许任何用户不携带签名来读取Bucket里的Object。
  • 公有读写:这个是最不安全的权限配置了,相当于你把修改数据的权限都暴露了,请谨慎配置!

COS里对存储桶的公共权限配置,在存储桶的权限管理页面,参考下图:

公共权限配置

2)用户权限

用户权限,这里指的是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

当然我们可以通过API来操作和管理这些ACL权限,相关API文档如下:

Get Bucket ACL:https://cloud.tencent.com/document/product/436/7733

Put Bucket ACL:https://cloud.tencent.com/document/product/436/7737

Get Object ACL:https://cloud.tencent.com/document/product/436/7744

Put Object ACL:https://cloud.tencent.com/document/product/436/7748

2、Policy权限

相比简单的COS访问权限配置,COS还支持配置较为复杂的Bucket粒度的Policy权限。

Bucket Policy权限使用 JSON 语言描述,支持向匿名身份或腾讯云任何CAM账户授予对存储桶、存储桶操作、对象或对象操作的权限。Bucket Policy权限可以用于管理该存储桶内的几乎所有操作,推荐你使用存储桶策略来管理通过 ACL 无法表述的访问策略。

Bucket Policy权限的配置界面如下:

bucket-policy
  • 效力:允许/禁止
  • 用户:单击添加用户,用户类型包括:所有用户/根账号/子账号/云服务
  • 资源:根据需要选择,默认为整个存储桶,也可指定资源
  • 资源路径:仅指定资源时需要填写,根据需要填写,仅支持使用*做前缀匹配
  • 操作:单击添加操作,选择所有操作,如仅需授权部分操作,也可以选择一个或多个实际需要的操作
  • 条件:根据需要填写,如不需要可留空。当前条件名支持:IP 和 VPC ID

注意:上述用户配置中的 所有用户,一般是针对匿名用户的意思。

  • 配置允许所有用户访问

则匿名的请求会被允许访问;

  • 配置拒绝所有用户访问

则匿名的请求会被拒绝,携带签名的请求会以基于身份的策略进行鉴权;

当然我们可以通过API来操作和管理Bucket Policy权限,相关API文档如下:

Get Bucket Policy:https://cloud.tencent.com/document/product/436/8276

Put Bucket Policy:https://cloud.tencent.com/document/product/436/8282

Delete Bucket Policy:https://cloud.tencent.com/document/product/436/8285

更多COS Bucket Policy配置请参考:

https://cloud.tencent.com/document/product/436/12514

3、CAM策略

访问管理(Cloud Access Management,CAM)是腾讯云提供的一套 Web 服务,用于帮助客户安全地管理腾讯云账户的访问权限,资源管理和使用权限。通过 CAM,你可以创建、管理和销毁用户(组),并通过身份管理和策略管理控制哪些人可以使用哪些腾讯云资源。

参考文档:https://cloud.tencent.com/document/product/598

COS作为腾讯云的一种资源,可以通过CAM策略来管理用户、用户组对COS资源的访问权限,使得不同团队或人员能够相互协作。

首先,我们需要先了解几个关键概念:主账号、子账号和用户组。

  • 主账号:
    • 用户申请腾讯云账号时,系统会创建一个用于登录腾讯云服务的主账号身份
    • 主账号默认拥有其名下所拥有的资源的完全访问权限
  • 子账号:
    • 子账号是由主账号创建的实体,有确定的身份 ID 和身份凭证,拥有登录腾讯云控制台的权限
    • 子账号默认不拥有资源,必须由所属主账号进行授权
  • 用户组:
    • 多个相同职能的用户(子账号)的集合
    • 可以根据业务需求创建不同的用户组,为用户组关联适当的策略,以分配不同权限

赋予子账号或用户组访问COS资源的权限,可以通过下面两种方式:

1)COS预设策略

COS提供了很多种COS资源的预设策略,可以满足你大部分的需求,这些预设策略仅仅是从COS的操作权限的粒度来做区分,比如:QcloudCOSFullAccess、QcloudCOSDataFullControl、QcloudCOSListOnly等。

可参考:https://cloud.tencent.com/document/product/598/10602

2)自定义策略

顾名思义,自定义策略就是你来根据策略语法,制定自己的规则,这个的灵活性很大,功能性也最丰富。在实践中,客户针对不同Bucket,或不同前缀的访问控制,都可以通过自定义策略来实现。

可参考:https://cloud.tencent.com/document/product/598/37739

所以基于CAM,我们可以完成更复杂的权限管理,结合用户组、子账号、COS预设策略和自定义策略,可以更灵活、更精细的来管理用户访问的COS权限,这也是我们推荐客户使用的!

CAM下配置COS相关案例请参考:

https://cloud.tencent.com/document/product/598/11068

4、角色策略

角色(Role) 是腾讯云访问管理(Cloud Access Management,CAM)提供的拥有一组权限的虚拟身份,主要用于对角色载体授予腾讯云中服务、操作和资源的访问权限,这些权限附加到角色后,通过将角色赋予腾讯云的服务,允许服务代替用户完成对授权资源的操作。

目前腾讯云支持的 角色载体 类型为:

  • 腾讯云账号
  • 支持角色的腾讯云服务

从上面的描述可以看出,角色主要是用在以下两种场景:

1)授权资源访问权限给其他腾讯云主账号,而又不期望把永久访问密钥直接给对方,可以配置角色的载体为腾讯云主账号,绑定相关权限策略;

比如你期望把COS所有Buckets的只读权限授权给另一个腾讯云主账号:100000xxxx,则可以通过创建下面的角色来实现:

  • 角色载体:腾讯云主账号100000xxxx;
  • 角色策略:仅仅指定QcloudCOSDataReadOnly;

2)授权其他腾讯云服务访问指定资源的权限;

比如你期望通过云函数(SCF)来对COS Bucket上传对象做进一步处理,就需要SCF有创建COS触发器,拉取代码包等的权限,这时候你就可以通过创建下面的角色来实现:

  • 角色载体:腾讯云的SCF服务;
  • 角色策略:包含创建COS触发器,拉取代码包等的权限;

三、权限策略判断规则

上面章节中我们提到,COS的相关权限有很多种:访问权限、Policy权限、CAM策略等,那用户的访问请求发到COS端,是按照什么规则来检查权限的呢?

首先介绍下要对访问用户分为两类:

  1. 匿名用户:不带签名的访问
  2. 认证用户:携带签名的用户,解析出对应的账号信息

而认证用户的访问策略又分如下两类:

  1. 用户组策略
  2. 用户策略

另外,COS自身的访问策略也分为两类:

  1. 存储桶和对象的ACL
  2. 存储桶的Policy

基于上面用户、访问策略和COS自身策略的分类,从流程上来看,COS端收到用户请求后的权限判断如下:

访问策略评估流程

另外在访问权限的判断中,有下面的几项原则,也需要我们注意:

1、主账号默认有账号下所有bucket的访问权限;

2、默认所有匿名用户访问都被拒绝;

3、显式拒绝的优先级最大;

4、生效权限范围为基于身份策略和基于资源策略的并集;

权限策略详细流程请参考:https://cloud.tencent.com/document/product/436/41516

四、最佳实践

从以上章节的介绍来看,COS的权限管理这块还是非常复杂的。而很多管理员为了方便,相信会有直接配置COSFullAccess策略的冲动 -_-||,这个还请慎重,它会给你带来很大的安全隐患!

下面从管理的便捷性和数据的安全性出发,我们推荐一些COS权限的最佳实践原则。

1、子用户与分组策略

如之前描述,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授予具体使用的员工;

2、最小权限原则

最小权限原则是COS权限安全的最重要策略,就是针对用户的需求,授予他最小访问资源的访问权限。

把握最小权限原则,可以从下面几个方面考虑:

  • 指定用户:针对每个子用户授予权限
  • 指定bucket:不要随便赋予所有bucket的访问权限
  • 指定bucket里objects的前缀:能明确只有固定资源,就通过前缀规则限制
  • 指定操作:明确对bucket/object的操作集合,比如:GetBucket、HeadBucket、GetObject等
  • 指定条件:明确策略生效的约束条件,比如IP地址、VPCID等

详细的原则和示例,可参考:https://cloud.tencent.com/document/product/436/38618

3、使用临时密钥

客户端使用 COS 时,通过固定密钥计算签名方式不能有效地控制权限,同时把永久密钥放到客户端代码中有极大的泄露风险。如若通过临时密钥方式,则可以方便、有效地解决权限控制问题。

例如,在客户端申请临时密钥过程中,可以通过设置权限策略policy字段,限制操作和资源范围,将权限限制在指定的范围内。

使用临时密钥访问COS资源的整体架构图如下:

cos接入cam框架图

上述架构图中各个组件的功能如下:

1、用户客户端:用户服务的客户端;

  • 向用户服务器发送申请临时密钥请求
  • 根据获取的临时密钥,携带签名访问COS对象存储

2、用户服务端:提供临时密钥服务;

  • 配置永久密钥,向CAM权限系统申请临时密钥
  • 向客户端提供临时密钥API

3、CAM权限系统:腾讯云的CAM服务;

  • 响应用户服务端的临时密钥请求
  • 与COS对象存储同步临时密钥

4、COS对象存储

  • 支持临时密钥签名的访问

参考文档:https://cloud.tencent.com/document/product/436/14048

五、分析COS权限的脚本

如上面章节描述,COS 相关的权限,我们可以从 COS 和 CAM 的控制台上来分别获取。

基于最佳实践原则,我们推荐COS Bucket配置为私有读写,这也就要求访问 COS 需要是 CAM 的主账号、子账号或角色等。而 CAM 和 COS 都提供了APL来获取到权限相关的信息,基于这些API的返回结果,我们可以从CAM USERCAM ROLE的维度来分析账号下所有COS Bucket 的权限配置。

从Bucket的维度分析用户权限,请到COS控制台,选取bucket后,到权限管理页面查看

1、脚本概述

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

2、脚本使用说明

1)配置脚本

# vim cos-auth-analyse.py...# Config with your own secretid/secretkeysecret_id = 'your secret id'secret_key = 'your secret key'...

配置有 CAM 相关权限和 COS 所有 Buckets 访问权限的 CAM 子账号的secreteid和secretkey。

比较方便的权限为:QcloudCamFullAccess 和 QcloudCOSFullAccess,或仅仅用主账号运行

2)运行脚本

# python cos-auth-analyse.pyInitialize 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 即可。

3)输出分析

该脚本主要从CAM USERCAM 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查询;
  • pilicy document
角色绑定的载体信息,可以看出角色授权给了哪个腾讯云主账号 或 腾讯云服务;

注明:本文为星速云原创版权所有,禁止转载,一经发现将追究版权责任!

发表评论

登录后才能评论
问答社区 QQ客服
微信客服
微信客服
分享本页
返回顶部