Collecter les journaux du pare-feu Fortinet

Compatible avec:

Ce document explique comment collecter et ingérer des journaux Fortinet dans Google Security Operations à l'aide de Bindplane. L'analyseur extrait des champs des journaux, en traitant les formats JSON et SYSLOG (avec paire clé-valeur). Il normalise les champs extraits dans le modèle de données unifié (UDM), y compris les connexions réseau, l'activité des utilisateurs, les événements DNS et les résultats de sécurité, tout en gérant divers formats de journaux et cas particuliers.

Avant de commencer

  • Assurez-vous de disposer d'une instance Google Security Operations.
  • Assurez-vous d'utiliser Windows 2016 ou une version ultérieure, ou un hôte Linux avec systemd.
  • Si vous exécutez l'application derrière un proxy, assurez-vous que les ports du pare-feu sont ouverts.
  • Assurez-vous de disposer d'un accès privilégié à un appareil de pare-feu Fortinet.

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 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 le numéro client dans la section Détails de l'organisation.

Installer l'agent Bindplane

Installation de Windows

  1. Ouvrez l'invite de commande 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
    

Installation de Linux

  1. Ouvrez un terminal avec des 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
    

Autres ressources d'installation

Configurer l'agent Bindplane pour qu'il ingère les journaux Syslog et les envoie à Google SecOps

  1. Accédez au fichier de configuration:

    1. Recherchez le fichier config.yaml. En règle générale, il se trouve dans le répertoire /etc/bindplane-agent/ sous Linux ou dans le répertoire d'installation sous Windows.
    2. Ouvrez le fichier à l'aide d'un éditeur de texte (nano, vi ou Bloc-notes, par exemple).
  2. Modifiez le fichier config.yaml comme suit :

    ```yaml
    receivers:
        udplog:
            # Replace the port and IP address as required
            listen_address: "0.0.0.0:514"
    
    exporters:
        chronicle/chronicle_w_labels:
            compression: gzip
            # Adjust the path to the credentials file you downloaded in Step 1
            creds: '/path/to/ingestion-authentication-file.json'
            # Replace with your actual customer ID from Step 2
            customer_id: <customer_id>
            endpoint: malachiteingestion-pa.googleapis.com
            # Add optional ingestion labels for better organization
            ingestion_labels:
                log_type: FORTINET_FIREWALL
                raw_log_field: body
    
    service:
        pipelines:
            logs/source0__chronicle_w_labels-0:
                receivers:
                    - udplog
                exporters:
                    - chronicle/chronicle_w_labels
    ```
    
  3. Remplacez le port et l'adresse IP dans votre infrastructure si nécessaire.

  4. Remplacez <customer_id> par le numéro client réel.

  5. Remplacez /path/to/ingestion-authentication-file.json par le chemin d'accès où le fichier d'authentification a été enregistré dans la section Obtenir le fichier d'authentification d'ingestion Google SecOps.

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 bindplane-agent
    
  • Pour redémarrer l'agent Bindplane sous Windows, vous pouvez utiliser la console Services ou saisir la commande suivante:

    net stop BindPlaneAgent && net start BindPlaneAgent
    

Configurer Syslog sur FortiGate à l'aide de la CLI

  1. Connectez-vous à l'interface de ligne de commande de votre appareil Fortinet FortiGate.
  2. Saisissez les commandes suivantes dans le même ordre (remplacez les variables par des valeurs adaptées à votre environnement).

    sh full-configuration | grep -f syslogd
    config log syslogd setting
        set status enable
        set server IP_ADDRESS
        set mode udp
        set port PORT
        set facility LOCAL
        set reliable enable or disable
        set source-ip FIEWALL_IP
    end
    
  3. Mettez à jour les valeurs suivantes :

    • IP_ADDRESS: saisissez l'adresse IPv4 de l'agent Bindplane.
    • PORT: saisissez le numéro de port de l'agent Bindplane (par exemple, 514).
    • LOCAL: définissez le niveau d'installation sur local6 (vous pouvez également sélectionner "autre" comme local0, local1, local2, local3, local4, local5 ou local7 pour les journaux d'informations).
    • enable or disable: saisissez disable pour envoyer des données en UDP (si vous définissez la valeur de "reliable" sur enable, les données sont envoyées en TCP).
    • FIEWALL_IP: saisissez l'adresse IPv4 du pare-feu.

