<!DOCTYPE html>
<html lang="fr" data-theme="light">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Module 09 — Supervision &amp; Logs · Formation Entra ID · Atoo Next</title>
  <meta name="description" content="Sign-in / audit / provisioning logs, export Log Analytics, KQL de base, alertes.">
  <meta name="color-scheme" content="light dark">
  <link rel="preconnect" href="https://fonts.googleapis.com">
  <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
  <link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=Instrument+Serif:ital@0;1&family=JetBrains+Mono:wght@400;500&display=swap">
  <link rel="stylesheet" href="assets/shared.css">
</head>
<body class="layout-module">
  <a href="#main-content" class="skip-link">Aller au contenu principal</a>

  <svg xmlns="http://www.w3.org/2000/svg" style="display:none" aria-hidden="true">
    <symbol id="icon-home" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round"><path d="m3 9 9-7 9 7v11a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z"/><polyline points="9 22 9 12 15 12 15 22"/></symbol>
    <symbol id="icon-book-open" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round"><path d="M12 7v14"/><path d="M3 18a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1h5a4 4 0 0 1 4 4 4 4 0 0 1 4-4h5a1 1 0 0 1 1 1v13a1 1 0 0 1-1 1h-6a3 3 0 0 0-3 3 3 3 0 0 0-3-3z"/></symbol>
    <symbol id="icon-trending-up" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round"><polyline points="22 7 13.5 15.5 8.5 10.5 2 17"/><polyline points="16 7 22 7 22 13"/></symbol>
    <symbol id="icon-award" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round"><path d="M15.477 12.89 17 22l-5-3-5 3 1.523-9.11"/><circle cx="12" cy="8" r="6"/></symbol>
    <symbol id="icon-settings" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="3"/></symbol>
    <symbol id="icon-help-circle" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="10"/><path d="M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3"/><path d="M12 17h.01"/></symbol>
    <symbol id="icon-menu" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round"><line x1="4" x2="20" y1="12" y2="12"/><line x1="4" x2="20" y1="6" y2="6"/><line x1="4" x2="20" y1="18" y2="18"/></symbol>
    <symbol id="icon-activity" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round"><polyline points="22 12 18 12 15 21 9 3 6 12 2 12"/></symbol>
    <symbol id="icon-bell" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round"><path d="M6 8a6 6 0 0 1 12 0c0 7 3 9 3 9H3s3-2 3-9"/><path d="M10.3 21a1.94 1.94 0 0 0 3.4 0"/></symbol>
    <symbol id="icon-database" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round"><ellipse cx="12" cy="5" rx="9" ry="3"/><path d="M3 5v14a9 3 0 0 0 18 0V5"/><path d="M3 12a9 3 0 0 0 18 0"/></symbol>
    <symbol id="icon-check" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polyline points="20 6 9 17 4 12"/></symbol>
    <symbol id="icon-check-circle" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round"><path d="M22 11.08V12a10 10 0 1 1-5.93-9.14"/><polyline points="22 4 12 14.01 9 11.01"/></symbol>
    <symbol id="icon-x" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round"><line x1="18" x2="6" y1="6" y2="18"/><line x1="6" x2="18" y1="6" y2="18"/></symbol>
    <symbol id="icon-refresh-cw" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round"><polyline points="23 4 23 10 17 10"/><path d="M3.51 9a9 9 0 0 1 14.85-3.36L23 10"/></symbol>
    <symbol id="icon-chevron-right" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round"><polyline points="9 18 15 12 9 6"/></symbol>
    <symbol id="icon-arrow-left" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round"><line x1="19" x2="5" y1="12" y2="12"/><polyline points="12 19 5 12 12 5"/></symbol>
    <symbol id="icon-arrow-right" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round"><line x1="5" x2="19" y1="12" y2="12"/><polyline points="12 5 19 12 12 19"/></symbol>
    <symbol id="icon-moon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round"><path d="M12 3a6 6 0 0 0 9 9 9 9 0 1 1-9-9Z"/></symbol>
    <symbol id="icon-sun" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="4"/><path d="M12 2v2"/><path d="M12 20v2"/><path d="m4.93 4.93 1.41 1.41"/><path d="m17.66 17.66 1.41 1.41"/><path d="M2 12h2"/><path d="M20 12h2"/><path d="m6.34 17.66-1.41 1.41"/><path d="m19.07 4.93-1.41 1.41"/></symbol>
    <symbol id="icon-alert-triangle" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round"><path d="m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3Z"/><path d="M12 9v4"/><path d="M12 17h.01"/></symbol>
    <symbol id="icon-info" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="10"/><path d="M12 16v-4"/><path d="M12 8h.01"/></symbol>
    <symbol id="icon-key-round" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round"><path d="M2.586 17.414A2 2 0 0 0 2 18.828V21a1 1 0 0 0 1 1h3a1 1 0 0 0 1-1v-1a1 1 0 0 1 1-1h1a1 1 0 0 0 1-1v-1a1 1 0 0 1 1-1h.172a2 2 0 0 0 1.414-.586l.814-.814a6.5 6.5 0 1 0-4-4z"/></symbol>
    <symbol id="icon-sparkles" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round"><path d="M9.937 15.5A2 2 0 0 0 8.5 14.063l-6.135-1.582a.5.5 0 0 1 0-.962L8.5 9.936A2 2 0 0 0 9.937 8.5l1.582-6.135a.5.5 0 0 1 .963 0L14.063 8.5A2 2 0 0 0 15.5 9.937l6.135 1.581a.5.5 0 0 1 0 .964L15.5 14.063a2 2 0 0 0-1.437 1.437l-1.582 6.135a.5.5 0 0 1-.963 0z"/><path d="M20 3v4"/><path d="M22 5h-4"/><path d="M4 17v2"/><path d="M5 18H3"/></symbol>
    <symbol id="icon-server" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round"><rect width="20" height="8" x="2" y="2" rx="2"/><rect width="20" height="8" x="2" y="14" rx="2"/><line x1="6" x2="6.01" y1="6" y2="6"/><line x1="6" x2="6.01" y1="18" y2="18"/></symbol>
    <symbol id="icon-graduation-cap" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round"><path d="M22 10v6M2 10l10-5 10 5-10 5z"/><path d="M6 12v5c3 3 9 3 12 0v-5"/></symbol>
    <symbol id="icon-flask-conical" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round"><path d="M14 2v6a2 2 0 0 0 .245.96l5.51 10.08A2 2 0 0 1 18 22H6a2 2 0 0 1-1.755-2.96l5.51-10.08A2 2 0 0 0 10 8V2"/><path d="M6.453 15h11.094"/><path d="M8.5 2h7"/></symbol>
    <symbol id="icon-target" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="10"/><circle cx="12" cy="12" r="6"/><circle cx="12" cy="12" r="2"/></symbol>
    <symbol id="icon-list" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round"><line x1="8" x2="21" y1="6" y2="6"/><line x1="8" x2="21" y1="12" y2="12"/><line x1="8" x2="21" y1="18" y2="18"/><line x1="3" x2="3.01" y1="6" y2="6"/><line x1="3" x2="3.01" y1="12" y2="12"/><line x1="3" x2="3.01" y1="18" y2="18"/></symbol>
    <symbol id="icon-external-link" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round"><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"/><polyline points="15 3 21 3 21 9"/><line x1="10" x2="21" y1="14" y2="3"/></symbol>
    <symbol id="icon-search" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round"><circle cx="11" cy="11" r="8"/><path d="m21 21-4.35-4.35"/></symbol>
  </svg>

  <button class="hamburger-btn" aria-label="Ouvrir le menu">
    <svg width="24" height="24"><use href="#icon-menu"/></svg>
  </button>

  <aside class="sidebar-icons" role="navigation" aria-label="Menu principal">
    <a href="javascript:void(0)" class="sidebar-icons__logo" aria-label="Accueil Atoo Next">
      <img src="assets/atoo-next-logo.svg" alt="Atoo Next">
    </a>
    <nav class="sidebar-icons__nav" aria-label="Navigation principale">
      <a href="javascript:void(0)" class="sidebar-icons__item" aria-label="Tableau de bord" title="Tableau de bord"><svg><use href="#icon-home"/></svg></a>
      <a href="#module-content" class="sidebar-icons__item is-active" aria-label="Ce module" title="Ce module"><svg><use href="#icon-book-open"/></svg></a>
      <a href="javascript:void(0)" class="sidebar-icons__item" aria-label="Progression" title="Progression"><svg><use href="#icon-trending-up"/></svg></a>
      <a href="javascript:void(0)" class="sidebar-icons__item" aria-label="Certificat" title="Certificat"><svg><use href="#icon-award"/></svg></a>
    </nav>
    <div class="sidebar-icons__footer">
      <a href="#" class="sidebar-icons__item" aria-label="Aide" title="Aide"><svg><use href="#icon-help-circle"/></svg></a>
      <a href="#" class="sidebar-icons__item" aria-label="Paramètres" title="Paramètres"><svg><use href="#icon-settings"/></svg></a>
    </div>
  </aside>

  <main class="module-main" id="main-content">
    <header class="module-topbar">
      <a href="javascript:void(0)" class="back-link">
        <svg><use href="#icon-arrow-left"/></svg>
        Retour au tableau de bord
      </a>
      <div class="module-topbar__actions">
        <button id="theme-toggle" class="btn-icon" aria-label="Basculer thème" aria-pressed="false">
          <svg width="20" height="20"><use href="#icon-moon"/></svg>
        </button>
      </div>
    </header>

    <div class="module-layout" id="module-content">
      <article class="module-content">
        <header class="module-header">
          <div class="module-header__visual module-header__visual--sky">
            <span class="module-header__number-huge">09</span>
            <div class="module-header__icon-large"><svg><use href="#icon-activity"/></svg></div>
          </div>
          <div class="module-header__meta">
            <span class="module-header__label">MODULE 09 · COURS</span>
            <h1 class="module-header__title">Supervision &amp; Logs</h1>
            <p class="module-header__subtitle">Sign-in / audit / provisioning logs, export Log Analytics, KQL, alertes.</p>
            <div class="module-header__stats">
              <div class="stat-mini"><span class="stat-mini__value">3h</span><span class="stat-mini__label">durée</span></div>
              <div class="stat-mini"><span class="stat-mini__value" id="module-sections-count">11</span><span class="stat-mini__label">sections</span></div>
              <div class="stat-mini"><span class="stat-mini__value">10</span><span class="stat-mini__label">questions</span></div>
            </div>
          </div>
        </header>

        <!-- OBJECTIFS -->
        <section class="module-section module-section--objectifs" data-section-id="s-objectifs">
          <div class="section-header">
            <div class="icon-circle icon-circle--lg icon-circle--lavender"><svg><use href="#icon-target"/></svg></div>
            <div class="section-header__content">
              <span class="section-header__label">OBJECTIFS</span>
              <h2 class="section-header__title">Ce que vous saurez faire</h2>
              <p class="section-header__meta">5 objectifs · ~5 min</p>
            </div>
          </div>
          <ul class="task-list">
            <li class="task-list__item"><span><strong>Distinguer</strong> sign-in logs, audit logs et provisioning logs, et savoir où chacun répond.</span></li>
            <li class="task-list__item"><span><strong>Configurer</strong> l'export des logs Entra vers Log Analytics (diagnostic settings).</span></li>
            <li class="task-list__item"><span><strong>Écrire</strong> des requêtes KQL de base pour investiguer (SigninLogs, AuditLogs).</span></li>
            <li class="task-list__item"><span><strong>Mettre en place</strong> une alerte / un rapport automatisé.</span></li>
            <li class="task-list__item"><span><strong>Situer</strong> Microsoft Sentinel comme <em>à connaître, non déployable</em> en l'état, avec son alternative.</span></li>
          </ul>
          <div class="content-block animate-on-scroll" style="margin-top:var(--space-6)">
            <h3>Compétences transférées depuis l'AD classique</h3>
            <div class="table-wrapper">
              <table>
                <thead><tr><th>L'admin AD réutilise</th><th>L'admin AD doit désapprendre</th></tr></thead>
                <tbody>
                  <tr><td>Lecture des journaux d'événements, analyse d'incidents</td><td>« Les logs sont sur le DC (Event Viewer) » — ici, logs cloud, requêtables en KQL</td></tr>
                  <tr><td>Corrélation d'événements</td><td>Grep / Event Viewer → <strong>KQL</strong> (langage de requête)</td></tr>
                  <tr><td>Notion de rétention</td><td>La rétention par défaut est <strong>limitée</strong> — l'export est nécessaire pour conserver</td></tr>
                </tbody>
              </table>
            </div>
          </div>
        </section>

        <!-- COURS -->
        <section class="module-section module-section--cours">
          <div class="section-header">
            <div class="icon-circle icon-circle--lg icon-circle--sky"><svg><use href="#icon-book-open"/></svg></div>
            <div class="section-header__content">
              <span class="section-header__label">COURS</span>
              <h2 class="section-header__title">Voir et investiguer dans Entra</h2>
              <p class="section-header__meta">4 sections · lecture ~30 min</p>
            </div>
          </div>

          <div class="content-block animate-on-scroll" data-section-id="s-cours-1">
            <h3>1. Les journaux Entra</h3>
            <div class="section-hook">
              <span class="section-hook__label">Contexte</span>
              Un utilisateur signale un accès inhabituel à sa boîte mail. Vous ouvrez le portail Entra — où regarder ? Sign-in logs pour la connexion, audit logs pour les modifications d'annuaire, provisioning logs pour les apps. Chaque question a son journal.
            </div>
            <p>Trois journaux principaux, à ne pas confondre :</p>
            <div class="table-wrapper">
              <table>
                <thead><tr><th>Journal</th><th>Répond à la question</th><th>Exemples</th></tr></thead>
                <tbody>
                  <tr><td><strong>Sign-in logs</strong></td><td>Qui s'est connecté, d'où, comment, avec quel résultat ?</td><td>Connexion réussie / échouée, MFA, CA appliqué, IP, appareil</td></tr>
                  <tr><td><strong>Audit logs</strong></td><td>Qui a fait quoi dans l'annuaire ?</td><td>Création d'utilisateur, ajout à un groupe, changement de rôle, modif de politique CA</td></tr>
                  <tr><td><strong>Provisioning logs</strong></td><td>Le provisioning (SCIM) a-t-il bien fonctionné ?</td><td>Compte créé / mis à jour / désactivé dans une app SaaS</td></tr>
                </tbody>
              </table>
            </div>
            <div class="ad-entra-grid">
              <div class="ad-entra-card ad-entra-card--ad">
                <div class="ad-entra-card__label"><svg width="14" height="14"><use href="#icon-server"/></svg> AD CLASSIQUE</div>
                <div class="ad-entra-card__body"><p>Événements de sécurité dans l'<strong>Event Viewer</strong> de chaque DC (4624, 4625, 4740…), à corréler manuellement.</p></div>
              </div>
              <div class="ad-entra-card ad-entra-card--entra">
                <div class="ad-entra-card__label"><svg width="14" height="14"><use href="#icon-activity"/></svg> ENTRA</div>
                <div class="ad-entra-card__body"><p>Journaux <strong>centralisés</strong>, filtrables au portail, requêtables en KQL après export.</p></div>
              </div>
              <div class="ad-entra-card ad-entra-card--danger">
                <div class="ad-entra-card__label"><svg width="14" height="14"><use href="#icon-alert-triangle"/></svg> PIÈGE</div>
                <div class="ad-entra-card__body"><p>Croire que la <strong>rétention</strong> est illimitée. Par défaut : 7 à 30 jours selon la licence. Pour conserver, il faut <strong>exporter</strong>.</p></div>
              </div>
            </div>
          </div>

          <div class="content-block animate-on-scroll" data-section-id="s-cours-2">
            <h3>2. Export vers Log Analytics / Sentinel</h3>
            <p>Pour conserver, corréler et alerter au-delà de la rétention native, on <strong>exporte</strong> les logs via les <strong>Diagnostic settings</strong> d'Entra vers :</p>
            <ul>
              <li><strong>Log Analytics workspace</strong> (Azure Monitor) : stockage requêtable en <strong>KQL</strong>, rétention configurable, base des alertes et classeurs (workbooks). <strong>Coût Azure</strong> (ingestion + rétention).</li>
              <li>Un <strong>compte de stockage</strong> (archivage long terme, peu coûteux, non requêtable directement).</li>
              <li><strong>Event Hub</strong> (streaming vers un SIEM tiers).</li>
            </ul>

            <figure class="mermaid-container animate-on-scroll" data-mermaid-source='flowchart LR
  E["Entra ID<br>logs natifs<br>(7-30 j)"] -->|Diagnostic settings| LA["Log Analytics<br>workspace<br>(KQL + rétention)"]
  E -->|Diagnostic settings| ST["Compte de<br>stockage<br>(archivage)"]
  E -->|Diagnostic settings| EH["Event Hub<br>(SIEM tiers)"]
  LA --> ALT["Alertes<br>Azure Monitor"]
  LA --> WB["Workbooks<br>dashboards"]
  LA -.->|hors E3+P2| SEN["Microsoft Sentinel<br>(SIEM/SOAR)"]
  classDef entra fill:#A5C8E4,color:#2C2438,stroke:#4A7FAF
  classDef la fill:#A78BD9,color:#fff,stroke:#6B4FA0
  classDef out fill:#B8E0C8,stroke:#5DAA7A,color:#2C2438
  classDef hors fill:#F5C7A9,stroke:#C88458,color:#2C2438
  class E entra
  class LA la
  class ST,EH,ALT,WB out
  class SEN hors'>
              <div class="mermaid-render"><em class="text-muted">Chargement du schéma…</em></div>
              <figcaption class="mermaid-caption">Chaîne d'export des logs Entra. Sentinel (en pointillés) = hors E3+P2 ; alternative = Log Analytics seul + KQL + alertes Azure Monitor.</figcaption>
            </figure>

            <aside class="callout callout--info">
              <div class="callout__icon"><div class="icon-circle icon-circle--sm icon-circle--sky"><svg><use href="#icon-info"/></svg></div></div>
              <div class="callout__content">
                <span class="callout__label">MICROSOFT SENTINEL — HORS PÉRIMÈTRE DÉPLOYABLE</span>
                <p><strong>Sentinel</strong> est le SIEM / SOAR cloud de Microsoft, bâti au-dessus d'un Log Analytics workspace : corrélation avancée, règles de détection, playbooks d'automatisation, chasse aux menaces.</p>
                <p>Sentinel n'est <strong>pas</strong> couvert par M365 E3 + Entra ID P2 : coût Azure significatif (ingestion Sentinel + Log Analytics), offre dédiée. À <strong>connaître</strong> (vocabulaire SIEM / SOAR), <strong>pas à déployer</strong> dans le cadre de la cible.</p>
                <p><strong>Alternative E3+P2 :</strong> exporter vers un <strong>Log Analytics workspace seul</strong> (sans la couche Sentinel), écrire des <strong>requêtes KQL</strong>, créer des <strong>alertes Azure Monitor</strong> et des <strong>workbooks</strong>, et exploiter les <strong>rapports / alertes natifs d'Entra</strong>. On obtient l'essentiel de la détection et de l'investigation sans le coût d'un SIEM complet.</p>
              </div>
            </aside>
          </div>

          <div class="content-block animate-on-scroll" data-section-id="s-cours-3">
            <h3>3. KQL de base</h3>
            <p><strong>KQL</strong> (Kusto Query Language) interroge les tables de Log Analytics (<code>SigninLogs</code>, <code>AuditLogs</code>, <code>AADProvisioningLogs</code>…). Structure : on part d'une table, on <strong>enchaîne</strong> des opérateurs avec <code>|</code>.</p>
            <p>Opérateurs essentiels :</p>
            <div class="table-wrapper">
              <table>
                <thead><tr><th>Opérateur</th><th>Rôle</th><th>Analogie</th></tr></thead>
                <tbody>
                  <tr><td><code>where</code></td><td>Filtrer</td><td><code>WHERE</code> SQL / <code>Where-Object</code></td></tr>
                  <tr><td><code>project</code></td><td>Sélectionner des colonnes</td><td><code>SELECT</code> / <code>Select-Object</code></td></tr>
                  <tr><td><code>summarize</code></td><td>Agréger (count, dcount, avg…)</td><td><code>GROUP BY</code></td></tr>
                  <tr><td><code>sort by</code></td><td>Trier</td><td><code>ORDER BY</code></td></tr>
                  <tr><td><code>ago(x)</code></td><td>Fenêtre temporelle</td><td>—</td></tr>
                </tbody>
              </table>
            </div>

            <h4>Exemple 1 — Connexions échouées des dernières 24h, par utilisateur</h4>
            <pre><code>SigninLogs
