环境级访问权限控制
云开发 针对管理端 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 相关的访问权限,需增加控制台访问的权限策略,一般将预定义策略授予相关用户即可。
操作步骤
- 创建策略:控制台 -> 访问管理 -> 策略 -> 创建策略 -> 按策略语法或标签创建策略 -> 空白模版 -> 填入策略配置 -> 提交
- 关联策略:将策略关联到账户/子账号/用户组/协作者
- 获取密钥:通过控制台或云 API 创建并获取密钥
- 使用密钥:通过访 问密钥初始化管理端 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}"
]
}
]
}
完整环境级策略示例(含 scf/cls/cos)
以下为包含云函数(scf)、日志服务(cls)、对象存储(cos)的完整环境级策略模板,适用于子账号模式。
点击查看完整策略模板 JSON(子账号模式)
{
"statement": [
{
"action": [
"cam:CreateRole",
"cam:AttachRolePolicy",
"cam:GetRole",
"cdn:TcbCheckResource",
"scf:ListFunctions",
"tcb:CheckTcbService",
"tcb:DescribeEnvs",
"tcb:DescribeBillingInfo",
"tcb:DescribeEnvPostpayPackage",
"tcb:DeleteTable",
"tcb:CreateTable",
"tcb:DescribeTable",
"tcb:DescribeTables",
"tcb:ListTables",
"tcb:RunCommands",
"tcb:UpdateTable",
"tcb:UpdateItem",
"tcb:QueryRecords",
"tcb:PutItem",
"tcb:ModifyNameSpace",
"tcb:DeleteItem",
"tcb:CountRecords"
],
"effect": "allow",
"resource": ["*"]
},
{
"action": ["tcb:*"],
"effect": "allow",
"resource": ["qcs::tcb::uin/${uin}:env/${envId}"]
},
{
"action": ["tcbr:*"],
"effect": "allow",
"resource": ["qcs::tcbr::uin/${uin}:env/${envId}"]
},
{
"action": ["lowcode:*"],
"effect": "allow",
"resource": ["qcs::lowcode::uin/${uin}:env/${envId}"]
},
{
"action": ["scf:*"],
"effect": "allow",
"resource": [
"qcs::scf:${region}:uin/${uin}:namespace/${envId}",
"qcs::scf:${region}:uin/${uin}:namespace/${envId}/function/*",
"qcs::scf:${region}:uin/${uin}:namespace/${envId}/layer/*",
"qcs::cls:${region}:uin/${uin}:logset/${logsetId}",
"qcs::cls:${region}:uin/${uin}:topic/${topicId}"
]
},
{
"action": ["cos:*"],
"effect": "allow",
"resource": [
"qcs::cos:${region}:uid/${appId}:${cosBucketId}/*",
"qcs::cos:${region}:uid/${appId}:${staticBucketId}/*"
]
}
],
"version": "2.0"
}
logsetId和topicId通过DescribeEnvs返回:EnvList[0].LogServices[0].LogsetId和EnvList[0].LogServices[0].TopicId。
获取密钥
创建好策略之后,即可将策略授权给 账户/子账号/用户组/协作者,其相关联的的访问密钥(SecretId/SecretKey)将会限定性的拥有策略中描述的资源(Resources)及相关操作(Actions)的权限。
可以通过以下 3 种方式获得 访问凭证
1. 控制台获取子账号/协作者访问凭证
可在 访问管理 -> 用户管理 -> 用户列表 -> 子用户详情页 -> API 密钥 页面新建或获取永久访问凭证
该方式适用于为子账号分配相关资源的访问权限,密钥有效期长
参考文档:创建子账号并授权
该方式需要预先创建 策略 和 子账号/协作者,并将 策略 授予 子账号/协作者