Security commitments, best practices and incident handling.
Version 1.0 — 12 août 2026
LogsCord traite des événements Discord susceptibles de contenir des données sensibles pour l’administration et la sécurité d’une communauté : messages supprimés ou modifiés, événements de modération, changements de rôles, activité vocale, événements d’audit et autres données nécessaires à l’investigation d’un incident.
Notre modèle de sécurité repose sur un principe simple :
> Aucun composant ne doit disposer de plus de privilèges, de données ou de connectivité réseau que ce qui est strictement nécessaire à sa fonction.
La sécurité de LogsCord repose sur plusieurs couches indépendantes :
Cette page décrit les principales mesures techniques appliquées par LogsCord.
Pour des raisons de sécurité, certains détails ne sont volontairement pas publiés, notamment les adresses IP, identifiants d’infrastructure, seuils de détection, règles firewall détaillées, secrets, procédures d’accès d’urgence et paramètres pouvant faciliter une attaque.
Chaque service dispose uniquement des permissions nécessaires à sa fonction.
Un collecteur de logs peut, par exemple, insérer des événements dans la base de données sans disposer d'un accès général permettant de relire l'historique enregistré, de supprimer des événements ou d'administrer la base.
À l'inverse, une API de recherche peut lire certaines données nécessaires à une investigation sans disposer des permissions d'un collecteur.
La collecte, le stockage, la recherche, le temps réel, la façade Internet, la gestion des secrets et les mécanismes de sauvegarde sont assurés par des composants distincts.
La compromission d'un composant ne doit donc pas automatiquement donner accès à l'ensemble du système.
Les communications internes sont explicitement autorisées selon les besoins de chaque composant.
Un service n'est pas autorisé à initier une connexion vers un autre service simplement parce qu'ils appartiennent à la même infrastructure.
Lorsque cela est possible, les services n'utilisent pas de mots de passe permanents.
Des identifiants de courte durée sont générés automatiquement et expirent même s'ils ne sont pas explicitement révoqués.
Aucune mesure n'est considérée comme suffisante à elle seule.
Un contrôle d'accès applicatif est complété par des permissions au niveau de la base, des restrictions réseau, des secrets temporaires, du chiffrement et des mécanismes de surveillance.
| Service / technologie | Utilisation |
|---|---|
| Discord Gateway et API Discord | Réception des événements Discord et récupération active de certaines informations nécessaires à la journalisation |
| Hetzner Dedicated Servers | Infrastructure bare metal principale |
| Hetzner Robot | Gestion des serveurs dédiés et de certaines règles réseau/firewall |
| Hetzner Object Storage | Stockage S3 des sauvegardes chiffrées |
| Cloudflare | Façade Internet, Cloudflare Tunnel, WAF, protection DDoS et Rulesets |
| ClickHouse | Stockage analytique et recherche dans les événements |
| KMS interne avec TPM 2.0 physique | Gestion du cycle de vie des clés cryptographiques sensibles |
| Message broker interne | Distribution des événements nécessaires au mode temps réel |
Le KMS est exploité directement par LogsCord sur une infrastructure bare metal dédiée et durcie. Il utilise un TPM 2.0 physique comme racine matérielle de confiance et les clés racines protégées par le TPM sont configurées comme non exportables.
LogsCord n'utilise pas ClickHouse Cloud pour le stockage principal décrit sur cette page.
Les serveurs bare metal concernés sont exploités dans le Data Center Park Hetzner de Nuremberg, en Allemagne.
Les événements sont reçus par des collecteurs spécialisés.
La majorité des événements provient passivement du Gateway Discord. Discord utilise son Gateway pour transmettre en temps réel aux applications les événements concernant les serveurs auxquels elles sont connectées.
Certains événements nécessitent cependant une collecte active.
LogsCord peut notamment interroger certaines ressources de l'API Discord pour reconstruire un contexte qui n'est pas directement fourni par un événement Gateway, par exemple dans le cadre des invitations ou de certains événements d'audit.
Les opérations actives sont limitées aux données nécessaires aux fonctionnalités activées.
Les collecteurs sont répartis en plusieurs shards.
Chaque shard fonctionne dans un processus distinct et dans un environnement conteneurisé distinct.
Cette architecture permet :
Un collecteur ne dispose pas d'un compte ClickHouse général.
Ses identifiants sont générés par le système de gestion des secrets de LogsCord et disposent d'une durée de validité maximale de 24 heures.
Ces identifiants donnent uniquement accès aux opérations nécessaires à l'ingestion.
En particulier, un collecteur n'a pas besoin d'un droit général de lecture sur l'historique ClickHouse.
Le renouvellement des identifiants est automatisé.
La compromission temporaire d'un collecteur ne transforme donc pas automatiquement ce composant en outil de consultation de l'historique enregistré.
Après validation et normalisation, un événement peut suivre deux chemins distincts selon les fonctionnalités nécessaires.
mermaidflowchart LR
Discord["Discord Gateway / API"] --> Collector["Collecteur"]
Collector --> Validation["Validation<br/>et normalisation"]
subgraph Persistence["Stockage durable"]
CH[("ClickHouse")]
end
subgraph Realtime["Diffusion temps réel"]
Decision{"Consommateur<br/>abonné ?"}
Broker["Message Broker"]
API["API temps réel"]
Client["Client autorisé"]
end
Validation --> CH
Validation --> Decision
Decision -->|Oui| Broker
Decision -->|Non| Stored["Stockage uniquement"]
Broker --> API
API -->|SSE| ClientL'événement est transmis à ClickHouse afin de devenir interrogeable par les fonctions de recherche, de timeline et d'investigation de LogsCord.
Lorsqu'au moins un consommateur est abonné au flux temps réel concerné, une copie de l'événement est également transmise au message broker.
Le broker transmet alors l'événement au composant API responsable du temps réel.
L'API peut ensuite distribuer les événements autorisés au client via Server-Sent Events (SSE).
ClickHouse et le broker temps réel remplissent donc deux fonctions différentes :
Une interruption du flux temps réel ne modifie pas les règles de conservation du stockage durable.
LogsCord utilise ClickHouse comme moteur de stockage analytique de ses événements.
ClickHouse est particulièrement adapté aux grands volumes d'événements append-oriented et aux recherches analytiques effectuées sur des périodes importantes.
Les données sont associées à leur tenant et cette identité doit être conservée tout au long du chemin d'accès.
LogsCord adapte le niveau d'isolation au volume et à l'offre concernée.
Les architectures possibles comprennent notamment :
Les environnements à forte volumétrie peuvent bénéficier d'un niveau d'isolation renforcé afin de limiter les interactions de charge entre tenants.
Les clients Pro générant plus de 30 000 événements par jour peuvent notamment être concernés par cette architecture renforcée.
Quel que soit le modèle physique retenu, l'identité du tenant reste une propriété obligatoire du contrôle d'accès.
Les environnements Enterprise nécessitant un niveau de disponibilité supérieur disposent de trois réplicas de données.
La réplication et les sauvegardes remplissent volontairement des fonctions différentes.
La réplication protège principalement contre certaines défaillances de nœuds et contribue à la continuité du service.
Elle ne remplace pas une sauvegarde : une suppression accidentelle, une corruption logique ou une opération administrative erronée peut également être répliquée.
Les sauvegardes restent donc indépendantes des réplicas.
L'API LogsCord peut effectuer les recherches nécessaires directement dans ClickHouse.
Comme pour les collecteurs, ses identifiants de base de données sont régulièrement renouvelés.
Les permissions accordées à l'API sont différentes de celles accordées aux collecteurs.
Cette séparation permet notamment qu'un credential destiné à l'insertion ne devienne pas automatiquement un credential permettant l'investigation, et inversement.
Les autorisations applicatives sont vérifiées avant d'exposer les données correspondant à une requête.
L'infrastructure applique une politique réseau restrictive.
Les communications ne sont pas ouvertes de manière générale entre tous les services.
Elles sont autorisées selon la direction et la fonction nécessaires au fonctionnement du système.
mermaidflowchart LR
subgraph Ingestion["Zone d'ingestion"]
Collector["Collecteur"]
end
subgraph Data["Zone de données"]
CH[("ClickHouse")]
Broker["Message Broker"]
end
subgraph Access["Zone d'accès"]
API["API LogsCord"]
end
Collector -->|INSERT uniquement| CH
Collector -->|Événements autorisés| Broker
Broker -->|Temps réel| API
API -->|Requêtes autorisées| CH
Policy["Politique par défaut<br/>tout autre flux est bloqué"]
Policy -.-> Collector
Policy -.-> CH
Policy -.-> APILe fait que l'API puisse interroger ClickHouse ne signifie donc pas que ClickHouse doit pouvoir initier une connexion vers l'API.
Cette séparation réduit les possibilités de déplacement latéral après la compromission d'un composant.
Les services applicatifs sont conteneurisés lorsque leur fonction s'y prête.
Les conteneurs sont exécutés avec les capacités système minimales nécessaires.
L'objectif est qu'une compromission applicative reste confinée autant que possible au service concerné et ne fournisse pas automatiquement un contrôle sur l'hôte ou sur les autres composants.
Les permissions réseau sont également définies en fonction du rôle du conteneur.
La simple appartenance à un réseau interne n'accorde pas un droit général de communication avec les autres services.
Les secrets nécessaires au fonctionnement d'un conteneur sont fournis avec le périmètre et la durée de vie nécessaires à sa fonction plutôt que d'être partagés globalement entre les services.
Les applications publiques de LogsCord ne sont pas directement exposées comme des services d'origine traditionnels.
LogsCord utilise Cloudflare Tunnel pour relier sa façade publique à son infrastructure.
Le modèle repose sur des connexions établies depuis l'origine vers le réseau Cloudflare plutôt que sur l'ouverture classique de ports entrants vers l'application.
mermaidflowchart LR
User["Utilisateur"] --> CF["Cloudflare"]
subgraph Edge["Protection en périphérie"]
CF --> Security["WAF / DDoS / Rulesets"]
end
subgraph Origin["Accès à l'origine"]
Tunnel["Cloudflare Tunnel<br/>connexion initiée depuis l'origine"]
Infra["Infrastructure LogsCord"]
end
Security --> Tunnel
Tunnel --> InfraCette architecture réduit l'exposition directe des services applicatifs.
Cloudflare traite nécessairement le trafic qui transite par sa façade dans la mesure nécessaire à l'acheminement et à l'application de ses protections.
Les conséquences relatives aux traitements de données et aux transferts internationaux sont décrites séparément dans la Politique de confidentialité et le DPA de LogsCord.
LogsCord utilise les fonctions de filtrage Cloudflare afin d'appliquer des règles de sécurité avant qu'une requête n'atteigne les services applicatifs.
Ces règles peuvent notamment appliquer des actions de blocage ou de challenge lorsque certaines conditions sont réunies.
Elles complètent les protections DDoS fournies par Cloudflare.
Les expressions complètes, seuils et signatures utilisés par LogsCord ne sont pas publiés afin de ne pas faciliter leur contournement.
LogsCord maintient également une couche de détection indépendante de la façade Cloudflare.
Un système externe de surveillance réseau, isolé des principaux services applicatifs et connecté au réseau privé approprié, observe les indicateurs nécessaires à la détection de comportements anormaux.
En cas d'attaque suffisamment caractérisée, ce système peut utiliser l'API Cloudflare afin de renforcer temporairement le filtrage appliqué au trafic.
Cette couche complète, mais ne remplace pas, les mécanismes natifs de protection DDoS et de WAF de Cloudflare.
Les serveurs dédiés sont également protégés au niveau de l'infrastructure Hetzner.
Hetzner Robot permet notamment la gestion des serveurs dédiés et de leur firewall.
Le firewall Hetzner pour Dedicated Root Servers est appliqué au niveau du port de switch et permet de filtrer le trafic selon les règles configurées.
LogsCord automatise certaines opérations d'infrastructure en utilisant l'API Hetzner Robot.
Ces contrôles sont indépendants des règles Cloudflare et des politiques réseau des conteneurs.
L'architecture de défense peut ainsi être représentée comme suit :
mermaidflowchart LR
Internet["Internet"]
subgraph Edge["Périphérie"]
Cloudflare["Cloudflare<br/>WAF / DDoS / Rulesets"]
Tunnel["Cloudflare Tunnel"]
end
subgraph Infrastructure["Infrastructure"]
Firewall["Firewall Hetzner"]
Network["Politique réseau interne"]
Container["Conteneur isolé"]
end
subgraph Application["Application et données"]
Service["Service LogsCord"]
ACL["Contrôles d'accès aux données"]
end
Internet --> Cloudflare
Cloudflare --> Tunnel
Tunnel --> Firewall
Firewall --> Network
Network --> Container
Container --> Service
Service --> ACLLogsCord distingue :
Les communications sensibles utilisent des canaux chiffrés lorsque les composants traversent une frontière réseau qui le nécessite.
Les sauvegardes disposent d'une protection supplémentaire et indépendante.
Les mécanismes cryptographiques particulièrement sensibles utilisent le KMS interne de LogsCord.
Les sauvegardes ClickHouse sont écrites vers un stockage objet compatible avec l'API S3 fourni par Hetzner Object Storage.
ClickHouse prend en charge les opérations de sauvegarde et restauration vers un endpoint S3 ainsi que les sauvegardes incrémentales dépendant d'une sauvegarde de base.
L'Object Storage n'est pas utilisé comme base de production principale.
Il constitue un environnement séparé destiné à la conservation des sauvegardes.
Avant leur conservation durable, les sauvegardes LogsCord sont protégées par AES-256-GCM.
AES-GCM est un mode de chiffrement authentifié : il protège la confidentialité du contenu et permet également de détecter une modification non autorisée du ciphertext ou des données authentifiées associées.
Les clés nécessaires au déchiffrement sont gérées séparément du stockage contenant les sauvegardes.
Une personne disposant uniquement d'un accès aux objets S3 ne doit donc pas disposer automatiquement des moyens permettant de lire leur contenu.
Les buckets de sauvegarde utilisent S3 Object Lock.
Pour les sauvegardes devant être considérées comme immuables, LogsCord utilise le mode Compliance.
Dans ce mode, la période de rétention appliquée à un objet ne peut pas être raccourcie avant son échéance.
Cette protection vise notamment à empêcher qu'une compromission des identifiants de sauvegarde, une erreur administrative ou un logiciel malveillant puisse simplement supprimer immédiatement les sauvegardes encore protégées.
Les sauvegardes standards sont conservées pendant une fenêtre de 90 jours.
À l'expiration de leur période Object Lock, elles deviennent éligibles à la suppression par les politiques de cycle de vie du stockage.
Lorsque le versioning et Object Lock sont utilisés, LogsCord tient également compte des versions non courantes afin qu'une ancienne version ne reste pas récupérable simplement parce que l'objet courant a été supprimé.
LogsCord surveille donc également l'expiration des versions susceptibles de contenir les données sauvegardées.
Pour l'infrastructure standard :
| Type | Fréquence |
|---|---|
| Sauvegarde complète | 1 fois par mois |
| Sauvegarde incrémentale | 1 fois par semaine |
| Rétention | 90 jours |
Une sauvegarde incrémentale contient les changements nécessaires par rapport à sa sauvegarde de base.
La sauvegarde de base correspondante doit donc rester disponible tant qu'une sauvegarde incrémentale qui en dépend reste récupérable.
Les clients Enterprise peuvent disposer d'une politique de sauvegarde renforcée.
Cette politique peut comprendre :
L'existence de trois réplicas ne remplace pas les sauvegardes S3 immuables.
Les deux mécanismes sont volontairement indépendants.
LogsCord ne considère pas la simple présence d'objets dans un bucket comme une preuve suffisante de l'existence d'une sauvegarde exploitable.
Une sauvegarde peut être présente mais être incomplète, contenir une chaîne incrémentale cassée ou présenter un problème qui n'apparaîtrait qu'au moment d'une restauration.
LogsCord réalise donc des tests réguliers de restauration.
La création réussie d'un fichier ou le statut BACKUP_CREATED n'est pas, à lui seul, le critère final de validation.
Lors de chaque cycle mensuel, LogsCord ne teste pas uniquement la nouvelle sauvegarde complète.
Le système vérifie également que la chaîne de sauvegardes incrémentales du cycle précédent permet effectivement de reconstruire le même état logique qu'une sauvegarde complète.
L'objectif est de vérifier que les sauvegardes incrémentales ne sont pas seulement créées, mais réellement restaurables.
Lors du cycle mensuel de validation, deux chemins de sauvegarde représentent le même état logique des données.
mermaidflowchart TB
Watermark["Watermark logique commun"]
subgraph FullPath["Chemin de contrôle complet"]
Full["Full backup"] --> RestoreFull["Restauration A"]
end
subgraph IncrementalPath["Chemin incrémental"]
Incremental["Sauvegarde de base<br/>+ chaîne incrémentale"] --> RestoreIncremental["Restauration B"]
end
Watermark --> Full
Watermark --> Incremental
RestoreFull --> Compare["Comparaison de l'état logique"]
RestoreIncremental --> Compare
Compare --> Validation["Validation du cycle"]L'objectif est d'obtenir le même ensemble de données par deux chemins :
1. restauration de la sauvegarde complète ; 2. restauration de la chaîne constituée de la sauvegarde de base et de ses incrémentales successives.
Les sauvegardes sont réalisées sur une base qui peut continuer à recevoir des événements.
Deux commandes de sauvegarde lancées à quelques instants d'intervalle peuvent donc observer des écritures différentes.
LogsCord ne compare par conséquent pas naïvement deux archives en supposant qu'elles représentent exactement le même état.
Le système définit un watermark logique commun pour le test.
La comparaison porte sur l'état que les deux restaurations sont censées avoir en commun jusqu'à ce watermark.
Cela évite de déclarer une sauvegarde défectueuse simplement parce qu'un événement légitime est arrivé entre deux opérations de sauvegarde.
Les fichiers constituant une sauvegarde complète et une sauvegarde incrémentale sont structurellement différents.
Ils ne sont donc pas comparés octet par octet.
Les données restaurées sont comparées.
Selon la table et le type de données, les contrôles peuvent notamment comprendre :
Les empreintes sont calculées sur une représentation déterministe des données afin qu'une différence de disposition physique des parts ClickHouse ne soit pas considérée comme une différence fonctionnelle.
Le but est de vérifier que :
> les deux chemins de restauration reconstruisent le même état logique de la base.
Une chaîne n'est considérée comme validée que lorsque :
Un échec à l'une de ces étapes produit une alerte et empêche le test d'être déclaré réussi.
Une sauvegarde restaurée n'est jamais immédiatement considérée comme une base de production valide.
La restauration est d'abord effectuée dans un environnement isolé.
mermaidflowchart LR
Backup["Sauvegarde"] --> Decrypt["Déchiffrement"]
subgraph Isolated["Environnement de restauration isolé"]
Restore["Restauration ClickHouse"] --> Replay["Replay confidentialité"]
Replay --> Integrity["Contrôles d'intégrité"]
Integrity --> Validation["Validation"]
end
Decrypt --> Restore
Validation --> Access["Autorisation de remise à disposition"]Une base restaurée ne doit pas devenir accessible aux API normales avant que les opérations de suppression et de modification nécessaires aient été réappliquées.
Une sauvegarde correctement conçue doit être résistante aux modifications accidentelles.
Cette immutabilité crée cependant une difficulté particulière pour les données personnelles.
Une donnée peut avoir été enregistrée dans une sauvegarde puis supprimée de la production à la suite d'une demande d'effacement.
Modifier rétroactivement chaque sauvegarde historique détruirait en partie l'intérêt d'une sauvegarde immuable et serait particulièrement coûteux pour un stockage analytique.
À l'inverse, restaurer naïvement cette sauvegarde ferait réapparaître une donnée qui avait déjà été supprimée.
LogsCord utilise donc un mécanisme de replay des opérations de confidentialité.
Lorsqu'une opération pertinente modifie l'état attendu d'une donnée personnelle, l'opération nécessaire à sa reproduction est ajoutée à un journal dédié.
Cela concerne notamment les opérations destinées à garantir qu'après restauration :
Le journal est append-only.
Une entrée existante n'est pas modifiée pour réécrire l'historique.
L'opération nécessaire est enregistrée lorsqu'elle est exécutée, puis les entrées sont regroupées et scellées dans des segments journaliers.
Ainsi, la périodicité de 24 heures concerne le scellement du segment, et non l'attente de 24 heures avant de mémoriser une suppression.
Le journal de replay n'est pas conçu comme un deuxième journal des demandes RGPD.
Il ne cherche pas à conserver :
Il contient uniquement les informations techniques nécessaires pour reproduire l'état attendu de la base lors d'une restauration.
Conceptuellement, il enregistre :
> appliquer telle opération à telle donnée ou tel ensemble de données
et non :
> telle personne a effectué telle demande pour telle raison.
Lorsque les identifiants techniques contenus dans ce journal restent susceptibles d'être rattachés à une personne, LogsCord traite néanmoins ce journal comme une donnée pseudonymisée et lui applique les protections correspondantes.
Chaque segment journalier du journal de replay est chiffré indépendamment avec AES-256-GCM.
La gestion des clés nécessaires à ce mécanisme est assurée par le KMS interne de LogsCord.
Le KMS est hébergé sur une infrastructure bare metal dédiée et durcie, séparée des principaux systèmes de stockage et de traitement.
Sa racine de confiance repose sur un TPM 2.0 physique.
Les clés racines protégées par le TPM sont configurées comme non exportables.
Les applications ordinaires n'obtiennent donc pas une copie de ces clés. Elles utilisent uniquement les opérations expressément exposées par le KMS.
Le stockage d'un segment de replay et le système permettant l'utilisation des clés correspondantes restent ainsi dans des périmètres de sécurité distincts.
LogsCord exploite son propre service de gestion de clés afin de conserver le contrôle direct sur le cycle de vie du matériel cryptographique sensible.
Le KMS est exécuté sur un serveur bare metal dédié, distinct de l'infrastructure applicative principale.
Le serveur fait l'objet de mesures de durcissement spécifiques et son accès réseau est limité aux composants et opérations nécessitant effectivement l'utilisation du service.
Une puce TPM 2.0 physique fournit la racine matérielle de confiance.
Les clés racines du KMS sont protégées par le TPM et configurées comme non exportables.
mermaidflowchart LR
subgraph Trust["Racine de confiance"]
TPM["TPM 2.0 physique"] --> Root["Clés racines<br/>non exportables"]
end
subgraph KeyService["Service de gestion des clés"]
KMS["KMS interne<br/>bare metal dédié"]
end
Apps["Applications autorisées"] -->|Requête authentifiée| KMS
Root --> KMS
KMS -->|Opérations cryptographiques autorisées| Data["Stockages chiffrés"]Cette architecture vise notamment à empêcher qu'une compromission du stockage applicatif, du stockage objet ou d'une sauvegarde fournisse simultanément les clés racines nécessaires au déchiffrement.
Le KMS n'est pas présenté comme un HSM certifié et LogsCord ne revendique pas de certification FIPS ou équivalente pour ce composant.
L'objectif est de décrire précisément les garanties effectivement fournies :
LogsCord évite d'utiliser directement une même clé racine pour chiffrer de grandes quantités de données.
Le système utilise une hiérarchie de clés.
Les clés racines protégées par le TPM servent à protéger le matériel cryptographique utilisé par les différents mécanismes de LogsCord.
Les données, notamment les segments du journal de replay, sont chiffrées avec des clés de chiffrement dédiées.
Ces clés peuvent elles-mêmes être protégées par des clés de chiffrement de clés rattachées à la racine de confiance du KMS.
mermaidflowchart LR
TPM["TPM 2.0 physique"] --> Root["Clé racine<br/>non exportable"]
Root -->|Protège| KEK["Clé de chiffrement<br/>de clés — KEK"]
KEK -->|Enveloppe| DEK["Clés de données<br/>dédiées — DEK"]
DEK -->|AES-256-GCM| Data["Données chiffrées"]Cette séparation permet notamment d'appliquer des politiques de rotation et de destruction différentes selon la catégorie de données sans devoir remplacer la racine de confiance matérielle.
Le journal de replay est segmenté par périodes de 24 heures.
Chaque segment est associé à du matériel cryptographique distinct afin de limiter le périmètre affecté par la compromission éventuelle d'une clé.
Les clés nécessaires au déchiffrement restent utilisables uniquement aussi longtemps qu'une sauvegarde récupérable peut encore nécessiter le replay du segment correspondant.
La durée de vie d'une clé n'est donc pas déterminée uniquement par son âge.
Avant sa destruction, LogsCord vérifie qu'aucune sauvegarde encore récupérable ne dépend des opérations protégées par cette clé.
Une fois cette condition remplie, le matériel cryptographique correspondant est détruit conformément à la politique de gestion des clés.
Lorsqu'une clé arrive définitivement en fin de vie, LogsCord déclenche sa destruction.
Pour les clés protégées par la racine matérielle du KMS, cette destruction vise à rendre impossible toute nouvelle opération permettant de récupérer les données précédemment protégées.
Les clés racines conservées dans le TPM sont non exportables.
Les mécanismes de sauvegarde et de restauration du KMS sont conçus de manière à ne pas permettre la réapparition d'une clé dont la destruction définitive a déjà été enregistrée.
Cette propriété est particulièrement importante pour le journal de replay : restaurer un état ancien du KMS ne doit pas permettre de contourner un effacement cryptographique intervenu après cet état.
La destruction des clés fait donc partie du cycle de reprise du KMS lui-même et est vérifiée avant qu'un système restauré puisse redevenir opérationnel.
LogsCord sépare les données chiffrées des systèmes chargés de protéger les clés permettant de les déchiffrer.
mermaidflowchart LR
TPM["TPM 2.0<br/>clés racines non exportables"] --> KMS["KMS interne"]
KMS -->|Opérations cryptographiques| Services["Services autorisés<br/>sans accès aux clés racines"]
subgraph Storage["Stockages séparés du KMS"]
Active["Données actives chiffrées"]
S3["Sauvegardes chiffrées<br/>Hetzner Object Storage"]
Replay["Journal de replay chiffré"]
end
Services -->|Ciphertext| Active
Services -->|Ciphertext| S3
Services -->|Ciphertext| ReplayCette séparation signifie notamment que :
Les sauvegardes ne constituent pas une base secondaire destinée à la consultation normale.
Elles sont utilisées pour :
La possibilité de déclencher une restauration est limitée aux personnes habilitées par LogsCord.
Les credentials utilisés pour accéder au stockage, au système de clés et aux environnements de restauration sont séparés autant que possible des credentials applicatifs habituels.
Un serveur applicatif ordinaire ne doit pas avoir besoin de pouvoir restaurer arbitrairement une sauvegarde historique.
L'accès aux données sauvegardées et l'accès au système de gestion des clés sont volontairement séparés.
Une restauration nécessitant du matériel cryptographique protégé par le KMS doit suivre la procédure d'autorisation prévue à cet effet.
Les services applicatifs ordinaires ne disposent pas directement des clés racines du KMS.
Lorsqu'une restauration réelle est nécessaire, la base restaurée est placée dans un état isolé.
Avant toute remise à disposition :
1. LogsCord identifie le point temporel représenté par la sauvegarde ; 2. les segments de replay pertinents postérieurs à ce point sont récupérés ; 3. leurs clés sont obtenues via le processus autorisé ; 4. leur authenticité est vérifiée ; 5. les suppressions et rectifications sont rejouées ; 6. le résultat de chaque opération est contrôlé ; 7. un contrôle final confirme que le replay est complet.
Seulement après validation, la base peut être promue ou reconnectée aux services autorisés.
Une restauration ne peut donc pas simplement être suivie d'une remise en production immédiate.
Un membre demande l'effacement d'un ensemble de données le 10 août.
Ces données existaient encore dans une sauvegarde créée le 1er août.
La production est correctement nettoyée le 10 août, mais la sauvegarde du 1er août reste volontairement immuable pendant sa période de rétention.
Si une restauration du 1er août devient nécessaire le 20 août :
mermaidflowchart LR
Backup["Sauvegarde du 1er août"] --> Restore["Restauration isolée"]
subgraph Privacy["Reconstitution de l'état de confidentialité"]
Replay["Replay du 2 au 20 août"] --> Delete["Réapplication de la suppression<br/>du 10 août"]
end
Restore --> Replay
Delete --> Checks["Contrôles de complétude et d'intégrité"]
Checks --> Clean["Base restaurée<br/>sans la donnée supprimée"]
Clean --> Access["Remise à disposition autorisée"]La restauration d'une sauvegarde antérieure ne doit donc pas annuler une suppression déjà exécutée.
Les situations suivantes sont considérées comme des anomalies devant être investiguées :
Une sauvegarde présentant une anomalie n'est pas considérée comme validée simplement parce que les autres sauvegardes du cycle sont présentes.
La stratégie est conçue pour répondre à plusieurs catégories de risques.
| Risque | Mesure |
|---|---|
| Panne matérielle | Réplication sur les architectures concernées |
| Corruption ou erreur logique | Sauvegardes permettant de reconstruire un état antérieur |
| Suppression accidentelle d'une sauvegarde | S3 Object Lock en mode Compliance |
| Compromission du stockage de sauvegarde | AES-256-GCM + séparation des clés |
| Sauvegarde incrémentale inutilisable | Tests réguliers de restauration |
| Divergence d'une chaîne incrémentale | Comparaison avec une restauration complète |
| Réapparition d'une donnée supprimée | Journal de replay des opérations de confidentialité |
| Compromission du stockage des clés | Séparation du KMS et des données |
| Compromission applicative | Moindre privilège, segmentation réseau et isolation des composants |
LogsCord met à la disposition du développeur une interface producteur distincte du canal d'ingestion et de MCP.
Cette interface permet au développeur de consulter les données émises par ses propres collecteurs, dans les limites définies ci-dessous.
Elle ne donne aucun accès aux données d'un autre producteur.
Le fait qu'une donnée ait été émise par un bot, une application ou un service ne confère pas à son développeur un droit illimité sur les données personnelles qu'elle contient.
L'accès dépend du contexte du log, des finalités déclarées, du rôle juridique effectivement exercé et des documents applicables.
L'interface producteur est cloisonnée par :
Elle est soumise aux règles suivantes :
Dans un contexte de serveur Discord, le développeur ne peut consulter des données personnelles détaillées que dans la mesure nécessaire à la fourniture, au support ou à la sécurité de son service, et conformément au rôle qui lui est attribué par la Politique de confidentialité, le DPA ou tout autre accord applicable.
Lorsqu'un accès intervient pour répondre à une demande de support, celle-ci doit être rattachée au serveur concerné et documentée.
La consultation simultanée de données personnelles détaillées provenant de plusieurs serveurs est interdite par défaut.
Une analyse transversale ne peut porter que sur des données agrégées ou effectivement anonymisées, sauf lorsqu'un incident de sécurité documenté justifie une investigation limitée, proportionnée, tracée et réservée aux personnes spécialement habilitées.
Dans un contexte applicatif, le développeur peut consulter les événements de sa propre application pour les finalités déclarées de fonctionnement et de sécurité.
Cet accès reste soumis aux principes de minimisation, de limitation de la conservation, de confidentialité et de traçabilité.
L'interface producteur ne peut pas être utilisée pour :
Les mécanismes d'émission externe de LogsCord, notamment les webhooks destinés aux rapports d'incidents, de sanctions ou d'événements de sécurité, constituent un canal distinct de l'interface producteur.
Ils ne doivent pas être considérés comme un mécanisme d'accès général à la base LogsCord.
Un rapport transmis à un système externe doit être limité aux informations nécessaires à la finalité du rapport.
Les données contenues dans un rapport peuvent notamment dépendre :
Les mécanismes d'émission doivent appliquer les mêmes principes de minimisation et de contrôle d'accès que les autres interfaces de LogsCord.
Un webhook externe ne confère donc pas à son destinataire un droit général de consultation des données LogsCord.
Les principaux prestataires techniques pouvant intervenir dans le fonctionnement de l'infrastructure sont documentés dans la Politique de confidentialité et, lorsque cela est applicable, dans la liste des sous-traitants ultérieurs associée au DPA de LogsCord.
La présence d'un prestataire dans l'architecture ne lui donne pas automatiquement le droit de réutiliser les données à ses propres fins.
Les rôles juridiques, catégories de données concernées et mécanismes applicables aux transferts internationaux sont décrits dans les documents de confidentialité plutôt que dans cette seule page de sécurité.
Aucune architecture ne permet de garantir l'absence absolue d'incident.
Notre objectif est de :
1. réduire la probabilité d'une compromission ; 2. limiter son impact lorsqu'elle survient ; 3. détecter les anomalies ; 4. permettre une reprise contrôlée ; 5. vérifier que les sauvegardes sont effectivement restaurables.
Certaines mesures ne sont volontairement pas détaillées publiquement, notamment :
Cette limitation ne signifie pas que ces éléments ne sont pas documentés en interne.
La collecte et le traitement des événements peuvent être résumés ainsi :
mermaidflowchart LR
Discord["Discord"] --> Gateway["Discord Gateway"]
subgraph Collect["Collecte"]
Gateway --> Collectors["Collecteurs<br/>shardés et conteneurisés"]
end
subgraph Storage["Stockage et temps réel"]
CH["ClickHouse<br/>stockage durable"]
Broker["Message Broker<br/>temps réel"]
end
Collectors --> CH
Collectors --> Broker
subgraph API["Accès applicatif"]
APIService["API LogsCord"]
Client["Client"]
end
CH --> APIService
Broker --> APIService
APIService -->|SSE| Client
Internet["Internet"] --> CF["Cloudflare<br/>WAF / DDoS / Rulesets"]
CF --> Tunnel["Cloudflare Tunnel"]
Tunnel --> APIServiceLa façade Internet est séparée du chemin de traitement interne :
mermaidflowchart LR
Internet["Internet"]
subgraph Edge["Façade publique"]
CF["Cloudflare"] --> Security["WAF / DDoS / Rulesets"]
Security --> Tunnel["Cloudflare Tunnel"]
end
subgraph Internal["Infrastructure privée"]
Firewall["Firewall d'infrastructure"] --> Network["Segmentation réseau"]
Network --> Services["Services LogsCord"]
Services --> ACL["Contrôles d'accès aux données"]
end
Internet --> CF
Tunnel --> FirewallLe chemin de sauvegarde peut être représenté de manière synthétique :
mermaidflowchart LR
CH[("ClickHouse")] --> Backup["Sauvegarde"]
subgraph Protection["Protection et conservation"]
Encrypt["Chiffrement<br/>AES-256-GCM"] --> S3["Hetzner Object Storage"]
S3 --> Lock["S3 Object Lock<br/>Compliance"]
end
subgraph Recovery["Reprise contrôlée"]
Restore["Restauration isolée"] --> Replay["Replay confidentialité"]
Replay --> Verify["Vérification"]
Verify --> Production["Remise à disposition"]
end
Backup --> Encrypt
Lock --> RestoreLes sauvegardes sont indépendantes des réplicas de production.
Le KMS reste lui-même séparé du stockage des données :
mermaidflowchart LR
TPM["TPM 2.0"] --> Root["Clés racines<br/>non exportables"]
Root --> KMS["KMS interne"]
KMS -->|Opérations autorisées| Crypto["Services cryptographiques"]
subgraph Encrypted["Stockages chiffrés séparés"]
Backups["Sauvegardes<br/>AES-256-GCM"]
Replay["Journal de replay<br/>AES-256-GCM"]
end
Crypto -->|Ciphertext| Backups
Crypto -->|Ciphertext| ReplayLogsCord applique une architecture de sécurité reposant sur plusieurs niveaux indépendants :
Cette architecture ne prétend pas rendre LogsCord invulnérable.
Elle vise à faire en sorte qu'une compromission d'un composant ne fournisse pas automatiquement le contrôle des autres, qu'un accès au stockage ne fournisse pas automatiquement les clés, qu'une sauvegarde ne soit pas considérée comme fiable sans restauration vérifiée et qu'une restauration historique ne puisse pas annuler silencieusement une opération de confidentialité déjà exécutée.
Les mécanismes décrits dans ce document correspondent à l'architecture et aux mesures de sécurité mises en œuvre par LogsCord. Leur fonctionnement, leurs configurations et leurs procédures d'exploitation sont documentés dans un référentiel interne qui n'est pas publié intégralement, notamment afin de ne pas exposer d'informations susceptibles de faciliter une attaque.
LogsCord publie progressivement des éléments techniques complémentaires dans sa page Articles. Le lecteur est notamment encouragé à consulter les publications portant le tag Devlog, qui présentent de manière plus détaillée certains choix d'architecture, mécanismes effectivement mis en place, diagrammes, protocoles de test et résultats de benchmark. Un benchmark n'est interprétable qu'avec son périmètre, sa méthodologie, sa date et ses conditions d'exécution ; ces éléments doivent accompagner les résultats publiés.
LogsCord publie également plusieurs projets open source. Leur code, leur documentation, leurs tests et leur historique permettent d'apprécier publiquement certaines pratiques d'ingénierie et le niveau de rigueur recherché par LogsCord. Ces projets ne constituent cependant pas une reproduction de l'infrastructure privée et ne prouvent pas, à eux seuls, l'implémentation d'un contrôle déterminé sur la plateforme LogsCord.
Le tableau suivant présente la date de la dernière vérification réalisée par LogsCord pour les principaux contrôles décrits dans ce document. Il constitue un état daté : un résultat positif confirme le contrôle au moment du test, mais ne constitue pas une garantie permanente ni une validation indépendante.
| Contrôle | Vérification réalisée | Dernier test | Résultat |
|---|---|---|---|
| Cloisonnement des tenants | Vérification de l'application du contexte de tenant et du refus des accès croisés non autorisés | 12/08/2026 | Vérifié |
| Moindre privilège des collecteurs | Vérification des permissions d'insertion et de l'absence de droit général de lecture ou d'administration | 12/08/2026 | Vérifié |
| Rotation des identifiants temporaires | Vérification de la génération, du renouvellement automatisé et de l'expiration des identifiants concernés | 12/08/2026 | Vérifié |
| Segmentation réseau interne | Vérification des flux autorisés entre collecteurs, broker, API, ClickHouse et services internes | 12/08/2026 | Vérifié |
| Isolation des conteneurs | Vérification du périmètre des capacités, secrets et communications réseau attribués aux conteneurs | 12/08/2026 | Vérifié |
| Façade Cloudflare | Vérification du passage par Cloudflare, de Cloudflare Tunnel et des règles de protection applicables | 12/08/2026 | Vérifié |
| Firewall d'infrastructure | Vérification des règles Hetzner et de leur articulation avec la segmentation interne | 12/08/2026 | Vérifié |
| Chiffrement et déchiffrement des sauvegardes | Vérification du chiffrement AES-256-GCM, de l'authenticité et du déchiffrement contrôlé d'une sauvegarde | 12/08/2026 | Test réussi |
| S3 Object Lock, versioning et lifecycle | Vérification de la rétention en mode Compliance, des versions et des règles d'expiration applicables | 12/08/2026 | Vérifié |
| Rétention des données actives | Vérification de l'application des durées de conservation configurées et de la suppression des données arrivées à échéance | 12/08/2026 | Test réussi |
| Rétention des sauvegardes | Vérification de la fenêtre de conservation, de l'expiration des objets et du traitement des versions non courantes après la période protégée | 12/08/2026 | Test réussi |
| Restauration d'une sauvegarde complète | Restauration dans un environnement isolé et exécution des contrôles d'intégrité prévus | 12/08/2026 | Test réussi |
| Restauration de la chaîne incrémentale | Restauration de la sauvegarde de base et de la chaîne incrémentale correspondante | 12/08/2026 | Test réussi |
| Comparaison complète / incrémentale | Comparaison de l'état logique des deux restaurations pour un watermark commun | 12/08/2026 | Test réussi |
| Alimentation du journal de replay | Vérification de l'enregistrement immédiat des opérations d'effacement et de rectification ainsi que du scellement des segments journaliers | 12/08/2026 | Test réussi |
| Replay d'un effacement | Restauration d'une sauvegarde antérieure à un effacement, réapplication de l'opération puis vérification de l'absence de la donnée supprimée | 12/08/2026 | Test réussi |
| Replay d'une rectification | Restauration d'une sauvegarde antérieure à une modification de données personnelles, réapplication de la rectification puis vérification de l'état corrigé | 12/08/2026 | Test réussi |
| Complétude du replay de confidentialité | Vérification que tous les segments applicables depuis le point de sauvegarde ont été authentifiés et rejoués avant la remise à disposition | 12/08/2026 | Test réussi |
| Séparation du stockage et des clés | Vérification de la séparation entre données chiffrées, services autorisés, KMS et clés racines | 12/08/2026 | Vérifié |
| TPM et clés racines non exportables | Vérification de la protection des clés racines par le TPM 2.0 et de leur caractère non exportable | 12/08/2026 | Vérifié |
| Cycle de vie et destruction des clés | Vérification des conditions de conservation, de fin de vie et de destruction du matériel cryptographique concerné | 12/08/2026 | Vérifié |
| Restauration contrôlée du KMS | Vérification qu'une restauration ne réactive pas une clé dont la destruction définitive a été enregistrée | 12/08/2026 | Test réussi |
| Accès à l'interface producteur | Vérification du cloisonnement par producteur, application et contexte de log ainsi que de la traçabilité des accès | 12/08/2026 | Vérifié |
Les différentes sources de preuve doivent donc être interprétées selon leur portée :
| Source | Ce qu'elle permet d'établir | Limite |
|---|---|---|
| Documentation officielle d'un fournisseur | Le service tiers possède la capacité technique décrite | Ne prouve pas la configuration propre à LogsCord |
| Devlog LogsCord | LogsCord décrit une mise en œuvre, sa méthode et, le cas échéant, ses résultats | Publication produite par LogsCord, sans validation indépendante |
| Projet open source LogsCord | Qualité observable du code public, des tests, de la documentation et des pratiques d'ingénierie | Ne donne pas accès au code ni à la configuration de la plateforme privée |
| Référentiel et preuves internes | Configuration, exécution et contrôle d'un mécanisme précis sur la plateforme | Accès restreint et examen public impossible en l'état |
| Audit indépendant | Évaluation externe d'un périmètre et d'une période déterminés | Aucun audit de l'ensemble de la plateforme n'a encore été réalisé |
À la date de cette version, aucun audit de sécurité indépendant de l'ensemble de la plateforme LogsCord n'a été réalisé. LogsCord ne présente donc ni ce document, ni ses devlogs, ni ses projets open source comme un rapport d'audit, une certification ou une validation indépendante. Ils constituent des éléments de transparence qui peuvent être complétés, dans un cadre approprié et sous réserve des exigences de confidentialité et de sécurité, par des preuves internes ciblées telles que des rapports de restauration, résultats de tests, relevés de configuration ou procédures de contrôle.
Les documentations officielles suivantes décrivent les capacités et le fonctionnement général des services et standards tiers sur lesquels s'appuie l'architecture présentée. Elles permettent de comprendre les mécanismes techniques cités et de vérifier que les fonctionnalités correspondantes existent chez leurs éditeurs.
tenant_id, contrôle d'accès fondé sur les rôles, row policies et modèles d'isolation alternatifs.Pour toute question relative à la sécurité de LogsCord ou pour signaler une vulnérabilité, un comportement suspect, une exposition de données ou tout autre incident potentiel, contactez [email protected].
Les modalités de signalement de sécurité à jour sont publiées dans le fichier security.txt. Les chercheurs, utilisateurs et partenaires sont invités à consulter ce document avant de transmettre un signalement.
Les documents, politiques et manuels publics de LogsCord sont également disponibles dans le dépôt LogsCord/logscord-manuals.