feat(audit): publish structured HardeningKitty JSON

This commit is contained in:
PierreCsn committed 2026-10-29 09:03:53 +01:00
1 parent 349b95fbc6
commit f60d102233
7 files changed
+1033 -116

No files matched your search

+79 -30
View File
@@ -14,7 +14,8 @@ intégrés au paquet signé avant l’installation.
## Compatibilité et sélection du benchmark
`WAPT/control` exige WAPT 2.4 ou ultérieur. Le code Python évite les syntaxes
`WAPT/control` exige un agent WAPT 2.6 ou ultérieur pour le schéma d'audit
structuré. Le code Python évite les syntaxes
postérieures à Python 3.8; les tests locaux ont été exécutés avec Python 3.9.
La compatibilité réelle doit être confirmée avec l’agent et la console WAPT de
l’environnement cible.
@@ -175,39 +176,87 @@ de publication WAPT provoque elle-même un `ERROR`.
## Données et Reporting WAPT
Le paquet utilise les API d’audit documentées pour WAPT 2.4+ :
`WAPT.write_audit_data_if_changed(section, key, value, ..., max_count=5,
keep_days=120)` pour les mesures stables, et `WAPT.write_audit_data()` pour
l’observation horodatée `last_run_utc`. Une erreur d’écriture ne reste pas
silencieusement cachée : l’audit retourne `ERROR` et tente de publier ce statut.
## Données et Reporting WAPT
Dans la section `HardeningKitty`, les clés publiées comprennent :
Chaque audit publie un unique objet Python sérialisable en JSON avec
`WAPT.write_audit_data_if_changed('hardeningkitty', 'hardeningkitty', document,
max_count=2, keep_days=120)`. Il n’y a plus de métriques WAPT dispersées ni de
clés `findings_00` à `findings_15`. Le document change uniquement si son contenu
change; sa date d’audit fait partie du document, afin de conserver un historique
des audits ayant réellement produit un nouvel état. L’[API de données d’audit
WAPT 2.6](https://www.wapt.fr/fr/doc-2.6/wapt-create-packages-code.html)
accepte un paramètre `value` générique; le round-trip natif d’un dictionnaire a
également été contrôlé dans le code local WAPT 2.7. La documentation des
[templates Mustache Console](https://www.wapt.fr/fr/doc-2.7/wapt-console-usage-advanced-audit-data-plugin.html)
est celle de WAPT 2.7; le rendu Console doit être qualifié avant diffusion,
notamment si la Console cible reste en version 2.6.
- `status`, `benchmark`, `os_caption`, `os_build`, `display_version`, `source`,
`upstream_commit`, `last_run_utc`, `last_error` ;
- `expected`, `executed`, `passed`, `high`, `medium`, `low`, `ignored`,
`not_applicable`, `excluded`, `unknown`, `skipped`, `total` et
`compliant_percent` ;
- `findings_00` à `findings_15`, des fragments JSON stables avec ID, catégorie,
nom, sévérité du contrôle et résultat. Les valeurs actuelles/recommandées ne
sont pas dupliquées dans ces fragments lorsque `publish_current_values` est faux.
Les données sont limitées à 2 MiB avant publication. Si le jeu complet dépasse
la limite, l’audit échoue explicitement et publie un document `ERROR`; aucun
contrôle n’est tronqué. Les valeurs constatées restent exclues sauf opt-in
`publish_current_values: true`. Les recommandations viennent du benchmark et
peuvent être publiées. Chemins, arguments et descriptions ne sont inclus que
lorsqu’ils sont présents dans les données de référence. Le rapport CSV détaillé
reste local, sous les ACL de ProgramData. WAPT conserve au plus deux valeurs
différentes par clé et 120 jours; huit exécutions locales sont gardées par
défaut.
Les valeurs actuelles et recommandations issues du poste ne sont pas envoyées
par défaut (`publish_current_values: false`). Les écarts détaillés restent dans
le CSV local, protégé par ACL; les journaux locaux peuvent inclure les erreurs
techniques. Huit exécutions locales sont conservées par défaut. WAPT limite les
mesures stables à cinq changements pendant 120 jours, les fragments à trois
changements pendant 120 jours, et les horodatages à cinq observations pendant
120 jours. Ces valeurs suivent les paramètres documentés des API d’audit WAPT.
La mesure synthétique exécutée avec 500 contrôles donne 264 171 octets pour
le document structuré sans valeurs constatées et 335 670 octets avec l'opt-in
des valeurs. Le document structuré est plus riche qu'un CSV brut et n'est donc
pas présenté comme systématiquement plus petit. La rationalisation porte sur
une seule clé, l'absence de répétition du snapshot par métrique/fragment et
l'historisation uniquement lorsque le document change. Les contrôles détaillés
restent la source canonique; l'aperçu prioritaire ne répète que leurs ID,
catégorie, statut et sévérité. Les tailles sont celles
de sérialisation Python; elles n'incluent pas l'overhead PostgreSQL/WAPT.
La suite mesure aussi la taille série des écarts sur des CSV synthétiques. Pour
10/100/500 lignes d’écart, le CSV brut local faisait 3 562/35 062/175 462
octets; les fragments JSON WAPT par défaut faisaient 1 125/11 106/55 906
octets. Le mode qui ajoute les valeurs et recommandations synthétiques faisait
4 305/42 906/214 906 octets. Ce sont des tailles de sérialisation, sans
surcoût PostgreSQL/WAPT, et non une mesure sur un parc réel. Les métriques de
résumé et les détails restent séparés; les valeurs de contrôle ne sont pas
copiées dans Reporting par défaut.
Exemple anonymisé (forme abrégée; le paquet publie tous les contrôles, sans
tronquer le JSON) :
```json
{
"schema_version": 2,
"status": "WARNING",
"compliance": "non_compliant",
"scan": {
"date_utc": "2026-10-29T10:00:00+00:00",
"engine": "HardeningKitty",
"engine_commit": "acf9ecee3d044a9337df7aad80e730cbd746e8de",
"profile": "auto",
"source": "GPO"
},
"host": {"os_caption": "Windows 11", "build": "26100", "display_version": "24H2"},
"benchmark": {"name": "finding_list_example_machine.csv"},
"summary": {"expected": 407, "executed": 407, "passed": 390, "high": 2,
"medium": 10, "low": 5, "unknown": 0, "skipped": 0,
"compliant_percent": 95.82},
"categories": {"System": {"expected": 40, "passed": 38, "high": 1,
"medium": 1, "low": 0, "compliant_percent": 95.0}},
"controls": {"101": {"id": "101", "category": "System", "name": "Example",
"status": "failed", "severity": "high",
"recommended": "1"}}
}
```
La vue Console facultative se trouve dans
`console-templates/host_audit_hardeningkitty_hardeningkitty.html`. Elle est
destinée au poste **WAPT Console uniquement**, pas au paquet agent. L’installer
dans le répertoire de templates de la Console sous ce nom exact, puis choisir
la clé d’audit `hardeningkitty / hardeningkitty`. Elle exploite le helper
Mustache WAPT `Items` pour parcourir les dictionnaires de catégories et de
contrôles. Les valeurs variables utilisent les tags échappés `{{...}}`; aucun
JavaScript ni triple-brace non échappé n’est utilisé. Le template est une vue
de synthèse et d’analyse, pas une preuve de conformité indépendante. Sa syntaxe
a été contrôlée statiquement, mais son rendu dans une Console réelle doit être
validé avant diffusion.
Les anciennes clés fragmentées restent éventuellement visibles dans
l’historique antérieur à cette version; elles ne sont plus émises par le code
actuel. Les requêtes Reporting doivent lire la dernière valeur de
`value_section='hardeningkitty'` et `value_key='hardeningkitty'`, puis naviguer
dans le JSON (`summary`, `categories`, `controls`, `priority_findings`). Le
format et la limite de 2 MiB doivent être pris en compte par les consommateurs.
## Configuration