环境级访问权限控制
云开发 针对管理端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}"
]
}
]
}
获取密钥
创建好策略之后,即可将策略授权给 账户/子账号/用户组/协作者
,其相关联的的访问密钥(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