tencent cloud

云数据库 MongoDB

动态与公告
产品动态
公告
新手指引
产品简介
产品概述
产品优势
应用场景
集群架构
产品规格
产品功能
地域和可用区
名词解释
购买指南
计费概述
产品定价
计费公式
欠费说明
备份空间计费
变配计费说明
快速入门
快速创建实例
连接 MongoDB 实例
读写数据库
操作指南
访问管理
管理实例
节点管理
版本升级
网络配置
系统监控
备份与回档
数据库审计
数据安全
SSL 认证
日志管理
数据库管理
多可用区部署
只读灾备
参数配置
回收站
任务管理
诊断优化
数据迁移指引
实践教程
索引优化解决读写性能瓶颈
分片集群 Mongos 负载不均解析及应对方案
分片集群使用注意事项
MongoDB 协议实例读写示例
基于 CVM 连接 MongoDB 进行数据导入导出的方法
3.6版本实例反复创建和删除同名数据库时报错怎么办
无法连接 MongoDB 解决方法
删减分片任务:进度确认与异常排查指南
性能调优
运维开发指南
开发规范
3.2版本分片集群命令支持情况
3.6版本命令支持情况
开发运维
故障处理
慢查询增多
连接数超限
API 文档
History
Introduction
API Category
Making API Requests
Instance APIs
Backup APIs
Account APIs
Other APIs
Task APIs
Introduction
Data Types
Error Codes
SDK 参考
Shell连接示例
PHP 连接示例
Node.js连接示例
Java 连接示例
Python连接示例
Python 读写示例
Go 连接示例
PHP 重连示例
产品性能
测试环境
测试方法
测试结果
常见问题
费用相关问题
功能特性问题
分片集群问题
实例相关问题
回档备份问题
连接相关问题
数据迁移问题
其他常见问题
相关协议
服务等级协议
Terms of Service
词汇表
联系我们

开启 CAM 验证

PDF
聚焦模式
字号
最后更新时间: 2025-11-18 16:29:41

功能描述

云数据库 MongoDB 支持为数据库账号开启 CAM 验证功能,将数据库账号与腾讯云访问管理(CAM)进行关联,使用动态生成的安全凭证(临时密码)替代传统的静态密码进行身份认证。开启后,系统将自动接管密码管理,并默认每24小时进行一次自动轮换,消除了因静态密码长期有效或手动管理疏漏所带来的潜在安全风险。

操作场景

开启 CAM 验证是从 “静态密码管理” 迈向 “动态身份治理” 的关键一步。尤其适合需要区分用户身份、实现精细授权、满足合规审计的场景。建议如下两种场景,启用 CAM 验证。
使用 CAM 身份验证作为临时、个人访问数据库的机制时。
仅对可以轻松重试的工作负载使用 CAM 身份验证。

约束与限制

分类项
说明/规则
连接方式
请尽可能使用长连接访问数据库。
启用前置条件
启用 CAM 验证前,需要提前在腾讯云访问管理(CAM)中配置好相关的权限策略。
账号数量
单个数据库实例内,建议不超过10个账号开启 CAM 验证。
修改密码
启用 CAM 验证后,不支持修改该账号密码,只能通过 CAM 提供的 Token 进行访问。
实例类型
不支持为开启了“免密码认证”的实例启用 CAM 验证。
关闭操作
关闭 CAM 验证时,必须为该账号设置一个新的静态密码,否则将无法连接数据库。
版本说明
支持 MongoDB 4.4 及以上版本,同时兼容物理盘与云盘版

操作步骤

步骤1:配置 CAM 权限规则

在使用账号 CAM 验证功能之前,用户需要先配置相关的 CAM 权限规则。策略内容如下所示。
<用户 uin>:替换为实际的账号 ID。
<实例 ID>:替换为实际需要授权的实例 ID。
<账号名>:替换为实际需要授权的账号名。
{
"statement": [
{
"action": [
"cam:GetMongoDBPassword"
],
"effect": "allow",
"resource": [
"qcs::cam::uin/<用户 uin>:resourceUser/<实例 ID>/<账号名>",
]
}
],
"version": "2.0"
}
1. 使用管理员账号登录 访问管理控制台
2. 在左侧导航,选择策略,在右侧页面,单击左上方的新建自定义策略,在弹出的选择创建策略方式的小窗口,选择按照策略生成器创建。
3. 按策略生成器创建的配置向导页面,按照如下说明要求生成策略。具体操作,请参见 通过策略生成器创建自定义策略
说明:
1. 效果(Effect):指定为允许
2. 服务(Service):配置为访问管理(cam)
3. 操作(Action):配置为其他操作 > BuildDataFlowAuthToken
4. 资源(Resource):选择特定资源,单击添加资源六段式,在右侧添加资源六段式区域的资源配置资源信息:<实例 ID>/<账号名>,单击确定

