Collecter les journaux Ansible AWX
Présentation
Cet analyseur extrait les données de journal au format JSON d'Ansible AWX et les convertit au format UDM (Unified Data Model). Il gère différents formats de journaux, extrait les champs pertinents tels que les codes temporels, les adresses IP, les informations sur l'hôte et les détails des événements, et les mappe aux champs UDM correspondants. Il gère également des cas extrêmes spécifiques et enrichit les données avec des libellés et des métadonnées.
Avant de commencer
Assurez-vous de remplir les conditions préalables suivantes :
- Instance Google SecOps.
- Accès privilégié à Ansible AWX.
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 :
- Accédez à Paramètres SIEM > Flux.
- Cliquez sur Add New Feed (Ajouter un flux).
- Sur la page suivante, cliquez sur Configurer un seul flux.
- Dans le champ Nom du flux, saisissez un nom pour le flux (par exemple, Journaux Ansible AWX).
- Sélectionnez Webhook comme type de source.
- Sélectionnez Ansible AWX comme type de journal.
- Cliquez sur Suivant.
- 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
.
- Délimiteur de fractionnement : délimiteur utilisé pour séparer les lignes de journaux, tel que
- Cliquez sur Suivant.
- Vérifiez la configuration du flux sur 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 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.
- 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
Accédez à la consoleGoogle Cloud > Identifiants.
Cliquez sur Créer des identifiants, puis sélectionnez Clé API.
Restreignez l'accès à 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 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 un webhook dans Ansible AWX
- Connectez-vous à votre instance AWX.
- Accédez à la section Notifications, sous Administration.
- Cliquez sur Ajouter.
Configurer les paramètres du webhook :
- Nom : donnez un nom descriptif au webhook (par exemple, Webhook Google SecOps).
- Type : sélectionnez Webhook dans la liste.
- URL cible : saisissez l'URL du point de terminaison de l'API Google SecOps.
- Méthode HTTP : sélectionnez POST.
Facultatif : En-têtes HTTP : ajoutez les en-têtes nécessaires pour l'authentification ou le type de contenu. Par exemple, vous devrez peut-être inclure un en-tête
Authorization
avec un jeton de support. Consultez la documentation Google SecOps pour connaître les exigences spécifiques concernant les en-têtes.Cliquez sur Enregistrer pour créer le webhook.
Accédez à Projets, sous Ressources.
Sélectionnez le ou les projets auxquels vous souhaitez associer le webhook.
Dans le projet sélectionné, accédez à l'onglet Notifications.
Sélectionnez les déclencheurs à activer pour la notification Webhook créée précédemment : Démarrage | Réussite | Échec.
Les notifications s'appliqueront désormais à tous les modèles associés au projet. Vous pouvez les désactiver manuellement en accédant au champ Notifications de chaque modèle.
Table de mappage UDM
Champ de journal | Mappage UDM | Logique |
---|---|---|
agent.ephemeral_id |
observer.labels.value |
Valeur de agent.ephemeral_id à partir du journal brut. |
agent.hostname |
observer.hostname |
Valeur de agent.hostname à partir du journal brut. |
agent.id |
observer.asset_id |
Concaténation de "filebeat:" et de la valeur de agent.id à partir du journal brut. |
agent.name |
observer.user.userid |
Valeur de agent.name à partir du journal brut. |
agent.type |
observer.application |
Valeur de agent.type à partir du journal brut. |
agent.version |
observer.platform_version |
Valeur de agent.version à partir du journal brut. |
cloud.availability_zone |
principal.resource.attribute.labels.value |
Valeur de cloud.availability_zone à partir du journal brut. |
cloud.instance.id |
principal.resource.product_object_id |
Valeur de cloud.instance.id à partir du journal brut. |
cloud.instance.name |
principal.resource.name |
Valeur de cloud.instance.name à partir du journal brut. |
cloud.machine.type |
principal.resource.attribute.labels.value |
Valeur de cloud.machine.type à partir du journal brut. |
cloud.provider |
principal.resource.attribute.labels.value |
Valeur de cloud.provider à partir du journal brut. |
event1 |
metadata.description |
Valeur de event1 à partir du journal brut. Si event1 n'est pas présent, la valeur de message est utilisée. |
event1_data.host |
principal.hostname |
Valeur de event1_data.host à partir du journal brut. Utilisé comme solution de repli si host_name et host ne sont pas présents. |
event1_data.remote_addr |
principal.ip |
Adresse IP extraite de event1_data.remote_addr à l'aide d'un modèle Grok. |
event1_data.task |
security_result.detection_fields.value |
Valeur de event1_data.task à partir du journal brut. |
event1_data.task_path |
principal.process.file.full_path |
Valeur de event1_data.task_path à partir du journal brut. |
event1_data.task_uuid |
security_result.detection_fields.value |
Valeur de event1_data.task_uuid à partir du journal brut. |
event1_data.uuid |
metadata.product_log_id |
Valeur de event1_data.uuid à partir du journal brut. |
event1_display |
security_result.description |
Valeur de event1_display à partir du journal brut. |
host |
principal.hostname |
Valeur de host à partir du journal brut. Utilisé comme solution de repli si host_name n'est pas présent. S'il s'agit d'un nombre, il est converti en chaîne. |
host.architecture |
target.asset.hardware.cpu_platform |
Valeur de host.architecture à partir du journal brut. |
host.fqdn |
target.administrative_domain |
Valeur de host.fqdn à partir du journal brut. |
host.hostname |
target.hostname |
Valeur de host.hostname à partir du journal brut. |
host.id |
target.asset.asset_id |
"Host Id: " concaténé avec la valeur de host.id du journal brut. |
host.ip |
target.asset.ip |
Valeurs du tableau host.ip du journal brut. |
host.mac |
target.mac |
Valeurs du tableau host.mac du journal brut. |
host.os.codename |
target.asset.attribute.labels.value |
Valeur de host.os.codename à partir du journal brut. |
host.os.kernel |
target.platform_patch_level |
Valeur de host.os.kernel à partir du journal brut. |
host.os.name |
target.asset.attribute.labels.value |
Valeur de host.os.name à partir du journal brut. |
host.os.platform |
target.platform |
Si la valeur de host.os.platform est "debian", le champ UDM est défini sur "LINUX". |
host.os.version |
target.platform_version |
Valeur de host.os.version à partir du journal brut. |
host_name |
principal.hostname |
Valeur de host_name à partir du journal brut. |
input.type |
network.ip_protocol |
Si la valeur de input.type est "tcp", le champ UDM est défini sur "TCP". |
level |
security_result.severity |
En fonction de la valeur de level : "DEBUG", "INFO" et "AUDIT" correspondent à "INFORMATIONAL", "ERROR" correspond à "ERROR" et "WARNING" correspond à "MEDIUM". |
level |
security_result.severity_details |
Valeur de level à partir du journal brut. |
log.source.address |
principal.ip |
Adresse IP extraite de log.source.address à l'aide d'un modèle Grok. |
log.source.address |
principal.port |
Port extrait de log.source.address à l'aide d'un modèle Grok. |
logger_name |
intermediary.application |
Valeur de logger_name à partir du journal brut. |
message |
metadata.description |
Valeur de message à partir du journal brut. Utilisé comme solution de repli si event1 n'est pas présent. |
metadata.event_type |
metadata.event_type |
Déterminé par la logique de l'analyseur en fonction de la présence de certains champs. "NETWORK_CONNECTION" si log.source.address et host.ip sont présents. "STATUS_UPDATE" si principal_hostname ou event1_data.remote_addr sont présents. "GENERIC_EVENT" dans le cas contraire. |
metadata.log_type |
metadata.log_type |
Codé en dur sur "ANSIBLE_AWX". |
metadata.product_name |
metadata.product_name |
Codé en dur sur "ANSIBLE_AWX". |
metadata.vendor_name |
metadata.vendor_name |
Codé en dur sur "ANSIBLE_AWX". |
parent_uuid |
security_result.detection_fields.value |
Valeur de parent_uuid à partir du journal brut. |
principal.resource.resource_type |
principal.resource.resource_type |
Codé en dur sur "VIRTUAL_MACHINE" si cloud.instance.name est présent. |
observer.labels.key |
observer.labels.key |
Codé en dur sur "ephemeral_id". |
principal.resource.attribute.labels.key |
principal.resource.attribute.labels.key |
Codé en dur sur "machine_type", "provider" ou "availability_zone" selon le champ mappé. |
security_result.detection_fields.key |
security_result.detection_fields.key |
Codé en dur sur "parent_uuid", "task" ou "task_uuid" selon le champ mappé. |
target.asset.attribute.labels.key |
target.asset.attribute.labels.key |
Codé en dur sur "codename" ou "os_name" selon le champ mappé. |
timestamp |
metadata.event_timestamp |
Valeur de timestamp du journal brut, analysée et convertie en code temporel. |
timestamp |
timestamp |
Valeur de timestamp du journal brut, analysée et convertie en code temporel. |
Vous avez encore besoin d'aide ? Obtenez des réponses de membres de la communauté et de professionnels Google SecOps.