Collecter les journaux du pare-feu Fortinet
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
- Connectez-vous à la console Google SecOps.
- Accédez à Paramètres du SIEM > Agents de collecte.
- 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
- Connectez-vous à la console Google SecOps.
- Accédez à Paramètres du SIEM > Profil.
- Copiez et sauvegardez le numéro client dans la section Détails de l'organisation.
Installer l'agent Bindplane
Installation de Windows
- Ouvrez l'invite de commande ou PowerShell en tant qu'administrateur.
Exécutez la commande suivante :
msiexec /i "https://github.com/observIQ/bindplane-agent/releases/latest/download/observiq-otel-collector.msi" /quiet
Installation de Linux
- Ouvrez un terminal avec des droits root ou sudo.
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
- Pour plus d'options d'installation, consultez ce guide d'installation.
Configurer l'agent Bindplane pour qu'il ingère les journaux Syslog et les envoie à Google SecOps
Accédez au fichier de configuration:
- 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. - Ouvrez le fichier à l'aide d'un éditeur de texte (
nano
,vi
ou Bloc-notes, par exemple).
- Recherchez le fichier
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 ```
Remplacez le port et l'adresse IP dans votre infrastructure si nécessaire.
Remplacez
<customer_id>
par le numéro client réel.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
- Connectez-vous à l'interface de ligne de commande de votre appareil Fortinet FortiGate.
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
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" commelocal0
,local1
,local2
,local3
,local4
,local5
oulocal7
pour les journaux d'informations).enable or disable
: saisissezdisable
pour envoyer des données en UDP (si vous définissez la valeur de "reliable" surenable
, 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
- Connectez-vous à l'interface utilisateur Web de Fortinet Fortigate.
- Accédez à Journal et rapports > Paramètres du journal.
- 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.
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).
Ouvrez la CLI et saisissez les commandes suivantes.
Obtenez l'adresse IP de votre appareil de pare-feu:
Show full-configuration | grep -f syslogd
Définissez l'adresse IP et l'installation source:
LOCAL
: définissez le niveau d'installation sur local6 (vous pouvez également sélectionner "autre" commelocal0
,local1
,local2
,local3
,local4
,local5
oulocal7
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
Activez la résolution d'adresse IP pour chaque appareil Fortigate:
config log setting set resolve-ip enable
Répétez cette procédure pour chaque appareil à intégrer à Google SecOps.
Facultatif: Options de configuration Syslog supplémentaires pour Fortigate
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.