Commit Graph

111 Commits

Author SHA1 Message Date
03229d4d08 feat(qualys/agents): bouton Check + page audit cible Qualys agent (status + version + logs agent/systeme via SSH) 2026-04-27 23:09:05 +02:00
dc9c197274 fix(qualys/dashboard): timeout 120s->300s + log erreurs sur _fetch_asset_ids_by_tag (manque ENV-PRD/REC sur gros tags) 2026-04-27 23:00:58 +02:00
5ec5271232 perf(qualys/dashboard): parallelise fetch vulns par batch IPs (8 workers, ~18min -> ~3min) 2026-04-27 17:15:44 +02:00
0d4ce6dfc2 feat(qualys/duplicates): scan filtre Linux+Windows Server uniquement (~1200 vs 6244) 2026-04-25 19:56:23 +00:00
6c52d05393 fix(qualys/duplicates): renomme cle items -> groups (conflit Jinja avec dict.items) 2026-04-25 10:49:53 +00:00
e832381b68 feat(qualys/duplicates): filtre serveurs uniquement (exclut Win 10/11/7/8/XP postes) 2026-04-25 10:23:14 +00:00
3d043af194 feat(qualys): page doublons + suppression API Qualys 1-clic 2026-04-25 10:17:40 +00:00
8f406f211d feat(qualys/dashboard): compute v2 - interroge API Qualys par tag (DB locale qualys_asset_tags souvent obsolete) 2026-04-25 00:42:29 +00:00
0ab4f2d8fa fix(qualys/dashboard): vire flag in-memory + safety net thread + flex layout 6 KPI 2026-04-25 00:13:22 +00:00
9a7f446637 fix(qualys/dashboard): insert pending row dans la route avant spawn thread (no race) 2026-04-25 00:07:22 +00:00
8f8e8c4d8f feat(qualys): dashboard vulnerabilites avec KPI + historique 2026-04-24 23:49:46 +00:00
c258d6091a fix(qualys): resync_all_tags HTTP 400 - limitResults 10000 trop grand, capper a 1000
Qualys QPS API rejette limitResults au-dela de 1000 (HTTP 400 Bad Request).
Aligne sur les autres requetes du service (5, 20, 100, 200, 1000) et sur
qualys_tags_service.list_qualys_tags qui utilise deja 1000.

Reproductible via /qualys/tags > bouton Resync (msg=resync_ko_HTTP+400).
2026-04-23 12:19:31 +00:00
9a72fa7eb7 Optim: fix N+1 queries itop_service (pre-load batch) + macros Jinja2 badges 2026-04-17 23:23:32 +00:00
a0f90cd719 Optim: logging structure + query_helpers.py + fix exceptions silencieuses routers 2026-04-17 23:19:18 +00:00
MOUTAOUAKIL-ext Khalid
e2fb34f115 Sync SANEF : audit_service + schema.sql + data deploy + gitignore 2026-04-17 09:20:57 +02:00
1c661e2dc5 qualys_tags: respect qualys_bypass_proxy flag
_get_creds() ignorait le flag bypass_proxy et retournait toujours
qualys_proxy meme si l'utilisateur avait coche bypass en settings.
Comportement desormais aligne avec qualys_service._get_qualys_creds().
2026-04-17 00:28:57 +02:00
617bf94e31 Qualys agents sync: optims perf majeures (~3-5x plus rapide)
Refactor _refresh_all_agents_impl() avec 4 optimisations:

1. Pre-chargement des servers en dict Python au debut (hostname + IP)
   -> elimine 2 queries SQL par asset (gain principal)

2. UPSERT 'INSERT ... ON CONFLICT DO UPDATE' + RETURNING (xmax=0)
   -> une seule query au lieu de SELECT + INSERT/UPDATE
   -> compte created/updated via xmax

3. HTTP Session reutilisee (requests.Session)
   -> keep-alive, pas de handshake SSL a chaque page

4. ThreadPoolExecutor(5) pour executer les 5 filtres tagName en parallele
   -> dedup par asset_id pour eviter traitement double

