aws-cloudformation-security について
AWS CloudFormation でセキュリティ基盤を定義するためのスキルガイドです。暗号化、シークレット、最小権限 IAM、ネットワーク制御、証明書、安全なスタック出力を扱います。
主な機能
- 01KMS 暗号化の設定
- 02Secrets Manager とローテーション
- 03最小権限 IAM ポリシー
- 04VPC セキュリティ設定
- 05ACM 証明書の管理
- 06暗号化ログと安全な出力
活用シーン
- 01暗号化された AWS 基盤の構築
- 02アプリケーションシークレットとローテーションの管理
- 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.mdexamples.mdreference.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 - リソース制限、セキュリティ上の制約、運用上の制約、ネットワーク上の制約、コストに関する考慮事項、アクセス制御の制約