Aller au contenu principal

Logs d'audit

Wirety émet des logs d'audit structurés pour chaque action liée à la sécurité sur le serveur et chaque agent. Les logs d'audit sont distincts des logs opérationnels de l'application : ils sont toujours en JSON, toujours sur stdout, et conçus pour l'ingestion par des systèmes d'agrégation de logs (Loki, Elasticsearch, Splunk, etc.).

Activer les logs d'audit

Définissez la variable d'environnement AUDIT_LOG=true sur le serveur et/ou chaque instance agent.

# Serveur
AUDIT_LOG=true ./wirety-server

# Agent
AUDIT_LOG=true wirety-agent -server https://wirety.example.com -token <TOKEN>

Lorsque AUDIT_LOG est false (valeur par défaut), le logger d'audit est un vrai no-op — aucune allocation ne se produit, donc il n'y a aucun impact sur les performances.

Format des logs

Chaque événement d'audit est une seule ligne JSON sur stdout :

{
"level": "info",
"log_type": "audit",
"time": 1748000000,
"actor_id": "alice",
"actor_email": "alice@example.com",
"remote_ip": "10.0.0.5",
"action": "peer.create",
"network_id": "net-abc123",
"peer_id": "peer-xyz789",
"peer_name": "office-laptop",
"message": "audit"
}
ChampToujours présentDescription
log_typeToujours "audit" — utiliser ce champ pour filtrer les lignes d'audit depuis les logs applicatifs
timeTimestamp Unix
actionCe qui s'est passé (voir les tableaux ci-dessous)
messageToujours "audit"
actor_idServeur uniquementID de l'utilisateur authentifié qui a déclenché l'action
actor_emailServeur uniquementEmail de l'utilisateur authentifié
remote_ipServeur uniquementAdresse IP du client
peer_id / network_idAgent uniquementIdentité de l'agent qui a effectué l'action

Événements serveur

Les événements d'audit serveur sont émis après chaque appel API mutant réussi.

Authentification

actionDéclencheur
auth.loginConnexion réussie en mode auth simple (POST /auth/login)

Réseaux

actionChampsDéclencheur
network.createnetwork_id, network_nameRéseau créé
network.updatenetwork_id, network_nameConfiguration réseau mise à jour
network.deletenetwork_idRéseau supprimé
acl.updatenetwork_idListe de blocage ACL mise à jour

Peers

actionChampsDéclencheur
peer.createnetwork_id, peer_id, peer_namePeer créé
peer.updatenetwork_id, peer_id, peer_namePeer mis à jour
peer.deletenetwork_id, peer_idPeer supprimé

Groupes

actionChampsDéclencheur
group.createnetwork_id, group_id, group_nameGroupe créé
group.updatenetwork_id, group_id, group_nameGroupe mis à jour
group.deletenetwork_id, group_idGroupe supprimé
group.peer.addnetwork_id, group_id, peer_idPeer ajouté au groupe
group.peer.removenetwork_id, group_id, peer_idPeer retiré du groupe

Politiques

actionChampsDéclencheur
policy.createnetwork_id, policy_id, policy_namePolitique créée
policy.updatenetwork_id, policy_id, policy_namePolitique mise à jour
policy.deletenetwork_id, policy_idPolitique supprimée
policy.rule.addnetwork_id, policy_id, rule_idRègle ajoutée à la politique
policy.rule.removenetwork_id, policy_id, rule_idRègle retirée de la politique
policy.group.attachnetwork_id, group_id, policy_idPolitique attachée au groupe
policy.group.detachnetwork_id, group_id, policy_idPolitique détachée du groupe
policy.group.reordernetwork_id, group_idOrdre de priorité des politiques modifié

Routes

actionChampsDéclencheur
route.createnetwork_id, route_id, route_nameRoute créée
route.updatenetwork_id, route_id, route_nameRoute mise à jour
route.deletenetwork_id, route_idRoute supprimée
route.group.attachnetwork_id, group_id, route_idRoute attachée au groupe
route.group.detachnetwork_id, group_id, route_idRoute détachée du groupe

