AWS CloudFormation Guard ポリシーを使用して AWS Config カスタムルールを作成する - AWS 規範ガイダンス

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

AWS CloudFormation Guard ポリシーを使用して AWS Config カスタムルールを作成する

作成者: Andrew Lok (AWS)、Kailash Havildar (AWS)、Nicole brown (AWS)、Tanya Howell (AWS)

概要

AWS Config ルールは、 AWS リソースとそのターゲット設定状態を評価するのに役立ちます。ルールには、マネージドルールとカスタム AWS Config ルールの 2 種類があります。は、 AWS Lambda 関数またはpolicy-as-code言語である AWS CloudFormation Guard (GitHub) を使用してカスタムルールを作成できます。

Guard で作成されたルールは、 マネージドルールよりも詳細な制御を提供し、通常、完全にカスタムの Lambda ルールよりも設定が簡単になります。このアプローチにより、エンジニアやアーキテクトは、Lambda を介してカスタムルールをデプロイするために必要な Python、NodeJS、または Java を知ることなくルールを構築できます。

このパターンは、Guard でカスタムルールを採用するのに役立つ実用的なテンプレート、コードサンプル、デプロイアプローチを提供します。このパターンを使用すると、管理者は を使用して AWS Config 、設定項目属性を持つカスタムコンプライアンスルールを構築できます。たとえば、開発者は AWS Config 設定項目に対して Guard ポリシーを使用して、デプロイされたAWS リソース AWS と非リソースの状態を継続的にモニタリングし、ルール違反を検出して、修復を自動的に開始できます。

目的

このパターンを読み終えると、次のことができるようになります。

  • Guard ポリシーコードが AWS Config サービスとやり取りする方法を理解します。

  • シナリオ 1 をデプロイします。シナリオ 1 は、Guard 構文を使用して暗号化されたボリュームのコンプライアンスを検証する AWS Config カスタムルールです。このルールは、ドライブが使用中であることを確認し、ドライブタイプが gp3 であることを確認します。

  • シナリオ 2 をデプロイします。シナリオ 2 は、Guard 構文を使用して Amazon GuardDuty のコンプライアンスを検証する AWS Config カスタムルールです。このルールは、GuardDuty レコーダーで Amazon Simple Storage Service (Amazon S3) ProtectionAmazon Elastic Kubernetes Service (Amazon EKS) Protection が有効になっていることを確認します。

前提条件と制限

前提条件

  • アクティブな AWS アカウント

  • AWS Config、 でセットアップする AWS アカウント

制約事項

  • ガードカスタムルールは、ターゲット設定項目の JSON レコード内のキーと値のペアのみをクエリできます。

アーキテクチャ

Guard 構文をカスタム policy として AWS Config ルールに適用します。 AWS Config は、指定された各リソースの階層 JSON を取得します。 AWS Config 設定項目の JSON には、キーと値のペアが含まれます。これらの属性は、対応する値に割り当てられた変数として Guard 構文で使用されます。 

以下は、Guard 構文の説明です。設定項目 JSON の変数が使用され、%文字が付加されます。

# declare variable let <variable name> = <'value'> # create rule and assign condition and policy rule <rule name> when <CI json key> == <"CI json value"> { <top level CI json key>.<next level CI json key> == %<variable name> }

シナリオ 1: Amazon EBS ボリューム

シナリオ 1 は、Guard 構文を使用して暗号化されたボリュームのコンプライアンスを検証する AWS Config カスタムルールをデプロイします。このルールは、ドライブが使用中であることを確認し、ドライブタイプが gp3 であることを確認します。

シナリオ 1 AWS Config の設定項目の例を次に示します。この設定項目には、、volumestatus、および の変数として を使用した 3 つのキーvolumeencryptionstatusと値のペアがありますvolumetype。また、resourceTypeキーは Guard ポリシーのフィルターとして使用されます。

