Commit 77d51465 authored by Jordan Grossemy's avatar Jordan Grossemy
Browse files

Kits : purge des non-ANSSI, canaux presse/appel, kit Global immersif + bruit

- Suppression des 4 kits « inspirés ANSSI » non officiels (catalogue +
  migration de purge des copies déjà importées).
- Couche kit étendue aux canaux NEWS (presse) et CALL (appel) : champs
  to/outlet/newsSource/newsCategory (schéma + migration), mapping à
  l'installation, éditeur de kit, propagation import/duplicate/reset.
- Nouveau kit catalogue « REMPAR25 — Global (immersif) » : même scénario
  que Global, re-canalisé sur le média le plus réaliste (email, chat,
  réseaux sociaux, presse, appel) + 25 injects de « bruit » (clients
  mécontents, rumeurs, arnaques, trolls, pièges d'ingénierie sociale…).

Co-Authored-By: Claude (RCA)
parent db6152db
Loading
Loading
Loading
Loading
+10 −0
Original line number Diff line number Diff line
-- Purge des kits non-ANSSI retirés du catalogue (contenus rédigés pour Cythin,
-- destinés à être refaits). Les enfants (KitInject, KitCharacter, KitChannel,
-- KitDocument) sont supprimés automatiquement via ON DELETE CASCADE.
DELETE FROM "Kit"
WHERE "builtinId" IN (
  'rancongiciel-massifie',
  'enseignement-superieur',
  'agroalimentaire',
  'audiovisuel'
);
+6 −0
Original line number Diff line number Diff line
-- Support presse (NEWS) et appel (CALL) dans les injects de kit :
-- champs spécifiques (qui appeler ; média / source / rubrique de presse).
ALTER TABLE "KitInject" ADD COLUMN "to" TEXT;
ALTER TABLE "KitInject" ADD COLUMN "outlet" TEXT;
ALTER TABLE "KitInject" ADD COLUMN "newsSource" TEXT;
ALTER TABLE "KitInject" ADD COLUMN "newsCategory" TEXT;
+3 −160
Original line number Diff line number Diff line
@@ -6,10 +6,12 @@ import rempar25ServicePublic from './data/rempar25-service-public.json';
import rempar25Admin from './data/rempar25-administration.json';
import rempar25Cod from './data/rempar25-cod.json';
import rempar25Csirt from './data/rempar25-csirt.json';
import rempar25GlobalImmersif from './data/rempar25-global-immersif.json';

/** Kits officiels REMPAR25 importés depuis les chronogrammes ANSSI (Licence Ouverte 2.0). */
const REMPAR25: Kit[] = [
  rempar25Global,
  rempar25GlobalImmersif,
  rempar25Finance,
  rempar25Industrie,
  rempar25ServicePublic,
@@ -18,163 +20,4 @@ const REMPAR25: Kit[] = [
  rempar25Csirt,
].map((k) => k as unknown as Kit);

/**
 * Catalogue de kits prêts à l'emploi.
 *
 * Contenus ORIGINAUX rédigés pour Cythin, inspirés de la structure des exercices
 * de l'ANSSI (REMPAR, kits sectoriels) diffusés sous Licence Ouverte / Etalab 2.0.
 * Aucune reproduction du texte des documents ANSSI : seuls la démarche et le format
 * (mise en situation, chronogramme de stimuli, rôles) servent de modèle.
 */

const ATTRIBUTION = "Inspiré des exercices ANSSI (REMPAR / kits sectoriels) — Licence Ouverte 2.0";

const rancongiciel: Kit = {
  id: 'rancongiciel-massifie',
  name: 'Rançongiciel — crise cyber majeure',
  sector: 'Multi-secteur',
  source: ATTRIBUTION,
  description:
    "Exercice de gestion de crise déclenché par un rançongiciel paralysant le système d'information : production à l'arrêt, demande de rançon, menace d'exfiltration de données et pression médiatique. Format massifié type REMPAR.",
  objectives:
    "Tester l'activation et la coordination de la cellule de crise, la prise de décision stratégique (rançon, communication), et la maîtrise de la pression médiatique et réglementaire (RGPD).",
  characters: [
    { ref: 'pdg', name: 'Direction générale', title: 'PDG', orgUnit: 'Direction', kind: 'PLAYER', avatarColor: '#d5382f' },
    { ref: 'dsi', name: 'Directeur des SI', title: 'DSI', orgUnit: 'DSI', kind: 'PLAYER', avatarColor: '#4b6bfb' },
    { ref: 'rssi', name: 'RSSI', title: 'Responsable sécurité SI', orgUnit: 'DSI', kind: 'PLAYER', avatarColor: '#1f9d57' },
    { ref: 'comm', name: 'Directrice communication', title: 'Communication', orgUnit: 'Comm.', kind: 'PLAYER', avatarColor: '#c77b00' },
    { ref: 'dpo', name: 'Délégué à la protection des données', title: 'DPO', orgUnit: 'Juridique', kind: 'PLAYER', avatarColor: '#0e8a9a' },
    { ref: 'soc', name: 'SOC (prestataire)', title: 'Supervision sécurité', kind: 'NPC', avatarColor: '#7d5fff' },
    { ref: 'attaquant', name: 'Attaquant', title: 'Groupe rançongiciel', kind: 'NPC', avatarColor: '#3a3f47' },
    { ref: 'presse', name: 'Journaliste', title: 'Presse spécialisée', kind: 'NPC', avatarColor: '#e0245e' },
  ],
  channels: [{ ref: 'crise', name: 'cellule-crise' }, { ref: 'tech', name: 'technique' }],
  documents: [
    {
      folder: 'Procédures',
      name: 'Procédure de réponse à un rançongiciel',
      description: 'Étapes clés de réaction',
      body: "1. Isoler les systèmes touchés sans les éteindre.\n2. Préserver les preuves et journaux.\n3. Activer la cellule de crise.\n4. Qualifier l'incident avec le SOC/CSIRT.\n5. Ne pas payer sans décision stratégique documentée.\n6. Notifier les autorités compétentes.",
    },
    {
      folder: 'Communication',
      name: 'Kit de communication de crise',
      description: 'Modèles de prise de parole',
      body: "Éléments de langage : reconnaître l'incident sans surqualifier, rassurer sur la mobilisation, ne pas divulguer d'éléments techniques exploitables, annoncer un point de situation régulier.",
    },
    {
      folder: 'Continuité',
      name: 'Plan de continuité (extrait)',
      description: 'Modes dégradés',
      body: 'Procédures de fonctionnement en mode dégradé pour les activités essentielles pendant l\'indisponibilité du SI.',
    },
  ],
  injects: [
    { offsetMinutes: 0, channel: 'EMAIL', senderRef: 'soc', title: 'Alerte EDR', subject: 'Alerte critique : activité anormale détectée', body: "Notre supervision a détecté des exécutions suspectes et des chiffrements de fichiers en cours sur plusieurs postes. Isolement recommandé immédiatement." },
    { offsetMinutes: 6, channel: 'EMAIL', senderRef: 'attaquant', title: 'Note de rançon', subject: 'VOS FICHIERS SONT CHIFFRÉS', body: "Votre infrastructure est chiffrée. Une rançon est exigée sous 48 heures, faute de quoi vos données seront publiées. N'impliquez pas les autorités." },
    { offsetMinutes: 12, channel: 'CHAT', channelRef: 'tech', senderRef: 'dsi', title: 'Production à l\'arrêt', body: 'La production est à l\'arrêt sur plusieurs sites. On isole les réseaux, ne rallumez aucun poste.' },
    { offsetMinutes: 22, channel: 'SOCIAL', network: 'X', title: 'Rumeur cyber', authorName: 'Veille Cyber', authorHandle: 'veillecyber', likes: 1240, body: "🚨 Une organisation majeure semble touchée par un rançongiciel. Aucune communication officielle pour l'instant. Fil à suivre 🧵 #ransomware" },
    { offsetMinutes: 35, channel: 'EMAIL', senderRef: 'dpo', title: 'Rappel RGPD 72h', subject: 'Obligation de notification sous 72 heures', body: "En cas de violation de données personnelles, une notification à la CNIL peut être requise sous 72 heures. Merci de qualifier rapidement l'atteinte aux données." },
    { offsetMinutes: 45, channel: 'SOCIAL', network: 'X', senderRef: 'presse', title: 'Demande presse', authorName: 'Journaliste', authorHandle: 'presse_cyber', likes: 320, body: "Nous avons connaissance d'une possible cyberattaque. Une réaction officielle est-elle prévue ? #cyberattaque" },
    { offsetMinutes: 58, channel: 'SOCIAL', network: 'LINKEDIN', title: 'Bad buzz interne', authorName: 'Un collaborateur', authorHandle: 'employe', likes: 210, body: 'Ça fait des heures que plus rien ne fonctionne et personne ne nous dit rien. Nos données sont-elles en sécurité ?' },
    { offsetMinutes: 75, channel: 'EMAIL', senderRef: 'attaquant', title: 'Ultimatum', subject: 'Le délai court', body: "Le compte à rebours est lancé. Un échantillon de vos données sera publié si aucun paiement n'est effectué." },
  ],
};

const enseignementSup: Kit = {
  id: 'enseignement-superieur',
  name: 'Enseignement supérieur & recherche — compromission',
  sector: 'Enseignement supérieur et recherche',
  source: ATTRIBUTION,
  description:
    "Compromission du système d'information d'un établissement pendant une période sensible (examens/inscriptions), avec risque sur des données étudiantes et des travaux de recherche.",
  objectives:
    "Coordonner DSI, direction, scolarité et laboratoires ; arbitrer la continuité pédagogique ; gérer la communication auprès des étudiants et personnels.",
  characters: [
    { ref: 'presidence', name: 'Présidence', title: 'Président·e', orgUnit: 'Direction', kind: 'PLAYER', avatarColor: '#d5382f' },
    { ref: 'dsi', name: 'DSI', title: 'Directeur des SI', orgUnit: 'DSI', kind: 'PLAYER', avatarColor: '#4b6bfb' },
    { ref: 'scola', name: 'Direction scolarité', title: 'Scolarité', orgUnit: 'Scolarité', kind: 'PLAYER', avatarColor: '#1f9d57' },
    { ref: 'labo', name: 'Direction de laboratoire', title: 'Recherche', orgUnit: 'Recherche', kind: 'PLAYER', avatarColor: '#0e8a9a' },
    { ref: 'comm', name: 'Communication', title: 'Communication', orgUnit: 'Comm.', kind: 'PLAYER', avatarColor: '#c77b00' },
    { ref: 'soc', name: 'CSIRT régional', title: 'Réponse à incident', kind: 'NPC', avatarColor: '#7d5fff' },
  ],
  channels: [{ ref: 'crise', name: 'cellule-crise' }],
  documents: [
    { folder: 'Procédures', name: 'Continuité pédagogique', description: 'Modes dégradés examens', body: 'Modalités de report ou d\'aménagement des examens et de la scolarité en cas d\'indisponibilité des services numériques.' },
    { folder: 'Recherche', name: 'Classification des données de recherche', body: 'Rappel des niveaux de sensibilité des données et travaux de recherche, et conduite à tenir en cas de fuite.' },
  ],
  injects: [
    { offsetMinutes: 0, channel: 'EMAIL', senderRef: 'soc', title: 'Alerte compromission', subject: 'Comptes compromis détectés', body: "Plusieurs comptes à privilèges présentent des connexions anormales depuis l'étranger. L'ENT et la plateforme d'examens sont concernés." },
    { offsetMinutes: 10, channel: 'CHAT', channelRef: 'crise', senderRef: 'dsi', title: 'Coupure ENT', body: "Nous coupons l'ENT et la plateforme d'examens par précaution. Impact immédiat sur les épreuves en cours." },
    { offsetMinutes: 25, channel: 'EMAIL', senderRef: 'labo', title: 'Données de recherche', subject: 'Accès anormal à des données de recherche', body: "Un accès non autorisé à des données de recherche sensibles est suspecté. Quelles mesures et quelle communication ?" },
    { offsetMinutes: 40, channel: 'SOCIAL', network: 'X', title: 'Inquiétude étudiante', authorName: 'Assoc. étudiante', authorHandle: 'asso_etu', likes: 480, body: "Examens suspendus, ENT down… et nos données perso alors ? On veut des réponses. #université" },
    { offsetMinutes: 55, channel: 'EMAIL', senderRef: 'scola', title: 'Décision examens', subject: 'Faut-il reporter les épreuves ?', body: 'La scolarité doit statuer rapidement sur le report ou l\'aménagement des épreuves. Décision de la cellule attendue.' },
  ],
};

const agroalimentaire: Kit = {
  id: 'agroalimentaire',
  name: 'Agroalimentaire — arrêt de production & risque sanitaire',
  sector: 'Agroalimentaire',
  source: ATTRIBUTION,
  description:
    "Une attaque touche les systèmes industriels d'un site de production agroalimentaire : lignes à l'arrêt, doute sur l'intégrité des paramètres de fabrication et risque de rappel produit.",
  objectives:
    "Articuler sécurité informatique et sécurité industrielle/sanitaire ; décider d'un éventuel rappel ; coordonner qualité, production, direction et communication.",
  characters: [
    { ref: 'dg', name: 'Direction générale', title: 'DG', orgUnit: 'Direction', kind: 'PLAYER', avatarColor: '#d5382f' },
    { ref: 'prod', name: 'Directeur de production', title: 'Production', orgUnit: 'Usine', kind: 'PLAYER', avatarColor: '#4b6bfb' },
    { ref: 'qualite', name: 'Responsable qualité', title: 'Qualité & sécurité sanitaire', orgUnit: 'Qualité', kind: 'PLAYER', avatarColor: '#1f9d57' },
    { ref: 'dsi', name: 'Responsable SI/OT', title: 'SI industriel', orgUnit: 'DSI', kind: 'PLAYER', avatarColor: '#0e8a9a' },
    { ref: 'comm', name: 'Communication', title: 'Communication', orgUnit: 'Comm.', kind: 'PLAYER', avatarColor: '#c77b00' },
    { ref: 'soc', name: 'Prestataire cyber', title: 'Réponse à incident', kind: 'NPC', avatarColor: '#7d5fff' },
  ],
  channels: [{ ref: 'crise', name: 'cellule-crise' }],
  documents: [
    { folder: 'Qualité', name: 'Procédure de rappel produit', description: 'Déclenchement et périmètre', body: 'Critères de décision et étapes d\'un rappel produit, information des autorités et des distributeurs.' },
    { folder: 'Industriel', name: 'Sécurité des systèmes OT', body: 'Bonnes pratiques de séparation IT/OT et conduite à tenir en cas de suspicion de compromission des automates.' },
  ],
  injects: [
    { offsetMinutes: 0, channel: 'EMAIL', senderRef: 'soc', title: 'Anomalie automates', subject: 'Comportement anormal des systèmes industriels', body: "Des automates de la ligne de conditionnement présentent des comportements anormaux. Une compromission du réseau OT est suspectée." },
    { offsetMinutes: 8, channel: 'CHAT', channelRef: 'crise', senderRef: 'prod', title: 'Lignes à l\'arrêt', body: "On arrête les lignes par sécurité. Impact immédiat sur les livraisons et les stocks réfrigérés." },
    { offsetMinutes: 20, channel: 'EMAIL', senderRef: 'qualite', title: 'Doute intégrité', subject: 'Intégrité des paramètres de fabrication ?', body: "Impossible de garantir que les paramètres de cuisson/dosage n'ont pas été altérés sur les derniers lots. Faut-il envisager un rappel ?" },
    { offsetMinutes: 35, channel: 'SOCIAL', network: 'X', title: 'Client inquiet', authorName: 'Consommateur', authorHandle: 'conso', likes: 150, body: 'On me dit qu\'il y a un problème sur vos produits ? C\'est sûr pour la santé ? #alimentation' },
    { offsetMinutes: 50, channel: 'EMAIL', senderRef: 'dg', title: 'Décision rappel', subject: 'Rappel produit : décision attendue', body: 'La direction doit statuer sur un rappel produit préventif et sur l\'information des autorités et distributeurs.' },
  ],
};

const audiovisuel: Kit = {
  id: 'audiovisuel',
  name: 'Audiovisuel — sabotage avant une diffusion',
  sector: 'Audiovisuel',
  source: ATTRIBUTION,
  description:
    "À quelques heures d'une diffusion majeure, une attaque perturbe la chaîne technique de diffusion et menace l'antenne : défiguration de sites, fuite de contenus et risque d'interruption du direct.",
  objectives:
    "Sécuriser l'antenne et la continuité de diffusion ; arbitrer entre maintien et report ; gérer la communication en temps réel face à un public nombreux.",
  characters: [
    { ref: 'direction', name: 'Direction des programmes', title: 'Direction', orgUnit: 'Direction', kind: 'PLAYER', avatarColor: '#d5382f' },
    { ref: 'technique', name: 'Directeur technique', title: 'Diffusion & antenne', orgUnit: 'Technique', kind: 'PLAYER', avatarColor: '#4b6bfb' },
    { ref: 'rssi', name: 'RSSI', title: 'Sécurité SI', orgUnit: 'DSI', kind: 'PLAYER', avatarColor: '#1f9d57' },
    { ref: 'comm', name: 'Communication', title: 'Communication', orgUnit: 'Comm.', kind: 'PLAYER', avatarColor: '#c77b00' },
    { ref: 'soc', name: 'CSIRT', title: 'Réponse à incident', kind: 'NPC', avatarColor: '#7d5fff' },
  ],
  channels: [{ ref: 'crise', name: 'cellule-crise' }, { ref: 'antenne', name: 'antenne' }],
  documents: [
    { folder: 'Antenne', name: 'Procédure de secours diffusion', body: 'Bascule vers les moyens de diffusion de secours et conduite à tenir en cas de menace sur l\'antenne.' },
  ],
  injects: [
    { offsetMinutes: 0, channel: 'EMAIL', senderRef: 'soc', title: 'Défiguration', subject: 'Sites web défigurés', body: "Plusieurs sites de la chaîne sont défigurés et une revendication circule. La chaîne de diffusion pourrait être visée." },
    { offsetMinutes: 10, channel: 'CHAT', channelRef: 'antenne', senderRef: 'technique', title: 'Menace antenne', body: 'Des anomalies apparaissent sur la chaîne technique de diffusion. Risque d\'interruption du direct de ce soir.' },
    { offsetMinutes: 25, channel: 'SOCIAL', network: 'X', title: 'Buzz revendication', authorName: 'Compte anonyme', authorHandle: 'anon', likes: 2100, body: 'Regardez ce qu\'on a fait à leur site 😏 Le direct de ce soir risque d\'être… perturbé.' },
    { offsetMinutes: 40, channel: 'EMAIL', senderRef: 'direction', title: 'Maintien du direct ?', subject: 'Faut-il maintenir la diffusion ?', body: 'La direction doit décider du maintien, du report ou du passage en secours pour la diffusion de ce soir.' },
  ],
};

export const CATALOGUE: Kit[] = [
  ...REMPAR25,
  rancongiciel,
  enseignementSup,
  agroalimentaire,
  audiovisuel,
];
export const CATALOGUE: Kit[] = [...REMPAR25];
+1473 −0

File added.

Preview size limit exceeded, changes collapsed.

+16 −0
Original line number Diff line number Diff line
import { IsOptional, IsString, MaxLength, MinLength } from 'class-validator';
import { PersonalizationDto } from '../../common/personalization.dto';

/** Personnalisation appliquée lors de l'installation d'un kit en exercice. */
export class InstallKitDto extends PersonalizationDto {
  @IsOptional()
  @IsString()
  @MinLength(1)
  @MaxLength(200)
  name?: string;

  @IsOptional()
  @IsString()
  @MaxLength(120)
  sector?: string;
}
Loading