{"id":1264,"date":"2026-11-01T07:05:52","date_gmt":"2026-11-01T07:05:52","guid":{"rendered":"https:\/\/www.devopsschool.com\/tutorials\/?p=1264"},"modified":"2026-11-01T07:08:59","modified_gmt":"2026-11-01T07:08:59","slug":"microsoft-sentinel-advance-one-complete-end-to-end-hands-on-lab-part-4","status":"publish","type":"post","link":"https:\/\/www.devopsschool.com\/tutorials\/microsoft-sentinel-advance-one-complete-end-to-end-hands-on-lab-part-4\/","title":{"rendered":"Microsoft Sentinel Advance: One Complete End-to-End Hands-On Lab &#8211; Part &#8211; 4"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\">Module 3: Advanced |&nbsp;<strong>Day 4 only<\/strong>&nbsp;| Detection Engineering, Threat Hunting and SOAR<\/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>Curriculum version:<\/strong>&nbsp;1 November 2026<br><strong>Course:<\/strong>&nbsp;Five-day progressive Microsoft Sentinel technical training<br><strong>This manual:<\/strong>&nbsp;Day 4 only \u2014 syllabus competencies&nbsp;<strong>A01\u2013A14<\/strong><br><strong>Prerequisite:<\/strong>&nbsp;Demonstrated successful completion of Days 1\u20133<br><strong>Primary SIEM experience:<\/strong>&nbsp;<a href=\"https:\/\/security.microsoft.com\/\">Microsoft Defender portal<\/a><br><strong>Format:<\/strong>&nbsp;Day-wise, guided technical lab manual;&nbsp;<strong>no hourly schedule<\/strong><br><strong>Authorized use:<\/strong>&nbsp;Isolated, instructor-approved environment with invented identities and data<br><strong>Source basis:<\/strong>&nbsp;The uploaded&nbsp;<em>Module 3 \u2014 Advanced<\/em>&nbsp;agenda, supplemented by Microsoft Learn verification (references at end)<\/p>\n<\/blockquote>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">READ FIRST \u2014 accuracy, scope, grading and safe execution<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>This is a workbook, not a proof that anything ran.<\/strong>&nbsp;The UI paths and product behaviors were checked against official Microsoft Learn guidance available on 1 November 2026; local KQL fixtures were checked for coherent data relationships and intended assertions. There is&nbsp;<strong>no authenticated test against your Azure tenant<\/strong>. Portal releases, Defender feature entitlements, region availability, enabled tables, workflow connectors, access roles and approval-provider licensing can change results. Every lab separates (a) reproducible&nbsp;<em>offline\/synthetic<\/em>&nbsp;evidence, (b)&nbsp;<em>live tenant<\/em>&nbsp;evidence and (c) feature-dependent alternatives. A learner may not report a cloud integration as&nbsp;<strong>PASS<\/strong>&nbsp;without directly observing its required state and logs.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Never<\/strong>&nbsp;use actual compromised accounts, endpoint isolation, real firewall blocks, account disablement, unapproved tickets or privileged remediation as training actions. Use synthetic incident titles beginning&nbsp;<code>D4-LAB-<\/code>, fictitious users in&nbsp;<code>aster.example<\/code>, and TEST-NET example IPs (<code>198.51.100.0\/24<\/code>,&nbsp;<code>203.0.113.0\/24<\/code>). These addresses are placeholders&nbsp;<strong>only<\/strong>; do not send traffic to them. Prefer manual playbook execution against a labeled incident before enabling an automatic rule. Do not expose Logic Apps connection credentials in screenshots.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Important 2026 distinctions:<\/strong><\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>The\u00a0<strong>Defender portal<\/strong>\u00a0is the primary UI; Microsoft says Sentinel&#8217;s Azure portal experience ends after\u00a0<strong>31 March 2027<\/strong>\u00a0[R01]. You will still administer Azure resources in the Azure portal.<\/li>\n\n\n\n<li><strong>ASIM<\/strong>\u00a0is a query-time normalization model. A parser returning normalized fields does\u00a0<strong>not<\/strong>\u00a0imply all source vendors are covered or the events are trustworthy [R02\u2013R03].<\/li>\n\n\n\n<li><strong>Sentinel NRT rules<\/strong>\u00a0run once per minute and have rule-specific restrictions. Microsoft also recommends\u00a0<strong>unified custom detections<\/strong>\u00a0for eligible integrated Defender experiences;\u00a0<strong>do not equate<\/strong>\u00a0the two systems or promise equivalent licenses [R04\u2013R05].<\/li>\n\n\n\n<li><strong>Hunting bookmarks can be viewed but not newly created in the Defender portal<\/strong>; advanced hunting does not support the old bookmark action. Preserve a hunt with saved query text and an evidence ledger instead [R06].<\/li>\n\n\n\n<li><strong>Playbook trigger options now include newer case-based experiences and legacy incident options<\/strong>. The actual trigger and automation-rule compatibility depend on the tenant. Match the trigger shown in\u00a0<strong>your<\/strong>\u00a0portal, rather than mixing an incident-triggered rule with a case-triggered workflow [R07\u2013R09].<\/li>\n\n\n\n<li><strong>Logic Apps costs extra<\/strong>; granting Sentinel permission to run a playbook is separate from granting an engineer permission to edit it [R08].<\/li>\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading\">Learning outcome and 5W1H contract<\/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\">Lens<\/th><th class=\"has-text-align-left\" data-align=\"left\">Day 4 operational answer<\/th><\/tr><\/thead><tbody><tr><td><strong>What?<\/strong><\/td><td>ASIM, source\/parser contracts, quality-engineered detections, NRT vs scheduled, hypothesis hunts, ATT&amp;CK, Logic Apps\/SOAR<\/td><\/tr><tr><td><strong>Why?<\/strong><\/td><td>Make heterogeneous signals comparable, reduce false attribution, test detection reliability and safely orchestrate repetitive investigation<\/td><\/tr><tr><td><strong>Who?<\/strong><\/td><td>Detection author, data steward, SOC analyst\/hunter, workflow operator, incident commander, business\/system approver<\/td><\/tr><tr><td><strong>When?<\/strong><\/td><td>Normalize when source schemas diverge; hunt when a falsifiable question exists; automate only after authorization and negative-path testing<\/td><\/tr><tr><td><strong>Where?<\/strong><\/td><td>Sentinel-enabled workspace, Defender advanced hunting\/Sentinel configuration, Azure Logic Apps resource group and approved ticket sandbox<\/td><\/tr><tr><td><strong>How?<\/strong><\/td><td>Validate parsers \u2192 detect a time-ordered sequence \u2192 test good and bad cases \u2192 hunt and record uncertainty \u2192 deploy guarded workflow \u2192 review run history<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Aster Retail \u2014 the continuing case<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Aster Retail (entirely fictional) has a privileged identity&nbsp;<code>admin@aster.example<\/code>. A simulated sign-in, unusual firewall observation and a subsequent role grant suggest possible misuse. On Day 3 students already completed&nbsp;<strong>second-source ingestion, KQL joining, watchlist enrichment, a tuned rule, incident metadata and a workbook<\/strong>. On&nbsp;<strong>Day 4<\/strong>, the new work is&nbsp;<strong>normalized detections, test design, structured hunting, and approval-gated SOAR<\/strong>. Do&nbsp;<strong>not<\/strong>&nbsp;repeat Day 3&#8217;s onboarding or watchlist exercises.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">YesNo \/ timeoutVendor-specific activityASIM parser contractMulti-stage detection KQLPositive \/ negative regression testsHypothesis-led hunt + ATT&amp;CKLab incident \/ caseSentinel automation ruleLogic Apps playbookLab scope + approval?Non-disruptive update + auditStop; record rejection<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Lab tracks and definition of PASS<\/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\">Available environment<\/th><th class=\"has-text-align-left\" data-align=\"left\">What can be demonstrated<\/th><th class=\"has-text-align-left\" data-align=\"left\">Allowed result<\/th><\/tr><\/thead><tbody><tr><td><strong>A \u2014 full lab<\/strong><\/td><td>Sentinel workspace, permitted test incident\/case, supported parser sources, Logic Apps and approval connector<\/td><td>Full ASIM \u2192 detection \u2192 hunt \u2192 playbook \u2192 run-history chain<\/td><td>Operational PASS if each evidence gate passes<\/td><\/tr><tr><td><strong>B \u2014 shared instructor lab<\/strong><\/td><td>Instructor operates restricted Azure resources, learners perform KQL, design and observe controlled runs<\/td><td>Same sequence with signed attribution of instructor-controlled steps<\/td><td>Competency PASS with operator attribution<\/td><\/tr><tr><td><strong>C \u2014 synthetic-only<\/strong><\/td><td>KQL editor or offline worksheets; no connector\/licensing<\/td><td>Fixture queries, reasoning, workflow design and fault analysis<\/td><td>Conceptual PASS only;&nbsp;<strong>not live deployment<\/strong><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Day 4 completion gate:<\/strong>&nbsp;An ASIM source contract; query optimization justification; a multi-stage query and positive\/negative test matrix; a falsifiable hunt and ATT&amp;CK mapping; an approval-gated workflow; proof of approve\/reject or equivalent safe negative-path tests; permission review; and one troubleshooting report. See final rubric. An offline mock-up is valuable but not a substitute for a real Logic Apps run.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Required instructor preflight (before Day 4)<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>[ ] Confirm the\u00a0<em>specific<\/em>\u00a0Entra tenant, Azure subscription ID, Sentinel-enabled Log Analytics workspace, region, approved resource group and least-privileged instructor account.<\/li>\n\n\n\n<li>[ ] Preserve working Day 3 queries, a test analytics rule, a\u00a0<strong>test<\/strong>\u00a0incident, watchlist owner, source records and a saved query timestamp (UTC). Do not use real alerts containing personal data.<\/li>\n\n\n\n<li>[ ] Confirm usable source tables for ASIM (for example DNS, authentication or network session). A built-in parser may exist even if\u00a0<strong>zero supported events<\/strong>\u00a0exist.<\/li>\n\n\n\n<li>[ ] Confirm ability to use\u00a0<strong>Sentinel > Configuration > Analytics<\/strong>\u00a0and\u00a0<strong>Sentinel > Configuration > Automation<\/strong>\u00a0in the Defender portal; allow for navigation variations in integrated tenants.<\/li>\n\n\n\n<li>[ ] Confirm Azure Logic Apps\u00a0<strong>Consumption<\/strong>\u00a0or\u00a0<strong>Standard<\/strong>\u00a0support and the exact Sentinel workflow trigger offered. Standard workflows used as Sentinel playbooks must be\u00a0<strong>stateful<\/strong>, not stateless [R07].<\/li>\n\n\n\n<li>[ ] Have a named human approver, approved method for recording decisions, and a sandbox-only target for notifications\/tickets. If a connector requires an unavailable license, use the documented simulation branch and mark the external approval integration\u00a0<em>not exercised<\/em>.<\/li>\n\n\n\n<li>[ ] Approve a cost budget, resource cleanup owner, allowable test count and run-history retention; review Logic Apps and connector pricing before provisioning.<\/li>\n\n\n\n<li>[ ] Confirm manual playbook run roles:\u00a0<strong>Microsoft Sentinel Responder<\/strong>\u00a0for incident access,\u00a0<strong>Microsoft Sentinel Playbook Operator<\/strong>\u00a0on playbook RG, and Microsoft Sentinel service-account\u00a0<strong>Automation Contributor<\/strong>\u00a0on that RG for automation-run permissions [R08]. Creating\/editing Logic Apps additionally requires supported Logic Apps roles.<\/li>\n\n\n\n<li>[ ] Use personal access and managed identities with narrowly scoped permissions where the connector supports them. Never store credentials in a KQL query or playbook Compose output.<\/li>\n\n\n\n<li>[ ] Preselect an observation-only exercise in case portal features, source logs or SIEM\/Defender permissions are unavailable.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Lab naming and evidence convention<\/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\">Artifact<\/th><th class=\"has-text-align-left\" data-align=\"left\">Recommended sandbox label<\/th><\/tr><\/thead><tbody><tr><td>Saved query<\/td><td><code>D4-ASIM-HUNT-&lt;initials&gt;<\/code><\/td><\/tr><tr><td>Test rule<\/td><td><code>D4-LAB-identity-sequence-&lt;initials&gt;<\/code><\/td><\/tr><tr><td>Test incident<\/td><td>Title starts with&nbsp;<code>D4-LAB-<\/code><\/td><\/tr><tr><td>Logic App playbook<\/td><td><code>pb-d4-lab-approval-&lt;initials&gt;<\/code><\/td><\/tr><tr><td>Automation rule<\/td><td><code>ar-d4-lab-scope-&lt;initials&gt;<\/code><\/td><\/tr><tr><td>Evidence folder<\/td><td><code>D4\/&lt;learner-id&gt;\/&lt;lab-id&gt;\/<\/code><\/td><\/tr><tr><td>UTC evidence record<\/td><td>ISO-8601 timestamp, workspace ID, query text\/version, expected vs observed, status, sanitized screenshot \/ run ID<\/td><\/tr><\/tbody><\/table><\/figure>\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>Screenshot safety:<\/strong>&nbsp;Redact tenant IDs where not needed, incident content, UPNs, OAuth tokens, connector secrets, HTTP authorization headers and approval URLs. Record artifacts with stable identifiers and time instead of copying confidential logs into student reports.<\/p>\n<\/blockquote>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">DAY 4 \u2014 STEP-BY-STEP LABS<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">D4-L00 \u2014 Verify continuation, access and the test boundary<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Mapped syllabus:<\/strong>&nbsp;prerequisite gate, A09\/A11\/A13.<br><strong>Outcome:<\/strong>&nbsp;All prerequisite evidence and safe permissions are recorded before any deployment.<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Open\u00a0<a href=\"https:\/\/security.microsoft.com\/\">security.microsoft.com<\/a>\u00a0and confirm the expected tenant and selected SIEM workspace. Record workspace resource ID and region\u00a0<strong>in your private evidence folder<\/strong>.<\/li>\n\n\n\n<li>Open\u00a0<strong>Microsoft Sentinel > Configuration > Analytics<\/strong>. Confirm that you can see the Day 3 test rule (or an instructor-approved substitute). Do not enable or edit it yet.<\/li>\n\n\n\n<li>Open\u00a0<strong>Investigation &amp; response > Incidents &amp; alerts > Incidents<\/strong>. Search for a nonproduction incident beginning\u00a0<code>D4-LAB-<\/code>, or have the instructor create one using an approved test rule before any playbook lab.<\/li>\n\n\n\n<li>Open\u00a0<strong>Microsoft Sentinel > Configuration > Automation<\/strong>. Check access to automation rules and the\u00a0<strong>Active playbooks<\/strong>\u00a0list.<\/li>\n\n\n\n<li>In\u00a0<a href=\"https:\/\/portal.azure.com\/\">Azure portal<\/a>, inspect the dedicated Logic Apps resource group\u00a0<strong>Access control (IAM)<\/strong>. Confirm the role assignments from the preflight matrix; record\u00a0<em>who<\/em>\u00a0is permitted to edit, run, grant access and approve.<\/li>\n\n\n\n<li>Record a written change boundary:\u00a0<em>all actions limited to lab scope; no device\/user\/network remediation<\/em>. Identify an owner for disabling the automation rule after tests.<\/li>\n\n\n\n<li>Record\u00a0<strong>PASS \/ BLOCKED \/ SUBSTITUTE<\/strong>\u00a0for: workspace, test incident\/case, ASIM data, Logic Apps create\/write, run permissions and approval provider.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>PASS:<\/strong>&nbsp;Access worksheet completed, correct tenant\/workspace verified, lab ticket\/incident exists (or creation owner identified), approver named and cleanup owner assigned.&nbsp;<strong>BLOCK:<\/strong>&nbsp;Any production-scoped trigger or missing authorization.<br><strong>Evidence:<\/strong>&nbsp;<code>D4-L00-preflight.md<\/code>, redacted role matrix, selected test rule and incident IDs.<br><strong>Documentation:<\/strong>&nbsp;[R01], [R07\u2013R09].<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">D4-L01 \u2014 ASIM architecture, parser discovery and normalized field contract<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Mapped:<\/strong>&nbsp;A01.&nbsp;<strong>New skill:<\/strong>&nbsp;Abstract a real source behind an ASIM schema.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>What\/why:<\/strong>&nbsp;ASIM maps heterogeneous source fields to a normalized model at query time. A source-specific parser implements a contract; the unifying parser combines supported sources. Do not assume a custom log is automatically covered.<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Go to\u00a0<strong>Investigation &amp; response > Hunting > Advanced hunting<\/strong>\u00a0in Defender, and select the Sentinel workspace\/query context supported by the tenant. If the unified query surface rejects a Sentinel parser, use the workspace&#8217;s supported Log Analytics query surface and record the editor used.<\/li>\n\n\n\n<li>Check these\u00a0<em>candidate<\/em>\u00a0built-in unifying parser names against current Microsoft documentation:\u00a0<code>_Im_Authentication<\/code>,\u00a0<code>_Im_Dns<\/code>,\u00a0<code>_Im_NetworkSession<\/code>. A parser is callable\u00a0<strong>only if the selected query context exposes it<\/strong>.<\/li>\n\n\n\n<li>Pick\u00a0<strong>one<\/strong>\u00a0source known to have records. Run the first candidate query below. Start with a short time window to control cost. No results is not the same thing as a missing parser.<\/li>\n<\/ol>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/ D4-L01A: bounded ASIM DNS example, requires supported DNS sources.\n_Im_Dns(starttime=ago(1d))\n| project TimeGenerated, SrcIpAddr, DnsQuery, ResponseCodeName\n| take 20\n<\/code><\/pre>\n\n\n\n<ol start=\"4\" class=\"wp-block-list\">\n<li>If the query reports an unrecognized column, omit the unsupported projection, run\u00a0<code>_Im_Dns(starttime=ago(1d)) | take 1<\/code>, inspect the\u00a0<strong>actual returned schema<\/strong>, and correct the mapping. Do not silently fabricate\u00a0<code>DnsQuery<\/code>\u00a0or any source-specific field.<\/li>\n\n\n\n<li>Inspect at least five events and write a field contract table: vendor\/table, original key, ASIM normalized key, data type, sample value, source-specific limitations and field null percentage.<\/li>\n\n\n\n<li>Demonstrate a\u00a0<strong>unifying<\/strong>\u00a0parser versus a\u00a0<strong>source-specific<\/strong>\u00a0parser conceptually. List one source-specific parser from the\u00a0<a href=\"https:\/\/learn.microsoft.com\/en-us\/azure\/sentinel\/normalization-parsers-list\">current Microsoft list<\/a>, verify that its source is installed, and only then attempt execution.<\/li>\n\n\n\n<li>Record how the parser determines an entity such as\u00a0<code>SrcIpAddr<\/code>: it might represent a resolver, proxy, NAT egress or actual endpoint. Write one caution against using it as proof of device ownership.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Expected observation:<\/strong>&nbsp;The parser exists where supported; rows are returned&nbsp;<strong>only<\/strong>&nbsp;when qualifying source data exists. A legitimate empty result is acceptable for parser availability but&nbsp;<strong>not<\/strong>&nbsp;a source-data validation PASS.<br><strong>PASS:<\/strong>&nbsp;Correct parser identified and source coverage plus semantic caveat documented. For full live PASS, show one real normalized event and its original source record.<br><strong>Troubleshooting:<\/strong>&nbsp;Unknown function \u2192 wrong editor\/workspace or feature context; zero rows \u2192 source absent, time filter or parser unsupported source; null fields \u2192 incomplete mapping, not an ASIM service failure.<br><strong>Evidence:<\/strong>&nbsp;<code>D4-L01-parser-contract.csv<\/code>, parser query, sanitized source-to-normalized row.<br><strong>Read:<\/strong>&nbsp;[R02], [R03].<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">D4-L02 \u2014 Optimize normalized queries with parser-time filters<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Mapped:<\/strong>&nbsp;A02.&nbsp;<strong>Outcome:<\/strong>&nbsp;Use early filtering responsibly and measure, rather than guessing, performance.<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Query a broad unifying parser over a bounded interval, recording\u00a0<em>execution duration, returned rows, scanned data if exposed and query surface<\/em>.<\/li>\n\n\n\n<li>Run the optimized query with the parser&#8217;s\u00a0<strong>documented<\/strong>\u00a0filter parameters. For DNS, the official pattern uses\u00a0<code>starttime<\/code>\u00a0and\u00a0<code>responsecodename<\/code>:<\/li>\n<\/ol>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/ D4-L02A: optimized parser-side filtering\n_Im_Dns(starttime=ago(1d), responsecodename='NXDOMAIN')\n| summarize EventCount=count() by SrcIpAddr, bin(TimeGenerated, 15m)\n| order by EventCount desc\n<\/code><\/pre>\n\n\n\n<ol start=\"3\" class=\"wp-block-list\">\n<li>Compare to a semantically equivalent after-parser filter:<\/li>\n<\/ol>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/ D4-L02B: control query with post-parser filtering\n_Im_Dns\n| where TimeGenerated &gt;= ago(1d)\n| where ResponseCodeName =~ 'NXDOMAIN'\n| summarize EventCount=count() by SrcIpAddr, bin(TimeGenerated, 15m)\n| order by EventCount desc\n<\/code><\/pre>\n\n\n\n<ol start=\"4\" class=\"wp-block-list\">\n<li>Run both more than once\u00a0<strong>only within the approved query budget<\/strong>, on identical windows and workspace scope. Compare returned result sets (which should be logically comparable) and observed runtime. A one-off timing difference is not reliable benchmarking.<\/li>\n\n\n\n<li>Inspect known edge cases:\u00a0<code>SrcIpAddr<\/code>\u00a0blank; DNS caching; event duplication; different vendor definitions of NXDOMAIN; time zone\/clock skew.<\/li>\n\n\n\n<li>Write a query optimization record: filter parameters used, query text, source count, observed difference, any field mismatch and whether the optimization is actually justified.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>PASS:<\/strong>&nbsp;Learner explains filter-before-parse, reports measured evidence or records why performance comparison is unavailable, and does not claim faster execution without measurement.<br><strong>Troubleshooting:<\/strong>&nbsp;Different counts \u2192 not equivalent filters, missing schema normalization or data changed between runs. Compare an explicit fixed UTC window for precise repeatability.<br><strong>Evidence:<\/strong>&nbsp;<code>D4-L02-query-comparison.md<\/code>.&nbsp;<strong>Read:<\/strong>&nbsp;[R02\u2013R03].<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">D4-L03 \u2014 Engineer a multi-stage attack sequence using reproducible data<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Mapped:<\/strong>&nbsp;A03.&nbsp;<strong>Outcome:<\/strong>&nbsp;Encode ordering, a common entity key and a bounded window.&nbsp;<strong>This lab is synthetic first<\/strong>, to prevent false real-incident claims.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Hypothesis:<\/strong>&nbsp;A privileged account signs in and, within ten minutes, receives a high-privilege role grant, with an infrastructure signal in between.&nbsp;<strong>A matching query is a lead, not proof of compromise.<\/strong><\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Open a scratch query tab in the KQL-compatible editor. Paste the\u00a0<strong>entire<\/strong>\u00a0block (the fixture is self-contained and contacts no IPs).<\/li>\n\n\n\n<li>Observe that only\u00a0<code>admin@aster.example<\/code>\u00a0forms the designed contiguous sequence;\u00a0<code>ops@aster.example<\/code>\u00a0represents routine activity that should\u00a0<strong>not<\/strong>\u00a0match the ten-minute sequence.<\/li>\n<\/ol>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/ D4-L03: time-ordered three-stage fixture.\nlet Login = datatable(Account:string, SourceIp:string, LoginAgoMin:long)\n&#91;\n  'admin@aster.example','198.51.100.25',12,\n  'ops@aster.example','203.0.113.22',90\n]\n| extend LoginTime=now() - LoginAgoMin * 1m;\nlet Network = datatable(Account:string, SourceIp:string, NetworkAgoMin:long, Action:string)\n&#91;\n  'admin@aster.example','198.51.100.25',9,'Deny',\n  'ops@aster.example','203.0.113.22',20,'Deny'\n]\n| extend NetworkTime=now() - NetworkAgoMin * 1m;\nlet Grants = datatable(Account:string, GrantAgoMin:long, GrantedRole:string)\n&#91;\n  'admin@aster.example',5,'Owner',\n  'ops@aster.example',1,'Reader'\n]\n| extend GrantTime=now() - GrantAgoMin * 1m;\nLogin\n| join kind=inner (Network) on Account, SourceIp\n| join kind=inner (Grants) on Account\n| where LoginTime &lt;= NetworkTime and NetworkTime &lt;= GrantTime\n| where GrantTime - LoginTime &lt;= 10m\n| where GrantedRole =~ 'Owner'\n| project Account, SourceIp, LoginTime, NetworkTime, GrantTime, GrantedRole, Action\n<\/code><\/pre>\n\n\n\n<ol start=\"3\" class=\"wp-block-list\">\n<li><strong>Expected synthetic result:<\/strong>\u00a0Exactly\u00a0<strong>one<\/strong>\u00a0row:\u00a0<code>admin@aster.example<\/code>, the TEST-NET source IP, an Owner grant following login and network activity. The relative times are computed from the same query evaluation clock; if an editor does not support dynamic timespan arithmetic, run the fixture in the workspace Log Analytics KQL engine and record the compatibility issue.<\/li>\n\n\n\n<li>Change the sequence to test negative cases: (a) increase\u00a0<code>GrantAgoMin<\/code>\u00a0to 20, (b) change\u00a0<code>GrantedRole<\/code>\u00a0to\u00a0<code>Reader<\/code>, (c) mismatch\u00a0<code>SourceIp<\/code>, and (d) reverse the event ordering. Run each as a\u00a0<strong>separate<\/strong>\u00a0fixture test and record whether it is correctly excluded.<\/li>\n\n\n\n<li>Examine\u00a0<code>join<\/code>\u00a0multiplicity: multiple network records per login may create duplicate matches. Demonstrate an aggregation (for example\u00a0<code>summarize arg_min(NetworkTime, *) by Account, SourceIp<\/code>)\u00a0<strong>before<\/strong>\u00a0joining when business logic requires one representative event.<\/li>\n\n\n\n<li>Transfer the concept to the Day 3\u00a0<strong>real<\/strong>\u00a0identity\/network\/source query only after verifying that the actual fields, identities and timestamps have equivalent semantics. Do not translate sample field names to a production table by guessing.<\/li>\n\n\n\n<li>Save the query and write a schema\/identity contract. Address shared IPs, NAT, session identifiers, clock skew, attacker-controlled input, legitimate emergency access and cross-tenant identity resolution.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>PASS (synthetic):<\/strong>&nbsp;One expected detection plus four negative test results with a written false-attribution limitation.&nbsp;<strong>Operational PASS:<\/strong>&nbsp;an equivalent real-source query shows verified source IDs and correlates with documented semantics.<br><strong>Evidence:<\/strong>&nbsp;versioned KQL, output table,&nbsp;<code>D4-L03-test-matrix.csv<\/code>.<br><strong>Troubleshooting:<\/strong>&nbsp;Many-to-many explosions \u2192 deduplicate\/aggregate before join; missing events \u2192 timestamp window, case-normalized account key, source ingestion delay.<br><strong>Read:<\/strong>&nbsp;[R02], [R10].<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">D4-L04 \u2014 Decide between scheduled, NRT and unified custom detections<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Mapped:<\/strong>&nbsp;A04.&nbsp;<strong>Outcome:<\/strong>&nbsp;Make an explicit design choice with current functionality and guardrails.<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>In\u00a0<strong>Microsoft Sentinel > Configuration > Analytics<\/strong>, inspect existing rule types. Filter active rules by\u00a0<strong>NRT<\/strong>\u00a0using the documented Rule type filter.<\/li>\n\n\n\n<li>Open the\u00a0<strong>Create<\/strong>\u00a0menu only in a lab workspace. Note whether\u00a0<code>NRT query rule<\/code>\u00a0and\u00a0<code>Scheduled query rule<\/code>\u00a0are offered.\u00a0<strong>Do not enable a new detection yet.<\/strong><\/li>\n\n\n\n<li>Open the Defender\u00a0<strong>Advanced hunting<\/strong>\u00a0experience; inspect whether\u00a0<strong>Create detection rule<\/strong>\u00a0\/ unified custom detection is available. If absent, record\u00a0<em>license\/permission\/experience unavailable<\/em>\u00a0instead of assuming an error.<\/li>\n\n\n\n<li>Fill this comparison matrix with the actual tenant evidence:<\/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\">Decision question<\/th><th class=\"has-text-align-left\" data-align=\"left\">Scheduled Sentinel<\/th><th class=\"has-text-align-left\" data-align=\"left\">Sentinel NRT<\/th><th class=\"has-text-align-left\" data-align=\"left\">Unified custom detection<\/th><\/tr><\/thead><tbody><tr><td>Main reason to choose<\/td><td>Flexible scheduled correlations and thresholds<\/td><td>Frequent, narrow event-based Sentinel alerting<\/td><td>Eligible unified Defender\/SIEM detection experience<\/td><\/tr><tr><td>Evaluation frequency<\/td><td>Configurable within service constraints<\/td><td>Runs about once per minute with a one-minute lookback<\/td><td>Depends on supported Defender detection configuration<\/td><\/tr><tr><td>Source assumptions<\/td><td>Sentinel query\/table accessibility<\/td><td>NRT-supported Sentinel queries and constraints<\/td><td>Eligible advanced-hunting source and product\/license permissions<\/td><\/tr><tr><td>Alert threshold<\/td><td>Configurable<\/td><td>NRT alert-generation behavior differs from scheduled<\/td><td>Rule-specific behavior; do not infer Sentinel settings<\/td><\/tr><tr><td>Control risk<\/td><td>Alert volume and late ingestion<\/td><td>Noisy minute-by-minute rules, strict result handling<\/td><td>Different schema\/response options and entitlements<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<ol start=\"5\" class=\"wp-block-list\">\n<li>Inspect the official NRT limitations: frequency\/lookback are fixed; result grouping and output sizes require deliberate\u00a0<code>project<\/code>; do not simply paste an expensive multistage hunt into NRT.<\/li>\n\n\n\n<li>Based on the D4-L03 sequence,\u00a0<strong>recommend a scheduled rule for the learning exercise<\/strong>\u00a0unless the source cadence, data availability and current tenant explicitly support a faster mode. Store a short decision record with rationale and rollback.<\/li>\n\n\n\n<li>Optional supervised lab: create a\u00a0<strong>disabled<\/strong>\u00a0or tightly time-limited test rule from a previously validated\u00a0<strong>live-source<\/strong>\u00a0query and inspect its output schema.\u00a0<strong>Do not<\/strong>\u00a0publish the\u00a0<code>datatable()<\/code>\u00a0fixture as proof of live security detection. If generating a real incident, use the bounded Day 3 test source, route only to the lab queue, and disable after verifying it.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>PASS:<\/strong>&nbsp;Accurate comparison and design rationale; any live rule has a bounded source, owner and safe disablement plan.<br><strong>Evidence:<\/strong>&nbsp;<code>D4-L04-execution-mode-ADR.md<\/code>, optional test rule ID.&nbsp;<strong>Read:<\/strong>&nbsp;[R04], [R05].<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">D4-L05 \u2014 Build a detection regression-test matrix<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Mapped:<\/strong>&nbsp;A05.&nbsp;<strong>Outcome:<\/strong>&nbsp;Evaluate detections against known examples, not anecdotes or alert-count vanity metrics.<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Write down your\u00a0<strong>detection&#8217;s intended behavior<\/strong>\u00a0in plain English. Example:\u00a0<em>Flag a privileged identity whose successful sign-in precedes a network anomaly and Owner assignment within ten minutes; do not trigger on nonprivileged grants or mismatched identities.<\/em><\/li>\n\n\n\n<li>Define test inputs independently of the detection query. The following table is a test specification,\u00a0<strong>not a measurement of production accuracy<\/strong>:<\/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 ID<\/th><th class=\"has-text-align-left\" data-align=\"left\">Sign-in<\/th><th class=\"has-text-align-left\" data-align=\"left\">Infrastructure event<\/th><th class=\"has-text-align-left\" data-align=\"left\">Role grant<\/th><th class=\"has-text-align-left\" data-align=\"left\">Expected<\/th><th class=\"has-text-align-left\" data-align=\"left\">Why<\/th><\/tr><\/thead><tbody><tr><td>T01<\/td><td>Privileged, matching identity<\/td><td>In window, same IP<\/td><td>Owner within 10 min<\/td><td>Detect<\/td><td>Full chain<\/td><\/tr><tr><td>T02<\/td><td>Privileged, matching identity<\/td><td>In window<\/td><td>Reader within 10 min<\/td><td>Do not detect<\/td><td>No high-impact grant<\/td><\/tr><tr><td>T03<\/td><td>Privileged<\/td><td>Same IP, wrong user<\/td><td>Owner<\/td><td>Do not detect<\/td><td>Identity mismatch<\/td><\/tr><tr><td>T04<\/td><td>Privileged<\/td><td>In window<\/td><td>Owner after 45 min<\/td><td>Do not detect<\/td><td>Window exceeded<\/td><\/tr><tr><td>T05<\/td><td>Benign automation account<\/td><td>In window<\/td><td>Owner, approved window<\/td><td>Review\/suppress if policy allows<\/td><td>Authorized change<\/td><\/tr><tr><td>T06<\/td><td>Privileged<\/td><td>No network record<\/td><td>Owner<\/td><td>Do not detect with three-stage logic<\/td><td>Missing prerequisite<\/td><\/tr><tr><td>T07<\/td><td>Privileged<\/td><td>Duplicate network messages<\/td><td>Owner<\/td><td>One meaningful case<\/td><td>Deduplication<\/td><\/tr><tr><td>T08<\/td><td>Shared NAT \/ proxy IP<\/td><td>In window<\/td><td>Owner<\/td><td>Investigate, not automatically attribute<\/td><td>Ambiguous identity<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<ol start=\"3\" class=\"wp-block-list\">\n<li>Use the D4-L03 fixture, changing one test variable at a time, and record observed results for T01\u2013T04. Use additional instructor-seeded rows for T05\u2013T08; explain any case your current query cannot decide.<\/li>\n\n\n\n<li>Create a confusion matrix\u00a0<strong>only for cases with known ground truth<\/strong>. TP = malicious case detected; FP = benign case detected; FN = malicious case missed; TN = benign case not detected. For an illustrative\u00a0<em>six-case<\/em>\u00a0fixture with TP=2, FP=1, FN=1, TN=2, calculate:<\/li>\n<\/ol>\n\n\n\n<pre class=\"wp-block-code\"><code>Precision proxy = TP \/ (TP + FP) = 2 \/ 3 \u2248 66.7%\nRecall proxy    = TP \/ (TP + FN) = 2 \/ 3 \u2248 66.7%\nFalse positive rate = FP \/ (FP + TN) = 1 \/ 3 \u2248 33.3%\n<\/code><\/pre>\n\n\n\n<ol start=\"5\" class=\"wp-block-list\">\n<li>Explicitly label these as\u00a0<strong>toy-fixture metrics<\/strong>. Historical SOC alert dispositions are not full ground-truth negatives; they cannot measure actual missed attacks without independent validation.<\/li>\n\n\n\n<li>Design a release gate: approved test fixture; query review; baseline alert volume; entity mapping review; false-positive exceptions; owner; rollback; detection health monitoring; expiration of temporary exclusions.<\/li>\n\n\n\n<li>If using an actual lab analytics rule, confirm\u00a0<strong>event-source timestamps<\/strong>, scheduling\/evaluation window and alert\/incident generation before claiming a live result. A query that returns a row in advanced hunting is not proof the rule executed or created an alert.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>PASS:<\/strong>&nbsp;At least eight tests specified; four executed in synthetic KQL; numerical example correct; at least two known blind spots; rollback criterion.<br><strong>Evidence:<\/strong>&nbsp;<code>D4-L05-regression-matrix.csv<\/code>,&nbsp;<code>D4-L05-release-gate.md<\/code>.<br><strong>Failure trap:<\/strong>&nbsp;Adjusting detection thresholds just to make all demonstration tests pass without preserving a benign holdout set.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">D4-L06 \u2014 Execute a falsifiable, hypothesis-led threat hunt<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Mapped:<\/strong>&nbsp;A06.&nbsp;<strong>Outcome:<\/strong>&nbsp;Produce a structured analyst report with uncertainty and reproducibility.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Hunt question:<\/strong>&nbsp;<em>Did a privileged cloud identity show a suspicious authentication-to-role-change sequence not explained by an approved change?<\/em>&nbsp;This is a hypothesis,&nbsp;<strong>not a declaration of compromise<\/strong>.<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>In a new report, record the hypothesis\u00a0<strong>before<\/strong>\u00a0searching. List expected supporting evidence: successful authentication timestamp, account&#8217;s stable ID, network\/session IP and context, role-assignment actor\/target, UTC time, scope, approval record and source event IDs.<\/li>\n\n\n\n<li>List\u00a0<strong>disconfirming evidence<\/strong>: an authorized change request, expected break-glass access, approved deployment identity, known test data, sanctioned device\/network, duplicate telemetry or a different human behind a shared IP.<\/li>\n\n\n\n<li>Open\u00a0<strong>Microsoft Sentinel > Threat management > Hunting<\/strong>\u00a0to view relevant hunting content, and\u00a0<strong>Investigation &amp; response > Hunting > Advanced hunting<\/strong>\u00a0for the unified query experience. Use the appropriate query surface based on source table support.<\/li>\n\n\n\n<li>Run the following\u00a0<strong>synthetic hunt timeline<\/strong>\u00a0before connecting any source-specific data; no external logs are required:<\/li>\n<\/ol>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/ D4-L06A: timeline fixture. Results are fabricated, not an observed attack.\nlet Evidence = datatable(AgoMin:long, EventKind:string, Account:string, Note:string, EventId:string)\n&#91;\n  19, 'Login', 'admin@aster.example', 'Successful sign-in from unusual network', 'TEST-LOGIN-01',\n  16, 'Network', 'admin@aster.example', 'Egress deny from same example address', 'TEST-FW-02',\n  12, 'RoleGrant', 'admin@aster.example', 'Owner assigned in training subscription', 'TEST-IAM-03',\n   3, 'Review', 'admin@aster.example', 'Approval ticket not yet found', 'TEST-CASE-04',\n  45, 'RoleGrant', 'ops@aster.example', 'Approved nightly service job', 'TEST-IAM-05'\n];\nEvidence\n| extend EventTime=now() - AgoMin * 1m\n| order by EventTime asc\n| project EventTime, Account, EventKind, EventId, Note\n<\/code><\/pre>\n\n\n\n<ol start=\"5\" class=\"wp-block-list\">\n<li>Record the\u00a0<strong>query time<\/strong>,\u00a0<strong>time range<\/strong>,\u00a0<strong>source\/fixture classification<\/strong>,\u00a0<strong>event identifiers<\/strong>\u00a0and any missing data. Avoid saving screenshots that omit the UTC interval or source table.<\/li>\n\n\n\n<li>For a real-data variation, use the already validated Day 3 sources and schema. Confirm the sign-in account ID is the\u00a0<strong>actor<\/strong>\u00a0versus the\u00a0<strong>target<\/strong>\u00a0in role-change logs, and link to the relevant authorization ticket. If that mapping cannot be shown, state\u00a0<em>identity attribution unresolved<\/em>.<\/li>\n\n\n\n<li>In Defender portal, save the query or its text in the evidence repository; use the Hunt report template below.\u00a0<strong>Do not instruct students to add new bookmarks in Defender<\/strong>\u00a0(the legacy action is Azure-portal-only) [R06].<\/li>\n\n\n\n<li>Make a decision:\u00a0<em>escalate<\/em>\u00a0only for evidence-supported activity under SOC policy; otherwise\u00a0<em>continue investigation<\/em>,\u00a0<em>record known benign<\/em>, or\u00a0<em>insufficient evidence<\/em>. Include a recommended detection enhancement.<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\">Hunt report template (copy into learner evidence)<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code># D4 Hunt Report \u2014 &lt;learner-id&gt;\nHypothesis:\nATT&amp;CK hypothesis:\nUTC window \/ workspace \/ editor:\nSources available and missing:\nQuery text \/ query version:\nPotential matching event IDs:\nEvidence supporting:\nEvidence contradicting:\nIdentity attribution confidence (low\/medium\/high + reason):\nKnown benign explanations checked:\nDecision and incident\/case owner:\nRecommended detection improvements:\nData handling \/ retention classification:\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>PASS:<\/strong>&nbsp;A falsifiable hypothesis; one reproduced timeline; two independent evidence classes or an explicit documented gap;&nbsp;<strong>at least three benign alternatives<\/strong>&nbsp;examined; a justified disposition.<br><strong>Evidence:<\/strong>&nbsp;<code>D4-L06-hunt-report.md<\/code>, anonymized query outputs.&nbsp;<strong>Read:<\/strong>&nbsp;[R06], [R11].<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">D4-L07 \u2014 Map evidence to MITRE ATT&amp;CK without exaggerating coverage<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Mapped:<\/strong>&nbsp;A07.&nbsp;<strong>Outcome:<\/strong>&nbsp;Explain ATT&amp;CK as a behavioral knowledge model, not an alert-accuracy guarantee.<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>From the hunt hypothesis, identify two plausible technique hypotheses:\u00a0<strong>T1078.004 \u2014 Valid Accounts: Cloud Accounts<\/strong>\u00a0and\u00a0<strong>T1098.003 \u2014 Account Manipulation: Additional Cloud Roles<\/strong>. Verify their\u00a0<strong>current<\/strong>\u00a0meanings from MITRE&#8217;s pages [R12].<\/li>\n\n\n\n<li>Open\u00a0<strong>Microsoft Sentinel > Threat management > MITRE ATT&amp;CK<\/strong>\u00a0(if exposed in the tenant). Review mapped analytics rules and coverage presentation.\u00a0<strong>A mapped rule is not automatically a validated effective detector.<\/strong><\/li>\n\n\n\n<li>Create this coverage matrix:<\/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\">Technique<\/th><th class=\"has-text-align-left\" data-align=\"left\">Required observable behavior<\/th><th class=\"has-text-align-left\" data-align=\"left\">Sensor\/table actually available<\/th><th class=\"has-text-align-left\" data-align=\"left\">Detection\/hunt logic<\/th><th class=\"has-text-align-left\" data-align=\"left\">Known gap<\/th><th class=\"has-text-align-left\" data-align=\"left\">Tested?<\/th><\/tr><\/thead><tbody><tr><td>T1078.004<\/td><td>Use of suspicious but valid cloud identity<\/td><td>Sign-in source verified?<\/td><td>Time-bounded unusual sign-in<\/td><td>Legitimate remote access<\/td><td>Yes\/No<\/td><\/tr><tr><td>T1098.003<\/td><td>Unexpected additional cloud role<\/td><td>Role assignment audit source?<\/td><td>Actor\/target and scope match<\/td><td>Missing change-ticket context<\/td><td>Yes\/No<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<ol start=\"4\" class=\"wp-block-list\">\n<li>For both techniques, list\u00a0<strong>data requirements<\/strong>,\u00a0<strong>detection logic<\/strong>,\u00a0<strong>expected entity and alert<\/strong>,\u00a0<strong>benign scenarios<\/strong>\u00a0and an\u00a0<strong>unobserved evasion\/path<\/strong>\u00a0that the course&#8217;s sources could miss.<\/li>\n\n\n\n<li>Run an instructor scenario where the role grant has a\u00a0<strong>different actor than the signed-in account<\/strong>. Explain why a naive join by display name or IP would mislead an analyst.<\/li>\n\n\n\n<li>Submit a four-part statement:\u00a0<em>technique hypothesis, evidence, limits, operational recommendation<\/em>. Do\u00a0<strong>not<\/strong>\u00a0state \u201cwe cover T1078.004\u201d based solely on a mapping tag.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>PASS:<\/strong>&nbsp;Two accurate ATT&amp;CK mappings, explicit observed sensors, one detection blind spot per technique and evidence-based confidence statement.<br><strong>Evidence:<\/strong>&nbsp;<code>D4-L07-attack-mapping.md<\/code>.&nbsp;<strong>Read:<\/strong>&nbsp;[R12], [R01].<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">D4-L08 \u2014 Perform an advanced entity\/UEBA pivot with alternative explanations<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Mapped:<\/strong>&nbsp;A08.&nbsp;<strong>Outcome:<\/strong>&nbsp;Interpret context without confusing anomaly scores with proof.<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Select the\u00a0<em>invented<\/em>\u00a0identity from the lab incident or from the preserved Day 3 UEBA exercise. In Defender, navigate to its entity page (for example\u00a0<strong>Assets > Identities<\/strong>\u00a0where available) or open entity details from the incident.<\/li>\n\n\n\n<li>Record the account\/object ID, time window, known device\/network associations and any relevant UEBA\/anomaly context. If no UEBA signal exists, mark\u00a0<strong>not available<\/strong>; do not enable broad production analytics just to make a screenshot.<\/li>\n\n\n\n<li>If the workspace contains\u00a0<code>BehaviorAnalytics<\/code>, inspect source rows only after verifying the table is present. Use a schema-neutral preview:<\/li>\n<\/ol>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/ D4-L08: workspace-dependent table. Run only if present.\nBehaviorAnalytics\n| where TimeGenerated &gt;= ago(7d)\n| take 10\n<\/code><\/pre>\n\n\n\n<ol start=\"4\" class=\"wp-block-list\">\n<li>Record whether the anomaly was based on a supported source and whether a distinct raw event corroborates it. Identify what context\u00a0<em>was not<\/em>\u00a0available (VPN IP, geographic jumps, device history, normalized authentication result).<\/li>\n\n\n\n<li>Compare at least three alternative explanations: role activation under PIM, emergency access, a test account in a sandbox, automation acting for a human, device proxy\/NAT or timestamp skew.<\/li>\n\n\n\n<li>Draft a defensible entity narrative:\u00a0<strong>what happened, which signal said so, what is only inferred, what would disconfirm it, and who must approve response<\/strong>.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>PASS:<\/strong>&nbsp;One entity pivot with two source references or a recorded missing-data blocker;&nbsp;<strong>no<\/strong>&nbsp;unsupported \u201csuspicious = compromised\u201d conclusion.<br><strong>Evidence:<\/strong>&nbsp;<code>D4-L08-entity-analysis.md<\/code>.&nbsp;<strong>Read:<\/strong>&nbsp;[R01], [R06].<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">D4-L09 \u2014 Design the SOAR playbook before using Logic Apps<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Mapped:<\/strong>&nbsp;A09, A10, A13.&nbsp;<strong>Outcome:<\/strong>&nbsp;A safe workflow contract with a scope check, human decision and no destructive defaults.<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Draw the proposed chain. The condition\u00a0<strong>lab incident\/case title begins with\u00a0<code>D4-LAB-<\/code><\/strong>\u00a0must execute before notification, ticketing or other external calls. If the trigger doesn&#8217;t reliably include the title, use a supported read-only lookup to resolve the full record before proceeding.<\/li>\n\n\n\n<li>Decide which trigger the current tenant actually supports:\n<ul class=\"wp-block-list\">\n<li><strong>Incident trigger (Legacy)<\/strong>\u00a0and incident-compatible automation rule,\u00a0<strong>if shown<\/strong>;<\/li>\n\n\n\n<li><strong>Case trigger<\/strong>\u00a0with a\u00a0<strong>case-compatible<\/strong>\u00a0workflow\/automation option, when available in integrated Defender experience;<\/li>\n\n\n\n<li><strong>Manual execution<\/strong>\u00a0against a permitted lab incident, if automatic case routing is not supported for the learner&#8217;s setup. Never combine mismatched incident\/case triggers and report success.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Agree on the\u00a0<strong>external approval authority<\/strong>\u00a0and approval-provider connector. Record whether an integrated\u00a0<em>Start and wait for an approval<\/em>\u00a0action is accessible under that organization&#8217;s subscription. If not, use the\u00a0<strong>manual approval evidence<\/strong>\u00a0track and mark the provider integration untested.<\/li>\n\n\n\n<li>Decide\u00a0<strong>what the approved action will do<\/strong>: write an internal training comment, a safe tag or create a ticket in a sandbox project. No real containment or privilege change.<\/li>\n\n\n\n<li>Define failure handling and retry semantics. Example: after a remote ticket creation succeeds but an acknowledgment is lost, querying by an idempotency key must happen\u00a0<strong>before<\/strong>\u00a0any retry; otherwise duplicate tickets appear.<\/li>\n\n\n\n<li>Fill out the following\u00a0<em>workflow contract<\/em>:<\/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\">Contract item<\/th><th class=\"has-text-align-left\" data-align=\"left\">Lab decision<\/th><\/tr><\/thead><tbody><tr><td>Trigger<\/td><td>Named incident\/case-compatible Sentinel event<\/td><\/tr><tr><td>Allowed scope<\/td><td>Only&nbsp;<code>D4-LAB-<\/code>&nbsp;plus expected workspace and test ownership<\/td><\/tr><tr><td>Context to log<\/td><td>Sanitized incident\/case identifier, UTC timestamp, workflow run ID<\/td><\/tr><tr><td>Data minimization<\/td><td>No raw credentials, PII or full event payload in Compose\/log output<\/td><\/tr><tr><td>Deduplication key<\/td><td>`<\/td><\/tr><tr><td>Read-only enrichment<\/td><td>Known dummy asset owner, test watchlist or preapproved lookup<\/td><\/tr><tr><td>Approval<\/td><td>Named human, accept\/reject outcomes, timeout behavior<\/td><\/tr><tr><td>Allowed final action<\/td><td>Lab comment\/tag or sandbox ticket; no disruptive action<\/td><\/tr><tr><td>Rejection\/timeout<\/td><td>No action; record verdict; do not auto-retry approvals blindly<\/td><\/tr><tr><td>Owner and rollback<\/td><td>Engineer and instructor; disable rule + workflow<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<ol start=\"7\" class=\"wp-block-list\">\n<li>Have instructor approve the workflow diagram before creating a Logic Apps resource. Store the approval date and permitted resource group.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>PASS:<\/strong>&nbsp;Diagram, scope condition, owner, permission boundary, rejection path and cleanup plan all approved.<br><strong>Evidence:<\/strong>&nbsp;<code>D4-L09-soar-contract.md<\/code>, workflow diagram, review signoff.&nbsp;<strong>Read:<\/strong>&nbsp;[R07\u2013R09], [R13].<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">D4-L10 \u2014 Create a guarded Logic Apps playbook and prove the human approval branch<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Mapped:<\/strong>&nbsp;A10, A13.&nbsp;<strong>Outcome:<\/strong>&nbsp;Build and exercise a&nbsp;<em>non-destructive<\/em>&nbsp;Sentinel-triggered Logic Apps workflow.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Part A \u2014 Provision a lab-only playbook<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li>In Defender, choose\u00a0<strong>Microsoft Sentinel > Configuration > Automation > Create > Logic App playbook<\/strong>\u00a0(the displayed options depend on integration and current UI). Choose the trigger type documented in the D4-L09 contract. If the portal shows\u00a0<em>Playbook with case trigger<\/em>\u00a0versus\u00a0<em>Playbook with incident trigger (Legacy)<\/em>, choose the one compatible with your\u00a0<strong>actual<\/strong>\u00a0test incident\/case and automation trigger [R07].<\/li>\n\n\n\n<li>Choose\u00a0<strong>Consumption<\/strong>\u00a0for a small sandbox if approved; if the organization requires\u00a0<strong>Standard<\/strong>, create a\u00a0<strong>stateful<\/strong>\u00a0workflow (Sentinel playbooks do not support stateless Standard workflows). Select the correct subscription, isolated resource group, region and naming convention. Review costs before selecting\u00a0<strong>Create<\/strong>.<\/li>\n\n\n\n<li>Open the created\u00a0<strong>Logic App resource<\/strong>\u00a0in Azure. Go to\u00a0<strong>Designer<\/strong>. Verify the intended\u00a0<strong>Microsoft Sentinel trigger<\/strong>\u00a0is present, connected and properly authenticated. Record its display name and authentication method in evidence\u2014do not assume a trigger appeared simply because the Logic App resource exists.<\/li>\n\n\n\n<li>Add a\u00a0<strong>Control > Condition<\/strong>\u00a0immediately after the trigger. Build the first operand from the exact\u00a0<em>incident\/case title<\/em>\u00a0dynamic content provided by the trigger; evaluate whether it\u00a0<strong>starts with\u00a0<code>D4-LAB-<\/code><\/strong>\u00a0(where the designer supports a starts-with operator or equivalent expression). Additionally verify workspace\/tenant context where available.<\/li>\n\n\n\n<li>Put a\u00a0<strong>Control > Terminate<\/strong>\u00a0(or a harmless Compose and a terminated branch) on the\u00a0<strong>False<\/strong>\u00a0path. On the\u00a0<strong>True<\/strong>\u00a0path continue with the steps below. Note: a\u00a0<code>Succeeded<\/code>\u00a0run that exits the wrong-scope branch is\u00a0<strong>not<\/strong>\u00a0approval to take action.<\/li>\n\n\n\n<li>Add\u00a0<strong>Data Operations > Compose<\/strong>\u00a0for a minimal lab envelope: a fictitious incident ID, title, UTC timestamp and a fixed workflow version\u00a0<code>v1<\/code>. Do not output an entire incident object containing identifiers or private log fields.<\/li>\n\n\n\n<li>Save. Use the designer&#8217;s\u00a0<strong>code view \/ workflow validation<\/strong>\u00a0where offered. Confirm any required connector authorization succeeds and inspect the current workflow&#8217;s trigger\/action graph.<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\">Part B \u2014 Implement an approval gate, with no unsafe action<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Preferred live track (approval connector available):<\/strong><\/p>\n\n\n\n<ol start=\"8\" class=\"wp-block-list\">\n<li>In the\u00a0<strong>True<\/strong>\u00a0branch, add the organization&#8217;s\u00a0<strong>approved approval-provider<\/strong>\u00a0action that\u00a0<strong>waits for a decision<\/strong>\u00a0(for example a supported Approvals action in the approved connector). Configure its authorized connection and named\u00a0<strong>training approver<\/strong>, and present only the sanitized incident\/case name and requested\u00a0<strong>test<\/strong>\u00a0action.<\/li>\n\n\n\n<li>Set a bounded\u00a0<strong>timeout<\/strong>\u00a0according to the provider and Logic Apps policy, and branch on an explicit\u00a0<strong>Approved \/ Rejected \/ Timed out \/ Failed<\/strong>\u00a0result. If the provider uses different outcome strings, compare to the actual run output rather than copying a guessed constant.<\/li>\n\n\n\n<li>In\u00a0<strong>Approved<\/strong>, add only an allowed\u00a0<strong>Compose<\/strong>\u00a0such as\u00a0<code>TRAINING: approved; no account or network action performed<\/code>. Optionally add a\u00a0<strong>sandbox ticket creation \/ approved lab case annotation<\/strong>\u00a0if the connector and permissions are configured.<\/li>\n\n\n\n<li>In\u00a0<strong>Rejected<\/strong>\u00a0and\u00a0<strong>Timed out\/Failed<\/strong>, add a distinct\u00a0<strong>Compose<\/strong>\u00a0outcome and\u00a0<strong>Terminate<\/strong>\u00a0without any external remediation. Make sure no notification or ticketing action that requires approval is placed\u00a0<em>before<\/em>\u00a0the approval branch.<\/li>\n\n\n\n<li>Save and inspect the full diagram. Explain why this design gives the approver a veto; the false and timeout branches must have\u00a0<strong>no remediation<\/strong>.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Restricted fallback (approval connector unavailable):<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Do\u00a0<strong>not<\/strong>\u00a0fake an external approval integration. Instead create a\u00a0<code>Condition<\/code>\u00a0that permits the final\u00a0<strong>training-only Compose<\/strong>\u00a0only when a fixed\u00a0<strong>instructor-controlled approved test variable<\/strong>\u00a0is\u00a0<code>true<\/code>; default it to\u00a0<code>false<\/code>. Have the approver record a decision outside the workflow. Then run separate explicit dry-runs with instructor authorization. Mark the artifact\u00a0<strong>approval logic simulated; external approval transport NOT TESTED<\/strong>. This is a teaching substitute and is\u00a0<strong>not<\/strong>\u00a0equivalent to a production human approval gate.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Part C \u2014 Run positive and negative tests<\/h3>\n\n\n\n<ol start=\"13\" class=\"wp-block-list\">\n<li>Start with a\u00a0<strong>manual run<\/strong>\u00a0against the specific\u00a0<code>D4-LAB-<\/code>\u00a0incident\/case where the chosen trigger permits it. In Defender\u00a0<strong>Incidents<\/strong>, select the lab record and use\u00a0<strong>Run playbook<\/strong>\u00a0(or the tenant&#8217;s corresponding case experience) [R08]. If unavailable, review permissions and trigger compatibility; do not broaden the automation rule to make it run.<\/li>\n\n\n\n<li>In the\u00a0<strong>Logic App > Run history<\/strong>, open the run. Verify the true-scope condition, the sanitized Compose output, the approval result and the final\u00a0<strong>safe<\/strong>\u00a0action. Record\u00a0<strong>run ID<\/strong>, trigger type, status and UTC timestamp. Do\u00a0<strong>not<\/strong>\u00a0screenshot the full dynamic payload or connector token.<\/li>\n\n\n\n<li>Test\u00a0<strong>Reject<\/strong>. The run must not reach the approved-action branch. Test\u00a0<strong>Timeout<\/strong>\u00a0with the instructor&#8217;s short supervised timeout policy, where feasible; otherwise demonstrate it using controlled workflow tests and mark as simulation.<\/li>\n\n\n\n<li>Test the\u00a0<strong>wrong-scope<\/strong>\u00a0case with a synthetic incident\/case that does\u00a0<strong>not<\/strong>\u00a0begin\u00a0<code>D4-LAB-<\/code>. Confirm that it exits before any side effect. If production incidents might match a broad condition, disable the workflow and fix the filter before continuing.<\/li>\n\n\n\n<li>Submit a run-evidence table:<\/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\">Run<\/th><th class=\"has-text-align-left\" data-align=\"left\">Trigger record<\/th><th class=\"has-text-align-left\" data-align=\"left\">Expected path<\/th><th class=\"has-text-align-left\" data-align=\"left\">Observed path<\/th><th class=\"has-text-align-left\" data-align=\"left\">Side effects<\/th><th class=\"has-text-align-left\" data-align=\"left\">PASS?<\/th><\/tr><\/thead><tbody><tr><td>R1<\/td><td>Approved&nbsp;<code>D4-LAB-...<\/code><\/td><td>Approve \u2192 lab-only Compose\/ticket<\/td><td><\/td><td><\/td><td><\/td><\/tr><tr><td>R2<\/td><td>Rejected&nbsp;<code>D4-LAB-...<\/code><\/td><td>Reject \u2192 no action<\/td><td><\/td><td><\/td><td><\/td><\/tr><tr><td>R3<\/td><td>Wrong-scope record<\/td><td>Exit immediately<\/td><td><\/td><td><\/td><td><\/td><\/tr><tr><td>R4<\/td><td>Timed out\/failed approval<\/td><td>Stop \u2192 no action<\/td><td><\/td><td><\/td><td><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>PASS:<\/strong>&nbsp;Live Logic Apps runs prove the right-scope and wrong-scope paths plus rejection; named approval confirmation for the live connector track. Where the real provider cannot be used, the outcome must be labeled&nbsp;<em>simulated<\/em>.<br><strong>Evidence:<\/strong>&nbsp;<code>D4-L10-playbook-run-matrix.md<\/code>, sanitized run IDs, workflow export\/diagram, approver decision.<br><strong>Troubleshooting:<\/strong>&nbsp;Playbook missing from menu \u2192 trigger mismatch or Sentinel service-account RG permissions; run failed \u2192 open failed action; 401\/403 \u2192 connector or role; waiting indefinitely \u2192 review approval provider and timeout policy.<br><strong>Read:<\/strong>&nbsp;[R07\u2013R09], [R13].<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">D4-L11 \u2014 Secure workflow identity, role separation and secret handling<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Mapped:<\/strong>&nbsp;A11.&nbsp;<strong>Outcome:<\/strong>&nbsp;Validate&nbsp;<strong>who<\/strong>&nbsp;performs each action, using least privilege rather than giving everyone Owner.<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>In Azure\u00a0<strong>Logic App > Identity<\/strong>, determine whether the workflow has an enabled\u00a0<strong>system-assigned managed identity<\/strong>. Not every connector or trigger supports all authentication modes. Record which actions use managed identity versus a managed connector connection.\u00a0<strong>Do not enable or widen a permission merely to satisfy the screenshot.<\/strong><\/li>\n\n\n\n<li>In the Logic App\u00a0<strong>resource group&#8217;s Access control (IAM)<\/strong>, record\u00a0<strong>Logic App Contributor<\/strong>\u00a0(or appropriate Standard role) for the builder, and\u00a0<strong>Microsoft Sentinel Playbook Operator<\/strong>\u00a0for the learner running a permitted playbook.<\/li>\n\n\n\n<li>Review the extra\u00a0<strong>Microsoft Sentinel Automation Contributor<\/strong>\u00a0permission for the\u00a0<strong>Sentinel service account<\/strong>\u00a0on the playbook resource group. In Defender, where the playbook shows\u00a0<em>Missing permissions<\/em>\u00a0or\u00a0<em>Grant permission<\/em>, follow the\u00a0<strong>Manage playbook permissions<\/strong>\u00a0flow with an Owner\/User Access Administrator and\u00a0<em>only this lab RG<\/em>\u00a0[R08].<\/li>\n\n\n\n<li>Map all identities involved:<\/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\">Identity<\/th><th class=\"has-text-align-left\" data-align=\"left\">Needs<\/th><th class=\"has-text-align-left\" data-align=\"left\">Should&nbsp;<em>not<\/em>&nbsp;have by default<\/th><\/tr><\/thead><tbody><tr><td>Learner builder<\/td><td>Edit lab Logic App and view safe run history<\/td><td>Tenant-wide Owner, production remediation<\/td><\/tr><tr><td>Sentinel service account<\/td><td>Invoke only approved playbooks in approved RG<\/td><td>Write access to unrelated RGs<\/td><\/tr><tr><td>Connector identity<\/td><td>Call narrowly scoped sandbox destination<\/td><td>Global administrator privileges<\/td><\/tr><tr><td>Human approver<\/td><td>Review request and approve\/reject only<\/td><td>Automatic execution privileges<\/td><\/tr><tr><td>SOC analyst<\/td><td>Investigate and initiate approved manual runs<\/td><td>Edit all workflows or grant RBAC<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<ol start=\"5\" class=\"wp-block-list\">\n<li>Inspect each action&#8217;s\u00a0<strong>connection<\/strong>\u00a0and\u00a0<strong>API permissions<\/strong>. Verify that a connection created with user-delegated OAuth won&#8217;t silently keep an inappropriate broad personal identity. Prefer managed identity where supported and approved.<\/li>\n\n\n\n<li>If the workflow has sample secrets in a Compose or a connector parameter,\u00a0<strong>remove them<\/strong>, use managed connections\/Key Vault according to organization policy, enable secure inputs\/outputs for sensitive actions as appropriate, and rotate any exposed test secret. Never commit connection secrets or authorization URLs to the course repository.<\/li>\n\n\n\n<li>Document separation of duties: the person who writes a response action should\u00a0<strong>not<\/strong>\u00a0unilaterally authorize disruptive response in production. The lab&#8217;s approved action remains non-disruptive.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>PASS:<\/strong>&nbsp;RACI\/IAM table complete; no credential visible in run logs; Sentinel service permission restricted to lab RG; risk acknowledged for delegated connector connections.<br><strong>Evidence:<\/strong>&nbsp;<code>D4-L11-rbac-security-review.md<\/code>, sanitized role assignments.&nbsp;<strong>Read:<\/strong>&nbsp;[R08], [R13].<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">D4-L12 \u2014 Engineer reliable orchestration: deduplication, retries and safe failures<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Mapped:<\/strong>&nbsp;A12.&nbsp;<strong>Outcome:<\/strong>&nbsp;Demonstrate the difference between&nbsp;<em>retrying a request<\/em>&nbsp;and&nbsp;<em>safely retrying a business action<\/em>.<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Define a stable idempotency key from the incident\/case&#8217;s immutable ID plus workflow version, e.g.\u00a0<code>incident-arm-id|approval-v1<\/code>.\u00a0<strong>Do not<\/strong>\u00a0use only a title: names can change and collide.<\/li>\n\n\n\n<li>Identify a durable store appropriate for the\u00a0<strong>test<\/strong>\u00a0environment (sandbox ticket search, a dedicated storage table, or approved state system).\u00a0<strong>Without<\/strong>\u00a0durable state, a Logic Apps\u00a0<code>Compose<\/code>\u00a0action is\u00a0<strong>not<\/strong>\u00a0idempotency control.<\/li>\n\n\n\n<li>Before a ticket-creation action, require a read-only\u00a0<strong>lookup<\/strong>\u00a0by the key. If a match exists, use its existing ID; otherwise create a new item with the correlation key. Record the result. Use a store with atomic uniqueness or controlled concurrency if duplicate creation is unacceptable.<\/li>\n\n\n\n<li>In the designer, review\u00a0<strong>Settings > Retry policy<\/strong>\u00a0for a connector action where configurable. Explain when retrying 429 or transient 5xx is reasonable and why retrying a non-idempotent create after a timeout can duplicate effects.<\/li>\n\n\n\n<li>Configure\u00a0<strong>run-after<\/strong>\u00a0paths or\u00a0<strong>Scope<\/strong>\u00a0blocks for success, failed, skipped and timed out statuses where supported. Make sure the failure branch does\u00a0<strong>not<\/strong>\u00a0report\u00a0<code>success<\/code>\u00a0to the SOC if a required step failed.<\/li>\n\n\n\n<li>Run the same test incident\u00a0<strong>twice<\/strong>\u00a0(instructor-approved). Confirm either the original ticket is reused or the action is skipped. If no external state store is available, mark\u00a0<strong>dedup design reviewed; not operationally proven<\/strong>.<\/li>\n\n\n\n<li>Deliberately cause one\u00a0<strong>harmless<\/strong>\u00a0failure (for example a read-only lookup to a sandbox test record that does not exist). Verify the failure branch is invoked and no approved action executes after the failure.<\/li>\n\n\n\n<li>Record workflow\u00a0<strong>concurrency<\/strong>, action timeout, retry count, rate limit, compensating action and manual escalation owner in a failure-mode worksheet.<\/li>\n\n\n\n<li>Define rollback precisely: disable the automation rule, disable the playbook, revoke an accidentally broad role, and correct created\u00a0<strong>sandbox<\/strong>\u00a0tickets using the service desk&#8217;s normal process.\u00a0<strong>Do not<\/strong>\u00a0attempt rollback of hypothetical identity containment in this course.<\/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\">Failure<\/th><th class=\"has-text-align-left\" data-align=\"left\">Risk<\/th><th class=\"has-text-align-left\" data-align=\"left\">Required behavior<\/th><\/tr><\/thead><tbody><tr><td>Duplicate incident update<\/td><td>Duplicate ticket\/approval<\/td><td>Deduplicate by immutable key<\/td><\/tr><tr><td>HTTP 429 \/ API quota<\/td><td>Temporary loss of enrichment<\/td><td>Bounded backoff, log and escalation<\/td><\/tr><tr><td>Ticket created but response lost<\/td><td>Duplicate on retry<\/td><td>Look up existing ticket before create<\/td><\/tr><tr><td>Approval timeout<\/td><td>Unapproved action<\/td><td>Stop, notify human owner<\/td><\/tr><tr><td>Connector 401\/403<\/td><td>Unauthorized access<\/td><td>Stop and request scoped repair<\/td><\/tr><tr><td>Workflow partially succeeded<\/td><td>Misleading SOC status<\/td><td>Explicit partial-failure outcome<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>PASS:<\/strong>&nbsp;One duplicate and one fault scenario documented; live PASS requires real durable-state evidence and explicit failure branch; design-only work earns conceptual credit.<br><strong>Evidence:<\/strong>&nbsp;<code>D4-L12-idempotency-and-faults.md<\/code>, workflow run IDs.&nbsp;<strong>Read:<\/strong>&nbsp;[R07\u2013R09], [R13].<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">D4-L13 \u2014 Connect the playbook to a narrowly scoped Sentinel automation rule<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Mapped:<\/strong>&nbsp;A09, A13.&nbsp;<strong>Outcome:<\/strong>&nbsp;Trigger only on the approved lab context and verify permission boundaries.<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>With the workflow\u00a0<strong>disabled or unconnected<\/strong>, agree on a single incident\/case-producing test method and a unique\u00a0<code>D4-LAB-<\/code>\u00a0title or rule name. Record the exact Sentinel workspace and intended trigger.<\/li>\n\n\n\n<li>In Defender go to\u00a0<strong>Microsoft Sentinel > Configuration > Automation<\/strong>, then\u00a0<strong>Create > Automation rule<\/strong>, as offered in your experience [R08].<\/li>\n\n\n\n<li>Enter name\u00a0<code>ar-d4-lab-scope-&lt;initials><\/code>\u00a0and select a\u00a0<strong>supported<\/strong>\u00a0trigger matching the playbook: incident created, incident updated, alert created, or available case event. Do not assume every incident metadata field is allowed for every trigger.<\/li>\n\n\n\n<li>Add the\u00a0<strong>narrowest available conditions<\/strong>\u00a0using the authorized lab analytics rule name, lab incident scope, source and severity as appropriate. If the trigger cannot restrict to your lab content adequately,\u00a0<strong>stop and use manual execution<\/strong>. A blanket\u00a0<code>All incidents<\/code>\u00a0training rule is unacceptable.<\/li>\n\n\n\n<li>Select action\u00a0<strong>Run playbook<\/strong>\u00a0and the exact workflow. If it is unavailable or greyed out, verify trigger compatibility and the\u00a0<strong>Sentinel Automation Contributor<\/strong>\u00a0permission for the service account on the workflow RG.<\/li>\n\n\n\n<li>Review\u00a0<strong>rule order<\/strong>\u00a0and an\u00a0<strong>expiration date<\/strong>. Prefer a short-lived lab rule; record the disabling\/cleanup owner.<\/li>\n\n\n\n<li>Create or update\u00a0<strong>one<\/strong>\u00a0approved lab test incident. Check\u00a0<strong>rule execution<\/strong>,\u00a0<strong>Logic Apps run history<\/strong>\u00a0and case\/incident audit history. Do not treat an enabled automation rule icon as evidence that a workflow ran.<\/li>\n\n\n\n<li>Manually\u00a0<strong>disable the rule<\/strong>\u00a0after the test and confirm the disabled status in the portal. Leave the playbook itself in a safe state pending the troubleshooting exercise.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>PASS:<\/strong>&nbsp;Trigger scoped to lab; one permitted actual run observed; service-account permission documented; rule disabled and cleanup recorded.<br><strong>Evidence:<\/strong>&nbsp;automation rule ID\/config snapshot, one run ID and post-test disabled state.&nbsp;<strong>Read:<\/strong>&nbsp;[R08\u2013R09].<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">D4-L14 \u2014 Debug advanced response and prove the operating boundary<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Mapped:<\/strong>&nbsp;A14.&nbsp;<strong>Outcome:<\/strong>&nbsp;Diagnose the first failed component from the&nbsp;<strong>right<\/strong>&nbsp;log surface.<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Pick one instructor-seeded failed run or use a harmless missing-lookup test. Capture the exact UTC run and action IDs.<\/li>\n\n\n\n<li>Inspect the\u00a0<strong>Sentinel automation rule<\/strong>\u00a0outcome first: did the rule trigger, did its conditions match, and was invoking the playbook permitted?<\/li>\n\n\n\n<li>Then inspect\u00a0<strong>Azure Logic Apps > Workflow > Run history<\/strong>. Identify the first\u00a0<strong>Failed<\/strong>\u00a0or\u00a0<strong>Timed out<\/strong>\u00a0action; open only sanitized inputs\/outputs. An automation-rule status that says\u00a0<em>launched<\/em>\u00a0does not prove successful completion of the workflow&#8217;s internal actions.<\/li>\n\n\n\n<li>Inspect connector authorization if error is 401\/403; inspect quotas\/backoff if 429; inspect schema\/empty dynamic content if null; inspect trigger mismatches if the playbook is not selectable.<\/li>\n\n\n\n<li>Record whether a workflow repeated due to\u00a0<code>incident updated<\/code>\u00a0firing after a workflow itself updated the incident. Add explicit scoping\/idempotency protection; do not rely only on increasing delays.<\/li>\n\n\n\n<li>Review\u00a0<em>who<\/em>\u00a0has permission to view execution logs. If sensitive content may have been exposed, stop, restrict logs and follow the organization&#8217;s secret-handling policy.<\/li>\n\n\n\n<li>Fill the fault worksheet:<\/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\">Symptom<\/th><th class=\"has-text-align-left\" data-align=\"left\">First evidence<\/th><th class=\"has-text-align-left\" data-align=\"left\">Cause to check<\/th><th class=\"has-text-align-left\" data-align=\"left\">Safe repair<\/th><th class=\"has-text-align-left\" data-align=\"left\">Confirm repair<\/th><\/tr><\/thead><tbody><tr><td>No playbook option<\/td><td>Automation list<\/td><td>Missing RG grant or wrong trigger<\/td><td>Narrow grant \/ correct trigger<\/td><td>Playbook listed<\/td><\/tr><tr><td>No run after rule fires<\/td><td>Sentinel rule history<\/td><td>Condition\/role\/disabled<\/td><td>Fix bounded test<\/td><td>One run appears<\/td><\/tr><tr><td>Run ends 403<\/td><td>Failed connector action<\/td><td>Connection RBAC\/consent<\/td><td>Fix minimal access<\/td><td>Test-only action succeeds<\/td><\/tr><tr><td>Multiple tickets<\/td><td>Ticket audit<\/td><td>Missing key \/ retry replay<\/td><td>Query by immutable ID<\/td><td>No duplicates<\/td><\/tr><tr><td>Approval never returns<\/td><td>Approval provider status<\/td><td>Timeout\/identity<\/td><td>Stop and notify<\/td><td>Failure safely recorded<\/td><\/tr><tr><td>Rule causes new incidents recursively<\/td><td>Incident\/audit timeline<\/td><td>Update-trigger feedback<\/td><td>Disable rule immediately<\/td><td>No new runs<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>PASS:<\/strong>&nbsp;Root cause supported by a cited error\/run and the corrective control; observed resolution where permission allows, otherwise clearly marked blocked.<br><strong>Evidence:<\/strong>&nbsp;<code>D4-L14-root-cause.md<\/code>, sanitized run details.&nbsp;<strong>Read:<\/strong>&nbsp;[R08], [R13].<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">DAY 4 CAPSTONE \u2014 integrated skills verification<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">Scenario and instructions<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">You are the lead detection engineer at fictional Aster Retail. A suspicious privileged sign-in, a network anomaly and a high-risk access change appear across differently formatted sources. Your job is to&nbsp;<strong>investigate without overclaiming evidence<\/strong>, propose a reliable rule and prepare a&nbsp;<strong>safe approval-gated<\/strong>&nbsp;lab response. You must work from the validated Day 3 environment (or an explicitly labeled synthetic substitute).<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Submission pack:<\/strong><\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><code>01_asim_contract.md<\/code>\u00a0\u2014 source table, parser, normalized fields, ambiguity and observed event IDs.<\/li>\n\n\n\n<li><code>02_query.kql<\/code>\u00a0\u2014 multi-stage correlation with timestamp\/identity boundaries and query version.<\/li>\n\n\n\n<li><code>03_regression_tests.csv<\/code>\u00a0\u2014 test IDs, expected outcomes, observed outcomes and false-positive analysis.<\/li>\n\n\n\n<li><code>04_hunt_report.md<\/code>\u00a0\u2014 hypothesis, T1078.004\/T1098.003 mapping, evidence, alternate explanations and disposition.<\/li>\n\n\n\n<li><code>05_playbook_workflow.md<\/code>\u00a0\u2014 trigger type, safe scope, approvals, auth model, idempotency and rejection branch.<\/li>\n\n\n\n<li><code>06_run_history.md<\/code>\u00a0\u2014 run IDs, approval\/reject\/timeout evidence and negative-scope result, or explicit simulated-track notation.<\/li>\n\n\n\n<li><code>07_rollback_and_cost.md<\/code>\u00a0\u2014 owner, estimated Logic Apps cost drivers, disable path and resource cleanup.<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\">Instructor scoring 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\">Skill<\/th><th class=\"has-text-align-right\" data-align=\"right\">Points<\/th><th class=\"has-text-align-left\" data-align=\"left\">Evidence threshold<\/th><\/tr><\/thead><tbody><tr><td>ASIM source\/field contract (A01\u2013A02)<\/td><td class=\"has-text-align-right\" data-align=\"right\">15<\/td><td>Correct parser semantics and source coverage, no fabricated data<\/td><\/tr><tr><td>Robust multi-stage KQL (A03)<\/td><td class=\"has-text-align-right\" data-align=\"right\">15<\/td><td>Order, keys, window and duplicates handled<\/td><\/tr><tr><td>Detection mode choice + regression (A04\u2013A05)<\/td><td class=\"has-text-align-right\" data-align=\"right\">15<\/td><td>Realistic constraints, positive and negative tests<\/td><\/tr><tr><td>Hunt and ATT&amp;CK (A06\u2013A08)<\/td><td class=\"has-text-align-right\" data-align=\"right\">20<\/td><td>Falsifiable hypothesis, mapped behavior, independent evidence, alternatives<\/td><\/tr><tr><td>SOAR design and controlled workflow (A09\u2013A11)<\/td><td class=\"has-text-align-right\" data-align=\"right\">15<\/td><td>Correct trigger, least privilege, human decision gate<\/td><\/tr><tr><td>Reliability and response governance (A12\u2013A13)<\/td><td class=\"has-text-align-right\" data-align=\"right\">10<\/td><td>Idempotency and timeout\/reject protections<\/td><\/tr><tr><td>Debugging + evidence quality (A14)<\/td><td class=\"has-text-align-right\" data-align=\"right\">10<\/td><td>Run-level root cause, cleanup evidence, candid limitations<\/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<p class=\"wp-block-paragraph\"><strong>Suggested advancement rule:<\/strong>&nbsp;At least&nbsp;<strong>80\/100<\/strong>, plus&nbsp;<strong>all mandatory safety checks<\/strong>: no production intervention; no workflow able to act on out-of-scope incidents; rejection and timeout have no disruptive effects; roles are reviewed; evidence distinguishes actual runs from simulations. A conceptual-only learner cannot be represented as having completed a live SOAR deployment. This is an instructor rubric, not an official Microsoft certification.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Quick knowledge check (answers for instructors)<\/h2>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Why is a normalized IP insufficient for strong identity attribution?<\/strong>\u00a0Because its semantics can be resolver, shared proxy, NAT or user-supplied; independently confirm who acted.<\/li>\n\n\n\n<li><strong>When is NRT different from scheduled rules?<\/strong>\u00a0NRT executes on a fixed minute cadence and has result\/window constraints; scheduled rules permit other configuration. Unified custom detections are a separate eligible experience.<\/li>\n\n\n\n<li><strong>Does an ATT&amp;CK tag prove effectiveness?<\/strong>\u00a0No; it maps intended behavior, not detection recall.<\/li>\n\n\n\n<li><strong>Why can&#8217;t Compose guarantee idempotency?<\/strong>\u00a0It is not a durable, atomic record shared across runs.<\/li>\n\n\n\n<li><strong>Does an automation rule&#8217;s successful playbook launch prove the workflow finished successfully?<\/strong>\u00a0No; inspect Logic Apps run history.<\/li>\n\n\n\n<li><strong>What happens when approval is rejected?<\/strong>\u00a0No permitted remediation; record the decision and notify the case owner.<\/li>\n\n\n\n<li><strong>What if automation cannot be narrowed to the test scope?<\/strong>\u00a0Do not turn it on; use supervised manual runs.<\/li>\n\n\n\n<li><strong>Can a learner claim completed human-in-the-loop authorization from an instructor-controlled Boolean?<\/strong>\u00a0No; that is a simulation of branching, not external approval transport.<\/li>\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading\">Syllabus coverage audit \u2014 Day 4 only<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The following competencies are taught&nbsp;<strong>as new Day 4 skills<\/strong>. Days 1\u20133 are prerequisites and are not repeated as instructional labs.<\/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\">Syllabus ID<\/th><th class=\"has-text-align-left\" data-align=\"left\">New advanced competency<\/th><th class=\"has-text-align-left\" data-align=\"left\">Primary hands-on evidence<\/th><\/tr><\/thead><tbody><tr><td>A01<\/td><td>ASIM schemas, parser hierarchy, source normalization<\/td><td>D4-L01 parser contract<\/td><\/tr><tr><td>A02<\/td><td>Parser parameter filtering and performance<\/td><td>D4-L02 query comparison<\/td><\/tr><tr><td>A03<\/td><td>Multi-stage detection logic<\/td><td>D4-L03 fixture and live-source plan<\/td><\/tr><tr><td>A04<\/td><td>Scheduled, NRT, unified detection tradeoffs<\/td><td>D4-L04 decision record<\/td><\/tr><tr><td>A05<\/td><td>Detection regression and quality<\/td><td>D4-L05 test matrix<\/td><\/tr><tr><td>A06<\/td><td>Falsifiable threat hunts<\/td><td>D4-L06 hunt report<\/td><\/tr><tr><td>A07<\/td><td>ATT&amp;CK technique mappings<\/td><td>D4-L07 mapping validation<\/td><\/tr><tr><td>A08<\/td><td>Entity\/anomaly analysis<\/td><td>D4-L08 context and counterevidence<\/td><\/tr><tr><td>A09<\/td><td>SOAR trigger\/action architecture<\/td><td>D4-L09, D4-L13 automation contract<\/td><\/tr><tr><td>A10<\/td><td>Controlled incident\/case playbook<\/td><td>D4-L10 workflow and run evidence<\/td><\/tr><tr><td>A11<\/td><td>Workflow identities and privileges<\/td><td>D4-L11 IAM review<\/td><\/tr><tr><td>A12<\/td><td>Reliability, retries, deduplication<\/td><td>D4-L12 fault-injection evidence<\/td><\/tr><tr><td>A13<\/td><td>Approval and response guardrails<\/td><td>D4-L09\u2013L10, D4-L13<\/td><\/tr><tr><td>A14<\/td><td>Workflow failure diagnostics<\/td><td>D4-L14 root-cause worksheet<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Daily evidence checklist<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>[ ] D4-L00 preflight, resource ownership and lab boundary<\/li>\n\n\n\n<li>[ ] D4-L01 parser\/source contract and observed rows or documented missing-source condition<\/li>\n\n\n\n<li>[ ] D4-L02 optimized versus comparison queries and test context<\/li>\n\n\n\n<li>[ ] D4-L03 synthetic query and four negative variants<\/li>\n\n\n\n<li>[ ] D4-L04 scheduled\/NRT\/unified mode decision<\/li>\n\n\n\n<li>[ ] D4-L05 regression design and metrics disclaimer<\/li>\n\n\n\n<li>[ ] D4-L06 hunt report, UTC interval, alternative hypotheses<\/li>\n\n\n\n<li>[ ] D4-L07 ATT&amp;CK coverage map with actual telemetry checks<\/li>\n\n\n\n<li>[ ] D4-L08 entity pivot and source confidence<\/li>\n\n\n\n<li>[ ] D4-L09 signed SOAR architecture and approval contract<\/li>\n\n\n\n<li>[ ] D4-L10 live or simulated approve\/reject\/wrong-scope execution status<\/li>\n\n\n\n<li>[ ] D4-L11 IAM and secrets audit<\/li>\n\n\n\n<li>[ ] D4-L12 idempotency and safe-failure verification<\/li>\n\n\n\n<li>[ ] D4-L13 scoped automation rule disabled after testing<\/li>\n\n\n\n<li>[ ] D4-L14 fault worksheet with observed root cause<\/li>\n\n\n\n<li>[ ] Capstone scored, safety signed off, learner status recorded<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Safe cleanup checklist \u2014 do not delete shared training assets<\/h2>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Disable the\u00a0<strong>lab automation rule<\/strong>\u00a0first. Confirm no more automatic triggers occur.<\/li>\n\n\n\n<li>Disable the\u00a0<strong>lab Logic App workflow<\/strong>, after preserving only approved\/sanitized run IDs and minimal evidence. Confirm no outstanding approval requests remain.<\/li>\n\n\n\n<li>Delete optional\u00a0<strong>sandbox<\/strong>\u00a0tickets according to service desk procedures; preserve audit records that must be retained.<\/li>\n\n\n\n<li>Remove temporary lab-specific Sentinel analytics rules and test content\u00a0<strong>only if the instructor owns them<\/strong>\u00a0and they are not prerequisites for Day 5; consider leaving them disabled for version-control labs.<\/li>\n\n\n\n<li>Remove temporary lab role assignments with the approving RBAC owner,\u00a0<strong>not<\/strong>\u00a0blindly deleting inherited team access.<\/li>\n\n\n\n<li>Delete Logic App resources only if\u00a0<strong>not shared or required for Day 5<\/strong>, and only after reviewing associated resource groups, connection resources and cost impact.<\/li>\n\n\n\n<li>Review Azure Cost Management and Logic Apps usage for the dedicated test scope; avoid claiming exact cost until billing data is available.<\/li>\n\n\n\n<li>Preserve deliverables in controlled storage with redaction, retention policy and final learner signoff.<\/li>\n<\/ol>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Common errors and escalation table<\/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\">Problem<\/th><th class=\"has-text-align-left\" data-align=\"left\">Likely origin<\/th><th class=\"has-text-align-left\" data-align=\"left\">First diagnostic action<\/th><th class=\"has-text-align-left\" data-align=\"left\">Acceptable alternate<\/th><\/tr><\/thead><tbody><tr><td><code>_Im_Dns<\/code>&nbsp;unknown<\/td><td>Query editor\/workspace\/function scope<\/td><td>Verify parser availability and query context<\/td><td>Schema mapping worksheet<\/td><\/tr><tr><td>ASIM query empty<\/td><td>Source not connected or time filter too narrow<\/td><td>Inspect raw source and UTC window<\/td><td>Labeled synthetic fixture<\/td><\/tr><tr><td>Correlation returns duplicates<\/td><td>Many-to-many join<\/td><td>Analyze keys, summarize before join<\/td><td>Deduplicated synthetic example<\/td><\/tr><tr><td>Alert not created<\/td><td>Rule disabled, schedule, no matching real source<\/td><td>Check rule health \/ actual source data<\/td><td>Design-only assessment<\/td><\/tr><tr><td>No bookmark creation in Defender<\/td><td>Feature limitation, not learner error<\/td><td>Save text\/results in evidence repo<\/td><td>Saved query \/ hunt report<\/td><\/tr><tr><td>Playbook invisible<\/td><td>Wrong trigger or service account missing role<\/td><td>Inspect trigger type \/ playbook RG permissions<\/td><td>Manual workflow review<\/td><\/tr><tr><td>Unexpected connector prompt<\/td><td>Connector-based delegated OAuth<\/td><td>Validate approved auth and minimal scope<\/td><td>Mock Compose branch<\/td><\/tr><tr><td>Repeat approvals<\/td><td>No dedup or incident update loop<\/td><td>Disable rule, inspect duplicate runs<\/td><td>Instructor replay log<\/td><\/tr><tr><td>No approval action<\/td><td>Missing provider licensing\/consent<\/td><td>Check connector and organization policy<\/td><td>Explicitly labeled simulated decision<\/td><\/tr><tr><td>401\/403 at runtime<\/td><td>Incorrect identity\/resource permissions<\/td><td>Open failed action + IAM mapping<\/td><td>Instructor-operated lab<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h1 class=\"wp-block-heading\">Verification ledger (this edition)<\/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\">Verification category<\/th><th class=\"has-text-align-left\" data-align=\"left\">Status<\/th><th class=\"has-text-align-left\" data-align=\"left\">Required next verification<\/th><\/tr><\/thead><tbody><tr><td>Course coverage A01\u2013A14<\/td><td>Structured against supplied agenda<\/td><td>Instructor confirms institutional objectives<\/td><\/tr><tr><td>Microsoft Learn portal\/feature guidance<\/td><td>Cross-checked in November 2026<\/td><td>Recheck before delivering to a new tenant<\/td><\/tr><tr><td>KQL synthetic data relationships<\/td><td>Self-contained and designed for stated outputs<\/td><td>Execute in chosen KQL engine; save actual output<\/td><\/tr><tr><td>ASIM against your specific sources<\/td><td><strong>Not executed<\/strong><\/td><td>Run parser and raw-source comparisons<\/td><\/tr><tr><td>NRT\/unified custom detection entitlement<\/td><td><strong>Tenant-dependent, not executed<\/strong><\/td><td>Confirm permitted rule types and roles<\/td><\/tr><tr><td>Logic Apps approval connector<\/td><td><strong>Not executed<\/strong><\/td><td>Test approve\/reject\/timeout with named approver<\/td><\/tr><tr><td>Automatic playbook invocation<\/td><td><strong>Not executed<\/strong><\/td><td>Observe incident\/case trigger and Logic Apps run history<\/td><\/tr><tr><td>Costs, RBAC and region<\/td><td><strong>Not verified for your subscription<\/strong><\/td><td>Verify region, budget, resource IAM and billed usage<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Source register \u2014 official documentation and technique definitions<\/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\">These links were consulted for concepts, feature changes or procedural paths as of&nbsp;<strong>1 November 2026<\/strong>. Website guidance may update later. The course is an independently authored educational resource, not a Microsoft-authorized certification lab.<\/p>\n<\/blockquote>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>[R01]<\/strong>\u00a0<a href=\"https:\/\/learn.microsoft.com\/en-us\/azure\/sentinel\/microsoft-sentinel-defender-portal\">Microsoft Sentinel in Microsoft Defender portal \/ navigation and 2027 cutoff<\/a><\/li>\n\n\n\n<li><strong>[R02]<\/strong>\u00a0<a href=\"https:\/\/learn.microsoft.com\/en-us\/azure\/sentinel\/normalization-parsers-overview\">ASIM parsers overview<\/a><\/li>\n\n\n\n<li><strong>[R03]<\/strong>\u00a0<a href=\"https:\/\/learn.microsoft.com\/en-us\/azure\/sentinel\/normalization-about-parsers\">Using ASIM parsers and supported filter parameters<\/a><\/li>\n\n\n\n<li><strong>[R04]<\/strong>\u00a0<a href=\"https:\/\/learn.microsoft.com\/en-us\/azure\/sentinel\/create-nrt-rules\">Create NRT analytics rules<\/a><\/li>\n\n\n\n<li><strong>[R05]<\/strong>\u00a0<a href=\"https:\/\/learn.microsoft.com\/en-us\/defender-xdr\/custom-detection-rules\">Microsoft Defender custom detection rules<\/a><\/li>\n\n\n\n<li><strong>[R06]<\/strong>\u00a0<a href=\"https:\/\/learn.microsoft.com\/en-us\/azure\/sentinel\/bookmarks\">Hunting bookmarks and Defender limitations<\/a><\/li>\n\n\n\n<li><strong>[R07]<\/strong>\u00a0<a href=\"https:\/\/learn.microsoft.com\/en-us\/azure\/sentinel\/automation\/create-playbooks\">Create and manage Sentinel playbooks<\/a><\/li>\n\n\n\n<li><strong>[R08]<\/strong>\u00a0<a href=\"https:\/\/learn.microsoft.com\/en-us\/azure\/sentinel\/automation\/run-playbooks\">Run playbooks, automation rules and required permissions<\/a><\/li>\n\n\n\n<li><strong>[R09]<\/strong>\u00a0<a href=\"https:\/\/learn.microsoft.com\/en-us\/azure\/sentinel\/automate-incident-handling-with-automation-rules\">Automation rules and their execution<\/a><\/li>\n\n\n\n<li><strong>[R10]<\/strong>\u00a0<a href=\"https:\/\/learn.microsoft.com\/en-us\/azure\/sentinel\/normalization-parsers-list\">ASIM parsers list by source<\/a><\/li>\n\n\n\n<li><strong>[R11]<\/strong>\u00a0<a href=\"https:\/\/learn.microsoft.com\/en-us\/azure\/sentinel\/hunting\">Microsoft Sentinel threat hunting capabilities<\/a><\/li>\n\n\n\n<li><strong>[R12]<\/strong>\u00a0<a href=\"https:\/\/attack.mitre.org\/techniques\/T1078\/004\/\">MITRE ATT&amp;CK T1078.004<\/a>\u00a0and\u00a0<a href=\"https:\/\/attack.mitre.org\/techniques\/T1098\/003\/\">T1098.003<\/a><\/li>\n\n\n\n<li><strong>[R13]<\/strong>\u00a0<a href=\"https:\/\/learn.microsoft.com\/en-us\/azure\/sentinel\/automation\/logic-apps-playbooks\">Azure Logic Apps playbooks concepts, authentication, workflow types<\/a><\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>End of standalone Day 4 manual.<\/strong>&nbsp;Completion prepares the learner for&nbsp;<strong>Day 5 enterprise architecture, data strategy, detection-as-code, governance and capstone<\/strong>; none of those are retaught here.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Module 3: Advanced |&nbsp;Day 4 only&nbsp;| Detection Engineering, Threat Hunting and SOAR Curriculum version:&nbsp;1 November 2026Course:&nbsp;Five-day progressive Microsoft Sentinel technical trainingThis manual:&nbsp;Day 4 only \u2014 syllabus competencies&nbsp;A01\u2013A14Prerequisite:&nbsp;Demonstrated&#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-1264","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"_links":{"self":[{"href":"https:\/\/www.devopsschool.com\/tutorials\/wp-json\/wp\/v2\/posts\/1264","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=1264"}],"version-history":[{"count":2,"href":"https:\/\/www.devopsschool.com\/tutorials\/wp-json\/wp\/v2\/posts\/1264\/revisions"}],"predecessor-version":[{"id":1273,"href":"https:\/\/www.devopsschool.com\/tutorials\/wp-json\/wp\/v2\/posts\/1264\/revisions\/1273"}],"wp:attachment":[{"href":"https:\/\/www.devopsschool.com\/tutorials\/wp-json\/wp\/v2\/media?parent=1264"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.devopsschool.com\/tutorials\/wp-json\/wp\/v2\/categories?post=1264"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.devopsschool.com\/tutorials\/wp-json\/wp\/v2\/tags?post=1264"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}