Collecter les journaux Ergon Informatik Airlock IAM
Ce document explique comment ingérer des journaux Airlock IAM Ergon Informatik dans Google Security Operations à l'aide de l'agent Bindplane.
Airlock IAM est une solution de gestion des identités et des accès qui fournit des fonctionnalités d'authentification, d'autorisation et de self-service pour les utilisateurs. Il génère des journaux JSON structurés pour les événements d'authentification, les activités de suivi des utilisateurs, les journaux d'audit et les actions administratives dans ses modules Loginapp, Adminapp, Transaction Approval, Service Container et API Policy Service.
Avant de commencer
Assurez-vous de remplir les conditions suivantes :
- Une instance Google SecOps
- Windows Server 2016 ou version ultérieure, ou un hôte Linux avec
systemd - Connectivité réseau entre l'agent Bindplane et le serveur Airlock IAM
- Si vous exécutez l'agent derrière un proxy, assurez-vous que les ports du pare-feu sont ouverts conformément aux exigences de l'agent Bindplane.
- Accès administrateur à l'instance Airlock IAM
- Accès SSH ou à la console au serveur Airlock IAM pour modifier les fichiers de configuration
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
Installez l'agent Bindplane sur votre système d'exploitation Windows ou Linux en suivant les instructions ci-dessous.
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" /quietAttendez la fin de l'installation.
Vérifiez l'installation en exécutant la commande suivante :
sc query observiq-otel-collectorL'état du service doit être RUNNING (EN COURS D'EXÉCUTION).
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.shAttendez la fin de l'installation.
Vérifiez l'installation en exécutant la commande suivante :
sudo systemctl status observiq-otel-collectorL'état du service doit être active (running).
Ressources d'installation supplémentaires
Pour obtenir d'autres options d'installation et de dépannage, consultez le guide d'installation de l'agent Bindplane.
Configurer l'agent Bindplane pour ingérer les journaux syslog et les envoyer à Google SecOps
Localiser le fichier de configuration
Linux :
sudo nano /etc/bindplane-agent/config.yamlWindows :
notepad "C:\Program Files\observIQ OpenTelemetry Collector\config.yaml"
Modifiez le fichier de configuration
Remplacez l'intégralité du contenu de
config.yamlpar la configuration suivante :receivers: udplog: listen_address: "0.0.0.0:514" exporters: chronicle/airlock_iam: compression: gzip creds_file_path: '/etc/bindplane-agent/ingestion-auth.json' customer_id: 'YOUR_CUSTOMER_ID' endpoint: malachiteingestion-pa.googleapis.com log_type: ERGON_INFORMATIK_AIRLOCK_IAM raw_log_field: body ingestion_labels: env: production source: airlock_iam service: pipelines: logs/airlock_to_chronicle: receivers: - udplog exporters: - chronicle/airlock_iamRemplacez les espaces réservés suivants :
Configuration du récepteur :
listen_address: définissez cette option sur0.0.0.0:514pour écouter sur toutes les interfaces sur le port 51. Pour les systèmes Linux exécutés en tant que non-root, utilisez le port1514ou un port supérieur.
Configuration de l'exportateur :
creds_file_path: chemin d'accès complet au fichier d'authentification de l'ingestion :- Linux :
/etc/bindplane-agent/ingestion-auth.json - Windows :
C:\Program Files\observIQ OpenTelemetry Collector\ingestion-auth.json
- Linux :
YOUR_CUSTOMER_ID: remplacez cette valeur par votre ID client Google SecOps de l'étape précédente.endpoint: URL du point de terminaison régional :- États-Unis :
malachiteingestion-pa.googleapis.com - Europe :
europe-malachiteingestion-pa.googleapis.com - Asie :
asia-southeast1-malachiteingestion-pa.googleapis.com
- États-Unis :
ingestion_labels: libellés facultatifs pour catégoriser les journaux (à modifier si nécessaire)
Exemple de configuration pour Windows
receivers: udplog: listen_address: "0.0.0.0:514" exporters: chronicle/airlock_iam: compression: gzip creds_file_path: 'C:\Program Files\observIQ OpenTelemetry Collector\ingestion-auth.json' customer_id: 'a1b2c3d4-e5f6-g7h8-i9j0-k1l2m3n4o5p6' endpoint: malachiteingestion-pa.googleapis.com log_type: ERGON_INFORMATIK_AIRLOCK_IAM raw_log_field: body ingestion_labels: env: production source: airlock_iam service: pipelines: logs/airlock_to_chronicle: receivers: - udplog exporters: - chronicle/airlock_iam
Enregistrez le fichier de configuration.
Après avoir modifié le fichier, enregistrez-le :
- Linux : appuyez sur
Ctrl+O, puis surEnter, puis surCtrl+X. - Windows : cliquez sur Fichier > Enregistrer.
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 observiq-otel-collectorVérifiez que le service est en cours d'exécution :
sudo systemctl status observiq-otel-collectorRecherchez les erreurs dans les journaux :
sudo journalctl -u observiq-otel-collector -f
Pour redémarrer l'agent Bindplane sous Windows :
Choisissez l'une des options suivantes :
Invite de commandes ou PowerShell en tant qu'administrateur :
net stop observiq-otel-collector && net start observiq-otel-collectorConsole Services :
- Appuyez sur
Win+R, saisissezservices.msc, puis appuyez sur Entrée. - Recherchez observIQ OpenTelemetry Collector.
- Effectuez un clic droit, puis sélectionnez Redémarrer.
- Appuyez sur
Vérifiez que le service est en cours d'exécution :
sc query observiq-otel-collectorRecherchez les erreurs dans les journaux :
type "C:\Program Files\observIQ OpenTelemetry Collector\log\collector.log"
Configurer le transfert syslog Airlock IAM
- Connectez-vous au serveur Airlock IAM à l'aide de SSH ou d'un accès à la console.
Accédez au répertoire de l'instance :
cd /opt/airlock/iam/instances/<instance_name>/Modifiez le fichier de configuration Log4j pour tous les modules :
nano log4j/all-modules.xmlAjoutez la configuration de l'appender Syslog dans la section
<Appenders>:<Syslog name="SYSLOG" facility="LOCAL1" host="BINDPLANE_AGENT_IP" port="514" protocol="UDP" format="RFC5424" includeMDC="true" mdcId="mdc" newLine="true"> <ExceptionPattern>%ex{full}</ExceptionPattern> <ThresholdFilter level="INFO"/> </Syslog>Configurez les paramètres de l'appender Syslog :
- host : remplacez
BINDPLANE_AGENT_IPpar l'adresse IP de l'hôte de l'agent Bindplane (par exemple,192.168.1.100). - port : définissez la valeur sur
514(ou1514si l'agent Bindplane est configuré pour un port non privilégié). - protocol : définissez la valeur sur
UDP(ouTCPsi vous avez configuré le récepteur tcplog dans Bindplane). - format : défini sur
RFC5424pour le format syslog structuré - facility : définissez la valeur sur
LOCAL1(ou sur un autre code d'établissement si nécessaire :LOCAL0àLOCAL7). - Niveau ThresholdFilter : définissez-le sur
INFOpour envoyer les journaux de niveau INFO et supérieur, ou surDEBUGpour tous les journaux.
- host : remplacez
Ajoutez la référence de l'appender dans la section du journaliseur
<Root>:<Loggers> <Root level="${sys:iam.log.level}"> <AppenderRef ref="SYSLOG"/> </Root> </Loggers>Exemple de configuration complète :
<?xml version="1.0" encoding="UTF-8"?> <Configuration name="Custom Log4j 2 Configuration for All IAM Modules"> <Appenders> <Syslog name="SYSLOG" facility="LOCAL1" host="192.168.1.100" port="514" protocol="UDP" format="RFC5424" includeMDC="true" mdcId="mdc" newLine="true"> <ExceptionPattern>%ex{full}</ExceptionPattern> <ThresholdFilter level="INFO"/> </Syslog> </Appenders> <Loggers> <Root level="${sys:iam.log.level}"> <AppenderRef ref="SYSLOG"/> </Root> </Loggers> </Configuration>Enregistrez le fichier de configuration :
Appuyez sur
Ctrl+O, puis surEnter, puis surCtrl+XLa configuration Log4j est surveillée pour détecter les modifications toutes les 60 secondes par défaut. Le nouvel transfert syslog s'activera automatiquement sans nécessiter de redémarrage.
Vérifiez que les journaux sont envoyés à l'agent Bindplane :
sudo journalctl -u observiq-otel-collector -fVérifiez que les journaux arrivent dans Google SecOps :
- Connectez-vous à la console Google SecOps.
- Accédez à SIEM > Rechercher.
Exécutez une requête de recherche :
metadata.log_type = "ERGON_INFORMATIK_AIRLOCK_IAM"Vérifiez que les journaux Airlock IAM apparaissent dans les résultats de recherche.
Options de configuration supplémentaires
Configurer syslog TCP au lieu de UDP
Si vous préférez la diffusion TCP à la diffusion UDP :
Dans le fichier
config.yamlde l'agent Bindplane, remplacez le récepteur partcplog:receivers: tcplog: listen_address: "0.0.0.0:514"Dans le fichier
log4j/all-modules.xmlAirlock IAM, remplacez le protocole parTCP:<Syslog name="SYSLOG" facility="LOCAL1" host="192.168.1.100" port="514" protocol="TCP" format="RFC5424" includeMDC="true" mdcId="mdc" newLine="true"> <ExceptionPattern>%ex{full}</ExceptionPattern> <ThresholdFilter level="INFO"/> </Syslog>Redémarrez l'agent Bindplane pour appliquer la modification du récepteur.
Configurer différents niveaux de journaux
Pour n'envoyer que les journaux de niveau AVERTISSEMENT ou supérieur :
<ThresholdFilter level="WARN"/>Pour envoyer tous les journaux, y compris ceux de débogage :
<ThresholdFilter level="DEBUG"/>
Niveaux de journalisation disponibles, du moins grave au plus grave :
TRACEDEBUGINFOWARNERRORFATAL
Configurer plusieurs instances Airlock IAM
Si plusieurs instances Airlock IAM envoient des données au même agent Bindplane, utilisez des libellés d'ingestion pour les différencier :
exporters: chronicle/airlock_iam_prod: compression: gzip creds_file_path: '/etc/bindplane-agent/ingestion-auth.json' customer_id: 'YOUR_CUSTOMER_ID' endpoint: malachiteingestion-pa.googleapis.com log_type: ERGON_INFORMATIK_AIRLOCK_IAM raw_log_field: body ingestion_labels: env: production instance: prod-iam-01 chronicle/airlock_iam_dev: compression: gzip creds_file_path: '/etc/bindplane-agent/ingestion-auth.json' customer_id: 'YOUR_CUSTOMER_ID' endpoint: malachiteingestion-pa.googleapis.com log_type: ERGON_INFORMATIK_AIRLOCK_IAM raw_log_field: body ingestion_labels: env: development instance: dev-iam-01 service: pipelines: logs/airlock_prod: receivers: - udplog exporters: - chronicle/airlock_iam_prod logs/airlock_dev: receivers: - udplog exporters: - chronicle/airlock_iam_dev
Dépannage
Journaux n'apparaissant pas dans Google SecOps
Vérifiez que l'agent Bindplane reçoit les journaux :
sudo journalctl -u observiq-otel-collector -fVérifiez la connectivité réseau entre Airlock IAM et l'agent Bindplane :
telnet BINDPLANE_AGENT_IP 514Vérifiez que la configuration Log4j est valide :
cat /opt/airlock/iam/instances/<instance_name>/log4j/all-modules.xmlRecherchez les erreurs dans les journaux Airlock IAM :
tail -f /opt/airlock/iam/instances/<instance_name>/logs/loginapp.log
Erreurs liées à l'agent Bindplane
Recherchez les erreurs dans les journaux de l'agent Bindplane :
sudo journalctl -u observiq-otel-collector -n 100Vérifiez que la syntaxe de
config.yamlest correcte. YAML est sensible à l'indentation.Vérifiez que le chemin d'accès au fichier d'authentification de l'ingestion est correct et que le fichier existe.
Testez la connectivité réseau au point de terminaison Google SecOps :
curl -v https://malachiteingestion-pa.googleapis.com
Configuration du pare-feu
Assurez-vous que les règles de pare-feu suivantes sont configurées :
Entrant vers l'agent Bindplane :
- Protocole : UDP (ou TCP si vous utilisez tcplog)
- Port : 514 (ou le port que vous avez configuré)
- Source : adresse IP du serveur Airlock IAM
Sortant de l'agent Bindplane :
- Protocole : HTTPS (TCP 443)
- Destination : point de terminaison régional Google SecOps
- Objectif : envoi des journaux à Google SecOps
Table de mappage UDM
| Champ de journal | Mappage UDM | Logique |
|---|---|---|
| expire_time | additional.fields | Fusionné en tant que libellé avec la clé "expire_time" si elle n'est pas vide |
| mobile | additional.fields | Fusionné en tant que libellé avec la clé "mobile" si elle n'est pas vide |
| sn | additional.fields | Fusionné en tant que libellé avec la clé "sn" si elle n'est pas vide |
| CONFIG_CONTEXT | additional.fields | Fusionné en tant que libellé avec la clé "CONFIG_CONTEXT" si elle n'est pas vide |
| department | additional.fields | Fusionné en tant que libellé avec la clé "department" si elle n'est pas vide |
| ctxData | additional.fields | Fusionné en tant que libellé avec la clé "ctxData" si elle n'est pas vide |
| displayLanguage | additional.fields | Fusionné en tant que libellé avec la clé "displayLanguage" si elle n'est pas vide |
| nrPwdTrialsForUserDeletion | additional.fields | Fusionné en tant que libellé avec la clé "nrPwdTrialsForUserDeletion" si elle n'est pas vide |
| authInstant | additional.fields | Fusionné en tant que libellé avec la clé "authInstant" si elle n'est pas vide |
| auditToken | additional.fields | Fusionné en tant que libellé avec la clé "auditToken" si elle n'est pas vide |
| authPlugin | additional.fields | Fusionné en tant que libellé avec la clé "authPlugin" si elle n'est pas vide |
| latestIdPropagation | additional.fields | Fusionné en tant que libellé avec la clé "latestIdPropagation" si elle n'est pas vide |
| service | additional.fields | Fusionné en tant que libellé avec la clé "service" si elle n'est pas vide |
| ldap_type | additional.fields | Fusionné en tant que libellé avec la clé "ldap_type" si elle n'est pas vide |
| report_message | additional.fields | Fusionné en tant que libellé avec la clé "report_message" si la valeur n'est pas vide |
| authenteeProvidedId | additional.fields | Fusionné en tant que libellé avec la clé "authenteeProvidedId" si elle n'est pas vide |
| representerId | additional.fields | Fusionné en tant que libellé avec la clé "representerId" si elle n'est pas vide |
| moteur | additional.fields | Fusionné en tant que libellé avec la clé "engine" si elle n'est pas vide |
| channel | additional.fields | Fusionné en tant que libellé avec la clé "channel" si elle n'est pas vide |
| authnFactor | additional.fields | Fusionné en tant que libellé avec la clé "authnFactor" si elle n'est pas vide |
| authnFactorDetail | additional.fields | Fusionné en tant que libellé avec la clé "authnFactorDetail" si elle n'est pas vide |
| required_roles | additional.fields | Fusionné en tant que libellé avec la clé "required_roles" si elle n'est pas vide |
| target_pattern | additional.fields | Fusionné en tant que libellé avec la clé "target_pattern" si elle n'est pas vide |
| nameid | additional.fields | Fusionné en tant que libellé avec la clé "nameid" si elle n'est pas vide |
| plugin_name | additional.fields | Fusionné en tant que libellé avec la clé "plugin_name" si elle n'est pas vide |
| mécanisme | additional.fields | Fusionné en tant que libellé avec la clé "mechanism" si elle n'est pas vide |
| new_session_id | additional.fields | Fusionné en tant que libellé avec la clé "new_session_id" si elle n'est pas vide |
| former_session_id | additional.fields | Fusionné en tant que libellé avec la clé "former_session_id" si elle n'est pas vide |
| req_id | additional.fields | Fusionné en tant que libellé avec la clé "req_id" si elle n'est pas vide |
| auth_method | additional.fields | Fusionné en tant que libellé avec la clé "auth_method" si elle n'est pas vide |
| otp | additional.fields | Fusionné en tant que libellé avec la clé "otp" si elle n'est pas vide |
| mob_num | additional.fields | Fusionné en tant que libellé avec la clé "mob_num" si elle n'est pas vide |
| jsessionid | additional.fields | Fusionné en tant que libellé avec la clé "jsessionid" si elle n'est pas vide |
| date de création | additional.fields | Fusionné en tant que libellé avec la clé "creationDate" si elle n'est pas vide |
| lastLogin | additional.fields | Fusionné en tant que libellé avec la clé "lastLogin" si elle n'est pas vide |
| accountStatus | additional.fields | Fusionné en tant que libellé avec la clé "accountStatus" si elle n'est pas vide |
| companyAdministrator | additional.fields | Fusionné en tant que libellé avec la clé "companyAdministrator" si elle n'est pas vide |
| companyCustomer | additional.fields | Fusionné en tant que libellé avec la clé "companyCustomer" si elle n'est pas vide |
| privateCustomer | additional.fields | Fusionné en tant que libellé avec la clé "privateCustomer" si elle n'est pas vide |
| otpNotifyChannel | additional.fields | Fusionné en tant que libellé avec la clé "otpNotifyChannel" si elle n'est pas vide |
| nas_identifier | additional.fields | Fusionné en tant que libellé avec la clé "nas_identifier" si elle n'est pas vide |
| session_id | additional.fields | Fusionné en tant que libellé avec la clé "session_id" si elle n'est pas vide |
| authPluginClassName | extensions.auth.auth_details | Valeur copiée directement si elle est présente |
| authenticator_type | extensions.auth.auth_details | Valeur copiée directement si elle est présente et que authPluginClassName est vide |
| logon_type | extensions.auth.mechanism | Valeur copiée directement |
| N/A | intermédiaire | Fusionné à partir d'un objet intermédiaire |
| FORWARD_LOCATION | intermediary.url | Valeur copiée directement |
| metadata_description | metadata.description | Valeur copiée directement |
| N/A | metadata.event_type | Définie en fonction du contexte de l'événement ; déterminée par la logique de l'analyseur |
| REQUEST_ID | metadata.product_log_id | Valeur copiée directement |
| airlock_version | metadata.product_version | Valeur copiée directement |
| method | network.http.method | Valeur copiée directement |
| user_agent | network.http.user_agent | Valeur copiée directement |
| packet_size | network.received_packets | Valeur convertie en entier |
| GSID | network.session_id | Valeur copiée directement |
| hôte | principal.hostname | Valeur copiée directement |
| CLIENT_IP | principal.ip | Valeur copiée directement |
| UID | principal.user.userid | Valeur copiée directement |
| role_name | role.name | Valeur copiée directement |
| authenteeType | role.type | Valeur copiée directement |
| N/A | security_result | Fusionné à partir de l'objet security_result |
| action | security_result.action_details | Valeur copiée directement si elle est présente |
| authMethodShortDesc | security_result.action_details | Valeur fusionnée si elle est présente |
| action_detail | security_result.action_details | Valeur fusionnée si elle est présente |
| category_value | security_result.category | Valeur copiée directement |
| actionGroup | security_result.category_details | Valeur copiée directement |
| result_description | security_result.description | Valeur copiée directement |
| exception | security_result.summary | Valeur copiée directement si elle est présente |
| STATLOG | security_result.summary | Valeur copiée directement si elle est présente et que l'exception est vide |
| mob_num | src.asset.type | Valeur copiée directement |
| src.email | Valeur copiée directement si elle est présente | |
| src.email | Valeur copiée directement si elle est présente et que l'e-mail est vide | |
| src_ip | src.ip | Valeur copiée directement |
| src_port | src.port | Valeur convertie en entier |
| rôle | src.user.attribute.roles | Valeur copiée directement |
| notre société | src.user.company_name | Valeur copiée directement |
| firstName | src.user.first_name | Valeur copiée directement |
| lastName | src.user.last_name | Valeur copiée directement |
| état | src.user.user_authentication_status | Valeur copiée directement |
| displayName | src.user.user_display_name | Valeur copiée directement si elle est présente |
| nom d'utilisateur | src.user.user_display_name | La valeur est copiée directement si elle est présente et que displayName est vide. |
| src_user | src.user.user_display_name | Valeur copiée directement si elle est présente et que displayName/username sont vides |
| authenteeId | src.user.userid | Valeur copiée directement si elle est présente |
| src_userid | src.user.userid | Valeur copiée directement si elle est présente et que authenticityId est vide |
| UID | src.user.userid | Valeur copiée directement si elle est présente et si authenteeId/src_userid sont vides |
| file_path | target.file.full_path | Valeur copiée directement |
| target_hostname | target.hostname | Valeur copiée directement |
| target_port | target.port | Valeur convertie en entier |
| task_name | target.resource.name | Valeur copiée directement |
| target_url | target.url | Valeur copiée directement |
| N/A | metadata.product_name | Définissez la valeur sur "Ergon Informatik Airlock IAM". |
| N/A | metadata.vendor_name | Définir sur "Ergon Informatik" |
Vous avez encore besoin d'aide ? Obtenez des réponses de membres de la communauté et de professionnels Google SecOps.