| where TimeGenerated &gt; ago(24h)
| where ResultType != 0                     // 0 = succès ; != 0 = échec
| summarize Echecs = count() by UserPrincipalName
| sort by Echecs desc</code></pre>

            <h4>Exemple 2 — Détecter un possible password spraying</h4>
            <p>Beaucoup d'échecs « mauvais mot de passe » (50126), peu de comptes ciblés, une IP.</p>
            <pre><code>SigninLogs
| where TimeGenerated &gt; ago(1h)
| where ResultType == 50126               // mauvais mot de passe
| summarize Tentatives = count(), Comptes = dcount(UserPrincipalName) by IPAddress
| where Tentatives &gt; 20
| sort by Tentatives desc</code></pre>

            <h4>Exemple 3 — Qui a modifié des politiques CA cette semaine ?</h4>
            <pre><code>AuditLogs
| where TimeGenerated &gt; ago(7d)
| where OperationName has "conditional access policy"
| project TimeGenerated, InitiatedBy, OperationName, TargetResources</code></pre>

            <aside class="callout callout--warning">
              <div class="callout__icon"><div class="icon-circle icon-circle--sm icon-circle--peach"><svg><use href="#icon-alert-triangle"/></svg></div></div>
              <div class="callout__content">
                <span class="callout__label">PIÈGE FRÉQUENT</span>
                <p>Oublier le filtre temporel (<code>ago</code>). Sans borne de temps, la requête scanne <strong>toute la table</strong>, est lente et <strong>coûte cher</strong> (ingestion / traitement facturé).</p>
              </div>
            </aside>

            <div class="quickquestion animate-on-scroll" data-id="qq-kql-time">
              <div class="quickquestion__label"><svg width="14" height="14"><use href="#icon-sparkles"/></svg> Question rapide</div>
              <p class="quickquestion__question">Vous écrivez votre première requête KQL sur SigninLogs. Quel filtre mettez-vous <strong>toujours</strong> en premier ?</p>
              <button class="btn btn--soft-violet quickquestion__btn" type="button">Voir la réponse</button>
              <div class="quickquestion__answer">
                <strong>La fenêtre temporelle avec <code>ago()</code>.</strong>
                <p class="quickquestion__explanation">Toujours borner le temps en premier filtre (<code>where TimeGenerated &gt; ago(24h)</code>). Sans ça, la requête scanne toute la table depuis le début de la rétention (parfois des mois), consomme des ressources et facture de l'ingestion inutile. Après le filtre temporel, on affine avec les autres critères.</p>
              </div>
            </div>
          </div>

          <div class="content-block animate-on-scroll" data-section-id="s-cours-4">
            <h3>4. Alertes &amp; rapports automatisés</h3>
            <ul>
              <li><strong>Alertes Azure Monitor</strong> — déclenchées sur une requête KQL planifiée (ex : « alerter si un compte break-glass se connecte » — signal fort à surveiller).</li>
              <li><strong>Workbooks</strong> — tableaux de bord visuels (connexions, échecs MFA, application des politiques CA).</li>
              <li><strong>Rapports Entra natifs</strong> — usage MFA, application des politiques CA, connexions à risque (Identity Protection).</li>
            </ul>
            <aside class="callout callout--info">
              <div class="callout__icon"><div class="icon-circle icon-circle--sm icon-circle--sky"><svg><use href="#icon-info"/></svg></div></div>
              <div class="callout__content">
                <span class="callout__label">ALERTE À METTRE EN PRIORITÉ</span>
                <p><strong>Toute connexion d'un compte break-glass.</strong> Ces comptes ne doivent normalement jamais servir : leur usage = incident, à investiguer immédiatement.</p>
              </div>
            </aside>
            <aside class="callout callout--warning">
              <div class="callout__icon"><div class="icon-circle icon-circle--sm icon-circle--peach"><svg><use href="#icon-alert-triangle"/></svg></div></div>
              <div class="callout__content">
                <span class="callout__label">PIÈGE FRÉQUENT</span>
                <p>Exporter des tonnes de logs sans <strong>aucune</strong> alerte. Les logs ne servent que si on <strong>agit</strong> dessus : définir quelques alertes à forte valeur (break-glass, spraying, changement de rôle admin) plutôt que d'accumuler des données jamais lues.</p>
              </div>
            </aside>
          </div>

          <div class="content-block animate-on-scroll" data-section-id="s-cours-sources">
            <h3>Sources Microsoft Learn</h3>
            <ul>
              <li><a href="https://learn.microsoft.com/entra/identity/monitoring-health/concept-sign-ins" target="_blank" rel="noopener">Sign-in logs <svg width="12" height="12" style="display:inline"><use href="#icon-external-link"/></svg></a></li>
              <li><a href="https://learn.microsoft.com/entra/identity/monitoring-health/concept-audit-logs" target="_blank" rel="noopener">Audit logs <svg width="12" height="12" style="display:inline"><use href="#icon-external-link"/></svg></a></li>
              <li><a href="https://learn.microsoft.com/entra/identity/monitoring-health/howto-integrate-activity-logs-with-azure-monitor-logs" target="_blank" rel="noopener">Export vers Log Analytics <svg width="12" height="12" style="display:inline"><use href="#icon-external-link"/></svg></a></li>
              <li><a href="https://learn.microsoft.com/azure/data-explorer/kusto/query/" target="_blank" rel="noopener">KQL — prise en main <svg width="12" height="12" style="display:inline"><use href="#icon-external-link"/></svg></a></li>
              <li><a href="https://learn.microsoft.com/azure/azure-monitor/alerts/alerts-overview" target="_blank" rel="noopener">Alertes Azure Monitor <svg width="12" height="12" style="display:inline"><use href="#icon-external-link"/></svg></a></li>
              <li><a href="https://learn.microsoft.com/azure/sentinel/overview" target="_blank" rel="noopener">Microsoft Sentinel (à connaître) <svg width="12" height="12" style="display:inline"><use href="#icon-external-link"/></svg></a></li>
            </ul>
            <p class="text-muted" style="font-size:var(--fs-sm);margin-top:var(--space-3)"><em>Rappel : en cas d'écart entre ce support et le portail, le portail fait foi.</em></p>
          </div>
        </section>

        <!-- LAB -->
        <section class="module-section module-section--lab">
          <div class="section-header">
            <div class="icon-circle icon-circle--lg icon-circle--mint"><svg><use href="#icon-flask-conical"/></svg></div>
            <div class="section-header__content">
              <span class="section-header__label">LAB</span>
              <h2 class="section-header__title">Export, KQL, alerte break-glass</h2>
              <p class="section-header__meta">3 parties · TP guidé ~2h · Portail : entra + portal.azure.com</p>
            </div>
          </div>

          <aside class="callout callout--license animate-on-scroll">
            <div class="callout__icon"><div class="icon-circle icon-circle--sm icon-circle--lavender"><svg><use href="#icon-key-round"/></svg></div></div>
            <div class="callout__content">
              <span class="callout__label">LICENCES REQUISES EN PRODUCTION</span>
              <p><strong>Logs Entra natifs :</strong> inclus dès <strong>Entra ID Free</strong>, rétention élargie avec P1 / P2.</p>
              <p><strong>Log Analytics workspace :</strong> service <strong>Azure</strong>, facturé à l'ingestion (Go/mois) + rétention (au-delà de 31 jours gratuits). Budget à prévoir.</p>
              <p><strong>Alertes Azure Monitor :</strong> facturation à la règle (faible). <strong>Sentinel :</strong> hors périmètre E3+P2.</p>
            </div>
          </aside>

          <div class="content-block animate-on-scroll" data-section-id="s-lab-a">
            <h3>Partie A — Configurer l'export vers Log Analytics (30 min)</h3>
            <ol>
              <li><strong>Créer un workspace Log Analytics :</strong> <code>portal.azure.com &gt; Log Analytics workspaces &gt; Create</code>. Région et resource group cohérents avec votre tenant Azure.</li>
              <li><strong>Configurer les diagnostic settings :</strong> <code>Entra admin center &gt; Monitoring &amp; health &gt; Diagnostic settings &gt; Add diagnostic setting</code>.</li>
              <li>Cocher <strong>SignInLogs</strong>, <strong>AuditLogs</strong> (au minimum ; ajouter les autres selon besoin). Destination : le workspace créé.</li>
              <li>Attendre 15-30 min qu'un premier lot arrive dans le workspace.</li>
            </ol>
          </div>

          <div class="content-block animate-on-scroll" data-section-id="s-lab-b">
            <h3>Partie B — Écrire vos premières requêtes KQL (45 min)</h3>
            <p><strong>Portail :</strong> <code>Log Analytics workspace &gt; Logs</code>.</p>
            <ol>
              <li><strong>Comptez les connexions réussies aujourd'hui :</strong> <code>SigninLogs | where TimeGenerated &gt; ago(1d) | where ResultType == 0 | count</code>.</li>
              <li><strong>Top 10 des utilisateurs par nombre de connexions :</strong> ajoutez <code>| summarize N=count() by UserPrincipalName | top 10 by N</code>.</li>
              <li><strong>Recherchez les modifications de politiques CA de la semaine :</strong> <code>AuditLogs | where TimeGenerated &gt; ago(7d) | where OperationName has "conditional access policy" | project TimeGenerated, InitiatedBy, OperationName</code>.</li>
              <li><strong>Reproduisez la requête spraying</strong> de la section 3 et adaptez le seuil <code>Tentatives &gt; 20</code> à votre volume.</li>
            </ol>
          </div>

          <div class="content-block animate-on-scroll" data-section-id="s-lab-c">
            <h3>Partie C — Alerte « break-glass utilisé » (45 min)</h3>
            <p><strong>Portail :</strong> <code>Log Analytics workspace &gt; Alerts &gt; New alert rule</code>.</p>
            <ol>
              <li>Signal : <strong>Custom log search</strong>, requête :
                <pre><code>SigninLogs
