对象存储 COS 的权限管理分析

做者介绍:
javascript

杨冠军:腾讯云 COS 首席解决方案架构师,现负责腾讯云对象存储 COS 华东区域客户的解决方案架构工做。java

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

在数字化时代,数据逐渐成为了公司的核心资产,存储到对象存储 COS 上的数据安全性也愈来愈受到了重视,COS 自己提供了一系列高安全性的防御,包括:数据加密、链路加密、权限控制、版本控制、跨地域复制等等。
git

结合最近互联网上出现的安全事故,咱们发现 COS 的权限控制和管理是用户最容易形成疏漏的地方,本文将从 COS 的权限介绍和最佳实践等方面来对 COS 的权限管理作深刻分析,但愿对你理解 COS 的权限控制和有效管理 COS 的权限有所帮助。github

COS 相关权限vim

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

一、访问权限

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

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

二、Policy 权限

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

Bucket Policy 权限使用 JSON 语言描述,支持向匿名身份或腾讯云任何 CAM 帐户授予对存储桶、存储桶操做、对象或对象操做的权限。Bucket Policy 权限能够用于管理该存储桶内的几乎全部操做,推荐你使用存储桶策略来管理经过 ACL 没法表述的访问策略。

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

bucket-policy

  • 效力:容许/禁止

  • 用户:单击添加用户,用户类型包括:全部用户/根帐号/子帐号/云服务

  • 资源:根据须要选择,默认为整个存储桶,也可指定资源

  • 资源路径:仅指定资源时须要填写,根据须要填写,仅支持使用*作前缀匹配

  • 操做:单击添加操做,选择全部操做,如仅需受权部分操做,也能够选择一个或多个实际须要的操做

  • 条件:根据须要填写,如不须要可留空。当前条件名支持:IP 和 VPC ID

注意:上述用户配置中的全部用户,通常是针对匿名用户的意思。

  • 配置容许全部用户访问,则匿名的请求会被容许访问

  • 配置拒绝全部用户访问,则匿名的请求会被拒绝,携带签名的请求会以基于身份的策略进行鉴权

三、CAM 策略

访问管理(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 端,是按照什么规则来检查权限的呢?

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

  1. 匿名用户:不带签名的访问

  2. 认证用户:携带签名的用户,解析出对应的帐号信息

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

  1. 用户组策略

  2. 用户策略

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

  1. 存储桶和对象的 ACL

  2. 存储桶的 Policy

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

访问策略评估流程

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

  1. 主帐号默认有帐号下全部 bucket 的访问权限;

  2. 默认全部匿名用户访问都被拒绝;

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

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

最佳实践

从上文的介绍来看,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 USERCAM 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

二、脚本使用说明

1)配置脚本

# 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,或仅仅用主帐号运行

2)运行脚本

# 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 便可。

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 权限相关的有以下三个:

  1. CamUser 里的 CosPolicy:直接绑定在 CamUser 上与 COS 相关的 policies,能够从 PolicyName 中获取大概的 COS 权限信息,详细的请到 CAM 的策略管理里查询;

  2. COS Buckets:该 CamUser 有访问权限的 COS Buckets,里面的 Policy 里是详细的权限信息;

  3. 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 的输出,咱们主要关注如下两个方面:

  1. policy:与 COS 相关的 policies,能够从 Description 上获取大概信息,详细的请经过 PolicyId 调用相关 API 查询

  2. policy document:角色绑定的载体信息,能够看出角色受权给了哪一个腾讯云主帐号或腾讯云服务

本文系做者受权发表,未经许可,不得转载。

若有侵权,请联系小编删除,谢谢。

 点击阅读原文,领取 COS 限时1元礼包!