Collecter les journaux du CMS WordPress

Compatible avec :

Présentation

Cet analyseur extrait les journaux du CMS WordPress à partir de messages au format JSON ou texte brut. Il gère les journaux au format JSON et non JSON, en analysant les champs pertinents et en les mappant à l'UDM, y compris les informations sur les utilisateurs, les informations sur le réseau, les attributs de ressources et les détails des résultats de sécurité. L'analyseur effectue également plusieurs transformations de données, comme la conversion de types de données, la fusion de champs et la gestion de modèles de journaux spécifiques pour Kubernetes et d'autres ressources.

Avant de commencer

Assurez-vous de remplir les conditions préalables suivantes :

  • Instance Google SecOps.
  • Accès privilégié à un site WordPress.
  • Plug-in qui active la fonctionnalité de webhook (par exemple, WP Webhooks).

Configurer des flux

Il existe deux points d'entrée différents pour configurer les flux dans la plate-forme Google SecOps :

  • Paramètres SIEM> Flux
  • Plate-forme de contenu > Packs de contenu

Configurer des flux à partir de Paramètres SIEM > Flux

Pour configurer un flux, procédez comme suit :

  1. Accédez à Paramètres SIEM > Flux.
  2. Cliquez sur Add New Feed (Ajouter un flux).
  3. Sur la page suivante, cliquez sur Configurer un seul flux.
  4. Dans le champ Nom du flux, saisissez un nom pour le flux (par exemple, Journaux CMS Wordpress).
  5. Sélectionnez Webhook comme type de source.
  6. Sélectionnez WordPress comme Type de journal.
  7. Cliquez sur Suivant.
  8. Facultatif : spécifiez les valeurs des paramètres d'entrée suivants :
    • Délimiteur de fractionnement : délimiteur utilisé pour séparer les lignes de journaux, tel que \n.
  9. Cliquez sur Suivant.
  10. Vérifiez la configuration du flux sur l'écran Finaliser, puis cliquez sur Envoyer.
  11. Cliquez sur Générer une clé secrète pour générer une clé secrète permettant d'authentifier ce flux.
  12. Copiez et stockez la clé secrète. Vous ne pourrez plus afficher cette clé secrète. Si nécessaire, vous pouvez générer une nouvelle clé secrète, mais l'ancienne deviendra obsolète.
  13. Dans l'onglet Détails, copiez l'URL du point de terminaison du flux à partir du champ Informations sur le point de terminaison. Vous devez spécifier cette URL de point de terminaison dans votre application cliente.
  14. Cliquez sur OK.

Configurer des flux depuis le Hub de contenu

Indiquez les valeurs des champs suivants :

  • Délimiteur de fractionnement : délimiteur utilisé pour séparer les lignes de journaux, tel que \n.

Options avancées

  • Nom du flux : valeur préremplie qui identifie le flux.
  • Type de source : méthode utilisée pour collecter les journaux dans Google SecOps.
  • Espace de noms de l'élément : espace de noms associé au flux.
  • Libellés d'ingestion : libellés appliqués à tous les événements de ce flux.

  • Cliquez sur Générer une clé secrète pour générer une clé secrète permettant d'authentifier ce flux.

  • Copiez et stockez la clé secrète. Vous ne pourrez plus afficher cette clé secrète. Si nécessaire, vous pouvez générer une nouvelle clé secrète, mais l'ancienne deviendra obsolète.

  • Dans l'onglet Détails, copiez l'URL du point de terminaison du flux à partir du champ Informations sur le point de terminaison. Vous devez spécifier cette URL de point de terminaison dans votre application cliente.

Créer une clé API pour le flux de webhook

  1. Accédez à la consoleGoogle Cloud > Identifiants.

    Accéder à "Identifiants"

  2. Cliquez sur Créer des identifiants, puis sélectionnez Clé API.

  3. Restreignez l'accès à la clé API à l'API Google Security Operations.

