{"id":1266,"date":"2026-11-01T07:06:10","date_gmt":"2026-11-01T07:06:10","guid":{"rendered":"https:\/\/www.devopsschool.com\/tutorials\/?p=1266"},"modified":"2026-11-01T07:09:37","modified_gmt":"2026-11-01T07:09:37","slug":"microsoft-sentinel-intermediate-one-complete-end-to-end-hands-on-lab-part-3","status":"publish","type":"post","link":"https:\/\/www.devopsschool.com\/tutorials\/microsoft-sentinel-intermediate-one-complete-end-to-end-hands-on-lab-part-3\/","title":{"rendered":"Microsoft Sentinel Intermediate: One Complete End-to-End Hands-On Lab &#8211; Part &#8211; 3"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\">Module 2: Intermediate |&nbsp;<strong>Day 3 only<\/strong>&nbsp;| Complete instructor-and-learner manual<\/h2>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\"><strong>Edition:<\/strong>&nbsp;1 November 2026<br><strong>Course:<\/strong>&nbsp;Microsoft Sentinel Technical Training \u2014 5-day progressive curriculum<br><strong>This document:<\/strong>&nbsp;Day 3 only; prerequisite: successful completion of Foundations (Days 1\u20132)<br><strong>Primary user interface:<\/strong>&nbsp;Microsoft Defender portal (<code>https:\/\/security.microsoft.com<\/code>)<br><strong>Format:<\/strong>&nbsp;Day-wise, hands-on, step-by-step;&nbsp;<strong>no hourly timetable<\/strong><br><strong>Scope:<\/strong>&nbsp;I01\u2013I14, the 14&nbsp;<em>new<\/em>&nbsp;Intermediate competencies from the supplied agenda<br><strong>Lab safety:<\/strong>&nbsp;Authorized, isolated Azure environment and fictional data only<\/p>\n<\/blockquote>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">READ FIRST \u2014 verification, boundaries, and a credible PASS result<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>What has been checked:<\/strong>&nbsp;The procedures and navigation paths in this manual were researched against Microsoft Learn pages available on&nbsp;<strong>1 November 2026<\/strong>. Source-specific links are supplied beside each lab, and the source register is at the end. This document has been structurally and internally checked for syllabus coverage, complete examples, Markdown formatting, and evidence checkpoints.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>What cannot honestly be claimed:<\/strong>&nbsp;This manual was not run against your Azure tenant. The instructor must validate permissions, portal labels, region, features, data connector prerequisites, Linux distribution, actual field mappings, analytics rule scheduling, and billed usage in the assigned lab. A command appearing in the document is&nbsp;<em>not<\/em>&nbsp;evidence that it succeeded in your tenant.&nbsp;<strong>Never mark a cloud lab PASS without the observable evidence specified below.<\/strong>&nbsp;Some features change by tenant and license, and some remain in preview.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Do not use production identities, internet-routable test endpoints, actual threat infrastructure, active containment, or unapproved log ingestion.<\/strong>&nbsp;<code>198.51.100.23<\/code>&nbsp;and&nbsp;<code>203.0.113.10<\/code>&nbsp;are documentation-only addresses from TEST-NET ranges; they are&nbsp;<em>labels inside fictitious records<\/em>, not destinations to contact. Do not expose TCP\/UDP 514 to the public internet.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Day 3 complete means:<\/strong>&nbsp;Learner proves a second telemetry path (or an instructor-approved evidence-only substitution), correlates records from two relevant sources, enriches the result, publishes and tunes a controlled scheduled detection, configures low-risk incident-metadata automation, visualizes source quality, diagnoses failures, and produces an auditable final evidence pack. To earn the&nbsp;<strong>full operational PASS<\/strong>, the real connectors, rule, incident, and automation must actually produce the expected results. The offline synthetic track can award conceptual credit but not a claim of live deployment.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Source freshness and critical corrections to older tutorials<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Portal:<\/strong>\u00a0Microsoft says its Azure-portal Sentinel experience will no longer be supported after\u00a0<strong>31 March 2027<\/strong>. Teach the Defender portal first; Azure portal remains useful for Azure VM, network, agent, DCR and resource administration. [R01]<\/li>\n\n\n\n<li><strong>Collection:<\/strong>\u00a0Use\u00a0<strong>Syslog via AMA<\/strong>\u00a0and\u00a0<strong>Common Event Format (CEF) via AMA<\/strong>, with an explicit Data Collection Rule (DCR) and association. Avoid the retired legacy Log Analytics agent patterns. Facility and severity choices govern what enters the destination. [R02], [R03]<\/li>\n\n\n\n<li><strong>Threat intelligence:<\/strong>\u00a0New indicators belong in\u00a0<strong><code>ThreatIntelIndicators<\/code><\/strong>\u00a0(and STIX objects in\u00a0<code>ThreatIntelObjects<\/code>), not the formerly ingested\u00a0<code>ThreatIntelligenceIndicator<\/code>\u00a0table. The legacy TIP\/Graph indicator connector was announced for discontinuation in 2026; do not teach it as a new onboarding route. [R10], [R11]<\/li>\n\n\n\n<li><strong>UEBA:<\/strong>\u00a0Its enabling roles and supported sources must be checked. The current Defender experience has\u00a0<strong>Settings > Microsoft Sentinel > UEBA<\/strong>, with workspace anomaly detection configured separately where required. Activating UEBA creates additional telemetry and possible storage charges. [R12]<\/li>\n\n\n\n<li><strong>Analytics:<\/strong>\u00a0Scheduled rules must return\u00a0<strong><code>TimeGenerated<\/code><\/strong>\u00a0from source data. Enabling a rule does not automatically prove an alert or incident exists. Their evaluation can be affected by ingestion delay, lookback, result thresholds, grouping, and Defender integration. [R13], [R14]<\/li>\n\n\n\n<li><strong>Automation:<\/strong>\u00a0Day 3 uses\u00a0<strong>incident-metadata actions<\/strong>\u00a0(e.g., tag, owner, status) only; Logic Apps\/playbooks, approval gates, and disruptive remediation are Day 4 topics. Available trigger\/action combinations differ; alert-creation rules do\u00a0<strong>not<\/strong>\u00a0support the same metadata actions as incident-creation rules. [R15]<\/li>\n\n\n\n<li><strong>Workbooks:<\/strong>\u00a0Azure Monitor workbooks are workspace-associated Azure resources. Creation requires workbook-write permissions; Defender has its own viewer and some visualizations may route to Azure. [R16]<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\">5W1H learning contract for Day 3<\/h3>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th class=\"has-text-align-left\" data-align=\"left\">Lens<\/th><th class=\"has-text-align-left\" data-align=\"left\">Day 3 answer the learner must demonstrate<\/th><\/tr><\/thead><tbody><tr><td><strong>What<\/strong><\/td><td>AMA, Syslog, CEF, DCR, KQL correlation, watchlist, threat indicators, UEBA, custom detections, automation rules, workbooks<\/td><\/tr><tr><td><strong>Why<\/strong><\/td><td>Broaden coverage, improve evidential confidence, add asset\/business context, reduce unnecessary alerts, standardize safe SOC case handling<\/td><\/tr><tr><td><strong>Who<\/strong><\/td><td>Platform\/collector owner, connector engineer, detection author, watchlist steward, SOC analyst, SOC lead, approval authority<\/td><\/tr><tr><td><strong>When<\/strong><\/td><td>Ingest on agreed source need; correlate when separate signals share defensible keys; tune only with observed examples; automate after scoping<\/td><\/tr><tr><td><strong>Where<\/strong><\/td><td>Linux forwarding VM, DCR\/agent, Log Analytics workspace, Microsoft Sentinel configuration, Defender incident queue, workbook resource group<\/td><\/tr><tr><td><strong>How<\/strong><\/td><td>Authorized source \u2192 safe Linux test event \u2192 AMA+DCR \u2192&nbsp;<code>Syslog<\/code>\/<code>CommonSecurityLog<\/code>&nbsp;\u2192 KQL + watchlist \u2192 detection \u2192 incident automation \u2192 workbook + evidence<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Lab architecture (the arrows matter)<\/h3>\n\n\n\n<pre class=\"wp-block-preformatted\">configurationLinux demonstration eventsrsyslog or syslog-ngApproved firewall \/ CEF demoAzure Monitor AgentData Collection Rule + VM associationLog Analytics workspaceSyslog tableCommonSecurityLog tableTime-bounded KQL correlationSentinel watchlistScheduled analytics ruleDefender incidentMetadata-only automation ruleSource-health workbook<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Important distinction:<\/strong>&nbsp;A synthetic query that displays two&nbsp;<code>datatable()<\/code>&nbsp;tables does&nbsp;<strong>not<\/strong>&nbsp;prove AMA, CEF parsing, a DCR, a stored log, or a real alert. It is a teaching fallback only. The normal path below uses real&nbsp;<strong>test<\/strong>&nbsp;events created on a controlled lab VM.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">1. Instructor preparation (mandatory; complete before learners begin)<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">1.1 Continuity from Days 1\u20132<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Keep the same fictional tenant storyline,&nbsp;<strong>Aster Retail<\/strong>. Students completed Foundations and can already identify the Microsoft Entra tenant, subscription, resource group, Sentinel-enabled Log Analytics workspace, baseline KQL, basic built-in detection, and incident-triage workflow.&nbsp;<strong>Do not re-teach those labs.<\/strong>&nbsp;Verify their artifacts and move immediately to the&nbsp;<em>new<\/em>&nbsp;Intermediate tasks.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Scenario:<\/strong>&nbsp;A privileged account appears in a Linux audit-like application event, followed by a firewall denial from the same test source address. The SOC must correlate and interpret these signals, verify whether the identity is high value, classify a synthetic finding, create a tuned detector, assign the case safely, and visualize pipeline quality.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Scenario limitations:<\/strong>&nbsp;A shared IP plus a time window is not proof of a user&#8217;s identity. NAT, proxies, shared hosts, deliberate falsification, timing skew, and field parsing can create false links. The lab deliberately asks students to tighten correlation with an account field where the CEF parser supplies one.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">1.2 Choose and record the delivery track<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th class=\"has-text-align-left\" data-align=\"left\">Track<\/th><th class=\"has-text-align-left\" data-align=\"left\">What is available<\/th><th class=\"has-text-align-left\" data-align=\"left\">Can demonstrate<\/th><th class=\"has-text-align-left\" data-align=\"left\">Can claim<\/th><\/tr><\/thead><tbody><tr><td><strong>A \u2014 full Azure lab (recommended)<\/strong><\/td><td>Approved subscription; existing Sentinel workspace; Linux VM; allowed agent\/DCR\/write roles<\/td><td>Real Syslog, optional CEF, watchlist, rule, incident, metadata automation, workbook<\/td><td>Full operational PASS if all evidence gates pass<\/td><\/tr><tr><td><strong>B \u2014 instructor-managed shared lab<\/strong><\/td><td>Learners receive reader access + instructor controls one collector and writes<\/td><td>Full evidence chain, with separately attributable learner submissions<\/td><td>PASS on demonstrated competencies; infrastructure steps recorded as&nbsp;<em>instructor-operated<\/em><\/td><\/tr><tr><td><strong>C \u2014 restricted\/synthetic<\/strong><\/td><td>Query editor only, or instructor-supplied screenshots and CSV<\/td><td><code>datatable()<\/code>&nbsp;KQL, interpretation, simulated detection design, cost\/risk decisions<\/td><td>Conceptual PASS only;&nbsp;<strong>not<\/strong>&nbsp;live connector\/detection\/automation PASS<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Use&nbsp;<strong>A or B<\/strong>&nbsp;for a course advertised as fully hands-on. Track C must be disclosed clearly to students.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">1.3 Prerequisites and role ownership<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th class=\"has-text-align-left\" data-align=\"left\">Component\/action<\/th><th class=\"has-text-align-left\" data-align=\"left\">Preflight requirement<\/th><th class=\"has-text-align-left\" data-align=\"left\">Who verifies<\/th><\/tr><\/thead><tbody><tr><td>Microsoft Sentinel<\/td><td>Existing Sentinel-enabled Log Analytics workspace from Day 1; correct tenant and workspace<\/td><td>Instructor<\/td><\/tr><tr><td>Portal<\/td><td>Learner can access Defender portal and the workspace-specific Sentinel experience<\/td><td>Instructor<\/td><\/tr><tr><td>Linux VM<\/td><td>Instructor-approved Azure Linux VM using an AMA-supported OS;&nbsp;<code>rsyslog<\/code>&nbsp;or&nbsp;<code>syslog-ng<\/code>;&nbsp;<code>logger<\/code>, shell,&nbsp;<code>sudo<\/code>; accessible over Bastion or approved private SSH<\/td><td>Infrastructure owner<\/td><\/tr><tr><td>Azure Arc (only for non-Azure servers)<\/td><td>Azure Connected Machine agent, supported configuration, connectivity<\/td><td>Infrastructure owner<\/td><\/tr><tr><td>AMA installation<\/td><td>Permission to install VM extension; Microsoft guidance identifies VM Contributor \/ Azure Connected Machine Resource Administrator or equivalent<\/td><td>Azure administrator<\/td><\/tr><tr><td>DCR creation and association<\/td><td>Monitoring Contributor at appropriate scope (or equivalent operations) and access to selected VM<\/td><td>Azure administrator<\/td><\/tr><tr><td>Content hub<\/td><td>Permission to install needed Syslog \/ CEF solutions and access data connectors<\/td><td>Sentinel administrator<\/td><\/tr><tr><td>Detection authoring<\/td><td>Microsoft Sentinel Contributor or appropriate workspace\/resource-group write permissions<\/td><td>Sentinel administrator<\/td><\/tr><tr><td>Watchlist creation<\/td><td>Sufficient Sentinel workspace write permissions to create\/manage watchlists<\/td><td>Sentinel administrator<\/td><\/tr><tr><td>Incident operations<\/td><td>Permitted Defender\/Sentinel incident-management role, owner\/team as applicable<\/td><td>SOC lead<\/td><\/tr><tr><td>Workbook<\/td><td>At least Workbook Contributor on the workspace resource group for writing; Workbook Reader for reading<\/td><td>Azure administrator<\/td><\/tr><tr><td>UEBA&nbsp;<strong>enablement<\/strong>&nbsp;(optional)<\/td><td>Microsoft Entra Security Administrator&nbsp;<em>or equivalent<\/em>&nbsp;plus required Azure role, no blocking workspace lock; not needed merely to read existing UEBA results<\/td><td>Identity\/Sentinel administrator<\/td><\/tr><tr><td>Threat intelligence&nbsp;<strong>onboarding<\/strong>&nbsp;(optional)<\/td><td>Valid licensed\/approved feed, correct connector\/API, legal authority to use it<\/td><td>TI owner<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Do not assign Owner or Tenant Global Administrator broadly just to get a lab working.<\/strong>&nbsp;Have the instructor perform privileged steps where delegated access is unavailable. Role prerequisites are not interchangeable: VM and DCR administration are Azure control-plane activities; incident analysis and rule authoring have separate RBAC boundaries. [R02], [R12], [R13], [R16]<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">1.4 Safe naming and configuration record<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Before beginning, instructor fills this&nbsp;<em>actual<\/em>&nbsp;environment sheet:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th class=\"has-text-align-left\" data-align=\"left\">Field<\/th><th class=\"has-text-align-left\" data-align=\"left\">Actual value (fill before class)<\/th><\/tr><\/thead><tbody><tr><td>Training tenant (non-secret label)<\/td><td><code>________________<\/code><\/td><\/tr><tr><td>Azure subscription (friendly name)<\/td><td><code>________________<\/code><\/td><\/tr><tr><td>Region (Log Analytics + chosen VM)<\/td><td><code>________________<\/code><\/td><\/tr><tr><td>Resource group (existing or new dedicated)<\/td><td><code>rg-sentinel-d3-lab-&lt;cohort&gt;<\/code><\/td><\/tr><tr><td>Workspace name (Day 1)<\/td><td><code>________________<\/code><\/td><\/tr><tr><td>Linux collector VM<\/td><td><code>vm-sentinel-d3-&lt;cohort&gt;<\/code><\/td><\/tr><tr><td>OS + release (<code>cat \/etc\/os-release<\/code>)<\/td><td><code>________________<\/code><\/td><\/tr><tr><td>Agent extension state<\/td><td><code>________________<\/code><\/td><\/tr><tr><td>Syslog DCR name<\/td><td><code>dcr-sentinel-d3-syslog<\/code><\/td><\/tr><tr><td>CEF DCR name (if used)<\/td><td><code>dcr-sentinel-d3-cef<\/code><\/td><\/tr><tr><td>Watchlist alias<\/td><td><code>day3_privileged_accounts<\/code><\/td><\/tr><tr><td>Rule name<\/td><td><code>SENTINEL-D3-LAB-Privileged-Source-Correlation<\/code><\/td><\/tr><tr><td>Automation name<\/td><td><code>SENTINEL-D3-LAB-Tag-And-Assign<\/code><\/td><\/tr><tr><td>Workbook name<\/td><td><code>Sentinel D3 - Source Quality and Correlation<\/code><\/td><\/tr><tr><td>Temporary owner (valid SOC user)<\/td><td><code>________________<\/code><\/td><\/tr><tr><td>Approved maximum ingestion \/ cost budget<\/td><td><code>________________<\/code><\/td><\/tr><tr><td>Planned cleanup owner<\/td><td><code>________________<\/code><\/td><\/tr><tr><td>Allowed lab source IPs\/networks<\/td><td><code>________________<\/code><\/td><\/tr><tr><td>Source mode<\/td><td><code>Syslog direct \/ Syslog+CEF \/ approved evidence-only<\/code><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Keep an&nbsp;<strong>artifact register<\/strong>: DCR names\/IDs, extensions, solution installs, generated test marker, created analytics and automation rules, workbook, watchlist, and temporary VM. Without this register, safe cleanup is hard.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">1.5 Financial, security, and data-protection gates<\/h2>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Confirm subscription and resource-group budget alerts, VM SKU\/hourly charge, Log Analytics ingestion\/retention charge, possible Sentinel pricing, and whether connector data is billable. Do not assert this is a free lab.<\/li>\n\n\n\n<li>Use a small, shut-down-capable VM and minimal bounded test events; do not activate all facilities globally to &#8216;see what happens&#8217;.<\/li>\n\n\n\n<li>Require an approved region and data residency posture. Use only fictitious data.<\/li>\n\n\n\n<li>Prefer Bastion\/private network access;\u00a0<strong>do not open port 514 publicly<\/strong>. For localhost-injected messages, there is no need for a public network listener.<\/li>\n\n\n\n<li>Log ingestion and DCR updates can affect data volume, noise and charges. Instructor approval required before expanding facilities\/levels.<\/li>\n\n\n\n<li>No actual account lockouts, firewall blocking, disabling identities, emailing outsiders, or Logic Apps playbooks in Day 3.<\/li>\n\n\n\n<li>Decide cleanup before beginning: will the trainer delete only Day 3 resources, keep the Day 1\u20132 workspace, or remove an entire dedicated lab RG?\u00a0<strong>Never delete a shared workspace by accident.<\/strong><\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\">Instructor readiness checklist<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>[ ] Day 1\/2 learner progression already passed or equivalent evidence reviewed.<\/li>\n\n\n\n<li>[ ] Correct Sentinel workspace and selected Linux VM are documented.<\/li>\n\n\n\n<li>[ ] VM OS is compatible with current AMA support; VM connectivity is healthy.<\/li>\n\n\n\n<li>[ ] Agent\/DCR\/Content hub permissions are assigned or an instructor executor is present.<\/li>\n\n\n\n<li>[ ] At least one route to a real connector exists; alternative track announced if not.<\/li>\n\n\n\n<li>[ ] No production data source or public port 514 is included.<\/li>\n\n\n\n<li>[ ] Lab budget and acceptable telemetry rate are approved.<\/li>\n\n\n\n<li>[ ] A valid incident owner exists for automation lab.<\/li>\n\n\n\n<li>[ ] The instructor can open Log Analytics query editor, Analytics, Automation and Workbooks.<\/li>\n\n\n\n<li>[ ] Optional threat-intelligence and UEBA permissions\/charges are separately approved.<\/li>\n\n\n\n<li>[ ] Screenshots may capture only fictitious lab data and non-sensitive resource details.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">1.6 How the learner records actual evidence<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Use this template at the end of&nbsp;<strong>every<\/strong>&nbsp;lab. Do not replace an empty result with a guessed result.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Lab ID:\nOperator \/ learner:\nWorkspace (friendly name):\nUTC start\/end:\nDelivery track: A \/ B \/ C\nExecuted steps (deviations and screenshots):\nQuery \/ command run:\nActual evidence (table, result count, name, timestamp):\nExpected vs observed:\nTroubleshooting performed:\nInstructor witness:\nVerdict: PASS \/ PARTIAL (reason) \/ BLOCKED (reason) \/ FAIL\nCreated artifacts for cleanup:\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The instructor owns raw screenshots and grading records.&nbsp;<strong>Do not place keys, tokens, secrets or privileged connection strings in evidence.<\/strong>&nbsp;Redact subscription IDs if evidence will leave the organization.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">2. Navigation map and required competencies<\/h1>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th class=\"has-text-align-left\" data-align=\"left\">Lab<\/th><th class=\"has-text-align-left\" data-align=\"left\">Syllabus<\/th><th class=\"has-text-align-left\" data-align=\"left\">Main artifact \/ observable result<\/th><th class=\"has-text-align-left\" data-align=\"left\">Hands-on track<\/th><\/tr><\/thead><tbody><tr><td>D3-L01<\/td><td>I01<\/td><td>Source-selection decision record<\/td><td>All<\/td><\/tr><tr><td>D3-L02<\/td><td>I02<\/td><td>Linux VM + AMA\/DCR + Syslog evidence<\/td><td>A\/B<\/td><\/tr><tr><td>D3-L03<\/td><td>I02\u2013I03<\/td><td>CEF collector test or documented alternative; multicloud path matrix<\/td><td>A\/B\/C<\/td><\/tr><tr><td>D3-L04<\/td><td>I04<\/td><td>Ingestion quality evidence and data-fidelity report<\/td><td>A\/B\/C<\/td><\/tr><tr><td>D3-L05<\/td><td>I05<\/td><td>Reproducible KQL composition workbook \/ query pack<\/td><td>All<\/td><\/tr><tr><td>D3-L06<\/td><td>I06<\/td><td>Two-source time-bounded correlation with limitations<\/td><td>A\/B\/C<\/td><\/tr><tr><td>D3-L07<\/td><td>I07<\/td><td>Governed CSV watchlist + enriched query<\/td><td>A\/B\/C<\/td><\/tr><tr><td>D3-L08<\/td><td>I08<\/td><td>Indicator verification and contextual decision<\/td><td>All; live TI optional<\/td><\/tr><tr><td>D3-L09<\/td><td>I09<\/td><td>UEBA context or validated no-UEBA fallback<\/td><td>All; live UEBA optional<\/td><\/tr><tr><td>D3-L10<\/td><td>I10<\/td><td>Scheduled custom rule, alert, and incident<\/td><td>A\/B<\/td><\/tr><tr><td>D3-L11<\/td><td>I11<\/td><td>Replayed positive\/negative test cases; measured tuning<\/td><td>A\/B\/C<\/td><\/tr><tr><td>D3-L12<\/td><td>I12<\/td><td>Low-risk incident metadata automation; audit evidence<\/td><td>A\/B<\/td><\/tr><tr><td>D3-L13<\/td><td>I13<\/td><td>New source-health\/correlation workbook<\/td><td>A\/B<\/td><\/tr><tr><td>D3-L14<\/td><td>I14<\/td><td>Multi-layer fault isolation and remediation journal<\/td><td>All<\/td><\/tr><tr><td>D3-CAP<\/td><td>I01\u2013I14<\/td><td>Final assessment + 100-point evidence rubric<\/td><td>All; operational PASS only A\/B<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Dependency chain:<\/strong>&nbsp;L02 Syslog \u2192 L03 CEF (optional but recommended) \u2192 L04 quality \u2192 L05 KQL \u2192 L06 correlation \u2192 L07 enrichment \u2192 L10 detection \u2192 L11 tuning \u2192 L12 incident automation \u2192 L13 workbook \u2192 L14 troubleshooting \u2192 capstone. L08 and L09 add context if approved; do not block the core lab because a TI provider or licensed source is absent.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">DAY 3 \u2014 INTERMEDIATE HANDS-ON LABS<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">D3-L01 \u2014 Choose collection patterns for a realistic security estate (I01)<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Competency:<\/strong>&nbsp;Choose API, managed connector, agent-based, or syslog-forwarder intake based on source type, operational ownership, data quality, cost and compliance. Not a repeat of the Day 1 starter Microsoft connector.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Prerequisite:<\/strong>&nbsp;The learner can access the appropriate Sentinel workspace and its Data connectors listing.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Exact guided procedure<\/strong><\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Sign in to\u00a0<strong>Microsoft Defender portal<\/strong>\u00a0at\u00a0<code>https:\/\/security.microsoft.com<\/code>; ensure the intended tenant is active.<\/li>\n\n\n\n<li>Navigate to\u00a0<strong>Microsoft Sentinel > Configuration > Data connectors<\/strong>. Confirm the configured workspace; don&#8217;t assume a connector belongs to the workspace you intended. [R01], [R02]<\/li>\n\n\n\n<li>Record the installed and available\u00a0<strong>Syslog via AMA<\/strong>,\u00a0<strong>Common Event Format (CEF) via AMA<\/strong>, and approved third-party connectors (if visible). If a connector is absent, check whether its solution must first be installed from\u00a0<strong>Microsoft Sentinel > Content management > Content hub<\/strong>.<\/li>\n\n\n\n<li>For each candidate source, record its transport, logs generated, destination table, authentication, upstream agent needs, owner, service\/VM cost, estimated volume, and who signs off.<\/li>\n\n\n\n<li>Build the table below, changing only the\u00a0<em>selection<\/em>\u00a0to suit your actual environment.<\/li>\n<\/ol>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th class=\"has-text-align-left\" data-align=\"left\">Source<\/th><th class=\"has-text-align-left\" data-align=\"left\">Preferred intake<\/th><th class=\"has-text-align-left\" data-align=\"left\">Destination (confirm in connector)<\/th><th class=\"has-text-align-left\" data-align=\"left\">Limitation \/ acceptance criterion<\/th><\/tr><\/thead><tbody><tr><td>Azure subscription control-plane audit<\/td><td>Existing Day 1 Azure Activity<\/td><td><code>AzureActivity<\/code><\/td><td>No need to reconnect for Day 3<\/td><\/tr><tr><td>Linux system\/application syslog<\/td><td>Syslog via AMA + DCR<\/td><td><code>Syslog<\/code><\/td><td>Supported Linux VM; facilities\/severity correctly selected<\/td><\/tr><tr><td>Firewall emitting CEF<\/td><td>CEF via AMA + Linux forwarder + DCR<\/td><td><code>CommonSecurityLog<\/code><\/td><td>Vendor product mapping; separate facility, no duplicate ingest<\/td><\/tr><tr><td>AWS CloudTrail (if approved)<\/td><td>Supported Microsoft\/partner CloudTrail solution\/connector<\/td><td>Source-specific, inspect connector<\/td><td>Cloud-side authorization + region\/account governance<\/td><\/tr><tr><td>GCP audit or other SaaS<\/td><td>Supported connector\/API or Logs Ingestion API<\/td><td>Connector-specific<\/td><td>Authentication, event coverage, field mapping<\/td><\/tr><tr><td>Vendor application without connector<\/td><td>Ingestion API\/custom integration only after design review<\/td><td>Custom table if designed<\/td><td>Contract, parsing, schema, ownership, costs<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<ol start=\"6\" class=\"wp-block-list\">\n<li>Mark which additional data you will really ingest\u00a0<strong>today<\/strong>. The reference lab uses a Linux syslog source and (where possible) a synthetic CEF firewall source.<\/li>\n\n\n\n<li>Compare two alternatives: API\/managed integration versus a collector\/agent. Write why one is safer\/cheaper\/more maintainable for the selected source.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>PASS D3-L01:<\/strong>&nbsp;Student submits the decision matrix and correctly distinguishes source availability from&nbsp;<em>active ingestion<\/em>.&nbsp;<strong>Not a PASS:<\/strong>&nbsp;Merely finding a connector tile.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Troubleshooting:<\/strong>&nbsp;Missing connector \u2192 check Content hub solution and permissions; wrong tenant\/workspace \u2192 switch explicitly; no connector available \u2192 select documented offline pattern and mark operational integration BLOCKED.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Reference:<\/strong>&nbsp;[R02], [R03], [R04].<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">D3-L02 \u2014 Provision\/validate Linux collector; configure AMA, DCR, and Syslog (I02)<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Competency:<\/strong>&nbsp;Prove that the second telemetry pipeline exists end-to-end. This is the&nbsp;<strong>first indispensable live lab<\/strong>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">A. Prepare an isolated Linux VM<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Instructor creates or provides an\u00a0<strong>Azure virtual machine<\/strong>\u00a0with an OS explicitly supported by current Azure Monitor Agent for Linux. Prefer a small Ubuntu LTS\/RHEL-class image only after verifying the AMA compatibility list in [R05]; don&#8217;t blindly choose &#8216;latest&#8217; or use an arbitrary distro.<\/li>\n\n\n\n<li>Place VM in the approved training subscription, resource group, region and private network. Use private SSH or Azure Bastion. Do not give the VM a public 514 rule.<\/li>\n\n\n\n<li>Confirm the VM is running, has DNS\/HTTPS connectivity to required Azure Monitor endpoints, and has available disk space. Restrict SSH to authorized principals. An Arc-enabled non-Azure alternative is acceptable only when Azure Arc Connected Machine agent is already healthy.<\/li>\n\n\n\n<li>Open an SSH\/Bastion terminal and record the host\/version:<\/li>\n<\/ol>\n\n\n\n<pre class=\"wp-block-code\"><code>cat \/etc\/os-release\nuname -a\nhostname -f || hostname\nid\npython3 --version\ncommand -v logger\ncommand -v rsyslogd || command -v syslog-ng\n<\/code><\/pre>\n\n\n\n<ol start=\"5\" class=\"wp-block-list\">\n<li>For Ubuntu with\u00a0<code>rsyslog<\/code>\u00a0installed, check services. If not installed, use the distribution&#8217;s supported package mechanism after instructor approval;\u00a0<strong>do not run a downloaded opaque shell script without reviewing its current Microsoft-generated contents<\/strong>.<\/li>\n<\/ol>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo systemctl status rsyslog --no-pager || true\nsudo systemctl status syslog-ng --no-pager || true\nsudo systemctl status azuremonitoragent --no-pager || true\n<\/code><\/pre>\n\n\n\n<ol start=\"6\" class=\"wp-block-list\">\n<li>Record which syslog daemon actually runs. Avoid running\u00a0<code>rsyslog<\/code>\u00a0and\u00a0<code>syslog-ng<\/code>\u00a0concurrently on the same listener unless explicitly designed. If\u00a0<code>logger<\/code>\u00a0is missing, have the administrator install the distro&#8217;s\u00a0<code>util-linux<\/code>\u00a0package using an approved method.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Expected evidence:<\/strong>&nbsp;Operating-system identification, syslog daemon active, authorized VM access, VM resource ID and subscription recorded. AMA may not yet be installed at this stage.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">B. Make the Syslog connector available<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li>In Defender portal, open\u00a0<strong>Microsoft Sentinel > Content management > Content hub<\/strong>.<\/li>\n\n\n\n<li>Search for the\u00a0<strong>Syslog<\/strong>\u00a0solution; install\/update the supported solution\u00a0<strong>only in the training workspace<\/strong>\u00a0if the required connector is absent. Confirm installation completed.<\/li>\n\n\n\n<li>Go to\u00a0<strong>Microsoft Sentinel > Configuration > Data connectors<\/strong>, search for\u00a0<strong>Syslog via AMA<\/strong>, open the connector page. If none appears, revisit solution installation\/permissions rather than guessing a similarly named legacy connector. [R02]<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\">C. Create and attach the Data Collection Rule<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li>From the\u00a0<strong>Syslog via AMA connector page<\/strong>, choose\u00a0<strong>+ Create data collection rule<\/strong>.<\/li>\n\n\n\n<li><strong>Basics:<\/strong>\u00a0enter\u00a0<code>dcr-sentinel-d3-syslog<\/code>\u00a0(append cohort suffix if name already used); choose approved subscription\/resource group.<\/li>\n\n\n\n<li><strong>Resources:<\/strong>\u00a0choose the actual Linux VM. For Azure VM, the host should be visible. For non-Azure host, confirm Arc connection first. Do not select other machines.<\/li>\n\n\n\n<li><strong>Collect:<\/strong>\u00a0choose only\u00a0<strong>facility\u00a0<code>local5<\/code><\/strong>\u00a0and severity\u00a0<strong>Warning<\/strong>\u00a0(this also covers more severe messages). If the current wizard presents a different facility list, locate and record\u00a0<code>local5<\/code>; do not select all facilities as a workaround.<\/li>\n\n\n\n<li>Review the selected stream\/destination and the\u00a0<strong>correct target workspace<\/strong>. Create the DCR.<\/li>\n\n\n\n<li>Refresh the connector page and verify the DCR is listed and linked to the correct VM. Azure&#8217;s extension installation may be initiated automatically from this workflow; check\u00a0<strong>Azure portal > VM > Extensions + applications<\/strong>\u00a0and ensure\u00a0<code>AzureMonitorLinuxAgent<\/code>\u00a0reaches\u00a0<strong>Provisioning succeeded<\/strong>. [R02], [R06]<\/li>\n\n\n\n<li>In Azure portal, open\u00a0<strong>Monitor > Data Collection Rules<\/strong>, select this DCR, and verify its resource association, facility-level selection, and destination. Screenshot the\u00a0<strong>actual<\/strong>\u00a0association, not only the DCR name.<\/li>\n\n\n\n<li>On Linux, re-check agent service and host resources:<\/li>\n<\/ol>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo systemctl is-active azuremonitoragent || true\nsudo systemctl is-active rsyslog || true\nsudo systemctl is-active syslog-ng || true\ndf -h \/\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Expected evidence:<\/strong>&nbsp;AMA service is active&nbsp;<em>or<\/em>&nbsp;extension provisioning is successful as documented; DCR association includes the selected VM; allowed&nbsp;<code>local5<\/code>\/Warning filter and intended destination are visible.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">D. Send a bounded, harmless Syslog test message<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Define a unique training marker; write it down so your queries can isolate this run:<\/li>\n<\/ol>\n\n\n\n<pre class=\"wp-block-code\"><code>DAY3_RUN_ID=\"D3-$(date -u +%Y%m%dT%H%M%SZ)\"\necho \"$DAY3_RUN_ID\"\n<\/code><\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li>On the selected VM, send\u00a0<strong>one<\/strong>\u00a0local application-style event. This is not an actual privileged login, and its fictional source IP will never be contacted:<\/li>\n<\/ol>\n\n\n\n<pre class=\"wp-block-code\"><code>logger -p local5.warning -t SENTINEL_D3 \\\n  \"SENTINEL_D3_LAB run=${DAY3_RUN_ID} actor=lab.admin@asterretail.example src=198.51.100.23 outcome=success event=privileged_session\"\n<\/code><\/pre>\n\n\n\n<ol start=\"3\" class=\"wp-block-list\">\n<li>Check the local system journal or syslog, depending on distribution. Some distributions won&#8217;t write this local facility to\u00a0<code>\/var\/log\/syslog<\/code>; do not infer collection failure solely from an absent file.<\/li>\n<\/ol>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo journalctl -t SENTINEL_D3 --since \"20 minutes ago\" --no-pager | tail -n 15\n<\/code><\/pre>\n\n\n\n<ol start=\"4\" class=\"wp-block-list\">\n<li>In the correct\u00a0<strong>workspace Logs<\/strong>\u00a0query experience, run the query below. Replace\u00a0<code>D3-REPLACE-THIS<\/code>\u00a0with the exact printed run ID. Remember that ingested records can arrive asynchronously; Microsoft&#8217;s connector troubleshooting guidance allows\u00a0<strong>up to about 20 minutes<\/strong>. [R02], [R06]<\/li>\n<\/ol>\n\n\n\n<pre class=\"wp-block-code\"><code>Syslog\n| where TimeGenerated &gt;= ago(2h)\n| where SyslogMessage contains \"SENTINEL_D3_LAB\"\n| where SyslogMessage contains \"D3-REPLACE-THIS\"\n| project TimeGenerated, Computer, Facility, SeverityLevel, ProcessName, SyslogMessage\n| order by TimeGenerated desc\n<\/code><\/pre>\n\n\n\n<ol start=\"5\" class=\"wp-block-list\">\n<li>If rows are not present, run the broad scoping query to distinguish ingestion from an over-tight filter:<\/li>\n<\/ol>\n\n\n\n<pre class=\"wp-block-code\"><code>Syslog\n| where TimeGenerated &gt;= ago(2h)\n| summarize Count=count(), Latest=max(TimeGenerated) by Computer, Facility, SeverityLevel\n| order by Latest desc\n<\/code><\/pre>\n\n\n\n<ol start=\"6\" class=\"wp-block-list\">\n<li>Use a\u00a0<strong>UTC<\/strong>\u00a0timestamp in the evidence register and record actual ingestion latency if\u00a0<code>ingestion_time()<\/code>\u00a0is available (see L04). Never change the selected workspace mid-test.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>PASS D3-L02:<\/strong>&nbsp;DCR + VM association evidence, healthy agent\/daemon, an observed row with the unique marker in the&nbsp;<strong>destination&nbsp;<code>Syslog<\/code>&nbsp;table<\/strong>, and its&nbsp;<code>TimeGenerated<\/code>.&nbsp;<strong>PARTIAL:<\/strong>&nbsp;only host-level logger evidence.&nbsp;<strong>BLOCKED:<\/strong>&nbsp;inability to install agent or access workspace.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Diagnostic sequence:<\/strong>&nbsp;no Linux emission \u2192 fix&nbsp;<code>logger<\/code>\/syslog daemon; missing agent extension \u2192 check Azure VM scope\/role; missing DCR association \u2192 assign right VM; wrong facility or severity \u2192 correct narrow DCR; no workspace rows \u2192 inspect endpoint access, AMA logs, workspace and allowed processing delay.&nbsp;<strong>Do not &#8216;fix&#8217; this by collecting everything.<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Sources:<\/strong>&nbsp;[R02], [R03], [R05], [R06].<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">D3-L03 \u2014 Collect a synthetic CEF firewall signal and compare multicloud options (I02, I03)<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Competency:<\/strong>&nbsp;Explain raw Syslog versus CEF, add a second class of telemetry without facility collision, and select supported third-party\/multicloud collection paths.&nbsp;<strong>No real firewall is required<\/strong>\u2014only a lab-generated CEF-format message.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">A. Plan the forwarding route before changing it<\/h3>\n\n\n\n<pre class=\"wp-block-preformatted\">Approved synthetic CEF via loggerLocal UDP 514 listenerrsyslog \/ syslog-ngAMA local receiving endpointCEF DCR: local4 Warning+CommonSecurityLog<\/pre>\n\n\n\n<ol class=\"wp-block-list\">\n<li>On the Linux collector from L02, verify that\u00a0<code>rsyslog<\/code>\u00a0or\u00a0<code>syslog-ng<\/code>\u00a0is installed and\u00a0<code>azuremonitoragent<\/code>\u00a0is healthy.<\/li>\n\n\n\n<li>In Defender portal open\u00a0<strong>Microsoft Sentinel > Content management > Content hub<\/strong>, locate the\u00a0<strong>Common Event Format<\/strong>\u00a0(CEF) solution and install it if required. Then open\u00a0<strong>Microsoft Sentinel > Configuration > Data connectors > Common Event Format (CEF) via AMA<\/strong>. [R02]<\/li>\n\n\n\n<li>Create a DCR named\u00a0<code>dcr-sentinel-d3-cef<\/code>\u00a0using the same approved subscription, destination workspace and\u00a0<strong>only the intended lab Linux VM<\/strong>.<\/li>\n\n\n\n<li>In\u00a0<strong>Collect<\/strong>, choose facility\u00a0<strong><code>local4<\/code><\/strong>\u00a0with minimum severity\u00a0<strong>Warning<\/strong>. It must\u00a0<em>not<\/em>\u00a0overlap the\u00a0<strong><code>local5<\/code><\/strong>\u00a0Syslog DCR from L02. Where the portal provides stream\/destination details, confirm CEF target stream\u00a0<strong><code>Microsoft-CommonSecurityLog<\/code><\/strong>\u00a0(destination table\u00a0<code>CommonSecurityLog<\/code>) rather than generic\u00a0<code>Syslog<\/code>.<\/li>\n\n\n\n<li>Create the DCR and verify it is associated with the VM. Confirm the AMA extension succeeded. Record whether two DCRs are associated with this single VM, and check they don&#8217;t collect the same facility into both streams. [R02], [R03]<\/li>\n\n\n\n<li>If the host is acting as a Syslog\/CEF log\u00a0<strong>forwarder<\/strong>, follow the\u00a0<strong>current installation script shown on that exact connector page<\/strong>\u00a0to configure your chosen syslog daemon and forwarding\/listening behavior.\u00a0<strong>Inspect the script in the UI and have the instructor authorize it before execution.<\/strong>\u00a0Do not paste a stale URL\/script from an older tutorial. This can modify rsyslog\/syslog-ng files and open a local listener.<\/li>\n\n\n\n<li>Verify the listener from the Linux machine:<\/li>\n<\/ol>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo systemctl status azuremonitoragent --no-pager\nsudo systemctl status rsyslog --no-pager || true\nsudo systemctl status syslog-ng --no-pager || true\nsudo ss -lunp | grep ':514' || true\nsudo ss -ltnp | grep -E '(:28330|:514)' || true\n<\/code><\/pre>\n\n\n\n<ol start=\"8\" class=\"wp-block-list\">\n<li>If no UDP 514 listener exists, return to the currently documented connector\/daemon configuration.\u00a0<strong>Do not set\u00a0<code>0.0.0.0:514<\/code>\u00a0on an internet-accessible host just to make the test pass.<\/strong>\u00a0Use a private Linux host and local injection.<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\">B. Emit one controlled CEF message<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">In the same Linux host terminal, execute the following. Its field values are fictitious; the logger sends to localhost only. The syntax follows the structure of Microsoft&#8217;s CEF-via-AMA test instructions; actual parsing must still be verified on the workspace. [R02], [R06]<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>logger -p local4.warning -P 514 -n 127.0.0.1 --rfc3164 -t CEF \\\n  '0|AsterLab|Firewall|1.0|D3-100|Privileged source was denied|5|src=198.51.100.23 dst=203.0.113.10 suser=lab.admin@asterretail.example act=deny msg=SENTINEL_D3_LAB'\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Why&nbsp;<code>-t CEF<\/code>&nbsp;rather than putting&nbsp;<code>CEF:<\/code>&nbsp;into an arbitrary shell string?<\/strong>&nbsp;With the Microsoft-documented&nbsp;<code>logger<\/code>&nbsp;approach, the syslog application tag is used to construct the expected RFC-style payload. Third-party devices may produce a different but valid envelope; inspect the actual raw payload on a test host if parsing fails.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">In the workspace Logs editor:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>CommonSecurityLog\n| where TimeGenerated &gt;= ago(2h)\n| where DeviceVendor == \"AsterLab\" and DeviceProduct == \"Firewall\"\n| project TimeGenerated, Computer, DeviceVendor, DeviceProduct,\n          DeviceEventClassID, Activity, DeviceAction,\n          SourceIP, DestinationIP, SourceUserName\n| order by TimeGenerated desc\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Expected:<\/strong>&nbsp;At least one new&nbsp;<code>CommonSecurityLog<\/code>&nbsp;record with&nbsp;<code>DeviceVendor = AsterLab<\/code>,&nbsp;<code>DeviceProduct = Firewall<\/code>, and&nbsp;<code>SourceIP = 198.51.100.23<\/code>.&nbsp;<strong>Verify<\/strong>&nbsp;whether the parser populated&nbsp;<code>SourceUserName<\/code>&nbsp;from&nbsp;<code>suser<\/code>&nbsp;and&nbsp;<code>DeviceAction<\/code>&nbsp;from&nbsp;<code>act<\/code>; different product schemas and parsers can alter field names\/values. A Syslog event without parsed CEF columns is&nbsp;<strong>not<\/strong>&nbsp;the same as successful CEF parsing.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">If the correct CEF fields have not appeared, wait for the documented processing window then follow L14. Do not keep replaying unbounded messages. Use the diagnostic KQL below to check whether the data appeared as generic Syslog instead:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Syslog\n| where TimeGenerated &gt;= ago(2h)\n| where SyslogMessage contains \"AsterLab\" or SyslogMessage contains \"D3-100\"\n| project TimeGenerated, Computer, Facility, ProcessName, SyslogMessage\n| order by TimeGenerated desc\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">An appearance&nbsp;<strong>only<\/strong>&nbsp;in&nbsp;<code>Syslog<\/code>&nbsp;suggests a CEF stream\/facility\/parser\/configuration issue. It may also be normal for the current DCR&#8217;s intended design; check exactly what you configured rather than assuming the connector is wrong.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">C. Instructor walkthrough: multi-cloud and third-party collection choices<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">For each hypothetical environment below, find the currently supported integration route in Content hub. Do&nbsp;<strong>not<\/strong>&nbsp;connect live tenants to the lab without written authorization.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th class=\"has-text-align-left\" data-align=\"left\">Estate<\/th><th class=\"has-text-align-left\" data-align=\"left\">Source-side prerequisite to discuss<\/th><th class=\"has-text-align-left\" data-align=\"left\">Typical destination consideration<\/th><th class=\"has-text-align-left\" data-align=\"left\">Mandatory mapping questions<\/th><\/tr><\/thead><tbody><tr><td>AWS CloudTrail<\/td><td>Account\/region coverage; bucket\/event delivery; least privilege<\/td><td>CloudTrail connector\/solution&#8217;s documented table<\/td><td>API vs data event selection; timestamps; cross-account scope<\/td><\/tr><tr><td>GCP Cloud Audit Logs<\/td><td>GCP project\/org permissions and delivery mechanism<\/td><td>GCP connector or approved log pipeline<\/td><td>Principal identity, resource hierarchy, event category<\/td><\/tr><tr><td>Firewall \/ NDR<\/td><td>CEF-compatible device or collector; networking<\/td><td><code>CommonSecurityLog<\/code>&nbsp;if connector uses CEF<\/td><td>Which field contains source IP\/action\/user? NAT?<\/td><\/tr><tr><td>Identity SaaS<\/td><td>Supported provider connector, API or streaming integration<\/td><td>Connector-specific logs<\/td><td>Principal naming; failure codes; service-account exclusion<\/td><\/tr><tr><td>Custom app<\/td><td>Design-reviewed DCR + Logs Ingestion API \/ partner route<\/td><td>Explicitly named custom table<\/td><td>Schema and transformation; event-time; pagination; retries<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>PASS D3-L03:<\/strong>&nbsp;Student demonstrates a parsed test CEF record&nbsp;<strong>or<\/strong>&nbsp;provides an instructor-authorized alternate-source evidence record with honest reason; plus a completed multicloud selection matrix.&nbsp;<strong>Full live correlation assessment still needs two appropriate actual sources.<\/strong>&nbsp;Do not claim that listing AWS or GCP connectors constitutes onboarding them.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Troubleshooting:<\/strong>&nbsp;<code>logger<\/code>&nbsp;rejected&nbsp;<code>--rfc3164<\/code>&nbsp;\u2192 inspect&nbsp;<code>logger --help<\/code>&nbsp;and use an approved supported Linux utility; port 514 not listening \u2192 inspect Microsoft script\/rsyslog config and listen address; record only in Syslog \u2192 check CEF facility (<code>local4<\/code>), stream and header; record nowhere \u2192 packet\/daemon\/agent\/DCR\/egress checks. Consult [R02], [R03], [R06].<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">D3-L04 \u2014 Test the ingestion pipeline for fidelity, timeliness, and duplicates (I04)<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Competency:<\/strong>&nbsp;Determine whether data is usable for detections; separate \u201cevents are present\u201d from \u201cthe source is trustworthy.\u201d<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">A. Confirm basic coverage and freshness<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li>In Logs, select the correct workspace, set an appropriate time window, and execute the queries individually:<\/li>\n<\/ol>\n\n\n\n<pre class=\"wp-block-code\"><code>Syslog\n| where TimeGenerated &gt;= ago(24h)\n| summarize Events=count(), LastEvent=max(TimeGenerated), Hosts=dcount(Computer)\n    by Facility, SeverityLevel\n| order by Events desc\n<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>CommonSecurityLog\n| where TimeGenerated &gt;= ago(24h)\n| summarize Events=count(), LastEvent=max(TimeGenerated),\n            MissingSrc=countif(isempty(SourceIP)),\n            MissingAction=countif(isempty(DeviceAction))\n    by DeviceVendor, DeviceProduct\n| order by Events desc\n<\/code><\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li>Use a field-level sample to verify that source IP, actor\/user and event classification mean what the SOC thinks they mean:<\/li>\n<\/ol>\n\n\n\n<pre class=\"wp-block-code\"><code>CommonSecurityLog\n| where TimeGenerated &gt;= ago(2h)\n| where DeviceVendor == \"AsterLab\"\n| project TimeGenerated, DeviceVendor, DeviceProduct,\n          SourceIP, SourceUserName, DeviceAction,\n          DestinationIP, DeviceEventClassID, Activity\n| take 20\n<\/code><\/pre>\n\n\n\n<ol start=\"3\" class=\"wp-block-list\">\n<li>Inspect the actual source (<code>SyslogMessage<\/code>) rather than trusting a parser or apparent IP field blindly. Compare an emitted test string to its resulting row.<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\">B. Measure arrival delay&nbsp;<em>only if available<\/em><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\"><code>ingestion_time()<\/code>&nbsp;can return a valid ingestion timestamp when supported by the table&#8217;s ingestion-time policy;&nbsp;<code>null<\/code>&nbsp;is not proof that no data arrived. Also,&nbsp;<strong>event TimeGenerated<\/strong>&nbsp;may reflect device clock behavior rather than actual receipt time.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Syslog\n| where TimeGenerated &gt;= ago(2h)\n| where SyslogMessage contains \"SENTINEL_D3_LAB\"\n| extend IngestedAt = ingestion_time()\n| extend IngestDelaySeconds = datetime_diff('second', IngestedAt, TimeGenerated)\n| project TimeGenerated, IngestedAt, IngestDelaySeconds,\n          Computer, Facility, SyslogMessage\n| order by TimeGenerated desc\n<\/code><\/pre>\n\n\n\n<ol start=\"4\" class=\"wp-block-list\">\n<li>If\u00a0<code>IngestedAt<\/code>\u00a0is null or the delay looks negative\/implausible, record\u00a0<strong>not measurable in this table\/configuration<\/strong>, then compare your instructor&#8217;s shell emission UTC timestamp, observed ingestion UTC timestamp, VM time sync and source time fields. Do not publish an SLA conclusion based on one synthetic event.<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\">C. Check duplicates and parsing quality<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>Syslog\n| where TimeGenerated &gt;= ago(2h)\n| where SyslogMessage contains \"SENTINEL_D3_LAB\"\n| summarize Count=count(), First=min(TimeGenerated), Last=max(TimeGenerated)\n    by Computer, SyslogMessage\n| order by Count desc\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">A&nbsp;<code>Count &gt; 1<\/code>&nbsp;can mean&nbsp;<strong>intentionally re-sent source events<\/strong>&nbsp;or true duplication. Inspect whether the same message was generated multiple times; determine whether both Syslog and CEF DCRs match the same facility. Do not deduplicate events indiscriminately in detections without preserving distinct source-event IDs.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>CommonSecurityLog\n| where TimeGenerated &gt;= ago(24h)\n| summarize Total=count(),\n            EmptySourceIP=countif(isempty(SourceIP)),\n            EmptyUser=countif(isempty(SourceUserName)),\n            EmptyAction=countif(isempty(DeviceAction))\n    by DeviceVendor, DeviceProduct\n| extend SourceIPCompletenessPct =\n         iif(Total == 0, real(null), 100.0 * (Total - EmptySourceIP) \/ Total)\n| order by Total desc\n<\/code><\/pre>\n\n\n\n<ol start=\"5\" class=\"wp-block-list\">\n<li>Prepare a small quality report:<\/li>\n<\/ol>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th class=\"has-text-align-left\" data-align=\"left\">Test<\/th><th class=\"has-text-align-left\" data-align=\"left\">Actual observation<\/th><th class=\"has-text-align-left\" data-align=\"left\">Expected acceptance condition<\/th><\/tr><\/thead><tbody><tr><td>Freshness<\/td><td><code>________<\/code><\/td><td>New test rows visible within documented delay\/window<\/td><\/tr><tr><td>Table target<\/td><td><code>________<\/code><\/td><td>Syslog in&nbsp;<code>Syslog<\/code>, CEF in&nbsp;<code>CommonSecurityLog<\/code><\/td><\/tr><tr><td>Host\/source identity<\/td><td><code>________<\/code><\/td><td>Distinguishes lab VM and fictional source<\/td><\/tr><tr><td>Source address\/action<\/td><td><code>________<\/code><\/td><td>Fields present and semantically correct, or limitation recorded<\/td><\/tr><tr><td>Clock\/time<\/td><td><code>________<\/code><\/td><td>Source time plausible; skew assessed<\/td><\/tr><tr><td>Duplication<\/td><td><code>________<\/code><\/td><td>Repeated rows explained, not assumed<\/td><\/tr><tr><td>Narrow collection<\/td><td><code>________<\/code><\/td><td>Selected DCR facilities\/severities are documented<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>PASS D3-L04:<\/strong>&nbsp;Quantitative query results and a reasoned fidelity verdict. \u201cTwo rows exist\u201d without schema\/duplicate\/timestamp analysis is insufficient.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Sources:<\/strong>&nbsp;[R02], [R03], [R06].<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">D3-L05 \u2014 Intermediate KQL lab:&nbsp;<code>let<\/code>,&nbsp;<code>join<\/code>,&nbsp;<code>union<\/code>,&nbsp;<code>extend<\/code>,&nbsp;<code>parse<\/code>,&nbsp;<code>mv-expand<\/code>,&nbsp;<code>distinct<\/code>&nbsp;(I05)<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Competency:<\/strong>&nbsp;Compose advanced queries intentionally and verify that joins do not inflate confidence or row counts.&nbsp;<strong>These exercises run without any ingestion<\/strong>&nbsp;because they use in-query&nbsp;<code>datatable()<\/code>&nbsp;and&nbsp;<code>print<\/code>&nbsp;samples. They are for KQL learning, not for a deployed analytics rule.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Exercise K01 \u2014 Reusable expressions, filtering and calculated fields<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Copy&nbsp;<strong>one block at a time<\/strong>&nbsp;into the workspace Logs query editor:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>let AdminEvents = datatable(Actor:string, SourceIP:string, Action:string)\n&#91;\n  \"lab.admin@asterretail.example\", \"198.51.100.23\", \"privileged_login\",\n  \"lab.ops@asterretail.example\",   \"203.0.113.99\",  \"read_config\",\n  \"lab.admin@asterretail.example\", \"198.51.100.23\", \"change_setting\"\n];\nAdminEvents\n| extend IsPrivilegedAction = Action in (\"privileged_login\", \"change_setting\")\n| where IsPrivilegedAction\n| project Actor, SourceIP, Action, IsPrivilegedAction\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Expected:<\/strong>&nbsp;Two rows for&nbsp;<code>lab.admin@...<\/code>. Explain that&nbsp;<code>let<\/code>&nbsp;improves readability but doesn&#8217;t automatically materialize or cache a query.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Exercise K02 \u2014&nbsp;<code>join kind=inner<\/code>&nbsp;(and why row counts multiply)<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>let Identity = datatable(Actor:string, SourceIP:string)\n&#91;\n  \"lab.admin@asterretail.example\", \"198.51.100.23\",\n  \"lab.user@asterretail.example\",  \"203.0.113.99\"\n];\nlet Firewall = datatable(SourceIP:string, FirewallAction:string)\n&#91;\n  \"198.51.100.23\", \"deny\",\n  \"192.0.2.55\", \"allow\"\n];\nIdentity\n| join kind=inner (Firewall) on SourceIP\n| project Actor, SourceIP, FirewallAction\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Expected:<\/strong>&nbsp;Exactly one matching row. Modify&nbsp;<code>Firewall<\/code>&nbsp;to include the same&nbsp;<code>SourceIP<\/code>&nbsp;twice and observe duplicate matches; then articulate why&nbsp;<strong>IP equality alone is insufficient attribution<\/strong>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Exercise K03 \u2014 Time-bounded correlation<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>let Logins = datatable(LoginAt:datetime, Actor:string, SourceIP:string)\n&#91;\n  datetime(2026-11-01T09:00:00Z), \"lab.admin@asterretail.example\", \"198.51.100.23\",\n  datetime(2026-11-01T11:00:00Z), \"lab.user@asterretail.example\", \"203.0.113.99\"\n];\nlet Blocks = datatable(BlockAt:datetime, SourceIP:string)\n&#91;\n  datetime(2026-11-01T09:05:00Z), \"198.51.100.23\",\n  datetime(2026-11-01T11:45:00Z), \"203.0.113.99\"\n];\nLogins\n| join kind=inner (Blocks) on SourceIP\n| where BlockAt between (LoginAt - 10m .. LoginAt + 10m)\n| project LoginAt, Actor, SourceIP, BlockAt\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Expected:<\/strong>&nbsp;Only the 09:00\/09:05 pair. Note: static test timestamps are fine in&nbsp;<strong>in-query<\/strong>&nbsp;teaching examples but unsuitable for alert rules that should evaluate new events.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Exercise K04 \u2014&nbsp;<code>union<\/code>&nbsp;heterogeneous sources safely<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>let Linux = datatable(Actor:string, Action:string)\n&#91;\n  \"lab.admin@asterretail.example\", \"login\"\n]\n| extend Source=\"Linux\";\nlet Cloud = datatable(Actor:string, Action:string)\n&#91;\n  \"lab.admin@asterretail.example\", \"role_change\"\n]\n| extend Source=\"Cloud\";\nunion Linux, Cloud\n| project Source, Actor, Action\n| order by Source asc\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Expected:<\/strong>&nbsp;Two rows.&nbsp;<code>union<\/code>&nbsp;appends results; it does not infer a relationship. It may introduce null columns or type-suffixed columns if schemas don&#8217;t align;&nbsp;<code>project<\/code>&nbsp;harmonizes them.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Exercise K05 \u2014&nbsp;<code>parse<\/code>&nbsp;an agreed application contract<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>let Raw = datatable(Message:string)\n&#91;\n  \"actor=lab.admin@asterretail.example src=198.51.100.23 action=privileged_login\",\n  \"actor=lab.user@asterretail.example src=203.0.113.99 action=read_config\"\n];\nRaw\n| parse Message with \"actor=\" Actor:string \" src=\" SourceIP:string \" action=\" Action:string\n| project Actor, SourceIP, Action\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Expected:<\/strong>&nbsp;Both actors\/IPs\/actions extracted. Change one record&#8217;s separator or key spelling: extraction can fail. Compare this with&nbsp;<code>extract()<\/code>&nbsp;using a regex; choose based on source contract rather than trying to recover every malformed record silently.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Exercise K06 \u2014&nbsp;<code>mv-expand<\/code>&nbsp;and&nbsp;<code>distinct<\/code><\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>print Actors=dynamic(&#91;\n  \"lab.admin@asterretail.example\",\n  \"lab.ops@asterretail.example\",\n  \"lab.admin@asterretail.example\"\n])\n| mv-expand Actor = Actors to typeof(string)\n| distinct Actor\n| order by Actor asc\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Expected:<\/strong>&nbsp;Two unique actors. Explain that&nbsp;<code>mv-expand<\/code>&nbsp;can increase row volume and query cost.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Exercise K07 \u2014&nbsp;<code>join kind=leftouter<\/code>&nbsp;versus&nbsp;<code>lookup<\/code><\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>let Findings = datatable(Actor:string, SourceIP:string)\n&#91;\n  \"lab.admin@asterretail.example\", \"198.51.100.23\",\n  \"lab.user@asterretail.example\", \"203.0.113.99\"\n];\nlet Business = datatable(Actor:string, Owner:string, Criticality:string)\n&#91;\n  \"lab.admin@asterretail.example\", \"Identity Team\", \"High\"\n];\nFindings\n| lookup kind=leftouter Business on Actor\n| project Actor, SourceIP, Owner, Criticality\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Expected:<\/strong>&nbsp;Two findings; unmatched user has empty enrichment. An unrecognized actor must not be fabricated as &#8216;low risk.&#8217;<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Exercise K08 \u2014 Reduce many-to-many joins before operating on a security decision<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>let Identity = datatable(Actor:string, SourceIP:string)\n&#91;\n  \"adminA\", \"198.51.100.23\",\n  \"adminA\", \"198.51.100.23\"\n];\nlet Firewall = datatable(SourceIP:string, Decision:string)\n&#91;\n  \"198.51.100.23\", \"deny\",\n  \"198.51.100.23\", \"deny\"\n];\nlet RawJoin = Identity | join kind=inner (Firewall) on SourceIP;\nRawJoin\n| summarize JoinedRows=count(), UniqueActors=dcount(Actor) by SourceIP\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Expected:<\/strong>&nbsp;Four joined rows from only two records on each side. Explain why metrics need clear event identity (and potentially&nbsp;<code>summarize<\/code>, deduplication or&nbsp;<code>arg_max<\/code>) before claiming an attack rate.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>PASS D3-L05:<\/strong>&nbsp;Learner runs all eight examples, records expected\/actual counts, explains&nbsp;<code>join<\/code>&nbsp;vs&nbsp;<code>union<\/code>, demonstrates parsing failure, and identifies the four-row join amplification.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Common errors:<\/strong>&nbsp;Missing&nbsp;<code>;<\/code>&nbsp;after&nbsp;<code>let<\/code>;&nbsp;<code>TimeGenerated<\/code>&nbsp;silently lost in an alert query; data types mismatch in join keys; many-to-many expansion;&nbsp;<code>union<\/code>&nbsp;used as correlation; dynamic array not expanded; no normalization of case\/whitespace for identity fields.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>KQL reference:<\/strong>&nbsp;[R07].<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">D3-L06 \u2014 Correlate Linux and firewall data with a defensible time window (I06)<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Competency:<\/strong>&nbsp;Build a two-source KQL correlation against the actual&nbsp;<code>Syslog<\/code>&nbsp;and&nbsp;<code>CommonSecurityLog<\/code>&nbsp;tables and critique its assumptions.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">A. Prepare evidence and inspect join keys<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Verify that L02 produced a\u00a0<code>Syslog<\/code>\u00a0row with\u00a0<code>SENTINEL_D3_LAB<\/code>\u00a0and that L03 produced a parsed\u00a0<code>CommonSecurityLog<\/code>\u00a0row with\u00a0<code>DeviceVendor=AsterLab<\/code>.<\/li>\n\n\n\n<li>In the Logs editor, run the query below; use a window that includes your bounded test. Do not reuse old Day 1\/2 events that have no shared identity keys.<\/li>\n\n\n\n<li>Examine the parsed\u00a0<code>LabActor<\/code>, source IP, and CEF\u00a0<code>SourceUserName<\/code>; if parser output is missing, record it before correlating.<\/li>\n<\/ol>\n\n\n\n<pre class=\"wp-block-code\"><code>let Linux = Syslog\n| where TimeGenerated &gt;= ago(2h)\n| where SyslogMessage contains \"SENTINEL_D3_LAB\"\n| extend SourceIP = extract(@\"src=(&#91;0-9.]+)\", 1, SyslogMessage)\n| extend LabActor = extract(@\"actor=(&#91;^\\s]+)\", 1, SyslogMessage)\n| where isnotempty(SourceIP) and isnotempty(LabActor)\n| project LinuxTime=TimeGenerated, LinuxHost=Computer,\n          SourceIP, LabActor, LinuxRaw=SyslogMessage;\nlet Firewall = CommonSecurityLog\n| where TimeGenerated &gt;= ago(2h)\n| where DeviceVendor == \"AsterLab\" and DeviceProduct == \"Firewall\"\n| where isnotempty(SourceIP)\n| project FirewallTime=TimeGenerated, SourceIP, SourceUserName,\n          DeviceAction, DeviceEventClassID;\nLinux\n| join kind=inner (Firewall) on SourceIP\n| where FirewallTime between (LinuxTime - 10m .. LinuxTime + 10m)\n| project LinuxTime, FirewallTime, LinuxHost, LabActor,\n          SourceIP, SourceUserName, DeviceAction, DeviceEventClassID\n| order by LinuxTime desc\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Expected:<\/strong>&nbsp;At least one joined row when the two emitted records share source IP and are within ten minutes. If the messages were sent more than ten minutes apart, send one new&nbsp;<em>bounded<\/em>&nbsp;pair after instructor approval and record the emission timestamps.&nbsp;<strong>There is no guaranteed fixed row count<\/strong>&nbsp;if a cohort has repeated the test; this is why you inspect evidence and add scope.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">B. Tighten the correlation<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">If&nbsp;<code>SourceUserName<\/code>&nbsp;reliably parsed from&nbsp;<code>suser<\/code>, add this condition&nbsp;<strong>after<\/strong>&nbsp;the time predicate:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>| where tolower(LabActor) == tolower(SourceUserName)\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">If the user field is blank, you&nbsp;<strong>cannot<\/strong>&nbsp;claim account-identity correlation\u2014only shared source-IP\/time evidence. Explain NAT\/shared proxy and time-skew limitations. Consider a unique event correlation ID for real integrations and vendor-specific parsing contracts.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">C. Convert the result into a compact detection candidate<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Copy and run the following separately. Its&nbsp;<code>TimeGenerated<\/code>&nbsp;is derived from actual source events and is suitable for a scheduled-rule&nbsp;<em>candidate<\/em>&nbsp;after lab-specific testing.&nbsp;<strong>Not production-ready<\/strong>&nbsp;without source tuning, alert ownership, and peer review.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>let Linux = Syslog\n| where TimeGenerated &gt;= ago(20m)\n| where SyslogMessage contains \"SENTINEL_D3_LAB\"\n| extend SourceIP = extract(@\"src=(&#91;0-9.]+)\", 1, SyslogMessage)\n| extend Account = extract(@\"actor=(&#91;^\\s]+)\", 1, SyslogMessage)\n| where isnotempty(SourceIP) and isnotempty(Account)\n| project LinuxTime=TimeGenerated, Account, SourceIP, Computer;\nlet Firewall = CommonSecurityLog\n| where TimeGenerated &gt;= ago(20m)\n| where DeviceVendor == \"AsterLab\" and DeviceProduct == \"Firewall\"\n| project FirewallTime=TimeGenerated, SourceIP,\n          SourceUserName, DeviceAction;\nLinux\n| join kind=inner (Firewall) on SourceIP\n| where FirewallTime between (LinuxTime - 10m .. LinuxTime + 10m)\n| where isempty(SourceUserName) or tolower(Account) == tolower(SourceUserName)\n| summarize TimeGenerated=max(LinuxTime),\n            FirewallLastSeen=max(FirewallTime),\n            EvidencePairs=count(),\n            SampleAction=take_any(DeviceAction),\n            Host=take_any(Computer)\n          by Account, SourceIP\n| project TimeGenerated, Account, SourceIP, Host,\n          FirewallLastSeen, EvidencePairs, SampleAction\n| order by TimeGenerated desc\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Annotation:<\/strong>&nbsp;The&nbsp;<code>isempty(SourceUserName)<\/code>&nbsp;branch tolerates a missing CEF account but weakens attribution. For production-style high-fidelity rules, remove that branch and require an actually parsed matching account, after validating the parser and deciding what to do with missing identities. Do not treat this query as a confirmed attack detector: the injected records were fictional test logs.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">D. Evaluate a minimum three-case test set<\/h3>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th class=\"has-text-align-left\" data-align=\"left\">Case<\/th><th class=\"has-text-align-left\" data-align=\"left\">Test input<\/th><th class=\"has-text-align-left\" data-align=\"left\">Desired query behavior<\/th><th class=\"has-text-align-left\" data-align=\"left\">Why<\/th><\/tr><\/thead><tbody><tr><td>Positive P1<\/td><td>Syslog + CEF same source IP, within 10 minutes, actor matches (if provided)<\/td><td>Match<\/td><td>Two different telemetry sources agree<\/td><\/tr><tr><td>Negative N1<\/td><td>Syslog source IP different from CEF<\/td><td>No match<\/td><td>Join key differs<\/td><\/tr><tr><td>Negative N2<\/td><td>Same IP but 30+ minutes apart<\/td><td>No match<\/td><td>Time boundary rejected<\/td><\/tr><tr><td>Edge E1<\/td><td>Same IP, different CEF user<\/td><td><strong>No match<\/strong>&nbsp;if strict actor equality enabled; otherwise explicitly flagged weak<\/td><td>Shared infrastructure ambiguity<\/td><\/tr><tr><td>Edge E2<\/td><td>Repeated test events<\/td><td>Possibly multiple pairs, then summarized<\/td><td>Join multiplicity<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Do not generate thousands of events for testing; if live time-bound cases are hard to replay safely, execute&nbsp;<code>datatable()<\/code>&nbsp;variants as in L05 and separately label the real-path observation.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>PASS D3-L06:<\/strong>&nbsp;The KQL runs with live joined results&nbsp;<strong>or<\/strong>&nbsp;the instructor records a clearly marked alternate two-source evidence set. Learner states the join key and time window, demonstrates at least one negative test, and writes limitations. No source data, no PASS on &#8216;correlation demonstrated.&#8217;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Sources:<\/strong>&nbsp;[R07], [R13].<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">D3-L07 \u2014 Governed watchlist creation and business-context enrichment (I07)<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Competency:<\/strong>&nbsp;Turn a CSV reference list into contextual enrichment, control its lifecycle, avoid using watchlists as large-scale event storage.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">A. Build a tiny approved CSV file<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Create a local UTF-8 text file named&nbsp;<code>day3_privileged_accounts.csv<\/code>&nbsp;with exactly this content. This is&nbsp;<em>embedded in the manual<\/em>&nbsp;so no separate download is required:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>UserPrincipalName,Owner,Criticality,ApprovedUntil,Comment\nlab.admin@asterretail.example,Identity Team,High,2026-12-31,Fictional lab privileged account\nlab.ops@asterretail.example,Cloud Operations,Medium,2026-12-31,Fictional operations account\nlab.breakglass@asterretail.example,Security Lead,Critical,2026-12-31,Fictional emergency account\n<\/code><\/pre>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Open the file in a plain-text editor, confirm header names, no extra comments\/blank header lines, and no real employee data.<\/li>\n\n\n\n<li>Confirm the owner\/steward, source-of-truth, change approval, review cadence, and removal date. Watchlists are reference data; they are not a master identity directory. [R08]<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\">B. Create the watchlist in the correct Sentinel workspace<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li>In Defender portal go to\u00a0<strong>Microsoft Sentinel > Configuration > Watchlist<\/strong>.<\/li>\n\n\n\n<li>Choose\u00a0<strong>+ New<\/strong>\u00a0(or equivalent\u00a0<strong>Create<\/strong>\u00a0action shown in the current portal).<\/li>\n\n\n\n<li>Enter Name:\u00a0<code>Day 3 Privileged Accounts<\/code>, Alias:\u00a0<strong><code>day3_privileged_accounts<\/code><\/strong>, Description:\u00a0<code>Synthetic authorized training reference list<\/code>; save the owner in the class ledger.<\/li>\n\n\n\n<li>On\u00a0<strong>Source<\/strong>, choose\u00a0<strong>Local file<\/strong>, upload\u00a0<code>day3_privileged_accounts.csv<\/code>, and indicate that the header is on line 1 (0 rows preceding the header).<\/li>\n\n\n\n<li>Choose\u00a0<strong>SearchKey =\u00a0<code>UserPrincipalName<\/code><\/strong>\u00a0(the column used to join events to this list).<\/li>\n\n\n\n<li>Review and create. Wait for the watchlist to be queryable; a successful UI notification does not guarantee immediate query visibility. [R09]<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\">C. Verify the list, then enrich a live correlation<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>_GetWatchlist('day3_privileged_accounts')\n| project SearchKey, UserPrincipalName, Owner, Criticality, ApprovedUntil\n| order by SearchKey asc\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Expected:<\/strong>&nbsp;Three synthetic entries, each with correct&nbsp;<code>SearchKey<\/code>&nbsp;and owner\/criticality. The watchlist may have cached refresh behavior and an internal&nbsp;<code>TimeGenerated<\/code>&nbsp;timestamp;&nbsp;<strong>do not interpret watchlist&nbsp;<code>TimeGenerated<\/code>&nbsp;as when the account became privileged<\/strong>. [R08]<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Then run this&nbsp;<strong>live<\/strong>&nbsp;enrichment against Syslog (doesn&#8217;t require CEF to be present):<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>let Privileged = _GetWatchlist('day3_privileged_accounts')\n| project JoinKey=tolower(SearchKey), Owner, Criticality, ApprovedUntil;\nSyslog\n| where TimeGenerated &gt;= ago(2h)\n| where SyslogMessage contains \"SENTINEL_D3_LAB\"\n| extend Account=extract(@\"actor=(&#91;^\\s]+)\", 1, SyslogMessage)\n| where isnotempty(Account)\n| extend JoinKey=tolower(Account)\n| lookup kind=leftouter Privileged on JoinKey\n| project TimeGenerated, Computer, Account, Owner, Criticality,\n          ApprovedUntil, SyslogMessage\n| order by TimeGenerated desc\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Expected:<\/strong>&nbsp;Fictional&nbsp;<code>lab.admin@...<\/code>&nbsp;event enriches to&nbsp;<code>Owner = Identity Team<\/code>,&nbsp;<code>Criticality = High<\/code>. If the watchlist has no match, output may have null enrichment. Null is not the same as&nbsp;<em>approved unprivileged<\/em>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">D. Add controlled review logic (not an implicit permanent bypass)<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Ask the learner: Does\u00a0<code>ApprovedUntil<\/code>\u00a0mean the account is safe?\u00a0<strong>No.<\/strong>\u00a0It might mean a temporary approval period, not an exception to detect suspicious behavior.<\/li>\n\n\n\n<li>Discuss when an\u00a0<strong>allowlist<\/strong>\u00a0is legitimate: signed ownership, specific behavior\/context, scope, expiry, audit trail; avoid broad &#8216;ignore all activity from this user&#8217; filters.<\/li>\n\n\n\n<li>For an actual time-bound review example:<\/li>\n<\/ol>\n\n\n\n<pre class=\"wp-block-code\"><code>_GetWatchlist('day3_privileged_accounts')\n| extend ApprovalEnd=todatetime(ApprovedUntil)\n| extend ApprovalCurrent=isnotnull(ApprovalEnd) and ApprovalEnd &gt;= now()\n| project SearchKey, Owner, Criticality, ApprovalEnd, ApprovalCurrent\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">This does&nbsp;<strong>not<\/strong>&nbsp;change watchlist rows and does not suppress detections; it only derives current approval context.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>PASS D3-L07:<\/strong>&nbsp;Watchlist exists,&nbsp;<code>_GetWatchlist()<\/code>&nbsp;returns the expected records, a real or separately labeled synthetic event is enriched with the correct owner\/criticality, and a stewardship\/expiry policy is documented.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Troubleshooting:<\/strong>&nbsp;invalid file format; alias case; header misspelling; wrong SearchKey; wrong workspace;&nbsp;<code>tolower()<\/code>&nbsp;mismatch; newly created list not yet queryable; stale\/missing reference owners.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Sources:<\/strong>&nbsp;[R08], [R09].<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">D3-L08 \u2014 Evaluate threat-intelligence indicators safely (I08)<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Competency:<\/strong>&nbsp;Recognize indicator lifecycle, expiry, confidence, source reliability and false matches; use TI as&nbsp;<em>context<\/em>, not a blanket verdict.&nbsp;<strong>No real malicious IOC and no external TI subscription are needed for the required exercise.<\/strong><\/p>\n\n\n\n<h3 class=\"wp-block-heading\">A. Discover the correct 2026 TI experience<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li>In Defender portal, locate\u00a0<strong>Microsoft Sentinel > Threat management > Threat intelligence<\/strong>\u00a0(navigation may also surface TI under an investigation-oriented Defender experience, depending on onboarded services). Check the workspace\/tenant context.<\/li>\n\n\n\n<li>Record which approved TI connectors and feature licenses are already available. Do\u00a0<strong>not<\/strong>\u00a0subscribe to a feed, register credentials or import public malicious infrastructure for the training just to make a query return rows.<\/li>\n\n\n\n<li>If an approved feed already exists, check that the workspace contains\u00a0<strong><code>ThreatIntelIndicators<\/code><\/strong>. This is the modern indicator table; the old\u00a0<code>ThreatIntelligenceIndicator<\/code>\u00a0ingestion was retired in 2025. The old Threat Intelligence Platforms (TIP) connector was slated to stop collecting in June 2026; current new integrations should use supported TIP upload API or TAXII methods, approved by the TI owner. [R10], [R11]<\/li>\n\n\n\n<li>If the table is available, query its actual schema. This is\u00a0<strong>read-only<\/strong>:<\/li>\n<\/ol>\n\n\n\n<pre class=\"wp-block-code\"><code>ThreatIntelIndicators\n| where TimeGenerated &gt;= ago(30d)\n| summarize arg_max(TimeGenerated, *) by Id\n| where IsDeleted == false and Revoked == false and IsActive == true\n| project TimeGenerated, Id, ObservableKey, ObservableValue,\n          Confidence, ValidFrom, ValidUntil, Pattern, Tags\n| take 25\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Important:<\/strong>&nbsp;The&nbsp;<code>IsActive<\/code>&nbsp;property and expiry handling are related but not identical. In an operational TI match, additionally consider the current time against validity fields and the exact&nbsp;<code>ObservableKey<\/code>\/pattern semantics. A numeric&nbsp;<code>Confidence<\/code>&nbsp;value is not a mathematically calibrated probability of attack.<\/p>\n\n\n\n<ol start=\"5\" class=\"wp-block-list\">\n<li>If the table does not exist, or is empty due to missing entitlements\/connectors, record\u00a0<strong>not available in lab<\/strong>\u00a0and complete B. Do not fabricate a live TI match.<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\">B. Self-contained synthetic TI matching exercise<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Run this query independently; it uses fictional records and stays inside the query engine:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>let Network = datatable(TimeGenerated:datetime, SourceIP:string, Action:string)\n&#91;\n  datetime(2026-11-01T09:06:00Z), \"198.51.100.23\", \"deny\",\n  datetime(2026-11-01T09:08:00Z), \"203.0.113.99\", \"allow\"\n];\nlet Indicators = datatable(IndicatorIP:string, Confidence:int,\n                           ValidUntil:datetime, Revoked:bool)\n&#91;\n  \"198.51.100.23\", 80, datetime(2026-12-31T00:00:00Z), false,\n  \"203.0.113.99\",  90, datetime(2026-01-01T00:00:00Z), true\n];\nNetwork\n| lookup kind=leftouter Indicators on $left.SourceIP == $right.IndicatorIP\n| extend IndicatorUsable = isnotnull(IndicatorIP)\n                    and Revoked == false\n                    and ValidUntil &gt; datetime(2026-11-01T00:00:00Z)\n| project TimeGenerated, SourceIP, Action, Confidence,\n          ValidUntil, Revoked, IndicatorUsable\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Expected:<\/strong>&nbsp;<code>198.51.100.23<\/code>&nbsp;is a&nbsp;<em>fictional<\/em>&nbsp;valid indicator in the simulated snapshot, while&nbsp;<code>203.0.113.99<\/code>&nbsp;is not usable because revoked\/expired. The test is deliberately anchored to the&nbsp;<strong>scenario date<\/strong>&nbsp;so its expected output remains reproducible. In live TI queries use&nbsp;<code>now()<\/code>&nbsp;and actual indicator source field mappings.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">C. Analyst decision worksheet<\/h3>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th class=\"has-text-align-left\" data-align=\"left\">Question<\/th><th class=\"has-text-align-left\" data-align=\"left\">Required answer<\/th><\/tr><\/thead><tbody><tr><td>Is an IP match sufficient to label a person malicious?<\/td><td>No; NAT, infrastructure sharing, stale indicators and spoofed logs must be assessed<\/td><\/tr><tr><td>What makes an indicator actionable?<\/td><td>Provenance, accuracy, observable type, expiry, confidence, relevant behavior and ownership<\/td><\/tr><tr><td>How do you handle an expired indicator?<\/td><td>Filter from active matching or clearly label historical context; do not silently enforce<\/td><\/tr><tr><td>What is the difference between TI and a watchlist?<\/td><td>TI is threat-context evidence with indicator lifecycle; watchlist may be business reference data<\/td><\/tr><tr><td>Where is the audit record?<\/td><td>Feed\/operator provenance, imported indicator ID, action taken, UTC timestamps, review decision<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>PASS D3-L08:<\/strong>&nbsp;Learner demonstrates correct 2026 table\/connector awareness, executes synthetic validity checks, states matching limitations, and writes one justified intelligence disposition.&nbsp;<strong>Optional live bonus:<\/strong>&nbsp;approved feed\/table actually returns data.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Sources:<\/strong>&nbsp;[R10], [R11], [R17].<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">D3-L09 \u2014 Inspect User and Entity Behavior Analytics (UEBA) context (I09)<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Competency:<\/strong>&nbsp;Determine when UEBA enrichments can strengthen an investigation, what scores mean, and what&nbsp;<strong>must not<\/strong>&nbsp;be inferred from an anomaly.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">A. Confirm availability and roles&nbsp;<em>before<\/em>&nbsp;enabling anything<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Ask the instructor whether UEBA is already enabled in the training workspace and whether identity-signal sources are present. Do not turn it on without approval: it creates additional data and can increase storage cost.<\/li>\n\n\n\n<li>If authorized to enable UEBA, confirm the enabling principal has\u00a0<strong>Microsoft Entra Security Administrator<\/strong>\u00a0or equivalent tenant permissions\u00a0<em>plus<\/em>\u00a0the required Azure RBAC, and that resource locks do not block changes. Merely viewing UEBA data does\u00a0<strong>not<\/strong>\u00a0require these special enablement roles. [R12]<\/li>\n\n\n\n<li>In Defender portal go to\u00a0<strong>System > Settings > Microsoft Sentinel > UEBA<\/strong>. Under current documented experience, turn on UEBA only with explicit approval, select only intended directory\/source options, and choose\u00a0<strong>Connect<\/strong>.<\/li>\n\n\n\n<li>For anomaly detection (if authorized), go to\u00a0<strong>Settings > Microsoft Sentinel > SIEM workspaces<\/strong>, select the correct workspace, open\u00a0<strong>Anomalies<\/strong>, and toggle\u00a0<strong>Detect Anomalies<\/strong>\u00a0if available and approved.<\/li>\n\n\n\n<li>For supported sources, verify the actual connector dependencies and data readiness.\u00a0<strong>A fictional CEF product from L03 is not automatically a supported UEBA input.<\/strong>\u00a0Microsoft documents only supported vendor\/source schemas. [R12]<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\">B. Inspect available UEBA logs (read-only)<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">If&nbsp;<code>BehaviorAnalytics<\/code>&nbsp;is present:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>BehaviorAnalytics\n| where TimeGenerated &gt;= ago(7d)\n| project TimeGenerated, UserPrincipalName, ActivityType,\n          SourceIPAddress, EventSource, InvestigationPriority,\n          ActivityInsights\n| order by InvestigationPriority desc, TimeGenerated desc\n| take 25\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">If the table exists but no rows are returned, that is an observable result\u2014not proof UEBA is broken. Verify enabled sources, permissions, volume and whether any events actually qualify for profiling. If the table is unavailable, use the synthetic scoring discussion in C and record that live UEBA was not tested.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">C. Interpret the scores without overclaiming<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Microsoft distinguishes&nbsp;<strong><code>BehaviorAnalytics.InvestigationPriority<\/code>&nbsp;(0\u201310)<\/strong>&nbsp;from&nbsp;<strong><code>Anomalies.AnomalyScore<\/code>&nbsp;(0\u20131)<\/strong>. They describe different levels of unusual behavior, and a high score is not a conviction. [R18]<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Synthetic interpretation table:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th class=\"has-text-align-left\" data-align=\"left\">Fictional evidence<\/th><th class=\"has-text-align-right\" data-align=\"right\">Score<\/th><th class=\"has-text-align-left\" data-align=\"left\">Analyst response<\/th><\/tr><\/thead><tbody><tr><td>Admin launches approved first-time service change<\/td><td class=\"has-text-align-right\" data-align=\"right\">Investigation priority 8\/10<\/td><td>Validate change request and relevant roles; unusual does not prove malicious<\/td><\/tr><tr><td>Multiple independently suspicious events form a new pattern<\/td><td class=\"has-text-align-right\" data-align=\"right\">Anomaly score 0.91\/1<\/td><td>Prioritize corroboration, isolate time window and evidence, escalate if justified<\/td><\/tr><tr><td>Routine nightly automation looks normal<\/td><td class=\"has-text-align-right\" data-align=\"right\">1\/10<\/td><td>Still check source fidelity and whether a policy violation occurred<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Write one alternative benign explanation for a high score and one serious concern a low score would not rule out.<\/li>\n\n\n\n<li>State where UEBA might add useful context to L06&#8217;s correlation (identity profile, peer context, historical behavior).<\/li>\n\n\n\n<li>Note why unsupported or thin telemetry can produce a misleading risk picture.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>PASS D3-L09:<\/strong>&nbsp;Documented availability\/approval check, live query result&nbsp;<strong>if supported<\/strong>, correct comparison of two score types, and a reasoned analyst statement.&nbsp;<strong>Do not block progression<\/strong>&nbsp;because UEBA is unavailable if the substitute exercise is completed; mark optional live feature NOT VERIFIED.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Sources:<\/strong>&nbsp;[R12], [R18], [R19].<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">D3-L10 \u2014 Publish and validate a custom scheduled analytics rule (I10)<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Competency:<\/strong>&nbsp;Convert the real cross-source query into a working detection, map entities and useful custom details, control its lookback and alert generation, and demonstrate the alert \u2192 incident path. This lab must be&nbsp;<strong>performed in a dedicated training workspace<\/strong>&nbsp;or by an instructor with approved write privileges.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">A. Pre-publish validation and safety checks<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Confirm that L06&#8217;s\u00a0<strong>compact candidate query<\/strong>\u00a0runs in the intended Log Analytics workspace, returns rows for recent\u00a0<em>actual<\/em>\u00a0test logs, includes a legitimate\u00a0<code>TimeGenerated:datetime<\/code>, and returns the columns\u00a0<code>Account<\/code>,\u00a0<code>SourceIP<\/code>,\u00a0<code>Host<\/code>,\u00a0<code>EvidencePairs<\/code>, and\u00a0<code>SampleAction<\/code>.<\/li>\n\n\n\n<li>If L03&#8217;s CEF source is unavailable,\u00a0<strong>do not insert a synthetic\u00a0<code>datatable()<\/code>\u00a0into a production-like scheduled analytics rule<\/strong>. Either (a) complete the rule-authoring walkthrough as a non-deployed design exercise or (b) ask the instructor to provide a separate, approved real data source and rewrite the query for that source. Mark operational rule PASS only after real evidence exists.<\/li>\n\n\n\n<li>Confirm that the rule uniquely matches\u00a0<strong>lab markers<\/strong>\u00a0and\u00a0<code>AsterLab<\/code>\u00a0test device data. No broad\u00a0<code>SecurityEvent<\/code>\/<code>SigninLogs<\/code>\u00a0queries or real privileged accounts should be alerted on by this exercise.<\/li>\n\n\n\n<li>Save the exact tested query in the instructor evidence pack. Record the last query result UTC timestamp.<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\">B. Create the scheduled query rule via Defender portal<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Open\u00a0<strong>Microsoft Sentinel > Configuration > Analytics<\/strong>.<\/li>\n\n\n\n<li>Select\u00a0<strong>+ Create > Scheduled query rule<\/strong>. [R13]<\/li>\n\n\n\n<li>In the general stage, enter:\n<ul class=\"wp-block-list\">\n<li><strong>Name:<\/strong>\u00a0<code>SENTINEL-D3-LAB-Privileged-Source-Correlation<\/code><\/li>\n\n\n\n<li><strong>Description:<\/strong>\u00a0<code>TRAINING ONLY: synthetic Linux plus CEF source-IP\/time correlation; test marker required; delete after lab<\/code><\/li>\n\n\n\n<li><strong>Severity:<\/strong>\u00a0<code>Low<\/code>\u00a0or\u00a0<code>Informational<\/code>\u00a0per instructor policy,\u00a0<em>not<\/em>\u00a0High simply because the fictional account is called admin<\/li>\n\n\n\n<li><strong>Status:<\/strong>\u00a0<code>Disabled<\/code>\u00a0until the query\/settings are checked; then enable for the bounded demonstration<\/li>\n\n\n\n<li><strong>MITRE ATT&amp;CK:<\/strong>\u00a0only choose tactics\/techniques for which the scenario supports an explanatory mapping; absence of mapping is preferable to inaccurate labels<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>On\u00a0<strong>Set rule logic<\/strong>, paste the validated\u00a0<strong>candidate KQL from D3-L06 section C<\/strong>, adjusted only for actual test field mappings.<\/li>\n\n\n\n<li><strong>Entity mapping<\/strong>\u00a0(if supported by your rule editor):\n<ul class=\"wp-block-list\">\n<li><code>Account<\/code>\u00a0entity \u2192 identifier\u00a0<strong>FullName<\/strong>\u00a0\u2192 column\u00a0<code>Account<\/code>\u00a0(confirm email-string handling in your tenant)<\/li>\n\n\n\n<li><code>IP<\/code>\u00a0entity \u2192 identifier\u00a0<strong>Address<\/strong>\u00a0\u2192 column\u00a0<code>SourceIP<\/code><\/li>\n\n\n\n<li><code>Host<\/code>\u00a0entity \u2192\u00a0<strong>HostName<\/strong>\u00a0or current supported host identifier \u2192 column\u00a0<code>Host<\/code>,\u00a0<em>if the current wizard offers a compatible mapping<\/em>. Record any omitted mapping rather than guessing.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Custom details:<\/strong>\u00a0map useful scalar outputs such as\u00a0<code>EvidencePairs<\/code>\u00a0and\u00a0<code>SampleAction<\/code>, avoiding secrets or raw log payloads. Keep descriptions short.<\/li>\n\n\n\n<li><strong>Query scheduling:<\/strong>\u00a0use\u00a0<strong>Run query every 5 minutes<\/strong>,\u00a0<strong>Lookup data from the last 20 minutes<\/strong>, which satisfies the current documented condition that lookback \u2265 interval. Microsoft describes minimum 5-minute intervals for scheduled queries; the engine can introduce processing offset\/ingestion delay. [R14]<\/li>\n\n\n\n<li><strong>Alert threshold:<\/strong>\u00a0<strong>Generate alert when results > 0<\/strong>; select\u00a0<strong>Group all events into a single alert<\/strong>\u00a0for the lab to prevent a storm.<\/li>\n\n\n\n<li>Use\u00a0<strong>Test with current data<\/strong>\u00a0if shown, and document the result. Simulation is useful but\u00a0<strong>does not constitute proof of an alert or incident<\/strong>.<\/li>\n\n\n\n<li><strong>Incident settings:<\/strong>\u00a0leave\u00a0<strong>Create incidents from alerts<\/strong>\u00a0enabled in a Sentinel-on-Defender environment. For the training rule, prefer default\/simple grouping until the instructor authorizes a change; read the available options to avoid accidental incident floods. [R13], [R14]<\/li>\n\n\n\n<li>Review any automated response stage without adding Day 4 playbooks. Create the rule; confirm it appears under active rules with the expected name.<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\">C. Prove the actual alert and incident chain<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li>If the query has recently matching rows, enable the rule and wait for its actual scheduled evaluation. If data ages out of the 20-minute lookback before the first run, have the instructor send\u00a0<strong>one fresh bounded Syslog+CEF pair<\/strong>\u00a0as in L02\/L03 and record the UTC time. Do not increase collection volume impulsively.<\/li>\n\n\n\n<li>In the\u00a0<strong>Defender portal incident queue<\/strong>\u00a0\/ relevant Microsoft Sentinel incident experience, search for the training rule or its associated alert. Depending on tenant\/portal edition, incidents may be visible under unified Incidents, with case-preview options available separately. Record the actual label used by the tenant.<\/li>\n\n\n\n<li>Open the incident. Confirm the alert was created by\u00a0<code>SENTINEL-D3-LAB-Privileged-Source-Correlation<\/code>, the evidence time is recent, and intended mapped entities\/custom details are visible.<\/li>\n\n\n\n<li>Record: rule name, run\/test UTC timestamps, alert identifier, incident identifier, mapped IP\/account, severity, and any missing fields.<\/li>\n\n\n\n<li>If no incident appears: verify first that a\u00a0<strong>real alert exists<\/strong>, then check incident creation settings, query matches during scheduled lookback, actual query execution, portal filters, RBAC and integration mode. A search returning zero results for a UI view is not proof the rule never executed.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Mandatory proof chain:<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Actual Linux Syslog row\n   + actual parsed CEF row\n       \u2193\nTime-bounded KQL result with TimeGenerated\n       \u2193\nEnabled scheduled analytics rule (name + settings)\n       \u2193\nCreated alert (real ID)\n       \u2193\nCreated Microsoft Defender \/ Sentinel incident (real ID)\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>PASS D3-L10:<\/strong>&nbsp;Instructor has evidence of&nbsp;<strong>every link<\/strong>&nbsp;of this chain and can inspect entity mapping.&nbsp;<strong>PARTIAL:<\/strong>&nbsp;saved\/enabled rule but no alert\/incident.&nbsp;<strong>BLOCKED:<\/strong>&nbsp;missing role\/permissions\/second source; leave the rule disabled and record the reason.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Failure tips:<\/strong>&nbsp;Source events too old; no CEF table; empty actor; facility filtered; event timestamp skew;&nbsp;<code>TimeGenerated<\/code>&nbsp;absent in final projection; query is too costly; rule set Disabled; scheduled window excludes events; rule fails to create incidents; wrong Defender queue view. See L14.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Sources:<\/strong>&nbsp;[R13], [R14], [R20].<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">D3-L11 \u2014 Tune rule fidelity, grouping, ownership and false-positive behavior (I11)<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Competency:<\/strong>&nbsp;Show measured improvements without suppressing genuine signal. Change one factor at a time; maintain a before\/after test matrix.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">A. Establish the baseline<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Take a screenshot or record the L10 rule query, evaluation interval, lookback, threshold, event grouping, incident settings, alert count and false-positive observations.<\/li>\n\n\n\n<li>Determine how many\u00a0<strong>distinct<\/strong>\u00a0lab source events underlie one detection (do not use joined row count as the event count; L05 showed why joins multiply).<\/li>\n\n\n\n<li>Record the current rule name\/version in the course log and identify an owner for tuning changes.<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\">B. Introduce an approved benign comparator<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">The instructor may emit&nbsp;<strong>one<\/strong>&nbsp;extra harmless syslog message with a separate fictional maintenance identity. It should&nbsp;<strong>not<\/strong>&nbsp;be used to bypass policy; it is there to evaluate relevance and false positives.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>logger -p local5.warning -t SENTINEL_D3 \\\n  'SENTINEL_D3_LAB actor=lab.maintenance@asterretail.example src=192.0.2.44 outcome=success event=authorized_maintenance'\n<\/code><\/pre>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Confirm this message reached Syslog.<\/li>\n\n\n\n<li>Observe that the current\u00a0<strong>two-source correlated rule should not trigger from Syslog alone<\/strong>\u00a0without matching CEF evidence. If it does, investigate the query rather than writing a broad exception.<\/li>\n\n\n\n<li>In a self-contained synthetic query, create a matching firewall event for maintenance and test whether a\u00a0<strong>scoped<\/strong>\u00a0documented maintenance exception would be justified. This avoids generating another live alert unnecessarily.<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\">C. Create an explicit decision table<\/h3>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th class=\"has-text-align-left\" data-align=\"left\">Test ID<\/th><th class=\"has-text-align-left\" data-align=\"left\">Source conditions<\/th><th class=\"has-text-align-left\" data-align=\"left\">Desired handling<\/th><th class=\"has-text-align-left\" data-align=\"left\">Expected lesson<\/th><\/tr><\/thead><tbody><tr><td>P1<\/td><td>Lab admin and CEF match; no change ticket<\/td><td>Alert \/ triage<\/td><td>Correlated signal worthy of review<\/td><\/tr><tr><td>P2<\/td><td>Same signal, novel source, repeated evidence<\/td><td>Review; possibly higher severity after corroboration<\/td><td>Not necessarily one alert per event<\/td><\/tr><tr><td>N1<\/td><td>Syslog only<\/td><td>No cross-source alert<\/td><td>A source-only event is not this detector&#8217;s target<\/td><\/tr><tr><td>N2<\/td><td>Different IP \/ outside time window<\/td><td>No alert<\/td><td>Avoid unrelated joins<\/td><\/tr><tr><td>B1<\/td><td>Approved maintenance identity, valid ticket\/time<\/td><td>Possible documented scoped exception<\/td><td>No unconditional identity allowlist<\/td><\/tr><tr><td>E1<\/td><td>Parser fails to populate actor<\/td><td>No high-fidelity account conclusion<\/td><td>Data-quality dependency<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">D. Apply a narrow, reversible refinement<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Prefer a strict actor match (when CEF parsed\u00a0<code>SourceUserName<\/code>\u00a0is demonstrably present) instead of the weakened L06 branch:<\/li>\n<\/ol>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/ Use this as a replacement predicate in the correlated query\n| where isnotempty(SourceUserName)\n| where tolower(Account) == tolower(SourceUserName)\n<\/code><\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li>Consider excluding\u00a0<strong>only approved maintenance action types within a real change window<\/strong>. An example of the\u00a0<em>logical requirement<\/em>, not a copy-paste production filter:<\/li>\n<\/ol>\n\n\n\n<pre class=\"wp-block-code\"><code>EXCLUDE ONLY IF:\n  account is in governed maintenance reference data\n  AND change ID matches an approved ticket\n  AND event UTC time is inside authorized start\/end\n  AND the behavior actually matches that change's permitted scope\n  AND detection owners have approved the exception\n<\/code><\/pre>\n\n\n\n<ol start=\"3\" class=\"wp-block-list\">\n<li>Re-run both positive and negative tests in the query editor. If the positive case disappears after strict account matching, investigate whether missing CEF parsing\u2014not benign behavior\u2014caused it.<\/li>\n\n\n\n<li>Update the rule in the approved lab only after showing the test evidence. Preserve previous query\/version, and document rollback.<\/li>\n\n\n\n<li>In rule configuration review\u00a0<strong>alert threshold<\/strong>,\u00a0<strong>event grouping<\/strong>,\u00a0<strong>incident grouping<\/strong>, and suppression options. These have distinct semantics: suppressing rule evaluations after an alert is not the same as excluding benign records in KQL. Avoid both alert storms and blind intervals. [R14]<\/li>\n\n\n\n<li>Record actual incident dispositions and owner-hand-off convention (for example, New \u2192 Active; then evidence-based classification), without using automatic closure for a security-critical situation.<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\">E. Quantify the effect carefully<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Report&nbsp;<strong>observed<\/strong>&nbsp;values rather than invented industry benchmarks:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th class=\"has-text-align-left\" data-align=\"left\">Measure<\/th><th class=\"has-text-align-right\" data-align=\"right\">Before<\/th><th class=\"has-text-align-right\" data-align=\"right\">After<\/th><th class=\"has-text-align-left\" data-align=\"left\">Interpretation<\/th><\/tr><\/thead><tbody><tr><td>Positive test cases detected<\/td><td class=\"has-text-align-right\" data-align=\"right\"><code>___\/___<\/code><\/td><td class=\"has-text-align-right\" data-align=\"right\"><code>___\/___<\/code><\/td><td>Should not lose true test cases<\/td><\/tr><tr><td>Negative test cases alerted<\/td><td class=\"has-text-align-right\" data-align=\"right\"><code>___\/___<\/code><\/td><td class=\"has-text-align-right\" data-align=\"right\"><code>___\/___<\/code><\/td><td>Should decrease or stay zero<\/td><\/tr><tr><td>Distinct source events<\/td><td class=\"has-text-align-right\" data-align=\"right\"><code>___<\/code><\/td><td class=\"has-text-align-right\" data-align=\"right\"><code>___<\/code><\/td><td>Dedup\/identity limitations recorded<\/td><\/tr><tr><td>Alerts \/ test window<\/td><td class=\"has-text-align-right\" data-align=\"right\"><code>___<\/code><\/td><td class=\"has-text-align-right\" data-align=\"right\"><code>___<\/code><\/td><td>Not a substitute for accuracy<\/td><\/tr><tr><td>Known false positives<\/td><td class=\"has-text-align-right\" data-align=\"right\"><code>___<\/code><\/td><td class=\"has-text-align-right\" data-align=\"right\"><code>___<\/code><\/td><td>Must be documented examples<\/td><\/tr><tr><td>Mean time to disposition in lab<\/td><td class=\"has-text-align-right\" data-align=\"right\"><code>___<\/code><\/td><td class=\"has-text-align-right\" data-align=\"right\"><code>___<\/code><\/td><td>Not a production SOC SLA<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>PASS D3-L11:<\/strong>&nbsp;One documented, reversible change with before\/after positive&nbsp;<em>and<\/em>&nbsp;negative evidence, clear source quality assumptions and a rollback plan.&nbsp;<strong>FAIL:<\/strong>&nbsp;\u201cWe filtered the admin account entirely, so noise is gone.\u201d<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Sources:<\/strong>&nbsp;[R13], [R14], [R21].<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">D3-L12 \u2014 Create non-playbook incident automation: safe tag + assignment (I12)<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Competency:<\/strong>&nbsp;Scope low-risk automation to this one&nbsp;<strong>training rule<\/strong>, test that a real incident is tagged\/assigned, and avoid loops or unintended cases.&nbsp;<strong>This lab deliberately excludes Logic Apps\/playbooks, account disabling, endpoint isolation, network blocks and notifications to external users<\/strong>&nbsp;(covered in Day 4 only).<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">A. Preflight: review the trigger\/action combinations<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Open\u00a0<strong>Microsoft Sentinel > Configuration > Automation<\/strong>\u00a0in the Defender portal.<\/li>\n\n\n\n<li>Select\u00a0<strong>Create > Automation rule<\/strong>. [R15]<\/li>\n\n\n\n<li>Choose\u00a0<strong>When incident is created<\/strong>\u00a0(or the currently available matching creation trigger) so you can use\u00a0<strong>Add tags<\/strong>,\u00a0<strong>Assign owner<\/strong>, and possibly\u00a0<strong>Change status<\/strong>. Do\u00a0<strong>not<\/strong>\u00a0choose\u00a0<strong>When alert is created<\/strong>\u00a0if the intent is incident metadata: Microsoft documents\u00a0<strong>Run playbook<\/strong>\u00a0as its available action on the basic alert trigger, not arbitrary incident fields. [R15]<\/li>\n\n\n\n<li>Decide on the\u00a0<strong>exact analytic rule name<\/strong>\u00a0condition, preferring\u00a0<strong>Analytic rule name<\/strong>\u00a0rather than just an incident title, since Defender can normalize or modify titles. If a different condition UI appears, record the actual supported condition and avoid widening the scope.<\/li>\n\n\n\n<li>Select an actual allowed SOC owner. A display name typed without a valid principal may be rejected or cause a rule error.<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\">B. Configure a reversible rule<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Use the following desired configuration, adapting field names to the wizard when required:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th class=\"has-text-align-left\" data-align=\"left\">Property<\/th><th class=\"has-text-align-left\" data-align=\"left\">Intended Day 3 setting<\/th><\/tr><\/thead><tbody><tr><td>Name<\/td><td><code>SENTINEL-D3-LAB-Tag-And-Assign<\/code><\/td><\/tr><tr><td>Trigger<\/td><td><strong>When incident is created<\/strong><\/td><\/tr><tr><td>Condition<\/td><td><strong>Analytic rule name<\/strong>&nbsp;contains&nbsp;<code>SENTINEL-D3-LAB-Privileged-Source-Correlation<\/code><\/td><\/tr><tr><td>Action 1<\/td><td>Add tag&nbsp;<code>TRAINING-D3-INTERMEDIATE<\/code><\/td><\/tr><tr><td>Action 2<\/td><td>Assign owner&nbsp;<strong>a real designated instructor \/ SOC lab user<\/strong><\/td><\/tr><tr><td>Action 3 (optional)<\/td><td>Set status&nbsp;<code>Active<\/code>&nbsp;only if instructor&#8217;s workflow allows it<\/td><\/tr><tr><td>Order \/ expiration<\/td><td>Explicitly scope\/order it; select expiration\/disable at cleanup where supported<\/td><\/tr><tr><td>Actions deliberately omitted<\/td><td>Run playbook, close incident, email outside lab, disable account, block IP<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Save the automation rule and verify that it appears enabled\u00a0<strong>only<\/strong>\u00a0for the intended lab scope.<\/li>\n\n\n\n<li>To test a\u00a0<strong>creation<\/strong>\u00a0trigger, generate\u00a0<strong>one new<\/strong>\u00a0bounded matched Syslog\/CEF pair after ensuring the rule was created and that the scheduled analytics rule is enabled. Existing incidents do\u00a0<strong>not<\/strong>\u00a0retroactively fire a newly created creation trigger.<\/li>\n\n\n\n<li>Wait for an actual\u00a0<strong>new<\/strong>\u00a0incident. Inspect its tag and owner; also inspect the automation execution\/audit information where available.<\/li>\n\n\n\n<li>If the same incident is grouped with an earlier one rather than a new incident being created, the creation trigger may not fire. Record the actual grouping behavior and arrange a controlled new-incident scenario if the training workspace allows it.<\/li>\n\n\n\n<li>Test the negative path: an incident from an\u00a0<strong>unrelated<\/strong>\u00a0rule must not receive the training tag\/owner because of this automation rule. Do not generate an unrelated production incident; instructor may use an already existing synthetic lab case or a documented rule-condition inspection.<\/li>\n\n\n\n<li>Write a rollback\/disable action and turn off the automation immediately after the test if the cohort does not need it for the capstone.<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\">C. Failure cases and troubleshooting<\/h3>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th class=\"has-text-align-left\" data-align=\"left\">Symptom<\/th><th class=\"has-text-align-left\" data-align=\"left\">Check first<\/th><th class=\"has-text-align-left\" data-align=\"left\">Do not do<\/th><\/tr><\/thead><tbody><tr><td>Rule never fired<\/td><td>New incident created&nbsp;<strong>after<\/strong>&nbsp;automation? condition matches actual analytics rule name?<\/td><td>Make an unrestricted rule<\/td><\/tr><tr><td>No owner assigned<\/td><td>Valid permitted principal? connector\/workspace RBAC?<\/td><td>Give Global Admin to everyone<\/td><\/tr><tr><td>Tag applied to wrong incidents<\/td><td>Scope, condition, rule order, case-sensitive assumptions<\/td><td>Ignore collateral tagging<\/td><\/tr><tr><td>Multiple updates\/re-triggering<\/td><td>Using updated trigger? update loop? idempotence and conditions<\/td><td>Use repeated loops as test<\/td><\/tr><tr><td>Action unavailable<\/td><td>Alert vs incident trigger differences; preview conditions<\/td><td>Assume portal is broken<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>PASS D3-L12:<\/strong>&nbsp;Real&nbsp;<strong>new<\/strong>&nbsp;lab incident has the intended tag and valid owner (and provenance is recorded), plus negative scope reasoning and rollback. A saved automation rule without observed effect is only PARTIAL.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Sources:<\/strong>&nbsp;[R15].<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">D3-L13 \u2014 Build a focused, operational workbook (I13)<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Competency:<\/strong>&nbsp;Create\u2014not merely view\u2014a custom operational workbook answering two specific questions:&nbsp;<strong>Is the new Linux\/CEF source alive?<\/strong>&nbsp;and&nbsp;<strong>Is the correlation showing recent evidence?<\/strong><\/p>\n\n\n\n<h3 class=\"wp-block-heading\">A. Permissions and design<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Verify\u00a0<strong>Workbook Contributor<\/strong>\u00a0at the destination resource-group scope (or equivalent workbook-write permission). An ordinary Sentinel incident-reader role is not automatically enough. [R16]<\/li>\n\n\n\n<li>Choose the same workspace as L02\/L03; confirm it uses a queryable tier for the tables required by the lab. Do not confuse a long-retention data-lake query with an active analytics-rule input.<\/li>\n\n\n\n<li>Plan three workbook elements: heading, trend\/volume chart, and source-health table. Optional fourth: real L06 correlation results.<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\">B. Create a workbook in Microsoft Defender portal<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Go to\u00a0<strong>Microsoft Sentinel > Threat management > Workbooks<\/strong>\u00a0and choose\u00a0<strong>Add workbook<\/strong>. Microsoft documents this as the from-scratch creation route. [R16]<\/li>\n\n\n\n<li>Select\u00a0<strong>Edit<\/strong>. Add a Markdown\/text section stating\u00a0<code>SENTINEL D3 \u2014 LAB DATA ONLY<\/code>\u00a0and the learner&#8217;s intended workspace.<\/li>\n\n\n\n<li>Add a query control. Set\u00a0<strong>Data source = Logs<\/strong>,\u00a0<strong>Resource type = Log Analytics<\/strong>, then select the exact lab workspace. Some menu labels are inside an editor dialog rather than top-level navigation; record your actual version.<\/li>\n\n\n\n<li>Paste the trend query below into the query component. Set visualization to an area, bar, or time chart if offered:<\/li>\n<\/ol>\n\n\n\n<pre class=\"wp-block-code\"><code>Syslog\n| where TimeGenerated &gt;= ago(24h)\n| where SyslogMessage contains \"SENTINEL_D3_LAB\"\n| summarize EventCount=count() by bin(TimeGenerated, 5m), Computer\n| order by TimeGenerated asc\n<\/code><\/pre>\n\n\n\n<ol start=\"5\" class=\"wp-block-list\">\n<li>Run it and inspect the output\u00a0<strong>before choosing a chart<\/strong>. If only one safe test event exists, the chart will show only a single bucket;\u00a0<strong>that is valid<\/strong>, not a visual defect. Do not generate excessive log volume to make the graph look pretty.<\/li>\n\n\n\n<li>Add a second query component, configured as a table, with source freshness:<\/li>\n<\/ol>\n\n\n\n<pre class=\"wp-block-code\"><code>Syslog\n| where TimeGenerated &gt;= ago(24h)\n| where SyslogMessage contains \"SENTINEL_D3_LAB\"\n| summarize Events=count(), LastSeenUTC=max(TimeGenerated) by Computer, Facility\n| order by LastSeenUTC desc\n<\/code><\/pre>\n\n\n\n<ol start=\"7\" class=\"wp-block-list\">\n<li>If CEF ingestion succeeded, add a third table:<\/li>\n<\/ol>\n\n\n\n<pre class=\"wp-block-code\"><code>CommonSecurityLog\n| where TimeGenerated &gt;= ago(24h)\n| where DeviceVendor == \"AsterLab\" and DeviceProduct == \"Firewall\"\n| summarize Events=count(), LastSeenUTC=max(TimeGenerated),\n            MissingSourceIP=countif(isempty(SourceIP))\n     by DeviceProduct, DeviceAction\n| order by LastSeenUTC desc\n<\/code><\/pre>\n\n\n\n<ol start=\"8\" class=\"wp-block-list\">\n<li>Optional: add a fourth results table using\u00a0<strong>D3-L06&#8217;s compact correlation candidate<\/strong>. Ensure its query is not inadvertently scheduled as an alert; workbook queries are read-only visualizations.<\/li>\n\n\n\n<li>Add a descriptive title\/labels:\u00a0<code>Synthetic Linux data volume<\/code>,\u00a0<code>Syslog last event<\/code>,\u00a0<code>CEF parsing health<\/code>,\u00a0<code>Correlated evidence \u2014 lab only<\/code>. Choose a consistent UTC time window.<\/li>\n\n\n\n<li>Select\u00a0<strong>Done editing<\/strong>, then\u00a0<strong>Save<\/strong>. Enter the exact workbook name\u00a0<code>Sentinel D3 - Source Quality and Correlation<\/code>, approved subscription\/resource group, and workspace association. [R16]<\/li>\n\n\n\n<li>Close and reopen the saved workbook. Verify it appears under the correct workspace and that all controls can query without author privileges on every data source.<\/li>\n\n\n\n<li>Where the Defender portal cannot display a supported visualization, Microsoft notes that\u00a0<strong>Open in Azure<\/strong>\u00a0may be required for some workbook features. This is an implementation exception, not a recommendation to use Azure portal for the whole course. [R16]<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\">C. Interpretation and validation questions<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Record the&nbsp;<em>actual<\/em>&nbsp;answers:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>What UTC time was the last successful Syslog event received? Is it within the tested period?<\/li>\n\n\n\n<li>Does CEF show\u00a0<code>MissingSourceIP<\/code>\u00a0greater than zero? If yes, what is the impact on L06 joins?<\/li>\n\n\n\n<li>Is an empty correlation chart due to data absence, a time filter, a KQL error, or a missing connector?<\/li>\n\n\n\n<li>Which query executes across the widest historical range? Can the workbook be bounded to reduce unnecessary queries?<\/li>\n\n\n\n<li>If this workbook is shared, who needs workbook-reader access and workspace Log Analytics read permissions?<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>PASS D3-L13:<\/strong>&nbsp;New saved workbook (not a screenshot of a default template), two functional original query components with real lab output, readable labels, reopened view, and correct student interpretation.&nbsp;<strong>PARTIAL:<\/strong>&nbsp;workbook saved but one query fails or data source unavailable; record it honestly.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Sources:<\/strong>&nbsp;[R16].<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">D3-L14 \u2014 Diagnose and repair intermediate failures systematically (I14)<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Competency:<\/strong>&nbsp;Trace a failure across&nbsp;<strong>source \u2192 network\/daemon \u2192 AMA \u2192 DCR \u2192 workspace \u2192 KQL \u2192 analytic rule \u2192 incident \u2192 automation \u2192 workbook<\/strong>. Students must fix safe simulated faults without destroying working lab infrastructure.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">A. Instructor troubleshooting decision tree<\/h3>\n\n\n\n<pre class=\"wp-block-preformatted\">NoYesNoYesNoYesNoYesNoYesNoYesNoYesNoYesWas test emitted on Linux?logger \/ application \/ daemonDid it reach local syslog listener?protocol + host firewall + port 514Is AMA running and VM associated to DCR?agent extension + DCR resource associationCorrect facility, severity and destination?DCR streams + workspace + duplicate facilitiesRows in target table after delay?AMA diagnostics + endpoint access + parsingDoes scoped KQL return rows?time filter + schema + join keysDid rule run and create an alert?interval + lookback + TimeGenerated + thresholdIncident and automation executed?incident settings + grouping + RBAC + triggerVerify final workbook and evidence pack<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">B. Non-destructive Linux checks<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Run on the actual collector host (approved diagnostic access required):<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code><em># Check services: no restart or configuration changes.<\/em>\nsudo systemctl status azuremonitoragent --no-pager\nsudo systemctl status rsyslog --no-pager || true\nsudo systemctl status syslog-ng --no-pager || true\n\n<em># Verify relevant TCP\/UDP listeners. Some routes use UNIX sockets locally.<\/em>\nsudo ss -lunp | grep ':514' || true\nsudo ss -ltnp | grep -E '(:28330|:514)' || true\n\n<em># Inspect rsyslog syntax without changing it (rsyslog systems only).<\/em>\nsudo rsyslogd -N1 2&gt;&amp;1 | tail -n 40 || true\n\n<em># Find recent agent and syslog service messages (redact secrets\/identifiers).<\/em>\nsudo journalctl -u azuremonitoragent --since '30 minutes ago' --no-pager | tail -n 60\nsudo journalctl -u rsyslog --since '30 minutes ago' --no-pager | tail -n 60 || true\n\n<em># Verify adequate free disk (full disk can halt logging).<\/em>\ndf -h \/\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Packet inspection&nbsp;<strong>only when explicitly permitted<\/strong>&nbsp;and only for a short bounded duration:&nbsp;<code>sudo tcpdump -ni lo udp port 514 -c 10<\/code>. Do not continuously capture traffic or export payloads outside the lab. Check that test traffic actually goes to loopback or the approved private listener. Microsoft documents port 514 to syslog daemon and a local AMA forwarding port such as 28330 in relevant architectures; the exact configured endpoint must be verified on your VM. [R06]<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">C. Scenario-based fault tests<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>T01 \u2014 DCR exists but Syslog is empty<\/strong><\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Verify the exact VM resource appears under the DCR resource associations.<\/li>\n\n\n\n<li>Confirm AMA extension\/service is healthy and that the destination workspace is correct.<\/li>\n\n\n\n<li>Confirm collection\u00a0<strong><code>local5<\/code>\u00a0Warning+<\/strong>\u00a0covers the\u00a0<code>logger<\/code>\u00a0event; re-run one bounded\u00a0<code>logger<\/code>\u00a0message.<\/li>\n\n\n\n<li>Query broad\u00a0<code>Syslog<\/code>\u00a0(without the marker filter), then narrow. Wait for documented processing delay.<\/li>\n\n\n\n<li>Record root cause.\u00a0<strong>Do not broaden every facility<\/strong>\u00a0as a permanent fix.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>T02 \u2014 CEF present in Syslog but not&nbsp;<code>CommonSecurityLog<\/code><\/strong><\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Check test message framing and\u00a0<code>-t CEF<\/code>\/syslog tag.<\/li>\n\n\n\n<li>Compare\u00a0<code>local4<\/code>\u00a0against actual received facility; verify the CEF stream\u00a0<code>Microsoft-CommonSecurityLog<\/code>\u00a0and its DCR association.<\/li>\n\n\n\n<li>Verify rsyslog\/syslog-ng forwarding configuration produced by the current Microsoft script.<\/li>\n\n\n\n<li>Check the raw message for a valid\u00a0<code>CEF:0|vendor|product|version|class|name|severity|extensions<\/code>\u00a0envelope.<\/li>\n\n\n\n<li>Record whether parser limitations, DCR routing, or an incorrectly generated CEF test was responsible.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>T03 \u2014 Duplicate alerts \/ excessive rows<\/strong><\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Count raw events in Syslog and\u00a0<code>CommonSecurityLog<\/code>\u00a0independently.<\/li>\n\n\n\n<li>Inspect repeated\u00a0<code>logger<\/code>\u00a0tests and DCR facility overlap.<\/li>\n\n\n\n<li>Compute join multiplicity; compare\u00a0<code>EvidencePairs<\/code>\u00a0to\u00a0<em>distinct source events<\/em>.<\/li>\n\n\n\n<li>Check alert-per-event versus one-alert grouping, incident grouping and rule suppression.<\/li>\n\n\n\n<li>Apply a scoped query correction; do not &#8216;fix&#8217; duplicates by simply closing all resulting incidents.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>T04 \u2014 Invalid or empty KQL join<\/strong><\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Run left and right subqueries independently and count rows in the same UTC window.<\/li>\n\n\n\n<li>Inspect column types (<code>SourceIP<\/code>,\u00a0<code>Account<\/code>,\u00a0<code>TimeGenerated<\/code>,\u00a0<code>SourceUserName<\/code>).<\/li>\n\n\n\n<li>Normalize only defensible join keys (e.g., case, whitespace); do not invent missing identity.<\/li>\n\n\n\n<li>Inspect whether both devices observed source IP from the same network vantage (NAT\/proxy may differ).<\/li>\n\n\n\n<li>Test a synthetic two-row join that must succeed, then return to the real query.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>T05 \u2014 Custom scheduled rule enabled but no alert<\/strong><\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Confirm KQL returns at least one\u00a0<em>recent real<\/em>\u00a0row during the intended lookback.<\/li>\n\n\n\n<li>Ensure its final results include\u00a0<code>TimeGenerated<\/code>\u00a0and query scheduling lookback \u2265 interval.<\/li>\n\n\n\n<li>Confirm rule is enabled, correct workspace\/table plan, no disabled incident setting, and appropriate alert threshold.<\/li>\n\n\n\n<li>Review evaluation timing and ingestion delay; simulation alone isn&#8217;t actual alert proof.<\/li>\n\n\n\n<li>Check whether the alert exists but is merged into an existing incident or hidden by portal filters.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>T06 \u2014 Incident exists but automation didn&#8217;t apply tag<\/strong><\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Confirm a\u00a0<strong>new incident<\/strong>\u00a0was created\u00a0<em>after<\/em>\u00a0automation was enabled.<\/li>\n\n\n\n<li>Check the actual analytic rule name against the automation condition.<\/li>\n\n\n\n<li>Confirm the trigger is incident creation, not alert creation; verify tag\/owner actions are supported.<\/li>\n\n\n\n<li>Review automation rule ordering and audit\/execution details, plus owner eligibility.<\/li>\n\n\n\n<li>Ensure incident grouping didn&#8217;t append an alert to an old incident without a creation event.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>T07 \u2014 Empty custom workbook<\/strong><\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Confirm workspace selection, query time range and connected tables.<\/li>\n\n\n\n<li>Run the workbook KQL in Logs separately; note its actual result.<\/li>\n\n\n\n<li>Confirm workbook reader and Log Analytics permissions; distinguish authorization failure from no results.<\/li>\n\n\n\n<li>Verify the workbook was saved\/reopened in the intended resource group.<\/li>\n\n\n\n<li>If a visualization isn&#8217;t available in Defender, use the documented Open in Azure option if allowed.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>T08 \u2014 UEBA\/TI table not available<\/strong><\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Ask whether the feature has actually been enabled and appropriate sources\/feeds installed.<\/li>\n\n\n\n<li>Check role\/permissions, source dependencies and elapsed processing time; note that absence may be expected.<\/li>\n\n\n\n<li>Use the synthetic exercise. Record feature as\u00a0<em>not verified<\/em>\u00a0rather than creating an unrelated broad subscription.<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\">D. Complete a root-cause journal<\/h3>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th class=\"has-text-align-left\" data-align=\"left\">Issue<\/th><th class=\"has-text-align-left\" data-align=\"left\">Initial symptom<\/th><th class=\"has-text-align-left\" data-align=\"left\">Reproduction<\/th><th class=\"has-text-align-left\" data-align=\"left\">Layer causing failure<\/th><th class=\"has-text-align-left\" data-align=\"left\">Evidence<\/th><th class=\"has-text-align-left\" data-align=\"left\">Smallest safe correction<\/th><th class=\"has-text-align-left\" data-align=\"left\">Re-test<\/th><th class=\"has-text-align-left\" data-align=\"left\">Revert if needed<\/th><\/tr><\/thead><tbody><tr><td>T01<\/td><td><\/td><td><\/td><td><\/td><td><\/td><td><\/td><td><\/td><td><\/td><\/tr><tr><td>T02<\/td><td><\/td><td><\/td><td><\/td><td><\/td><td><\/td><td><\/td><td><\/td><\/tr><tr><td>T03<\/td><td><\/td><td><\/td><td><\/td><td><\/td><td><\/td><td><\/td><td><\/td><\/tr><tr><td>T04<\/td><td><\/td><td><\/td><td><\/td><td><\/td><td><\/td><td><\/td><td><\/td><\/tr><tr><td>T05<\/td><td><\/td><td><\/td><td><\/td><td><\/td><td><\/td><td><\/td><td><\/td><\/tr><tr><td>T06<\/td><td><\/td><td><\/td><td><\/td><td><\/td><td><\/td><td><\/td><td><\/td><\/tr><tr><td>T07<\/td><td><\/td><td><\/td><td><\/td><td><\/td><td><\/td><td><\/td><td><\/td><\/tr><tr><td>T08<\/td><td><\/td><td><\/td><td><\/td><td><\/td><td><\/td><td><\/td><td><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>PASS D3-L14:<\/strong>&nbsp;Learner independently traces&nbsp;<strong>at least three<\/strong>&nbsp;different failure layers and records evidence for a corrected or conclusively isolated root cause. At least one must involve data collection\/quality and one detection\/incident stage. Do not intentionally disable shared collectors or revoke permissions to create a classroom exercise.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Sources:<\/strong>&nbsp;[R06], [R13], [R14], [R15], [R16], [R20].<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">3. End-of-Day 3 capstone \u2014 integrated, evidence-based examination<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">D3-CAP \u2014 Aster Retail: correlated privileged-source investigation<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Mission:<\/strong>&nbsp;An authorized Linux application test records a fictional privileged session. An approved firewall simulator emits a matching denied-traffic CEF event. You will prove ingestion, correlate it, enrich it, build an explainable detection, tune without losing signal, route the resulting training incident safely and demonstrate monitoring. Use your&nbsp;<strong>actual<\/strong>&nbsp;lab evidence and do not substitute fabricated console screenshots.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Learner execution steps<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Source design:<\/strong>\u00a0State why\u00a0<code>Syslog via AMA<\/code>\u00a0and\u00a0<code>CEF via AMA<\/code>\u00a0are selected, their role boundaries, expected tables, and the no-overlap facility design. Include one alternate integration pattern for a non-Microsoft source.<\/li>\n\n\n\n<li><strong>Telemetry:<\/strong>\u00a0Produce one approved Linux test event plus one CEF event (instructor-controlled if necessary); record source UTC timestamps, VM, DCR IDs, workspace, and observed row IDs\/fields.<\/li>\n\n\n\n<li><strong>Quality:<\/strong>\u00a0Show table-level\u00a0<code>TimeGenerated<\/code>, mapped source IP\/action, missing-field\/duplicate\/freshness analysis and any parsing caveats.<\/li>\n\n\n\n<li><strong>Correlation:<\/strong>\u00a0Demonstrate a joined result that uses an explicit ten-minute window and explain why IP equality is weak without an account match or similar additional evidence.<\/li>\n\n\n\n<li><strong>Context:<\/strong>\u00a0Use\u00a0<code>day3_privileged_accounts<\/code>\u00a0watchlist to identify the fictional high-value user and the reference-data owner. Discuss optional UEBA\/TI context honestly based on availability.<\/li>\n\n\n\n<li><strong>Detection:<\/strong>\u00a0Show a validated scheduled rule, low-risk lab severity, correct\u00a0<code>TimeGenerated<\/code>, entity mapping, current query schedule and alert threshold; demonstrate a\u00a0<strong>real<\/strong>\u00a0alert and incident if on Track A\/B.<\/li>\n\n\n\n<li><strong>Tuning:<\/strong>\u00a0Test a positive and negative case, preserve query versions, document any narrow exception and rollback.<\/li>\n\n\n\n<li><strong>Case operations:<\/strong>\u00a0Show a scope-limited creation automation that tags and assigns a\u00a0<strong>new<\/strong>\u00a0lab incident; produce action evidence and demonstrate safe negative scope.<\/li>\n\n\n\n<li><strong>Dashboard:<\/strong>\u00a0Open the original source-health workbook and answer whether Syslog and CEF are fresh, complete and correlated.<\/li>\n\n\n\n<li><strong>Troubleshooting:<\/strong>\u00a0Solve or isolate three injected\/documented problems using the diagnostic decision tree.<\/li>\n\n\n\n<li><strong>Closeout:<\/strong>\u00a0Disable noisy temporary artifacts and record how the instructor will remove or retain approved lab resources.<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\">Objective rubric (100 points)<\/h3>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th class=\"has-text-align-left\" data-align=\"left\">Competency<\/th><th class=\"has-text-align-right\" data-align=\"right\">Points<\/th><th class=\"has-text-align-left\" data-align=\"left\">Required observable evidence<\/th><\/tr><\/thead><tbody><tr><td>Collection selection\/architecture (I01\u2013I03)<\/td><td class=\"has-text-align-right\" data-align=\"right\">12<\/td><td>Correct patterns, owner, least privilege, facility separation<\/td><\/tr><tr><td>Working additional source + schema validation (I02\u2013I04)<\/td><td class=\"has-text-align-right\" data-align=\"right\">18<\/td><td>AMA\/DCR association, real Syslog plus CEF (or approved second source), correct destination records<\/td><\/tr><tr><td>Intermediate KQL + correlation (I05\u2013I06)<\/td><td class=\"has-text-align-right\" data-align=\"right\">18<\/td><td><code>let<\/code>\/join, window, parsed fields, source-attribution caveats, negative test<\/td><\/tr><tr><td>Watchlist + contextual judgment (I07\u2013I09)<\/td><td class=\"has-text-align-right\" data-align=\"right\">12<\/td><td>Queryable watchlist, correct enrichment; TI\/UEBA availability and interpretation<\/td><\/tr><tr><td>Custom scheduled detection (I10)<\/td><td class=\"has-text-align-right\" data-align=\"right\">15<\/td><td>Rule, actual alert and incident, mapping, schedule, threshold, test evidence<\/td><\/tr><tr><td>Measured detection tuning (I11)<\/td><td class=\"has-text-align-right\" data-align=\"right\">8<\/td><td>Before\/after positive and negative outcomes, rollback<\/td><\/tr><tr><td>Low-risk metadata automation (I12)<\/td><td class=\"has-text-align-right\" data-align=\"right\">7<\/td><td>New incident tagged and assigned with correct scope<\/td><\/tr><tr><td>New workbook (I13)<\/td><td class=\"has-text-align-right\" data-align=\"right\">5<\/td><td>Reopened saved workbook, working custom queries<\/td><\/tr><tr><td>Troubleshooting and documentation (I14)<\/td><td class=\"has-text-align-right\" data-align=\"right\">5<\/td><td>Three-layer evidence-based root cause journal<\/td><\/tr><tr><td><strong>Total<\/strong><\/td><td class=\"has-text-align-right\" data-align=\"right\"><strong>100<\/strong><\/td><td><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Mandatory operational competency gates<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">A learner obtains&nbsp;<strong>Day 3 Intermediate operational PASS<\/strong>&nbsp;only when:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>[ ] Score\u00a0<strong>at least 80\/100<\/strong>; and<\/li>\n\n\n\n<li>[ ] At least\u00a0<strong>one new source<\/strong>\u00a0genuinely ingested into the workspace and its schema was validated; and<\/li>\n\n\n\n<li>[ ] Correlation of\u00a0<strong>two actual telemetry sources<\/strong>\u00a0was demonstrated (not only\u00a0<code>datatable()<\/code>); and<\/li>\n\n\n\n<li>[ ] A queryable watchlist enrichment was shown or an explicitly approved equivalent business-context lookup demonstrated; and<\/li>\n\n\n\n<li>[ ] A\u00a0<strong>real custom scheduled detection<\/strong>\u00a0produced a real alert and incident; and<\/li>\n\n\n\n<li>[ ] At least one reversible false-positive\/tuning change passed positive and negative testing; and<\/li>\n\n\n\n<li>[ ] Incident metadata automation acted on a new\u00a0<strong>lab<\/strong>\u00a0incident with proper scoping; and<\/li>\n\n\n\n<li>[ ] One custom workbook was saved\/reopened and three troubleshooting layers were evidenced; and<\/li>\n\n\n\n<li>[ ] No unsafe production activity, uncontrolled ingestion or unapproved privileged changes occurred.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Restricted Track C rule:<\/strong>&nbsp;Learners can obtain a&nbsp;<strong>conceptual \/ design completion<\/strong>&nbsp;recognition if they meet the knowledge items and score threshold, but must complete outstanding live gates before being marked operationally qualified for Advanced. One may arrange a supervised remediation test; never change the grading rule retroactively.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Instructor answer key \/ expected reasoning<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Data connectors differ in event scope, privileges, transport, data schema and operational ownership. A connector installed from Content hub is\u00a0<strong>not<\/strong>\u00a0proof of a live event stream.<\/li>\n\n\n\n<li>Syslog\u00a0<code>local5<\/code>\u00a0and CEF\u00a0<code>local4<\/code>\u00a0are a documented\u00a0<em>lab design choice<\/em>, not universal facilities. DCR destination and collector must match the actual emitted record.<\/li>\n\n\n\n<li>One real emitted event may produce a row after processing delay. The precise row count is\u00a0<strong>not fixed<\/strong>\u00a0because the cohort may repeat tests, agent\/parser behavior varies, and grouping changes output.<\/li>\n\n\n\n<li>An IP+time join is weaker than a corroborated multi-attribute link. Joined row counts can multiply; count distinct underlying source events where required.<\/li>\n\n\n\n<li>Watchlists are governed reference data;\u00a0<code>SearchKey<\/code>\u00a0must match the selected CSV column. Missing lookup result is\u00a0<strong>unknown context<\/strong>, not an automatic safe classification.<\/li>\n\n\n\n<li>Indicators need validity, source, confidence, expiry and type; a match does not prove compromise. For 2026 use\u00a0<code>ThreatIntelIndicators<\/code>, not the old table.<\/li>\n\n\n\n<li>UEBA investigation priority and anomaly scores differ in range\/meaning; anomalies demand corroboration. Synthetic CEF doesn&#8217;t magically enable UEBA.<\/li>\n\n\n\n<li>Scheduled analytics must return source-based\u00a0<code>TimeGenerated<\/code>\u00a0and evaluate real records during the lookback. A saved rule or simulation alone isn&#8217;t a detected incident.<\/li>\n\n\n\n<li>Event grouping, incident grouping and suppression are distinct controls; false-positive exclusions need controlled tests and explicit rollback.<\/li>\n\n\n\n<li>Case metadata automation needs an\u00a0<strong>incident<\/strong>\u00a0trigger, not a basic alert trigger, for tag\/owner operations; preexisting incidents are not guaranteed to fire creation automations.<\/li>\n\n\n\n<li>Operational workbook data selection and user permissions should be verified independently. No chart result can mean a genuine zero, time mismatch or a permissions\/query failure.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">4. Classroom troubleshooting and evidence worksheet templates<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">4.1 One-page incident\/detection change record<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>Course: Microsoft Sentinel Intermediate \/ Day 3\nScenario: Aster Retail \u2014 entirely fictional security observations\nRule name and exported query version:\nRule author + review\/approval:\nWorkspace and data tier:\nData sources, DCRs, collector:\nSource test timestamps (UTC):\nLinux record observed (ID\/marker):\nCEF record observed (ID\/class\/vendor\/product):\nJoin key and time window:\nCorroborating identity context (or missing field):\nWatchlist alias + owner + review date:\nThreat indicator \/ UEBA status and limitations:\nBefore\/after detection positives and negatives:\nRule schedule, lookback, threshold, grouping:\nAlert ID and incident ID:\nAutomation rule name, trigger\/condition\/actions:\nAction evidence (tag + owner):\nWorkbook name\/URL or resource ID:\nFalse-positive assumptions and open risks:\nRevert plan:\nInstructor signature\/date:\n<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">4.2 Lab result ledger<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th class=\"has-text-align-left\" data-align=\"left\">Lab<\/th><th class=\"has-text-align-left\" data-align=\"left\">Date\/UTC<\/th><th class=\"has-text-align-left\" data-align=\"left\">Student<\/th><th class=\"has-text-align-left\" data-align=\"left\">Execution track<\/th><th class=\"has-text-align-left\" data-align=\"left\">Actual result<\/th><th class=\"has-text-align-left\" data-align=\"left\">Evidence ref<\/th><th class=\"has-text-align-left\" data-align=\"left\">PASS\/PARTIAL\/BLOCKED<\/th><th class=\"has-text-align-left\" data-align=\"left\">Instructor<\/th><\/tr><\/thead><tbody><tr><td>L01<\/td><td><\/td><td><\/td><td><\/td><td><\/td><td><\/td><td><\/td><td><\/td><\/tr><tr><td>L02<\/td><td><\/td><td><\/td><td><\/td><td><\/td><td><\/td><td><\/td><td><\/td><\/tr><tr><td>L03<\/td><td><\/td><td><\/td><td><\/td><td><\/td><td><\/td><td><\/td><td><\/td><\/tr><tr><td>L04<\/td><td><\/td><td><\/td><td><\/td><td><\/td><td><\/td><td><\/td><td><\/td><\/tr><tr><td>L05<\/td><td><\/td><td><\/td><td><\/td><td><\/td><td><\/td><td><\/td><td><\/td><\/tr><tr><td>L06<\/td><td><\/td><td><\/td><td><\/td><td><\/td><td><\/td><td><\/td><td><\/td><\/tr><tr><td>L07<\/td><td><\/td><td><\/td><td><\/td><td><\/td><td><\/td><td><\/td><td><\/td><\/tr><tr><td>L08<\/td><td><\/td><td><\/td><td><\/td><td><\/td><td><\/td><td><\/td><td><\/td><\/tr><tr><td>L09<\/td><td><\/td><td><\/td><td><\/td><td><\/td><td><\/td><td><\/td><td><\/td><\/tr><tr><td>L10<\/td><td><\/td><td><\/td><td><\/td><td><\/td><td><\/td><td><\/td><td><\/td><\/tr><tr><td>L11<\/td><td><\/td><td><\/td><td><\/td><td><\/td><td><\/td><td><\/td><td><\/td><\/tr><tr><td>L12<\/td><td><\/td><td><\/td><td><\/td><td><\/td><td><\/td><td><\/td><td><\/td><\/tr><tr><td>L13<\/td><td><\/td><td><\/td><td><\/td><td><\/td><td><\/td><td><\/td><td><\/td><\/tr><tr><td>L14<\/td><td><\/td><td><\/td><td><\/td><td><\/td><td><\/td><td><\/td><td><\/td><\/tr><tr><td>CAP<\/td><td><\/td><td><\/td><td><\/td><td><\/td><td><\/td><td><\/td><td><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">4.3 Technical troubleshooting matrix<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th class=\"has-text-align-left\" data-align=\"left\">Observable symptom<\/th><th class=\"has-text-align-left\" data-align=\"left\">Likely causes<\/th><th class=\"has-text-align-left\" data-align=\"left\">First safe verification<\/th><th class=\"has-text-align-left\" data-align=\"left\">Success criterion<\/th><\/tr><\/thead><tbody><tr><td>Linux event absent locally<\/td><td>Wrong daemon,&nbsp;<code>logger<\/code>&nbsp;failed, host access issue<\/td><td>Journal, daemon,&nbsp;<code>logger<\/code>&nbsp;output<\/td><td>Test marker observable on source\/daemon<\/td><\/tr><tr><td>Syslog table empty<\/td><td>AMA not installed, DCR not associated, facility mismatch<\/td><td>VM extension, DCR, broad Syslog query<\/td><td>Lab marker in target workspace<\/td><\/tr><tr><td>CEF not parsed<\/td><td>Wrong facility\/stream\/header\/forwarder script<\/td><td>Raw message, port 514,&nbsp;<code>CommonSecurityLog<\/code>&nbsp;query<\/td><td>Vendor\/product\/source columns populated<\/td><\/tr><tr><td>Duplicate CEF\/Syslog<\/td><td>DCR facility overlap, repeated test generation<\/td><td>DCR streams and event counts<\/td><td>Duplicates explained or corrected<\/td><\/tr><tr><td>Delay unexplained<\/td><td>Clock skew, ingestion pipeline, lag<\/td><td>UTC clocks + ingestion_time when available<\/td><td>Plausible evidence timeline<\/td><\/tr><tr><td>No KQL join<\/td><td>Mismatched IP\/time\/user, missing source<\/td><td>Execute sides independently<\/td><td>Correct positive case, negative case rejected<\/td><\/tr><tr><td>Watchlist no match<\/td><td>Wrong alias, SearchKey, casing, delayed creation<\/td><td><code>_GetWatchlist()<\/code>&nbsp;+ normalized keys<\/td><td>Intended context present<\/td><\/tr><tr><td>TI no table<\/td><td>No feed, wrong workspace, unsupported tier<\/td><td>Table list\/connector inventory<\/td><td>Availability recorded correctly<\/td><\/tr><tr><td>UEBA empty<\/td><td>Feature\/source not enabled, thin data, role<\/td><td>UEBA settings\/sources\/tables<\/td><td>No false claim of UEBA signal<\/td><\/tr><tr><td>Analytics no alert<\/td><td>Stale TimeGenerated, threshold, window, disabled rule<\/td><td>Saved query + interval\/lookback + rule status<\/td><td>Actual alert ID<\/td><\/tr><tr><td>Alert but no incident<\/td><td>Incident disabled, grouping, Defender view<\/td><td>Rule incident settings + incident filters<\/td><td>Actual incident ID or documented reason<\/td><\/tr><tr><td>Automation silent<\/td><td>Old incident, rule condition\/owner error<\/td><td>New incident UTC + rule action audit<\/td><td>Intended tag and owner<\/td><\/tr><tr><td>Workbook empty<\/td><td>Query\/time\/workspace\/permissions mismatch<\/td><td>Run KQL in Logs, reopen workbook<\/td><td>Expected query component result<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">5. Safe laboratory cleanup and post-course handover<\/h1>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\"><strong>Cleanup order matters.<\/strong>&nbsp;Stop active detections and automations before deleting the data sources or VM. Keep the Day 1\/Day 2 Sentinel workspace intact unless its owner explicitly authorized otherwise.<\/p>\n<\/blockquote>\n\n\n\n<h2 class=\"wp-block-heading\">Step 1 \u2014 Disable lab analytics and automation<\/h2>\n\n\n\n<ol class=\"wp-block-list\">\n<li>In\u00a0<strong>Microsoft Sentinel > Configuration > Analytics<\/strong>, find exactly\u00a0<code>SENTINEL-D3-LAB-Privileged-Source-Correlation<\/code>\u00a0and\u00a0<strong>disable<\/strong>\u00a0it. Confirm status; do not disable unrelated rules.<\/li>\n\n\n\n<li>In\u00a0<strong>Microsoft Sentinel > Configuration > Automation<\/strong>, disable exactly\u00a0<code>SENTINEL-D3-LAB-Tag-And-Assign<\/code>\u00a0and confirm no additional lab rule remains.<\/li>\n\n\n\n<li>If the course needs reproducible grading, export safe rule\/query configuration through an approved process; remove credentials and resource identifiers before sharing externally.<\/li>\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading\">Step 2 \u2014 Close\/document training-only incidents<\/h2>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Locate incidents created by the training rule. Preserve the necessary instructor evidence and disposition.<\/li>\n\n\n\n<li>Close according to the approved training classification (e.g., simulated\/benign test activity) and record that no real compromise occurred. Follow the actual available incident classification labels in your Defender tenant; don&#8217;t invent one.<\/li>\n\n\n\n<li>Verify automated ownership\/tagging has stopped on new incidents.<\/li>\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading\">Step 3 \u2014 Remove reference data and workbook (if exclusive to this lab)<\/h2>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Delete or retain\u00a0<code>day3_privileged_accounts<\/code>\u00a0only according to the course retention plan. It should not become a production privileged account authority.<\/li>\n\n\n\n<li>Delete or retain\u00a0<code>Sentinel D3 - Source Quality and Correlation<\/code>\u00a0based on whether it belongs to a shared teaching library. Avoid deleting a workbook created by another cohort.<\/li>\n\n\n\n<li>Record the names, dates, owners and decision in the artifact register.<\/li>\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading\">Step 4 \u2014 Remove CEF\/Syslog DCRs and extensions responsibly<\/h2>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Identify the exact training-created DCRs and their VM associations in Azure Monitor.<\/li>\n\n\n\n<li><strong>Do not delete a shared agent, shared DCR or monitoring association.<\/strong>\u00a0If the VM is dedicated and no other sources depend on the DCR, remove the training-only associations\/rules with owner approval.<\/li>\n\n\n\n<li>Remove the training-only forwarder configuration or shut down the dedicated VM per infrastructure policy. If Microsoft&#8217;s forwarder script changed rsyslog files, remove only the generated configuration and validate the remaining daemon; do not casually overwrite system config.<\/li>\n\n\n\n<li>Reconcile the final VM state: stopped\/deallocated or deleted if exclusive to the lab. Deallocation may stop VM compute charges but persistent disks\/public IP resources can still incur costs; inspect Azure Cost Management.<\/li>\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading\">Step 5 \u2014 Verify post-lab safety and spending<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>[ ] No active Day 3 scheduled analytics rule.<\/li>\n\n\n\n<li>[ ] No active Day 3 metadata automation.<\/li>\n\n\n\n<li>[ ] All training incidents documented and dispositioned per lab policy.<\/li>\n\n\n\n<li>[ ] Watchlist\/workbook ownership resolved.<\/li>\n\n\n\n<li>[ ] Temporary Linux test VM, DCRs and forwarding settings handled with owner approval.<\/li>\n\n\n\n<li>[ ] Correct Sentinel workspace remains as planned for Days 4\u20135.<\/li>\n\n\n\n<li>[ ] No unexpected collection\/ingestion costs or real customer data exposure.<\/li>\n\n\n\n<li>[ ] A final cleanup record was signed.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">6. Exact syllabus-to-lab coverage audit<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">This table is the mechanical&nbsp;<strong>non-duplication<\/strong>&nbsp;and&nbsp;<strong>completeness<\/strong>&nbsp;crosswalk. Day 1\/2 content is assumed as a prerequisite, not re-taught.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th class=\"has-text-align-left\" data-align=\"left\">Intermediate topic<\/th><th class=\"has-text-align-left\" data-align=\"left\">Main lab(s)<\/th><th class=\"has-text-align-left\" data-align=\"left\">Practical objective<\/th><th class=\"has-text-align-left\" data-align=\"left\">Evidence gate<\/th><\/tr><\/thead><tbody><tr><td><strong>I01<\/strong>&nbsp;Expand data-source coverage<\/td><td>L01<\/td><td>Connector decision matrix<\/td><td>Chosen route + ownership<\/td><\/tr><tr><td><strong>I02<\/strong>&nbsp;Linux\/network telemetry, AMA, Syslog\/CEF, DCR<\/td><td>L02, L03<\/td><td>Configure approved agent\/forwarder\/DCR<\/td><td>Real target-table events<\/td><\/tr><tr><td><strong>I03<\/strong>&nbsp;Third-party and multicloud intake<\/td><td>L03<\/td><td>Select and compare AWS\/GCP\/firewall\/app patterns<\/td><td>Documented integration matrix<\/td><\/tr><tr><td><strong>I04<\/strong>&nbsp;Pipeline validation<\/td><td>L04<\/td><td>Schema, timestamps, latency, duplicates<\/td><td>Fidelity report<\/td><\/tr><tr><td><strong>I05<\/strong>&nbsp;Intermediate KQL<\/td><td>L05<\/td><td><code>let<\/code>,&nbsp;<code>join<\/code>,&nbsp;<code>union<\/code>,&nbsp;<code>extend<\/code>,&nbsp;<code>parse<\/code>,&nbsp;<code>mv-expand<\/code>,&nbsp;<code>distinct<\/code><\/td><td>Eight correct query exercises<\/td><\/tr><tr><td><strong>I06<\/strong>&nbsp;Identity\/infrastructure correlation<\/td><td>L06<\/td><td>Time-bounded two-source join<\/td><td>Positive\/negative evidence<\/td><\/tr><tr><td><strong>I07<\/strong>&nbsp;Watchlist enrichment<\/td><td>L07<\/td><td>CSV \u2192 SearchKey \u2192&nbsp;<code>_GetWatchlist<\/code>&nbsp;join<\/td><td>Enriched record + owner<\/td><\/tr><tr><td><strong>I08<\/strong>&nbsp;Threat indicators<\/td><td>L08<\/td><td>Validity, confidence, expiry, source<\/td><td>Live read or synthetic TI exercise<\/td><\/tr><tr><td><strong>I09<\/strong>&nbsp;UEBA introduction<\/td><td>L09<\/td><td>Enable\/consume only if authorized; interpret scores<\/td><td>Live read or authorized substitute<\/td><\/tr><tr><td><strong>I10<\/strong>&nbsp;Custom scheduled rule<\/td><td>L10<\/td><td>KQL, mapping, threshold, lookback, incident<\/td><td>Real alert and incident<\/td><\/tr><tr><td><strong>I11<\/strong>&nbsp;Detection tuning\/incident flow<\/td><td>L11<\/td><td>Scoped exceptions, grouping, precision proxy<\/td><td>Before\/after test matrix<\/td><\/tr><tr><td><strong>I12<\/strong>&nbsp;Metadata automation (no playbooks)<\/td><td>L12<\/td><td>Created-incident scoped tag\/assignment<\/td><td>New tagged\/assigned incident<\/td><\/tr><tr><td><strong>I13<\/strong>&nbsp;Focused workbook<\/td><td>L13<\/td><td>Saved original source-quality visualization<\/td><td>Reopened functioning workbook<\/td><\/tr><tr><td><strong>I14<\/strong>&nbsp;Intermediate failures<\/td><td>L14<\/td><td>Multi-layer troubleshooting<\/td><td>Root-cause journal<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Day 4 reserved material:<\/strong>&nbsp;ASIM-based detection engineering, detailed threat hunting\/ATT&amp;CK mapping, NRT vs scheduled\/custom detection strategy, Logic Apps\/playbook construction, managed identity and response approval gates.&nbsp;<strong>Day 5 reserved material:<\/strong>&nbsp;enterprise workspace architecture, lake\/storage strategy, KQL jobs, content-as-code CI\/CD, SOC metrics, health\/audit operationalization and full production governance. Do not repeat those modules here.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">7. Official Microsoft source register (verified for this edition)<\/h1>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">Links below point to&nbsp;<strong>Microsoft Learn documentation reviewed for this manual<\/strong>, not to any user tenant. Microsoft can revise documentation and portal screens; before running a future cohort, re-check pages, particularly connector and licensing guidance. These are the sources for the documented procedures, not proof of a successful run in the training subscription.<\/p>\n<\/blockquote>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th class=\"has-text-align-left\" data-align=\"left\">Ref<\/th><th class=\"has-text-align-left\" data-align=\"left\">Official documentation<\/th><th class=\"has-text-align-left\" data-align=\"left\">Used for<\/th><\/tr><\/thead><tbody><tr><td><strong>R01<\/strong><\/td><td><a href=\"https:\/\/learn.microsoft.com\/en-us\/azure\/sentinel\/microsoft-sentinel-defender-portal\">Microsoft Sentinel in the Defender portal<\/a><\/td><td>Primary experience, migration, limitations, UI navigation<\/td><\/tr><tr><td><strong>R02<\/strong><\/td><td><a href=\"https:\/\/learn.microsoft.com\/en-us\/azure\/sentinel\/connect-cef-syslog-ama\">Ingest Syslog and CEF messages to Microsoft Sentinel with AMA<\/a><\/td><td>Connector prerequisites, DCR wizard, Linux tests, CEF examples<\/td><\/tr><tr><td><strong>R03<\/strong><\/td><td><a href=\"https:\/\/learn.microsoft.com\/en-us\/azure\/sentinel\/cef-syslog-ama-overview\">Syslog and CEF AMA connector overview<\/a><\/td><td>Architecture, facility overlap and duplicate avoidance<\/td><\/tr><tr><td><strong>R04<\/strong><\/td><td><a href=\"https:\/\/learn.microsoft.com\/en-us\/azure\/sentinel\/connect-data-sources\">Connect data sources to Microsoft Sentinel<\/a><\/td><td>Connectors\/selection foundations<\/td><\/tr><tr><td><strong>R05<\/strong><\/td><td><a href=\"https:\/\/learn.microsoft.com\/en-us\/azure\/azure-monitor\/agents\/azure-monitor-agent-supported-operating-systems\">AMA supported operating systems and environments<\/a><\/td><td>Collector host compatibility, Azure Arc applicability<\/td><\/tr><tr><td><strong>R06<\/strong><\/td><td><a href=\"https:\/\/learn.microsoft.com\/en-us\/azure\/sentinel\/cef-syslog-ama-troubleshooting\">Troubleshoot Syslog and CEF via AMA<\/a><\/td><td>Agent\/rsyslog\/port checks, 20-minute ingestion allowance<\/td><\/tr><tr><td><strong>R07<\/strong><\/td><td><a href=\"https:\/\/learn.microsoft.com\/en-us\/kusto\/query\/\">Kusto Query Language documentation<\/a><\/td><td>Operator meanings and reproducible KQL exercises<\/td><\/tr><tr><td><strong>R08<\/strong><\/td><td><a href=\"https:\/\/learn.microsoft.com\/en-us\/azure\/sentinel\/watchlists\">Use watchlists to correlate and enrich event data<\/a><\/td><td><code>_GetWatchlist<\/code>, SearchKey, stewardship and limits<\/td><\/tr><tr><td><strong>R09<\/strong><\/td><td><a href=\"https:\/\/learn.microsoft.com\/en-us\/azure\/sentinel\/watchlists-create\">Create watchlists in Microsoft Sentinel<\/a><\/td><td>CSV upload, alias, wizard, SearchKey<\/td><\/tr><tr><td><strong>R10<\/strong><\/td><td><a href=\"https:\/\/learn.microsoft.com\/en-us\/azure\/sentinel\/understand-threat-intelligence\">Threat intelligence in Microsoft Sentinel<\/a><\/td><td>Modern TI lifecycle, table transitions<\/td><\/tr><tr><td><strong>R11<\/strong><\/td><td><a href=\"https:\/\/learn.microsoft.com\/en-us\/azure\/sentinel\/work-with-stix-objects-indicators\">Work with STIX objects and indicators<\/a><\/td><td><code>ThreatIntelIndicators<\/code>\/<code>ThreatIntelObjects<\/code>&nbsp;and legacy retirement<\/td><\/tr><tr><td><strong>R12<\/strong><\/td><td><a href=\"https:\/\/learn.microsoft.com\/en-us\/azure\/sentinel\/enable-entity-behavior-analytics\">Enable User and Entity Behavior Analytics<\/a><\/td><td>UEBA roles, setup, supported data, optional anomaly toggle<\/td><\/tr><tr><td><strong>R13<\/strong><\/td><td><a href=\"https:\/\/learn.microsoft.com\/en-us\/azure\/sentinel\/create-analytics-rules?tabs=defender-portal\">Create a scheduled analytics rule<\/a><\/td><td>New scheduled rule wizard, mapping,&nbsp;<code>TimeGenerated<\/code><\/td><\/tr><tr><td><strong>R14<\/strong><\/td><td><a href=\"https:\/\/learn.microsoft.com\/en-us\/azure\/sentinel\/scheduled-rules-overview\">Scheduled analytics rule options and behavior<\/a><\/td><td>Thresholds, event grouping, interval\/lookback, ingestion delay<\/td><\/tr><tr><td><strong>R15<\/strong><\/td><td><a href=\"https:\/\/learn.microsoft.com\/en-us\/azure\/sentinel\/create-manage-use-automation-rules\">Create and use Microsoft Sentinel automation rules<\/a><\/td><td>Incident trigger\/actions, scoping, audit, preview differences<\/td><\/tr><tr><td><strong>R16<\/strong><\/td><td><a href=\"https:\/\/learn.microsoft.com\/en-us\/azure\/sentinel\/monitor-your-data\">Visualize and monitor by using workbooks<\/a><\/td><td>New custom workbook, permissions, save\/refresh<\/td><\/tr><tr><td><strong>R17<\/strong><\/td><td><a href=\"https:\/\/learn.microsoft.com\/en-us\/azure\/azure-monitor\/reference\/tables\/threatintelindicators\">ThreatIntelIndicators table schema<\/a><\/td><td>Validity\/confidence\/revocation\/observable columns<\/td><\/tr><tr><td><strong>R18<\/strong><\/td><td><a href=\"https:\/\/learn.microsoft.com\/en-us\/azure\/sentinel\/identify-threats-with-entity-behavior-analytics\">Advanced threat detection with UEBA<\/a><\/td><td>Risk score interpretation and behavior context<\/td><\/tr><tr><td><strong>R19<\/strong><\/td><td><a href=\"https:\/\/learn.microsoft.com\/en-us\/azure\/azure-monitor\/reference\/tables\/behavioranalytics\">BehaviorAnalytics table schema<\/a><\/td><td>UEBA field names and scoring output<\/td><\/tr><tr><td><strong>R20<\/strong><\/td><td><a href=\"https:\/\/learn.microsoft.com\/en-us\/azure\/azure-monitor\/reference\/tables\/commonsecuritylog\">CommonSecurityLog schema<\/a><\/td><td>CEF parsed field names and meanings<\/td><\/tr><tr><td><strong>R21<\/strong><\/td><td><a href=\"https:\/\/learn.microsoft.com\/en-us\/azure\/sentinel\/best-practices\">Microsoft Sentinel best practices<\/a><\/td><td>Collection, detection quality and query efficiency<\/td><\/tr><tr><td><strong>R22<\/strong><\/td><td><a href=\"https:\/\/learn.microsoft.com\/en-us\/azure\/sentinel\/threat-detection\">Threat detection in Microsoft Sentinel<\/a><\/td><td>Scheduled vs modern unified custom detections and guidance<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>2026 design note on rule engines:<\/strong>&nbsp;The syllabus explicitly asks students to&nbsp;<strong>author a custom scheduled analytics rule<\/strong>&nbsp;in Day 3 (I10), so that hands-on procedure is retained here. Microsoft&#8217;s newer Defender&nbsp;<strong>custom detections<\/strong>&nbsp;experience is relevant and may be preferable for some production deployments; a complete comparison belongs to&nbsp;<strong>Advanced Day 4<\/strong>, not a replacement of this skill requirement. [R22]<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">8. Final quality checklist for the training provider<\/h1>\n\n\n\n<ul class=\"wp-block-list\">\n<li>[ ] This is\u00a0<strong>Day 3 alone<\/strong>; Day 1\/2 material is referenced as prerequisite, not repeated.<\/li>\n\n\n\n<li>[ ] Every syllabus item I01\u2013I14 has its own practical lab coverage and a PASS standard.<\/li>\n\n\n\n<li>[ ] Instructions clearly distinguish real ingestion, in-query synthetic data and optional integrations.<\/li>\n\n\n\n<li>[ ] Every Azure resource operation identifies the intended tenant\/workspace\/VM and appropriate permission.<\/li>\n\n\n\n<li>[ ] There is no uncontrolled public syslog listener, external malicious infrastructure, credential leak or disruptive remediation.<\/li>\n\n\n\n<li>[ ] Source and destination schemas are inspected before claiming a valid correlation.<\/li>\n\n\n\n<li>[ ] Source-linked timestamps are retained in scheduled analytics query output.<\/li>\n\n\n\n<li>[ ] TI and UEBA instructions describe current tables\/roles and optional branches.<\/li>\n\n\n\n<li>[ ] Rule, incident and metadata automation must have\u00a0<strong>observed<\/strong>\u00a0success, not only saved configuration.<\/li>\n\n\n\n<li>[ ] Workbook and DCR resources have explicit cleanup owners.<\/li>\n\n\n\n<li>[ ] Capstone grade and critical skills gate are reproducible and auditable.<\/li>\n\n\n\n<li>[ ] Instructor verifies tenant-specific menus, licensed features and cost before classroom delivery.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>End of Microsoft Sentinel Day 3 Intermediate Gold Standard Hands-On Lab Guide.<\/strong><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Module 2: Intermediate |&nbsp;Day 3 only&nbsp;| Complete instructor-and-learner manual Edition:&nbsp;1 November 2026Course:&nbsp;Microsoft Sentinel Technical Training \u2014 5-day progressive curriculumThis document:&nbsp;Day 3 only; prerequisite: successful completion of Foundations&#8230; <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-1266","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"_links":{"self":[{"href":"https:\/\/www.devopsschool.com\/tutorials\/wp-json\/wp\/v2\/posts\/1266","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.devopsschool.com\/tutorials\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.devopsschool.com\/tutorials\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/tutorials\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/tutorials\/wp-json\/wp\/v2\/comments?post=1266"}],"version-history":[{"count":2,"href":"https:\/\/www.devopsschool.com\/tutorials\/wp-json\/wp\/v2\/posts\/1266\/revisions"}],"predecessor-version":[{"id":1274,"href":"https:\/\/www.devopsschool.com\/tutorials\/wp-json\/wp\/v2\/posts\/1266\/revisions\/1274"}],"wp:attachment":[{"href":"https:\/\/www.devopsschool.com\/tutorials\/wp-json\/wp\/v2\/media?parent=1266"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.devopsschool.com\/tutorials\/wp-json\/wp\/v2\/categories?post=1266"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.devopsschool.com\/tutorials\/wp-json\/wp\/v2\/tags?post=1266"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}