🔍 CloudFormation Guard (cfn-guard)

インフラコードの「建築検査官」〜デプロイ前にルール違反を自動検出〜

🎯 結論:cfn-guard とは何か?

📋 一言で言うと
CloudFormationテンプレートを デプロイ前に検査 して、セキュリティやコンプライアンスのルール違反を自動検出するツール
🎯 主な目的
「本番環境に危険な設定がデプロイされる前に止める」
Policy as Code(ポリシーのコード化)を実現
⚙️ 動作方式
独自のDSL(ドメイン固有言語)でルールを記述し、テンプレートファイルに対して検証を実行
🔧 導入箇所
CI/CDパイプライン、ローカル開発、AWS Config連携など様々な場所で検証を実行可能

🏠 たとえ話で理解する「建築検査官」

cfn-guard は、建物を建てる前に設計図をチェックする「建築検査官」のような存在です

📐
設計図
CloudFormation
テンプレート
➡️
👷
建築検査官
cfn-guard
➡️
📜
建築基準
.guard ルール
ファイル
➡️
合格!
デプロイ続行
不合格
デプロイ停止

🏗️ 現実世界の建築検査

📐
設計図
建物の構造や配置を示す図面
👷
建築検査官
設計図が基準を満たすか確認する専門家
📜
建築基準法
「耐震基準」「非常口の数」など守るべきルール
🚫
建築許可の却下
基準違反があれば建設ストップ

☁️ AWSでの cfn-guard

📄
CloudFormationテンプレート
AWSリソースの構成を定義するYAML/JSON
🔍
cfn-guard
テンプレートがルールを満たすか検証するツール
📝
.guard ルールファイル
「暗号化必須」「パブリック禁止」などのポリシー
🛑
デプロイ停止
ルール違反があればCI/CDパイプラインが失敗

⚙️ cfn-guard の動作フロー

1
✍️
ルール作成
.guard ファイルに
検証ルールを記述
2
📄
テンプレート準備
検証対象の
CFnテンプレート
3
🔍
検証実行
cfn-guard validate
コマンドを実行
4
📊
結果出力
PASS/FAIL と
違反箇所を表示

📝 Guard ルールの書き方

🎯 基本構文

リソースタイプ プロパティパス 演算子 期待値

シンプルな構文で「何を」「どう検証するか」を記述します

🔒 S3暗号化の必須化

AWS::S3::Bucket { BucketEncryption.ServerSideEncryptionConfiguration[*] .ServerSideEncryptionByDefault .SSEAlgorithm == "AES256" }

S3バケットにAES256暗号化が設定されているか検証

🌐 パブリックアクセス禁止

AWS::S3::Bucket { PublicAccessBlockConfiguration exists PublicAccessBlockConfiguration { BlockPublicAcls == true BlockPublicPolicy == true } }

S3のパブリックアクセスブロックが有効か検証

🏷️ タグの必須化

AWS::EC2::Instance { Tags[*].Key == "Environment" Tags[*].Key == "Owner" }

EC2インスタンスに必須タグが付いているか検証

📏 インスタンスタイプ制限

AWS::EC2::Instance { InstanceType in ["t3.micro", "t3.small", "t3.medium"] }

許可されたインスタンスタイプのみを使用しているか検証

🔐 RDS暗号化チェック

AWS::RDS::DBInstance { StorageEncrypted == true DeletionProtection == true }

RDSの暗号化と削除保護が有効か検証

💻 主要コマンド一覧

cfn-guard validate
テンプレートをルールファイルで検証します。最も頻繁に使用するコマンドです。
cfn-guard rulegen
既存のテンプレートからルールファイルを自動生成します。ルール作成の出発点として便利です。
cfn-guard test
ルールファイル自体をテストします。ルールが期待通りに動作するか確認できます。
cfn-guard parse-tree
テンプレートの構造を解析してツリー形式で表示します。デバッグに役立ちます。
📋 基本的な使い方 CLI
# インストール (Homebrew) brew install cloudformation-guard # テンプレートの検証 cfn-guard validate \ --data template.yaml \ --rules security-rules.guard # 複数ルールファイルで検証 cfn-guard validate \ --data template.yaml \ --rules rules/ # 詳細な出力形式で結果を表示 cfn-guard validate \ --data template.yaml \ --rules security-rules.guard \ --output-format json # 既存テンプレートからルールを自動生成 cfn-guard rulegen \ --template good-template.yaml \ --output generated-rules.guard

🎯 主なユースケース

🔒
セキュリティポリシーの強制
暗号化、パブリックアクセス禁止、セキュリティグループの制限などを自動検証
例:S3バケットは必ずSSE暗号化を有効に
📋
コンプライアンス準拠
PCI DSS、HIPAA、SOC2などの規制要件をコード化して自動チェック
例:ログ記録が有効か、保持期間は適切か
💰
コスト管理
高額なリソースタイプの使用を制限し、予期せぬコスト増加を防止
例:本番以外では大きいインスタンスタイプを禁止
🏷️
タグ付けの標準化
コスト配分やリソース管理に必要なタグの付け忘れを防止
例:Owner, Environment タグを必須化
🔄
CI/CDゲートキーパー
デプロイパイプラインに組み込み、違反があればデプロイを自動停止
例:GitHub Actions、CodePipelineとの連携
📊
AWS Config連携
AWS Config カスタムルールとして使用し、既存リソースも継続的に検証
例:デプロイ済みリソースのドリフト検出

