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