Collecter les journaux NGINX

Compatible avec:

Cet analyseur NGINX gère les journaux au format JSON et syslog. Il extrait des champs de différents formats de journaux et les normalise au format UDM. L'analyseur enrichit l'événement de métadonnées pour la gestion du serveur et l'activité réseau, y compris les connexions des utilisateurs et les requêtes HTTP. Il gère également la logique des événements SSH et renseigne les champs UDM en fonction des données extraites.

Avant de commencer

  • Assurez-vous de disposer d'une instance Google Security Operations.
  • Assurez-vous que NGINX s'exécute et génère des journaux.
  • Assurez-vous de disposer d'un accès racine à la machine hôte NGINX.

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.

Obtenir le numéro client Google SecOps

  1. Connectez-vous à la console Google SecOps.
  2. Accédez à Paramètres du SIEM > Profil.
  3. Copiez et sauvegardez l'ID client dans la section Détails de l'organisation.

Installer l'agent BindPlane

  1. 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
  2. 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
  3. 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

  1. Accédez à la machine sur laquelle BindPlane est installé.
  2. 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: auditd
            raw_log_field: body
    service:
        pipelines:
            logs/source0__chronicle_w_labels-0:
                receivers:
                    - tcplog
                exporters:
                    - chronicle/chronicle_w_labels
    
  3. Redémarrez l'agent BindPlane pour appliquer les modifications:

    sudo systemctl restart bindplane
    

Identifier l'emplacement des fichiers journaux NGINX

Les journaux NGINX sont stockés dans : * Journaux d'accès: /var/log/nginx/access.log * Journaux d'erreurs: /var/log/nginx/error.log 1. Accédez à l'hôte NGINX à l'aide d'identifiants d'administrateur. 1. Exécutez la commande suivante et recherchez les chemins d'accès aux fichiers journaux sur votre hôte NGINX:

  sudo cat /etc/nginx/nginx.conf | grep log

Configurer NGINX pour transférer les journaux vers Bindplane

  1. Ouvrez le fichier de configuration NGINX (par exemple, /etc/nginx/nginx.conf):

    sudo vi /etc/nginx/nginx.conf
    
  2. Modifiez la configuration en remplaçant <BINDPLANE_SERVER> et <BINDPLANE_PORT> par vos valeurs:

    http {
        access_log syslog:server=<BINDPLANE_SERVER>:<BINDPLANE_PORT>,facility=local7,tag=nginx_access;
        error_log syslog:server=<BINDPLANE_SERVER>:<BINDPLANE_PORT>,facility=local7,tag=nginx_error;
    }
    
  3. Redémarrez NGINX pour appliquer les modifications:

    sudo systemctl reload nginx
    

Tableau de mappage UDM

Champ de journal Mappage UDM Logique
_Internal_WorkspaceResourceId target.resource.product_object_id Mappage direct
Computer principal.asset.hostname Mappage direct
Facility additional.fields["facility"] Mappage direct
HostName principal.asset.hostname Mappé directement si src_ip n'est pas présent
ProcessName principal.application Mappage direct
SeverityLevel security_result.severity Correspond à "INFORMATIONAL" si la valeur est "info"
SourceSystem principal.asset.platform Mappé sur LINUX si la valeur correspond à "Linux"
SyslogMessage Plusieurs champs Analyse avec grok pour extraire time, method, target_path, protocol, response_code, referral_url, user_agent, target_ip, target_host et cache
TenantId additional.fields["TenantId"] Mappage direct
acct principal.user.user_id Mappage direct s'il n'est pas vide ou s'il contient "?"
addr principal.asset.ip Mappage direct
audit_epoch metadata.event_timestamp Converti en code temporel au format "UNIX". Les nanosecondes sont extraites du message de journal d'origine.
cache additional.fields["cache"] Mappage direct
collection_time.nanos metadata.event_timestamp.nanos Utilisé pour les nanosecondes de l'horodatage de l'événement, le cas échéant
collection_time.seconds metadata.event_timestamp.seconds Utilisé pour les secondes de l'horodatage de l'événement, le cas échéant
data Plusieurs champs Source principale de données, analysée différemment en fonction du format de journal (Syslog, JSON ou autre)
exe target.process.command_line Mappage direct après suppression des barres obliques arrière et des guillemets
hostname principal.asset.hostname OU principal.asset.ip S'il s'agit d'une adresse IP, elle est mappée sur principal.asset.ip. Sinon, mappé sur principal.asset.hostname
msg metadata.description Mappé directement en tant que description
node target.asset.hostname Mappage direct
pid target.process.pid Mappage direct
protocol network.application_protocol Correspond à HTTP si la valeur correspond à "HTTP"
referral_url network.http.referral_url Mappage direct s'il n'est pas vide ou s'il ne correspond pas à "-"
res security_result.action_details Mappage direct
response_code network.http.response_code Mappé directement et converti en entier
ses network.session_id Mappage direct
src_ip principal.asset.ip Mappage direct
target_host target.asset.hostname Mappage direct
target_ip target.asset.ip Mappées directement, après avoir converti la représentation de chaîne en tableau JSON, puis extrait les adresses IP individuelles
target_path target.url Mappage direct
time metadata.event_timestamp Analyse pour extraire l'horodatage au format "dd/MMM/aaaa:HH:mm:ss Z"
user_agent network.http.user_agent Mappage direct s'il n'est pas vide ou s'il ne correspond pas à "-"
metadata.event_type Initialement défini sur "GENERIC_EVENT", puis potentiellement écrasé en fonction d'autres champs tels que terminal et protocol. La valeur par défaut est "USER_UNCATEGORIZED" si le format grok principal ne correspond pas. Définissez-le sur "NETWORK_HTTP" si protocol est HTTP et que target_ip est présent, et sur "STATUS_UPDATE" si protocol est HTTP, mais que target_ip n'est pas présent.
metadata.log_type Défini sur "NGINX"
metadata.product_name Défini sur "NGINX"
metadata.vendor_name Défini sur "NGINX"
network.ip_protocol Défini sur "TCP" si terminal est "sshd" ou "ssh", ou si le format grok principal ne correspond pas
principal.asset_id Définissez cette valeur sur "GCP.GCE:0001" si terminal est "sshd" ou "ssh". Défini sur "GCP.GCE:0002" si le format grok principal ne correspond pas
extensions.auth.type Défini sur "MACHINE" si terminal est "sshd" ou "ssh"

Modifications

2022-09-10

  • Création d'un analyseur par défaut et suppression de l'analyseur spécifique au client.
  • Version initiale de l'analyseur.