设置用户 CAM 验证

最近更新时间:2026-07-01 17:44:54

我的收藏
本文为您介绍通过控制台为 RabbitMQ 集群的用户设置 CAM 验证的相关说明和操作。

背景

新建 TDMQ RabbitMQ 用户时,需要为每个用户创建用户名和密码,并可以为用户配置权限为其赋予不同 Vhost 下的配置和读写权限,具体指引请查阅配置 Vhost 权限。为提升密码安全性和简化用户管理复杂度,腾讯云 TDMQ RabbitMQ 支持您在控制台为用户启用 CAM 验证功能,打通腾讯云平台子账号与 TDMQ RabbitMQ 用户之间的关系以及增加 CAM 凭证的身份验证。

使用场景

如果您对密码安全性有较高要求,可以使用本功能将 TDMQ RabbitMQ 用户密码与 CAM 验证相绑定,CAM 将为用户生成密码并自动轮转,您可以通过代码请求获取对应用户的密码。

使用限制

仅开源托管版集群支持为用户设置 CAM 验证。
开源托管版的 admin 是集群的默认用户,集群的消息查询、变更记录等功能需依赖该默认用户,因此 admin 暂不支持设置 CAM 验证。
单个集群建议不超过10个账号开启 CAM 验证。

前提条件

已创建开源托管版集群。
提交工单申请使用该功能。
集群状态为运行中。

打开 CAM 验证

步骤1:配置 CAM 权限规则

在为用户打开 CAM 验证功能之前,您需要先配置相关的 CAM 权限规则。

策略内容

{
"statement": [
{
"action": [
"cam:BuildDataFlowAuthToken"
],
"effect": "allow",
"resource": [
"qcs::cam::uin/<用户uin>:resourceUser/<集群ID>/<RabbitMQ用户名>",
]
}
],
"version": "2.0"
}
<用户 uin>:替换为实际的腾讯云主账号 UIN。
<集群 ID>:替换为实际需要授权的 RabbitMQ 集群 ID。
<RabbitMQ 用户名>:替换为实际需要授权的 RabbitMQ 用户名称。

操作指引

1. 如果子账号需要使用该功能,请使用管理员账号为子账号授权。否则,跳过第1步,直接进入到第2步。
您需要使用管理员账号登录访问管理控制台,在 策略 页面,按照策略生成器创建自定义策略(请参见 通过策略生成器创建自定义策略)。

效果:允许。
服务:访问管理(cam)。
操作:其他操作 - BuildDataFlowAuthToken。
资源:特定资源 - 添加资源六段式。
填写资源:<实例 ID>/<账号名>。
2. 单击下一步,自定义策略的名称,并将策略授予目标子账号。
3. 单击完成,完成授权。

步骤2:打开 CAM 验证

打开 CAM 验证分为两种情形,分别是创建用户时打开 CAM 验证和为已有用户打开 CAM 验证,您可按照如下步骤分别操作。
创建用户时打开 CAM 验证
为已有用户打开 CAM 验证
2. 在左侧导航栏选择集群管理 > 用户与权限,选择好地域后,再选择目标集群,进入集群的用户与权限管理页面。
3. 点击新建用户按钮。在新建用户弹窗,填写用户名称,打开“启用 CAM 验证”按钮,阅读并确认好弹窗中的注意事项后,点击“确认”。
4. 继续填写其他配置。新建用户的其他介绍请查看配置 Vhost 权限

5. 成功启用 CAM 验证的用户会显示“CAM 验证”已打开。
2. 在左侧导航栏选择集群管理 > 用户与权限,选择好地域后,再选择目标集群,进入集群的用户权限管理页面。
3. 在用户管理列表中,找到需要打开 CAM 验证的用户,点击“CAM 验证”开关,阅读并确认好弹窗中的注意事项后,点击“确认”。
4. 成功启用 CAM 验证的用户会显示“CAM 验证”已打开。

