惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
MyScale Blog
MyScale Blog
U
Unit 42
M
MIT News - Artificial intelligence
小众软件
小众软件
P
Proofpoint News Feed
雷峰网
雷峰网
L
LangChain Blog
S
SegmentFault 最新的问题
腾讯CDC
F
Fortinet All Blogs
A
About on SuperTechFans
WordPress大学
WordPress大学
Vercel News
Vercel News
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
G
Google Developers Blog
大猫的无限游戏
大猫的无限游戏
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
D
Docker
N
Netflix TechBlog - Medium
Apple Machine Learning Research
Apple Machine Learning Research
Recent Announcements
Recent Announcements
D
DataBreaches.Net
Stack Overflow Blog
Stack Overflow Blog

少数派

派早报:Google 发布 Fitbit Air 等 - 少数派 「新人报到」確認需求,再開始 - 少数派 从 SOLO 独立开发者社区,我看到了越来越多开发者开始做自己的产品 - 少数派 我怎么管理那些"不常做,但总会忘"的生活事项 - 少数派 人形机器人量产元年,数据才是具身智能的“生死线” - 少数派 BuhoLaunchpad 高度还原 Mac 启动台:开发历程与思考 - 少数派 五年陪伴依然不舍,DIY 换壳后让罗技 MX Master 3 继续服役 - 少数派 新玩意 240|少数派的编辑们最近买了啥? - 少数派 一日一技|为什么你应该关闭 iOS 的键盘声音 - 少数派 我做了个插件和 Skills,一键提取任何网站的设计规范 Design.md - 少数派 住在三四线城市的你,该开始录播客了 - 少数派 甘南秘境,大白高国 - 少数派 AI的审美:谁让把我变成川内倫子 - 少数派 返工怎能不烦恼,打工人片单总有一部是你的「嘴替」 - 少数派 为了让「上厕所」更健康,我做了一个小工具 - 少数派 AI + Skill,能够让生成的文章去除 AI 味吗? - 少数派 新玩意|韶音OpenDots ONE 耳夹式耳机 - 少数派 《美满》| 在每一个春天的晚上相爱(362) - 少数派 新玩意|优篮子 PS01 MagSnap 磁吸支架 - 少数派 自我整合手记 | 我开始早睡了:用稳定规则,为自由托底 - 少数派 用龙虾(OpenClaw)两个多月,我最深的12个体会 - 少数派 听歌时间到,12 张你可能错过的 2025 华语乐坛好专辑 - 少数派 承诺能追吗 - 少数派 macOS 26启动台没了? 我做了个不一样的App启动器 - Keboard - 少数派 《四海为家的人》| INTJ对话INTJ(361) - 少数派 你发过的那些黑历史,是时候一次清干净了 - 少数派 新玩意:安安静静玩,越玩越专注:计客密码机 - 少数派 iPad 用户首次体验 Android 平板:vivo Pad6 Pro - 少数派 数据逻辑强 - 少数派 极北行+ | 一路向北,探访日本至北之地 | 001 - 少数派
使用访问管理 CAM 增强腾讯云账号安全性 - 少数派
2019-12-29 · via 少数派

对于公有云平台的用户来说,账号意味着现金(余额)、业务和数据(产品实例),是可以访问、配置所有云服务的「金钥匙」。一旦云平台账号泄漏,企业或开发者就会面临巨大的资产安全、业务安全和数据安全风险。为了保护账户安全,我们就需要尽可能缩小所使用的账号权限、减少主账号使用场景。对于腾讯云用户来说,访问管理 CAM 就能满足我们的这一需求。

在访问管理 CAM 中,最重要的概念就是「策略」。策略是一系列具体权限的集合,一般是云产品自动生成的,也可以由用户创建。策略可以只包含某个特定产品的特定部分,比如 QcloudCOSGetServiceAccess 代表对象存储 COS 中获取存储桶列表的权限;可以包含整个产品,比如 QcloudCDBFullAccess 就表示使用云数据库 CDB 所需要的完整权限;还可以覆盖整个账号,比如 QCloudResourceFullAccess 就是所有云资源的「通行证」,AdministratorAccess 则是几乎等同于主账户权限的最高权限策略。关于自定义策略的规则,详见 文档

