关于 aws-cloudformation-security
使用 AWS CloudFormation 定义安全基础设施的技能指南,涵盖加密、密钥管理、最小权限 IAM、网络控制、证书和安全堆栈输出。
主要功能
- 01配置 KMS 加密
- 02Secrets Manager 与轮换
- 03最小权限 IAM 策略
- 04VPC 安全配置
- 05ACM 证书管理
- 06加密日志与安全输出
适用场景
- 01构建加密的 AWS 基础设施
- 02管理应用密钥及其轮换
- 03限制 IAM 和 VPC 访问
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ giuseppe-trisciuoglio/ developer-kit --skill aws-cloudformation-security安装后在 Claude Code 中输入/aws-cloudformation-security确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
references/constraints.mdexamples.mdreference.md详细介绍
AWS CloudFormation 安全基础设施
概述
使用 AWS CloudFormation 模板创建可用于生产环境的安全基础设施。本技能涵盖 KMS 加密、Secrets Manager、遵循最小权限原则的 IAM 安全、VPC 安全配置、ACM 证书、参数安全、安全输出、跨堆栈引用、CloudWatch Logs 加密、纵深防御策略和安全最佳实践。
适用场景
- 实施静态和传输中 KMS 加密
- 使用 Secrets Manager 管理密钥并自动轮换
- 应用 IAM 最小权限策略和权限边界
- 使用安全组、NACL 和 VPC 端点保护 VPC
- 使用 ACM 管理 TLS/SSL 证书
- 加密 CloudWatch Logs 和 S3 存储桶
- 创建安全的跨堆栈引用和输出
说明
按照以下步骤使用 CloudFormation 创建安全基础设施:
1. 定义 KMS 加密密钥
创建客户管理的加密密钥:
Resources:
EncryptionKey:
Type: AWS::KMS::Key
Properties:
Description: Customer-managed key for data encryption
KeyPolicy:
Statement:
- Effect: Allow
Principal:
Service: lambda.amazonaws.com
Action:
- kms:Decrypt
- kms:GenerateDataKey
Resource: "*"
- Effect: Allow
Principal:
AWS: !Sub "arn:aws:iam::${AWS::AccountId}:root"
Action:
- kms:*
Resource: "*"
KeyAlias:
Type: AWS::KMS::Alias
Properties:
AliasName: !Sub "${AWS::StackName}/encryption-key"
TargetKeyId: !Ref EncryptionKey
验证: aws kms get-key-policy --key-id <key-id> --output text
2. 使用 Secrets Manager 管理密钥
安全地存储和检索敏感数据:
Resources:
DatabaseSecret:
Type: AWS::SecretsManager::Secret
Properties:
Name: !Sub "${AWS::StackName}/database"
Description: Database credentials
SecretString: !Sub |
{
"username": "admin",
"password": "${DatabasePassword}",
"engine": "mysql",
"host": "${DatabaseEndpoint}",
"port": 3306
}
KmsKeyId: !Ref EncryptionKey
SecretRotationSchedule:
Type: AWS::SecretsManager::RotationSchedule
Properties:
SecretId: !Ref DatabaseSecret
RotationLambdaARN: !Ref RotationLambda.Arn
RotationRules:
AutomaticallyAfterDays: 30
验证: aws secretsmanager describe-secret --secret-id <secret-name>
3. 应用 IAM 最小权限原则
创建仅具有所需最少权限的角色和策略:
Resources:
ExecutionRole:
Type: AWS::IAM::Role
Properties:
AssumeRolePolicyDocument:
Version: "2012-10-17"
Statement:
- Effect: Allow
Principal:
Service: lambda.amazonaws.com
Action: sts:AssumeRole
ManagedPolicyArns:
- arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole
Policies:
- PolicyName: SpecificPermissions
PolicyDocument:
Version: "2012-10-17"
Statement:
- Effect: Allow
Action:
- s3:GetObject
Resource: !Sub "${DataBucket.Arn}/*"
验证: aws iam simulate-principal-policy --policy-source-arn <role-arn> --action-names s3:GetObject --resource-arns <bucket-arn>
4. 配置安全的 VPC
使用安全组和 NACL 实施网络安全:
Resources:
ApplicationSecurityGroup:
Type: AWS::EC2::SecurityGroup
Properties:
GroupDescription: Application security group
VpcId: !Ref VPC
SecurityGroupIngress:
- IpProtocol: tcp
FromPort: 443
ToPort: 443
SourceSecurityGroupId: !Ref LoadBalancerSecurityGroup
SecurityGroupEgress:
- IpProtocol: -1
CidrIp: 0.0.0.0/0
ApplicationNACL:
Type: AWS::EC2::NetworkAcl
Properties:
VpcId: !Ref VPC
NACLEntry:
Type: AWS::EC2::NetworkAclEntry
Properties:
NetworkAclId: !Ref ApplicationNACL
RuleNumber: 100
Protocol: "6"
RuleAction: allow
Egress: false
CidrBlock: 0.0.0.0/0
PortRange:
From: 443
To: 443
验证: aws ec2 describe-security-groups --group-ids <sg-id> --query 'SecurityGroups[0].IpPermissions'
5. 申请 ACM 证书
管理用于安全通信的 TLS/SSL 证书:
Resources:
Certificate:
Type: AWS::ACM::Certificate
Properties:
DomainName: !Ref DomainName
SubjectAlternativeNames:
- !Sub "www.${DomainName}"
- !Sub "api.${DomainName}"
DomainValidationOptions:
- DomainName: !Ref DomainName
ValidationDomain: !Ref DomainName
Tags:
- Key: Environment
Value: !Ref Environment
# DNS validation record
DnsValidationRecord:
Type: AWS::Route53::RecordSet
Properties:
HostedZoneName: !Ref HostedZone
Name: !Sub "_${DomainName}."
Type: CNAME
TTL: 300
ResourceRecords:
- !Ref Certificate
验证: aws acm describe-certificate --certificate-arn <arn> --query 'Certificate.Status'
6. 实施安全参数
对敏感参数值使用 SecureString:
Resources:
DatabasePasswordParameter:
Type: AWS::SSM::Parameter
Properties:
Name: !Sub "/${AWS::StackName}/database/password"
Type: SecureString
Value: !Ref DatabasePassword
Description: Database master password
KmsKeyId: !Ref EncryptionKey
# Reference in other resources
DatabaseInstance:
Type: AWS::RDS::DBInstance
Properties:
MasterUsername: admin
MasterUserPassword: !Ref DatabasePasswordParameter
验证: aws ssm get-parameter --name <param-name> --with-decryption --query 'Parameter.Type'
7. 创建安全输出
仅从堆栈导出非敏感值:
Outputs:
# Safe to export
KMSKeyArn:
Description: KMS Key ARN for encryption
Value: !GetAtt EncryptionKey.Arn
Export:
Name: !Sub "${AWS::StackName}-KMSKeyArn"
SecretArn:
Description: Secret ARN (not the secret value)
Value: !Ref DatabaseSecret
Export:
Name: !Sub "${AWS::StackName}-SecretArn"
# DO NOT export sensitive data
# Incorrect:
# SecretValue:
# Value: !GetAtt DatabaseSecret.SecretString
验证: aws cloudformation list-exports --query "Exports[?Name=='<stack-name>-KMSKeyArn']"
8. 加密 CloudWatch Logs
为日志组启用加密:
Resources:
EncryptedLogGroup:
Type: AWS::Logs::LogGroup
Properties:
LogGroupName: !Sub "/aws/applications/${ApplicationName}"
RetentionInDays: 30
KmsKeyId: !Ref EncryptionKey
验证: aws logs describe-log-groups --log-group-name-prefix <prefix> --query 'logGroups[0].kmsKeyId'
最佳实践
- KMS:按数据分类使用不同的密钥;启用年度密钥轮换;为满足合规要求使用客户管理的密钥
- 密钥:自动轮换(数据库密钥每 30 天轮换一次);切勿以明文存储密钥;使用 IAM 策略控制访问
- IAM:遵循最小权限原则;使用角色而非访问密钥;启用 MFA;实施权限边界
- 网络:优先使用安全组而非 NACL;使用 VPC 端点;限制为特定 CIDR 范围
- 证书:使用 ACM 自动续期;DNS 验证比电子邮件验证更快
- 加密:对静态数据和传输中的数据进行加密;必须使用 TLS 1.2+;对 S3 使用 SSE-KMS
示例
完整的 KMS 和 Secrets 堆栈
Resources:
# KMS Key with proper policy
AppKey:
Type: AWS::KMS::Key
Properties:
KeyPolicy:
Statement:
- Effect: Allow
Principal:
AWS: !Sub "arn:aws:iam::${AWS::AccountId}:root"
Action: kms:*
Resource: "*"
- Effect: Allow
Principal:
Service: lambda.amazonaws.com
Action:
- kms:Decrypt
- kms:GenerateDataKey
Resource: "*"
# Secrets Manager with rotation
DbSecret:
Type: AWS::SecretsManager::Secret
Properties:
SecretString: !Sub '{"password":"${DbPassword}"}'
KmsKeyId: !Ref AppKey
RotationRules:
AutomaticallyAfterDays: 30
IAM 最小权限角色
Resources:
LambdaRole:
Type: AWS::IAM::Role
Properties:
AssumeRolePolicyDocument:
Version: "2012-10-17"
Statement:
- Effect: Allow
Principal:
Service: lambda.amazonaws.com
Action: sts:AssumeRole
Policies:
- PolicyName: AccessPolicy
PolicyDocument:
Statement:
- Effect: Allow
Action: s3:GetObject
Resource: !Sub "${Bucket.Arn}/*"
如需包含 VPC 安全组、ACM 证书和完整加密基础设施堆栈的综合示例,请参阅 examples.md。
限制和警告
资源限制
- 安全组:入站规则最多 60 条,出站规则最多 60 条
- NACL:每个子网的入站规则和出站规则各最多 20 条
- VPC:每个区域最多 5 个(软限制)
- 密钥轮换:KMS 客户管理的密钥每年轮换一次
安全限制
- NACL 是无状态的:必须显式允许返回流量
- 默认安全组无法删除
- 安全组引用不能跨越 VPC 对等连接(请使用 CIDR)
- 跨账户访问需要同时配置 IAM 策略和资源策略
操作警告
- 轮换密钥需要具备适当 IAM 权限的 Lambda 函数
- 删除 KMS 密钥需要设置等待期(7-30 天)
- ACM 证书必须先通过 DNS 验证,才能签发
- VPC CIDR 地址块不能与已对等连接的 VPC 重叠
如需了解详细限制,包括成本考量和配额管理,请参阅 constraints.md。
参考资料
如需详细的实施指南,请参阅:
- examples.md - 完整的 KMS 堆栈、带密钥轮换的 Secrets Manager、遵循最小权限原则的 IAM 角色、VPC 安全组、ACM 证书和加密基础设施
- constraints.md - 资源限制、安全限制、操作限制、网络限制、成本考量和访问控制限制