{ "version": "1.3", "accountId": "111111111111", "configurationItemCaptureTime": "2023-01-15T19:04:45.402Z", "configurationItemStatus": "ResourceDiscovered", "configurationStateId": "4444444444444", "configurationItemMD5Hash": "", "arn": "arn:aws:ec2:us-west-2:111111111111:volume/vol-222222222222", "resourceType": "AWS::EC2::Volume", "resourceId": "vol-222222222222", "awsRegion": "us-west-2", "availabilityZone": "us-west-2b", "resourceCreationTime": "2023-01-15T19:03:22.247Z", "tags": {}, "relatedEvents": [], "relationships": [ { "resourceType": "AWS::EC2::Instance", "resourceId": "i-33333333333333333", "relationshipName": "Is attached to Instance" } ], "configuration": { "attachments": [ { "attachTime": "2023-01-15T19:03:22.000Z", "device": "/dev/xvda", "instanceId": "i-33333333333333333", "state": "attached", "volumeId": "vol-222222222222", "deleteOnTermination": true, "associatedResource": null, "instanceOwningService": null } ], "availabilityZone": "us-west-2b", "createTime": "2023-01-15T19:03:22.247Z", "encrypted": false, "kmsKeyId": null, "outpostArn": null, "size": 8, "snapshotId": "snap-55555555555555555", "state": "in-use", "volumeId": "vol-222222222222", "iops": 100, "tags": [], "volumeType": "gp2", "fastRestored": null, "multiAttachEnabled": false, "throughput": null, "sseType": null }, "supplementaryConfiguration": {} }

以下は、シナリオ 1 で Guard 構文を使用して変数とルールを定義する例です。以下の例で、次の操作を行います。

  • 最初の 3 行は、 let コマンドを使用して変数を定義します。  設定項目の属性から派生した名前と値が割り当てられます。

  • compliancecheck ルールブロックは、 に一致するresourceTypeキーと値のペアを検索する条件依存関係に を追加しますAWS::EC2::Volume。一致が見つかった場合、ルールは残りの JSON 属性を続行しencryptedstate、、 の 3 つの条件で一致を検索しますvolumeType

let volumestatus = 'available' let volumetype = 'gp3' let volumeencryptionstatus = true rule compliancecheck when resourceType == "AWS::EC2::Volume" { configuration.state == %volumestatus configuration.encrypted == %volumeencryptionstatus configuration.volumeType == %volumetype }

このカスタムルールを実装する完全な Guard カスタムポリシーについては、GitHub コードリポジトリのawsconfig-guard-cft.yaml」またはawsconfig-guard-tf-ec2vol.json」を参照してください。このカスタムポリシーを Guard にデプロイする HashiCorp Terraform コードについては、コードリポジトリのawsconfig-guard-tf-example.json」を参照してください。

シナリオ 2: GuardDuty コンプライアンス

シナリオ 2 は、Guard 構文を使用して Amazon GuardDuty のコンプライアンスを検証する AWS Config カスタムルールをデプロイします。このルールは、GuardDuty レコーダーで Amazon S3 Protection と Amazon EKS Protection が有効になっていることを確認します。また、GuardDuty の検出結果が 15 分ごとに発行されることを確認します。このシナリオは、組織全体 AWS アカウント および組織内 ( 内) AWS リージョン にデプロイできます AWS Organizations。

以下は、シナリオ 2 AWS Config の設定項目の例です。この設定項目には、ガードポリシーで変数として を使用した FindingPublishingFrequency、、 の 3 つのキーS3Logsと値のペアがありますKubernetes。また、resourceTypeキーはポリシーのフィルターとして使用されます。

{ "version": "1.3", "accountId": "111111111111", "configurationItemCaptureTime": "2023-11-27T13:34:28.888Z", "configurationItemStatus": "OK", "configurationStateId": "7777777777777", "configurationItemMD5Hash": "", "arn": "arn:aws:guardduty:us-west-2:111111111111:detector/66666666666666666666666666666666", "resourceType": "AWS::GuardDuty::Detector", "resourceId": "66666666666666666666666666666666", "resourceName": "66666666666666666666666666666666", "awsRegion": "us-west-2", "availabilityZone": "Regional", "resourceCreationTime": "2020-02-17T02:48:04.511Z", "tags": {}, "relatedEvents": [], "relationships": [], "configuration": { "Enable": true, "FindingPublishingFrequency": "FIFTEEN_MINUTES", "DataSources": { "S3Logs": { "Enable": true }, "Kubernetes": { "AuditLogs": { "Enable": true } } }, "Id": "66666666666666666666666666666666", "Tags": [] }, "supplementaryConfiguration": { "CreatedAt": "2020-02-17T02:48:04.511Z" } }

以下は、シナリオ 2 で Guard 構文を使用して変数とルールを定義する例です。以下の例で、次の操作を行います。

  • 最初の 3 行は、 let コマンドを使用して変数を定義します。  設定項目の属性から派生した名前と値が割り当てられます。

  • compliancecheck ルールブロックは、 に一致するresourceTypeキーと値のペアを検索する条件依存関係に を追加しますAWS::GuardDuty::Detector。一致が見つかった場合、ルールは残りの JSON 属性を続行しKubernetes.AuditLogs.EnableS3Logs.Enable、、および の 3 つの条件で一致を検索しますFindingPublishingFrequency

