Aller au contenu

Générer un rapport de conformité NIS2

GET /compliance/nis2-report.pdf génère un PDF téléchargeable combinant la posture d'exposition CVE, la conformité SLA, et les décisions de sécurité récentes — destiné à être partagé avec des auditeurs, la direction, ou un responsable conformité. Ce guide couvre sa génération, son cadrage sur une période et/ou un sous-ensemble de machines, et la signification des blocs d'espace réservé [À VALIDER : …].

Deux autres formats des mêmes données sous-jacentes existent aux côtés du PDF : GET /compliance/nis2-posture (métriques JSON uniquement) et GET /compliance/nis2-report.json (un ensemble d'audit JSON plus complet). Ce guide couvre le PDF, puisque c'est celui destiné à quitter Repod comme document autonome.


1. Prérequis

  • N'importe quel rôle authentifié (GET /compliance/nis2-report.pdf utilise get_current_user, pas un rôle élevé) — mais les restrictions d'accès machine propres à l'appelant s'appliquent toujours : le rapport d'un utilisateur au périmètre réduit se limite aux machines qu'il peut voir, jamais élargi par les paramètres de requête ci-dessous.
  • La fonctionnalité de licence nis2_report doit être incluse.
  • WeasyPrint génère le PDF côté serveur — aucune dépendance côté client, juste un curl/téléchargement navigateur classique.

2. Générer le rapport (par défaut : parc entier, instantané en direct)

curl -s http://localhost:8000/api/v1/compliance/nis2-report.pdf \
  -H "Authorization: Bearer $TOKEN" \
  -o nis2_compliance_report.pdf

Sans paramètre de requête, le rapport couvre toutes les machines activées auxquelles l'appelant a accès, et la section d'historique des décisions de sécurité couvre toutes les décisions enregistrées sans filtre de date.


3. Cadrer par période

period_start / period_end (ISO 8601, ex. 2026-01-01) filtrent uniquement la section d'historique des décisions de sécurité (décisions accept/reject/exception/upgrade enregistrées dans cette fenêtre).

curl -s "http://localhost:8000/api/v1/compliance/nis2-report.pdf?period_start=2026-01-01&period_end=2026-06-30" \
  -H "Authorization: Bearer $TOKEN" \
  -o nis2_compliance_report_h1_2026.pdf

period_end sans period_start est rejeté (400). Omettre period_end alors que period_start est défini fixe la fin par défaut à maintenant.

La posture CVE est toujours un instantané en direct — jamais rétroactive

Contrairement à la section d'historique des décisions, la posture d'exposition CVE/SLA (nombre de CVE non corrigées, jours moyens d'exposition, dépassements de SLA) est toujours calculée au moment de la génération, jamais reconstituée pour une période passée. Il n'existe pas de stockage de série temporelle pour ces données — inventory_cve est un instantané remplacé à chaque scan. Un rapport généré aujourd'hui avec period_start=2026-01-01 montre la posture d'aujourd'hui aux côtés des décisions de janvier ; ce n'est pas une image de ce à quoi ressemblait la posture en janvier. Le rapport l'indique explicitement plutôt que de suggérer une reconstitution rétroactive qui n'existe pas.


4. Cadrer par machine (identifiants de client et/ou tags)

client_ids et tags restreignent les machines couvertes par les sections au périmètre d'actifs — l'union des deux, avec la même sémantique que le ciblage par tag de POST /install/jobs.

curl -s "http://localhost:8000/api/v1/compliance/nis2-report.pdf?tags=rhel9-prod,pci-scope" \
  -H "Authorization: Bearer $TOKEN" \
  -o nis2_compliance_report_pci-scope.pdf
curl -s "http://localhost:8000/api/v1/compliance/nis2-report.pdf?client_ids=3f2b1a90-...,7c8d9e10-..." \
  -H "Authorization: Bearer $TOKEN" \
  -o nis2_compliance_report_two-machines.pdf

Si client_ids et/ou tags sont fournis mais ne résolvent vers aucune machine, l'endpoint renvoie 422 plutôt que de générer silencieusement un rapport quasi vide. Pour un utilisateur dont l'accès machine est déjà restreint, le périmètre demandé est intersecté avec ce qu'il peut voir (jamais élargi) — si cette intersection est vide, c'est également 422, pas un rapport cadré sur rien.

Combinez librement le cadrage par période et par machine :

curl -s "http://localhost:8000/api/v1/compliance/nis2-report.pdf?period_start=2026-01-01&tags=rhel9-prod" \
  -H "Authorization: Bearer $TOKEN" \
  -o nis2_compliance_report_rhel9-prod_2026.pdf

5. Lire les blocs d'espace réservé [À VALIDER : …]

Le modèle de rapport (backend/templates/reports/nis2_report.html.j2) est versionné, pas modifiable depuis l'interface — un document de conformité a besoin d'une validation GRC avant tout changement de contenu, contrairement aux autres modèles d'e-mail personnalisables depuis l'interface de Repod.

Certaines sections d'un rapport NIS2 Article 21 requièrent un jugement réglementaire qui ne peut pas être dérivé des seules données de l'application — mesures organisationnelles, procédures de réponse aux incidents, évaluations des risques fournisseurs, et contenu narratif similaire sur lequel Repod n'a aucune visibilité. Plutôt que d'inventer un texte juridique plausible, ces sections s'affichent sous forme d'espace réservé explicite :

[À VALIDER : <description de ce dont cette section a besoin>]

Ce que cela signifie pour vous : toute section portant ce marqueur n'est pas terminée — c'est un manque étiqueté que votre équipe conformité/GRC doit combler avant que le document soit utilisé comme artefact d'audit officiel. N'enlevez pas le marqueur en écrivant quelque chose à sa place à la légère ; n'envoyez pas le PDF à un auditeur externe avec des blocs [À VALIDER : …] non résolus encore présents, puisqu'ils signalent « pas encore examiné », et non « non applicable ».

Tout le reste du rapport (métriques de posture CVE, chiffres de conformité SLA, historique des décisions) est dérivé directement et factuellement des propres données de Repod — aucune interprétation n'y est superposée.


Vérifier que ça a fonctionné

  1. Le téléchargement s'est terminé et le PDF s'ouvre sans erreur.
  2. La section en-tête/page de couverture affiche l'horodatage de génération correct et, si vous l'avez cadré, le périmètre d'actifs correct (tags/nombre de clients) et la période de décisions.
  3. Les chiffres de posture CVE correspondent à ce que renvoie GET /compliance/nis2-posture pour le même périmètre en ce moment :
    curl -s "http://localhost:8000/api/v1/compliance/nis2-posture" \
      -H "Authorization: Bearer $TOKEN" | jq .
    
  4. Si vous avez défini period_start/period_end, confirmez que la section d'historique des décisions ne liste que les décisions à l'intérieur de cette fenêtre — et confirmez que vous n'avez pas interprété la section de posture CVE comme provenant également de cette période.
  5. Recherchez « À VALIDER » dans le texte du PDF généré : notez chaque section encore signalée, et acheminez le document à votre relecteur conformité/GRC avant de le traiter comme un artefact d'audit fini et partageable.