Collecter les journaux BeyondTrust Secure Remote Access
Ce document explique comment collecter les journaux BeyondTrust Secure Remote Access à l'aide de Bindplane. L'analyseur gère deux formats syslog. Le premier format utilise des paires clé-valeur dans un message structuré, tandis que le second utilise des champs délimités par des barres verticales. L'analyseur extrait les champs pertinents des deux formats et les mappe à l'UDM. Il catégorise également les types d'événements en fonction des mots clés extraits et gère une logique spécifique pour les événements de connexion/déconnexion et les types d'authentification.
Avant de commencer
- Assurez-vous de disposer d'une instance Google Security Operations.
- Assurez-vous d'utiliser Windows 2016 ou une version ultérieure, ou un hôte Linux avec
systemd. - Si vous exécutez le programme derrière un proxy, assurez-vous que les ports du pare-feu sont ouverts.
- Assurez-vous de disposer d'un accès privilégié à un accès à distance sécurisé BeyondTrust.
Obtenir le fichier d'authentification d'ingestion Google SecOps
- Connectez-vous à la console Google SecOps.
- Accédez à Paramètres du SIEM > Agents de collecte.
- Téléchargez le fichier d'authentification d'ingestion. Enregistrez le fichier de manière sécurisée sur le système sur lequel Bindplane sera installé.
Obtenir l'ID client Google SecOps
- Connectez-vous à la console Google SecOps.
- Accédez à Paramètres SIEM> Profil.
- Copiez et enregistrez le numéro client de la section Informations sur l'organisation.
Installer l'agent Bindplane
Installation de fenêtres
- Ouvrez l'invite de commandes ou PowerShell en tant qu'administrateur.
Exécutez la commande suivante :
msiexec /i "https://github.com/observIQ/bindplane-agent/releases/latest/download/observiq-otel-collector.msi" /quiet
Installation de Linux
- Ouvrez un terminal avec les droits root ou sudo.
Exécutez la commande suivante :
sudo sh -c "$(curl -fsSlL https://github.com/observiq/bindplane-agent/releases/latest/download/install_unix.sh)" install_unix.sh
Ressources d'installation supplémentaires
- Pour plus d'options d'installation, consultez ce guide d'installation.
Configurer l'agent Bindplane pour ingérer Syslog et l'envoyer à Google SecOps
Accédez au fichier de configuration :
- Recherchez le fichier
config.yaml. En règle générale, il se trouve dans le répertoire/etc/bindplane-agent/sous Linux ou dans le répertoire d'installation sous Windows. - Ouvrez le fichier à l'aide d'un éditeur de texte (par exemple,
nano,viou le Bloc-notes).
- Recherchez le fichier
Modifiez le fichier
config.yamlcomme suit :receivers: udplog: # Replace the port and IP address as required listen_address: "0.0.0.0:514" exporters: chronicle/chronicle_w_labels: compression: gzip # Adjust the path to the credentials file you downloaded in Step 1 creds: '/path/to/ingestion-authentication-file.json' # Replace with your actual customer ID from Step 2 customer_id: <customer_id> endpoint: malachiteingestion-pa.googleapis.com # Add optional ingestion labels for better organization ingestion_labels: log_type: BEYONDTRUST_REMOTE_ACCESS raw_log_field: body service: pipelines: logs/source0__chronicle_w_labels-0: receivers: - udplog exporters: - chronicle/chronicle_w_labelsRemplacez le port et l'adresse IP selon les besoins de votre infrastructure.
Remplacez
<customer_id>par le numéro client réel.Mettez à jour
/path/to/ingestion-authentication-file.jsonen indiquant le chemin d'accès où le fichier d'authentification a été enregistré dans la section Obtenir le fichier d'authentification pour l'ingestion Google SecOps.
Redémarrez l'agent Bindplane pour appliquer les modifications.
Pour redémarrer l'agent Bindplane sous Linux, exécutez la commande suivante :
sudo systemctl restart bindplane-agentPour redémarrer l'agent Bindplane sous Windows, vous pouvez utiliser la console Services ou saisir la commande suivante :
net stop BindPlaneAgent && net start BindPlaneAgent
Configurer l'assistance à distance BeyondTrust
- Connectez-vous à l'interface utilisateur Web BeyondTrust.
- Sélectionnez Appliance > Sécurité > Administration de l'appliance.
- Dans la section Syslog, procédez comme suit :
- Format du message : sélectionnez Ancien format BSD.
- Serveur syslog distant : saisissez l'adresse IP et le port Bindplane.
- Cliquez sur Envoyer.
Table de mappage UDM
| Champ de journal | Mappage UDM | Logique |
|---|---|---|
datetime |
metadata.event_timestamp |
L'horodatage est analysé à partir du champ datetime au format RFC3 339 si le champ when n'est pas présent. |
deviceHost |
target.hostname |
La valeur de deviceHost est directement mappée à target.hostname. |
dstHost |
target.ip |
La valeur de dstHost est directement mappée sur target.ip après avoir été validée en tant qu'adresse IP valide. |
dstPriv |
additional.fields.[key=dstPriv].value.string_value |
La valeur de dstPriv est placée dans le champ additional avec la clé dstPriv. |
dstUid |
target.user.userid |
La valeur de dstUid est directement mappée à target.user.userid. |
dstUser |
target.user.user_display_name |
La valeur de dstUser est directement mappée à target.user.user_display_name. |
eventName |
metadata.event_type |
Si eventName est défini sur login (non sensible à la casse), metadata.event_type est défini sur USER_LOGIN. Si eventName est défini sur logout (non sensible à la casse), metadata.event_type est défini sur USER_LOGOUT. Sinon, si eventName n'est pas vide, metadata.event_type est défini sur USER_UNCATEGORIZED. Si eventName est vide et que le message correspond au deuxième modèle grok, metadata.event_type est défini sur GENERIC_EVENT. Si eventName est vide et que le message correspond au premier modèle Grok, metadata.event_type est défini sur GENERIC_EVENT. Si srcUid, userid ou who ne sont pas vides, metadata.event_type est défini sur USER_CHANGE_PERMISSIONS. Si deviceHost ou site ne sont pas vides, metadata.event_type est défini sur USER_UNCATEGORIZED. Sinon, metadata.event_type est défini sur GENERIC_EVENT. |
event_name |
additional.fields.[key=event_name].value.string_value |
La valeur de event_name est placée dans le champ additional avec la clé event_name. |
event_name |
metadata.product_event_type |
La valeur de event_name est utilisée conjointement avec le champ id pour renseigner metadata.product_event_type au format [id] -event_name``. |
externalKeyLabel |
additional.fields.[key=externalKeyLabel].value.string_value |
La valeur de externalKeyLabel est placée dans le champ additional avec la clé externalKeyLabel. |
id |
metadata.product_event_type |
La valeur de id est utilisée conjointement avec le champ event_name pour renseigner metadata.product_event_type au format [id] -event_name``. |
jumpGroupId |
additional.fields.[key=jumpGroupId].value.string_value |
La valeur de jumpGroupId est placée dans le champ additional avec la clé jumpGroupId. |
jumpGroupName |
additional.fields.[key=jumpGroupName].value.string_value |
La valeur de jumpGroupName est placée dans le champ additional avec la clé jumpGroupName. |
jumpGroupType |
additional.fields.[key=jumpGroupType].value.string_value |
La valeur de jumpGroupType est placée dans le champ additional avec la clé jumpGroupType. |
jumpointId |
additional.fields.[key=jumpointId].value.string_value |
La valeur de jumpointId est placée dans le champ additional avec la clé jumpointId. |
jumpointName |
additional.fields.[key=jumpointName].value.string_value |
La valeur de jumpointName est placée dans le champ additional avec la clé jumpointName. |
kv_data |
Différents champs UDM | Le champ kv_data est analysé en paires clé/valeur, qui sont ensuite mappées à différents champs UDM en fonction de leurs clés (par exemple, eventName, when, who, who_ip, site, target, status, reason). |
kvdata |
Différents champs UDM | Le champ kvdata est analysé en paires clé/valeur, qui sont ensuite mappées à différents champs UDM en fonction de leurs clés (par exemple, msg, srcUser, srcUid, srcHost, dstUser, dstUid, dstHost, sessionId, jumpointId, jumpointName, jumpGroupId, jumpGroupName, jumpGroupType, externalKeyLabel, dstPriv). |
message |
Différents champs UDM | Le champ message est analysé à l'aide de modèles Grok pour extraire différents champs, qui sont ensuite mappés aux champs UDM. |
msg |
metadata.description |
La valeur de msg est directement mappée à metadata.description. |
product_event_type |
metadata.product_event_type |
La valeur de product_event_type est directement mappée à metadata.product_event_type. |
product_log_id |
metadata.product_log_id |
La valeur de product_log_id est directement mappée à metadata.product_log_id. |
process_id |
principal.process.pid |
La valeur de process_id est directement mappée à principal.process.pid. |
reason |
security_result.description |
La valeur de reason est directement mappée à security_result.description. |
segment_number |
additional.fields.[key=segment_number].value.string_value |
La valeur de segment_number est placée dans le champ additional avec la clé segment_number. |
sessionId |
network.session_id |
La valeur de sessionId est directement mappée à network.session_id. |
site |
target.hostname |
La valeur de site est directement mappée à target.hostname. |
site_id |
additional.fields.[key=site_id].value.string_value |
La valeur de site_id est placée dans le champ additional avec la clé site_id. |
srcHost |
principal.ip |
La valeur de srcHost est directement mappée sur principal.ip après avoir été validée en tant qu'adresse IP valide. |
srcUid |
principal.user.userid |
La valeur de srcUid est directement mappée à principal.user.userid. |
srcUser |
principal.user.user_display_name |
La valeur de srcUser est directement mappée à principal.user.user_display_name. |
status |
security_result.action |
Si status est défini sur failure (non sensible à la casse), security_result.action est défini sur BLOCK. Sinon, security_result.action est défini sur ALLOW. |
status |
security_result.action_details |
La valeur de status est directement mappée à security_result.action_details. |
target |
target.application |
La valeur de target est directement mappée à target.application. rep_client est remplacé par Representative Console et web/login est remplacé par Web/Login. |
target |
extensions.auth.type |
Si target est défini sur rep_client, extensions.auth.type est défini sur MACHINE. Si target est défini sur web/login, extensions.auth.type est défini sur SSO. Sinon, extensions.auth.type est défini sur AUTHTYPE_UNSPECIFIED. |
timestamp |
metadata.event_timestamp |
Le timestamp du journal brut est utilisé comme solution de secours si ni datetime ni when ne sont présents. |
total_segments |
additional.fields.[key=total_segments].value.string_value |
La valeur de total_segments est placée dans le champ additional avec la clé total_segments. |
device_product |
additional.fields.[key=device_product].value.string_value |
La valeur de device_product est placée dans le champ additional avec la clé device_product. |
device_vendor |
additional.fields.[key=device_vendor].value.string_value |
La valeur de device_vendor est placée dans le champ additional avec la clé device_vendor. |
device_version |
metadata.product_version |
La valeur de device_version est directement mappée à metadata.product_version. |
when |
metadata.event_timestamp |
L'horodatage est analysé à partir du champ when au format UNIX, le cas échéant. |
who |
principal.user.userid |
Si le champ who correspond au modèle d'expression régulière, le userid extrait est mappé sur principal.user.userid. Sinon, l'intégralité du champ who est mappée sur principal.user.userid. |
who |
principal.user.user_display_name |
Si le champ who correspond au modèle d'expression régulière, le user_display_name extrait est mappé sur principal.user.user_display_name. |
who_ip |
principal.ip |
La valeur de who_ip est directement mappée à principal.ip. |
| (Logique de l'analyseur) | metadata.log_type |
Le type de journal est défini sur BEYONDTRUST_REMOTE_ACCESS. |
| (Logique de l'analyseur) | metadata.product_name |
Le nom du produit est défini sur BeyondTrust Secure Remote Access. |
| (Logique de l'analyseur) | metadata.vendor_name |
Le nom du fournisseur est défini sur BeyondTrust. |
| (Logique de l'analyseur) | security_result.summary |
La valeur est dérivée à l'aide du format User %{eventName}. |
| (Logique de l'analyseur) | extensions.auth.mechanism |
Si method contient using password, le mécanisme est défini sur USERNAME_PASSWORD. Si method contient using elevate, le mécanisme est défini sur REMOTE. |
Vous avez encore besoin d'aide ? Obtenez des réponses de membres de la communauté et de professionnels Google SecOps.