# 通过AWS Secrets Manager统一管理混合云上的安全凭据

### 什么是安全凭据

IAM credentials、Database credentials、OAuth tokens、Encryption keys、SSH keys、Certificates (and private keys)、Application programming interface (API) keys、Application credentials这些都是安全凭据。

### 如何开始构建？

#### 第一步：打通网络

应用需要与Secrets Manager API网络互通。

#### 第二步：授权

配置一个IAM role给本地计算资源。

#### 第三步：调用API

通过SDK或者（更推荐）客户端缓存SDK以降低成本和提升性能。

<figure><img src="https://3752289132-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LTfg4e0NhLEbwi6WFJp%2Fuploads%2FYPwP2JFmuFD9SLm4pUm4%2FImage%20(2).jpg?alt=media&#x26;token=028c6458-4483-4990-af46-cecf31dda645" alt=""><figcaption></figcaption></figure>

|       | 本地存储安全凭据                                                                  | Secrets Manager混合部署方案                                                                                                                                | IAM Roles Anywhere                                                                    |
| ----- | ------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------- |
| 凭据更新  | 一直保存直到手动更换                                                                | SSM代理每 30 分钟使用新的临时凭证更新凭证文件                                                                                                                           | 会话凭据的有效期为 60 分钟。客户端进程将在凭据过期之前自动刷新凭据                                                   |
| 跨账号访问 | 不支持                                                                       | 支持通过角色授予信任策略，或者明确授予对一个或多个资源的访问策略                                                                                                                     | 通过角色链访问来自不同 AWS 账户的 IAM 角色                                                            |
| 授权方式  | 使用 SigV4 将签名字符串（由访问密钥 ID 和秘密访问密钥组成）呈现给目标 API                              | 成功注册后，SSM 代理使用authentication tokens 与 Secrets Manager 服务通信                                                                                           | 使用从 SigV4 派生的签名进行身份验证，使用密钥绑定到 X509 证书                                                 |
| 凭据存储  | *\~/.aws/credentials 文件* (或者 *%UserProfile%\\.aws\credentials*on Windows) | 通过 RequestManagedInstanceRoleToken API获取凭据，并将它们保存在 /root/.aws/credentials 文件（或 Windows 上的 %windir%\system32\config\systemprofile\\.aws\credentials）中 | 会话凭据直接传递给请求应用程序（通过跨语言 SDK 可用的 credential\_process 功能hook）。默认情况下，会话凭据不会保存到磁盘，从而提高整体安全性 |

## 如何自动轮换密钥？

<figure><img src="https://3752289132-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LTfg4e0NhLEbwi6WFJp%2Fuploads%2FnnxwXLQhbnyVHu2c3iGx%2FImage%20(3).jpg?alt=media&#x26;token=6d41ec7a-c5d5-4e30-9955-341e7ab52c4e" alt=""><figcaption><p>自动轮换密钥</p></figcaption></figure>

#### 第一步：建立连接

VPC里的Rotation Lambda要能够连接到本地资源。

#### 第二步：自定义轮换功能

已经支持的数据库类型可以在界面上直接操作。其他的需要自定义模板。<br>

<figure><img src="https://3752289132-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LTfg4e0NhLEbwi6WFJp%2Fuploads%2F5fay9S0QXpkROBsO4K8V%2FImage%20(4).jpg?alt=media&#x26;token=c0a381a0-bb7f-4fd6-8aca-dfea33c7bb54" alt=""><figcaption></figcaption></figure>

其中注意起名字和添加标签。

* 名字要起的有意义，并且建议使用有层次结构的名字，比如onpremises/database/MariaDB，这样比较易于管理和扩展。
* 使用tag对secret进行分组，这样比较易于管理。推荐至少配置哪个团队负责维护此密钥以及密钥是什么类型的资源在使用，比如DB。

<figure><img src="https://3752289132-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LTfg4e0NhLEbwi6WFJp%2Fuploads%2FXI7mBPDhII3Q9nn6DeYp%2FImage%20(5).jpg?alt=media&#x26;token=e6804cfa-efa1-4d29-aba8-291d6e532755" alt=""><figcaption></figcaption></figure>

下图中配置自动轮换策略，开启Automatic rotation，Schedule expression中设置多长时间轮换一次，比如rate(30 days)。Rotation function选择一个Lamdba function可以轮换你自己数据库的密钥的。可以参考此[Lamdba Function代码](https://github.com/aws-samples/aws-secrets-manager-rotation-lambdas/blob/master/SecretsManagerRDSMariaDBRotationSingleUser/lambda_function.py)。

<figure><img src="https://3752289132-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LTfg4e0NhLEbwi6WFJp%2Fuploads%2Fg3v18eNIMJCtFuB6mkEp%2FImage%20(6).jpg?alt=media&#x26;token=e6154b89-e98f-40fa-94be-b7122edb7804" alt=""><figcaption></figcaption></figure>

#### 第三步：启用轮换

可以通过AWS CloudFormation, console, or API启用轮换。

### 如何同步本地安全凭据到Secrets Manager统一管理？

第一步，本地存储的密钥管理系统与AWS网络打通；&#x20;

第二步，创建目录和访问控制。确定密钥将被AWS的什么账户，哪些IAM user或者role访问使用。使用控制台、AWS CloudFormation 或 API创建拥有适当控制的初始密钥。&#x20;

第三步，复制，通过使用 Amazon CloudWatch 事件来调用 AWS Lambda 函数的Scheduled event，Lambda function将本地密钥更新到Secrets Manager，仅拷贝副本，不会对原来的密钥进行任何修改。或者，本地密钥管理系统推送更新到AWS，由Lamdba订阅本地的推送。

**这样本地原来的密钥也可以通过Secrets Manager实现安全审计、密钥轮换、KMS非对称加密保护。**
