# Amazon RDS 数据库密码管理

**场景描述：**

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

**实现方案：**

![](https://3752289132-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LTfg4e0NhLEbwi6WFJp%2Fuploads%2F4FiimYCVcbA4J2z6Wn4a%2Fimage.png?alt=media\&token=d8912b15-c37d-434d-b207-4eb20f223350)[\
](https://s3.cn-north-1.amazonaws.com.cn/awschinablog/aws-security-key-management-services-support-innovative-growing-enterprises1-new.jpg)使用 Secrets Manager 直接保存凭证。此时连接数据库需拥有 Secrets Manager 密钥权限和 Secrets Manager 中加密使用的 KMS 密钥相关权限，客户端调用 Secrets Manager API 获得数据库凭证用户和密码。

<figure><img src="https://3752289132-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LTfg4e0NhLEbwi6WFJp%2Fuploads%2FnBHAGeaggzb5QcOfmBsl%2Fimage.png?alt=media&#x26;token=ec9cd823-971e-4fc1-ac60-f91b9eb678d4" alt=""><figcaption></figcaption></figure>

如上图所示，可将数据库凭证填入并选择相应的数据库实例在 Secrets Manager 实现保存，加密密钥可选择 KMS 默认密钥或者客户托管密钥。Secrets Manager 支持自动轮换 RDS 密码，启用密钥轮换时可配置轮换计划和轮换函数，轮换函数可设为默认的 Lambda 函数或者配置为自定义的 Lambda 函数。详情可参考[文档](https://docs.aws.amazon.com/zh_cn/secretsmanager/latest/userguide/rotate-secrets_turn-on-for-db.html) 。

密钥保存在 Secrets Manager 后，可在 Lambda 中使用 [AWS Parameters and Secrets Lambda Extension](https://docs.aws.amazon.com/secretsmanager/latest/userguide/retrieving-secrets_lambda.html) 并调用相应 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)
```
