

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 使用私 AWS IAM Roles Anywhere 有证书进行保护
<a name="iam-roles-anywhere-private-ca"></a>

*Barnali Singh，亚马逊 Web Services*

## Summary
<a name="iam-roles-anywhere-private-ca-summary"></a>

此模式演示了如何实现 w AWS IAM Roles Anywhere ith AWS 私有证书颁发机构 (AWS 私有 CA)，以便为访问 AWS 资源的外部工作负载启用安全的基于证书的身份验证。该解决方案通过使用 X.509 证书获取临时 AWS 证书，无需长期访问密钥。这是一种云原生安全模式，包括通过 AWS CloudFormation 模板和 shell 脚本实现完全自动化，使组织能够为本地应用程序、 CI/CD 管道和外部系统快速部署安全的混合身份验证。

## 先决条件和限制
<a name="iam-roles-anywhere-private-ca-prereqs"></a>

**先决条件**

**对于AWS****基础架构部署：**
+ AWS CLI 已安装并配置了管理权限
+ IAM IAM Roles Anywhere、和 AWS 私有 CA 服务的管理权限

**对于客户机系统设置：**
+ AWS CLI使用以下权限安装在客户端系统上：
  + `acm-pca:IssueCertificate`
  + `acm-pca:GetCertificate`
+ 安装在客户端系统上的 OpenSSL
+ AWS 每个客户端系统上都安装了签名助手
+ 对 X.509 证书和 PKI 概念的基本理解

**注意**  
 CloudFormation 模板会自动处理 AWS 资源创建。只有使用证书访问 AWS 资源的外部系统才需要 OpenSSL。

**限制**
+ 根 CA 的证书有效期限制为最长 10 年
+ 定期轮换客户证书。我们建议您每年至少这样做一次。
+ 区域限制：信任锚点且 AWS 私有 CA 必须位于同一 AWS 区域
+ 最大证书大小：客户端证书为 16KB

**产品版本**
+ AWS CLI 版本 2.0 或更高版本
+ OpenSSL 1.1.1 或更高版本
+ AWS 签名助手 1.4.0 或更高版本
+ AWS 私有 CA，当前版本
+ IAM Roles Anywhere e，当前版本

## 架构
<a name="iam-roles-anywhere-private-ca-architecture"></a>

**目标技术堆栈**

• AWS 私有 CA -用于颁发证书的根 CA

• IAM Roles Anywhere - Certificate-based 角色扮演服务

• IAM 角色和策略-访问控制和权限

• AWS 签名助手- Client-side 凭证检索工具

• OpenSSL-证书和密钥生成

• CloudFormation -基础设施自动化

**目标架构**

** **

![](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/images/pattern-img/2600dc9f-9c1a-442e-9523-1c925aff7620/images/309c3de5-255e-4257-8ad8-af58c1ce8855.png)


图 1 基于 IAM Roles Anywhere证书的身份验证

**该架构包括：**

1. 出示证书-外部系统向 X.509 AWS

1. 身份验证- IAM Roles Anywhere 接收证书并启动身份验证

1. 验证-Trust Anchor 根据受信任的证书颁发机构验证证书

1. 验证- AWS 私有 CA 验证证书的真实性和状态

1. 证书有效- AWS 私有 CA 确认证书有效且可信

1. 代入角色- IAM Roles Anywhere 允许外部系统代入已配置的 IAM 角色

1. 授予访问权限-外部系统会收到访问 AWS资源的临时证书

*自动化和扩展*

这种模式包括通过以下方式实现完全自动化：

• 具有可配置的 IAM 权限的 AWS 资源配置 CloudFormation 模板

• 用于证书生成和客户端设置的 Shell 脚本

• 多个环境的参数化配置和自定义 IAM 策略

• 为多个客户机生成批量证书

• 自动安装和配置凭证助手

**Workflow (工作流程)**

