Collecter les journaux PAM CyberArk
Ce code d'analyseur extrait d'abord les champs des messages syslog du PAM (Privileged Access Manager) CyberArk à l'aide d'expressions régulières. Ensuite, il met en correspondance les champs extraits avec un modèle de données unifié (UDM), enrichit les données avec un contexte supplémentaire et standardise le type d'événement en fonction de critères spécifiques.
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.
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.
Obtenir le numéro client Google SecOps
- Connectez-vous à la console Google SecOps.
- Accédez à Paramètres du SIEM > Profil.
- Copiez et sauvegardez l'ID client dans la section Détails de l'organisation.
Installer l'agent BindPlane
- Pour l'installation sous Windows, exécutez le script suivant:
msiexec /i "https://github.com/observIQ/bindplane-agent/releases/latest/download/observiq-otel-collector.msi" /quiet
- Pour l'installation Linux, exécutez le script suivant:
sudo sh -c "$(curl -fsSlL https://github.com/observiq/bindplane-agent/releases/latest/download/install_unix.sh)" install_unix.sh
- Pour en savoir plus sur les options d'installation, consultez ce guide d'installation.
Configurer l'agent BindPlane pour ingérer Syslog et l'envoyer à Google SecOps
- Accédez à la machine sur laquelle BindPlane est installé.
Modifiez le fichier
config.yaml
comme suit :receivers: tcplog: # Replace the below port <54525> and IP <0.0.0.0> with your specific values listen_address: "0.0.0.0:54525" exporters: chronicle/chronicle_w_labels: compression: gzip # Adjust the creds location below according the placement of the credentials file you downloaded creds: '{ json file for creds }' # Replace <customer_id> below with your actual ID that you copied customer_id: <customer_id> endpoint: malachiteingestion-pa.googleapis.com # You can apply ingestion labels below as preferred ingestion_labels: log_type: SYSLOG namespace: Cyberark_PAM raw_log_field: body service: pipelines: logs/source0__chronicle_w_labels-0: receivers: - tcplog exporters: - chronicle/chronicle_w_labels
Redémarrez l'agent BindPlane pour appliquer les modifications:
sudo systemctl restart bindplane
Configurer l'exportation Syslog pour CyberArk Vault
- Connectez-vous au serveur Vault.
- Ouvrez le fichier de configuration
dbparm.ini
, situé à l'emplacementC:\Program Files (x86)\CyberArk\Vault\Server\dbparm.ini
. Ajoutez ou modifiez les paramètres suivants:
SyslogServer=<syslog_server_ip> SyslogPort=<syslog_server_port> SyslogProtocol=<TCP or UDP> SyslogFormat=Syslog
Enregistrez le fichier
dbparm.ini
.Redémarrez le serveur Vault:
net stop CyberArkVault net start CyberArkVault
Configurer l'exportation Syslog dans PVWA
- Connectez-vous au serveur PVWA.
- Ouvrez le fichier
Web.config
, situé à l'emplacement suivant:C:\inetpub\wwwroot\PasswordVault\
. Ajoutez ou modifiez les clés suivantes:
<add key="SyslogServer" value="<syslog_server_ip>" /> <add key="SyslogPort" value="<syslog_server_port>" /> <add key="SyslogProtocol" value="<TCP or UDP>" /> <add key="SyslogFormat" value="Syslog" />
Enregistrez les modifications apportées au fichier
Web.config
.Redémarrez le service IIS:
iisreset
Configurer l'exportation Syslog dans PTA
- Accédez au serveur PTA à l'aide de SSH.
- Ouvrez le fichier
application.properties
, situé à l'emplacement suivant:/opt/cta/config/application.properties
. Ajoutez ou modifiez les lignes suivantes:
syslog.server.ip=<syslog_server_ip> syslog.server.port=<syslog_server_port> syslog.protocol=<TCP or UDP>
Enregistrez le fichier
application.properties
.Redémarrez le service PTA pour appliquer les modifications:
sudo service pta restart
Tableau de mappage UDM
Champ de journal | Mappage UDM | Logique |
---|---|---|
agir | metadata.description | Mappé directement à partir du champ act . |
cn1 | additional.fields.value.string_value | Mappé directement à partir du champ cn1 lorsque cn1Label n'est pas vide. |
cn1Label | additional.fields.key | Mappé directement à partir du champ cn1Label lorsque cn1 n'est pas vide. |
cn2 | additional.fields.value.string_value | Mappé directement à partir du champ cn2 lorsque cn2Label n'est pas vide. |
cn2Label | additional.fields.key | Mappage direct à partir du champ cn2Label lorsque cn2 n'est pas vide. |
cs1 | additional.fields.value.string_value | Mappage direct à partir du champ cs1 lorsque cs1Label n'est pas vide. |
cs1Label | additional.fields.key | Mappé directement à partir du champ cs1Label lorsque cs1 n'est pas vide. |
cs2 | additional.fields.value.string_value | Mappé directement à partir du champ cs2 lorsque cs2Label n'est pas vide. |
cs2Label | additional.fields.key | Mappage direct à partir du champ cs2Label lorsque cs2 n'est pas vide. |
cs3 | additional.fields.value.string_value | Mappé directement à partir du champ cs3 lorsque cs3Label n'est pas vide. |
cs3Label | additional.fields.key | Mappé directement à partir du champ cs3Label lorsque cs3 n'est pas vide. |
cs4 | additional.fields.value.string_value | Mappé directement à partir du champ cs4 lorsque cs4Label n'est pas vide. |
cs4Label | additional.fields.key | Mappé directement à partir du champ cs4Label lorsque cs4 n'est pas vide. |
cs5 | additional.fields.value.string_value | Mappé directement à partir du champ cs5 lorsque cs5Label n'est pas vide. |
cs5Label | additional.fields.key | Mappé directement à partir du champ cs5Label lorsque cs5 n'est pas vide. |
dhost | target.hostname | Mappé à partir du champ dhost s'il ne s'agit pas d'une adresse IP. Si dhost est vide, il est mappé à partir de shost (adresse IP ou nom d'hôte). |
dhost | target.asset.hostname | Mappé à partir du champ dhost s'il ne s'agit pas d'une adresse IP. Si dhost est vide, il est mappé à partir de shost (adresse IP ou nom d'hôte). |
dhost | target.ip | Mappé à partir du champ dhost s'il s'agit d'une adresse IP. |
dhost | target.asset.ip | Mappé à partir du champ dhost s'il s'agit d'une adresse IP. |
duser | target.user.userid | Mappé directement à partir du champ duser . |
dvc | intermediary.ip | Mappé à partir du champ dvc s'il s'agit d'une adresse IP. |
externalId | metadata.product_log_id | Mappé directement à partir du champ externalId . |
fname | target.file.full_path | Mappé directement à partir du champ fname . |
nom | metadata.event_type | Permet de déterminer event_type en fonction de la combinaison des champs name , shost et dhost . Valeurs possibles: USER_CHANGE_PASSWORD, FILE_READ, USER_LOGIN, FILE_OPEN, FILE_DELETION. Si aucune correspondance n'est trouvée, et si has_principal est défini sur "true" et has_target sur "false", event_type est défini sur STATUS_UPDATE. Sinon, la valeur par défaut est GENERIC_EVENT. |
prin_hostname | principal.hostname | Mappé directement à partir du champ prin_hostname . Si elle est vide, elle est mappée à partir de shost si shost n'est pas une adresse IP. |
prin_hostname | principal.asset.hostname | Mappé directement à partir du champ prin_hostname . Si elle est vide, elle est mappée à partir de shost si shost n'est pas une adresse IP. |
prin_ip | principal.ip | Mappé directement à partir du champ prin_ip . S'il est vide, il est mappé à partir de shost si shost est une adresse IP. |
prin_ip | principal.asset.ip | Mappé directement à partir du champ prin_ip . S'il est vide, il est mappé à partir de shost si shost est une adresse IP. |
produit | metadata.product_name | Mappé directement à partir du champ product . La valeur par défaut est "PAM" si elle n'est pas présente dans le journal. |
reason | security_result.description | Mappé directement à partir du champ reason . |
de gravité, | security_result.severity | Mappé à partir du champ severity selon la logique suivante: 1 à 3: INFORMATIONAL, 4: ERROR, 5: CRITICAL. |
shost | principal.hostname | Mappé sur prin_hostname si prin_hostname est vide et que shost n'est pas une adresse IP. |
shost | principal.asset.hostname | Mappé sur prin_hostname si prin_hostname est vide et que shost n'est pas une adresse IP. |
shost | principal.ip | Mappé sur prin_ip si prin_ip est vide et que shost est une adresse IP. |
shost | principal.asset.ip | Mappé sur prin_ip si prin_ip est vide et que shost est une adresse IP. |
shost | target.hostname | Mappé sur target.hostname si dhost est vide et que shost n'est pas une adresse IP. |
shost | target.asset.hostname | Mappé sur target.hostname si dhost est vide et que shost n'est pas une adresse IP. |
shost | target.ip | Mappé sur target.ip si dhost est vide et que shost est une adresse IP. |
shost | target.asset.ip | Mappé sur target.ip si dhost est vide et que shost est une adresse IP. |
état | additional.fields.value.string_value | Mappé directement à partir du champ status . |
suser | principal.user.userid | Mappé à partir du champ suser . Si duser est vide, il est considéré comme l'ID utilisateur cible. |
temps | metadata.event_timestamp.seconds | Mappé directement à partir du champ time après conversion au format code temporel. |
temps | metadata.event_timestamp.nanos | Mappé directement à partir du champ time après conversion au format code temporel. |
vendor | metadata.vendor_name | Mappé directement à partir du champ vendor . La valeur par défaut est "CYBERARK" si elle n'est pas présente dans le journal. |
version | metadata.product_version | Mappé directement à partir du champ version . |
metadata.log_type | Codé en dur sur "CYBERARK_PAM". | |
extensions.auth.mechanism | Définissez-le sur "USERNAME_PASSWORD" si event_type est "USER_LOGIN". |
Modifications
2024-05-05
- Analyseur nouvellement créé.