还有一个重要的概念是「授权粒度」。云产品预设的权限策略都是以 API 或服务为单位的,因此对于「服务级」(某个云产品的访问权限)和「操作级」(某个或某类 API 的使用权限)授权,均可以通过预设策略进行配置。但大部分云产品还支持以某个资源(COS 存储桶、CVM 主机等)为粒度的「资源级」授权。这类权限中有一部分可以在对应产品的控制台进行设置,其余都需要通过自行创建自定义策略来实现。关于不同云产品的授权粒度,详见 文档

我们还可以先为「用户组」配置策略,再将用户添加到用户组。这样一来,组内用户就可以拥有组策略所赋予的权限。对用户组权限进行的调整也会直接应用到组内的所有用户。

与其他云产品使用不同的是,在 CAM 中,很多敏感操作都需要进行手机号验证,比如创建新的子用户、查看 SecretKey 等。

此外,CAM 的实际使用中有三种「用户身份」:子用户、消息接收人、协作者,另有「角色」的概念。接下来我们来了解这四个概念。

子用户:主账户的下属

「子用户」是主账号的「附庸」,与主账号属于从属关系。创建子用户需要赋予唯一的、不可修改的用户名;子用户可以通过控制台(含小程序,下同)登陆或者通过 API 访问。根据腾讯云规定,子用户需要验证手机号,但目前子用户登录后的手机号验证步骤仍然可以跳过。这两种访问方式可以通过 CAM 随时开启或停用。主账户可以通过配置权限策略来为其授权。

在腾讯云中,主账号可以通过「联合账号」功能绑定企业微信,这样就可以直接把企业微信的成员添加为子用户。除此之外,也可以通过「用户创建」页面使用微信邀请,或者点击「自定义创建」后再选择「可访问资源并接收消息」,就可以进入创建界面。

以子用户身份登录需要主账户 ID,大体上有两种方式,其中最快速的方式是通过访问对应的登录地址:

  • 对于通过企业微信添加的子用户,登陆页面地址为:https://cloud.tencent.com/login/subAccount/<主账户ID>?type=wechatCorp
  • 对其他子用户来说,登陆页面地址为:https://cloud.tencent.com/login/subAccount/<主账户ID>?type=subAccount

当然,省略 ?type= 参数(和主账户 ID)也可以进入子用户登陆页面,只是需要手动选择账户类型(并输入主账户 ID)。

另一种方式则是通过主登录入口 https://cloud.tencent.com/login,选择页面下方的「子用户登录」进入登陆页面。

更多关于子用户的信息详见 文档

消息接收人

「消息接收人」是一类特别的子用户:它不具备任何访问云产品的权限,也不需要配置策略,只能通过短信、邮件、微信等渠道接收云产品的状态消息。在「用户创建」界面点击「自定义创建」后再选择「仅用于接收消息」,在下一步中输入其手机、邮箱等信息,就可以完成创建。这类用户和增强账号安全性关系不大。

更多关于消息接收人的信息详见 文档

协作者:独立的合作伙伴

「协作者」的权限体系与子用户几乎没有分别,但「协作者」不再是主账户的附属,登陆方式也有所不同。协作者必须是已有的腾讯云账户,只需知道 ID 即可添加。

登陆腾讯云账户时,如果已经被其他账户添加为协作者,就会进入用户身份选择界面。通过用户选择界面,就可以自由选择登陆到主账户还是协作者账户。通过控制台菜单中的「切换用户身份」,也可以在协作者和/或主账户间随时切换,而不需要重新登录。「腾讯云助手」小程序也有类似的机制。

更多关于协作者的信息详见 文档

角色:用户的「分身」

「角色」是腾讯云 CAM 中的特殊概念。角色也具有权限配置,不过必须通过「承载者」使用。角色的管理是通过「角色」页面进行的。

