mcpField
A
aws-cloudformation-security

aws-cloudformation-security

github.com/giuseppe-trisciuoglioセキュリティ36568 回インストール7 週間前に更新
リポジトリ

aws-cloudformation-security について

AWS CloudFormation でセキュリティ基盤を定義するためのスキルガイドです。暗号化、シークレット、最小権限 IAM、ネットワーク制御、証明書、安全なスタック出力を扱います。

主な機能

  1. 01KMS 暗号化の設定
  2. 02Secrets Manager とローテーション
  3. 03最小権限 IAM ポリシー
  4. 04VPC セキュリティ設定
  5. 05ACM 証明書の管理
  6. 06暗号化ログと安全な出力

活用シーン

  1. 01暗号化された AWS 基盤の構築
  2. 02アプリケーションシークレットとローテーションの管理
  3. 03IAM と 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 Security Infrastructure

概要

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 とシークレットを含む完全なスタック
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 個、アウトバウンドルール 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 - リソース制限、セキュリティ上の制約、運用上の制約、ネットワーク上の制約、コストに関する考慮事項、アクセス制御の制約

コメント