4. 单击下一步,按照提示要求自定义策略名称,并将策略权限授予给目标子账号。

5. 单击完成,完成授权。

步骤2:启用 CAM 验证

启用 CAM 验证分为两种情形,分别是创建账号时启用 CAM 验证和为已有账号启用 CAM 验证,您可按照如下步骤分别操作。
注意:
单个实例内不建议超过10个账户开启该功能。
开启该能力前需要提前配置好相关CAM权限规则。
情形1:创建账号时启用
情形2:创建账号后启用
1. 登录 MongoDB 控制台
2. 在左侧导航栏 MongoDB 的下拉列表中,选择副本集实例或者分片实例。副本集实例与分片实例操作类似。
3. 在右侧实例列表页面上方,选择地域。
4. 在实例列表中,找到目标实例。
5. 单击目标实例 ID,进入实例详情页面。
6. 选择数据库管理页签,进入账号管理页面。
7. 单击创建账号,在创建账号的小窗口,单击启用 CAM 验证

,并在启用 CAM 验证的提示窗口,确认风险提示信息,单击确定,即可开启 CAM 验证。

1. 登录 MongoDB 控制台
2. 在左侧导航栏 MongoDB 的下拉列表中,选择副本集实例或者分片实例。副本集实例与分片实例操作类似。
3. 在右侧实例列表页面上方,选择地域。
4. 在实例列表中,找到目标实例。
5. 单击目标实例 ID,进入实例详情页面。
6. 选择数据库管理页签,进入账号管理页面。
7. 在账号列表中,找到需开启 CAM 验证的账号,在其操作列,单击开启 CAM 验证

8. 启用 CAM 验证的提示窗口,确认风险提示信息,单击确定,即可开启 CAM 验证。

步骤3:在应用程序通过代码调用获取 Token

账号具备了相关 CAM 权限规格,并且启用了 CAM 验证后,用户可在应用程序通过 Java 等代码调用来获取密码,从而连接数据库实例。
1. 在腾讯云控制台,账号信息 页面,查询账号的 APPID。

2. 访问管理控制台 > API 密钥管理 获取 SecretID 和 SecretKey。
3. 在应用程序使用如下代码。
<dependency>
<groupId>com.tencentcloudapi</groupId>
<artifactId>tencentcloud-dbauth-sdk-java</artifactId>
<version>1.0.4</version>
</dependency>
间接依赖项:tencentcloud-sdk-java 3.1.1039版本及以上。
<dependency>
<groupId>com.tencentcloudapi</groupId>
<artifactId>tencentcloud-sdk-java</artifactId>
<version>3.1.1039</version>
</dependency>
通过代码调用获取密码的示例
<实例所在地域>:替换为您需要访问的实例所在地域,示例:ap-guangzhou。
<实例 ID>:替换为需要访问的实例 ID。
<账号名>:替换为实际登录的账号名。
<TENCENTCLOUD_SECRET_ID>:替换为从访问管理控制台获取到的 SecretID。
<TENCENTCLOUD_SECRET_KEY>:替换为从访问管理控制台获取到的 SecretKey。
package com.tencentcloud.dbauth;
import com.tencentcloudapi.common.Credential;
import com.tencentcloud.dbauth.model.GenerateAuthenticationTokenRequest;
import com.tencentcloudapi.common.exception.TencentCloudSDKException;
import com.tencentcloudapi.common.profile.ClientProfile;
import com.tencentcloudapi.common.profile.HttpProfile;

public class GenerateDBAuthentication {

public static void main(String[] args) {
// 定义认证令牌的参数
String region = "<实例所在地域>";
String instanceId = "<实例 ID>";
String userName = "<账号名>";
// 从环境变量中获取凭证
Credential credential = new Credential(System.getenv("<TENCENTCLOUD_SECRET_ID>"), System.getenv("<TENCENTCLOUD_SECRET_KEY>"));

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 "";
}
}

步骤4:使用身份令牌连接云数据库 MongoDB

说明:
使用 JDBC 驱动程序连接是 Java 程序连接到关系型数据库的标准方式,详细 JDBC 驱动程序的安装以及连接方法,可参见 Using the JDBC driver
添加 MongoDB Java Driver 依赖
<dependency>
<groupId>org.mongodb</groupId>
<artifactId>mongodb-driver-sync</artifactId>
<version>4.11.0</version>
</dependency>
步骤3 中获取到身份令牌 AuthToken 后,即可使用身份令牌连接云数据库 MongoDB,以下连接命令为使用 JDBC 连接数据库的场景示例。
<数据库名>:替换为您实际需要访问的数据库名称。
<账号名>:替换为您实际登录的账号名。
<密码>:替换 步骤3 中获取到的 AuthToken。
import com.mongodb.client.MongoClient;
import com.mongodb.client.MongoClients;
import com.mongodb.client.MongoDatabase;

