feat(audit): publish structured HardeningKitty JSON
This commit is contained in:
1 parent
349b95fbc6
commit
f60d102233
7 files changed
+1033
-116
No files matched your search
@@ -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
|
||||
|
||||
|
||||
Reference in new issue
Block a user