1. 使用建立基于证书的身份验证所需的基础 AWS 服务。 IAM Roles Anywhere

1. 创建和配置用于安全 AWS 访问的客户端证书和身份验证工具。

1. 验证基于证书的身份验证功能，并对正在进行的操作进行监控。

## 工具
<a name="iam-roles-anywhere-private-ca-tools"></a>

• CloudFormation -自动创建 PCA、信任锚点、IAM 角色和个人资料

• AWS CLI - AWS 服务交互 Command-line 接口

• openSSL-生成证书签名请求并管理证书

• AWS 签名助手-用证书交换临时 AWS 证书

• Bash/shell 脚本-自动完成设置过程

*代码存储库*

[AWS IAM 角色可在任何地方使用私有证书颁发机构](https://github.com/aws-samples/sample-aws-iam-roles-anywhere-automation)

## 最佳实践
<a name="iam-roles-anywhere-private-ca-best-practices"></a>
+ 使用最小权限原则配置 IAM 策略 `--iam-policies parameter`
+ 定期轮换客户证书。我们建议您每年都这样做。
+ 在信任策略中使用强大的证书验证
+ 实施证书吊销程序
+ 监控证书到期日期

## 操作说明
<a name="iam-roles-anywhere-private-ca-epics"></a>

### 设置 AWS 基础架构
<a name="set-up-aws-infrastructure"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| **部署CloudFormation****基础架构** | 创建并部署预置所有必要 AWS 资源的 CloudFormation 模板，包括 AWS 私有 CA Trust Anchor、具有适当策略的 IAM 角色和 IAM Roles Anywhere 配置文件。  为项目命名、证书有效期、会话持续时间和 IAM 策略附件配置参数，以建立核心基础设施基础。 | 云架构师、 DevOps 工程师 | 
| 配置证书颁发机构设置 |  AWS 私有 CA 通过安装根证书、配置证书模板和建立证书信任链来初始化。设置认证所需的证书有效期、密钥算法和证书扩展名，以确保正确的 IAM Roles Anywhere PKI 基础架构。 | AWS 管理员、云管理员 | 
| 验证 &AWS; 资源配置 | 对所有已部署的 AWS资源进行全面验证，以确保正确的配置和连接。验证 Trust Anchor 是否正确关联到 AWS 私有 CA，IAM 角色具有适当的权限，配置文件配置正确，并且基于证书的身份验证工作流程的所有资源都处于 active/ready 状态。 | AWS 系统管理员、测试工程师 | 

### 生成和部署客户端证书
<a name="generate-and-deploy-client-certificates"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 准备客户端环境 | 通过使部署脚本可执行并确保适当的权限来设置客户端环境。使用必要的工具和依赖关系配置本地系统，验证脚本的可访问性，并为证书生成和部署过程奠定基础。 | DevOps 工程师，AWS 系统管理员 | 
| 生成证书签名请求 | 使用 OpenSSL 或等效工具为客户端系统创建证书签名请求 (CSR)。配置证书参数，包括主题信息、密钥算法和证书扩展。  确保 CSR 符合 AWS 私有 CA 要求并包含用于 IAM Roles Anywhere 身份验证的相应元数据。 | 云管理员、 DevOps 工程师 | 
| 通过以下方式颁发客户证书 AWS 私有 CA | 处理 CSR AWS 私有 CA 以颁发有效的客户证书。配置证书有效期、证书模板，并确保建立正确的证书链。验证证书颁发并下载已签名的证书以进行客户端部署。 | AWS 管理员、云架构师 | 

### 测试和验证身份验证
<a name="test-and-validate-authentication"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 获取临时 AWS 证书 | 执行凭证帮助脚本，使用配置的客户端AWS 证书和私钥检索临时证书。验证凭证检索流程是否正常运行，验证凭证格式和到期时间，并确保与 IAM Roles Anywhere 服务正确集成，实现无缝身份验证工作流程。 | DevOps 工程师，AWS 系统管理员 | 
| 测试 AWS 资源访问权限 | 使用获得的临时证书对 AWS 资源访问进行全面测试。执行各种 AWS CLI 命令和 API 调用，以验证与 Amazon S3、Amazon EC2 和等目标服务的连接 AWS Lambda。 验证权限是否与配置的 IAM 角色策略一致，并记录成功的访问模式。 | 测试工程师、云端管理员 | 
| 验证角色假设和权限 | 对 IAM 角色担任流程和权限界限进行全面验证。测试允许和受限的操作，以确认最低权限访问权限是否得到正确执行。验证会话持续时间限制、凭据刷新机制，并确保角色假设遵循安全最佳实践。 | AWS 管理员、测试工程师 | 
| 实施监控和日志记录 | 为基于证书的身份验证系统设置全面的监控和日志记录。为审计跟踪配置 CloudTrail 日志记录，实施证书过期监控，设置身份验证失败警报，并建立仪表板以跟踪整个 IAM Roles Anywhere 基础架构中的使用模式和安全事件。 | DevOps 工程师、云架构师 | 

## 问题排查
<a name="iam-roles-anywhere-private-ca-troubleshooting"></a>


| 问题 | 解决方案 | 
| --- | --- | 
| **证书验证失败-** 尝试身份验证时出现 “证书验证失败InvalidCertificate” 或 “” 错误。 | **解决步骤：**<br />• 使用验证证书的有效日期 <br />openssl x509-in certificate.pem-dates-noout<br />• 检查 Trust Anchor 配置是否指向正确的私有 CA<br />• 确保私钥与证书相对应<br />• 如果证书是由错误的 CA 颁发的，则重新生成证书 | 
|  **IAM 权限被拒绝错误 —** 尽管身份验证成功但仍访问 AWS 资源时出现 “拒绝访问” 或 “” UnauthorizedOperation | **解决步骤：**<br />• 查看并扩展 IAM 角色策略以包括必要的权限<br />• 验证信任策略是否将 *rolesanywhere.amazonaws.com 列为可*信实体<br />• 检查配置文件 ARN 配置是否与已部署的资源相匹配<br />• 为长时间运行的进程实施凭证刷新机制 | 

## 相关资源
<a name="iam-roles-anywhere-private-ca-resources"></a>
+ [IAM Roles Anywhere 用户指南](https://docs.aws.amazon.com/rolesanywhere/latest/userguide/)
+ [AWS 私有证书颁发机构 用户指南](https://docs.aws.amazon.com/privateca/latest/userguide/)
+ [AWS 签名助手文档](https://docs.aws.amazon.com/rolesanywhere/latest/userguide/credential-helper.html)

## 附加信息
<a name="iam-roles-anywhere-private-ca-additional"></a>

这种模式非常适合具有混合云架构、在外部 AWS运行的 CI/CD 管道或任何需要安全 AWS 访问的外部系统的组织。与长期访问密钥相比，基于证书的方法提供了更好的安全性，并且可以通过实现集中式证书管理。 AWS 私有 CA

**可配置的 IAM 权限 —** 该解决方案支持通过以下方式灵活配置 IAM 策略`--iam-policies parameter`：
+ 默认：`ReadOnlyAccess`用于安全的初始部署
+ 自定义：为特定用例指定以逗号分隔的策略 ARN。例如`S3ReadOnlyAccess``EC2ReadOnlyAccess`、或自定义策略。支持多种策略以满足复杂的权限要求。

**用法示例：**

```
# Default read-only access
./deploy.sh

# S3-only access
./deploy.sh --iam-policies "arn:aws:iam::aws:policy/AmazonS3ReadOnlyAccess"

# Multiple services
./deploy.sh --iam-policies "arn:aws:iam::aws:policy/AmazonS3ReadOnlyAccess,arn:aws:iam::aws:policy/AmazonEC2ReadOnlyAccess"
```