步骤3:通过代码调用获取密码

账号具备了相关 CAM 权限规则,并且启用了 CAM 验证后,用户可在应用程序中通过代码调用来获取密码。您也可以使用其他编程语言来获取密码。以下代码以 Java 为例。
说明:
腾讯云 CAM 的动态凭证签发能力(cam:BuildDataFlowAuthToken)由 tencentcloud-dbauth-sdk-* 系列 SDK 统一封装。该 SDK 的命名沿用了首个接入产品的历史命名(DB = DataFlow Auth Broker),其能力本身与具体产品解耦,同一份 SDK 可同时用于 MySQL 等 DB 产品和 RabbitMQ 等消息队列产品。RabbitMQ 场景下直接复用该 SDK 即可,无需额外引入其它包。
package com.tencentcloud.rabbitmq.demo;
import com.tencentcloudapi.common.Credential;
import com.tencentcloud.dbauth.model.GenerateAuthenticationTokenRequest;
import com.tencentcloud.dbauth.DBAuthentication;
import com.tencentcloudapi.common.exception.TencentCloudSDKException;
import com.tencentcloudapi.common.profile.ClientProfile;
import com.tencentcloudapi.common.profile.HttpProfile;

public class GenerateRabbitMQUserAuthentication {

public static void main(String[] args) {
// 定义认证令牌的参数
String region = "<集群所在地域>";
String instanceId = "<集群ID>";
String userName = "<用户名>";

// 使用您提供的正确腾讯云访问密钥
String secretId = System.getenv("TENCENTCLOUD_SECRET_ID");
String secretKey = System.getenv("TENCENTCLOUD_SECRET_KEY");

// 创建凭证
Credential credential = new Credential(secretId, secretKey);

System.out.println(getAuthToken(region, instanceId, userName, credential));
}

public static String getAuthToken(String region, String instanceId, String userName, Credential credential) {
try {
// 实例化一个 http 选项,可选的,没有特殊需求可以跳过
HttpProfile httpProfile = new HttpProfile();
httpProfile.setEndpoint("cam.tencentcloudapi.com");
// 实例化一个 client 选项,可选的,没有特殊需求可以跳过
ClientProfile clientProfile = new ClientProfile();
clientProfile.setHttpProfile(httpProfile);

// 构建 GenerateAuthenticationTokenRequest
GenerateAuthenticationTokenRequest tokenRequest = GenerateAuthenticationTokenRequest.builder()
.region(region)
.credential(credential)
.userName(userName)
.instanceId(instanceId)
.clientProfile(clientProfile) // clientProfile 是可选的
.build();

return DBAuthentication.generateAuthenticationToken(tokenRequest);

} catch (TencentCloudSDKException e) {
e.printStackTrace();
}
return "";
}
}
<集群所在地域>:替换为您需要访问的实例所在地域。示例:ap-guangzhou。
<集群 ID>:替换为需要访问的 RabbitMQ 集群 ID。示例:amqp-njaytest
<用户名>:替换为实际的 RabbitMQ 用户名。
<TENCENTCLOUD_SECRET_ID>:替换为从访问管理控制台获取到的 SecretID。
<TENCENTCLOUD_SECRET_KEY>:替换为从访问管理控制台获取到的 SecretKey。

密码轮转周期

开启 CAM 验证后,用户的密码轮转周期为24小时。

关闭 CAM 验证

注意:
关闭 CAM 验证后无法通过 CAM 获取访问凭证,请及时更新密码。
2. 在左侧导航栏选择集群管理 > 用户与权限,选择好地域后,再选择目标集群,进入集群的用户权限管理页面。
3. 在用户管理列表中,找到需要关闭 CAM 验证的用户,点击“CAM 验证”开关,在弹窗中手动设置密码,然后点击“确认”。
4. 成功关闭 CAM 验证的用户会显示“CAM 验证”未开启。