AWSのインフラコード管理IaC(Infrastructure as Code)としてCloudFormationを使われている方は多いと思います。
今回はCloudFormationのコードテストツールとしてCloudFormation Guardの導入方法の紹介です。
CloudFormation Guardとはオープンソースのポリシー評価ツールです。
JSONやYAML形式の構造化されたデータをポリシー評価できます。
CloudFormation Guardとは
- CloudFormationで記述したコードが準拠すべきポリシーを満たしているかを評価できます。
- 準拠すべきポリシーを組織内で定めている場合などは、ポリシーをカスタマイズできます。
- (お薦め)準拠ポリシーを定めていない場合は、AWSが定める推奨ルール一覧があるのでそれを丸ごと適応すればいいでしょう。
ルール一覧から抜粋
- アメリカ政府のセキュリティ基準であるNISTや、AWSが定めるWell-Architected Frameworkに準拠しているかのルールセットなどが公開されています。(他にも多数用意されているので、リンクをご確認ください)
- これらのルールにCloudFormationコードが準拠しているかをテストできます。
Managed Rule Set | Rules Set Name |
---|---|
NIST 1800-25 | nist-1800-25 |
Amazon Web Services’ Well-Architected Framework Reliability Pillar | wa-Reliability-Pillar |
AWS Guard rule set for Amazon Web Services’ Well-Architected Framework Security Pillar | wa-Security-Pillar |
コードをテストしてみる
今回は保持期間1年のtest-loggroup
という名前のCloudWatchLogs
ログループでテストしてみます。
準拠すべきポリシーとして上記のAmazon Web Services' Well-Architected Framework Reliability Pillar
を選択してテストします。
- ./testCloudWatchLogs.yaml (ロググループ作成テンプレート)
AWSTemplateFormatVersion: '2010-09-09'
Description: CloudWatchLogs resources
Resources:
TestLogGroup:
Type: AWS::Logs::LogGroup
Properties:
LogGroupName: test-loggroup
RetentionInDays: 365
- DockerImageをダウンロード
- GitHubにDockerImageの使用方法が記載されています。
- AWSが公開しているECR Public Galleryよりダウンロードします。
docker pull public.ecr.aws/r7q6h7y6/guard:latest
- イメージを使って
Amazon Web Services' Well-Architected Framework Reliability Pillar
でテスト実施。- コンテナ内にAWSが用意している推奨ルールが入っており、
-r
オプションで指定するだけでテストが可能。
- コンテナ内にAWSが用意している推奨ルールが入っており、
docker run --mount src="$(pwd)"/,target=/mnt,type=bind -it public.ecr.aws/r7q6h7y6/guard:latest cfn-guard validate -d /mnt/testCloudWatchLogs.yaml -r /wa-Security-Pillar.guard
テスト結果と修正
- テスト結果をコマンドから確認(一部抜粋)
CLOUDWATCH_LOG_GROUP_ENCRYPTED
というテスト項目で失敗します。- 詳細はこちらから確認できますが、ロググループはAWS KMS キーで暗号化することが推奨されており、今回のリソースでは暗号化されていない為、テストが失敗しています。
testCloudWatchLogs.yaml Status = FAIL
FAILED rules
wa-Security-Pillar.guard/CLOUDWATCH_LOG_GROUP_ENCRYPTED FAIL
Message {
Guard Rule Set: wa-Security-Pillar
Controls: SEC-8.3
Violation: CloudWatch Log LogsGroup does not have KmsKeyId set.
Fix: Set the KmsKeyId parameter to a ARN.
}
- 可能であれば、暗号化する様にCloudFormationテンプレートを修正しましょう。そうすればセキュリティーは高くなります。
- しかし、セキュリティー要件次第で、KMSで暗号化しないAWSデフォルトの暗号化でもOKということがあります。その場合は、CloudFormationテンプレートでリソースごとにテスト項目を除外することができます。
- テスト対象から除外するには以下の様に記述します。リソースのMetadata属性にCloudFormation Guardの除外ルールを設定します。
AWSTemplateFormatVersion: '2010-09-09'
Description: CloudWatchLogs resources
Resources:
TestLogGroup:
Type: AWS::Logs::LogGroup
+ Metadata:
+ guard:
+ SuppressedRules:
+ - CLOUDWATCH_LOG_GROUP_ENCRYPTED
Properties:
LogGroupName: test-loggroup
RetentionInDays: 365
- これで再度テストを実行してもパスする様になりますが、上記はCloudFormation Guardでしか使わない記述方法なので可読性はやや低下してしまう印象です。
まとめ
- CloudFormationのコードテストツールとしてCloudFormation Guardを導入することが出来ます。
- CodePipeline内に含めるなどして、CloudFormationコードが準拠するセキュリティーポリシーを満たしているかチェックできます。
- CloudFormationでリソースをデプロイした後は、AWS Security Hubなどのセキュリティーポリシーを監視できるサービスがあるので、組み合わせて使っていくといいと思います。