Aller au contenu
Documentation

Modules

Données sensibles (DSPM)

Les identifiants cherchés dans les buckets, les bases PostgreSQL, les copies de disques et le code des fonctions, les formats lus, l'échantillonnage, ce que Ctadel conserve et la page « Sécurité des données ».

Le module de données sensibles cherche, dans le contenu de vos ressources de stockage, des identifiants au format connu : numéros de carte, IBAN, numéros de sécurité sociale, identifiants de santé. Il lit les buckets, une copie temporaire de vos bases PostgreSQL, les copies de disques et le code des fonctions serverless, et produit un constat par règle et par emplacement. Il ne conserve jamais la donnée trouvée, seulement un extrait masqué.

Ce qui est cherché

Chaque règle est une expression régulière tirée d'une norme publiée (RFC, ISO, autorité nationale, spécification d'un émetteur de cartes), citée dans la description de la règle. Quand l'identifiant porte une clé de contrôle, un validateur la vérifie (Luhn pour les cartes, modulo 97 pour l'IBAN, et ainsi de suite) : une suite de chiffres qui ressemble à l'identifiant mais ne passe pas la clé n'est pas rapportée. Les identifiants qui ne sont qu'une suite de chiffres (NPI, IMSI, Aadhaar, TFN) ne sont cherchés qu'à côté de leur mot-clé (« NPI: 1234567893 », colonne aadhaar_number) ou dans leur format imprimé.

Catégorie affichéeCe qu'elle regroupe
PCINuméros de carte de paiement (Visa, MasterCard, American Express, Discover, JCB, Diners), avec et sans préfixe d'émetteur connu
FinancialIBAN, BIC, numéros de routage et de guichet (ABA, BSB, IFSC, Sort Code), identifiants de titres (CUSIP, ISIN, LEI, SEDOL), identifiants fiscaux et d'entreprise (EIN, ITIN, UTR, IRD, TFN, ABN, CPF, CNPJ, TVA, SIREN, SIRET, TVA française), adresses Bitcoin, Ethereum et Monero, CVV, dates d'expiration, BIN, pistes magnétiques, cartes masquées
PIINuméros de sécurité sociale et d'identité nationale (France NIR, États-Unis SSN, Royaume-Uni NINO, Suisse AHV, Espagne DNI, Portugal NIF et DNI, Irlande PPSN, Canada SIN, Mexique CURP, Inde PAN et Aadhaar, Japon My Number, Bulgarie EGN, Israël, Australie CRN, identifiants du ministère de la Défense américain, A-Number), adresses de courriel, numéros de téléphone, IMSI, VIN
PHIIdentifiants de santé : NPI, DEA, numéros NHS et NHI, Medicare américain (MBI, HICN) et australien, codes CPT, HCPCS, NDC, LOINC, ATC, ICD-9 et ICD-10
DigitalIdentityIMEI, identifiants publicitaires Apple (IDFA) et Google (GAID), ESN, mots de passe hachés

Chaque règle porte une sévérité (CRITICAL, HIGH, MEDIUM, LOW), un niveau de confiance et une liste de périmètres : volume, bucket, database. Une règle n'est jouée que sur ses périmètres. La page « Politiques », onglet « DSPM », permet d'activer ou de désactiver chaque règle ; voir Politiques.

Le catalogue ne cherche pas ce qui n'a pas de format syntaxique : les catégories de l'article 9 du RGPD (religion, orientation sexuelle, opinion politique, origine ethnique), les contenus sémantiques (salaire, solde, historique de commandes), les documents de processus (audits, recherche médicale). La règle « Internal or external email » détecte une adresse de courriel ; elle ne distingue pas les adresses internes des externes.

Où Ctadel cherche

EmplacementCe qui est lu
BucketsLes objets des buckets de tous les clouds connectés
Bases de donnéesUne copie temporaire des instances PostgreSQL d'AWS, Google Cloud et Scaleway
DisquesLes fichiers d'une copie de disque des machines, décrite dans Hôtes
Fonctions serverlessLes fichiers texte du paquet de code des fonctions

Buckets

À chaque inventaire complet, Ctadel lance une lecture par bucket présent dans le graphe, avec les identifiants du compte qui le porte. Les buckets S3 d'AWS, Scaleway Object Storage, OVHcloud Object Storage (API S3), OUTSCALE OOS, Google Cloud Storage et Azure Blob Storage sont lus. Pour Azure, la lecture porte sur le compte de stockage : tous ses conteneurs sont parcourus ; la lecture passe par le rôle « Storage Blob Data Reader » du service principal, ou par la clé du compte quand le compte a été connecté avec une.

Ctadel liste jusqu'à 100 000 objets par bucket ; au-delà, la liste est tronquée et le résultat est marqué incomplet.

