跳到主要内容

环境级访问权限控制

云开发 针对管理端SDK(例如:@cloudbase/node-sdk)调用提供 环境操作 级别的权限控制能力,允许按实际需要限定(密钥)仅能对指定环境进行某些操作。

即,可以为不同的访问密钥(SecretId/SecretKey),分配不同的权限,实现对资源访问权限的管控。

该能力基于 腾讯云统一的 访问管理 CAM ,所以需要对 CAM 相关能力具备一定了解。

该能力适用于管理端SDK通过显式指定访问密钥进行初始化的方式。如以下 @cloudbase/node-sdk 示例:

const app = tcb.init({
secretId: "your_secret_id",
secretKey: "your_secret_key"
});

注意:以下描述的权限策略应用于云开发管理端SDK,所以仅描述了如何分配管理端SDK中需要使用的权限。云开发控制台及云API相关的访问权限,需增加控制台访问的权限策略,一般将预定义策略授予相关用户即可。

操作步骤

  1. 创建策略:控制台 -> 访问管理 -> 策略 -> 创建策略 -> 按策略语法或标签创建策略 -> 空白模版 -> 填入策略配置 -> 提交
  2. 关联策略:将策略关联到账户/子账号/用户组/协作者
  3. 获取密钥:通过控制台或云API创建并获取密钥
  4. 使用密钥:通过访问密钥初始化管理端SDK访问和管理环境下的云资源

以上步骤主要用于通过腾讯云控制台创建策略并将策略关联到账户/子账号/用户组/协作者方式进行权限控制的方式。

创建策略

策略通过 策略语法 定义和描述一条或多条权限规则,策略内包含了 资源和操作 的权限控制,例如 对某TCB环境调用云函数的权限。

将策略关联到 账户/子账号/用户组/协作者 后,相关实体的访问密钥将具备相应的权限,更多相关内容请参考 权限与策略

云开发支持按 环境标签 两种方式进行权限控制,以下为按 策略语法 创建策略示例

策略中需要的 Resoures & Actions 请参考 Resoures & Actions

1. 按 Tag 进行权限控制的策略

通过该方式创建的策略,该策略将应用于具备某标签的一个或多个资源(环境),当标签进行调整时,相应的权限也将同步更新。

以下策略为:授予 具备 标签键Tag:env 等于 标签值Value:development 的资源的全部操作(tcb:*)权限。

注意:这里需要创建标签,再设置资源标签,TCB环境标签管理 在环境详情页-资源购买页-基本配置。创建标签请参考:https://console.cloud.tencent.com/tag/taglist

{
"version": "2.0",
"statement": [
{
"effect": "allow",
"action": [
"tcb:*"
],
"resource": "*",
"condition": {
"for_any_value:string_equal": {
"qcs:resource_tag": [
"env&development" // 标签键Tag:env=标签值Value:production
]
}
}
}
]
}

以下策略为:授予 具备 env=development 标签的资源的调用云函数(tcb:InvokeFunction)权限。

{
"version": "2.0",
"statement": [
{
"effect": "allow",
"action": [
"tcb:InvokeFunction"
],
"resource": "*",
"condition": {
"for_any_value:string_equal": {
"qcs:resource_tag": [
"env&development" // 标签键Tag:env=标签值Value:production
]
}
}
}
]
}

更多标签相关内容,请参考:

2. 按 EnvID 进行权限控制的策略

通过该方式创建的策略,该策略将应用于 resource 字段列表中的资源。

以下策略为:授予 resource 字段列表中的资源的全部操作(tcb:*)权限。

{
"version": "2.0",
"statement": [
{
"effect": "allow",
"action": [
"tcb:*"
],
"resource": [
"qcs::tcb:::env/${your-env-id}",
"qcs::tcb:${region}::env/${your-env-id}"
]
}
]
}

以下策略为:授予 resource 字段列表中的资源的调用云函数(tcb:InvokeFunction)权限。

{
"version": "2.0",
"statement": [
{
"effect": "allow",
"action": [
"tcb:InvokeFunction"
],
"resource": [
"qcs::tcb:::env/${your-env-id}",
"qcs::tcb:${region}::env/${your-env-id}"
]
}
]
}

获取密钥

创建好策略之后,即可将策略授权给 账户/子账号/用户组/协作者,其相关联的的访问密钥(SecretId/SecretKey)将会限定性的拥有策略中描述的资源(Resources)及相关操作(Actions)的权限。

可以通过以下 3 种方式获得 访问凭证

1. 控制台获取子账号/协作者访问凭证

可在 访问管理 -> 用户管理 -> 用户列表 -> 子用户详情页 -> API密钥 页面新建或获取永久访问凭证

该方式适用于为子账号分配相关资源的访问权限,密钥有效期长

参考文档:创建子账号并授权

该方式需要预先创建 策略 和 子账号/协作者,并将 策略 授予 子账号/协作者

2. 通过 sts:AssumeRole 扮演角色获取临时访问凭证

该方式通过腾讯云CAM云API接口创建临时访问凭证,需要先创建角色,并将相关的权限策略授予该角色,使该角色具备相关权限,继而通过该角色创建的访问凭证也具备相关权限。

参考文档:申请扮演角色

该方式需要预先创建 策略 和 角色

3. 通过 sts:GetFederationToken 获取联合身份临时访问凭证

该方式通过腾讯云CAM云API接口创建临时访问凭证,该方式不需要事先创建角色,但是需要每次调用接口创建访问凭证时,传入策略,继而分配具备相关权限的密钥。

参考文档:获取联合身份临时访问凭证

该方式不需要预先创建 策略 和 角色

使用密钥

以下 @cloudbase/node-sdk 示例:

const app = tcb.init({
secretId: 'your_secret_id',
secretKey: 'your_secret_key'
});

鉴权通过

鉴权通过将能够正常访问对应环境下的资源

鉴权失败 SIGN_PARAM_INVALID

以下为鉴权失败的示例,该错误信息描述了因为 无 tcb:InvokeFunction 操作权限而导致的鉴权失败,将包含 tcb:InvokeFunction 权限的策略授予 账户/子账号/用户组/协作者 后,重新获取访问密钥,即可通过鉴权。

{
"code": "SIGN_PARAM_INVALID",
"message": "you are not authorized to perform operation (tcb:InvokeFunction)"
}

Resoures & Actions

Resoure

用于描述资源,对应于 TCB 的环境

格式:qcs::tcb:${Region}::env/${EnvId},该字符串描述了环境资源。

示例如下:

[
"qcs::tcb:::env/${your-env-id}",
]

Action

用于描述操作,具备对某资源(Resoure)具备哪些操作

Action描述
tcb:InvokeFunction调用云函数
tcb:InsertDocument插入数据
tcb:DeleteDocument删除数据
tcb:UpdateDocument更新数据
tcb:QueryDocument查询数据
tcb:AggregateDocument聚合数据
tcb:RunTransaction运行事务。在事务中进行CURD等操作,需要分配对应操作的权限
tcb:ExplainQuery查询分析
tcb:GetFileAuthority获取文件权限信息
tcb:GetDownloadUrl获取文件下载地址
tcb:DeleteFile删除文件
tcb:UploadFile上传文件
tcb:QueryUserInfo获取用户信息

注意:以上仅包含管理端SDK用到的 Action,不包括控制台及云API的接口权限控制涉及的 Action