Auf dieser Seite wird erläutert, wie Sie eine benutzerdefinierte Moduldefinition mit der Common Expression Language (CEL) und YAML codieren.
Verwenden Sie die Google Cloud CLI, um Ihre benutzerdefinierten Moduldefinitionen in Security Health Analytics hochzuladen.
In der YAML-Datei besteht eine Definition für ein benutzerdefiniertes Modul aus einer strukturierten Reihe von Eigenschaften, mit denen Sie die folgenden Elemente eines benutzerdefinierten Security Health Analytics-Moduls definieren:
- Die zu scannenden Ressourcen.
- Die zu verwendende Erkennungslogik.
- Informationen, die Sie Ihren Sicherheitsteams zur Verfügung stellen müssen, damit sie das erkannte Problem schnell verstehen, priorisieren und beheben können.
Die spezifischen erforderlichen und optionalen Eigenschaften, aus denen eine YAML-Definition besteht, werden unter Coding-Schritte behandelt.
Vermeiden Sie redundante Sensoren.
Um die Anzahl der Ergebnisse zu steuern, sollten Sie keine Module erstellen und ausführen, die redundante Funktionen enthalten.
Wenn Sie beispielsweise ein benutzerdefiniertes Modul erstellen, das nach Verschlüsselungsschlüsseln sucht, die nach 30 Tagen nicht rotiert werden, sollten Sie den integrierten Security Health Analytics-Detektor KMS_KEY_NOT_ROTATED
deaktivieren, da seine Prüfung mit einem Wert von 90 Tagen überflüssig wäre.
Weitere Informationen zum Deaktivieren von Detektoren finden Sie unter Detektoren aktivieren und deaktivieren.
Programmierschritte
Sie codieren die Definition eines benutzerdefinierten Moduls für Security Health Analytics als eine Reihe von YAML-Eigenschaften, von denen einige CEL-Ausdrücke enthalten.
So codieren Sie ein benutzerdefiniertes Definitionsmodul:
Erstellen Sie eine Textdatei mit der Dateinamenserweiterung
yaml
.Erstellen Sie in der Textdatei eine
resource_selector
-Property und geben Sie einen bis fünf Ressourcentypen für das benutzerdefinierte Modul an, das gescannt werden soll. Ein Ressourcentyp kann in einer benutzerdefinierten Moduldefinition nicht mehrmals angegeben werden. Beispiel:resource_selector: resource_types: ‐ cloudkms.googleapis.com/CryptoKey
Die von Ihnen angegebenen Ressourcentypen müssen von Security Command Center unterstützt werden. Eine Liste der unterstützten Ressourcentypen finden Sie unter Unterstützte Ressourcentypen.
Erstellen Sie eine
predicate
-Property und geben Sie einen oder mehrere CEL-Ausdrücke an, mit denen Eigenschaften der zu scannenden Ressourcentypen geprüft werden. Alle Properties, auf die Sie in den CEL-Ausdrücken verweisen, müssen in der Google Cloud API-Definition jedes Ressourcentyps vorhanden sein, den Sie unterresource_selector
angeben. Damit ein Ergebnis ausgelöst wird, muss der Ausdruck aufTRUE
verweisen. Im folgenden Ausdruck lösen beispielsweise nurrotationPeriod
-Werte, die größer als2592000s
sind, eine Abweichung aus.predicate: expression: resource.rotationPeriod > duration("2592000s")
Hilfe beim Schreiben von CEL-Ausdrücken finden Sie in den folgenden Ressourcen:
- Unterstützte Ressourcentypen Klicken Sie auf die einzelnen Ressourcen, um die Attribute zu sehen, die Sie in Ihren CEL-Ausdrücken verwenden können.
- CEL-Ausdrücke schreiben
- Verweise auf Ressourcen- und Richtlinieneigenschaften in benutzerdefinierten Modulen
Erstellen Sie eine
description
-Property, in der die Sicherheitslücke oder Fehlkonfiguration erläutert wird, die vom benutzerdefinierten Modul erkannt wird. Diese Erklärung wird bei jeder gefundenen Instanz angezeigt, damit Prüfer das erkannte Problem besser nachvollziehen können. Der Text muss in Anführungszeichen gesetzt werden. Beispiel:description: "The rotation period of the identified cryptokey resource exceeds 30 days, the maximum rotation period that our security guidelines allow."
Erstellen Sie eine
recommendation
-Property, in der beschrieben wird, wie das erkannte Problem behoben werden kann. In der gcloud CLI ist vor bestimmten Zeichen wie Anführungszeichen ein Escape-Zeichen erforderlich. Im folgenden Beispiel wird gezeigt, wie mit dem umgekehrten Schrägstrich jedes Anführungszeichen-Set entkommentiert wird:recommendation: "To fix this issue go to https://console.cloud.google.com/security/kms. Click the key-ring that contains the key. Click the key. Click \"Edit rotation period\". Then set the rotation period to at most 30 days."
Wenn Sie ein benutzerdefiniertes Modul mit der Google Cloud Console erstellen oder aktualisieren, sind keine Escape-Zeichen erforderlich.
Erstellen Sie ein
severity
-Attribut und geben Sie die Standardschwere für die von diesem Modul erstellten Ergebnisse an. Gängige Werte für die Eigenschaftseverity
sindLOW
,MEDIUM
,HIGH
undCRITICAL
. Beispiel:severity: MEDIUM
Optional können Sie eine
custom_output
-Property erstellen und zusätzliche Informationen angeben, die mit jeder Feststellung zurückgegeben werden sollen. Geben Sie die Informationen als ein oder mehrere Name/Wert-Paare an. Sie können entweder den Wert einer Property der gescannten Ressource oder einen Literalstring zurückgeben. Unterkünfte müssen alsresource.PROPERTY_NAME
angegeben werden. Literalstrings müssen in Anführungszeichen gesetzt werden. Im folgenden Beispiel wird einecustom_output
-Definition gezeigt, die sowohl einen Attributwert, den Wert vonrotationPeriod
in der gescanntenCryptoKey
-Ressource, als auch einen Textstring,"Excessive rotation period for CryptoKey"
, zurückgibt:custom_output: properties: - name: duration value_expression: expression: resource.rotationPeriod - name: note value_expression: expression: "Excessive rotation period for CryptoKey"
Speichern Sie die Datei an einem Speicherort, auf den die gcloud CLI zugreifen kann.
Laden Sie die Definition mit dem folgenden Befehl in Security Health Analytics hoch:
gcloud scc custom-modules sha create \ --organization=organizations/ORGANIZATION_ID \ --display-name="MODULE_DISPLAY_NAME" \ --enablement-state="ENABLED" \ --custom-config-from-file=DEFINITION_FILE_NAME.yaml
Ersetzen Sie die folgenden Werte:
ORGANIZATION_ID
durch die ID der übergeordneten Organisation des benutzerdefinierten Moduls ersetzen oder das Flag--organization
durch--folders
oder--project
ersetzen und die ID des übergeordneten Ordners oder Projekts angeben.MODULE_DISPLAY_NAME
mit einem Namen, der als Ergebniskategorie angezeigt wird, wenn das benutzerdefinierte Modul Ergebnisse zurückgibt. Der Name muss zwischen 1 und 128 Zeichen lang sein und mit einem Kleinbuchstaben beginnen. Er darf nur alphanumerische Zeichen oder Unterstriche enthalten.DEFINITION_FILE_NAME
durch den Pfad und den Dateinamen der YAML-Datei ersetzen, die die Definition des benutzerdefinierten Moduls enthält.
Weitere Informationen zur Arbeit mit benutzerdefinierten Security Health Analytics-Modulen finden Sie unter Benutzerdefinierte Module für Security Health Analytics verwenden.
Latenzen für neue benutzerdefinierte Module prüfen
Das Erstellen eines benutzerdefinierten Moduls löst keinen neuen Scan aus.
In Security Health Analytics wird ein neues benutzerdefiniertes Modul erst dann verwendet, wenn einer der folgenden Fälle eintritt:
- Beim ersten Batch-Scan nach dem Erstellen des benutzerdefinierten Moduls. Je nachdem, wann Sie ein benutzerdefiniertes Modul in Ihrem Zeitplan für Batch-Scans erstellen, kann es bis zu 24 Stunden dauern, bis es in Security Health Analytics verwendet wird.
- Eine Änderung an einer Zielressource löst einen Echtzeit-Scan aus.
Beispiel für eine benutzerdefinierte Moduldefinition
Das folgende Beispiel zeigt eine fertige Definition eines benutzerdefinierten Moduls,das ein Ergebnis auslöst,wenn der Wert des Attributs rotationPeriod
einer cloudkms.googleapis.com/CryptoKey
-Ressource mehr als 2.592.000 Sekunden (30 Tage) beträgt. Im Beispiel werden im Abschnitt custom_output
zwei optionale Werte zurückgegeben: der Wert von resource.rotationPeriod
und eine Notiz als Textstring.
Beachten Sie in diesem Beispiel die folgenden Elemente:
- Die Art des zu prüfenden Assets oder der zu prüfenden Ressource ist im Abschnitt
resource_selector
unterresource_types
aufgeführt. - Die Prüfung, die das Modul an den Ressourcen durchführt, also seine Erkennungslogik, wird im Abschnitt
predicate
definiert, der vonexpression
vorangestellt wird. - Im Abschnitt
custom_output
sind zwei benutzerdefinierte Quelleigenschaften definiert:duration
undviolation
. - Eine Erklärung des erkannten Problems finden Sie in der Property
description
. - Eine Anleitung zur Behebung des erkannten Problems finden Sie in der Property
recommendation
. Da in der Anleitung Anführungszeichen verwendet werden, ist vor jedem Anführungszeichen ein umgekehrter Schrägstrich als Escape-Zeichen erforderlich.
severity: HIGH
description: "Regular key rotation helps provide protection against
compromised keys, and limits the number of encrypted messages available
to cryptanalysis for a specific key version."
recommendation: "To fix this issue go to
https://console.cloud.google.com/security/kms. Click the key-ring that
contains the key. Click the key. Click \"Edit rotation period\". Then
set the rotation period to at most 30 days."
resource_selector:
resource_types:
- cloudkms.googleapis.com/CryptoKey
predicate:
expression: resource.rotationPeriod > duration("2592000s")
custom_output:
properties:
- name: duration
value_expression:
expression: resource.rotationPeriod
- name: violation
value_expression:
expression:
"Excessive rotation period for CryptoKey"
Ressourcen- und Richtlinieneigenschaften in benutzerdefinierten Modulen referenzieren
Unabhängig davon, welche Methode Sie zum Erstellen eines benutzerdefinierten Moduls verwenden – über die Google Cloud Console oder indem Sie die Definition selbst schreiben –, müssen Sie die Eigenschaften, die Sie im benutzerdefinierten Modul auswerten können, nachschlagen können. Außerdem müssen Sie wissen, wie Sie in einer benutzerdefinierten Moduldefinition auf diese Properties verweisen.
Eigenschaften einer Ressource oder Richtlinie finden
Die Eigenschaften einer Google Cloud-Ressource werden in der API-Definition der Ressource definiert. Sie finden diese Definition, indem Sie unter Unterstützte Ressourcentypen auf den Ressourcennamen klicken.
Die Eigenschaften einer Richtlinie finden Sie in der IAM API-Referenzdokumentation. Informationen zu den Eigenschaften einer Richtlinie finden Sie unter Richtlinie.
Auf eine Ressourceneigenschaft in einer benutzerdefinierten Moduldefinition verweisen
Wenn Sie ein benutzerdefiniertes Modul erstellen, müssen alle direkten Verweise auf die Property einer gescannten Ressource mit resource
beginnen, gefolgt von allen übergeordneten Properties und schließlich der Ziel-Property. Die Eigenschaften werden durch einen Punkt getrennt, wobei die Punktnotation in JSON-Form verwendet wird.
Im Folgenden finden Sie Beispiele für Ressourceneigenschaften und wie sie abgerufen werden können:
resourceName
: Der vollständige Name einer Ressource wird in Cloud Asset Inventory gespeichert, z. B.//cloudresourcemanager.googleapis.com/projects/296605646631
.resource.rotationPeriod
: wobeirotationPeriod
eine Eigenschaft vonresource
ist.resource.metadata.name
: wobeiname
eine untergeordnete Property vonmetadata
ist, die wiederum eine untergeordnete Property vonresource
ist.
IAM-Richtlinieneigenschaften als Referenz verwenden
Sie können CEL-Ausdrücke erstellen, die die IAM-Richtlinie einer Ressource auswerten, indem Sie auf die IAM-Richtlinienattribute der Ressource verweisen. Die einzigen verfügbaren Eigenschaften sind Bindungen und Rollen innerhalb von Bindungen.
Bei Verweis auf IAM-Richtlinieneigenschaften ist policy
die oberste Property.
Im Folgenden finden Sie Beispiele für IAM-Richtlinieneigenschaften und deren Abruf:
policy.bindings
, wobeibindings
ein Attribut vonpolicy
ist.policy.version
, wobeiversion
ein Attribut vonpolicy
ist.
Weitere Beispiele finden Sie unter Beispiel-CEL-Ausdrücke.
Informationen zu den Eigenschaften einer Richtlinie finden Sie unter Richtlinie.
CEL-Ausdrücke schreiben
Wenn Sie ein benutzerdefiniertes Modul erstellen, verwenden Sie CEL-Ausdrücke, um die Eigenschaften der gescannten Ressource zu bewerten. Optional können Sie auch CEL-Ausdrücke verwenden, um benutzerdefinierte name
-value
-Paare zu definieren, die zusätzliche Informationen zu Ihren Ergebnissen zurückgeben.
Ganz gleich, ob Sie ein benutzerdefiniertes Modul in der Google Cloud Console erstellen oder die Definition des benutzerdefinierten Moduls selbst in einer YAML-Datei schreiben, die von Ihnen definierten CEL-Ausdrücke sind identisch.
CEL-Ausdrücke für Erkennungslogik
Sie codieren die Erkennungslogik eines benutzerdefinierten Moduls mit CEL-Ausdrücken mit Standard-CEL-Operatoren, um die Eigenschaften der gescannten Ressourcen zu bewerten.
Ihre Ausdrücke können einfache Prüfungen eines einzelnen Werts oder komplexere zusammengesetzte Ausdrücke sein, die mehrere Werte oder Bedingungen prüfen. In beiden Fällen muss der Ausdruck in einen booleschen Wert true
aufgelöst werden, um eine Meldung auszulösen.
Wenn Sie ein benutzerdefiniertes Modul in der Google Cloud Console erstellen, schreiben Sie diese Ausdrücke im Ausdruckseditor auf der Seite Modul konfigurieren.
Wenn Sie ein benutzerdefiniertes Modul in einer YAML-Datei codieren, fügen Sie diese Ausdrücke unter der Eigenschaft predicate
hinzu.
Unabhängig davon, ob Sie die Google Cloud Console oder eine YAML-Datei verwenden, müssen CEL-Ausdrücke, die Ressourceneigenschaften auswerten, den folgenden Regeln entsprechen:
- Die in einem CEL-Ausdruck angegebenen Eigenschaften müssen Attribute der gescannten Ressource sein, wie in der API-Definition des Ressourcentyps definiert.
Wenn in einem benutzerdefinierten Modul mehrere Ressourcentypen ausgewertet werden, müssen die in den CEL-Ausdrücken angegebenen Eigenschaften für jeden Ressourcentyp identisch sein, der vom benutzerdefinierten Modul ausgewertet wird.
Wenn Sie beispielsweise ein benutzerdefiniertes Modul namens
invalid_cryptokey
definieren, das zwei Ressourcentypen prüft:cloudkms.googleapis.com/CryptoKey
undcloudkms.googleapis.com/CryptoKeyVersion
, können Sie den folgenden Ausdruck schreiben, da sowohl der RessourcentypCryptoKey
als auchCryptoKeyVersion
das Attributname
enthalten:predicate: resource.name.matches("projects/project1/locations/us-central1/keyRings/keyring1/cryptoKeys/.*")
Der folgende Ausdruck kann jedoch nicht im benutzerdefinierten
invalid_cryptokey
-Modul angegeben werden, da die EigenschaftenimportTime
undrotationPeriod
, die vom Ausdruck ausgewertet werden, nicht für beide Ressourcentypen gemeinsam sind:predicate: resource.importTime >= timestamp("2022-10-02T15:01:23Z") || resource.rotationPeriod > duration("2592000s")
Alle Enumerationen in einem CEL-Ausdruck müssen als Strings dargestellt werden. Der folgende Ausdruck ist beispielsweise für den Ressourcentyp
cloudkms.googleapis.com/CryptoKeyVersion
gültig:resource.state = "PENDING_GENERATION"
Das Ergebnis der CEL-Ausdrücke, die Sie in der Property
predicate
definieren, muss ein boolescher Wert sein. Eine Meldung wird nur ausgelöst, wenn das Ergebnistrue
ist.
Weitere Informationen zu CEL finden Sie hier:
Beispiel-CEL-Ausdrücke
In der folgenden Tabelle sind einige CEL-Ausdrücke aufgeführt, mit denen sich Ressourceneigenschaften bewerten lassen. Sie können sie sowohl in der Google Cloud Console als auch in YAML-Beschreibungen für benutzerdefinierte Module verwenden.
Ressourcentyp | Erklärung | CEL-Ausdruck |
---|---|---|
Alle Ressourcen mit einer IAM-Richtlinie | IAM-Richtlinienprüfung zur Identifizierung von Mitgliedern außerhalb der Domain | !policy.bindings.all(binding, binding.members.all(m ,!m.endsWith('@gmail.com'))) |
cloudkms.googleapis.com/CryptoKey |
Prüfung der Cloud KMS-Schlüsselrotation | has(resource.rotationPeriod) && resource.rotationPeriod > duration('60h') |
Mehrere Ressourcentypen mit einer einzelnen Richtlinie | Prüfen, ob der Ressourcenname je nach Ressourcentyp mit dev oder devAccess beginnt |
(resource.type == 'compute.googleapis.com/Disk' &&
resource.name.startsWith('projects/PROJECT_ID/regions/
REGION/disks/devAccess')) || (resource.type ==
'compute.googleapis.com/Instance ' &&
resource.name.startsWith('projects/PROJECT_ID/zones/REGION/instances/dev-')) |
compute.googleapis.com/Network |
Virtual Private Cloud-Peering-Regel zum Abgleichen von Netzwerk-Peers | resource.selfLink.matches('https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/networks/default') || resource.peerings.exists(p, p.network.matches('https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/networks/shared$')) |
cloudfunctions.googleapis.com/CloudFunction |
Nur internen eingehenden Traffic für Cloud Run-Funktion zulassen | has(resource.ingressSettings) && resource.ingressSettings.matches('ALLOW_INTERNAL_ONLY') |
compute.googleapis.com/Instance |
Ressourcenname stimmt mit Muster überein | resource.name.matches('^gcp-vm-(linux|windows)-v\\d+$') |
serviceusage.googleapis.com/Service |
Nur Speicher-bezogene APIs aktivieren | resource.state == 'ENABLED' && !( resource.name.matches('storage-api.googleapis.com') || resource.name.matches('bigquery-json.googleapis.com') || resource.name.matches('bigquery.googleapis.com') || resource.name.matches('sql-component.googleapis.com') || resource.name.matches('spanner.googleapis.com'))
|
sqladmin.googleapis.com/Instance
|
Nur öffentliche IP-Adressen auf der Zulassungsliste sind zulässig | (resource.instanceType == 'CLOUD_SQL_INSTANCE' && resource.backendType == 'SECOND_GEN' && resource.settings.ipConfiguration.ipv4Enabled ) && !(resource.ipAddresses.all(ip, ip.type != 'PRIMARY' || ip.ipAddress.matches('IP_ADDRESS'))))
|
dataproc.googleapis.com/Cluster |
Prüfen, ob Projekt-IDs in einem Dataproc-Cluster die Unterstrings „testing“ oder „development“ enthalten | has(resource.projectId) && resource.projectId.contains('testing') || resource.projectId.contains('development') |
CEL-Ausdrücke für benutzerdefinierte Ergebnisattribute
Optional können Sie bis zu zehn benutzerdefinierte Properties definieren, die mit den Ergebnissen zurückgegeben werden, die in Suchanfragen verwendet werden können.
Die benutzerdefinierten Properties werden in den Quellattributen des Ergebnisses in der JSON-Datei und auf dem Tab Quellattribute der Ergebnisdetails in der Google Cloud Console angezeigt.
Sie definieren benutzerdefinierte Properties als name
-value
-Paare.
Wenn Sie ein benutzerdefiniertes Modul in der Google Cloud Console erstellen, definieren Sie die name
-value
-Paare auf der Seite Ergebnisdetails definieren im Abschnitt Eigenschaften für benutzerdefinierte Ergebnisse.
Wenn Sie ein benutzerdefiniertes Modul in einer YAML-Datei codieren, listen Sie die name
-value
-Paare unter der Eigenschaft custom_output
als properties
auf.
Unabhängig davon, ob Sie die Google Cloud Console oder eine YAML-Datei verwenden, gelten die folgenden Regeln:
- Geben Sie
name
als Textstring ohne Anführungszeichen an. Geben Sie
value
als eine der folgenden Optionen an:Wenn Sie den Wert eines Attributs zurückgeben möchten, geben Sie das Attribut im folgenden Format an:
RESOURCE_TYPE.PROPERTY.PROPERTY_TO_RETURN
Im Beispiel gilt Folgendes:
RESOURCE_TYPE
kann entwederresource
oderpolicy
sein.PROPERTY
eine oder mehrere übergeordnete Properties der Property, die den zurückzugebenden Wert enthält.PROPERTY_TO_RETURN
ist die Property, die den zurückzugebenden Wert enthält.Wenn Sie einen Textstring zurückgeben möchten, setzen Sie ihn in Anführungszeichen.
Das folgende Beispiel zeigt zwei name
-value
-Paare, die in einer YAML-Datei unter custom_output
korrekt definiert sind:
custom_output: properties: - name: duration value_expression: expression: resource.name - name: property_with_text value_expression: expression: "Note content"
Nächste Schritte
Informationen zum Testen, Einreichen, Ansehen und Aktualisieren benutzerdefinierter Module finden Sie auf den folgenden Seiten:
- Wie Sie benutzerdefinierte Module testen, erfahren Sie unter Benutzerdefinierte Module für Security Health Analytics testen.
- Informationen zum Hochladen, Ansehen und Aktualisieren benutzerdefinierter Module finden Sie unter Benutzerdefinierte Module für Security Health Analytics erstellen und verwalten.