import type { Edge, Node } from "@xyflow/react"; import { MarkerType } from "@xyflow/react"; import type { ZTNodeData, ZTScenarioDefinition } from "../types"; const node = ( id: string, x: number, y: number, data: ZTNodeData, ): Node => ({ id, type: "ztNode", position: { x, y }, data, }); const edge = ( id: string, source: string, target: string, label: string, opts?: { dashed?: boolean; color?: string }, ): Edge => ({ id, source, target, label, animated: true, markerEnd: { type: MarkerType.ArrowClosed, width: 18, height: 18 }, style: opts?.dashed ? { strokeDasharray: "6 4", stroke: opts.color ?? "#94a3b8" } : { stroke: opts?.color ?? "#64748b" }, labelStyle: { fill: "#334155", fontWeight: 500, fontSize: 11 }, labelBgStyle: { fill: "#f8fafc", fillOpacity: 0.95 }, }); export const classicPerimeterScenario: ZTScenarioDefinition = { id: "classic-perimeter", title: "Périmètre réseau classique", subtitle: "Confiance implicite « à l’intérieur » du LAN", intro: "Modèle souvent associé au VPN : une fois le tunnel établi, le trafic interne est largement considéré comme fiable. Les déplacements latéraux (east-west) peuvent rester peu contrôlés.", nodes: [ node("user", 40, 200, { kind: "user", label: "Utilisateur", role: "Identité", }), node("laptop", 200, 200, { kind: "device", label: "Poste", role: "Appareil", }), node("vpn", 360, 200, { kind: "gateway", label: "Passerelle / VPN", role: "Réseau", }), node("lan", 560, 120, { kind: "network", label: "LAN « de confiance »", role: "Segment interne", }), node("app", 560, 40, { kind: "workload", label: "Application", role: "Charge de travail", }), node("db", 720, 200, { kind: "data", label: "Données", role: "Stockage", }), ], edges: [ edge("e-u-l", "user", "laptop", "Session locale"), edge("e-l-v", "laptop", "vpn", "Tunnel VPN", { color: "#0d9488" }), edge("e-v-lan", "vpn", "lan", "Accès réseau étendu"), edge("e-lan-app", "lan", "app", "HTTP/S — confiance zone"), edge("e-app-db", "app", "db", "SQL — souvent large confiance"), ], steps: [ { id: "s1", title: "Vue d’ensemble", description: "L’utilisateur joint le réseau via une passerelle. Le segment interne est souvent traité comme un tout.", highlightNodes: ["user", "laptop", "vpn", "lan", "app", "db"], highlightEdges: [], pillars: ["network"], practices: [ "Cartographier les flux réels (y compris east-west), pas seulement l’accès distant.", "Ne pas confondre « chiffrement du tunnel » et « confiance des identités ».", ], }, { id: "s2", title: "Tunnel jusqu’au périmètre", description: "Le VPN chiffre le transport, mais ne remplace pas une décision d’accès fine à chaque ressource.", highlightNodes: ["laptop", "vpn"], highlightEdges: ["e-l-v"], pillars: ["network", "device"], practices: [ "Exiger posture et conformité des appareils (MDM, santé du poste).", "Journaliser les accès au réseau et corréler avec les accès applicatifs.", ], }, { id: "s3", title: "Confiance plate en interne", description: "Une fois dans le LAN, l’application parle souvent à la base avec des comptes ou règles larges : surface d’attaque east-west élevée si un poste est compromis.", highlightNodes: ["lan", "app", "db"], highlightEdges: ["e-lan-app", "e-app-db"], pillars: ["application", "data", "network"], practices: [ "Segmenter et appliquer des politiques au plus près des charges (micro-segmentation).", "Principe du moindre privilège sur les comptes de service et les flux base de données.", ], }, ], };