Collecter les journaux NGINX
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
- Connectez-vous à la console Google SecOps.
- Accédez à Paramètres du SIEM > Agents de collecte.
- Téléchargez le fichier d'authentification d'ingestion.
Obtenir le numéro client Google SecOps
- Connectez-vous à la console Google SecOps.
- Accédez à Paramètres du SIEM > Profil.
- Copiez et sauvegardez l'ID client dans la section Détails de l'organisation.
Installer l'agent BindPlane
- 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
- 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
- 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
- Accédez à la machine sur laquelle BindPlane est installé.
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
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
Ouvrez le fichier de configuration NGINX (par exemple,
/etc/nginx/nginx.conf
):sudo vi /etc/nginx/nginx.conf
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; }
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.