Utilisateurs

actionChampsDéclencheur
user.updatetarget_user_idRôle utilisateur ou réseaux mis à jour
user.deletetarget_user_idUtilisateur supprimé
user.defaults.updatePermissions réseau par défaut modifiées

Événements agent

Les événements d'audit agent sont émis par chaque processus agent. Les champs peer_id et network_id identifient quel agent a produit l'événement.

Configuration & Pare-feu

actionChampsDéclencheur
config.syncConfiguration WireGuard écrite et appliquée avec succès
firewall.syncrule_countRègles iptables appliquées avec succès
dns.updatedomain, peer_countTable des peers du serveur DNS mise à jour
peer.renameold_name, new_name, new_interfacePeer renommé, interface migrée

Sessions de tunnel

L'agent surveille les timestamps de handshake WireGuard toutes les 15 secondes. Un peer est considéré connecté lorsque son dernier handshake est dans les 180 dernières secondes (seuil d'inactivité standard de WireGuard).

actionChampsDéclencheur
tunnel.connectedpeer_name, peer_pubkey, endpoint, handshake_atLe peer a établi un handshake WireGuard
tunnel.disconnectedpeer_name, peer_pubkey, endpoint, last_handshake, session_durationLe peer a arrêté d'envoyer des handshakes

Exemples d'événements de tunnel :

{"level":"info","log_type":"audit","time":1748000100,"actor_type":"agent","peer_id":"peer-jump-1","network_id":"net-abc123","action":"tunnel.connected","peer_name":"office-laptop","peer_pubkey":"abc123...","endpoint":"203.0.113.42:51820","handshake_at":1748000098,"message":"audit"}
{"level":"info","log_type":"audit","time":1748003700,"actor_type":"agent","peer_id":"peer-jump-1","network_id":"net-abc123","action":"tunnel.disconnected","peer_name":"office-laptop","peer_pubkey":"abc123...","endpoint":"203.0.113.42:51820","last_handshake":1748003520,"session_duration":3600000000000,"message":"audit"}

Note : les événements de tunnel sont également émis comme lignes de log ordinaires (non audit) avec "event":"tunnel.connected" / "event":"tunnel.disconnected" pour une surveillance lisible par l'humain.


Log opérationnel (non audit)

Le serveur et l'agent émettent également des logs opérationnels lisibles par l'humain sur stderr via le ConsoleWriter de zerolog. Ce ne sont pas des logs d'audit — ne vous fiez pas à eux pour la conformité. Utilisez AUDIT_LOG=true + stdout à cette fin.


Exemples d'intégration

Docker / docker-compose

services:
wirety-server:
image: rg.fr-par.scw.cloud/wirety/server:latest
environment:
AUDIT_LOG: "true"
logging:
driver: json-file

Redirigez stdout vers votre expéditeur de logs ; stderr transporte le log console opérationnel.

Kubernetes

env:
- name: AUDIT_LOG
value: "true"

Avec un sidecar expéditeur de logs (Fluent Bit, Vector) configuré pour collecter stdout des pods wirety.

Filtrage avec jq

# Tous les événements d'audit de la dernière exécution
docker logs wirety-server 2>/dev/null | jq 'select(.log_type == "audit")'

# Toutes les créations de peers
docker logs wirety-server 2>/dev/null | jq 'select(.action == "peer.create")'

# Toutes les sessions de tunnel d'un agent spécifique
cat agent.log | jq 'select(.log_type == "audit" and .peer_id == "peer-jump-1" and (.action | startswith("tunnel.")))'

Loki / Grafana

Exemple de sélecteur de label (avec le driver de log Docker) :

{container="wirety-server"} | json | log_type="audit"

Filtrer par action :

{container="wirety-server"} | json | log_type="audit" | action=~"peer\\..*"