Collecter les journaux du pare-feu OPNsense

Compatible avec:

Cet analyseur extrait des champs des journaux du pare-feu OPNsense (formats syslog et CSV) et les met en correspondance avec l'UDM. Il utilise l'analyse grok et CSV pour les journaux d'application "filterlog", gère différents formats de journaux et protocoles réseau (TCP, UDP, ICMP, etc.) pour renseigner les champs UDM tels que principal, target, network et security_result. Il ajoute également des métadonnées telles que le nom du fournisseur et du produit, et détermine le type d'événement en fonction de la présence d'informations sur l'entité principale et la cible.

Avant de commencer

  • Assurez-vous de disposer d'une instance Google Security Operations.
  • Assurez-vous de disposer d'un accès privilégié à l'interface Web OPNsense.

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: testNamespace
            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 à l'aide de la commande suivante : sudo systemctl bindplane restart

Ajouter la configuration du serveur Syslog à OPNsense

  1. Connectez-vous à l'interface Web d'OPNsense.
  2. Accédez à System (Système) > Settings (Paramètres) > Logging (Journalisation).
  3. Dans la section Journalisation à distance, cochez la case Envoyer les journaux à un serveur Syslog distant.
  4. Dans le champ Remote Syslog Servers (Serveurs syslog distants), saisissez l'adresse IP du serveur syslog, y compris le PORT (par exemple, 10.10.10.10:54525).
  5. Sélectionnez Local0 comme service syslog.
  6. Définissez le niveau Syslog sur Alert (Alerte).

  7. Cliquez sur Enregistrer pour appliquer les modifications.

Tableau de mappage UDM

Champ de journal Mappage UDM Logique
column1 security_result.rule_id Mappé directement à partir de column1.
column10 additional.fields[].key: "tos"
additional.fields[].value.string_value: valeur de column10
Mappé directement à partir de column10, imbriqué sous additional.fields avec la clé "tos".
column12 additional.fields[].key: "ttl"
additional.fields[].value.string_value: valeur de column12
Mappé directement à partir de column12, imbriqué sous additional.fields avec la clé "ttl".
column13 additional.fields[].key: "Id"
additional.fields[].value.string_value: valeur de column13
Mappé directement à partir de column13, imbriqué sous additional.fields avec la clé "Id".
column14 additional.fields[].key: "offset"
additional.fields[].value.string_value: valeur de column14
Mappé directement à partir de column14, imbriqué sous additional.fields avec la clé "offset".
column15 additional.fields[].key: "flags"
additional.fields[].value.string_value: valeur de column15
Mappé directement à partir de column15, imbriqué sous additional.fields avec la clé "flags".
column17 network.ip_protocol Mappé directement à partir de column17 après conversion en majuscules.
column18 network.received_bytes Mappé directement à partir de column18 après conversion en entier non signé.
column19 principal.ip Mappé directement à partir de column19.
column20 target.ip Mappé directement à partir de column20.
column21 principal.port (si column17 est TCP ou UDP)
additional.fields[].key: "data_length"
additional.fields[].value.string_value: valeur extraite (si column17 est ICMP, GRE, ESP ou IGMP)
Si column17 est TCP/UDP, il est mappé directement à partir de column21 et converti en entier. Sinon, la valeur "datalength" est extraite à l'aide de Grok et placée dans additional.fields avec la clé "data_length".
column22 target.port Mappé directement à partir de column22 si column17 est TCP ou UDP, et converti en entier.
column24 additional.fields[].key: "tcp_flags"
additional.fields[].value.string_value: valeur de column24
Mappé directement à partir de column24 si column17 est TCP, imbriqué sous additional.fields avec la clé "tcp_flags".
column29 additional.fields[].key: "tcp_options"
additional.fields[].value.string_value: valeur de column29
Mappé directement à partir de column29 si column17 est TCP, imbriqué sous additional.fields avec la clé "tcp_options".
column4 additional.fields[].key: "tracker"
additional.fields[].value.string_value: valeur de column4
Mappé directement à partir de column4, imbriqué sous additional.fields avec la clé "tracker".
column5 additional.fields[].key: "interface"
additional.fields[].value.string_value: valeur de column5
Mappé directement à partir de column5, imbriqué sous additional.fields avec la clé "interface".
column6 security_result.rule_type Mappé directement à partir de column6.
column7 security_result.action Mappé à partir de column7. Si "block", converti en majuscules "BLOCK". Si "pass", définissez la valeur sur "ALLOW".
column8 network.direction Mappé à partir de column8. Si "in", définissez la valeur sur "INBOUND". Si "out", définissez la valeur sur "OUTBOUND".
domain principal.administrative_domain Mappé directement à partir de l'domain extrait par Grok. Définissez ce paramètre sur "NETWORK_CONNECTION" si les adresses IP principales et cibles sont présentes, sinon sur "GENERIC_EVENT". Code codé en dur sur "OPNSENSE". Code codé en dur sur "OPNSENSE".
message Divers champs Analyse avec les filtres grok et CSV pour extraire différents champs. Consultez les autres lignes pour obtenir des mappages spécifiques.
ts metadata.event_timestamp.seconds, timestamp.seconds Extrait du champ de message à l'aide de grok, puis converti en code temporel. La valeur en secondes est utilisée pour renseigner à la fois metadata.event_timestamp.seconds et timestamp.seconds.
application principal.application Mappé directement à partir de l'application extrait par Grok.

Modifications

2023-11-22

  • Analyseur nouvellement créé.