Type d'objetLectureTaille
Fichier texte (tout ce qui n'est pas dans la ligne suivante)Échantillon du début du fichier10 Mo au plus
.pdf, .zip, .tar, .gz, .tgz, .xlsx, .xlsm, .xls, .docx, .doc, .pptx, .odt, .odsTéléchargement complet puis extraction du texte50 Mo au plus par objet ; un objet plus lourd est tronqué à 50 Mo et compté comme non lisible

Détails de l'extraction :

  • Archives : profondeur d'imbrication 3, 100 fichiers par archive, 10 Mo par fichier extrait ; les fichiers plus gros sont ignorés.
  • Office et OpenDocument : les documents sont lus comme des archives XML ; une partie qui dépasse 32 Mio une fois décompressée est refusée (protection contre les archives piégées). Les .doc et .xls antérieurs à 2007 sont lus par extraction des chaînes de caractères qu'ils contiennent.
  • PDF : le texte est extrait du document (32 Mio au plus une fois décompressé) ; les PDF qui ne sont qu'une image n'ont pas de texte à lire.
  • Encodage : les objets en UTF-16 (sorties PowerShell, export Excel « Texte Unicode ») sont décodés avant la recherche, avec ou sans marque d'ordre des octets.
  • CSV et TSV : chaque valeur est préfixée du nom de sa colonne (iban: FR76...), y compris dans une archive, ce qui permet aux règles ancrées sur un mot-clé de reconnaître une colonne npi ou nir.

Bases de données

Ctadel ne se connecte jamais à votre base de production. Pour chaque instance PostgreSQL du graphe, Ctadel crée une copie dans votre compte, la lit, puis la supprime. La copie coûte le prix d'une petite instance pendant la durée du scan.

CloudCopie crééeClasseSuppression
AWS RDSInstantané ctadel-dspm-snap-<horodatage> puis restauration en ctadel-dspm-clone-<horodatage>, tous deux étiquetés Ctadel ; un groupe de sécurité temporaire n'ouvre le port qu'à la plage de sortie de votre instance Ctadel ; le mot de passe maître est réinitialisé sur la copie seulementdb.t3.microInstance, instantané et groupe de sécurité
Google Cloud SQLClone ctadel-dspm-<horodatage> par l'API d'administration Cloud SQLCelle de la sourceClone
Scaleway Managed DatabaseClone ctadel-dspm-clone-<horodatage>DB-PLAY2-PICOClone

La suppression est faite dans tous les cas, y compris après une erreur ou une interruption pendant la lecture. Une seule copie est en cours à la fois. L'adresse publique de la copie AWS dépend du réglage décrit dans Réglages du scanner.

Seul PostgreSQL est lu. Un moteur MySQL, Oracle, SQL Server, MongoDB ou Redis, et un cluster Aurora, sont écartés avant toute création ; l'ordre est abandonné sans copie. Azure SQL et les bases managées OVHcloud ne sont pas scannées : pour ces services, aucune lecture qui laisse l'instance source intacte n'est disponible à ce jour, et Ctadel préfère ne pas scanner plutôt que de toucher la source.

Sur la copie, un compte ctadel_dspm_scanner est créé avec un mot de passe aléatoire. Ctadel liste les bases auxquelles ce compte peut se connecter (les bases de maintenance rdsadmin, cloudsqladmin, azure_* sont exclues ; postgres est conservée), puis dans chacune :

  1. Les colonnes de type text, character varying, character, json, jsonb, xml, citext et hstore de tous les schémas hors système sont listées, jusqu'à 5 000 colonnes. Au-delà, le résultat est marqué incomplet.
  2. Pour chaque colonne, 100 lignes tirées au hasard sont lues. Chaque valeur est examinée avec le nom de sa colonne devant elle.
  3. Un constat est produit par règle et par colonne, avec le nombre de correspondances dans l'échantillon, la taille de l'échantillon et le nombre total de lignes de la table. La page affiche une estimation : correspondances multipliées par le rapport lignes totales sur lignes lues.

Si une base a des tables mais aucune colonne lisible, le compte de scan manque de droits : le résultat est marqué incomplet plutôt que « propre ».

Disques et fonctions

Le scanner qui lit les copies de disques du module Hôtes applique aussi les règles DSPM de périmètre volume. Il parcourt l'arborescence en ignorant les répertoires système (proc, sys, dev, les données du moteur de conteneurs, var/log, usr/lib, caches des gestionnaires de paquets), les binaires et les fichiers de plus de 256 Mo. Les fichiers .pem, .crt, .cer et .key ne sont lus que par les règles de secrets. Les archives, PDF, .xlsx, .docx et .jar sont extraits comme dans les buckets.

Le scanner de fonctions serverless télécharge le paquet de code de chaque fonction et applique les mêmes règles à ses fichiers texte, avec le même étiquetage des CSV et TSV.

Ce que Ctadel conserve

Le contenu lu reste dans votre compte : seuls des constats sont conservés par Ctadel. Un constat de données comporte :

ChampContenu
RessourceL'identifiant du bucket, de la base, du disque ou de la fonction
RègleLa clé de la règle (DSPM-FIN-IBAN-001), sa sévérité et sa catégorie
CheminLa clé de l'objet dans le bucket, base.schéma.table.colonne pour une base, le chemin relatif dans la copie de disque ou le paquet
CorrespondancesLe nombre de valeurs valides trouvées
ÉchantillonLa dernière valeur trouvée, masquée : deux caractères de chaque côté, le reste remplacé (FR****34) ; une valeur de quatre caractères ou moins devient ***
Lignes et échantillonPour une base, le nombre de lignes de la table et le nombre de lignes lues
Dates et statutPremière et dernière observation, résolution, statut OPEN, RESOLVED ou IGNORED

Un constat est identifié par le triplet ressource, règle et chemin. À chaque nouveau scan complet de la ressource, les constats qui ne ressortent plus sont fermés. Quand le résultat est incomplet (liste d'objets tronquée, objets non lisibles, colonnes non lues, droits insuffisants), rien n'est fermé : un constat ne disparaît que si Ctadel a pu vérifier son emplacement.

Chaque constat nouveau déclenche une notification de type données vers les canaux configurés, avec la clé de la règle, le chemin et le nombre de correspondances ; voir Notifications. Les constats sont aussi écrits dans le graphe, où les chemins d'attaque les utilisent pour qualifier une ressource exposée qui porte des données sensibles.

La page « Sécurité des données »

La page « Sécurité des données » (adresse /dspm) liste les constats ouverts du projet actif, triés par sévérité puis par nombre de correspondances, avec les colonnes « Sévérité », « Règle », « Catégorie », « Ressource », « Chemin du fichier » et « Correspondances ». Les filtres portent sur « Sévérité », « Catégorie de données », « Type de fichier » (l'extension du chemin) et « Ressource » ; le regroupement sur « Sévérité », « Catégorie de données » ou « Ressource ». Le bouton « Exporter CSV » exporte la liste filtrée. La page affiche au plus 2 000 constats ; un avis signale quand la liste est tronquée.

Un clic sur une ligne ouvre le panneau de détail. Il affiche la description de la règle, la « Ressource concernée », la section « Échantillon de données » avec l'extrait masqué, le nombre de correspondances et le chemin, et dans la colonne de droite la « Classification des données », la « Catégorie » et les « Correspondances ». Les chemins d'attaque qui passent par la ressource sont listés au-dessus. Le panneau est décrit dans Lire un constat.

La page Sécurité des données avec la liste des constats, leurs colonnes et la barre de filtres.
Figure 1. Figure 1. La page « Sécurité des données » sur l'instance de démonstration. Chaque ligne est une règle trouvée dans un emplacement, avec son nombre de correspondances.

Limites

  • Le module reconnaît des formats, pas des significations. Une donnée sensible sans format fixe (une adresse postale, un nom, un diagnostic en texte libre, un salaire) n'est pas détectée. Les catégories de l'article 9 du RGPD ne sont pas couvertes.
  • Les règles ancrées sur un mot-clé ne trouvent un identifiant nu que si son libellé est à côté : un en-tête de colonne CSV, un nom de colonne SQL, un mot-clé dans le texte. Un fichier de chiffres sans en-tête n'est pas rapporté pour ces règles.
  • Dans un bucket, seuls les 10 premiers Mo d'un fichier texte sont lus, et seuls les 100 000 premiers objets sont listés. Les objets extractibles de plus de 50 Mo ne sont pas lus. Un PDF image n'a pas de texte. Les archives au-delà de trois niveaux ou de cent fichiers sont lues en partie.
  • Une base n'est lue qu'à partir d'un échantillon de 100 lignes par colonne et de 5 000 colonnes par base ; le nombre total affiché est une estimation. Les colonnes numériques, binaires et de type date ne sont pas lues.
  • Seules les instances PostgreSQL d'AWS RDS, Google Cloud SQL et Scaleway sont copiées. Aurora, MySQL, SQL Server, Oracle, MongoDB, Redis, Azure SQL et les bases managées OVHcloud et OUTSCALE ne sont pas scannés.
  • La copie de base vit dans votre compte le temps du scan et vous est facturée ; l'instantané RDS et le groupe de sécurité temporaire aussi. Si le compte connecté n'a pas les droits de création et de suppression de ces objets, aucune base n'est scannée.
  • Sur une copie de disque, un fichier texte en UTF-16 est pris pour un fichier binaire et n'est pas lu, alors qu'il l'est dans un bucket. Les fichiers de plus de 256 Mo sont comptés comme non lus.
  • L'adresse de courriel est détectée sans distinction entre domaine interne et externe.
  • La page affiche au plus 2 000 constats ouverts ; l'export CSV porte sur la liste affichée.