Configurer Syslog sur FortiGate à l'aide de l'IUG

  1. Connectez-vous à l'interface utilisateur Web de Fortinet Fortigate.
  2. Accédez à Journal et rapports > Paramètres du journal.
  3. Modifiez les configurations suivantes :
    • Envoyer des journaux à Syslog: sélectionnez Activer.
    • Adresse IP / Nom de domaine complet: saisissez l'adresse IPv4 de l'agent Bindplane.
    • Journalisation des événements: sélectionnez Tous.
    • Journal de trafic local: sélectionnez Tous.
  4. Accédez à Stratégie et objets > Stratégie de pare-feu.

    • Définissez le niveau de journalisation sur Tout (ne définissez pas la valeur sur "Désactiver et UTM") pour chaque stratégie de pare-feu.
    • Assurez-vous que la règle Implicit Deny doit également être définie au niveau de journalisation All (Tout).
  5. Ouvrez la CLI et saisissez les commandes suivantes.

    1. Obtenez l'adresse IP de votre appareil de pare-feu:

      Show full-configuration | grep -f syslogd
      
    2. Définissez l'adresse IP et l'installation source:

      • LOCAL: définissez le niveau d'installation sur local6 (vous pouvez également sélectionner "autre" comme local0, local1, local2, local3, local4, local5 ou local7 pour les journaux d'informations).
      • FIEWALL_IP: saisissez l'adresse IPv4 du pare-feu.

        config log syslogd setting
        set source-ip FIEWALL_IP
        set facility LOCAL
        end
        
    3. Activez la résolution d'adresse IP pour chaque appareil Fortigate:

      config log setting
      set resolve-ip enable
      
  6. Répétez cette procédure pour chaque appareil à intégrer à Google SecOps.

Facultatif: Options de configuration Syslog supplémentaires pour Fortigate

  1. Pour FortiGate v5.X, pour activer les journaux étendus, exécutez les commandes suivantes:

    config antivirus profile
        edit default
            set extended-utm-log enable
        end
    config application
        edit default
            set extended-utm-log enable
        end
    config webfilter
        edit default
            set extended-utm-log enable
        end
    config spamfilter
        edit default
            set extended-utm-log enable
        end
    config dlp
        edit default
            set extended-utm-log enable
        end
    config ips
        edit default
            set extended-utm-log enable
        end
    

Tableau de mappage UDM

