AWS CloudFormation Guardを導入してみた

Pocket

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オプションで指定するだけでテストが可能。
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などのセキュリティーポリシーを監視できるサービスがあるので、組み合わせて使っていくといいと思います。
Pocket

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です