Files
comi-audit-secu/console-templates/host_audit_hardeningkitty_hardeningkitty.html
T

164 lines
9.8 KiB
HTML

<!--
Comitari - Audit de durcissement Windows / HardeningKitty
WAPT: section=hardeningkitty, key=hardeningkitty
WAPT audit rendering context: audit JSON is under value; host metadata is at root.
No JavaScript, external stylesheets or external resources.
-->
<style>
.comi-hk { color:#23364f; background:#fff; font-family:Arial,Helvetica,sans-serif; font-size:13px; line-height:1.48; max-width:100%; padding:22px 22px 26px; box-sizing:border-box; }
.comi-hk * { box-sizing:border-box; }
.comi-hk h1,.comi-hk h2,.comi-hk h3,.comi-hk p { margin:0; }
.comi-hk .eyebrow { color:#3d6490; font-size:10px; font-weight:700; letter-spacing:0.065em; text-transform:uppercase; }
.comi-hk h1 { color:#173354; font-size:23px; line-height:1.22; margin:3px 0 4px; }
.comi-hk .sub { color:#5b708b; font-size:12px; }
.comi-hk h2 { color:#193656; font-size:16px; margin:0 0 12px; }
.comi-hk header { padding-bottom:16px; border-bottom:1px solid #e4ebf3; }
.comi-hk .meta { color:#5c7088; padding:11px 0 15px; font-size:11px; }
.comi-hk .meta span { margin-right:12px; display:inline-block; padding-bottom:3px; }
.comi-hk .meta strong { color:#2d4667; }
.comi-hk .section { margin-top:22px; }
.comi-hk .cards { display:flex; flex-wrap:wrap; gap:10px; }
.comi-hk .card { flex:1 1 124px; min-width:108px; border:1px solid #e2eaf3; background:#f8fbfe; border-radius:8px; padding:12px 13px; }
.comi-hk .card .label { font-size:11px; color:#637a94; line-height:1.3; }
.comi-hk .card .num { font-size:26px; font-weight:700; line-height:1.2; color:#193656; margin-top:5px; }
.comi-hk .card.bad .num { color:#b63838; }
.comi-hk .card.good .num { color:#287c60; }
.comi-hk .card.medium .num { color:#b86a27; }
.comi-hk .progress { height:10px; background:#e9eff6; border-radius:20px; overflow:hidden; margin-top:12px; }
.comi-hk .progress-fill { background:#2d8b75; height:10px; border-radius:20px; }
.comi-hk .progress-legend { display:flex; justify-content:space-between; gap:12px; color:#60738e; font-size:11px; margin-top:5px; }
.comi-hk .callout { background:#f2f6fc; border-left:3px solid #3c719d; border-radius:4px; padding:10px 12px; color:#435d78; font-size:12px; margin-top:12px; }
.comi-hk .callout-warn { background:#fff8ed; border-left-color:#d18a30; color:#684e2c; }
.comi-hk .table-wrap { max-width:100%; overflow-x:auto; border:1px solid #e3eaf2; border-radius:7px; }
.comi-hk table { border-collapse:collapse; width:100%; font-size:12px; }
.comi-hk thead th { background:#f2f6fb; border-bottom:1px solid #dfe7f1; padding:9px 10px; text-align:left; font-size:11px; font-weight:700; color:#3d5473; }
.comi-hk tbody td { border-bottom:1px solid #edf1f6; padding:9px 10px; vertical-align:top; }
.comi-hk tbody tr:last-child td { border-bottom:0; }
.comi-hk tbody tr:nth-child(even) { background:#fbfcfe; }
.comi-hk .n { text-align:right; white-space:nowrap; }
.comi-hk .name { font-weight:600; color:#203a5a; }
.comi-hk .muted { color:#75869a; font-size:11px; margin-top:4px; overflow-wrap:anywhere; }
.comi-hk .small { color:#5b708a; font-size:11px; margin-top:4px; overflow-wrap:anywhere; }
.comi-hk .id { font-family:Consolas,"Courier New",monospace; color:#60718b; font-size:11px; white-space:nowrap; }
.comi-hk .pill { display:inline-block; padding:3px 7px; font-size:11px; font-weight:700; border-radius:99px; background:#edf2f7; color:#49617d; white-space:nowrap; }
.comi-hk .pill.severity-high { background:#fde8e8; color:#aa2424; }
.comi-hk .pill.severity-medium { background:#fff1df; color:#985c20; }
.comi-hk .pill.severity-low { background:#eaf2ff; color:#3b6ca9; }
.comi-hk .pill.status-failed { background:#fee9e8; color:#b12f2a; }
.comi-hk .pill.status-passed { background:#e0f5ec; color:#207956; }
.comi-hk .pill.status-ignored,.comi-hk .pill.status-skipped,.comi-hk .pill.status-not_applicable { background:#eff2f5; color:#687988; }
.comi-hk .note { color:#657c93; font-size:11px; margin:10px 0; }
.comi-hk footer { color:#647b96; font-size:11px; margin-top:24px; border-top:1px solid #e5ebf2; padding-top:12px; }
.comi-hk .mono { font-family:Consolas,"Courier New",monospace; overflow-wrap:anywhere; }
.comi-hk .notfound { border:1px solid #e9d09e; background:#fff9ef; border-radius:6px; padding:16px; margin-top:20px; color:#805822; }
</style>
<div class="comi-hk">
<header>
<p class="eyebrow">COMITARI / HARDENINGKITTY</p>
<h1>Audit de durcissement Windows</h1>
<p class="sub">Analyse des écarts par rapport au référentiel de sécurité</p>
</header>
{{#value.summary}}
<div class="meta">
<span><strong>Poste :</strong> {{computer_fqdn}}</span>
<span><strong>Système :</strong> {{value.host.os_caption}} {{value.host.display_version}} (build {{value.host.build}})</span>
<span><strong>Exécuté le :</strong> {{value.scan.date_utc}}</span>
<span><strong>Source :</strong> {{value.scan.source}}</span>
<span><strong>Statut :</strong> {{value.status}}</span>
</div>
<section class="section">
<h2>Vue d'ensemble</h2>
<div class="cards">
<div class="card"><div class="label">Contrôles vérifiés</div><div class="num">{{checked}}</div></div>
<div class="card good"><div class="label">Conformes</div><div class="num">{{passed}}</div></div>
<div class="card bad"><div class="label">Non conformes</div><div class="num">{{failed}}</div></div>
<div class="card"><div class="label">Conformité</div><div class="num">{{compliant_percent}} %</div></div>
<div class="card bad"><div class="label">Criticité élevée</div><div class="num">{{high}}</div></div>
<div class="card medium"><div class="label">Criticité moyenne</div><div class="num">{{medium}}</div></div>
<div class="card"><div class="label">Criticité faible</div><div class="num">{{low}}</div></div>
</div>
<div class="progress"><div class="progress-fill" style="width:{{compliant_percent}}%;"></div></div>
<div class="progress-legend"><span>Score de conformité observé</span><span>{{passed}} / {{checked}} contrôles conformes</span></div>
<div class="callout callout-warn">Ce rapport est informatif : aucune correction automatique n'a été appliquée. Les écarts sont évalués par rapport au profil sélectionné, pas nécessairement contre une configuration adaptée à tous les environnements.</div>
</section>
{{/value.summary}}
{{#value.error}}
<div class="notfound"><strong>Audit en erreur : {{code}}</strong><br>{{description}}<span class="small">Type technique : {{type}}</span></div>
{{/value.error}}
{{^value.summary}}
{{^value.error}}
<div class="notfound"><strong>Données d'audit absentes.</strong> La valeur reçue ne contient ni synthèse ni erreur structurée.</div>
{{/value.error}}
{{/value.summary}}
{{#value.categories}}
<section class="section">
<h2>Répartition par domaine</h2>
<div class="table-wrap">
<table>
<thead><tr><th>Domaine</th><th class="n">Contrôles</th><th class="n">Conformes</th><th class="n">Élevée</th><th class="n">Moyenne</th><th class="n">Faible</th><th class="n">Conformité</th></tr></thead>
<tbody>
{{#Items value.categories}}
<tr>
<td class="name">{{key}}</td>
<td class="n">{{value.expected}}</td>
<td class="n">{{value.passed}}</td>
<td class="n">{{value.high}}</td>
<td class="n">{{value.medium}}</td>
<td class="n">{{value.low}}</td>
<td class="n">{{value.compliant_percent}} %</td>
</tr>
{{/Items}}
</tbody>
</table>
</div>
</section>
{{/value.categories}}
{{#value.controls}}
<section class="section">
<h2>Détail des contrôles ({{ Count value.controls }})</h2>
<p class="note">Les contrôles sont classés par identifiant HardeningKitty. Les valeurs observées ne sont affichées que lorsque leur publication est activée dans audit_config.json.</p>
<div class="table-wrap">
<table>
<thead><tr><th>ID</th><th style="min-width:260px">Contrôle et diagnostic</th><th>Criticité</th><th>État</th><th>Valeur cible</th>{{#value.privacy.current_values_published}}<th>Valeur observée</th>{{/value.privacy.current_values_published}}</tr></thead>
<tbody>
{{#Items value.controls}}
<tr>
<td class="id">{{value.id}}</td>
<td>
<div class="name">{{value.name}}</div>
<div class="muted">{{value.category}} &bull; {{value.method}}</div>
{{#value.explanation}}<div class="small">{{value.explanation}}</div>{{/value.explanation}}
{{#value.registry_path}}<div class="muted">Registre : <span class="mono">{{value.registry_path}} {{value.registry_item}}</span></div>{{/value.registry_path}}
{{#value.method_argument}}<div class="muted">Paramètre : <span class="mono">{{value.method_argument}}</span></div>{{/value.method_argument}}
</td>
<td><span class="pill severity-{{value.severity}}">{{value.severity_label}}</span></td>
<td><span class="pill status-{{value.status}}">{{value.status_label}}</span></td>
<td class="mono">{{value.recommended}}</td>
{{#value.privacy.current_values_published}}<td class="mono">{{value.current}}</td>{{/value.privacy.current_values_published}}
</tr>
{{/Items}}
</tbody>
</table>
</div>
</section>
{{/value.controls}}
{{#value.summary}}
{{^value.controls}}
<p class="notfound">Aucun contrôle HardeningKitty disponible dans le contexte de rendu.</p>
{{/value.controls}}
{{/value.summary}}
<footer>
HardeningKitty / Comitari &middot; Synthèse informative uniquement, aucune correction automatique
&middot; Référentiel : <strong>{{value.benchmark.name}}</strong>
&middot; Profil : <strong>{{value.scan.profile}}</strong>
</footer>
</div>