「服务角色」的承载者是腾讯云产品本身,即通过这一产品(通常是自动地)进行的某些操作会以已经配置的角色为身份进行。

「用户角色」的承载者就是(子)用户(含协作者),是指允许用户通过 API 申请使用其具有的角色进行某些操作。一般来说,一些临时权限更适合使用「角色」来提供,以免频繁调整子账户或协作者的权限。用户身份也可以用于创建临时密钥对供他人操作。

角色还可以通过「身份提供商」授权给非腾讯云平台的用户,这一部分详见 文档

访问密钥

「访问密钥」是腾讯云 API 鉴权的基础。密钥对是通过 API 使用云产品的身份凭证,拥有等同于所属用户的完整权限。因此,主账户访问密钥泄漏的影响丝毫不亚于账号密码泄漏(实际上,最容易泄漏的就是密钥对)。

腾讯云访问密钥对由 SecretID 和 SecretKey 组成,上限为 2 对。想要查看本账户的访问密钥,首先需要确保该账户拥有相关权限,然后在 CAM 控制台的「访问密钥」板块查看。操作或查看 SecretKey 则需要经过手机号验证。

拥有相关 CAM 权限的账号还可以操作子用户的访问密钥。只需要通过「用户管理」页面进入用户详情页,在「API 密钥」板块即可查询。

为降低访问密钥泄漏风险,建议按照一定频次更新密钥对。为了便于更新、避免遗漏,建议将密钥对在单独文件中保存为常量,或者保存为环境变量。更新密钥对的基本流程是:

  1. 创建一对新的访问密钥;
  2. 将代码中的访问密钥逐渐替换成新密钥;
  3. 全部替换完毕后,禁用旧密钥;
  4. 观察是否有访问异常,确保所有密钥都被更新;
  5. 删除旧密钥。

实战一:网站后台上传到 COS

我们现在需要在某个网站的后台使用 API 将文件上传到腾讯云 COS 存储桶中的 upload 目录。如果使用了主账户,则一旦源码发生泄漏,整个账号下的资源都会受到牵连。因此,我们应当创建一个子用户(也可以选择「协作者」,配置方式几乎一致),专用于这一场景。

我们首先创建一个子用户 web-upload,在「访问方式」中勾选「编程访问」。因为只需要特定存储桶的权限,我们无需进行 CAM 策略配置,只需要在 COS 访问管理中进行授权。我们需要记录这一子账号的 ID,并且获取其访问密钥填入网站后台。