let s3protection = true let kubernetesprotection = true let publishfrequency = 'FIFTEEN_MINUTES' rule compliancecheck when resourceType == "AWS::GuardDuty::Detector" { configuration.DataSources.S3Logs.Enable == %s3protection configuration.DataSources.Kubernetes.AuditLogs.Enable == %kubernetesprotection configuration.FindingPublishingFrequency == %publishfrequency }

このカスタムルールを実装する完全な Guard カスタムポリシーについては、GitHub コードリポジトリのawsconfig-guard-cft-gd.yaml」を参照してください。このカスタムポリシーを Guard にデプロイする HashiCorp Terraform コードについては、コードリポジトリのawsconfig-guard-tf-gd.json」を参照してください。

ツール

AWS のサービス

  • AWS CloudFormation は、 AWS リソースをセットアップし、迅速かつ一貫してプロビジョニングし、 AWS アカウント および リージョン全体のライフサイクルを通じてリソースを管理するのに役立ちます。

  • AWS Config は、 内のリソースの詳細ビュー AWS アカウント と設定方法を提供します。リソースがどのように相互に関連しているか、またそれらの構成が時間の経過とともにどのように変化したかを特定するのに役立ちます。

その他のツール

  • HashiCorp Terraform は、コードを使用してクラウドインフラストラクチャとリソースをプロビジョニングおよび管理するためのInfrastructure as Code (IaC) ツールです。

コードリポジトリ

このパターンのコードは、GitHub AWS Config with AWS CloudFormation Guard リポジトリで入手できます。このコードリポジトリには、このパターンで説明されている両方のシナリオのサンプルが含まれています。

エピック

タスク説明必要なスキル

(オプション) ルールのキーと値のペアを選択します。

カスタム Guard ポリシーを定義する場合は、以下の手順を実行します。シナリオ 1 または 2 のサンプルポリシーのいずれかを使用している場合は、以下の手順をスキップします。

  1. にサインイン AWS Management Console し、 AWS Config コンソールを開きます。

  2. 左側のナビゲーションで、リソースを選択します。

  3. リソースインベントリで、 AWS Config カスタムルールを作成するリソースのタイプを選択します。

  4. [詳細を表示] を選択します。

  5. 設定項目の表示 (JSON) を選択します。このセクションでは、JSON 形式で設定項目を表示するように展開します。

  6. AWS Config カスタムルールを構築するキーと値のペアを特定します。

AWS 管理者、セキュリティエンジニア

カスタムルールを作成します。

以前に特定したキーと値のペアを使用するか、提供されているサンプル Guard ポリシーのいずれかを使用して、AWS Config 「カスタムポリシールールの作成」の手順に従ってカスタムルールを作成します。

AWS 管理者、セキュリティエンジニア

カスタムルールを検証します。

カスタム Guard ルールを検証するには、次のいずれかを実行します。

  • AWS Command Line Interface () に次のコマンドを入力しますAWS CLI。

    cfn-guard validate -r guard-s3.guard -d s3bucket-prod-pass.json
  • Detective モードのAWS Config 「ルールを使用したリソースの評価」の指示に従って、ルールをデプロイします AWS Config。Guard 構文がターゲットアカウントまたはファイルの対応するリソースと正しく一致することを確認します。

AWS 管理者、セキュリティエンジニア

トラブルシューティング

問題ソリューション

の外部で Guard ポリシーをテストする AWS Config

ユニットテストは、ローカルデバイスまたは IDE などの統合開発環境 (IDE) AWS Cloud9 で実行できます。ユニットテストを実行するには、以下を実行します。

  1. AWS CloudFormation Guard CLI とその依存関係をインストールします。

  2. JSON 形式の CI サンプルを .json ファイルとしてワークステーションに保存します。

  3. GuardDuty ポリシーを .guard ファイルとしてワークステーションに保存します。

  4. Guard CLI で、次のコマンドを入力して、Guard ポリシーを使用してサンプル JSON ファイルを検証します。

    cfn-guard validate \ -r guard-s3.guard \ -d s3bucket-prod-pass.json

AWS Config カスタムルールのデバッグ

ガードポリシーで、EnableDebugLogDelivery値を に変更しますtrue。デフォルト値は false です。ログメッセージは Amazon CloudWatch に保存されます。

関連リソース

AWS ドキュメント

AWS ブログ投稿とワークショップ

その他のリソース