From 7f8c2c710b109d205517a997395d1c724a923cc8 Mon Sep 17 00:00:00 2001 From: Admin MPCZ Date: Tue, 28 Apr 2026 01:23:56 +0200 Subject: [PATCH] ui(qualys/agents): renomme 'Suggestions' en 'Diagnostic' + reformulation orientee constat (pas de cmds shell, oriente vers ticket support) --- app/services/realtime_audit_service.py | 117 +++++++++---------------- app/templates/qualys_agent_audit.html | 10 ++- 2 files changed, 49 insertions(+), 78 deletions(-) diff --git a/app/services/realtime_audit_service.py b/app/services/realtime_audit_service.py index fbe91a6..a397249 100644 --- a/app/services/realtime_audit_service.py +++ b/app/services/realtime_audit_service.py @@ -677,49 +677,34 @@ def _analyze_qualys_audit(r): s_lvm = (r.get("lvm_info") or "") s_lrt = (r.get("logrotate_config") or "").lower() - # Disque saturé / agent ne peut écrire — multi-suggestions selon contexte + # Disque saturé / agent ne peut écrire disk_full = " 100%" in s_disk or "no space left" in (s_log + s_sys) if disk_full: - # 1. Cleanup des vieux logs (action sûre, à proposer en premier) suggestions.append({ "severity": "critical", - "title": "Partition /var/log saturée — cleanup vieux logs (action sûre)", - "fix": "Libérer l'espace en supprimant les .log archivés du crash loop :\n" - "sudo find /var/log/qualys -name '*.log.[0-9]*' -mtime +7 -delete\n" - "sudo find /var/log -name 'messages-*' -mtime +30 -delete\n" - "sudo journalctl --vacuum-size=200M\n" - "Puis : sudo systemctl restart qualys-cloud-agent" + "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)." }) - # 2. Si LVM avec free dans VG -> extend FS - # Cherche pattern : "vg_name size free" où free > 0 + # Si LVM avec free dans VG -> note diagnostic m_vg = re.search(r"(\S+)\s+([\d.]+)g\s+([\d.]+)g", s_lvm.lower()) if m_vg and float(m_vg.group(3)) > 0.5: vg_name = m_vg.group(1) free_gb = float(m_vg.group(3)) - # Trouver le LV /var/log - m_lv = re.search(r"(varloglv|var_log|log)\s+(\S+)\s+([\d.]+)g", s_lvm.lower()) - lv_name = m_lv.group(1) if m_lv else "varloglv" - extend_size = min(2.0, free_gb) # +2G max ou tout ce qui reste suggestions.append({ "severity": "high", - "title": f"LVM : VG {vg_name} a {free_gb}G libres — étendre /var/log", - "fix": f"⚠ SNAPSHOT vCenter de la VM AVANT TOUTE ACTION (rollback en cas de souci)\n\n" - f"1. Extension du LV :\n" - f"sudo lvextend -L +{extend_size}G /dev/{vg_name}/{lv_name}\n\n" - f"2. Grow du FS (selon type — voir bloc LVM ci-dessous) :\n" - f"sudo xfs_growfs /var/log # si XFS\n" - f"sudo resize2fs /dev/{vg_name}/{lv_name} # si ext4\n\n" - f"3. Vérif :\n" - f"df -h /var/log\n" - f"sudo systemctl restart qualys-cloud-agent" + "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." }) 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": "Vérifier permissions /var/log/qualys (drwxrwx--- root:root) ET espace dispo. " - "Si /var/log saturé : libérer l'espace puis restart agent." + "fix": "Cause : permissions /var/log/qualys cassées, ou disque saturé. " + "L'agent fail-fast à l'init du logger." }) # Crash loop @@ -727,11 +712,10 @@ 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)", - "fix": "Stopper l'agent pour éviter d'amplifier le problème :\n" - "sudo systemctl stop qualys-cloud-agent\n" - "Corriger la cause racine (voir suggestions ci-dessus), puis :\n" - "sudo systemctl reset-failed qualys-cloud-agent && sudo systemctl start qualys-cloud-agent" + "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." }) # Connectivité KO @@ -740,21 +724,17 @@ def _analyze_qualys_audit(r): suggestions.append({ "severity": "high", "title": "Connectivité Qualys cloud KO (flux direct bloqué)", - "fix": "L'agent Qualys SANEF se connecte EN DIRECT (pas via proxy) à " - "qagpublic.qg1.apps.qualys.eu:443 (pod EU1). Si la connexion échoue :\n\n" - "1. Vérifier route directe sortante 443/TCP depuis ce serveur vers cet endpoint.\n" - "2. Test depuis le serveur :\n" - " curl -v --connect-timeout 5 https://qagpublic.qg1.apps.qualys.eu/\n" - "3. Comparer avec un serveur où l'agent fonctionne (mêmes flux ouverts ?).\n" - "4. Si bloqué côté infra : ouvrir ticket réseau pour ouvrir 443/TCP " - "vers *.apps.qualys.eu (ou IP 64.39.x.x range Qualys EU)." + "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." }) - 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({ "severity": "high", "title": "Erreur TLS/SSL", - "fix": "Possible interception SSL (proxy MITM) ou bundle CA obsolète. " - "Vérifier proxy d'entreprise et chaîne de certificats du serveur." + "fix": "Cause possible : interception SSL par un proxy MITM, ou bundle CA système obsolète. " + "À investiguer avec l'équipe réseau/sécu." }) # Service désactivé / arrêté @@ -762,31 +742,30 @@ def _analyze_qualys_audit(r): suggestions.append({ "severity": "medium", "title": "Service masked", - "fix": "sudo systemctl unmask qualys-cloud-agent && sudo systemctl enable --now qualys-cloud-agent" + "fix": "Le service Qualys a été explicitement masqué. À unmask + enable une fois la cause identifiée." }) elif "disabled" in s_status: suggestions.append({ "severity": "medium", "title": "Service disabled au boot", - "fix": "sudo systemctl enable --now qualys-cloud-agent" + "fix": "Le service ne démarrera pas au prochain reboot. " + "Soit voulu (serveur en décom), soit oubli post-intervention — à 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": "sudo systemctl start qualys-cloud-agent\n" - "Si crash immédiat, consulter les logs ci-dessous pour la cause." + "fix": "L'agent n'est plus en cours d'exécution. Voir les logs ci-dessous pour la cause de l'arrêt." }) # Agent obsolète if re.match(r"^qualys-cloud-agent-([0-5]\.|6\.[01]\.)", s_ver): suggestions.append({ "severity": "low", - "title": "Agent obsolète", - "fix": f"Version installée: {s_ver.strip()}. Mettre à jour vers la dernière version " - f"stable (7.x) — Activation Key et package depuis console Qualys " - f"(https://qualysguard.qualys.eu)." + "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." }) # Logrotate Qualys mal configuré @@ -796,18 +775,14 @@ def _analyze_qualys_audit(r): suggestions.append({ "severity": "medium", "title": "Logrotate Qualys : compression désactivée", - "fix": "Logrotate sans compression = vieux logs prennent 5-10x plus de place. " - "Editer /etc/logrotate.d/qualys-cloud-agent et ajouter (ou décommenter) :\n" - "compress\ndelaycompress\nrotate 7\n" - "Puis : sudo logrotate -f /etc/logrotate.d/qualys-cloud-agent" + "fix": "Sans compression, les logs archivés occupent 5-10× plus de place — " + "contribution potentielle à la saturation de /var/log." }) if "rotate" not in s_lrt: suggestions.append({ "severity": "low", "title": "Logrotate Qualys : pas de directive rotate", - "fix": "Ajouter une politique de rétention dans /etc/logrotate.d/qualys-cloud-agent :\n" - "rotate 7 # 7 fichiers archives max\n" - "size 100M # rotation auto a 100M" + "fix": "Pas de politique de rétention définie → les logs s'accumulent indéfiniment." }) # Core dump + package absent = installation incomplète / corrompue @@ -816,28 +791,18 @@ def _analyze_qualys_audit(r): 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 en boucle. Désinstaller proprement puis réinstaller :\n\n" - "1. Cleanup :\n" - "sudo systemctl stop qualys-cloud-agent\n" - "sudo systemctl disable qualys-cloud-agent\n" - "sudo rpm -e qualys-cloud-agent 2>/dev/null # si package partiel\n" - "sudo rm -rf /usr/local/qualys /var/log/qualys /etc/qualys\n" - "sudo rm -f /usr/lib/systemd/system/qualys-cloud-agent.service\n" - "sudo systemctl daemon-reload && sudo systemctl reset-failed\n\n" - "2. Réinstall (procédure SANEF) :\n" - "sudo rpm -ivh /root/QualysCloudAgent.rpm\n\n" - "3. Activation (script Qualys avec ActivationId + CustomerId depuis console qualysguard.qg2.apps.qualys.eu)." + "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." }) elif "core-dump" in s_sys or "core dumped" in s_sys: suggestions.append({ "severity": "high", "title": "Agent Qualys core dumps en boucle", - "fix": "Vérifier dépendances binaire :\n" - "ldd /usr/local/qualys/cloud-agent/bin/qualys-cloud-agent\n" - "Voir le coredump pour la cause :\n" - "sudo coredumpctl info qualys-cloud-agent | head -50\n" - "Si lib cassée → réinstaller agent. Si bug Qualys → ouvrir ticket support." + "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." }) # OS EOL (RHEL 5/6) @@ -846,8 +811,8 @@ def _analyze_qualys_audit(r): suggestions.append({ "severity": "low", "title": "OS en fin de vie", - "fix": "RHEL 5/6 EOL — agent Qualys 7.x non supporté. Migrer vers RHEL 8/9 " - "ou conserver l'agent legacy en attendant la décom du serveur." + "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." }) return suggestions diff --git a/app/templates/qualys_agent_audit.html b/app/templates/qualys_agent_audit.html index 0905eec..6a224c2 100644 --- a/app/templates/qualys_agent_audit.html +++ b/app/templates/qualys_agent_audit.html @@ -61,9 +61,9 @@ {% if audit.status == 'OK' %} {% if audit.suggestions %} - +
-

💡 Suggestions de résolution ({{ audit.suggestions|length }})

+

🔍 Diagnostic ({{ audit.suggestions|length }} problème(s) détecté(s))

{% for s in audit.suggestions %}
@@ -75,6 +75,12 @@
{% endfor %}
+
+

+ → Action : + ouvrir un ticket support avec ces éléments de diagnostic + l'export complet de cette page (capture/PDF) pour traçabilité. +

+
{% endif %}