Champ de journal Mappage UDM Logique
action security_result.action_details La valeur est extraite directement du champ action dans le journal brut.
act security_result.action_details Si le champ action est vide, la valeur est extraite du champ act du journal brut.
agent network.http.user_agent, network.http.parsed_user_agent La valeur est extraite du champ agent. Le champ parsed_user_agent est une version analysée du champ user_agent.
appid security_result1.rule_id La valeur est extraite du champ appid.
app target.application, network.application_protocol, additional.fields Si le champ service est vide, la valeur est extraite du champ app. Si service est HTTPS, HTTP, DNS, DHCP ou SMB, la valeur est utilisée pour renseigner network.application_protocol. Sinon, il est utilisé pour target.application. Un champ supplémentaire avec la clé app et la valeur de chaîne du champ app est ajouté à additional.fields.
appact additional.fields Un champ supplémentaire avec la clé appact et la valeur de chaîne du champ appact est ajouté à additional.fields.
appcat additional.fields Un champ supplémentaire avec la clé appcat et la valeur de chaîne du champ appcat est ajouté à additional.fields.
applist additional.fields Un champ supplémentaire avec la clé applist et la valeur de chaîne du champ applist est ajouté à additional.fields.
apprisk additional.fields Un champ supplémentaire avec la clé apprisk et la valeur de chaîne du champ apprisk est ajouté à additional.fields.
attack security_result.category_details, security_result.threat_name, security_result.summary, security_result.detection_fields La valeur est ajoutée à security_result.category_details. Pour les événements IPS/Anomalie, il est également utilisé pour security_result.summary et security_result.threat_name. Un champ de détection avec la clé attack et la valeur du champ attack est ajouté à security_result.detection_fields.
attackid security_result.threat_id, security_result1.rule_id, security_result.detection_fields Pour les événements IPS, la valeur est utilisée pour security_result.threat_id. Pour les autres événements, il est utilisé pour security_result1.rule_id. Un champ de détection avec la clé attackId et la valeur du champ attackid est ajouté à security_result.detection_fields.
cat security_result1.rule_id Pour les événements de filtre Web, la valeur est utilisée pour security_result1.rule_id.
catdesc security_result.description, security_result1.rule_name, security_result.category_details S'il est présent, il est ajouté au champ msg pour créer le security_result.description. Il est également utilisé pour security_result1.rule_name. La valeur est ajoutée à security_result.category_details.
changes security_result.summary Le champ changes est analysé sous forme de paires clé/valeur. La valeur mode de l'changes analysée est utilisée pour security_result.summary.
connection_type metadata.product_event_type La valeur est ajoutée à metadata.product_event_type, le cas échéant.
craction security_result.about.labels Un libellé avec la clé craction et la valeur du champ craction est ajouté à security_result.about.labels.
crlevel security_result.severity, event.idm.is_alert, event.idm.is_significant Si crlevel est défini sur "CRITICAL" ou que level est défini sur "alert", is_alert et is_significant sont définis sur "TRUE". La valeur est mappée sur security_result.severity en fonction du mappage suivant: HIGH pour HIGH, MEDIUM pour MEDIUM, LOW pour LOW et CRITICAL pour CRITICAL.
crscore security_result.severity_details Pour les événements IPS, la valeur est utilisée pour security_result.severity_details.
cs6 principal.user.group_identifiers La valeur est ajoutée à principal.user.group_identifiers.
date, time timestamp Les champs date et time sont combinés et analysés pour créer la timestamp.
devid security_result.detection_fields Un champ de détection avec la clé devid et la valeur du champ devid est ajouté à security_result.detection_fields.
devname intermediary.hostname, target.hostname, target.asset.hostname, principal.hostname et principal.asset.hostname Si dvchost est présent, dvchost est utilisé pour intermediary.hostname. Sinon, devname est utilisé. Pour les événements VPN avec type comme event, il est utilisé pour target.hostname. Pour les événements de création d'utilisateur, il est utilisé pour principal.hostname.
deviceSeverity level La valeur est utilisée pour renseigner le champ level.
device_product metadata.product_name La valeur est utilisée pour metadata.product_name. Si cette valeur n'est pas présente, Fortigate est utilisé par défaut.
device_vendor metadata.vendor_name La valeur est utilisée pour metadata.vendor_name. Si cette valeur n'est pas présente, Fortinet est utilisé par défaut.
device_version metadata.product_version La valeur est utilisée pour metadata.product_version.
dhcp_msg network.dhcp.type, metadata.event_type, network.application_protocol Si la valeur est Ack, network.dhcp.type est défini sur ACK, metadata.event_type sur NETWORK_DHCP et network.application_protocol sur DHCP.
dir direction Si direction est vide, la valeur est extraite du champ dir.
direction network.direction La valeur est mappée sur network.direction en fonction du mappage suivant : "INBOUND" pour incoming, inbound et response, "OUTBOUND" pour outgoing, outbound et request.
dst target.ip, target.asset.ip La valeur est analysée en tant qu'adresse IP et utilisée pour target.ip.
dstauthserver target.hostname, target.asset.hostname La valeur est utilisée pour target.hostname.
dstcountry target.location.country_or_region Si la valeur n'est pas Reserved ou vide, elle est utilisée pour target.location.country_or_region.
dstip target.ip, target.asset.ip La valeur est analysée en tant qu'adresse IP et utilisée pour target.ip.
dstinetsvc security_result.detection_fields Un champ de détection avec la clé dstinetsvc et la valeur du champ dstinetsvc est ajouté à security_result.detection_fields.
dstintf security_result.detection_fields Un champ de détection avec la clé dstintf et la valeur du champ dstintf est ajouté à security_result.detection_fields.
dstintfrole security_result.detection_fields Un champ de détection avec la clé dstintfrole et la valeur du champ dstintfrole est ajouté à security_result.detection_fields.
dstmac target.mac La valeur est analysée en tant qu'adresse MAC et utilisée pour target.mac.
dstosname target.platform Si la valeur est WINDOWS, target.platform est défini sur WINDOWS.
dstport target.port La valeur est convertie en entier et utilisée pour target.port.
dstswversion target.platform_version La valeur est utilisée pour target.platform_version.
dstuuid target.resource.product_object_id La valeur est utilisée pour target.resource.product_object_id.
dstuser target.user.userid La valeur est utilisée pour target.user.userid.
dtype security_result.category_details La valeur est ajoutée à security_result.category_details.
duration network.session_duration.seconds Si la valeur n'est pas vide ou n'est pas 0, elle est convertie en entier et utilisée pour network.session_duration.seconds.
duser principal.user.userid, target.user.userid, target.user.user_display_name Pour les événements de point de terminaison/système, il est utilisé pour principal.user.userid. Pour les événements de connexion des utilisateurs, il est utilisé pour target.user.userid. Pour les journaux au format CEF, il est utilisé pour target.user.user_display_name.
dvchost devname La valeur est utilisée pour remplacer le champ devname.
d_uid target.user.userid La valeur extraite du champ request est utilisée pour target.user.userid.
error security_result.severity_details Si level est error et que error est présent, la valeur est utilisée pour security_result.severity_details.
eventtime timestamp, metadata.event_timestamp La valeur est analysée pour créer timestamp et metadata.event_timestamp.
eventtype security_result1.rule_type, security_result.detection_fields La valeur est utilisée pour security_result1.rule_type. Pour les événements IPS, il est également utilisé pour security_result.detection_fields.
filename target.file.full_path La valeur est utilisée pour target.file.full_path.
group principal.user.group_identifiers Si la valeur n'est pas N/A ou vide, elle est ajoutée à principal.user.group_identifiers.
hostname target.hostname, target.asset.hostname, principal.hostname, principal.asset.hostname La valeur est utilisée pour target.hostname. Pour les événements DHCP Ack, il est utilisé pour principal.hostname.
httpmethod network.http.method La valeur est utilisée pour network.http.method.
in network.received_bytes La valeur est convertie en entier sans signature et utilisée pour network.received_bytes.
incidentserialno security_result.about.labels Un libellé avec la clé incidentserialno et la valeur du champ incidentserialno est ajouté à security_result.about.labels.
ip principal.ip, principal.asset.ip, network.dhcp.yiaddr Pour les événements de point de terminaison/système, la valeur est ajoutée à principal.ip. Pour les événements DHCP Ack, il est utilisé pour network.dhcp.yiaddr.
ipaddr intermediary.ip La valeur est analysée en tant que liste d'adresses IP séparées par une virgule et ajoutée à intermediary.ip.
level security_result.severity, security_result.severity_details, event.idm.is_alert, event.idm.is_significant Si crlevel est défini sur "CRITICAL" ou que level est défini sur "alert", is_alert et is_significant sont définis sur "TRUE". La valeur est mappée sur security_result.severity en fonction du mappage suivant: HIGH pour warning, MEDIUM pour notice, LOW pour information et info, ERROR pour error. security_result.severity_details est défini sur level: <value>.
locip principal.ip, principal.asset.ip Pour les événements VPN, la valeur est ajoutée à principal.ip.
locport dstport La valeur est utilisée pour remplacer le champ dstport.
logdesc metadata.description La valeur est utilisée pour metadata.description.
logid metadata.product_log_id, additional.fields La valeur est utilisée pour metadata.product_log_id. Un champ supplémentaire avec la clé logid et la valeur de chaîne du champ logid est ajouté à additional.fields.
log_id metadata.product_log_id La valeur est utilisée pour metadata.product_log_id.
metadata.event_type metadata.event_type La valeur est définie en fonction du type d'événement et d'autres champs. La valeur par défaut est GENERIC_EVENT. Peut être défini sur NETWORK_CONNECTION, USER_UNCATEGORIZED, NETWORK_HTTP, USER_LOGIN, USER_LOGOUT, NETWORK_DNS, NETWORK_DHCP, STATUS_UNCATEGORIZED, NETWORK_UNCATEGORIZED, USER_CREATION ou USER_DELETION.
metadata.log_type metadata.log_type La valeur est définie sur FORTINET_FIREWALL.
metadata.product_event_type metadata.product_event_type La valeur est définie sur <type> - <subtype>. Si connection_type est présent, il est ajouté à la valeur. Pour les journaux au format CEF, il est défini sur [<device_event_class_id>] - <event_name> <severity>.
metadata.product_name metadata.product_name La valeur est définie sur Fortigate par défaut. Si device_product est présent, cette valeur est utilisée à la place.
metadata.product_version metadata.product_version La valeur est extraite du champ device_version, le cas échéant.
metadata.vendor_name metadata.vendor_name La valeur est définie sur Fortinet par défaut. Si device_vendor est présent, cette valeur est utilisée à la place.
mode security_result.summary La valeur extraite du champ changes est utilisée pour security_result.summary.
msg metadata.description, security_result.summary, security_result.description, security_result1.rule_name Si logdesc n'est pas présent, la valeur est utilisée pour metadata.description. Pour les événements système, il est utilisé pour security_result.summary. Pour les événements de filtrage Web, il est ajouté au début de security_result.description. Pour les événements de virus où msg est File is infected., il est utilisé avec virus pour renseigner security_result.summary. Pour les événements app-ctrl, il est utilisé pour security_result1.rule_name.
name principal.hostname, principal.asset.hostname La valeur est utilisée pour principal.hostname.
nas principal.nat_ip La valeur est analysée en tant qu'adresse IP et utilisée pour principal.nat_ip.
operation security_result.action_details, security_result.action La valeur est utilisée pour security_result.action_details. Il est également mappé sur security_result.action en fonction du mappage suivant: ALLOW pour accept, passthrough, pass, permit, detected, close et edit ; BLOCK pour deny, dropped et blocked ; FAIL pour timeout ; UNKNOWN_ACTION pour les autres valeurs.
os principal.platform, principal.platform_version Si la valeur contient Windows, principal.platform est défini sur WINDOWS, et la version est extraite et utilisée pour principal.platform_version.
osname principal.platform Si la valeur est WINDOWS, principal.platform est défini sur WINDOWS.
osversion principal.platform_version La valeur est utilisée pour principal.platform_version.
out network.sent_bytes La valeur est convertie en entier sans signature et utilisée pour network.sent_bytes.
path security_result.description La valeur est utilisée pour security_result.description.
performed_on security_result.about.application La valeur est utilisée pour security_result.about.application.
policyid security_result.rule_id La valeur est utilisée pour security_result.rule_id.
policyname security_result.rule_name La valeur est utilisée pour security_result.rule_name.
policytype security_result.rule_type La valeur est utilisée pour security_result.rule_type.
poluuid additional.fields Un champ supplémentaire avec la clé poluuid et la valeur de chaîne du champ poluuid est ajouté à additional.fields.
pri security_result.severity_details La valeur est utilisée pour security_result.severity_details.
profile target.resource.name, target.resource.resource_type La valeur est utilisée pour target.resource.name et target.resource.resource_type est définie sur ACCESS_POLICY.
proto network.ip_protocol La valeur est mappée sur network.ip_protocol en fonction de la mise en correspondance suivante: UDP pour 17, TCP pour 6, IP6IN4 pour 41, ICMP pour 1 et lorsque service est PING ou contient ICMP.
protocol network.application_protocol Si la valeur est udp, network.ip_protocol est défini sur UDP. Si la valeur est tcp, network.ip_protocol est défini sur TCP. Sinon, s'il n'est pas vide, il est analysé et utilisé pour network.application_protocol.
qclass network.dns.questions.class Si la valeur est IN, network.dns.questions.class est défini sur 1.
qname network.dns.questions.name La valeur est utilisée pour network.dns.questions.name.
qtypeval network.dns.questions.type La valeur est convertie en entier sans signature et renommée network.dns.questions.type.
rcvdbyte network.received_bytes La valeur est convertie en entier sans signature et utilisée pour network.received_bytes.
rcvdpkt additional.fields Un champ supplémentaire avec la clé receivedPackets et la valeur de chaîne du champ rcvdpkt est ajouté à additional.fields.
reason security_result.description Si la valeur n'est pas N/A ou vide, elle est utilisée pour security_result.description.
referralurl network.http.referral_url La valeur est utilisée pour network.http.referral_url.
ref metadata.url_back_to_product La valeur est utilisée pour metadata.url_back_to_product.
remip principal.ip, principal.asset.ip Pour les événements VPN, la valeur est ajoutée à principal.ip.
remport srcport La valeur est utilisée pour remplacer le champ srcport.
request target.user.userid Si la valeur contient duid, le duid est extrait et utilisé pour target.user.userid.
sentbyte network.sent_bytes La valeur est convertie en entier sans signature et utilisée pour network.sent_bytes.
sentpkt additional.fields Un champ supplémentaire avec la clé sentPackets et la valeur de chaîne du champ sentpkt est ajouté à additional.fields.
server target.hostname, target.asset.hostname Pour les événements utilisateur, la valeur est utilisée pour target.hostname.
service network.application_protocol, target.application Si la valeur est HTTPS, HTTP, DNS, DHCP ou SMB, elle est utilisée pour network.application_protocol. Sinon, il est utilisé pour target.application.
sessionid network.session_id La valeur est utilisée pour network.session_id.
session_id network.session_id La valeur est utilisée pour network.session_id.
severity security_result.severity, security_result.detection_fields Pour les journaux au format CEF, la valeur est utilisée pour security_result.severity. Un champ de détection avec la clé severity et la valeur du champ severity est ajouté à security_result.detection_fields.

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