接下来,我们进入 COS 控制台,并定位到需要上传的存储桶的详情页面。在「Policy 权限设置」一栏点击「添加策略」,添加子用户,并且在「资源路径」中填入 upload/** 是路径通配符),操作中添加「写操作」。如果了解上传所用的接口类型,也可以只添加特定接口以最小化权限。如果该网站服务器有固定 IP,可以将 IP 添加到「条件」中,来阻止从其他服务器访问;如果是腾讯云主机,也可以将 VPC ID 添加到条件。

实战二:为其他主账户授权 COS 部分权限

假设现在,我们需要将上一节中的网站的文件上传部分外包。外包商依旧不能读取存储桶的上传数据和其他数据,但是他们设计了日志系统用于检查策略。日志存放在 log 目录下,外包商拥有完整权限;此外,他们也希望可以通过控制台访问资源。

首先,我们需要从外包商处索要其主账户 ID。在 COS 控制台的「Policy 权限设置」部分,我们需要新建两个策略:路径为 upload/*,授权「写操作」;路径为 log/*,授权「全部操作」。对于绑定的用户,我们选择类型为「根用户」,填入对方的主账户 ID。然后,我们需要将自己的主账户 ID、对应存储桶的 ID(形式为 <存储桶名称>-<APPID>)和地域提供给外包商。

接下来切换到外包商视角,假设需要把这一权限交由某个子账户进行访问,就需要先创建一个自定义策略,姑且命名为 OutsourceCOSFullAccess,策略描述如下:

{
  "version": "2.0",
  "statement": [
    {
      "action": "cos:*",
      "effect": "allow",
      "resource": "qcs::cos::uid/<客户的主账户ID>:<存储桶ID>/*"
    }
  ]
}

然后将其绑定到子账户即可。现在我们已经可以通过 API 访问这一存储桶了。

不论是对于子账户还是主账户,我们都需要相关配置才能在控制台正确访问这两个目录。进入 COS 控制台的「访问路径列表」页面,根据存储桶 ID 和地域添加两条访问路径。其中,访问路径应该分别为 <存储桶ID>/upload/<存储桶ID>/log/。之后,我们就可以通过「访问路径列表」页面直达所需要管理的两个目录。

实战三:定制财务账户

假设一个公司的所有云服务资产都由专门的财务负责,现在需要为它创建一个专门的账户。

我们首先新建一个子账户 finance。在 CAM 授权配置中,通过赋予 QcloudFinanceFullAccess 策略来赋予财务权限。这样一来,这个账户就具备了续费与支付订单的权限。

现有一个负责管理云数据库资源的子用户,已经被配置 QcloudCDBFullAccess 策略。它可以创建新的实例订单,但不能为这一订单付款,所有的预付费订单都需要由 finance 账户管理支付。其余云产品的购买流程也是类似的。

实战四:为 Serverless 开发配置组

Serverless 主要是由 PaaS 服务中的 BaaS 与 FaaS 两类服务组成,用于取代传统的后端架构。假设现在某个企业采用云数据库 CDB 与缓存服务 Redis 用于持久化数据并缓存查询,并且使用云函数 SCF 与 API 网关提供服务。该企业开辟了一个 VPC 专门用于 Serverless 开发。现在我们为组内每个成员赋予同等的完整权限。

新建一个自定义策略,用于赋予该 VPC 及其中的 CDB 与 Redis 权限,命名为 ServerlessVPCFullAccess,策略描述如下:

{
  "version": "2.0",
  "statement": [
    {
      "action": "name/vpc:*",
      "resource": "*",
      "effect": "allow",
      "condition": {
        "string_equal_if_exist": {
          "vpc:vpc": [
             "<VPC ID>"
           ],
           "vpc:accepter_vpc": [
              "<VPC ID>"
            ],
            "vpc:requester_vpc": [
               "<VPC ID>"
            ]
          }
        }
      },
      {
        "action": [
          "cdb:*",
          "redis:*"
        ],
        "resource": "qcs::vpc:<服务地域>:uin/<主账户ID>:vpc/<VPC ID>",
        "effect": "allow"
      }
    }
  ]
}

新建一个自定义策略,用于赋予 API 网关的权限,命名为 ServerlessApiGwFullAccess,策略描述如下:

{
  "version": "2.0",
  "statement": [
    {
      "action": "name/apigw:*",
      "resource": "qcs::apigw:<服务地域>:uin/<主账户ID>:service/<API服务ID>",
      "effect": "allow"
    }
  ]
}

新建一个用户组,绑定 ServerlessVPCFullAccessServerlessApiGwFullAccessQcloudSCFFullAccess 这三个策略。随后,创建 Serverless 开发成员的子账号,并且将其添加到这一用户组,即可使其获得对应的权限。

在云函数配置页面中,打开「内网访问」,并且绑定到 VPC,即可在云函数内访问相关资源。开发人员在开发阶段可以使用自己的 API 密钥进行调试。

写在最后

使用访问管理 CAM 进行权限细分可以降低账号密码或访问密钥泄漏带来的风险,也能一定程度上避免不符合业务逻辑的误操作。然而,对于一部分恶意的内部行为(比如删库、盗窃代码等等),仅仅靠权限体系是难以满足的。管理人员在合理分配开发权限的同时,也需要加强管理,来防止恶意破坏的发生。

本教程主要针对腾讯云平台,其他平台如有类似的机制,可以如法炮制。腾讯云访问管理 CAM 的完整文档请戳 此处