Collecter les journaux de pare-feu OPNsense

Compatible avec :

Cet analyseur extrait les champs des journaux de pare-feu OPNsense (formats syslog et CSV) et les mappe à l'UDM. Il utilise l'analyse grok et CSV pour les journaux d'application "filterlog", en gérant différents formats de journaux et protocoles réseau (TCP, UDP, ICMP, etc.) pour remplir 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 le principal 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 SIEM > Agents de collecte.
  3. Téléchargez le fichier d'authentification d'ingestion.

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

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

  1. Accédez à la machine sur laquelle l'agent 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 OPNsense.
  2. Accédez à Système > Paramètres > Journalisation.
  3. Dans la section Journalisation à distance, cochez la case Envoyer les journaux au serveur syslog distant pour activer cette option.
  4. Dans le champ 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 facility syslog.
  6. Définissez le niveau Syslog sur Alerte.

  7. Cliquez sur Enregistrer pour appliquer les modifications.

Table 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
Directement mappé à 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
Directement mappé à 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 directement mappé à 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 Directement mappé à 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
Directement mappé à 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
Directement mappé à 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
Directement mappé à 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 la valeur est "block", elle est convertie en majuscules ("BLOCK"). Si la réponse est "pass", définissez la valeur sur "ALLOW".
column8 network.direction Mappé à partir de column8. Si la valeur est "in", définissez-la sur "INBOUND". Si la valeur est "out", définissez-la sur "OUTBOUND".
domain principal.administrative_domain Directement mappé à partir de domain extrait par Grok. Définissez la valeur sur "NETWORK_CONNECTION" si les adresses IP principales et cibles sont présentes, sinon sur "GENERIC_EVENT". Codé en dur sur "OPNSENSE". Codé en dur sur "OPNSENSE".
message Différents champs Analysé à l'aide des filtres grok et CSV pour extraire différents champs. Consultez les autres lignes pour connaître les mappages spécifiques.
ts metadata.event_timestamp.seconds, timestamp.seconds Analysé à partir du champ de message à l'aide de grok, puis converti en code temporel. La valeur en secondes est utilisée pour renseigner metadata.event_timestamp.seconds et timestamp.seconds.
application principal.application Directement mappé à partir de application extrait par Grok.

Vous avez encore besoin d'aide ? Obtenez des réponses de membres de la communauté et de professionnels Google SecOps.