| where TimeGenerated &gt; ago(5m)
| where UserPrincipalName in ("break-glass-01@votretenant.onmicrosoft.com", "break-glass-02@votretenant.onmicrosoft.com")
| project TimeGenerated, UserPrincipalName, IPAddress, AppDisplayName, ResultType</code></pre>
              </li>
              <li><strong>Threshold :</strong> Number of results &gt; 0. <strong>Evaluation :</strong> toutes les 5 min sur 5 min.</li>
              <li><strong>Action group :</strong> notification e-mail + SMS à l'équipe sécurité.</li>
              <li><strong>Severity :</strong> Sev 1 (haute).</li>
            </ol>
            <aside class="callout callout--info">
              <div class="callout__icon"><div class="icon-circle icon-circle--sm icon-circle--sky"><svg><use href="#icon-info"/></svg></div></div>
              <div class="callout__content">
                <span class="callout__label">RÉSULTAT ATTENDU</span>
                <ul style="margin:var(--space-2) 0 0">
                  <li>Un Log Analytics workspace reçoit SignInLogs + AuditLogs Entra.</li>
                  <li>Au moins 4 requêtes KQL fonctionnent avec filtre temporel systématique.</li>
                  <li>Une alerte est configurée sur toute connexion break-glass, sévérité haute.</li>
                  <li>L'équipe sécurité reçoit une notification test (déclencher manuellement une connexion break-glass depuis un environnement contrôlé pour vérifier).</li>
                </ul>
              </div>
            </aside>
          </div>
        </section>

        <!-- PIÈGES -->
        <section class="module-section module-section--pieges" data-section-id="s-pieges">
          <div class="section-header">
            <div class="icon-circle icon-circle--lg icon-circle--peach"><svg><use href="#icon-alert-triangle"/></svg></div>
            <div class="section-header__content">
              <span class="section-header__label">PIÈGES CLASSIQUES</span>
              <h2 class="section-header__title">5 pièges de supervision</h2>
              <p class="section-header__meta">Lecture ~10 min</p>
            </div>
          </div>

          <aside class="callout callout--warning animate-on-scroll">
            <div class="callout__icon"><div class="icon-circle icon-circle--sm icon-circle--peach"><svg><use href="#icon-alert-triangle"/></svg></div></div>
            <div class="callout__content">
              <span class="callout__label">PIÈGE 1 — CROIRE QUE LA RÉTENTION DES LOGS EST ILLIMITÉE</span>
              <p><strong>Le réflexe :</strong> « les logs sont dans Entra, je les retrouverai quand je veux ».</p>
              <p><strong>Pourquoi c'est faux :</strong> la rétention native est <strong>limitée</strong> (7 à 30 jours). Passé ce délai, l'historique est perdu si rien n'a été exporté.</p>
              <p><strong>La bonne pratique :</strong> configurer un <strong>diagnostic setting</strong> vers Log Analytics (ou un compte de stockage pour l'archivage) <strong>avant</strong> d'en avoir besoin.</p>
            </div>
          </aside>

          <aside class="callout callout--warning animate-on-scroll">
            <div class="callout__icon"><div class="icon-circle icon-circle--sm icon-circle--peach"><svg><use href="#icon-alert-triangle"/></svg></div></div>
            <div class="callout__content">
              <span class="callout__label">PIÈGE 2 — CHERCHER LES LOGS SUR « LE SERVEUR »</span>
              <p><strong>Le réflexe :</strong> ouvrir l'Event Viewer comme sur un DC.</p>
              <p><strong>Pourquoi c'est faux :</strong> aucun Event Viewer central dans le cloud. Les logs sont <strong>centralisés</strong> dans Entra et requêtables en KQL après export.</p>
              <p><strong>La bonne pratique :</strong> apprendre à naviguer les sign-in / audit logs au portail et à écrire du KQL. C'est le nouveau réflexe d'investigation.</p>
            </div>
          </aside>

          <aside class="callout callout--warning animate-on-scroll">
            <div class="callout__icon"><div class="icon-circle icon-circle--sm icon-circle--peach"><svg><use href="#icon-alert-triangle"/></svg></div></div>
            <div class="callout__content">
              <span class="callout__label">PIÈGE 3 — OUBLIER LE FILTRE TEMPOREL EN KQL</span>
              <p><strong>Le réflexe :</strong> lancer une requête sans <code>where TimeGenerated &gt; ago(...)</code>.</p>
              <p><strong>Pourquoi c'est faux :</strong> la requête scanne toute la table, est lente et <strong>coûte cher</strong> (ingestion / traitement Log Analytics est facturé).</p>
              <p><strong>La bonne pratique :</strong> <strong>toujours</strong> borner le temps en premier filtre, puis affiner.</p>
            </div>
          </aside>

          <aside class="callout callout--warning animate-on-scroll">
            <div class="callout__icon"><div class="icon-circle icon-circle--sm icon-circle--peach"><svg><use href="#icon-alert-triangle"/></svg></div></div>
            <div class="callout__content">
              <span class="callout__label">PIÈGE 4 — VOULOIR DÉPLOYER SENTINEL « PARCE QUE C'EST LE SIEM MICROSOFT »</span>
              <p><strong>Le réflexe :</strong> activer Sentinel pour « bien faire ».</p>
              <p><strong>Pourquoi c'est faux :</strong> Sentinel n'est <strong>pas</strong> dans le périmètre E3+P2 et implique un <strong>coût Azure</strong> important (ingestion). Le déployer sans budget ni besoin réel est une erreur.</p>
              <p><strong>La bonne pratique :</strong> rester sur <strong>Log Analytics + KQL + alertes Azure Monitor + rapports Entra</strong>. Connaître Sentinel comme évolution possible, sans l'imposer.</p>
            </div>
          </aside>

          <aside class="callout callout--warning animate-on-scroll">
            <div class="callout__icon"><div class="icon-circle icon-circle--sm icon-circle--peach"><svg><use href="#icon-alert-triangle"/></svg></div></div>
            <div class="callout__content">
              <span class="callout__label">PIÈGE 5 — ACCUMULER DES LOGS SANS AUCUNE ALERTE</span>
              <p><strong>Le réflexe :</strong> tout exporter et considérer le sujet réglé.</p>
              <p><strong>Pourquoi c'est faux :</strong> des logs que personne ne lit ne protègent de rien. La valeur est dans l'<strong>action</strong> (alerte, investigation).</p>
              <p><strong>La bonne pratique :</strong> définir <strong>quelques alertes à forte valeur</strong> (break-glass, spraying, changement de rôle admin / de politique CA) et les traiter. Mieux vaut 3 alertes exploitées que 1000 dashboards ignorés.</p>
            </div>
          </aside>
        </section>

        <!-- ÉVALUATION -->
        <section class="module-section module-section--eval" data-section-id="s-eval">
          <div class="section-header">
            <div class="icon-circle icon-circle--lg icon-circle--peach"><svg><use href="#icon-graduation-cap"/></svg></div>
            <div class="section-header__content">
              <span class="section-header__label">ÉVALUATION</span>
              <h2 class="section-header__title">Testez vos acquis</h2>
              <p class="section-header__meta">10 questions QCM · cas pratique · ~30 min</p>
            </div>
          </div>

          <div class="content-block animate-on-scroll" style="text-align:center;padding:var(--space-8)">
            <p style="font-size:var(--fs-lg);color:var(--text-secondary);margin-bottom:var(--space-3)">Une évaluation interactive qui vous donne le badge <strong>Acquis</strong> (≥60%) ou <strong>Maîtrisé</strong> (≥80%).</p>
            <div class="eval-status" style="max-width:400px;margin:0 auto var(--space-4)">Évaluation non tentée.</div>
            <button class="btn btn--primary btn--lg qcm-launcher" type="button">
              <svg width="18" height="18"><use href="#icon-sparkles"/></svg>
              Lancer l'évaluation
            </button>
          </div>

          <div class="caspratique animate-on-scroll" data-id="cp-09-investigation">
            <h3 class="caspratique__title">
              <svg width="24" height="24"><use href="#icon-graduation-cap"/></svg>
              Cas pratique — Tentative d'intrusion signalée
            </h3>
            <div class="caspratique__statement">
              <p><strong>Contexte :</strong> après une tentative d'intrusion signalée, la direction veut « savoir ce qui se passe » et être alertée à l'avenir. SI en E3 + P2, pas de budget pour un SIEM complet.</p>
              <p><strong>Questions :</strong></p>
              <ol>
                <li>Où regardez-vous en premier, et pour chercher quoi ?</li>
                <li>Écrivez (en français ou en KQL) la logique pour détecter un password spraying.</li>
                <li>Quelle architecture de supervision proposez-vous, compte tenu du budget ?</li>
                <li>Quelles 2-3 alertes mettez-vous en place en priorité ?</li>
              </ol>
            </div>
            <label class="caspratique__label" for="cp-textarea">Votre réponse :</label>
            <textarea id="cp-textarea" class="caspratique__textarea" placeholder="Rédigez votre démarche ici. Elle est sauvegardée automatiquement dans votre navigateur."></textarea>
            <div class="caspratique__actions">
              <button class="btn btn--soft-peach caspratique__reveal-btn" type="button">Voir la correction type</button>
              <button class="btn btn--ghost btn--sm caspratique__clear-btn" type="button">Effacer ma réponse</button>
            </div>
            <div class="caspratique__correction">
              <h4>Démarche attendue</h4>
              <ol>
                <li><strong>Sign-in logs</strong> en premier : connexions échouées, IP inhabituelles, pays inattendus, MFA contournée, politiques CA appliquées. Puis <strong>audit logs</strong> pour vérifier qu'aucun changement suspect (rôle, politique CA, ajout d'app) n'a suivi.</li>
                <li><strong>Spraying :</strong> sur une fenêtre courte, chercher une <strong>IP</strong> générant <strong>beaucoup d'échecs « mauvais mot de passe » (50126)</strong> répartis sur <strong>peu de comptes distincts</strong>. En KQL :
                <pre><code>SigninLogs
