Collecter les journaux du CMS WordPress
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 sur l'UDM, y compris les informations sur l'utilisateur, les informations 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, telles que la conversion des types de données, la fusion des champs et la gestion de modèles de journaux spécifiques pour Kubernetes et d'autres ressources.
Avant de commencer
- Assurez-vous de disposer d'une instance Google SecOps.
- Assurez-vous de disposer d'un accès privilégié à un site Web WordPress.
- Un plug-in qui active la fonctionnalité de webhook (par exemple, WP Webhooks).
Configurer un flux dans Google SecOps pour ingérer des journaux WordPress
- Accédez à Paramètres du SIEM > Flux.
- Cliquez sur Ajouter.
- Dans le champ Nom du flux, saisissez un nom pour le flux (par exemple, Journaux WordPress).
- Sélectionnez Webhook comme type de source.
- Sélectionnez WordPress comme Type de journal.
- Cliquez sur Suivant.
- Facultatif: spécifiez des valeurs pour les paramètres d'entrée suivants :
- Délimiteur de fractionnement: délimiteur utilisé pour séparer les lignes de journal, par exemple
\n
. - Espace de noms des éléments: espace de noms des éléments.
- Libellés d'ingestion: libellé appliqué aux événements de ce flux.
- Délimiteur de fractionnement: délimiteur utilisé pour séparer les lignes de journal, par exemple
- Cliquez sur Suivant.
- Vérifiez la configuration du flux dans l'écran Finaliser, puis cliquez sur Envoyer.
- 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 cette action rend l'ancienne clé secrète obsolète.
- Dans l'onglet Détails, copiez l'URL du point de terminaison du flux dans le champ Informations sur le point de terminaison. Vous devez spécifier cette URL de point de terminaison dans votre application cliente.
- Cliquez sur OK.
Créer une clé API pour le flux webhook
Accédez à la console Google Cloud > Identifiants.
Cliquez sur Créer des identifiants, puis sélectionnez Clé API.
Limitez l'accès de la clé API à l'API Google Security Operations.
Spécifier l'URL du point de terminaison
- Dans votre application cliente, spécifiez l'URL du point de terminaison HTTPS fournie dans le flux de webhook.
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 plutôt que dans l'URL. Si votre client webhook n'est pas compatible avec 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 permettant de 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
- Installez et activez le plug-in WP Webhooks (ou le plug-in de webhook de votre choix) via le répertoire des plug-ins WordPress.
- Accédez au sous-menu WP Webhooks (Webhooks WP) dans le menu d'administration WordPress, généralement sous "Settings" (Paramètres).
- Cliquez sur Envoyer des données dans le menu de la barre supérieure.
- Sélectionnez l'action WordPress qui déclenchera le webhook. Par exemple, publish_post (lorsque vous publiez un post), user_register (lorsque vous enregistrez un nouvel utilisateur) ou comment_post (lorsque vous publiez un commentaire) sont des valeurs courantes. Cela dépend des données que vous sélectionnez et envoyez à Google SecOps.
- Cliquez sur Ajouter une URL de webhook.
- Configurez le webhook :
- Nom: attribuez un nom descriptif à votre webhook (par exemple, Flux Google SecOps).
- URL du webhook: collez l'URL de votre point de terminaison Google SecOps.
- Cliquez sur Enregistrer le webhook.
Tableau de mappage UDM
Champ de journal | Mappage UDM | Logique |
---|---|---|
ClientIP |
principal.ip |
L'adresse IP du client est extraite du champ ClientIP dans le 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é sur le champ target.user.userid . |
EditUserLink |
target.url |
Le EditUserLink du journal brut est mappé sur le champ target.url . |
EventType |
metadata.product_event_type |
Le EventType du journal brut est mappé sur le champ metadata.product_event_type . |
FirstName |
target.user.first_name |
Le FirstName du journal brut est mappé sur le champ target.user.first_name . |
insertId |
metadata.product_log_id |
Le insertId du journal brut est mappé sur le champ metadata.product_log_id . |
labels.compute.googleapis.com/resource_name |
additional.fields.key |
La valeur "Nom de la ressource" 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 "Instance d'E/S Kubernetes" 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 "Nom de l'instance d'IO Kubernetes" 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 "Génération de modèles de pod" 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é sur le 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é sur le champ metadata.event_timestamp . |
resource.labels.cluster_name |
additional.fields.key |
La valeur "Nom du cluster" 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 "k8s_container", la valeur de resource.labels.container_name ainsi que resource.labels.namespace_name sont utilisées pour créer metadata.product_event_type . |
resource.labels.container_name |
target.resource.name |
La valeur 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 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 "k8s_container", la valeur de resource.labels.namespace_name ainsi que resource.labels.container_name sont utilisées pour créer metadata.product_event_type . |
resource.labels.node_name |
metadata.product_event_type |
Si resource.type est "k8s_node", la valeur de resource.labels.node_name est utilisée pour créer 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 de 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 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é sur le champ target.user.user_role . |
SessionID |
network.session_id |
Le SessionID du journal brut est mappé sur le champ network.session_id . |
sev |
security_result.severity |
La valeur du champ sev détermine la valeur de security_result.severity . "INFO" ou "NOTICE" est mappé sur "INFORMATIONAL", "WARN" est mappé sur "MEDIUM" et "ERR" est mappé sur "ERROR". |
TargetUsername |
target.user.user_display_name |
Le TargetUsername du journal brut est mappé sur le champ target.user.user_display_name . |
textPayload |
metadata.description |
Si resource.type est "k8s_node", la valeur de textPayload est mappée sur le champ metadata.description . |
textPayload |
network.application_protocol |
Le protocole (par exemple, HTTP) est extrait du champ textPayload à l'aide de modèles Grok. |
textPayload |
network.http.method |
La méthode HTTP (par exemple, GET, 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é sur le champ network.http.user_agent . La valeur "USER_RESOURCE_ACCESS" est attribuée à metadata.event_type . |
Modifications
2024-05-07
- Correction de bug:
- Modification de la logique d'analyseur pour analyser les journaux non analysés et supprimés.
2023-05-25
- Analyseur nouvellement créé.
Vous avez encore besoin d'aide ? Obtenez des réponses de membres de la communauté et de professionnels Google SecOps.