tencent cloud

文档凭据管理系统实践教程数据库凭据的应用

数据库凭据的应用

下载
聚焦模式
字号
最后更新时间: 2026-10-30 17:24:02
本文档已由 AI 辅助审校

使用场景

在应用程序的开发过程中,数据库是常用于存储业务数据的基础服务。
为了能够对数据库的访问权限进行有效的控制,只有当应用程序在获得合适权限的账号和密码时,才能够创建数据库连接。
同时为了降低账号和密码泄露的风险,应用程序需要定期更换使用的账号和密码信息。
凭据管理系统(以下简称为 SSM)能够适用于上述场景,避免了应用程序频繁更换账号密码的麻烦,并保障业务数据的安全。

SSM SDK 功能特性

基于 SSM 提供的数据库凭据功能,以及数据库账号安全管理的实践教程,腾讯云团队开发了一套应用程序集成的 SSM SDK。
应用程序通过调用 SSM SDK,传入数据库连接所需的参数和凭据名称,可以获取到一个可用的数据库连接,不必关心账号密码的获取和轮转的实现细节。

支持语言

Golang 1.13 及以上版本。
Python 2.7 及以上版本, Python 3 及以上版本。

风险提示

SSM 在对数据库凭据进行周期性轮转的时候,会更新账号和密码。
请按照 SDK 使用说明使用 SSM SDK。数据库连接及凭据信息仅允许在 SSM SDK 内部逻辑中调用使用,禁止在外部缓存该类数据,避免因账号密码失效引发数据库连接异常。

前提条件

1. 在腾讯云平台上已购买至少一台云数据库实例,并完成数据库的初始化,同时创建了至少一个 database。
2. 在 SSM 控制台中已创建一个数据库凭据,并已关联指定数据库。如未创建数据库凭据,请参见 创建数据库凭据 。
3. 在 访问管理(CAM)控制台 中,需完成以下两点:
已创建能够访问 SSM 凭据资源和 MySQL 实例资源的子账号。
给子账号分配了 API 密钥,为了便于获取 SecretId 和 SecretKey 用于 API 的访问。

SDK 使用说明

说明:
可直接下载 SDK 源码,根据源码中提供的示例代码来使用。
1. 获取 Go 模块:
(1)运行命令:
go get github.com/tencentcloud/ssm-rotation-sdk-golang/lib
(2)在 Go 项目中引入:
import (
_ "github.com/go-sql-driver/mysql"
"github.com/tencentcloud/ssm-rotation-sdk-golang/lib/db"
"github.com/tencentcloud/ssm-rotation-sdk-golang/lib/ssm"
)
2. 初始化 DynamicSecretRotationDb 对象。
dbConn := &db.DynamicSecretRotationDb{}

err := dbConn.Init(&db.Config{
DbConfig: &db.DbConfig{
MaxOpenConns: 100,
MaxIdleConns: 50,
IdleTimeoutSeconds: 100,
ReadTimeoutSeconds: 5,
WriteTimeoutSeconds: 5,
SecretName: "test", // 凭据名
IpAddress: "127.0.0.1", // 数据库实例的访问地址
Port: 58366, // 数据库实例的访问端口
DbName: "database_name", // 数据库名称
ParamStr: "charset=utf8&loc=Local", //数据库连接相关配置参数
},
SsmServiceConfig: &ssm.SsmAccount{
SecretId: os.Getenv("SECRET_ID"), // 子账号的 SecretId
SecretKey: os.Getenv("SECRET_KEY"), // 子账号的 SecretKey
Region: "ap-guangzhou", // 凭据所在地域
},
WatchChangeInterval: time.Second * 10, // 监控间隔,建议设置为 10~60 秒
})

if err != nil {
log.Fatalf("failed to initialize SSM SDK: %v", err)
}

defer func() {
if err := dbConn.Close(); err != nil {
log.Printf("failed to close SSM SDK: %v", err)
}
}()
3. 获取数据库连接。
c := dbConn.GetConn()
// 注意:每次需要访问数据库时,都应调用 GetConn() 获取最新的连接池对象, 不要在业务代码中长期缓存该对象,以免DB访问失败!
if c == nil {
log.Fatal("failed to get database connection")
}

if err := c.Ping(); err != nil {
log.Fatalf("failed to access database: %v", err)
}
// 示例中只是调用ping()方法测试账号密码的可用性。实际业务中,这里就可以执行具体的db操作了。
// 在此执行具体的数据库操作。
4. 关闭数据库连接。
c.Close() // 当应用程序退出时,可主动关闭数据库连接。这是个通用的操作,和数据库凭据没有直接关系
1. 安装依赖包,推荐通过 pip 安装官方 SDK:
pip install ssm-rotation-sdk
2. 配置信息。
import os
import logging

from ssm_rotation_sdk import (
DynamicSecretRotationDb,
Config,
DbConfig,
SsmAccount,
)

WATCH_FREQ = 10 # 凭据监控间隔,建议设置为 10~60 秒

db_config = DbConfig(
params={
'secret_name': 'test', # 凭据名
'ip_address': '127.0.0.1', # 数据库地址
'port': 58366, # 数据库端口
'db_name': 'database_name', # 指定具体的数据库名,如果为空,则只连接到数据库实例,不连接具体的数据库
'param_str': 'charset=utf8&loc=Local',
}
)

ssm_service_config = SsmAccount(
params={
'secret_id': os.getenv('SECRET_ID'), # 需填写实际可用的子账号 SecretId
'secret_key': os.getenv('SECRET_KEY'), # 需填写实际可用的子账号 SecretKey
'region': 'ap-guangzhou', # 凭据所在地域
}
)

config = Config(
params={
'db_config': db_config,
'ssm_service_config': ssm_service_config,
'WATCH_FREQ': WATCH_FREQ,
}
)
3. 初始化数据库对象。
db_conn = DynamicSecretRotationDb()

err = db_conn.init(config)
if err:
raise RuntimeError("Failed to initialize SSM SDK: {}".format(err))
4. 获取数据库连接。
c = db_conn.get_conn()
# 注意:每次需要访问数据库时,都需要调用GetConn()来获取最新的DB连接,请不要在业务代码中缓存此对象,以免DB访问失败!
if c is None:
logging.error("Failed to get database connection")
else:
try:
c.ping(reconnect=True) # 示例中只是调用ping()方法测试账号密码的可用性
# 在此执行具体的数据库操作。
except Exception:
logging.exception("Failed to access database")
raise
finally:
c.close() # 归还连接到连接池
5. 关闭数据库连接。
c.close() # 当应用程序退出时,可主动关闭数据库连接。这是个通用的操作,和数据库凭据没有直接关系







帮助和支持

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

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

文档反馈