Amazon RDS 数据库密码管理

场景描述:

客户端连接数据库,如何安全存储数据库凭证,使之不易被明文获取,并定期轮换数据库密码,而不需要修改应用代码。

实现方案:

使用 Secrets Manager 直接保存凭证。此时连接数据库需拥有 Secrets Manager 密钥权限和 Secrets Manager 中加密使用的 KMS 密钥相关权限,客户端调用 Secrets Manager API 获得数据库凭证用户和密码。

如上图所示,可将数据库凭证填入并选择相应的数据库实例在 Secrets Manager 实现保存,加密密钥可选择 KMS 默认密钥或者客户托管密钥。Secrets Manager 支持自动轮换 RDS 密码,启用密钥轮换时可配置轮换计划和轮换函数,轮换函数可设为默认的 Lambda 函数或者配置为自定义的 Lambda 函数。详情可参考文档

密钥保存在 Secrets Manager 后,可在 Lambda 中使用 AWS Parameters and Secrets Lambda Extension 并调用相应 API ,便捷地从 AWS Secrets Manager 中检索密钥,从而使用获得的密钥连接相应的数据库,代码示例如下:

secrets_url = ('http://localhost:' + port +'/secretsmanager/get?secretId=' + creds_path)
headers = { "X-Aws-Parameters-Secrets-Token": os.environ.get('AWS_SESSION_TOKEN') }
secret_string = http.request("GET", secrets_url, headers=headers)

rds_host =  secret_string['host']
rds_db_name = secret_string['dbname']
rds_username = secret_string['username']
rds_password = secret_string['password']

conn = pymysql.connect(host=rds_host, user=rds_username, passwd=rds_password, db=rds_db_name, connect_timeout=5)

最后更新于