Erstellen Sie AWS Config benutzerdefinierte Regeln mithilfe von AWS CloudFormation Guard Richtlinien - AWS Prescriptive Guidance

Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.

Erstellen Sie AWS Config benutzerdefinierte Regeln mithilfe von AWS CloudFormation Guard Richtlinien

Erstellt von Andrew Lok (AWS), Kailash Havildar (AWS), Nicole Brown (AWS) und Tanya Howell (AWS)

aws-config-custom-ruleCode-Repository: -cloudformation-guard

Umgebung: PoC oder Pilot

Technologien: Sicherheit, Identität, Compliance; Management und Unternehmensführung

AWS-Dienste: AWS CloudFormation; AWS Config

Übersicht

AWS ConfigRegeln helfen Ihnen bei der Bewertung Ihrer AWS Ressourcen und ihres Zielkonfigurationsstatus. Es gibt zwei Arten von AWS Config Regeln: verwaltete und benutzerdefinierte Regeln. Sie können benutzerdefinierte Regeln mit AWS Lambda Funktionen oder mit AWS CloudFormation Guard(GitHub), einer policy-as-code Sprache, erstellen.

Mit Guard erstellte Regeln bieten eine detailliertere Steuerung als verwaltete Regeln und sind in der Regel einfacher zu konfigurieren als vollständig benutzerdefinierte Lambda-Regeln. Dieser Ansatz bietet Ingenieuren und Architekten die Möglichkeit, Regeln zu erstellen, ohne Python, NodeJS oder Java kennen zu müssen, die für die Bereitstellung benutzerdefinierter Regeln über Lambda erforderlich sind.

Dieses Muster bietet praktikable Vorlagen, Codebeispiele und Bereitstellungsansätze, die Sie bei der Einführung benutzerdefinierter Regeln mit Guard unterstützen. Mithilfe dieses Musters kann ein Administrator benutzerdefinierte Compliance-Regeln mit Attributen für Konfigurationselemente erstellen. AWS Config Entwickler können beispielsweise Guard-Richtlinien für AWS Config Konfigurationselemente verwenden, um den Status bereitgestellter AWS und nicht vorhandener AWS Ressourcen kontinuierlich zu überwachen, Regelverstöße zu erkennen und automatisch Abhilfemaßnahmen einzuleiten.

Ziele

Nachdem Sie dieses Muster gelesen haben, sollten Sie in der Lage sein:

Voraussetzungen und Einschränkungen

Voraussetzungen

  • Ein aktiver AWS-Konto

  • AWS Config, eingerichtet in Ihrem AWS-Konto

Einschränkungen

  • Benutzerdefinierte Guard-Regeln können nur Schlüssel-Wert-Paare in einem JSON-Datensatz für ein Zielkonfigurationselement abfragen

Architektur

Sie wenden die Guard-Syntax als benutzerdefinierte Richtlinie auf eine AWS Config Regel an. AWS Config erfasst die hierarchische JSON-Datei jeder der angegebenen Ressourcen. Das JSON des AWS Config Konfigurationselements enthält Schlüssel-Wert-Paare. Diese Attribute werden in der Guard-Syntax als Variablen verwendet, die ihrem entsprechenden Wert zugewiesen werden. 

Im Folgenden wird die Guard-Syntax erklärt. Die Variablen aus dem Konfigurationselement JSON werden verwendet und ihnen wird ein % Zeichen vorangestellt.

# 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> }

Szenario 1: Amazon EBS-Volumes

Szenario 1 stellt eine AWS Config benutzerdefinierte Regel bereit, die die Guard-Syntax verwendet, um die Konformität für verschlüsselte Volumes zu überprüfen. Diese Regel überprüft, ob das Laufwerk verwendet wird, und stellt sicher, dass der Laufwerkstyp gp3 ist.

Das Folgende ist ein Beispiel für ein AWS Config Konfigurationselement für Szenario 1. Dieses Konfigurationselement enthält drei Schlüssel-Wert-Paare, die als Variablen in der Guard-Richtlinie verwendet werden: volumestatusvolumeencryptionstatus, und. volumetype Außerdem wird der resourceType Schlüssel in der Guard-Richtlinie als Filter verwendet.

{ "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": {} }

