Collecter les journaux Ergon Informatik Airlock IAM

Compatible avec :

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

  1. Connectez-vous à la console Google SecOps.
  2. Accédez à Paramètres du SIEM > Agents de collecte.
  3. 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

  1. Connectez-vous à la console Google SecOps.
  2. Accédez à Paramètres SIEM> Profil.
  3. 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

  1. Ouvrez l'invite de commandes ou PowerShell en tant qu'administrateur.
  2. Exécutez la commande suivante :

    msiexec /i "https://github.com/observIQ/bindplane-agent/releases/latest/download/observiq-otel-collector.msi" /quiet
    
  3. Attendez la fin de l'installation.

  4. Vérifiez l'installation en exécutant la commande suivante :

    sc query observiq-otel-collector
    

    L'état du service doit être RUNNING (EN COURS D'EXÉCUTION).

Installation de Linux

  1. Ouvrez un terminal avec les droits root ou sudo.
  2. 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
    
  3. Attendez la fin de l'installation.

  4. Vérifiez l'installation en exécutant la commande suivante :

    sudo systemctl status observiq-otel-collector
    

    L'é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.yaml
    
  • Windows :

    notepad "C:\Program Files\observIQ OpenTelemetry Collector\config.yaml"
    

Modifiez le fichier de configuration

  1. Remplacez l'intégralité du contenu de config.yaml par 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_iam
    
  2. Remplacez les espaces réservés suivants :

    • Configuration du récepteur :

      • listen_address : définissez cette option sur 0.0.0.0:514 pour écouter sur toutes les interfaces sur le port 51. Pour les systèmes Linux exécutés en tant que non-root, utilisez le port 1514 ou 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
      • 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
      • 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 sur Enter, puis sur Ctrl+X.
  • Windows : cliquez sur Fichier > Enregistrer.

Redémarrez l'agent Bindplane pour appliquer les modifications.

  • Pour redémarrer l'agent Bindplane sous Linux :

    1. Exécutez la commande suivante :

      sudo systemctl restart observiq-otel-collector
      
    2. Vérifiez que le service est en cours d'exécution :

      sudo systemctl status observiq-otel-collector
      
    3. Recherchez les erreurs dans les journaux :

      sudo journalctl -u observiq-otel-collector -f
      
  • Pour redémarrer l'agent Bindplane sous Windows :

    1. Choisissez l'une des options suivantes :

      • Invite de commandes ou PowerShell en tant qu'administrateur :

        net stop observiq-otel-collector && net start observiq-otel-collector
        
      • Console Services :

        1. Appuyez sur Win+R, saisissez services.msc, puis appuyez sur Entrée.
        2. Recherchez observIQ OpenTelemetry Collector.
        3. Effectuez un clic droit, puis sélectionnez Redémarrer.
    2. Vérifiez que le service est en cours d'exécution :

      sc query observiq-otel-collector
      
    3. Recherchez les erreurs dans les journaux :

      type "C:\Program Files\observIQ OpenTelemetry Collector\log\collector.log"
      

Configurer le transfert syslog Airlock IAM

  1. Connectez-vous au serveur Airlock IAM à l'aide de SSH ou d'un accès à la console.
  2. Accédez au répertoire de l'instance :

    cd /opt/airlock/iam/instances/<instance_name>/
    
  3. Modifiez le fichier de configuration Log4j pour tous les modules :

    nano log4j/all-modules.xml
    
  4. Ajoutez 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>
    
  5. Configurez les paramètres de l'appender Syslog :

    • host : remplacez BINDPLANE_AGENT_IP par l'adresse IP de l'hôte de l'agent Bindplane (par exemple, 192.168.1.100).
    • port : définissez la valeur sur 514 (ou 1514 si l'agent Bindplane est configuré pour un port non privilégié).
    • protocol : définissez la valeur sur UDP (ou TCP si vous avez configuré le récepteur tcplog dans Bindplane).
    • format : défini sur RFC5424 pour 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 INFO pour envoyer les journaux de niveau INFO et supérieur, ou sur DEBUG pour tous les journaux.
  6. 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>
    
  7. 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>
    
  8. Enregistrez le fichier de configuration :

    Appuyez sur Ctrl+O, puis sur Enter, puis sur Ctrl+X

  9. La 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.

  10. Vérifiez que les journaux sont envoyés à l'agent Bindplane :

    sudo journalctl -u observiq-otel-collector -f
    
  11. Vérifiez que les journaux arrivent dans Google SecOps :

    1. Connectez-vous à la console Google SecOps.
    2. Accédez à SIEM > Rechercher.
    3. Exécutez une requête de recherche :

      metadata.log_type = "ERGON_INFORMATIK_AIRLOCK_IAM"
      
    4. 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 :

  1. Dans le fichier config.yaml de l'agent Bindplane, remplacez le récepteur par tcplog :

    receivers:
      tcplog:
        listen_address: "0.0.0.0:514"
    
  2. Dans le fichier log4j/all-modules.xml Airlock IAM, remplacez le protocole par TCP :

    <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>
    
  3. 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 :

  • TRACE
  • DEBUG
  • INFO
  • WARN
  • ERROR
  • FATAL

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

  1. Vérifiez que l'agent Bindplane reçoit les journaux :

    sudo journalctl -u observiq-otel-collector -f
    
  2. Vérifiez la connectivité réseau entre Airlock IAM et l'agent Bindplane :

    telnet BINDPLANE_AGENT_IP 514
    
  3. Vérifiez que la configuration Log4j est valide :

    cat /opt/airlock/iam/instances/<instance_name>/log4j/all-modules.xml
    
  4. Recherchez les erreurs dans les journaux Airlock IAM :

    tail -f /opt/airlock/iam/instances/<instance_name>/logs/loginapp.log
    

Erreurs liées à l'agent Bindplane

  1. Recherchez les erreurs dans les journaux de l'agent Bindplane :

    sudo journalctl -u observiq-otel-collector -n 100
    
  2. Vérifiez que la syntaxe de config.yaml est correcte. YAML est sensible à l'indentation.

  3. Vérifiez que le chemin d'accès au fichier d'authentification de l'ingestion est correct et que le fichier existe.

  4. 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
mail src.email Valeur copiée directement si elle est présente
e-mail 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.