Bonus:
- max_pages 30 -> 500 par filtre (evite syncs incomplets silencieux)
- FQDN backfill cible via cache 'servers_need_fqdn' (pas d'UPDATE inutile)
- Commit unique en fin de traitement (suppression savepoint par asset)
- Retrait age-check redondant en mode diff (deja filtre cote API)
2026-04-16 23:34:51 +02:00
f1a1ca9c7b Qualys Tags V3: unescape entites XML dans ruleText/name
Qualys renvoie les entites XML dans ruleText deja echappees (Bip&Go,
<?xml...). Jinja auto-escape les ressortait en double (<...).
Unescape iteratif (jusqu'a 3 passes) pour couvrir le double-escape.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-15 15:40:04 +02:00
79a2cc896e Qualys diff: format ISO sans microsec YYYY-MM-DDTHH:MM:SSZ (compat API QPS) 2026-04-15 14:28:57 +02:00
7924e64616 Qualys diff: filtre 'updated' (searchable) au lieu de 'lastCheckedIn' (non recunu API) 2026-04-15 14:06:27 +02:00
0ebf72d789 Qualys diff sync: sauve le timestamp DES LE DEBUT (resilient si annulation) 2026-04-15 13:29:36 +02:00
935c8003b4 Qualys sync: retry 3x avec backoff sur erreurs transitoires proxy/reseau 2026-04-15 12:44:49 +02:00
a62f9a4146 Qualys sync dual mode: diff (rapide, lastCheckedIn) + full (complet)
- refresh_all_agents accepte mode='diff'|'full' (defaut diff)
- Mode diff: filtre Qualys lastCheckedIn > qualys_last_diff_sync (settings)
- Mode full: pull tous les assets (comme avant)
- Skip early-exit en diff si dernier diff < 5 min
- 2 boutons UI: 'Sync rapide (diff)' et 'Sync complete'
- JS refreshAgents(mode) passe le mode en query param
2026-04-15 12:33:48 +02:00
55f81de986 Qualys sync: fallback matching par IP integrer si hostname ne match pas 2026-04-15 12:25:27 +02:00
0dc9b07edd audit _run: retry sans sudo accepte sortie vide (pas containers/failed = OK, pas erreur) 2026-04-15 12:18:35 +02:00
1a1af9e28a Qualys sync multi-pass: filtres SRV/server/SED/SEI/EMV pour couvrir tags heterogenes 2026-04-15 12:17:02 +02:00
2746188f1c audit _run: detection sudo refused plus robuste (accent-insensitive, sudo:, no tty) 2026-04-15 12:12:22 +02:00
53d4f71607 LDAP: restriction groupe AD + auto-provisioning users (sans permissions)
- Settings ldap_required_group (DN groupe autorise) + ldap_default_role
- ldap_authenticate verifie memberOf vs required_group avant bind
- auth.py: si user inconnu + LDAP + groupe OK -> auto-create user, role default,
  zero permission (admin doit assigner via /users)
2026-04-15 11:45:33 +02:00
ec7712f0c9 Add module Qualys Tags V3: catalogue YAML + service + pages /qualys/tagsv3 et /gap
- deploy/qualys_tags_v3.yaml: catalogue 19 DYN + 6 SPEC manuel + prefixes
- app/services/qualys_tags_service.py: list/analyze_gap/create_static/delete via API
- app/routers/qualys_tags.py: routes /qualys/tagsv3 et /gap
- templates: qualys_tagsv3.html (liste) + qualys_tagsv3_gap.html (diff catalogue)
- Route /qualys/tagsv3/create-all-static pour creer les STAT manquants en bulk
- DYN manquants affiches avec QQL copy-paste pour console Qualys (API ne permet pas)
- PyYAML ajoute aux requirements
2026-04-15 10:14:10 +02:00
105a756008 Qualys hostname: retour a priorite name (sauf IP/localhost/vide), fqdn/netbios en fallback 2026-04-15 01:38:56 +02:00
c7291d3e6d Qualys _parse_assets_full: hostname FQDN > NetBIOS > name (fix aussi cette fonction) 2026-04-15 01:20:28 +02:00
71260e20c3 Qualys sync: hostname depuis FQDN > NetBIOS > name (evite troncature display name) 2026-04-15 01:11:08 +02:00
7eb56bc9cd Qualys sync: filtre SRV au lieu de server (matche OS-WIN-SRV/OS-LIN-SRV DYN SANEF v3) 2026-04-15 01:00:37 +02:00
7480bbf5ac audit _run: fallback sans sudo si sudoers refuse bash -c (commandes read-only OK sans root) 2026-04-15 00:26:42 +02:00
3c4244597c Audit: ThreadPoolExecutor avec parallel borne (evite saturation DB/PSMP) 2026-04-15 00:20:12 +02:00
596276441b audit realtime: route via PSMP CyberArk si ssh_method=ssh_psmp
Nouvelle fonction _connect_via_psmp avec auth_interactive Vault Password,
lookup ssh_method par hostname avant _connect. Fallback SSH direct si
PSMP echoue.
2026-04-14 23:48:00 +02:00
9b3840bfa6 audit realtime: FQDN base = retour direct (plus de check port 22), boucle suffixes uniquement en fallback 2026-04-14 23:30:47 +02:00
e2b984c2c4 Servers: filtre licence (active/obsolete/els/sans licence) 2026-04-14 22:17:09 +02:00
4300eb1210 Fix zone filter: subquery sur zone_id (count query n'a pas le JOIN zones) 2026-04-14 21:17:56 +02:00
3211b81e60 Servers: filtre zone (liste zones + DMZ + Sans zone) 2026-04-14 21:15:49 +02:00
3c6e10944e Servers list: SELECT s.environnement (colonne iTop) au lieu de e.name legacy 2026-04-14 18:58:24 +02:00
56fc1eaa7c Servers filters: option (Sans etat)/(Sans env) pour NULL 2026-04-14 18:53:51 +02:00
1c2d0b958e Etat/Environnement dropdowns alignes strict iTop SANEF
Etat: 6 valeurs lifecycle uniquement (Production, Implémentation,
Stock, Obsolète, prêt, tests). Suppression des valeurs condition
(Nouveau, Cassé, En panne, etc.) et de EOL qui n'existent pas
dans iTop SANEF.

Environnement: 7 valeurs iTop (Développement, Intégration, Pré-Prod,
Production, Recette, Test, Formation). Filtre env bascule de
e.code (legacy) vers s.environnement.

tools/import_etat_itop.py:
- CHECK 6 valeurs lifecycle + NULL
- Migration mappe les anciennes condition/EOL -> NULL
- Lit Status en priorite dans le CSV (lifecycle), fallback Etat
- Fix format print pour None

tools/import_sanef_*.py: ITOP_ETATS reduit a 6 valeurs
2026-04-14 18:48:30 +02:00
753d4076c9 Migre etat vers labels iTop verbatim (Production, Nouveau, etc.)
Aligne la colonne servers.etat sur les valeurs iTop exactes au lieu
des codes lowercase internes.

Impact:
- servers.etat stocke: Production, Implémentation, Stock, Obsolète,
  EOL, prêt, tests, Nouveau, A récupérer, Cassé, Cédé, En panne,
  Perdu, Recyclé, Occasion, A détruire, Volé
- Remplace tous les 'production'/'obsolete'/'stock'/'eol'/'implementation'
  en WHERE/comparisons par les labels iTop verbatim (~10 fichiers)
- Templates badges/filtres: valeurs + labels iTop
- itop_service: maintient mapping iTop API internal code <-> DB label
- import_sanef_*: norm_etat retourne la valeur iTop verbatim ou None
  (plus de fallback silencieux sur 'production')

Ajoute:
- tools/import_etat_itop.py : migration lowercase -> iTop + re-import CSV
- tools/import_environnement.py : fix dry-run pour ADD COLUMN idempotent

Supprime:
- tools/fix_etat_extend.py (obsolete par import_etat_itop.py)
2026-04-14 18:40:56 +02:00
7b87074faa Qualys page size 100 2026-04-14 16:58:03 +02:00
d15db654d4 Qualys: activation keys lazy (no API on page load if cache empty) 2026-04-14 16:24:45 +02:00
49b1865d13 Qualys page size 250 (lower timeout risk) 2026-04-14 16:19:29 +02:00
67287b8256 Qualys: cancel button for ongoing refresh 2026-04-14 16:12:44 +02:00
1bfdb16bfb Qualys: actkeys cache 24h + refresh timeout 600s 2026-04-14 16:07:25 +02:00
07775a385f Qualys activation keys: short timeout (5s) 2026-04-14 16:07:03 +02:00