Das Folgende ist ein Beispiel für die Verwendung der Guard-Syntax zur Definition der Variablen und Regeln in Szenario 1. Beachten Sie im folgenden Beispiel Folgendes:

  • Die ersten drei Zeilen definieren die Variablen mithilfe des let Befehls.  Ihnen wird ein Name und ein Wert zugewiesen, die von den Attributen des Konfigurationselements abgeleitet sind.

  • Der compliancecheck Regelblock fügt eine Abhängigkeit vom Typ when hinzu, die nach einem übereinstimmenden resourceType Schlüssel-Wert-Paar sucht. AWS::EC2::Volume Wenn eine Übereinstimmung gefunden wird, durchsucht die Regel die restlichen JSON-Attribute und sucht unter den folgenden drei Bedingungen nach Übereinstimmungen: stateencrypted, und. 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 }

Die vollständige benutzerdefinierte Guard-Richtlinie, die diese benutzerdefinierte Regel implementiert, finden Sie unter awsconfig-guard-cft.yaml oder awsconfig-guard-tf-ec2vol.json im Code-Repository. GitHub HashiCorp Terraform-Code, der diese benutzerdefinierte Richtlinie in Guard bereitstellt, finden Sie unter .json im Code-Repository. awsconfig-guard-tf-example

Szenario 2: Einhaltung GuardDuty

Szenario 2 stellt eine AWS Config benutzerdefinierte Regel bereit, die die Guard-Syntax verwendet, um die GuardDuty Amazon-Konformität zu überprüfen. Diese Regel überprüft, ob bei GuardDuty Rekordern Amazon S3 S3-Schutz und Amazon EKS-Schutz aktiviert sind. Außerdem wird überprüft, ob die GuardDuty Ergebnisse alle 15 Minuten veröffentlicht werden. Dieses Szenario könnte überall AWS-Konten und AWS-Regionen in einer Organisation (in AWS Organizations) eingesetzt werden.

Das Folgende ist ein Beispiel für ein AWS Config Konfigurationselement für Szenario 2. Dieses Konfigurationselement enthält drei Schlüssel-Wert-Paare, die als Variablen in der Guard-Richtlinie verwendet werden: FindingPublishingFrequencyS3Logs, und. Kubernetes Außerdem wird der resourceType Schlüssel in der Richtlinie als Filter verwendet.

{ "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" } }

Im Folgenden finden Sie ein Beispiel für die Verwendung der Guard-Syntax zur Definition der Variablen und Regeln in Szenario 2. Beachten Sie im folgenden Beispiel Folgendes:

  • Die ersten drei Zeilen definieren die Variablen mithilfe des let Befehls.  Ihnen wird ein Name und ein Wert zugewiesen, die von den Attributen des Konfigurationselements abgeleitet sind.

  • Der compliancecheck Regelblock fügt eine Abhängigkeit vom Typ when hinzu, die nach einem übereinstimmenden resourceType Schlüssel-Wert-Paar sucht. AWS::GuardDuty::Detector Wenn eine Übereinstimmung gefunden wird, durchsucht die Regel die restlichen JSON-Attribute und sucht unter den folgenden drei Bedingungen nach Übereinstimmungen: S3Logs.EnableKubernetes.AuditLogs.Enable, und. 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 }

Die vollständige benutzerdefinierte Guard-Richtlinie, die diese benutzerdefinierte Regel implementiert, finden Sie unter awsconfig-guard-cft-gd.yaml im GitHub Code-Repository. HashiCorp Terraform-Code, der diese benutzerdefinierte Richtlinie in Guard bereitstellt, finden Sie unter awsconfig-guard-tf-gd.json im Code-Repository.

Tools

AWS-Services

  • AWS CloudFormationhilft Ihnen dabei, AWS Ressourcen einzurichten, sie schnell und konsistent bereitzustellen und sie während ihres gesamten Lebenszyklus regionsübergreifend zu verwalten. AWS-Konten

  • AWS Configbietet einen detaillierten Überblick über die Ressourcen in Ihrem System AWS-Konto und deren Konfiguration. Es hilft Ihnen zu erkennen, wie Ressourcen miteinander zusammenhängen und wie sich ihre Konfigurationen im Laufe der Zeit geändert haben.