public class MongoDBConnectExample {
public static void main(String[] args) {
// 连接字符串格式
String connectionString = "mongodb://<账号名>:<密码>@localhost:27017/<数据库名>?authSource=admin";

try (MongoClient mongoClient = MongoClients.create(connectionString)) {
MongoDatabase database = mongoClient.getDatabase("<数据库名>");
System.out.println("Connected to MongoDB successfully!");
// 你可以使用database进行后续操作
} catch (Exception e) {
e.printStackTrace();
}
}
}

附录1:关闭 CAM 验证

1. 登录 MongoDB 控制台
2. 在左侧导航栏 MongoDB 的下拉列表中,选择副本集实例或者分片实例。副本集实例与分片实例操作类似。
3. 在右侧实例列表页面上方,选择地域。
4. 在实例列表中,找到目标实例。
5. 单击目标实例 ID,进入实例详情页面。
6. 选择数据库管理页签,进入账号管理页面。
7. 在账号列表中,找到需关闭 CAM 验证的账号,在其操作列,单击关闭 CAM 验证
8. 关闭 CAM 验证的提示小窗口,输入账号密码,并在确认密码再次输入密码,单击确定,即可关闭 CAM 验证。

附录2:通过 Python 连接数据库

import logging
import os
import time
from pymongo import MongoClient
from dbauth.db_authentication import DBAuthentication
from dbauth.model.generate_authentication_token_request import GenerateAuthenticationTokenRequest
from tencentcloud.common import credential
from tencentcloud.common.exception.tencent_cloud_sdk_exception import TencentCloudSDKException
from tencentcloud.common.profile.client_profile import ClientProfile
from tencentcloud.common.profile.http_profile import HttpProfile
# 配置root logger
logging.basicConfig(
level=logging.INFO,
format='[%(asctime)s] - [%(threadName)s] - {%(module)s:%(funcName)s:%(lineno)d} %(levelname)s - %(message)s',
datefmt='%Y-%m-%d %H:%M:%S'
)
log = logging.getLogger(__name__)
def main():
region = "ap-guangzhou"
instance_id = "cmgo-xxxx" # MongoDB实例ID
user_name = "camtest"
host = "10.0.0.1"
port = 27017
db_name = "test"
secret_id = os.environ['AK']
secret_key = os.environ['SK']
client = None
try:
# 获取MongoDB连接
client = get_mongo_connection_using_cam(secret_id, secret_key, region,
instance_id, user_name, host, port, db_name)
# 验证连接是否成功
db = client[db_name]
# 查询测试
dummy_collections = db.list_collection_names()
log.info(f"Collections: {dummy_collections}")
log.info("Success!")
except Exception as e:
log.error(f"An error occurred: {e}")
finally:
if client:
client.close()
def get_mongo_connection_using_cam(secret_id, secret_key, region, instance_id, user_name, host, port, db_name):
cred = credential.Credential(secret_id, secret_key)
max_attempts = 3
last_exception = None
for attempt in range(1, max_attempts + 1):
try:
auth_token = get_auth_token(region, instance_id, user_name, cred)
# MongoDB连接字符串
mongo_uri = (
f"mongodb://{user_name}:{auth_token}@{host}:{port}/{db_name}?authSource={db_name}"
)
client = MongoClient(mongo_uri, serverSelectionTimeoutMS=5000)
# 测试连接
client.admin.command("ping")
return client
except Exception as e:
last_exception = e
log.info(f"Attempt {attempt} failed: {e}")
time.sleep(5)
log.error(f"All attempts failed: {last_exception}")
raise last_exception
def get_auth_token(region, instance_id, user_name, cred):
try:
http_profile = HttpProfile()
http_profile.endpoint = "cam.tencentcloudapi.com"
client_profile = ClientProfile()
client_profile.httpProfile = http_profile
request = GenerateAuthenticationTokenRequest(
region=region,
instance_id=instance_id,
user_name=user_name,
credential=cred,
client_profile=client_profile
)
return DBAuthentication.generate_authentication_token(request)
except TencentCloudSDKException as err:
log.error(err)
raise
if __name__ == "__main__":
main()


帮助和支持

本页内容是否解决了您的问题?

填写满意度调查问卷,共创更好文档体验。

文档反馈