Cette page explique comment coder une définition de module personnalisé à l'aide du CEL (Common Expression Language) et de YAML.
Utilisez Google Cloud CLI pour importer vos définitions de modules personnalisés dans Security Health Analytics.
Dans le fichier YAML, une définition de module personnalisé se compose d'un ensemble structuré de propriétés que vous utilisez pour définir les éléments suivants d'un module personnalisé Security Health Analytics :
- Les ressources à analyser.
- La logique de détection à utiliser.
- Les informations à fournir à vos équipes de sécurité afin qu'elles puissent comprendre, trier et résoudre rapidement le problème détecté.
Les propriétés obligatoires et facultatives spécifiques qui composent une définition YAML sont abordées dans la section Étapes de codage.
Éviter de créer des détecteurs redondants
Pour contrôler le volume de résultats, évitez de créer et d'exécuter des modules contenant des fonctionnalités redondantes.
Par exemple, si vous créez un module personnalisé qui recherche les clés de chiffrement qui ne sont pas alternées après 30 jours, envisagez de désactiver le détecteur intégré Security Health Analytics KMS_KEY_NOT_ROTATED, car sa vérification, qui utilise une valeur de 90 jours, serait superflue.
Pour en savoir plus sur la désactivation des détecteurs, consultez la section Activer et désactiver des détecteurs.
Étapes de codage
Vous codez la définition d'un module personnalisé pour Security Health Analytics sous forme de série de propriétés YAML, dont certaines contiennent des expressions CEL.
Pour coder un module de définition personnalisé, procédez comme suit :
Créez un fichier texte avec l'extension de nom de fichier
yaml.Dans le fichier texte, créez une propriété
resource_selectoret spécifiez un à cinq types de ressources à analyser par le module personnalisé. Un type de ressource ne peut pas être spécifié plusieurs fois dans une définition de module personnalisé. Exemple :resource_selector: resource_types: ‐ cloudkms.googleapis.com/CryptoKey
Les types de ressources que vous spécifiez doivent être compatibles avec Security Command Center. Pour obtenir la liste des types de ressources compatibles, consultez la section Types de ressources acceptés.
Créez une propriété
predicateet spécifiez une ou plusieurs expressions CEL qui vérifient les propriétés des types de ressources à analyser. Toutes les propriétés auxquelles vous faites référence dans les expressions CEL doivent exister dans la Google Cloud définition d'API de chaque type de ressource que vous spécifiez sousresource_selector. Pour déclencher un résultat, l'expression doit renvoyerTRUE. Par exemple, dans l'expression suivante, seules les valeursrotationPeriodsupérieures à2592000sdéclenchent un résultat.predicate: expression: resource.rotationPeriod > duration("2592000s")Pour obtenir de l'aide sur la création d'expressions CEL, consultez les ressources suivantes :
- Types de ressources acceptés. Cliquez sur chaque ressource pour afficher les propriétés que vous pouvez utiliser dans vos expressions CEL.
- Écrire des expressions CEL.
- Faire référence aux propriétés des ressources et des règles dans les modules personnalisés.
Créez une propriété
descriptionqui explique la vulnérabilité ou l'erreur de configuration détectée par le module personnalisé. Cette explication apparaît dans chaque instance de résultat pour aider les enquêteurs à comprendre le problème détecté. Le texte doit être placé entre guillemets. Exemple :description: "The rotation period of the identified cryptokey resource exceeds 30 days, the maximum rotation period that our security guidelines allow."
Créez une propriété
recommendationqui explique comment résoudre le problème détecté. Gcloud CLI nécessite un caractère d'échappement avant certains caractères, tels que les guillemets. L'exemple suivant montre l'utilisation de la barre oblique inverse pour échapper chaque ensemble de guillemets :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."Si vous créez ou mettez à jour un module personnalisé à l'aide de la Google Cloud console, les caractères d'échappement ne sont pas obligatoires.
Créez une propriété
severityet spécifiez la gravité par défaut des résultats créés par ce module. Les valeurs couramment utilisées pour la propriétéseveritysontLOW,MEDIUM,HIGHetCRITICAL. Par exemple,severity: MEDIUM
Vous pouvez également créer une propriété
custom_outputet spécifier des informations supplémentaires à renvoyer avec chaque résultat. Spécifiez les informations à renvoyer sous forme d'une ou de plusieurs paires nom/valeur. Vous pouvez renvoyer la valeur d'une propriété de la ressource analysée ou une chaîne littérale. Les propriétés doivent être spécifiées au formatresource.PROPERTY_NAME. Les chaînes littérales doivent être placées entre guillemets. L'exemple suivant montre unecustom_outputdéfinition qui renvoie à la fois une valeur de propriété (la valeur derotationPerioddans la ressourceCryptoKeyanalysée) et une chaîne de texte ("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'"Enregistrez le fichier dans un emplacement auquel votre gcloud CLI peut accéder.
Importez la définition dans Security Health Analytics à l'aide de la commande suivante :
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.yamlRemplacez les valeurs suivantes :
ORGANIZATION_IDpar l'ID de l'organisation parente du module personnalisé, ou remplacez l'option--organizationpar--foldersou--project, puis spécifiez l'ID du dossier ou du projet parent.MODULE_DISPLAY_NAMEpar un nom à afficher en tant que catégorie de résultats lorsque le module personnalisé renvoie des résultats. Le nom doit comporter entre 1 et 128 caractères, commencer par une lettre minuscule et ne contenir que des caractères alphanumériques et des traits de soulignement.DEFINITION_FILE_NAMEpar le chemin d'accès et le nom de fichier du fichier YAML contenant la définition du module personnalisé.
Pour en savoir plus sur l'utilisation des modules personnalisés Security Health Analytics, consultez la page Utiliser des modules personnalisés pour Security Health Analytics.
Latences d'analyse pour les nouveaux modules personnalisés
La création d'un module personnalisé ne déclenche pas d'analyse.
Security Health Analytics ne commence à utiliser un nouveau module personnalisé que dans l'un des cas suivants :
- La première analyse par lot après la création du module personnalisé. Selon le moment où vous créez un module personnalisé dans votre calendrier d'analyse par lot, vous devrez peut-être attendre jusqu'à 24 heures avant que Security Health Analytics ne commence à l'utiliser.
- Une modification apportée à une ressource cible déclenche une analyse en temps réel.
Exemple de définition de module personnalisé
L'exemple suivant montre une définition de module personnalisé terminée qui déclenche un résultat si la valeur de la propriété rotationPeriod d'une ressource cloudkms.googleapis.com/CryptoKey est supérieure à 2 592 000 secondes (30 jours). L'exemple renvoie deux valeurs facultatives dans la section custom_output : la valeur de resource.rotationPeriod et une note sous forme de chaîne de texte.
Dans l'exemple, notez les éléments suivants :
- Le type d'élément ou de ressource à vérifier est répertorié dans la section
resource_selectorsousresource_types. - La vérification effectuée par le module sur les ressources, sa logique de détection,
est définie dans la section
predicateprécédée deexpression. - Deux propriétés de source personnalisées,
durationetviolation, sont définies dans la sectioncustom_output. - L'explication du problème détecté est spécifiée dans la propriété
description. - Les conseils pour résoudre le problème détecté sont spécifiés dans la propriété
recommendation. Étant donné que des guillemets apparaissent dans les conseils, un caractère d'échappement de barre oblique inverse est requis avant chaque guillemet.
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'"
Faire référence aux propriétés des ressources et des règles dans les modules personnalisés
Quelle que soit la méthode utilisée pour créer un module personnalisé (à l'aide de la Google Cloud console ou en écrivant vous-même la définition), vous devez pouvoir rechercher les propriétés que vous pouvez évaluer dans le module personnalisé. Vous devez également savoir comment faire référence à ces propriétés dans une définition de module personnalisé.
Rechercher les propriétés d'une ressource ou d'une règle
Les propriétés d'une Google Cloud ressource sont définies dans la définition d'API de la ressource. Vous pouvez trouver cette définition en cliquant sur le nom de la ressource dans la section Types de ressources acceptés.
Vous trouverez les propriétés d'une règle dans la documentation de référence de l'API IAM. Pour les propriétés d'une règle, consultez la section Règle.
Faire référence à une propriété de ressource dans une définition de module personnalisé
Lorsque vous créez un module personnalisé, toutes les références directes à la propriété d'une ressource analysée doivent commencer par resource, suivies de toutes les propriétés parentes et enfin de la propriété cible. Les propriétés sont séparées par un point, à l'aide d'une notation par points de style JSON.
Voici des exemples de propriétés de ressources et de la manière dont elles peuvent être récupérées :
resourceName: stocke le nom complet d'une ressource dans l'inventaire des éléments cloud, par exemple//cloudresourcemanager.googleapis.com/projects/296605646631.resource.rotationPeriod: oùrotationPeriodest une propriété deresource.resource.metadata.name: oùnameest une sous-propriété demetadata, qui est une sous-propriété deresource.
Faire référence aux propriétés des règles IAM
Vous pouvez créer des expressions CEL qui évaluent la règle IAM d'une ressource en faisant référence aux propriétés de la règle IAM de la ressource. Les seules propriétés disponibles sont les liaisons et les rôles au sein des liaisons.
Lorsque vous faites référence aux propriétés des règles IAM, policy est la propriété de premier niveau.
Voici des exemples de propriétés de règles IAM et de la manière dont elles peuvent être récupérées :
policy.bindings: oùbindingsest une propriété depolicy.policy.version: oùversionest une propriété depolicy.
Pour en savoir plus, consultez Exemples d'expressions CEL.
Pour en savoir plus sur les propriétés d'une règle, consultez la section Règle.
Écrire des expressions CEL
Lorsque vous créez un module personnalisé, vous utilisez des expressions CEL pour évaluer les propriétés de la ressource analysée. Vous pouvez également utiliser des expressions CEL pour définir des paires name-value personnalisées qui renvoient des informations supplémentaires avec vos résultats.
Que vous créiez un module personnalisé dans la Google Cloud console ou que vous écriviez vous-même la définition de votre module personnalisé dans un fichier YAML, les expressions CEL que vous définissez sont les mêmes.
Expressions CEL pour la logique de détection
Vous codez la logique de détection d'un module personnalisé à l'aide d'expressions CEL avec des opérateurs CEL standards pour évaluer les propriétés des ressources analysées.
Vos expressions peuvent être des vérifications simples d'une seule valeur ou des expressions composées plus complexes qui vérifient plusieurs valeurs ou conditions. Dans tous les cas, l'expression doit renvoyer une valeur booléenne true pour déclencher un résultat.
Si vous créez un module personnalisé dans la Google Cloud console, vous écrivez ces expressions dans l'éditeur d'expressions de la page Configurer le module.
Si vous codez un module personnalisé dans un fichier YAML, vous ajoutez ces expressions sous la propriété predicate.
Que vous utilisiez la Google Cloud console ou un fichier YAML , les expressions CEL qui évaluent les propriétés des ressources doivent respecter les règles suivantes :
- Les propriétés que vous spécifiez dans une expression CEL doivent être des propriétés de la ressource analysée, telles qu'elles sont définies dans la définition d'API du type de ressource.
Si un module personnalisé évalue plusieurs types de ressources, les propriétés que vous spécifiez dans les expressions CEL doivent être communes à chaque type de ressource évalué par le module personnalisé.
Par exemple, si vous définissez un module personnalisé appelé
invalid_cryptokeyqui vérifie deux types de ressources :cloudkms.googleapis.com/CryptoKeyetcloudkms.googleapis.com/CryptoKeyVersion, vous pouvez écrire l' expression suivante, car les types de ressourcesCryptoKeyetCryptoKeyVersionincluent la propriéténame:predicate: resource.name.matches("projects/project1/locations/us-central1/keyRings/keyring1/cryptoKeys/.*")Toutefois, vous ne pouvez pas spécifier l'expression suivante dans le module personnalisé
invalid_cryptokey, car les propriétésimportTimeetrotationPeriodque l'expression évalue ne sont pas partagées par les deux types de ressources :predicate: resource.importTime >= timestamp("2022-10-02T15:01:23Z") || resource.rotationPeriod > duration("2592000s")Toutes les énumérations d'une expression CEL doivent être représentées sous forme de chaînes. Par exemple, l'expression suivante est valide pour le type de ressource
cloudkms.googleapis.com/CryptoKeyVersion:resource.state = "PENDING_GENERATION"
Le résultat des expressions CEL que vous définissez dans la propriété
predicatedoit être une valeur booléenne. Un résultat n'est déclenché que si le résultat renvoyé esttrue.
Pour en savoir plus sur CEL, consultez les ressources suivantes :
Exemples d'expressions CEL
Le tableau suivant liste quelques expressions CEL qui peuvent être utilisées pour évaluer les propriétés des ressources. Vous pouvez les utiliser à la fois dans la Google Cloud console et dans les définitions de modules personnalisés YAML.
| Type de ressource | Explication | Expression CEL |
|---|---|---|
| Toute ressource avec une règle IAM | Vérification des règles IAM pour identifier les membres en dehors du domaine | !policy.bindings.all(binding, binding.members.all(m ,!m.endsWith('@gmail.com'))) |
cloudkms.googleapis.com/CryptoKey |
Vérification de la période de rotation des clés Cloud KMS | has(resource.rotationPeriod) && resource.rotationPeriod > duration('60h') |
| Plusieurs types de ressources avec une seule règle | Vérifier si le nom de la ressource commence par dev ou devAccess
en fonction du type de ressource |
(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 |
Règle d'appairage de cloud privé virtuel pour faire correspondre les pairs réseau | 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 |
Autoriser uniquement le trafic entrant interne pour la fonction Cloud Run | has(resource.ingressSettings) && resource.ingressSettings.matches('ALLOW_INTERNAL_ONLY') |
compute.googleapis.com/Instance |
Le nom de la ressource correspond au modèle | resource.name.matches('^gcp-vm-(linux|windows)-v\\d+$') |
serviceusage.googleapis.com/Service |
Autoriser uniquement l'activation des API liées au stockage | 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
|
Seules les adresses IP publiques de la liste d'autorisation disposent d'un accès | (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 |
Vérifier si les ID de projet d'un cluster Managed Service pour Apache Spark contiennent les sous-chaînes "testing" ou "development" | has(resource.projectId) && resource.projectId.contains('testing') || resource.projectId.contains('development') |
Expressions CEL pour les propriétés de résultats personnalisées
Vous pouvez également définir jusqu'à dix propriétés personnalisées à renvoyer avec les résultats générés par vos modules personnalisés. Ces propriétés peuvent être utilisées dans les requêtes de résultats.
Les propriétés personnalisées apparaissent dans les propriétés sources du résultat au format JSON et dans l'onglet Propriétés sources des détails du résultat dans la console.Google Cloud
Vous définissez des propriétés personnalisées sous forme de paires name-value.
Si vous créez un module personnalisé dans la Google Cloud console,
vous définissez les paires name-value dans la section Propriétés de résultats personnalisées
de la page Définir les détails du résultat.
Si vous codez un module personnalisé dans un fichier YAML, vous listez les paires name-value en tant que properties sous la propriété custom_output.
Que vous utilisiez la Google Cloud console ou un fichier YAML, les règles suivantes s'appliquent :
- Spécifiez
namesous forme de chaîne de texte sans guillemets. Spécifiez
valuecomme suit :Pour renvoyer la valeur d'une propriété, spécifiez-la au format suivant :
RESOURCE_TYPE.PROPERTY.PROPERTY_TO_RETURN
Dans l'exemple :
RESOURCE_TYPEpeut êtreresourceoupolicy.PROPERTYune ou plusieurs propriétés parentes de la propriété qui contient la valeur à renvoyer.PROPERTY_TO_RETURNest la propriété qui contient la valeur à renvoyer.Pour renvoyer une chaîne de texte, placez-la entre guillemets.
L'exemple suivant montre deux paires name-value correctement définies sous custom_output dans un fichier YAML :
custom_output:
properties:
- name: duration
value_expression:
expression: resource.name
- name: property_with_text
value_expression:
expression: "'Note content'"Étape suivante
Pour tester, envoyer, afficher et mettre à jour des modules personnalisés, consultez les pages suivantes :
- Pour tester des modules personnalisés, consultez la page Tester des modules personnalisés pour Security Health Analytics.
- Pour importer, afficher et mettre à jour des modules personnalisés, consultez la page Créer et gérer des modules personnalisés pour Security Health Analytics.