mcpField
A
aws-cloudformation-security

aws-cloudformation-security

github.com/giuseppe-trisciuoglio安全36568 次安装7 周前更新
代码仓库

关于 aws-cloudformation-security

使用 AWS CloudFormation 定义安全基础设施的技能指南,涵盖加密、密钥管理、最小权限 IAM、网络控制、证书和安全堆栈输出。

主要功能

  1. 01配置 KMS 加密
  2. 02Secrets Manager 与轮换
  3. 03最小权限 IAM 策略
  4. 04VPC 安全配置
  5. 05ACM 证书管理
  6. 06加密日志与安全输出

适用场景

  1. 01构建加密的 AWS 基础设施
  2. 02管理应用密钥及其轮换
  3. 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.md
examples.md
reference.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 - 资源限制、安全限制、操作限制、网络限制、成本考量和访问控制限制

评论

支持 Markdown