🎯 結論:cfn-guard とは何か?
📋 一言で言うと
CloudFormationテンプレートを
デプロイ前に検査
して、セキュリティやコンプライアンスのルール違反を自動検出するツール
🎯 主な目的
「本番環境に危険な設定がデプロイされる前に止める」
Policy as Code(ポリシーのコード化)を実現
⚙️ 動作方式
独自のDSL(ドメイン固有言語)でルールを記述し、テンプレートファイルに対して検証を実行
🔧 導入箇所
CI/CDパイプライン、ローカル開発、AWS Config連携など様々な場所で検証を実行可能
🏠 たとえ話で理解する「建築検査官」
cfn-guard は、建物を建てる前に設計図をチェックする「建築検査官」のような存在です
📐
設計図
CloudFormation
テンプレート
➡️
➡️
➡️
🏗️ 現実世界の建築検査
👷
建築検査官
設計図が基準を満たすか確認する専門家
📜
建築基準法
「耐震基準」「非常口の数」など守るべきルール
☁️ 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
テンプレートの構造を解析してツリー形式で表示します。デバッグに役立ちます。
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パイプラインでの活用
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レビュー時に自動実行することで、違反コードがマージされるのを防止。人的レビューの前にチェック。
rule
s3_bucket_encryption_enabled
when
%s3_buckets !empty {
%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
}
}
let
rds_instances = Resources.*[ Type ==
"AWS::RDS::DBInstance"
]
rule
rds_encryption_enabled
when
%rds_instances !empty {
%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 {
%taggable_resources.Properties.Tags exists
%taggable_resources.Properties.Tags[*].Key ==
"Environment"
%taggable_resources.Properties.Tags[*].Key ==
"Owner"
}
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ツール
公開ルールセットを活用すれば、すぐに始められる