翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。
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
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) Protection と Amazon 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 属性を続行しencrypted
、state
、、 の 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
シナリオ 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.Enable
、S3Logs.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
ツール
AWS のサービス
AWS CloudFormation は、 AWS リソースをセットアップし、迅速かつ一貫してプロビジョニングし、 AWS アカウント および リージョン全体のライフサイクルを通じてリソースを管理するのに役立ちます。
AWS Config は、 内のリソースの詳細ビュー AWS アカウント と設定方法を提供します。リソースがどのように相互に関連しているか、またそれらの構成が時間の経過とともにどのように変化したかを特定するのに役立ちます。
その他のツール
HashiCorp Terraform
は、コードを使用してクラウドインフラストラクチャとリソースをプロビジョニングおよび管理するためのInfrastructure as Code (IaC) ツールです。
コードリポジトリ
このパターンのコードは、GitHub AWS Config with AWS CloudFormation Guard
エピック
タスク | 説明 | 必要なスキル |
---|---|---|
(オプション) ルールのキーと値のペアを選択します。 | カスタム Guard ポリシーを定義する場合は、以下の手順を実行します。シナリオ 1 または 2 のサンプルポリシーのいずれかを使用している場合は、以下の手順をスキップします。
| AWS 管理者、セキュリティエンジニア |
カスタムルールを作成します。 | 以前に特定したキーと値のペアを使用するか、提供されているサンプル Guard ポリシーのいずれかを使用して、AWS Config 「カスタムポリシールールの作成」の手順に従ってカスタムルールを作成します。 | AWS 管理者、セキュリティエンジニア |
カスタムルールを検証します。 | カスタム Guard ルールを検証するには、次のいずれかを実行します。
| AWS 管理者、セキュリティエンジニア |
トラブルシューティング
問題 | ソリューション |
---|---|
の外部で Guard ポリシーをテストする AWS Config | ユニットテストは、ローカルデバイスまたは IDE などの統合開発環境 (IDE) AWS Cloud9 で実行できます。ユニットテストを実行するには、以下を実行します。
|
AWS Config カスタムルールのデバッグ | ガードポリシーで、 |
関連リソース
AWS ドキュメント
AWS Config カスタムポリシールールの作成 (AWS Config ドキュメント)
AWS CloudFormation Guard ルールの記述 (ガードドキュメント)
AWS ブログ投稿とワークショップ
Introducing AWS CloudFormation Guard 2.0
(AWS ブログ記事)
その他のリソース
AWS CloudFormation Guard
(GitHub) AWS CloudFormation Guard CLI ドキュメント
(GitHub)