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

访问管理 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 的完整文档请戳 此处


0
0