🔄 CI/CDパイプラインでの活用

📝
コード変更
🔀
PR作成
🔍
cfn-guard
レビュー
🚀
デプロイ
📋 GitHub Actions での設定例 .github/workflows/cfn-guard.yml
name: CloudFormation Guard on: pull_request: paths: - 'cloudformation/**' jobs: validate: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Install cfn-guard run: | curl -Lo cfn-guard.tar.gz \ https://github.com/aws-cloudformation/cloudformation-guard/releases/latest/download/cfn-guard-v3-ubuntu-latest.tar.gz tar -xzf cfn-guard.tar.gz sudo mv cfn-guard /usr/local/bin/ - name: Run cfn-guard run: | cfn-guard validate \ --data cloudformation/ \ --rules rules/ \ --output-format json

✅ メリット

  • シフトレフト :本番デプロイ前に問題を検出
  • 自動化 :手動レビューの負担を軽減
  • 一貫性 :全テンプレートに同じルールを適用
  • 監査証跡 :どのルールでチェックしたか記録可能
  • 無料 :OSSツールなのでコスト不要
  • AWS公式 :AWSがメンテナンスするため安心

⚠️ 注意点・制限

  • 学習コスト :Guard DSLの習得が必要
  • 静的検査のみ :実行時の動作は検証できない
  • CFn限定 :Terraform等には別ツールが必要
  • 複雑なロジック :高度な条件分岐は書きにくい
  • ルール管理 :ルールファイルのバージョン管理が必要

💡 ベストプラクティス

1

段階的に導入する

最初は警告モードで始め、チームが慣れてからブロックモードに移行。いきなり厳格にすると開発速度が低下します。

2

ルールにコメントを書く

なぜそのルールが必要か、どう修正すれば通るかをルールファイル内にコメントで記載。開発者の理解を助けます。

3

ルールをテストする

cfn-guard test コマンドでルール自体をテスト。意図しないPASS/FAILを防ぎます。

4

公開ルールを活用する

AWS公式のルールセット(CIS Benchmarks等)を出発点として使用。ゼロから書く手間を省けます。

5

CI/CDに組み込む

PRレビュー時に自動実行することで、違反コードがマージされるのを防止。人的レビューの前にチェック。

📋 実践的なルールファイル例 security-baseline.guard
############################################# # セキュリティベースライン - 基本ルールセット ############################################# # ===== S3バケットのセキュリティ ===== rule s3_bucket_encryption_enabled when %s3_buckets !empty { # 説明: すべてのS3バケットはサーバーサイド暗号化が必須 # 修正方法: BucketEncryptionプロパティを追加 %s3_buckets.Properties.BucketEncryption exists %s3_buckets.Properties.BucketEncryption .ServerSideEncryptionConfiguration[*] .ServerSideEncryptionByDefault .SSEAlgorithm in [ "AES256" , "aws:kms" ] } rule s3_bucket_public_access_blocked when %s3_buckets !empty { # 説明: パブリックアクセスを完全にブロック %s3_buckets.Properties.PublicAccessBlockConfiguration exists %s3_buckets.Properties.PublicAccessBlockConfiguration { BlockPublicAcls == true BlockPublicPolicy == true IgnorePublicAcls == true RestrictPublicBuckets == true } } # ===== RDSのセキュリティ ===== let rds_instances = Resources.*[ Type == "AWS::RDS::DBInstance" ] rule rds_encryption_enabled when %rds_instances !empty { # 説明: RDSインスタンスはストレージ暗号化が必須 %rds_instances.Properties.StorageEncrypted == true } rule rds_deletion_protection when %rds_instances !empty { # 説明: 本番環境では削除保護を有効化 %rds_instances.Properties.DeletionProtection == true } # ===== タグの必須化 ===== let taggable_resources = Resources.*[ Type in [ "AWS::EC2::Instance" , "AWS::S3::Bucket" , "AWS::RDS::DBInstance" ] ] rule required_tags when %taggable_resources !empty { # 説明: Environment, Owner タグは必須 %taggable_resources.Properties.Tags exists %taggable_resources.Properties.Tags[*].Key == "Environment" %taggable_resources.Properties.Tags[*].Key == "Owner" } # ===== EC2インスタンスタイプ制限 ===== let ec2_instances = Resources.*[ Type == "AWS::EC2::Instance" ] rule ec2_approved_instance_types when %ec2_instances !empty { # 説明: コスト管理のため承認されたインスタンスタイプのみ使用可 %ec2_instances.Properties.InstanceType in [ "t3.micro" , "t3.small" , "t3.medium" , "t3.large" , "m5.large" , "m5.xlarge" ] }

📌 まとめ

🔍
cfn-guard は「デプロイ前の検査官」
CloudFormationテンプレートをデプロイ前にルールベースで検証
📝
独自DSLでポリシーをコード化
セキュリティ、コンプライアンス、コスト管理ルールを宣言的に記述
🔄
CI/CDパイプラインに統合
PRレビュー時に自動実行して違反をブロック、シフトレフトを実現
🆓
AWS公式の無料OSSツール
公開ルールセットを活用すれば、すぐに始められる

Created by SSuzuki1063

AWS SAP Learning Resources