数据库凭据的应用

最近更新时间:2024-09-20 10:47:01

我的收藏

使用场景

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

SSM SDK 功能特性

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

支持语言

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

风险提示

SSM 在对数据库凭据进行周期性轮转的时候,会更新账号和密码。 请严格按照 SDK 使用说明来使用 SSM SDK。不要在除了SSM SDK内部逻辑之外的任何地方缓存获取到的数据库连接,也不要缓存获取到的凭据中的任何信息,以避免账号密码失效导致的数据库连接失败情况的发生。

前提条件

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

SDK 使用说明

说明:
可直接下载 SDK 源码,根据源码中提供的 demo 代码来使用。
1. 获取 go 模块:
(1)运行命令:go get github.com/tencentcloud/ssm-rotation-sdk-golang/lib
(2)在golang项目中引入:
import (
"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秒之间为宜
})
3. 获取数据库连接。
```golang
c := dbConn.GetConn() // 警告:每次需要访问数据库时,都需要调用GetConn()来获取最新的DB连接,请不要在业务代码中缓存此对象,以免DB访问失败!
if err := c.Ping(); err != nil { // 示例中只是调用ping()方法测试账号密码的可用性。实际业务中,这里就可以执行具体的db操作了。
log.Fatal("failed to access db with err: ", err)
return
}
```
4. 关闭数据库连接。
```golang
c.Close() // 当应用程序退出时,可主动关闭数据库连接。这是个通用的操作,和数据库凭据没有直接关系
```
1. 安装依赖包。
```shell
pip install -r requirements.txt
```
2. 配置信息。
```python
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
'url': test_url,
'region': "ap-guangzhou" # 选择凭据所存储的地域
})
config = Config(
params={
'db_config': db_config,
'ssm_service_config': ssm_service_config,
'WATCH_FREQ': WATCH_FREQ
})
```
3. 初始化数据库对象。
```python
db_conn = DynamicSecretRotationDb()
err = db_conn.init(config)
```
4. 获取数据库连接。
```python
c = db_conn.get_conn() # 警告:每次需要访问数据库时,都需要调用GetConn()来获取最新的DB连接,请不要在业务代码中缓存此对象,以免DB访问失败!
try:
c.ping() # 示例中只是调用ping()方法测试账号密码的可用性。实际业务中,这里就可以执行具体的db操作了。
except TencentCloudSDKException as e:
logging.error("failed to access db with err: {0}".format(str(
e.args[0])).encode("utf-8"))
```
5. 关闭数据库连接。
```python
c.close() # 当应用程序退出时,可主动关闭数据库连接。这是个通用的操作,和数据库凭据没有直接关系
```