| where TimeGenerated &gt; ago(1h)
| where ResultType == 50126
| summarize Tentatives=count(), Comptes=dcount(UserPrincipalName) by IPAddress
| where Tentatives &gt; 20</code></pre>
                </li>
                <li><strong>Architecture E3+P2 (sans SIEM) :</strong> export des SignInLogs / AuditLogs vers un <strong>Log Analytics workspace</strong> (coût Azure maîtrisé), <strong>KQL</strong> + <strong>workbooks</strong> pour l'investigation, <strong>alertes Azure Monitor</strong> + <strong>rapports Entra natifs</strong>. <strong>Sentinel</strong> est écarté (coût / complexité) mais connu comme évolution possible.</li>
                <li><strong>Alertes prioritaires :</strong> (a) <strong>connexion d'un compte break-glass</strong>, (b) <strong>password spraying</strong> (règle ci-dessus), (c) <strong>modification d'un rôle à privilèges ou d'une politique CA</strong>. Peu d'alertes, à forte valeur, sur lesquelles on agit réellement.</li>
              </ol>
              <h4>Grille d'auto-évaluation</h4>
              <ul class="caspratique__checklist">
                <li><input type="checkbox" id="cp-1"> <label for="cp-1">A cherché dans les <strong>SignInLogs</strong> en premier</label></li>
                <li><input type="checkbox" id="cp-2"> <label for="cp-2">A prolongé l'investigation dans les <strong>AuditLogs</strong></label></li>
                <li><input type="checkbox" id="cp-3"> <label for="cp-3">A donné la logique KQL du spraying (50126 + IP + dcount)</label></li>
                <li><input type="checkbox" id="cp-4"> <label for="cp-4">A proposé <strong>Log Analytics + KQL</strong> comme architecture (sans Sentinel)</label></li>
                <li><input type="checkbox" id="cp-5"> <label for="cp-5">A écarté <strong>Sentinel</strong> pour budget / périmètre</label></li>
                <li><input type="checkbox" id="cp-6"> <label for="cp-6">A cité <strong>3 alertes prioritaires</strong> à forte valeur (break-glass, spraying, rôles / CA)</label></li>
                <li><input type="checkbox" id="cp-7"> <label for="cp-7">A rappelé que sans <strong>action</strong>, les logs ne protègent pas</label></li>
              </ul>
            </div>
          </div>
        </section>
      </article>

      <aside class="module-sidebar-right" aria-label="Progression et sommaire">
        <div class="module-progress-card">
          <div class="module-progress-card__title">Ma progression</div>
          <div class="progress-donut progress-donut--module" data-value="0">
            <svg viewBox="0 0 120 120">
              <circle class="progress-donut__track" cx="60" cy="60" r="50"/>
              <circle class="progress-donut__fill" cx="60" cy="60" r="50" stroke-dasharray="314" stroke-dashoffset="314"/>
            </svg>
            <div class="progress-donut__label">
              <span class="progress-donut__value">0</span>
              <span class="progress-donut__unit">%</span>
            </div>
          </div>
          <div class="module-progress-card__stats">
            <div><strong class="module-progress-card__count">0 / 11</strong><br><span>sections lues</span></div>
          </div>
        </div>

        <nav class="module-toc" aria-label="Sommaire du module">
          <div class="module-toc__title">Sommaire</div>
          <ul class="module-toc__list">
            <li class="module-toc__item"><a class="module-toc__link" href="#s-objectifs" data-target="s-objectifs">Objectifs</a></li>
            <li class="module-toc__item"><a class="module-toc__link" href="#s-cours-1" data-target="s-cours-1">1. Les journaux Entra</a></li>
            <li class="module-toc__item"><a class="module-toc__link" href="#s-cours-2" data-target="s-cours-2">2. Export &amp; Sentinel</a></li>
            <li class="module-toc__item"><a class="module-toc__link" href="#s-cours-3" data-target="s-cours-3">3. KQL de base</a></li>
            <li class="module-toc__item"><a class="module-toc__link" href="#s-cours-4" data-target="s-cours-4">4. Alertes &amp; rapports</a></li>
            <li class="module-toc__item"><a class="module-toc__link" href="#s-cours-sources" data-target="s-cours-sources">Sources</a></li>
            <li class="module-toc__item"><a class="module-toc__link" href="#s-lab-a" data-target="s-lab-a">Lab · Export</a></li>
            <li class="module-toc__item"><a class="module-toc__link" href="#s-lab-b" data-target="s-lab-b">Lab · KQL</a></li>
            <li class="module-toc__item"><a class="module-toc__link" href="#s-lab-c" data-target="s-lab-c">Lab · Alerte break-glass</a></li>
            <li class="module-toc__item"><a class="module-toc__link" href="#s-pieges" data-target="s-pieges">Pièges classiques</a></li>
            <li class="module-toc__item"><a class="module-toc__link" href="#s-eval" data-target="s-eval">Évaluation</a></li>
          </ul>
        </nav>

        <div class="module-actions">
          <button class="btn btn--primary btn--full qcm-launcher" type="button">
            <svg width="16" height="16"><use href="#icon-sparkles"/></svg>
            Passer l'évaluation
          </button>
          <a class="btn btn--ghost btn--full" href="javascript:void(0)" onclick="if(window.ScormAPI){ScormAPI.terminate();}try{window.parent.location.reload();}catch(e){alert('Retournez sur Moodle pour le module suivant.');}return false;">
            <svg width="16" height="16"><use href="#icon-arrow-left"/></svg>
            Module précédent
          </a>
          <a class="btn btn--soft-violet btn--full" href="javascript:void(0)" onclick="if(window.ScormAPI){ScormAPI.terminate();}try{window.parent.location.reload();}catch(e){alert('Retournez sur Moodle pour le module suivant.');}return false;">
            Module suivant
            <svg width="16" height="16"><use href="#icon-arrow-right"/></svg>
          </a>
        </div>
      </aside>
    </div>
  </main>

  <footer class="site-footer">
    <div class="site-footer__brand">
      <img src="assets/atoo-next-logo.svg" alt="Atoo Next">
      <span class="site-footer__tag">La connexion commence ici</span>
    </div>
    <div>Module 09 · Formation Microsoft Entra ID</div>
  </footer>

  <div class="modal-overlay" id="qcm-modal" role="dialog" aria-modal="true" aria-labelledby="qcm-modal-title">
    <div class="modal" tabindex="-1">
      <header class="modal__header">
        <h2 id="qcm-modal-title" style="margin:0;font-size:var(--fs-xl)">Évaluation — Supervision &amp; Logs</h2>
        <button class="modal__close" aria-label="Fermer"><svg><use href="#icon-x"/></svg></button>
      </header>
      <div class="modal__body"></div>
      <footer class="modal__footer"></footer>
    </div>
  </div>

  <script>window.__SCORM_CONTEXT__ = true;</script>
  <script>
    window.MODULE_ID = '09-supervision-logs';
    window.MODULE_NUM = '09';
    window.MODULE_STORAGE_KEY = 'formation-entra:module-09';
    window.MODULE_TITLE = 'Supervision & Logs';

    window.QCM_DATA = {
      module: '09-supervision-logs',
      titre: 'Évaluation — Supervision & Logs',
      seuils: { acquis: 60, maitrise: 80 },
      questions: [
        { id: 'q1', type: 'single', enonce: 'Quel journal répond à « qui s\'est connecté, d\'où, avec quel résultat » ?', reference_cours: 'Section 1',
          choix: [
            { id: 'a', texte: 'Audit logs', correct: false, feedback_si_choisi: 'Audit logs répondent à « qui a fait quoi dans l\'annuaire », pas à qui s\'est connecté.' },
            { id: 'b', texte: 'Sign-in logs', correct: true },
            { id: 'c', texte: 'Provisioning logs', correct: false, feedback_si_choisi: 'Provisioning logs concernent le SCIM vers les apps SaaS, pas les connexions utilisateur.' },
            { id: 'd', texte: 'Event Viewer du DC', correct: false, feedback_si_choisi: 'Le DC ne voit pas les connexions cloud (Teams, SharePoint, etc.) — c\'est le mauvais endroit.' }
          ],
          explication: 'Sign-in logs = connexions : qui, quand, d\'où (IP, pays), quelle app, quel résultat (succès, échec MFA, blocage CA). Le premier réflexe d\'investigation.'
        },
        { id: 'q2', type: 'single', enonce: 'Quel journal répond à « qui a modifié une politique CA » ?', reference_cours: 'Section 1',
          choix: [
            { id: 'a', texte: 'Sign-in logs', correct: false, feedback_si_choisi: 'Sign-in logs enregistrent la connexion de la personne, mais pas la modification qu\'elle a faite.' },
            { id: 'b', texte: 'Audit logs', correct: true },
            { id: 'c', texte: 'Provisioning logs', correct: false, feedback_si_choisi: 'Provisioning logs concernent le SCIM SaaS, pas les modifications d\'annuaire ou de politique CA.' },
            { id: 'd', texte: 'KQL', correct: false, feedback_si_choisi: 'KQL est un langage de requête, pas un journal.' }
          ],
          explication: 'Audit logs = modifications d\'annuaire : création d\'utilisateur, ajout à un groupe, changement de rôle, modif de politique CA. À croiser avec Sign-in logs pour tracer la chaîne complète.'
        },
        { id: 'q3', type: 'single', enonce: 'La rétention native des logs Entra est :', reference_cours: 'Section 1 + Piège 1',
          choix: [
            { id: 'a', texte: 'Illimitée', correct: false, feedback_si_choisi: 'Faux — c\'est le piège classique qui fait perdre l\'historique après un incident.' },
            { id: 'b', texte: 'Limitée (7 à 30 jours) ; il faut exporter pour conserver', correct: true },
            { id: 'c', texte: 'De 10 ans', correct: false, feedback_si_choisi: 'Rien de tel — au mieux 30 j en natif ; 10 ans est réservé à un archivage explicite payant.' },
            { id: 'd', texte: 'Inexistante', correct: false, feedback_si_choisi: 'Les logs existent bien — mais leur rétention est courte.' }
          ],
          explication: '7 j en Free, 30 j en P1 / P2. Passé ce délai, l\'historique disparaît si aucun diagnostic setting n\'a été configuré. À anticiper avant d\'en avoir besoin.'
        },
        { id: 'q4', type: 'single', enonce: 'Pour conserver et corréler les logs au-delà de la rétention native, on exporte vers :', reference_cours: 'Section 2',
          choix: [
            { id: 'a', texte: 'Un DC', correct: false, feedback_si_choisi: 'Un DC on-prem n\'est pas destination des logs Entra.' },
            { id: 'b', texte: 'Un Log Analytics workspace (requêtable en KQL)', correct: true },
            { id: 'c', texte: 'Une GPO', correct: false, feedback_si_choisi: 'Une GPO configure des postes AD, elle ne stocke pas de logs cloud.' },
            { id: 'd', texte: 'OneDrive', correct: false, feedback_si_choisi: 'OneDrive stocke des fichiers utilisateur, pas des logs opérationnels.' }
          ],
          explication: 'Log Analytics workspace : destination privilégiée. KQL + rétention configurable + base pour alertes Azure Monitor et workbooks. Coût Azure à budgeter (ingestion + rétention).'
        },
        { id: 'q5', type: 'single', enonce: 'Microsoft Sentinel en E3+P2 :', reference_cours: 'Section 2 + Piège 4',
          choix: [
            { id: 'a', texte: 'Est inclus et à déployer', correct: false, feedback_si_choisi: 'Sentinel n\'est pas inclus — c\'est un piège classique.' },
            { id: 'b', texte: 'N\'est **pas** couvert (coût Azure, offre dédiée) ; à connaître, non déployable ; alternative = Log Analytics seul + KQL + alertes natives', correct: true },
            { id: 'c', texte: 'Remplace Entra', correct: false, feedback_si_choisi: 'Sentinel est un SIEM / SOAR au-dessus de Log Analytics, pas un remplaçant d\'Entra.' },
            { id: 'd', texte: 'Est gratuit', correct: false, feedback_si_choisi: 'Sentinel implique un coût Azure significatif à l\'ingestion.' }
          ],
          explication: 'Sentinel = SIEM / SOAR cloud, bâti sur Log Analytics. Puissant mais coûteux et hors périmètre E3+P2. Alternative valable : Log Analytics seul + KQL + alertes Azure Monitor + rapports Entra natifs.'
        },
        { id: 'q6', type: 'single', enonce: 'En KQL, quel opérateur agrège (count, dcount) ?', reference_cours: 'Section 3',
          choix: [
            { id: 'a', texte: '`where`', correct: false, feedback_si_choisi: '`where` filtre les lignes, il n\'agrège pas.' },
            { id: 'b', texte: '`project`', correct: false, feedback_si_choisi: '`project` sélectionne des colonnes, il n\'agrège pas.' },
            { id: 'c', texte: '`summarize`', correct: true },
            { id: 'd', texte: '`sort`', correct: false, feedback_si_choisi: '`sort by` trie les résultats, il n\'agrège pas.' }
          ],
          explication: '`summarize` est l\'équivalent de GROUP BY en SQL. Accepte count(), dcount() (distinct), sum(), avg(), max(), min()… avec la syntaxe `summarize agrégats by colonnes`.'
        },
        { id: 'q7', type: 'single', enonce: 'Pourquoi toujours mettre un filtre temporel (`ago`) ?', reference_cours: 'Section 3 + Piège 3',
          choix: [
            { id: 'a', texte: 'Pour la couleur', correct: false, feedback_si_choisi: 'Aucun impact visuel — c\'est une question de coût et de performance.' },
            { id: 'b', texte: 'Sans borne de temps, la requête scanne tout et coûte cher (ingestion facturée)', correct: true },
            { id: 'c', texte: 'C\'est optionnel et inutile', correct: false, feedback_si_choisi: 'C\'est au contraire l\'un des filtres les plus utiles à mettre en premier.' },
            { id: 'd', texte: 'Pour désactiver la MFA', correct: false, feedback_si_choisi: 'KQL ne désactive rien — c\'est un langage de lecture.' }
          ],
          explication: 'Chaque requête sans `ago()` scanne toute la table, jusqu\'à des mois de logs. Coût de traitement facturé + latence élevée. Toujours borner en premier filtre.'
        },
        { id: 'q8', type: 'single', enonce: 'Quelle alerte à forte valeur mettre en priorité ?', reference_cours: 'Section 4 + Piège 5',
          choix: [
            { id: 'a', texte: 'Toute connexion réussie', correct: false, feedback_si_choisi: 'Génère un flot ingérable de notifications, aucune valeur d\'alerte.' },
            { id: 'b', texte: 'La connexion d\'un compte break-glass (ne devrait jamais servir → incident)', correct: true },
            { id: 'c', texte: 'Chaque ouverture de OneDrive', correct: false, feedback_si_choisi: 'Trop bruyant, sans valeur d\'incident.' },
            { id: 'd', texte: 'Les changements de fond d\'écran', correct: false, feedback_si_choisi: 'Sans intérêt en sécurité.' }
          ],
          explication: 'Alerte rare, à haute valeur : les break-glass ne doivent jamais servir en routine. Leur usage = quelqu\'un s\'est verrouillé dehors (incident CA / MFA) ou compromission. À investiguer immédiatement.'
        },
        { id: 'q9', type: 'single', enonce: '`ResultType == 50126` dans SigninLogs correspond à :', reference_cours: 'Section 3',
          choix: [
            { id: 'a', texte: 'Une connexion réussie', correct: false, feedback_si_choisi: 'Une connexion réussie a ResultType == 0.' },
            { id: 'b', texte: 'Un mauvais mot de passe (utile pour détecter le spraying)', correct: true },
            { id: 'c', texte: 'Une modification de rôle', correct: false, feedback_si_choisi: 'Les modifications de rôle sont dans AuditLogs, pas SigninLogs.' },
            { id: 'd', texte: 'Un provisioning', correct: false, feedback_si_choisi: 'Le provisioning est dans AADProvisioningLogs, pas SigninLogs.' }
          ],
          explication: '50126 = « mauvais nom d\'utilisateur ou mot de passe ». C\'est le code le plus utile pour détecter le password spraying : beaucoup de 50126 depuis une IP, sur peu de comptes distincts, en peu de temps.'
        },
        { id: 'q10', type: 'single', enonce: 'Exporter des logs sans définir d\'alertes, c\'est :', reference_cours: 'Section 4 + Piège 5',
          choix: [
            { id: 'a', texte: 'Suffisant', correct: false, feedback_si_choisi: 'Non — des logs qui ne sont jamais lus n\'apportent aucune protection.' },
            { id: 'b', texte: 'Insuffisant : les logs ne servent que si on agit dessus (alertes à forte valeur)', correct: true },
            { id: 'c', texte: 'Interdit', correct: false, feedback_si_choisi: 'Rien ne l\'interdit — c\'est simplement inefficace.' },
            { id: 'd', texte: 'Recommandé', correct: false, feedback_si_choisi: 'Non recommandé : c\'est un piège classique.' }
          ],
          explication: 'Mieux vaut 3 alertes exploitées que 1000 dashboards ignorés. Définir en priorité : break-glass, password spraying, modifications de rôles à privilèges ou de politiques CA.'
        }
      ]
    };
  </script>
  <script src="assets/shared.js"></script>

  <script src="scorm2004-api.js"></script>
  <script src="scorm-bridge.js"></script>
</body>
</html>
