Auf dieser Seite wird erklärt, wie Sie eine benutzerdefinierte Moduldefinition mit der Common Expression Language (CEL) und YAMLcodieren.
Verwenden Sie die Google Cloud CLI, um Ihre benutzerdefinierten Moduldefinitionen in Security Health Analytics hochzuladen.
In der YAML-Datei besteht eine benutzerdefinierte Moduldefinition aus einer strukturierten Gruppe von Attributen, mit denen Sie die folgenden Elemente eines benutzerdefinierten Security Health Analytics-Moduls definieren:
- Die zu scannenden Ressourcen.
- Die zu verwendende Erkennungslogik.
- Die Informationen, die Sie Ihren Sicherheitsteams zur Verfügung stellen, damit sie das erkannte Problem schnell verstehen, priorisieren und beheben können.
Die spezifischen erforderlichen und optionalen Attribute, aus denen eine YAML-Definition besteht werden unter Codierungsschritte behandelt.
Redundante Detektoren vermeiden
Um das Ergebnisvolumen 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 wurden, sollten Sie den integrierten Security Health Analytics-Detektor KMS_KEY_NOT_ROTATED deaktivieren, da die 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.
Codierungsschritte
Sie codieren die Definition eines benutzerdefinierten Moduls für Security Health Analytics als eine Reihe von YAML-Attributen, von denen einige CEL-Ausdrücke enthalten.
So codieren Sie ein benutzerdefiniertes Modul:
Erstellen Sie eine Textdatei mit der Dateinamenerweiterung
yaml.Erstellen Sie in der Textdatei ein
resource_selector-Attribut und geben Sie ein bis fünf Ressourcentypen an, die vom benutzerdefinierten Modul gescannt werden sollen. Ein Ressourcentyp kann in einer benutzerdefinierten Moduldefinition nur einmal 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 ein
predicate-Attribut und geben Sie einen oder mehrere CEL-Ausdrücke an, die die Attribute der zu scannenden Ressourcentypen prüfen. Alle Attribute , auf die Sie in den CEL-Ausdrücken verweisen, müssen in der Google Cloud API-Definition jedes Ressourcentyps vorhanden sein, den Sie unterresource_selectorangeben. Damit ein Ergebnis ausgelöst wird, muss der Ausdruck inTRUEaufgelöst werden. Im folgenden Ausdruck lösen beispielsweise nurrotationPeriod-Werte, die größer als2592000ssind, ein Ergebnis 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 jede Ressource, um die Attribute zu sehen, die Sie in Ihren CEL-Ausdrücken verwenden können.
- CEL-Ausdrücke schreiben.
- Auf Ressourcen- und Richtlinienattribute in benutzerdefinierten Modulen verweisen.
Erstellen Sie ein
description-Attribut, in dem die Sicherheitslücke oder Fehlkonfiguration erläutert wird, die vom benutzerdefinierten Modul erkannt wird. Diese Erklärung wird in jeder Ergebnisinstanz angezeigt, damit Prüfer das erkannte Problem verstehen 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 ein
recommendation-Attribut, in dem erklärt wird, wie das erkannte Problem behoben werden kann. Die gcloud CLI erfordert ein Escapezeichen vor bestimmten Zeichen wie Anführungszeichen. Im folgenden Beispiel wird der umgekehrte Schrägstrich verwendet, um jedes Paar von Anführungszeichen zu maskieren: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 über die Google Cloud Console erstellen oder aktualisieren, sind keine Escapezeichen erforderlich.
Erstellen Sie ein
severity-Attribut und geben Sie den Standard-Schweregrad für die Ergebnisse an, die von diesem Modul erstellt werden. Häufig verwendete Werte für dasseverity-Attribut sindLOW,MEDIUM,HIGHundCRITICAL. Beispiel:severity: MEDIUM
Optional können Sie ein
custom_output-Attribut erstellen und zusätzliche Informationen angeben, die mit jedem Ergebnis zurückgegeben werden sollen. Geben Sie die zurückzugebenden Informationen als ein oder mehrere Name-Wert-Paare an. Sie können entweder den Wert eines Attributs der gescannten Ressource oder einen Literalstring zurückgeben. Attribute müssen alsresource.PROPERTY_NAMEangegeben werden. Literalstrings müssen in Anführungszeichen gesetzt werden. Das folgende Beispiel zeigt einecustom_outputDefinition, die sowohl einen Attributwert, den Wert vonrotationPeriodin der gescanntenCryptoKeyRessource, als auch einen Textstring zurückgibt:"Excessive rotation period for CryptoKey":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 Ihre 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.yamlErsetzen Sie die folgenden Werte:
ORGANIZATION_IDdurch die ID der übergeordneten Organisation des benutzerdefinierten Moduls oder ersetzen Sie das Flag--organizationdurch--foldersoder--projectund geben Sie die ID des übergeordneten Ordners oder Projekts an.MODULE_DISPLAY_NAMEdurch einen Namen, der als Ergebniskategorie angezeigt werden soll, wenn das benutzerdefinierte Modul Ergebnisse zurückgibt. Der Name muss zwischen 1 und 128 Zeichen lang sein, mit einem Kleinbuchstaben beginnen und nur alphanumerische Zeichen oder Unterstriche enthalten.DEFINITION_FILE_NAMEdurch den Pfad und den Dateinamen der YAML-Datei, die die Definition des benutzerdefinierten Moduls enthält.
Weitere Informationen zur Verwendung benutzerdefinierter Module von Security Health Analytics finden Sie unter Benutzerdefinierte Module für Security Health Analytics verwenden.
Scanlatenzen für neue benutzerdefinierte Module
Durch das Erstellen eines benutzerdefinierten Moduls wird kein neuer Scan ausgelöst.
Security Health Analytics verwendet ein neues benutzerdefiniertes Modul erst, wenn eine der folgenden Bedingungen erfüllt ist:
- Der erste Batch-Scan nach dem Erstellen des benutzerdefinierten Moduls. Je nachdem, wann Sie ein benutzerdefiniertes Modul in Ihrem Batch-Scan-Zeitplan erstellen, müssen Sie möglicherweise bis zu 24 Stunden warten, bis Security Health Analytics das benutzerdefinierte Modul verwendet.
- Eine Änderung an einer Zielressource löst einen Echtzeit-Scan aus.
Beispiel für eine benutzerdefinierte Moduldefinition
Das folgende Beispiel zeigt eine vollständige benutzerdefinierte Moduldefinition,die ein Ergebnis auslöst,wenn der Wert des rotationPeriod-Attributs einer cloudkms.googleapis.com/CryptoKey-Ressource größer als 2.592.000 Sekunden (30 Tage) ist. Im Beispiel werden zwei optionale Werte im Abschnitt custom_output zurückgegeben: der Wert von resource.rotationPeriod und ein Hinweis als Textstring.
Beachten Sie im Beispiel die folgenden Elemente:
- Der Typ des zu prüfenden Assets oder der zu prüfenden Ressource ist im Abschnitt
resource_selectorunterresource_typesaufgeführt. - Die Prüfung, die das Modul für die Ressourcen ausführt, die Erkennungslogik,
wird im Abschnitt
predicatedefiniert, demexpressionvorangestellt ist. - Im Abschnitt
custom_outputsind zwei benutzerdefinierte Quellattribute definiert:durationundviolation. - Die Erklärung des erkannten Problems wird im Attribut
descriptionangegeben. - Die Anleitung zur Behebung des erkannten Problems wird im Attribut
recommendationangegeben. Da in der Anleitung Anführungszeichen vorkommen, ist vor jedem Anführungszeichen ein umgekehrter Schrägstrich als Escapezeichen 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'"
Auf Ressourcen- und Richtlinienattribute in benutzerdefinierten Modulen verweisen
Unabhängig davon, mit welcher Methode Sie ein benutzerdefiniertes Modul erstellen – über die Google Cloud Console oder durch Schreiben der Definition – müssen Sie die Attribute nachschlagen können, die Sie im benutzerdefinierten Modul auswerten können. Außerdem müssen Sie wissen, wie Sie in einer benutzerdefinierten Moduldefinition auf diese Attribute verweisen.
Attribute einer Ressource oder Richtlinie finden
Die Attribute einer Google Cloud Ressource sind in der API Definition der Ressource definiert. Sie finden diese Definition, indem Sie auf der SeiteUnterstützte Ressourcentypenauf den Ressourcennamen klicken.
Die Attribute einer Richtlinie finden Sie in der IAM API-Referenzdokumentation. Informationen zu den Attributen einer Richtlinie finden Sie unter Richtlinie.
In einer benutzerdefinierten Moduldefinition auf ein Ressourcenattribut verweisen
Wenn Sie ein benutzerdefiniertes Modul erstellen, müssen alle direkten Verweise auf das Attribut einer gescannten Ressource mit resource beginnen, gefolgt von allen übergeordneten Attributen und schließlich dem Zielattribut. Die Attribute werden durch einen Punkt getrennt, wobei die JSON-Punktnotation verwendet wird.
Im Folgenden finden Sie Beispiele für Ressourcenattribute und wie sie abgerufen werden können:
resourceName: Speichert den vollständigen Namen einer Ressource in Cloud Asset Inventory, z. B.//cloudresourcemanager.googleapis.com/projects/296605646631.resource.rotationPeriod: wobeirotationPeriodein Attribut vonresourceist.resource.metadata.name: wobeinameein Unterattribut vonmetadataist, das ein Unterattribut vonresourceist.
Auf IAM-Richtlinienattribute verweisen
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 Attribute sind Bindungen und Rollen innerhalb von Bindungen.
Beim Verweisen auf IAM-Richtlinienattribute ist policy das Attribut der obersten Ebene.
Im Folgenden finden Sie Beispiele für IAM-Richtlinienattribute und wie sie abgerufen werden können:
policy.bindings, wobeibindingsein Attribut vonpolicyist.policy.version, wobeiversionein Attribut vonpolicyist.
Weitere Beispiele finden Sie unter Beispiel-CEL-Ausdrücke.
Informationen zu den Attributen einer Richtlinie finden Sie unter Richtlinie.
CEL-Ausdrücke schreiben
Wenn Sie ein benutzerdefiniertes Modul erstellen, verwenden Sie CEL-Ausdrücke, um die Attribute der gescannten Ressource auszuwerten. Optional können Sie auch CEL-Ausdrücke verwenden, um benutzerdefinierte name-value-Paare zu definieren, die zusätzliche Informationen mit Ihren Ergebnissen zurückgeben.
Unabhängig davon, ob Sie ein benutzerdefiniertes Modul in der Google Cloud Konsole erstellen oder Ihre benutzerdefinierte Moduldefinition selbst in einer YAML-Datei schreiben, sind die von Ihnen definierten CEL-Ausdrücke identisch.
CEL-Ausdrücke für die Erkennungslogik
Sie codieren die Erkennungslogik eines benutzerdefinierten Moduls mit CEL-Ausdrücken und Standard-CEL-Operatoren, um die Attribute der gescannten Ressourcen auszuwerten.
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 ein Ergebnis auszulösen.
Wenn Sie ein benutzerdefiniertes Modul in der Google Cloud Console erstellen, schreiben Sie diese Ausdrücke auf der Seite Modul konfigurieren im Ausdruckseditor.
Wenn Sie ein benutzerdefiniertes Modul in einer YAML-Datei codieren, fügen Sie diese Ausdrücke unter dem Attribut predicate hinzu.
Unabhängig davon, ob Sie die Google Cloud Console oder eine YAML Datei verwenden, müssen CEL-Ausdrücke, die Ressourcenattribute auswerten, die folgenden Regeln erfüllen:
- Die in einem CEL-Ausdruck angegebenen Attribute müssen Attribute der gescannten Ressource sein, wie in der API-Definition des Ressourcentyps definiert.
Wenn ein benutzerdefiniertes Modul mehrere Ressourcentypen auswertet, müssen die in den CEL-Ausdrücken angegebenen Attribute für jeden Ressourcentyp, den das benutzerdefinierte Modul auswertet, gleich sein.
Wenn Sie beispielsweise ein benutzerdefiniertes Modul mit dem Namen
invalid_cryptokeydefinieren, das zwei Ressourcentypen prüft:cloudkms.googleapis.com/CryptoKeyundcloudkms.googleapis.com/CryptoKeyVersion, können Sie den folgenden Ausdruck schreiben, da sowohl derCryptoKeyals auch derCryptoKeyVersionRessourcentyp das Attributnameenthalten:predicate: resource.name.matches("projects/project1/locations/us-central1/keyRings/keyring1/cryptoKeys/.*")Sie können jedoch den folgenden Ausdruck nicht im benutzerdefinierten Modul
invalid_cryptokeyangeben, da die AttributeimportTimeundrotationPeriod, die der Ausdruck auswertet, nicht von beiden Ressourcentypen gemeinsam verwendet werden:predicate: resource.importTime >= timestamp("2022-10-02T15:01:23Z") || resource.rotationPeriod > duration("2592000s")Alle Enums in einem CEL-Ausdruck müssen als Strings dargestellt werden. Der folgende Ausdruck ist beispielsweise für den Ressourcentyp
cloudkms.googleapis.com/CryptoKeyVersiongültig:resource.state = "PENDING_GENERATION"
Das Ergebnis der CEL-Ausdrücke, die Sie im Attribut
predicatedefinieren, muss ein boolescher Wert sein. Ein Ergebnis wird nur ausgelöst, wenn das Ergebnistrueist.
Weitere Informationen zu CEL finden Sie unter:
Beispiel-CEL-Ausdrücke
In der folgenden Tabelle sind einige CEL-Ausdrücke aufgeführt, die zum Auswerten von Ressourcenattributen verwendet werden können. Sie können sie sowohl in der Google Cloud Console als auch in benutzerdefinierten YAML-Moduldefinitionen verwenden.
| Ressourcentyp | Erklärung | CEL-Ausdruck |
|---|---|---|
| Jede Ressource 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 des Rotationszeitraums für Cloud KMS-Schlüssel | 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 |
VPC-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 |
Der Ressourcenname entspricht dem Muster | resource.name.matches('^gcp-vm-(linux|windows)-v\\d+$') |
serviceusage.googleapis.com/Service |
Nur die Aktivierung von speicherbezogenen APIs zulassen | 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 Managed Service for Apache Spark-Cluster die Teilstrings „testing“ oder „development“ enthalten | has(resource.projectId) && resource.projectId.contains('testing') || resource.projectId.contains('development') |
CEL-Ausdrücke für benutzerdefinierte Ergebniseigenschaften
Optional können Sie bis zu zehn benutzerdefinierte Attribute definieren, die mit den Ergebnissen zurückgegeben werden sollen, die von Ihren benutzerdefinierten Modulen generiert werden. Diese Attribute können in Ergebnisabfragen verwendet werden.
Die benutzerdefinierten Attribute werden in den Quellattributen des Ergebnisses im JSON-Format und in der Console auf dem Tab Quellattribute der Ergebnisdetails angezeigt. Google Cloud
Sie definieren benutzerdefinierte Attribute als name-value-Paare.
Wenn Sie ein benutzerdefiniertes Modul in der Google Cloud Konsole erstellen,
definieren Sie die name-value Paare auf der Seite Ergebnisdetails definieren im Abschnitt Benutzerdefinierte Ergebniseigenschaften.
Wenn Sie ein benutzerdefiniertes Modul in einer YAML-Datei codieren, listen Sie die name-value-Paare als properties unter dem Attribut custom_output auf.
Unabhängig davon, ob Sie die Google Cloud Console oder eine YAML Datei verwenden, gelten die folgenden Regeln:
- Geben Sie
nameals Textstring ohne Anführungszeichen an. Geben Sie
valueals einen der folgenden Werte 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_TYPEkann entwederresourceoderpolicysein.PROPERTYist ein oder mehrere übergeordnete Attribute des Attributs, das den zurückzugebenden Wert enthält.PROPERTY_TO_RETURNist das Attribut, das den zurückzugebenden Wert enthält.Wenn Sie einen Textstring zurückgeben möchten, setzen Sie den String in Anführungszeichen.
Das folgende Beispiel zeigt zwei name-value-Paare, die unter custom_output in einer YAML-Datei 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:
- Informationen zum Testen benutzerdefinierter Module finden 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.