ui(qualys/agents): wording diag prudent (constat/hypothese/proposition vers ticket support, pas affirmer)

This commit is contained in:
Pierre & Lumière 2026-04-28 01:27:42 +02:00
parent 67bd3a02d6
commit b6a602e848
2 changed files with 67 additions and 51 deletions

View File

@ -682,10 +682,12 @@ def _analyze_qualys_audit(r):
if disk_full:
suggestions.append({
"severity": "critical",
"title": "Partition /var/log saturée",
"fix": "Cause : disque 100% rempli, l'agent ne peut plus écrire ses logs et crashe.\n"
"Pistes possibles : cleanup logs anciens (.log.0/1/2 du crash loop), "
"extension du FS si LVM avec espace libre dans le VG (voir bloc LVM ci-dessous)."
"title": "Partition /var/log apparaît saturée",
"fix": "Constat : une partition est à 100% et/ou l'agent rapporte 'no space left'. "
"Hypothèse : pourrait empêcher l'agent d'écrire ses logs.\n"
"Proposition : ouvrir un ticket support pour vérifier l'état du disque "
"et envisager soit un cleanup des logs archivés, soit une extension du FS "
"(snapshot vCenter recommandé avant toute action)."
})
# Si LVM avec free dans VG -> note diagnostic
@ -695,16 +697,18 @@ def _analyze_qualys_audit(r):
free_gb = float(m_vg.group(3))
suggestions.append({
"severity": "high",
"title": f"LVM : extension FS possible (VG {vg_name} a {free_gb}G libres)",
"fix": f"Le VG {vg_name} dispose de {free_gb}G non alloués → extension du LV /var/log faisable. "
f"⚠ Snapshot vCenter de la VM obligatoire avant toute action de redimensionnement."
"title": f"LVM : extension FS potentiellement possible (VG {vg_name} ~{free_gb}G libres)",
"fix": f"Constat : le VG {vg_name} semble disposer de ~{free_gb}G non alloués. "
f"Proposition : ticket support pour validation et extension du LV /var/log si pertinent "
f"(snapshot vCenter à prévoir au préalable)."
})
if "cannot write file" in s_sys or "logger initialization failed" in s_sys:
suggestions.append({
"severity": "critical",
"title": "Agent ne peut pas écrire son log",
"fix": "Cause : permissions /var/log/qualys cassées, ou disque saturé. "
"L'agent fail-fast à l'init du logger."
"title": "L'agent semble ne pas pouvoir écrire son log",
"fix": "Constat : présence de 'Cannot write file' / 'Logger initialization failed' dans les logs. "
"Hypothèses possibles : disque saturé, permissions cassées sur /var/log/qualys. "
"Proposition : ticket support pour analyse."
})
# Crash loop
@ -712,10 +716,11 @@ def _analyze_qualys_audit(r):
if m and int(m.group(1)) > 50:
suggestions.append({
"severity": "high",
"title": f"Crash loop ({m.group(1)} restarts depuis la dernière stabilité)",
"fix": "Le service est en boucle de redémarrage permanente. "
"À stopper temporairement (sudo systemctl stop qualys-cloud-agent) "
"le temps que le problème racine soit traité — sinon il pollue les logs et stresse le système."
"title": f"Possible boucle de redémarrage (~{m.group(1)} restarts observés)",
"fix": "Constat : le compteur de restart systemd est élevé. "
"Hypothèse : crash loop persistant. "
"Proposition : ticket support pour analyse de la cause racine et arrêt temporaire du service "
"le temps de l'investigation (afin de limiter le bruit dans les logs)."
})
# Connectivité KO
@ -723,49 +728,54 @@ def _analyze_qualys_audit(r):
"could not resolve", "no route", "unreachable", "dns ko"]):
suggestions.append({
"severity": "high",
"title": "Connectivité Qualys cloud KO (flux direct bloqué)",
"fix": "L'agent doit joindre qagpublic.qg1.apps.qualys.eu:443 en direct (pas via proxy). "
"Le test échoue → flux 443 sortant probablement bloqué côté firewall périmétrique. "
"Comparer avec un serveur où l'agent fonctionne pour confirmer "
"que les mêmes règles de flux sont appliquées."
"title": "Connectivité Qualys cloud apparaît KO (flux direct)",
"fix": "Constat : le test direct vers qagpublic.qg1.apps.qualys.eu:443 ne répond pas. "
"Hypothèse : flux 443 sortant peut-être bloqué côté firewall périmétrique. "
"Proposition : ticket réseau pour vérifier les règles de flux applicables à ce serveur, "
"en comparaison avec un serveur où l'agent fonctionne."
})
if "certificate verify failed" in s_conn or ("ssl" in s_conn and "verify" in s_conn):
suggestions.append({
"severity": "high",
"title": "Erreur TLS/SSL",
"fix": "Cause possible : interception SSL par un proxy MITM, ou bundle CA système obsolète. "
"À investiguer avec l'équipe réseau/sécu."
"title": "Erreur TLS/SSL observée",
"fix": "Constat : la vérification du certificat semble échouer. "
"Hypothèses : interception SSL par un équipement intermédiaire, ou bundle CA système à mettre à jour. "
"Proposition : ticket support sécu/réseau pour analyse."
})
# Service désactivé / arrêté
if "masked" in s_status:
suggestions.append({
"severity": "medium",
"title": "Service masked",
"fix": "Le service Qualys a été explicitement masqué. À unmask + enable une fois la cause identifiée."
"title": "Service apparaît masked",
"fix": "Constat : le service systemd Qualys semble masqué. "
"Proposition : ticket support pour identifier la raison (manuel ? configuration ?) "
"et décider de l'action."
})
elif "disabled" in s_status:
suggestions.append({
"severity": "medium",
"title": "Service disabled au boot",
"fix": "Le service ne démarrera pas au prochain reboot. "
"Soit voulu (serveur en décom), soit oubli post-intervention — à clarifier."
"title": "Service apparaît disabled au boot",
"fix": "Constat : le service ne démarrera pas automatiquement au prochain reboot. "
"Hypothèses : volontaire (serveur en décom) ou oubli post-intervention. "
"Proposition : ticket support pour clarifier."
})
elif any(k in s_status for k in ["inactive (dead)", "stopped", "not running"]) \
and "active" not in s_status:
suggestions.append({
"severity": "medium",
"title": "Service arrêté",
"fix": "L'agent n'est plus en cours d'exécution. Voir les logs ci-dessous pour la cause de l'arrêt."
"title": "Service apparaît arrêté",
"fix": "Constat : l'agent ne semble plus en cours d'exécution. "
"Proposition : ticket support pour identifier la cause de l'arrêt (voir logs ci-dessous)."
})
# Agent obsolète
if re.match(r"^qualys-cloud-agent-([0-5]\.|6\.[01]\.)", s_ver):
suggestions.append({
"severity": "low",
"title": f"Agent obsolète ({s_ver.strip()})",
"fix": "Version ancienne, plus supportée par Qualys. "
"À planifier en upgrade vers 7.x dans le cadre des MAJ de l'agent."
"title": f"Version agent ancienne détectée ({s_ver.strip()})",
"fix": "Constat : version antérieure à 7.x, potentiellement plus supportée. "
"Proposition : à inclure dans le plan de MAJ des agents Qualys."
})
# Logrotate Qualys mal configuré
@ -774,15 +784,18 @@ def _analyze_qualys_audit(r):
not re.search(r"^\s*compress\s*$", s_lrt, re.MULTILINE)):
suggestions.append({
"severity": "medium",
"title": "Logrotate Qualys : compression désactivée",
"fix": "Sans compression, les logs archivés occupent 5-10× plus de place — "
"contribution potentielle à la saturation de /var/log."
"title": "Logrotate Qualys : compression semble désactivée",
"fix": "Constat : la directive 'compress' n'apparaît pas active. "
"Hypothèse : les logs archivés peuvent occuper 5-10× plus de place sans compression. "
"Proposition : ticket support pour vérifier la configuration logrotate."
})
if "rotate" not in s_lrt:
suggestions.append({
"severity": "low",
"title": "Logrotate Qualys : pas de directive rotate",
"fix": "Pas de politique de rétention définie → les logs s'accumulent indéfiniment."
"title": "Logrotate Qualys : directive rotate absente",
"fix": "Constat : pas de politique de rétention détectée. "
"Hypothèse : les logs pourraient s'accumuler indéfiniment. "
"Proposition : ticket support pour ajout d'une politique adaptée."
})
# Core dump + package absent = installation incomplète / corrompue
@ -790,19 +803,20 @@ def _analyze_qualys_audit(r):
("introuvable" in s_ver.lower() or s_ver.lower().startswith("version introuvable")):
suggestions.append({
"severity": "critical",
"title": "Installation Qualys cassée (core dump + package absent du RPM)",
"fix": "Le service systemd existe mais le binaire est manquant ou corrompu — "
"core dump systématique au démarrage. Désinstallation incomplète probable. "
"Nécessite cleanup complet (service unit + fichiers) puis réinstallation "
"via le RPM SANEF (/root/QualysCloudAgent.rpm) avec ré-activation."
"title": "Possible installation Qualys cassée (core dump + package non détecté)",
"fix": "Constat : service systemd actif mais aucun package qualys-cloud-agent dans la base RPM, "
"et core dumps répétés. "
"Hypothèse : désinstallation incomplète ou installation corrompue. "
"Proposition : ticket support pour cleanup complet et réinstallation via RPM SANEF "
"(/root/QualysCloudAgent.rpm) avec ré-activation."
})
elif "core-dump" in s_sys or "core dumped" in s_sys:
suggestions.append({
"severity": "high",
"title": "Agent Qualys core dumps en boucle",
"fix": "Le binaire crashe au démarrage (signal SIGABRT). "
"Cause possible : lib système cassée (ldd manquant), bug version agent vs OS, "
"ou conflit avec autre package."
"title": "Core dumps observés sur l'agent",
"fix": "Constat : le binaire semble crasher au démarrage (signal SIGABRT). "
"Hypothèses : lib système cassée, incompatibilité version agent vs OS, conflit. "
"Proposition : ticket support pour analyse approfondie."
})
# OS EOL (RHEL 5/6)
@ -810,9 +824,10 @@ def _analyze_qualys_audit(r):
if "release 5" in s_os or "release 6" in s_os:
suggestions.append({
"severity": "low",
"title": "OS en fin de vie",
"fix": "RHEL 5/6 EOL — l'agent Qualys 7.x n'est plus supporté sur ces versions. "
"À traiter dans le plan de migration / décom du serveur."
"title": "OS détecté en fin de vie",
"fix": "Constat : RHEL 5/6 EOL. "
"Hypothèse : l'agent Qualys 7.x peut ne pas être supporté sur cette version. "
"Proposition : à intégrer au plan de migration/décom du serveur."
})
return suggestions

View File

@ -88,8 +88,9 @@
</div>
<div class="mt-3 pt-3" style="border-top:1px solid #1f2937">
<p class="text-xs text-gray-400">
<span class="text-cyber-accent font-bold">→ Action :</span>
ouvrir un ticket support avec ces éléments de diagnostic + l'export complet de cette page (capture/PDF) pour traçabilité.
<span class="text-cyber-accent font-bold">→ Proposition :</span>
ces constats sont basés sur les sorties d'audit, à valider en contexte. Ouvrir un ticket support
avec une capture/PDF de cette page pour analyse et action côté équipe en charge.
</p>
</div>
</div>