Collecter les journaux CyberArk PAM
Ce code d'analyseur extrait d'abord les champs des messages syslog CyberArk Privileged Access Manager (PAM) à l'aide d'expressions régulières. Il mappe ensuite les champs extraits à un modèle de données unifié (UDM), en enrichissant les données avec un contexte supplémentaire et en normalisant 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 le programme 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 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
- Pour installer sous Windows, exécutez le script suivant :
msiexec /i "https://github.com/observIQ/bindplane-agent/releases/latest/download/observiq-otel-collector.msi" /quiet
- Pour installer sous 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
- Vous trouverez d'autres options d'installation dans ce guide d'installation.
Configurer l'agent Bindplane pour ingérer les journaux Syslog et les envoyer à Google SecOps
- Accédez à la machine sur laquelle l'agent 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'emplacement suivant :C:\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'adresse suivante :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'adresse suivante :/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
Table de mappage UDM
Champ de journal | Mappage UDM | Logique |
---|---|---|
agir | metadata.description | Mappé directement à partir du champ act . |
cn1 | additional.fields.value.string_value | Directement mappé à partir du champ cn1 lorsque cn1Label n'est pas vide. |
cn1Label | additional.fields.key | Directement mappé à partir du champ cn1Label lorsque cn1 n'est pas vide. |
cn2 | additional.fields.value.string_value | Directement mappé à partir du champ cn2 lorsque cn2Label n'est pas vide. |
cn2Label | additional.fields.key | Directement mappé à partir du champ cn2Label lorsque cn2 n'est pas vide. |
cs1 | additional.fields.value.string_value | Directement mappé à partir du champ cs1 lorsque cs1Label n'est pas vide. |
cs1Label | additional.fields.key | Directement mappé à partir du champ cs1Label lorsque cs1 n'est pas vide. |
cs2 | additional.fields.value.string_value | Directement mappé à partir du champ cs2 lorsque cs2Label n'est pas vide. |
cs2Label | additional.fields.key | Directement mappé à partir du champ cs2Label lorsque cs2 n'est pas vide. |
cs3 | additional.fields.value.string_value | Directement mappé à partir du champ cs3 lorsque cs3Label n'est pas vide. |
cs3Label | additional.fields.key | Directement mappé à partir du champ cs3Label lorsque cs3 n'est pas vide. |
cs4 | additional.fields.value.string_value | Directement mappé à partir du champ cs4 lorsque cs4Label n'est pas vide. |
cs4Label | additional.fields.key | Directement mappé à partir du champ cs4Label lorsque cs4 n'est pas vide. |
cs5 | additional.fields.value.string_value | Directement mappé à partir du champ cs5 lorsque cs5Label n'est pas vide. |
cs5Label | additional.fields.key | Directement mappé à 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 | Utilisé pour déterminer le 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 que 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 ce champ est vide, il est mappé à partir de shost si shost n'est pas une adresse IP. |
prin_hostname | principal.asset.hostname | Mappé directement à partir du champ prin_hostname . Si ce champ est vide, il est mappé à partir de shost si shost n'est pas une adresse IP. |
prin_ip | principal.ip | Mappé directement à partir du champ prin_ip . Si elle est vide, elle est mappée à partir de shost si shost est une adresse IP. |
prin_ip | principal.asset.ip | Mappé directement à partir du champ prin_ip . Si elle est vide, elle est mappée à partir de shost si shost est une adresse IP. |
produit | metadata.product_name | Mappé directement à partir du champ product . Si elle n'est pas présente dans le journal, la valeur par défaut est "PAM". |
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 | Directement mappé à partir du champ time après conversion au format de code temporel. |
temps | metadata.event_timestamp.nanos | Directement mappé à partir du champ time après conversion au format de code temporel. |
vendor | metadata.vendor_name | Mappé directement à partir du champ vendor . Si elle n'est pas présente dans le journal, la valeur par défaut est "CYBERARK". |
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 défini sur "USER_LOGIN". |
Vous avez encore besoin d'aide ? Obtenez des réponses de membres de la communauté et de professionnels Google SecOps.