islamelkadi/terraform-aws-secrets-manager
GitHub: islamelkadi/terraform-aws-secrets-manager
一个生产就绪的 Terraform 模块,用于创建符合多种安全合规框架的 AWS Secrets Manager 密钥,支持 KMS 加密、自动轮换和环境感知的安全控制。
Stars: 0 | Forks: 0
# Terraform AWS Secrets Manager 模块
[](https://github.com/islamelkadi/terraform-aws-secrets-manager/actions/workflows/terraform-security.yaml)
[](https://github.com/islamelkadi/terraform-aws-secrets-manager/actions/workflows/terraform-lint.yaml)
[](https://github.com/islamelkadi/terraform-aws-secrets-manager/actions/workflows/terraform-docs.yaml)
一个可复用的 Terraform 模块,用于创建符合 AWS Security Hub 合规性 (FSBP, CIS, NIST 800-53, NIST 800-171, PCI DSS) 的 AWS Secrets Manager 密钥,支持 KMS 加密、自动轮换以及灵活的安全控制覆盖。
## 目录
- [前置条件](#prerequisites)
- [安全](#security)
- [功能](#features)
- [用法](#usage)
- [要求](#requirements)
- [MCP Servers](#mcp-servers)
## 前置条件
本模块专为 macOS 设计。您的机器上必须已安装以下软件:
- Python 3 和 pip
- [Kiro](https://kiro.dev) 和 Kiro CLI
- [Homebrew](https://brew.sh)
要安装其余的开发工具,请运行:
```
make bootstrap
```
这将安装/升级:tfenv、Terraform (通过 tfenv)、tflint、terraform-docs、checkov 和 pre-commit。
## 安全
### 安全控制
本模块实施了 AWS Security Hub 合规性,并配有可扩展的覆盖系统。
### 可用的安全控制覆盖
| 覆盖标志 | 描述 | 常见理由 |
|--------------|-------------|---------------------|
| `disable_kms_requirement` | 允许 AWS 托管加密 | "开发环境密钥,无敏感数据" |
| `disable_recovery_window_validation` | 允许立即删除 | "测试密钥,需要更快地销毁" |
### 安全最佳实践
**生产环境密钥:**
- 使用 KMS 客户托管密钥
- 将恢复窗口设置为 30 天(最大值)
- 尽可能启用自动轮换
- 使用 IAM 策略限制访问
- 为密钥访问启用 CloudTrail 日志记录
**开发环境密钥:**
- 仍然建议使用 KMS 加密
- 可接受较短的恢复窗口(7-14 天)
### 基于环境的安全控制
安全控制通过 [terraform-aws-metadata](https://github.com/islamelkadi/terraform-aws-metadata?tab=readme-ov-file#security-profiles) 模块的安全配置文件基于环境自动应用:
| 控制 | 开发环境 | 预发布环境 | 生产环境 |
|---------|-----|---------|------|
| KMS 客户托管密钥 | 可选 | 必需 | 必需 |
| 恢复窗口 | 7 天 | 14-30 天 | 30 天 |
| 自动轮换 | 可选 | 推荐 | 必需 |
| IAM 访问限制 | 强制执行 | 强制执行 | 强制执行 |
有关安全配置文件以及控制如何随环境变化的完整详细信息,请参阅 [安全配置文件](https://github.com/islamelkadi/terraform-aws-metadata?tab=readme-ov-file#security-profiles) 文档。
### 安全扫描抑制
本模块抑制了某些不适用的 Checkov 安全检查,适用于示例/演示代码或代表可选功能。以下检查在 `.checkov.yaml` 中被抑制:
**模块源版本控制 (CKV_TF_1, CKV_TF_2)**
- 被抑制是因为我们使用语义版本标签 (`?ref=v1.0.0`) 而不是提交哈希,以获得更好的可维护性和可读性
- 语义版本控制是稳定版本有效且广泛接受的版本控制策略
**KMS IAM 策略 (CKV_AWS_111, CKV_AWS_356, CKV_AWS_109)**
- 在示例代码中被抑制,因为 KMS 模块为了演示目的使用了灵活的 IAM 策略
- 生产部署应根据特定的安全要求自定义 KMS 策略,并应用最小权限原则
## 功能
- AWS Secrets Manager 密钥
- 使用客户托管密钥进行 KMS 加密
- 支持自动密钥轮换
- 可配置的恢复窗口(7-30 天)
- 密钥版本控制
- 安全控制集成
## 使用示例
### 基础示例
```
module "secret" {
source = "github.com/islamelkadi/terraform-aws-secrets-manager"
namespace = "example"
environment = "prod"
name = "database-password"
region = "us-east-1"
description = "RDS database master password"
secret_string = jsonencode({
username = "admin"
password = "change-me-in-production"
})
kms_key_arn = module.kms.key_arn
tags = {
Project = "CorporateActions"
}
}
```
### 具有安全控制的生产环境密钥
```
module "secret" {
source = "github.com/islamelkadi/terraform-aws-secrets-manager"
security_controls = module.metadata.security_controls
namespace = "example"
environment = "prod"
name = "corporate-actions-db-credentials"
region = "us-east-1"
description = "Database credentials for Corporate Actions application"
# Store as JSON for structured data
secret_string = jsonencode({
username = "app_user"
password = random_password.db_password.result
host = module.rds.endpoint
port = 5432
database = "corporate_actions"
})
# KMS encryption (required by security controls)
kms_key_arn = module.kms.key_arn
# Maximum recovery window for production
recovery_window_in_days = 30
# Enable automatic rotation
enable_rotation = true
rotation_days = 30
rotation_lambda_arn = module.rotation_lambda.function_arn
tags = {
Project = "CorporateActions"
DataClass = "Confidential"
Compliance = "PCI-DSS"
}
}
# 用于 secret rotation 的 Lambda 函数
module "rotation_lambda" {
source = "github.com/islamelkadi/terraform-aws-secrets-manager"
namespace = "example"
environment = "prod"
name = "secret-rotation"
region = "us-east-1"
runtime = "python3.13"
handler = "index.handler"
filename = "rotation.zip"
vpc_config = {
subnet_ids = module.vpc.private_subnet_ids
security_group_ids = [module.lambda_sg.id]
}
environment_variables = {
DB_ENDPOINT = module.rds.endpoint
}
}
```
### API 密钥
```
module "api_key_secret" {
source = "github.com/islamelkadi/terraform-aws-secrets-manager"
security_controls = module.metadata.security_controls
namespace = "example"
environment = "prod"
name = "external-api-key"
region = "us-east-1"
description = "API key for external service integration"
secret_string = jsonencode({
api_key = var.external_api_key
api_secret = var.external_api_secret
endpoint = "https://api.external-service.com"
})
kms_key_arn = module.kms.key_arn
recovery_window_in_days = 30
tags = {
Project = "CorporateActions"
Purpose = "ExternalIntegration"
}
}
# Lambda 可在运行时检索 secret
module "api_lambda" {
source = "github.com/islamelkadi/terraform-aws-secrets-manager"
namespace = "example"
environment = "prod"
name = "api-client"
region = "us-east-1"
runtime = "python3.13"
handler = "index.handler"
filename = "api-client.zip"
environment_variables = {
SECRET_ARN = module.api_key_secret.secret_arn
}
# Grant permission to read secret
inline_policies = {
secrets_access = jsonencode({
Version = "2012-10-17"
Statement = [{
Effect = "Allow"
Action = [
"secretsmanager:GetSecretValue",
"secretsmanager:DescribeSecret"
]
Resource = module.api_key_secret.secret_arn
}]
})
}
}
```
### 带覆盖的开发环境密钥
```
module "dev_secret" {
source = "github.com/islamelkadi/terraform-aws-secrets-manager"
security_controls = module.metadata.security_controls
security_control_overrides = {
disable_recovery_window_validation = true
justification = "Development secret for testing. Faster teardown needed for ephemeral environments. No production data."
}
namespace = "example"
environment = "dev"
name = "test-credentials"
region = "us-east-1"
description = "Test credentials for development"
secret_string = jsonencode({
username = "test_user"
password = "test_password"
})
# Still use KMS encryption
kms_key_arn = module.kms.key_arn
# Shorter recovery window for dev
recovery_window_in_days = 7
tags = {
Project = "CorporateActions"
Environment = "Development"
}
}
```
## MCP Servers
本模块包含两个在 `.kiro/settings/mcp.json` 中配置的 [Model Context Protocol (MCP)](https://modelcontextprotocol.io/) 服务器,用于 Kiro:
| 服务器 | 包 | 描述 |
|--------|---------|-------------|
| `aws-docs` | `awslabs.aws-documentation-mcp-server@latest` | 提供对 AWS 文档的访问,用于服务功能、API 参考和最佳实践的上下文查找。 |
| `terraform` | `awslabs.terraform-mcp-server@latest` | 支持直接从 IDE 执行 Terraform 操作(init、validate、plan、fmt、tflint),并为常见工作流提供自动批准的命令。 |
这两个服务器都通过 `uvx` 运行,除了 [引导](#prerequisites) 步骤外,不需要额外安装。
## 用法
```
# Secrets Manager 模块示例
# 演示使用 KMS encryption 创建 secret
module "secret" {
source = "github.com/islamelkadi/terraform-aws-secrets-manager"
namespace = var.namespace
environment = var.environment
name = var.name
region = var.region
description = var.description
kms_key_arn = var.kms_key_arn
secret_string = var.secret_string
tags = var.tags
}
```
## 要求
| 名称 | 版本 |
|------|---------|
| [terraform](#requirement\_terraform) | >= 1.14.3 |
| [aws](#requirement\_aws) | >= 6.34 |
## Providers
| 名称 | 版本 |
|------|---------|
| [aws](#provider\_aws) | >= 6.34 |
## Modules
| 名称 | 来源 | 版本 |
|------|--------|---------|
| [metadata](#module\_metadata) | github.com/islamelkadi/terraform-aws-metadata | v1.1.0 |
## 资源
| 名称 | 类型 |
|------|------|
| [aws_secretsmanager_secret.this](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/secretsmanager_secret) | resource |
| [aws_secretsmanager_secret_rotation.this](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/secretsmanager_secret_rotation) | resource |
| [aws_secretsmanager_secret_version.this](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/secretsmanager_secret_version) | resource |
## 输入
| 名称 | 描述 | 类型 | 默认值 | 必需 |
|------|-------------|------|---------|:--------:|
| [attributes](#input\_attributes) | 用于命名的额外属性 | `list(string)` | `[]` | no |
| [create\_secret\_version](#input\_create\_secret\_version) | 是否创建初始密钥版本。如果稍后手动添加密钥值,则设置为 false | `bool` | `true` | no |
| [delimiter](#input\_delimiter) | 名称组件之间使用的分隔符 | `string` | `"-"` | no |
| [description](#input\_description) | 密钥的描述 | `string` | `""` | no |
| [enable\_rotation](#input\_enable\_rotation) | 启用自动密钥轮换 | `bool` | `false` | no |
| [environment](#input\_environment) | 环境名称 (dev, staging, prod) | `string` | n/a | yes |
| [kms\_key\_arn](#input\_kms\_key\_arn) | 用于加密的 KMS 密钥 ARN。如果未提供,则使用 AWS 托管密钥 | `string` | `null` | no |
| [name](#input\_name) | 密钥名称 | `string` | n/a | yes |
| [namespace](#input\_namespace) | 命名空间(组织/团队名称) | `string` | n/a | yes |
| [recovery\_window\_in\_days](#input\_recovery\_window\_in\_days) | 删除后保留密钥的天数(7-30 天,0 表示立即删除) | `number` | `30` | no |
| [region](#input\_region) | 将创建资源的 AWS 区域 | `string` | n/a | yes |
| [rotation\_days](#input\_rotation\_days) | 自动轮换之间的天数 | `number` | `30` | no |
| [rotation\_lambda\_arn](#input\_rotation\_lambda\_arn) | 用于密钥轮换的 Lambda 函数 ARN。如果 enable\_rotation 为 true,则此项为必需 | `string` | `null` | no |
| [secret\_binary](#input\_secret\_binary) | 作为二进制数据的密钥值。与 secret\_string 互斥 | `string` | `null` | no |
| [secret\_string](#input\_secret\_string) | 作为字符串的密钥值(结构化数据使用 JSON)。与 secret\_binary 互斥 | `string` | `null` | no |
| [security\_control\_overrides](#input\_security\_control\_overrides) | 通过文档化的理由覆盖特定的安全控制 |
object({
disable_kms_requirement = optional(bool, false)
disable_recovery_window_validation = optional(bool, false)
justification = optional(string, "")
}) | {
"disable_kms_requirement": false,
"disable_recovery_window_validation": false,
"justification": ""
} | no |
| [security\_controls](#input\_security\_controls) | 来自 metadata 模块的安全控制配置 | object({
encryption = object({
require_kms_customer_managed = bool
require_encryption_at_rest = bool
require_encryption_in_transit = bool
enable_kms_key_rotation = bool
})
logging = object({
require_cloudwatch_logs = bool
min_log_retention_days = number
require_access_logging = bool
require_flow_logs = bool
})
monitoring = object({
enable_xray_tracing = bool
enable_enhanced_monitoring = bool
enable_performance_insights = bool
require_cloudtrail = bool
})
compliance = object({
enable_point_in_time_recovery = bool
require_reserved_concurrency = bool
enable_deletion_protection = bool
})
}) | `null` | no |
| [tags](#input\_tags) | 应用于资源的额外标签 | `map(string)` | `{}` | no |
## 输出
| 名称 | 描述 |
|------|-------------|
| [secret\_arn](#output\_secret\_arn) | 密钥 ARN |
| [secret\_id](#output\_secret\_id) | 密钥 ID |
| [secret\_name](#output\_secret\_name) | 密钥名称 |
| [tags](#output\_tags) | 应用于密钥的标签 |
| [version\_id](#output\_version\_id) | 密钥版本 ID(如果提供了密钥值) |
## 示例
有关包含所有功能的完整工作示例,请参阅 [example/](example/)。
标签:AWS, CIS, DPI, EC2, ECS, IaC, KMS加密, NIST, PCI DSS, Secrets Manager, Security Hub, StruQ, Terraform, 企业级, 安全助手, 安全合规, 开源, 模块, 漏洞利用检测, 生产可用, 网络代理, 网络调试, 自动化, 自动轮换, 逆向工具