Andere Tools

  • HashiCorp Terraform ist ein Open-Source-Tool für Infrastruktur als Code (IaC), mit dem Sie mithilfe von Code Cloud-Infrastruktur und -Ressourcen bereitstellen und verwalten können.

Code-Repository

Der Code für dieses Muster ist im AWS CloudFormation Guard Repository GitHub AWS Config with verfügbar. Dieses Code-Repository enthält Beispiele für beide in diesem Muster beschriebenen Szenarien.

Epen

AufgabeBeschreibungErforderliche Fähigkeiten

(Optional) Wählen Sie Schlüssel-Wert-Paare für die Regel aus.

Gehen Sie wie folgt vor, wenn Sie eine benutzerdefinierte Guard-Richtlinie definieren. Wenn Sie eine der Beispielrichtlinien für Szenario 1 oder 2 verwenden, überspringen Sie diese Schritte.

  1. Melden Sie sich bei der an AWS Management Console und öffnen Sie die AWS Config Konsole.

  2. Wählen Sie in der linken Navigationsleiste Ressourcen aus.

  3. Wählen Sie im Ressourceninventar den Ressourcentyp aus, für den Sie eine AWS Config benutzerdefinierte Regel erstellen möchten.

  4. Wählen Sie die Option View details aus.

  5. Wählen Sie Konfigurationselement anzeigen (JSON). Dieser Abschnitt wird erweitert und zeigt das Konfigurationselement im JSON-Format an.

  6. Identifizieren Sie die Schlüssel-Wert-Paare, für die Sie eine AWS Config benutzerdefinierte Regel erstellen möchten.

AWS-Administrator, Sicherheitsingenieur

Erstellen Sie die benutzerdefinierte Regel.

Folgen Sie den Anweisungen unter Benutzerdefinierte Richtlinienregeln erstellen, um eine AWS Config benutzerdefinierte Regel zu erstellen, indem Sie die zuvor identifizierten Schlüssel-Wert-Paare verwenden oder eine der bereitgestellten Guard-Beispielrichtlinien verwenden.

AWS-Administrator, Sicherheitsingenieur

Validieren Sie die benutzerdefinierte Regel.

Führen Sie einen der folgenden Schritte aus, um die benutzerdefinierte Guard-Regel zu validieren:

  • Geben Sie den folgenden Befehl in das Feld AWS Command Line Interface (AWS CLI) ein.

    cfn-guard validate -r guard-s3.guard -d s3bucket-prod-pass.json
  • Folgen Sie den Anweisungen im Detektivmodus unter Evaluieren Ihrer Ressourcen mit AWS Config Regeln, um die Regel in zu implementieren AWS Config. Vergewissern Sie sich, dass die Guard-Syntax den entsprechenden Ressourcen im Zielkonto oder in der Zieldatei korrekt entspricht.

AWS-Administrator, Sicherheitsingenieur

Fehlerbehebung

ProblemLösung

Testen Sie die Guard-Richtlinie außerhalb von AWS Config

Unit-Tests können auf Ihrem lokalen Gerät oder in einer integrierten Entwicklungsumgebung (IDE), z. B. einer AWS Cloud9 IDE, durchgeführt werden. Gehen Sie wie folgt vor, um Komponententests durchzuführen:

  1. Installieren Sie die AWS CloudFormation Guard CLI und ihre Abhängigkeiten.

  2. Speichern Sie ein CI-Beispiel im JSON-Format als JSON-Datei auf Ihrer Workstation.

  3. Speichern Sie die GuardDuty Richtlinie als .guard-Datei auf Ihrer Workstation.

  4. Geben Sie in der Guard-CLI den folgenden Befehl ein, um die JSON-Beispieldatei mithilfe der Guard-Richtlinie zu validieren.

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

Debuggen Sie eine AWS Config benutzerdefinierte Regel

Ändern Sie den EnableDebugLogDelivery Wert in Ihrer Guard-Richtlinie intrue. Der Standardwert ist false. Die Protokollnachrichten werden in Amazon gespeichert CloudWatch.

Zugehörige Ressourcen

AWS Dokumentation

AWS Blogbeiträge und Workshops

Sonstige Ressourcen