Spécifier l'URL du point de terminaison

  1. Dans votre application cliente, spécifiez l'URL du point de terminaison HTTPS fournie dans le flux de webhook.
  2. Activez l'authentification en spécifiant la clé API et la clé secrète dans l'en-tête personnalisé au format suivant :

    X-goog-api-key = API_KEY
    X-Webhook-Access-Key = SECRET
    

    Recommandation : Spécifiez la clé API en tant qu'en-tête au lieu de la spécifier dans l'URL. Si votre client de webhook n'accepte pas les en-têtes personnalisés, vous pouvez spécifier la clé API et la clé secrète à l'aide de paramètres de requête au format suivant :

    ENDPOINT_URL?key=API_KEY&secret=SECRET
    

Remplacez les éléments suivants :

  • ENDPOINT_URL : URL du point de terminaison du flux.
  • API_KEY : clé API pour s'authentifier auprès de Google Security Operations.
  • SECRET : clé secrète que vous avez générée pour authentifier le flux.

Configurer le webhook WordPress

  1. Installez et activez le plug-in WP Webhooks (ou le plug-in de webhook de votre choix) dans le répertoire de plug-ins WordPress.
  2. Accédez au sous-menu WP Webhooks dans le menu de l'administrateur WordPress, généralement situé sous "Paramètres".
  3. Cliquez sur Envoyer des données dans le menu de la barre supérieure.
  4. Sélectionnez l'action WordPress qui déclenchera le webhook. Par exemple, publish_post (lorsqu'un nouveau post est publié), user_register (lorsqu'un nouvel utilisateur s'inscrit) ou comment_post (lorsqu'un nouveau commentaire est publié). Cela dépend des données que vous sélectionnez et envoyez à Google SecOps.
  5. Cliquez sur Add Webhook URL (Ajouter une URL de webhook).
  6. Configurer le webhook :
    • Nom : donnez un nom descriptif à votre webhook (par exemple, Flux Google SecOps).
    • URL du webhook : collez l'URL du point de terminaison Google SecOps.
  7. Cliquez sur Save Webhook (Enregistrer le Webhook).

Table de mappage UDM

Champ de journal Mappage UDM Logique
ClientIP principal.ip L'adresse IP du client est extraite du champ ClientIP du journal brut.
Code target.resource.attribute.labels.key La valeur "Code" est attribuée en tant que clé dans l'objet target.resource.attribute.labels.
Code target.resource.attribute.labels.value La valeur du champ Code du journal brut est attribuée en tant que valeur dans l'objet target.resource.attribute.labels.
CurrentUserID target.user.userid Le CurrentUserID du journal brut est converti en chaîne et mappé au champ target.user.userid.
EditUserLink target.url Le EditUserLink du journal brut est mappé au champ target.url.
EventType metadata.product_event_type Le EventType du journal brut est mappé au champ metadata.product_event_type.
FirstName target.user.first_name Le FirstName du journal brut est mappé au champ target.user.first_name.
insertId metadata.product_log_id Le insertId du journal brut est mappé au champ metadata.product_log_id.
labels.compute.googleapis.com/resource_name additional.fields.key La valeur "Resource Name" est attribuée en tant que clé dans l'objet additional.fields.
labels.compute.googleapis.com/resource_name additional.fields.value.string_value La valeur de labels.compute.googleapis.com/resource_name du journal brut est attribuée en tant que valeur de chaîne dans l'objet additional.fields.
labels.k8s-pod/app_kubernetes_io/instance target.resource.attribute.labels.key La valeur "Kubernetes IO Instance" est attribuée en tant que clé dans l'objet target.resource.attribute.labels.
labels.k8s-pod/app_kubernetes_io/instance target.resource.attribute.labels.value La valeur de labels.k8s-pod/app_kubernetes_io/instance du journal brut est attribuée en tant que valeur dans l'objet target.resource.attribute.labels.
labels.k8s-pod/app_kubernetes_io/managed-by target.resource.attribute.labels.key La valeur "Kubernetes IO Instance Manager" est attribuée en tant que clé dans l'objet target.resource.attribute.labels.
labels.k8s-pod/app_kubernetes_io/managed-by target.resource.attribute.labels.value La valeur de labels.k8s-pod/app_kubernetes_io/managed-by du journal brut est attribuée en tant que valeur dans l'objet target.resource.attribute.labels.
labels.k8s-pod/app_kubernetes_io/name target.resource.attribute.labels.key La valeur "Kubernetes IO Instance Name" est attribuée en tant que clé dans l'objet target.resource.attribute.labels.
labels.k8s-pod/app_kubernetes_io/name target.resource.attribute.labels.value La valeur de labels.k8s-pod/app_kubernetes_io/name du journal brut est attribuée en tant que valeur dans l'objet target.resource.attribute.labels.
labels.k8s-pod/controller-revision-hash target.resource.attribute.labels.key La valeur "Controller Revision Hash" est attribuée en tant que clé dans l'objet target.resource.attribute.labels.
labels.k8s-pod/controller-revision-hash target.resource.attribute.labels.value La valeur de labels.k8s-pod/controller-revision-hash du journal brut est attribuée en tant que valeur dans l'objet target.resource.attribute.labels.
labels.k8s-pod/helm_sh/chart target.resource.attribute.labels.key La valeur "Kubernetes IO Instance Manager SH" est attribuée en tant que clé dans l'objet target.resource.attribute.labels.
labels.k8s-pod/helm_sh/chart target.resource.attribute.labels.value La valeur de labels.k8s-pod/helm_sh/chart du journal brut est attribuée en tant que valeur dans l'objet target.resource.attribute.labels.
labels.k8s-pod/k8s-app target.resource.attribute.labels.key La valeur "Application" est attribuée en tant que clé dans l'objet target.resource.attribute.labels.
labels.k8s-pod/k8s-app target.resource.attribute.labels.value La valeur de labels.k8s-pod/k8s-app du journal brut est attribuée en tant que valeur dans l'objet target.resource.attribute.labels.
labels.k8s-pod/pod-template-generation target.resource.attribute.labels.key La valeur "Pod Template Generation" est attribuée en tant que clé dans l'objet target.resource.attribute.labels.
labels.k8s-pod/pod-template-generation target.resource.attribute.labels.value La valeur de labels.k8s-pod/pod-template-generation du journal brut est attribuée en tant que valeur dans l'objet target.resource.attribute.labels.
labels.k8s-pod/pod-template-hash target.resource.attribute.labels.key La valeur "Pod Template Hash" est attribuée en tant que clé dans l'objet target.resource.attribute.labels.
labels.k8s-pod/pod-template-hash target.resource.attribute.labels.value La valeur de labels.k8s-pod/pod-template-hash du journal brut est attribuée en tant que valeur dans l'objet target.resource.attribute.labels.
LastName target.user.last_name Le LastName du journal brut est mappé au champ target.user.last_name.
logName target.resource.attribute.labels.key La valeur "Nom du journal" est attribuée en tant que clé dans l'objet target.resource.attribute.labels.
logName target.resource.attribute.labels.value La valeur du champ logName du journal brut est attribuée en tant que valeur dans l'objet target.resource.attribute.labels.
receiveTimestamp metadata.event_timestamp Le receiveTimestamp du journal brut est analysé et mappé au champ metadata.event_timestamp.
resource.labels.cluster_name additional.fields.key La valeur "Cluster Name" est attribuée en tant que clé dans l'objet additional.fields.
resource.labels.cluster_name additional.fields.value.string_value La valeur de resource.labels.cluster_name du journal brut est attribuée en tant que valeur de chaîne dans l'objet additional.fields.
resource.labels.cluster_name target.resource.resource_type Si resource.labels.cluster_name est présent, la valeur "CLUSTER" est attribuée à target.resource.resource_type.
resource.labels.container_name metadata.product_event_type Si resource.type est défini sur "k8s_container", la valeur de resource.labels.container_name ainsi que resource.labels.namespace_name est utilisée pour construire metadata.product_event_type.
resource.labels.container_name target.resource.name La valeur de resource.labels.container_name du journal brut est attribuée au champ target.resource.name.
resource.labels.location target.location.country_or_region La valeur de resource.labels.location du journal brut est attribuée au champ target.location.country_or_region.
resource.labels.namespace_name additional.fields.key La valeur "Nom de l'espace de noms" est attribuée en tant que clé dans l'objet additional.fields.
resource.labels.namespace_name additional.fields.value.string_value La valeur de resource.labels.namespace_name du journal brut est attribuée en tant que valeur de chaîne dans l'objet additional.fields.
resource.labels.namespace_name metadata.product_event_type Si resource.type est défini sur "k8s_container", la valeur de resource.labels.namespace_name ainsi que resource.labels.container_name est utilisée pour construire metadata.product_event_type.
resource.labels.node_name metadata.product_event_type Si resource.type est défini sur "k8s_node", la valeur de resource.labels.node_name est utilisée pour construire metadata.product_event_type.
resource.labels.pod_name additional.fields.key La valeur "Nom du pod" est attribuée en tant que clé dans l'objet additional.fields.
resource.labels.pod_name additional.fields.value.string_value La valeur de resource.labels.pod_name du journal brut est attribuée en tant que valeur de chaîne dans l'objet additional.fields.
resource.labels.project_id additional.fields.key La valeur "ID du projet" est attribuée en tant que clé dans l'objet additional.fields.
resource.labels.project_id additional.fields.value.string_value La valeur de resource.labels.project_id du journal brut est attribuée en tant que valeur de chaîne dans l'objet additional.fields.
resource.type target.resource.resource_subtype La valeur de resource.type du journal brut est attribuée au champ target.resource.resource_subtype.
Roles target.user.user_role Le champ Roles du journal brut est converti en majuscules et mappé au champ target.user.user_role.
SessionID network.session_id Le SessionID du journal brut est mappé au champ network.session_id.
sev security_result.severity La valeur du champ sev détermine la valeur de security_result.severity. "INFO" ou "NOTICE" correspond à "INFORMATIONAL", "WARN" correspond à "MEDIUM" et "ERR" correspond à "ERROR".
TargetUsername target.user.user_display_name Le TargetUsername du journal brut est mappé au champ target.user.user_display_name.
textPayload metadata.description Si resource.type est "k8s_node", la valeur de textPayload est mappée au champ metadata.description.
textPayload network.application_protocol Le protocole (HTTP, par exemple) est extrait du champ textPayload à l'aide de modèles Grok.
textPayload network.http.method La méthode HTTP (par exemple, GET ou POST) est extraite du champ textPayload à l'aide de modèles Grok.
textPayload network.http.referral_url L'URL est extraite du champ textPayload à l'aide de modèles Grok.
textPayload network.http.response_code Le code de réponse HTTP est extrait du champ textPayload à l'aide de modèles Grok et converti en entier.
textPayload network.received_bytes Les octets reçus sont extraits du champ textPayload à l'aide de modèles Grok et convertis en entier non signé.
textPayload principal.ip L'adresse IP source est extraite du champ textPayload à l'aide de modèles Grok.
textPayload security_result.description La description est extraite du champ textPayload à l'aide de modèles Grok.
textPayload target.file.full_path Le chemin est extrait du champ textPayload à l'aide de modèles Grok.
UserAgent network.http.user_agent Le UserAgent du journal brut est mappé au champ network.http.user_agent. La valeur "USER_RESOURCE_ACCESS" est attribuée à metadata.event_type.

Vous avez encore besoin d'aide ? Obtenez des réponses de membres de la communauté et de professionnels Google SecOps.