Collecter les journaux de l'accès à distance sécurisé BeyondTrust
Ce document explique comment collecter les journaux de 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 une barre oblique. L'analyseur extrait les champs pertinents des deux formats et les met en correspondance avec l'UDM. Il effectue également une catégorisation des 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 l'application 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 le numéro client Google SecOps
- Connectez-vous à la console Google SecOps.
- Accédez à Paramètres du SIEM > Profil.
- Copiez et sauvegardez le numéro client dans la section Détails de l'organisation.
Installer l'agent Bindplane
Installation de Windows
- Ouvrez l'invite de commande 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 des 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
Autres ressources d'installation
- Pour plus d'options d'installation, consultez ce guide d'installation.
Configurer l'agent Bindplane pour qu'il ingère les journaux Syslog et les envoie à 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 (
nano
,vi
ou Bloc-notes, par exemple).
- Recherchez le fichier
Modifiez le fichier
config.yaml
comme 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_labels
Remplacez le port et l'adresse IP dans votre infrastructure si nécessaire.
Remplacez
<customer_id>
par le numéro client réel.Remplacez
/path/to/ingestion-authentication-file.json
par le chemin d'accès où le fichier d'authentification a été enregistré dans la section Obtenir le fichier d'authentification d'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-agent
Pour 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 de BeyondTrust.
- Sélectionnez Appliance > Security > Appliance administration (Appareil > Sécurité > Administration de l'appli).
- 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 de Bindplane.
- Cliquez sur Envoyer.
Tableau de mappage UDM
Champ de journal | Mappage UDM | Logique |
---|---|---|
datetime |
metadata.event_timestamp |
L'horodatage est extrait du champ datetime au format RFC 3339 si le champ when n'est pas présent. |
deviceHost |
target.hostname |
La valeur de deviceHost est mappée directement sur target.hostname . |
dstHost |
target.ip |
La valeur de dstHost est mappée directement 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 mappée directement sur target.user.userid . |
dstUser |
target.user.user_display_name |
La valeur de dstUser est mappée directement sur target.user.user_display_name . |
eventName |
metadata.event_type |
Si eventName est login (sans distinction entre majuscules et minuscules), metadata.event_type est défini sur USER_LOGIN . Si eventName est logout (sans distinction entre majuscules et minuscules), 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 format 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 avec le champ id pour renseigner metadata.product_event_type au format [ id] - nom_événement``. |
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 avec le champ event_name pour renseigner metadata.product_event_type au format [ id] - nom_événement``. |
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 |
Divers champs UDM | Le champ kv_data est analysé en paires clé-valeur, qui sont ensuite mappées sur différents champs UDM en fonction de leurs clés (par exemple, eventName , when , who , who_ip , site , target , status , reason ). |
kvdata |
Divers champs UDM | Le champ kvdata est analysé en paires clé-valeur, qui sont ensuite mappées sur 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 |
Divers champs UDM | Le champ message est analysé à l'aide de modèles Grok pour extraire différents champs, qui sont ensuite mappés sur des champs UDM. |
msg |
metadata.description |
La valeur de msg est mappée directement sur metadata.description . |
product_event_type |
metadata.product_event_type |
La valeur de product_event_type est mappée directement sur metadata.product_event_type . |
product_log_id |
metadata.product_log_id |
La valeur de product_log_id est mappée directement sur metadata.product_log_id . |
process_id |
principal.process.pid |
La valeur de process_id est mappée directement sur principal.process.pid . |
reason |
security_result.description |
La valeur de reason est mappée directement sur 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 mappée directement sur network.session_id . |
site |
target.hostname |
La valeur de site est mappée directement sur 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 mappée directement sur principal.ip après avoir été validée en tant qu'adresse IP valide. |
srcUid |
principal.user.userid |
La valeur de srcUid est mappée directement sur principal.user.userid . |
srcUser |
principal.user.user_display_name |
La valeur de srcUser est mappée directement sur principal.user.user_display_name . |
status |
security_result.action |
Si status est failure (sans distinction entre majuscules et minuscules), 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 mappée directement sur security_result.action_details . |
target |
target.application |
La valeur de target est mappée directement sur target.application . rep_client est remplacé par Representative Console et web/login par Web/Login . |
target |
extensions.auth.type |
Si target est rep_client , extensions.auth.type est défini sur MACHINE . Si target est web/login , extensions.auth.type est défini sur SSO . Sinon, extensions.auth.type est défini sur AUTHTYPE_UNSPECIFIED . |
timestamp |
metadata.event_timestamp |
L'timestamp du journal brut est utilisé en remplacement 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 mappée directement sur metadata.product_version . |
when |
metadata.event_timestamp |
Le code temporel est extrait 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'ensemble du champ who est mappé 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 mappée directement sur 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 . |
Modifications
2022-09-30
Amélioration :
- J'ai écrit grok pour analyser les journaux système non analysés.
- Mappage de
device_vendor
suradditional.fields
. - Mappage de
event_name
suradditional.fields
. - Mappage de
device_product
suradditional.fields
. - Mappage de
externalKeyLabel
suradditional.fields
. - Mappage de
dstPriv
suradditional.fields
. - Mappage de
filePath
surtarget.file.full_path
. - Mappage de
fsize
surtarget.file.size
.
2022-07-14
- Analyseur nouvellement créé.
Vous avez encore besoin d'aide ? Obtenez des réponses de membres de la communauté et de professionnels Google SecOps.