<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Pages on Brewed in the Cloud by Chris Hailes</title><link>https://blog.brewedinthecloud.com/page/</link><description>Recent content in Pages on Brewed in the Cloud by Chris Hailes</description><generator>Hugo -- gohugo.io</generator><language>en-us</language><lastBuildDate>Tue, 24 Nov 2026 00:00:00 +1100</lastBuildDate><atom:link href="https://blog.brewedinthecloud.com/page/rss.xml" rel="self" type="application/rss+xml"/><item><title>Azure Reachability Assurance: Reader Toolkit</title><link>https://blog.brewedinthecloud.com/azure-reachability-assurance-toolkit/</link><pubDate>Tue, 27 Oct 2026 00:00:00 +1100</pubDate><guid>https://blog.brewedinthecloud.com/azure-reachability-assurance-toolkit/</guid><description>&lt;p&gt;Can you show what an assumed-compromised workload can do, remove an unwanted operation, and verify that required service still works?&lt;/p&gt;
&lt;p&gt;I built and tested this lab to provide examples you can recreate and adapt. It accompanies &lt;strong&gt;Azure Reachability Assurance Lab&lt;/strong&gt;, planned for February 16-March 4, 2027, and is available independently so you can inspect the code first.&lt;/p&gt;
&lt;h2 id="download-and-start-offline"&gt;Download and start offline
&lt;/h2&gt;&lt;p&gt;&lt;a class="link" href="https://blog.brewedinthecloud.com/downloads/azure-reachability-assurance-lab/azure-reachability-assurance-lab-0.1.1-preview.zip" &gt;Download toolkit 0.1.1-preview&lt;/a&gt; and its &lt;a class="link" href="https://blog.brewedinthecloud.com/downloads/azure-reachability-assurance-lab/azure-reachability-assurance-lab-0.1.1-preview.zip.sha256" &gt;SHA-256 checksum&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Extract the ZIP and read &lt;code&gt;README.md&lt;/code&gt;. Python 3.10+ and its standard library are enough for the offline exercise; no Azure account or dependencies are needed. The deliberately incorrect fictional comparison should fail validation. Explain why, inspect the corrected example, then use the worksheet to define required and prohibited operations for your own environment.&lt;/p&gt;
&lt;p&gt;The package includes Bicep, a guarded runner, fixed-target probe, evidence validator, query, runbook, approval checklist, worksheet, tests and sanitized lab findings. Filled approvals, raw operational logs and keys are excluded.&lt;/p&gt;
&lt;h2 id="inspect-the-artifacts"&gt;Inspect the artifacts
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://blog.brewedinthecloud.com/downloads/azure-reachability-assurance-lab/README.md" &gt;Lab guide&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://blog.brewedinthecloud.com/downloads/azure-reachability-assurance-lab/RUNBOOK.md" &gt;Runbook&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://blog.brewedinthecloud.com/downloads/azure-reachability-assurance-lab/APPROVAL.md" &gt;Permissions, pricing and approval checklist&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://blog.brewedinthecloud.com/downloads/azure-reachability-assurance-lab/WORKSHEET.md" &gt;Adaptation worksheet&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://blog.brewedinthecloud.com/downloads/azure-reachability-assurance-lab/VALIDATION.md" &gt;Measured lab findings and negative results&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://blog.brewedinthecloud.com/downloads/azure-reachability-assurance-lab/live-verification.json" &gt;Detailed verification record&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://blog.brewedinthecloud.com/downloads/azure-reachability-assurance-lab/LIMITATIONS.md" &gt;Known limitations&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="what-the-lab-established"&gt;What the lab established
&lt;/h2&gt;&lt;p&gt;The isolated experiment compared required, spare-container and separate-canary marker reads. Identity-only controls denied the spare and canary reads. Network-only controls left the spare read working but the canary timed out. Combined controls preserved required access. Narrow recovery restored only the required grant while the unwanted operations remained unavailable.&lt;/p&gt;
&lt;p&gt;An initial required read still succeeded shortly after role removal; one recorded readiness retry later observed denial. That is not immediate revocation or a measured revocation SLA. The first deployment also exposed a Run Command response-format bug, corrected before a fresh source-bound run. Both groups were deleted, with final absence confirmed.&lt;/p&gt;
&lt;p&gt;These are finite observations, not tenant-wide containment proof. A timeout alone does not establish cause. The lab permits broad AzureCloud HTTPS management egress through NAT; it is not zero-egress. DNS faults, existing sessions and hostile control-plane administrators were not tested.&lt;/p&gt;
&lt;h2 id="preview-status-and-safe-adaptation"&gt;Preview status and safe adaptation
&lt;/h2&gt;&lt;p&gt;This is an author-approved &lt;strong&gt;limited preview&lt;/strong&gt;, not an independently reproduced assurance pack. Independent reader replay and settled-cost review are still outstanding. Billing initially had no rows and later throttled; no zero-cost claim is made. Local extracted-package tests do not substitute for another operator&amp;rsquo;s replay.&lt;/p&gt;
&lt;p&gt;Use only a disposable environment you own or are explicitly authorized to operate. Obtain current region/SKU, quota, policy, permissions and pricing checks, a numeric spend cap, and a cleanup owner before any cloud action. Read the approval checklist; the example approval is not permission to deploy.&lt;/p&gt;
&lt;p&gt;Adapt the evidence model to your business operations first on paper. Do not repoint the runner to production or arbitrary hosts. A tested sample is a starting point for your own review, not a production remediation script or certification.&lt;/p&gt;</description></item><item><title>Operate Through Compromise: Reader Toolkit</title><link>https://blog.brewedinthecloud.com/operate-through-compromise-toolkit/</link><pubDate>Tue, 27 Oct 2026 00:00:00 +1100</pubDate><guid>https://blog.brewedinthecloud.com/operate-through-compromise-toolkit/</guid><description>&lt;p&gt;Can your evidence distinguish a blocked operation from an unexplained timeout, while keeping a healthy peer available?&lt;/p&gt;
&lt;p&gt;This toolkit accompanies &lt;strong&gt;Operate Through Compromise&lt;/strong&gt;, a six-article series planned for January 26-February 11, 2027. It is available independently so you can inspect the code and safety constraints before using it.&lt;/p&gt;
&lt;h2 id="download-and-start-offline"&gt;Download and start offline
&lt;/h2&gt;&lt;p&gt;&lt;a class="link" href="https://blog.brewedinthecloud.com/downloads/operate-through-compromise/operate-through-compromise-toolkit-1.0.0.zip" &gt;Download toolkit 1.0.0&lt;/a&gt; and its &lt;a class="link" href="https://blog.brewedinthecloud.com/downloads/operate-through-compromise/operate-through-compromise-toolkit-1.0.0.zip.sha256" &gt;SHA-256 checksum&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Extract the ZIP, read &lt;code&gt;README.md&lt;/code&gt;, and begin with the Node.js 22+ offline exercise. It needs no Azure account or dependencies. The archive includes the guide, tests, Bicep templates, PowerShell runner, token-free Python probe, incident runbook and tabletop pack.&lt;/p&gt;
&lt;p&gt;The sample is explicitly illustrative. The validator rejects malformed or non-comparable evidence and preserves &lt;strong&gt;INCONCLUSIVE&lt;/strong&gt; when a worker receives no service response. A structurally valid record is not an authenticated approval or an isolation certificate.&lt;/p&gt;
&lt;h2 id="inspect-individual-artifacts"&gt;Inspect individual artifacts
&lt;/h2&gt;&lt;p&gt;These are downloadable Markdown documents; the same files are included in the ZIP:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://blog.brewedinthecloud.com/downloads/operate-through-compromise/README.md" &gt;Lab and offline usage guide&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://blog.brewedinthecloud.com/downloads/operate-through-compromise/incident-runbook.md" &gt;Incident runbook and empty worksheets&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://blog.brewedinthecloud.com/downloads/operate-through-compromise/tabletop-pack.md" &gt;Six-inject tabletop and observer pack&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://blog.brewedinthecloud.com/downloads/operate-through-compromise/azure-lab-verification.md" &gt;Redacted Azure verification report&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="what-was-observed-and-what-was-not"&gt;What was observed, and what was not
&lt;/h2&gt;&lt;p&gt;An authorized disposable Australia East lab and a corrected-workflow replay were exercised on October 27, 2026 (Sydney). Both workers initially returned HTTP 200. During the worker-scoped restriction, the worker received no response within approximately 15 seconds while its healthy peer returned HTTP 200. Both returned HTTP 200 after restoration. Both lab groups were deleted and their resource inventories confirmed empty.&lt;/p&gt;
&lt;p&gt;The timeout is compatible with containment, not proof of its cause or universal isolation. The experiment did &lt;strong&gt;not&lt;/strong&gt; establish token revocation, identity rebuilding, existing-session termination, automatic drift detection, production DNS/route recovery or workshop performance.&lt;/p&gt;
&lt;h2 id="before-any-cloud-execution"&gt;Before any cloud execution
&lt;/h2&gt;&lt;p&gt;Use only a disposable environment you own or are explicitly authorized to operate. Read every approval, permission, cost, rollback and cleanup requirement in the guide. The optional lab incurs Azure charges and requires current region/SKU, quota, policy and permission checks. An illustrative approval record is not permission to deploy.&lt;/p&gt;
&lt;p&gt;The code was exercised against the versions and configuration in the report, not every subscription. Recheck current authoritative documentation before use. Do not copy production credentials or confidential incident evidence into the sample, commit them to Git, or publish them with the worksheets.&lt;/p&gt;</description></item><item><title>About</title><link>https://blog.brewedinthecloud.com/about/</link><pubDate>Wed, 01 Jul 2026 00:00:00 +0000</pubDate><guid>https://blog.brewedinthecloud.com/about/</guid><description>&lt;h2 id="who-is-chris-hailes"&gt;Who is Chris Hailes?
&lt;/h2&gt;&lt;p&gt;I&amp;rsquo;m a cloud architect, consultant, writer, and Microsoft MVP who spends most of his time helping organisations design, secure, and modernise Azure environments. Brewed in the Cloud is where I share the practical lessons that come from real-world delivery work: the patterns that scale, the trade-offs that matter, and the mistakes worth avoiding.&lt;/p&gt;
&lt;h3 id="the-technologist"&gt;The Technologist
&lt;/h3&gt;&lt;p&gt;My background spans infrastructure, networking, security, architecture, and platform design, with more than two decades working across enterprise technology. While Azure is the main focus here, I care less about hype and more about building environments that are secure, resilient, observable, and actually workable for the teams who run them day to day.&lt;/p&gt;
&lt;h3 id="the-writer-teacher--advocate"&gt;The Writer, Teacher &amp;amp; Advocate
&lt;/h3&gt;&lt;p&gt;I learn best by breaking things down and explaining them clearly, which is exactly why this site exists. I write for architects, engineers, consultants, and technical leaders who want practical guidance rather than marketing gloss. That means content grounded in implementation details, operational reality, and the broader why behind good technical decisions.&lt;/p&gt;
&lt;h3 id="the-professional"&gt;The Professional
&lt;/h3&gt;&lt;p&gt;My work usually sits at the intersection of cloud strategy and hands-on delivery: landing zones, networking, security controls, governance, monitoring, identity, and operating model decisions that shape how platforms behave over time. If a design looks great on a diagram but falls apart in production, that&amp;rsquo;s the kind of gap I&amp;rsquo;m interested in closing.&lt;/p&gt;
&lt;h2 id="what-youll-find-here"&gt;What you&amp;rsquo;ll find here
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Azure architecture, networking, identity, and security content with a strong practical bias.&lt;/li&gt;
&lt;li&gt;Lessons from consulting, delivery, and platform operations translated into clear, usable guidance.&lt;/li&gt;
&lt;li&gt;Occasional reflections on community, career growth, tooling, and the process of learning in public.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="connect"&gt;Connect
&lt;/h2&gt;&lt;p&gt;If you&amp;rsquo;d like to learn more, connect, or dive deeper into my background, these links are a good place to start:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://linkedin.com/in/chailes" target="_blank" rel="noopener"
&gt;LinkedIn&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/Chris-Hailes" target="_blank" rel="noopener"
&gt;GitHub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://resume.hailes.id.au" target="_blank" rel="noopener"
&gt;Online resume&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://certifications.hailes.id.au" target="_blank" rel="noopener"
&gt;Training &amp;amp; certifications&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Privacy Policy</title><link>https://blog.brewedinthecloud.com/privacy-policy/</link><pubDate>Sun, 31 Aug 2025 00:00:00 +0000</pubDate><guid>https://blog.brewedinthecloud.com/privacy-policy/</guid><description>&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;Welcome to Brewed in the Cloud (&amp;ldquo;we,&amp;rdquo; &amp;ldquo;our,&amp;rdquo; or &amp;ldquo;us&amp;rdquo;). We are committed to protecting your privacy and personal data. This Privacy Policy explains how we collect, use, and protect your information when you visit our blog at &lt;a class="link" href="https://blog.brewedinthecloud.com" target="_blank" rel="noopener"
&gt;blog.brewedinthecloud.com&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This policy complies with the EU General Data Protection Regulation (GDPR) and other applicable data protection laws.&lt;/p&gt;
&lt;h2 id="information-we-collect"&gt;Information We Collect
&lt;/h2&gt;&lt;h3 id="1-analytics-data"&gt;1. Analytics Data
&lt;/h3&gt;&lt;p&gt;We use Microsoft Clarity and Google Analytics to understand how visitors interact with our website.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Microsoft Clarity (cookieless by default)&lt;/strong&gt;: Clarity runs on every page in its no-consent mode until you approve cookies. In this mode Clarity sets no cookies, assigns a new random identifier to each page view, and cannot link your visits together. We use it to count page views and understand how pages are used (for example, scrolling and clicks). Clarity masks sensitive text by default. If you approve cookies, Clarity may also set cookies so that multiple page views in one visit are recognised as a single session.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Google Analytics (only with your consent)&lt;/strong&gt;: Google Analytics loads only after you approve cookies. It may collect:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;IP address (anonymized)&lt;/li&gt;
&lt;li&gt;Browser type and version&lt;/li&gt;
&lt;li&gt;Operating system&lt;/li&gt;
&lt;li&gt;Pages visited and time spent&lt;/li&gt;
&lt;li&gt;Referring website&lt;/li&gt;
&lt;li&gt;General geographic location (country/city level)&lt;/li&gt;
&lt;li&gt;Device information (screen resolution, device type)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Legal Basis&lt;/strong&gt;: Legitimate interest for cookieless Microsoft Clarity measurement; your consent for Google Analytics and for Clarity cookies.&lt;/p&gt;
&lt;h3 id="2-cookies-and-similar-technologies"&gt;2. Cookies and Similar Technologies
&lt;/h3&gt;&lt;p&gt;We use cookies to enhance your browsing experience. You can manage your cookie preferences through our cookie consent banner.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Essential Cookies&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Cookie consent preferences&lt;/li&gt;
&lt;li&gt;Basic functionality cookies&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Analytics Cookies&lt;/strong&gt; (requires consent):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Google Analytics cookies (_ga, _ga_*, _gid)&lt;/li&gt;
&lt;li&gt;Microsoft Clarity cookies (_clck, _clsk, CLID, MUID)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you deny or don&amp;rsquo;t respond to the cookie banner, no analytics cookies are set. Microsoft Clarity still records page views in cookieless mode, as described above.&lt;/p&gt;
&lt;h3 id="3-embedded-content"&gt;3. Embedded Content
&lt;/h3&gt;&lt;p&gt;Our website may include embedded content from third-party services:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;YouTube Videos&lt;/strong&gt;: We use YouTube&amp;rsquo;s privacy-enhanced mode (youtube-nocookie.com) when available, which reduces data collection until you interact with the video.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;GitHub Gists&lt;/strong&gt;: Code examples may be embedded from GitHub, which may set cookies according to GitHub&amp;rsquo;s privacy policy.&lt;/p&gt;
&lt;h3 id="4-server-logs"&gt;4. Server Logs
&lt;/h3&gt;&lt;p&gt;Our hosting provider may collect standard server log information including:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;IP addresses&lt;/li&gt;
&lt;li&gt;Request timestamps&lt;/li&gt;
&lt;li&gt;HTTP status codes&lt;/li&gt;
&lt;li&gt;Referrer information&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This data is used for security, performance monitoring, and technical troubleshooting.&lt;/p&gt;
&lt;h2 id="how-we-use-your-information"&gt;How We Use Your Information
&lt;/h2&gt;&lt;p&gt;We use collected information for:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Website Analytics&lt;/strong&gt;: Understanding visitor behavior to improve content and user experience&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Performance Monitoring&lt;/strong&gt;: Ensuring optimal website performance and uptime&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Security&lt;/strong&gt;: Protecting against malicious activity and maintaining site security&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Content Optimization&lt;/strong&gt;: Creating relevant and useful content based on popular topics&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="data-sharing-and-third-parties"&gt;Data Sharing and Third Parties
&lt;/h2&gt;&lt;p&gt;We share data with the following third-party services:&lt;/p&gt;
&lt;h3 id="microsoft-clarity"&gt;Microsoft Clarity
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Purpose&lt;/strong&gt;: Page view measurement and usage insights (cookieless unless you approve cookies)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Data Shared&lt;/strong&gt;: Pages viewed, interactions such as clicks and scrolling, device and browser type, approximate location derived from your IP address&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Privacy Policy&lt;/strong&gt;: &lt;a class="link" href="https://privacy.microsoft.com/privacystatement" target="_blank" rel="noopener"
&gt;Microsoft Privacy Statement&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Data Location&lt;/strong&gt;: May be processed in Microsoft data centres globally&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Retention&lt;/strong&gt;: Clarity&amp;rsquo;s standard retention (aggregated metrics for up to 13 months, recordings for 30 days unless favourited)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="google-analytics"&gt;Google Analytics
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Purpose&lt;/strong&gt;: Website analytics and performance measurement&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Data Shared&lt;/strong&gt;: Anonymized usage data, IP addresses (anonymized)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Privacy Policy&lt;/strong&gt;: &lt;a class="link" href="https://policies.google.com/privacy" target="_blank" rel="noopener"
&gt;Google Privacy Policy&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Data Location&lt;/strong&gt;: May be processed in the United States&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Retention&lt;/strong&gt;: 26 months (Google Analytics default)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="hosting-provider"&gt;Hosting Provider
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Purpose&lt;/strong&gt;: Website hosting and content delivery&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Data Shared&lt;/strong&gt;: Technical logs and visitor data necessary for site operation&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Provider&lt;/strong&gt;: Microsoft Azure (Azure Static Web Apps)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Data Location&lt;/strong&gt;: May be processed in Microsoft Azure data centers globally&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Privacy Policy&lt;/strong&gt;: &lt;a class="link" href="https://privacy.microsoft.com/privacystatement" target="_blank" rel="noopener"
&gt;Microsoft Privacy Statement&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Data Protection&lt;/strong&gt;: Microsoft Azure complies with GDPR and other international data protection frameworks&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="your-rights-under-gdpr"&gt;Your Rights Under GDPR
&lt;/h2&gt;&lt;p&gt;If you are located in the European Economic Area (EEA), you have the following rights:&lt;/p&gt;
&lt;h3 id="right-of-access"&gt;Right of Access
&lt;/h3&gt;&lt;p&gt;You can request information about the personal data we hold about you.&lt;/p&gt;
&lt;h3 id="right-to-rectification"&gt;Right to Rectification
&lt;/h3&gt;&lt;p&gt;You can request correction of inaccurate personal data.&lt;/p&gt;
&lt;h3 id="right-to-erasure-right-to-be-forgotten"&gt;Right to Erasure (&amp;ldquo;Right to be Forgotten&amp;rdquo;)
&lt;/h3&gt;&lt;p&gt;You can request deletion of your personal data in certain circumstances.&lt;/p&gt;
&lt;h3 id="right-to-restrict-processing"&gt;Right to Restrict Processing
&lt;/h3&gt;&lt;p&gt;You can request limitation of how we process your personal data.&lt;/p&gt;
&lt;h3 id="right-to-data-portability"&gt;Right to Data Portability
&lt;/h3&gt;&lt;p&gt;You can request a copy of your personal data in a structured, machine-readable format.&lt;/p&gt;
&lt;h3 id="right-to-object"&gt;Right to Object
&lt;/h3&gt;&lt;p&gt;You can object to processing of your personal data for direct marketing or legitimate interests.&lt;/p&gt;
&lt;h3 id="right-to-withdraw-consent"&gt;Right to Withdraw Consent
&lt;/h3&gt;&lt;p&gt;Where processing is based on consent, you can withdraw it at any time through our cookie settings.&lt;/p&gt;
&lt;h2 id="cookie-management"&gt;Cookie Management
&lt;/h2&gt;&lt;p&gt;You can control cookies through:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Our Cookie Banner&lt;/strong&gt;: Accept or deny non-essential cookies when you first visit. To change your choice, delete the &lt;code&gt;cookie-notice-option&lt;/code&gt; cookie (or clear this site&amp;rsquo;s data) and the banner will reappear&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Browser Settings&lt;/strong&gt;: Configure your browser to block or delete cookies, or block &lt;code&gt;clarity.ms&lt;/code&gt; to opt out of cookieless measurement&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Opt-out Tools&lt;/strong&gt;: Use Google Analytics opt-out browser add-on&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="data-retention"&gt;Data Retention
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Analytics Data&lt;/strong&gt;: Retained for 26 months through Google Analytics; up to 13 months through Microsoft Clarity&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cookie Preferences&lt;/strong&gt;: Stored for 31 days&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Server Logs&lt;/strong&gt;: Typically retained for 30-90 days for security purposes&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="international-data-transfers"&gt;International Data Transfers
&lt;/h2&gt;&lt;p&gt;Some of our service providers (particularly Google Analytics) may transfer and process data outside the EEA. We ensure appropriate safeguards are in place:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Google Analytics&lt;/strong&gt;: Covered by Google&amp;rsquo;s compliance with data protection regulations and appropriate transfer mechanisms&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Microsoft Clarity&lt;/strong&gt;: Covered by Microsoft&amp;rsquo;s data protection commitments and appropriate transfer mechanisms&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="security-measures"&gt;Security Measures
&lt;/h2&gt;&lt;p&gt;We implement appropriate technical and organizational measures to protect personal data:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;HTTPS encryption for data transmission&lt;/li&gt;
&lt;li&gt;Regular security monitoring&lt;/li&gt;
&lt;li&gt;Access controls for any collected data&lt;/li&gt;
&lt;li&gt;Secure hosting infrastructure&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Archives</title><link>https://blog.brewedinthecloud.com/archives/</link><pubDate>Sun, 06 Mar 2022 00:00:00 +0000</pubDate><guid>https://blog.brewedinthecloud.com/archives/</guid><description/></item><item><title>Azure Exposure Reduction Toolkit</title><link>https://blog.brewedinthecloud.com/azure-exposure-reduction-toolkit/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://blog.brewedinthecloud.com/azure-exposure-reduction-toolkit/</guid><description>&lt;p&gt;This companion supports the six-part Engineering Exposure Reduction series. Its purpose is to make a bounded engineering decision reproducible: name the path, choose the boundary, test the operation, preserve necessary dependencies and compare the evidence.&lt;/p&gt;
&lt;p&gt;It is a practitioner toolkit, not a Microsoft standard, a complete attack graph or a production auto-remediation framework. Version 1 supplies six review templates, inspection queries and locally tested evidence-comparison tooling. Azure procedures are proposed checks, not observed tenant outcomes. No Azure deployment or live enforcement result is claimed; this version does not include Bicep deployment modules.&lt;/p&gt;
&lt;h2 id="download-and-local-quick-start"&gt;Download and local quick start
&lt;/h2&gt;&lt;p&gt;&lt;a class="link" href="https://blog.brewedinthecloud.com/downloads/azure-exposure-reduction-toolkit/azure-exposure-reduction-toolkit-v1.zip" &gt;Download the v1 toolkit ZIP&lt;/a&gt; and its &lt;a class="link" href="https://blog.brewedinthecloud.com/downloads/azure-exposure-reduction-toolkit/azure-exposure-reduction-toolkit-v1.sha256" &gt;SHA-256 checksum&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The bundle contains everything needed to run the local example:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;File&lt;/th&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;README.md&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Runtime, instructions, expected results and limitations&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Workbook.md&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Six reusable templates, assumption ledger and sign-off checks&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Compare-ExposureEvidence.ps1&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Read-only validation and comparison of sanitized JSON&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Test-ExposureEvidence.ps1&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Fixture assertions and 11 mutation cases&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;fixtures\before.json&lt;/code&gt;, &lt;code&gt;fixtures\after.json&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Synthetic baseline/after inputs, not observations&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;queries\PrivateEndpointInventory.kql&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Resource Graph inventory of automatic connections&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;queries\FirewallNetworkEvidence.kql&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Log Analytics network-rule context&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Windows PowerShell 5.1 is the validated local runtime. No Azure credentials or external PowerShell modules are needed for the comparator or self-test. Review the downloaded scripts, extract the ZIP, then open PowerShell in the extracted directory:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;powershell&lt;/span&gt; &lt;span class="n"&gt;-NoProfile&lt;/span&gt; &lt;span class="o"&gt;-File&lt;/span&gt; &lt;span class="p"&gt;.\&lt;/span&gt;&lt;span class="nb"&gt;Test-ExposureEvidence&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;ps1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$LASTEXITCODE&lt;/span&gt; &lt;span class="o"&gt;-ne&lt;/span&gt; &lt;span class="mf"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Toolkit self-test failed.&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;powershell&lt;/span&gt; &lt;span class="n"&gt;-NoProfile&lt;/span&gt; &lt;span class="o"&gt;-File&lt;/span&gt; &lt;span class="p"&gt;.\&lt;/span&gt;&lt;span class="nb"&gt;Compare-ExposureEvidence&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;ps1&lt;/span&gt; &lt;span class="p"&gt;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;-BeforePath&lt;/span&gt; &lt;span class="p"&gt;.\&lt;/span&gt;&lt;span class="n"&gt;fixtures&lt;/span&gt;&lt;span class="p"&gt;\&lt;/span&gt;&lt;span class="n"&gt;before&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;json&lt;/span&gt; &lt;span class="p"&gt;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;-AfterPath&lt;/span&gt; &lt;span class="p"&gt;.\&lt;/span&gt;&lt;span class="n"&gt;fixtures&lt;/span&gt;&lt;span class="p"&gt;\&lt;/span&gt;&lt;span class="n"&gt;after&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;json&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$LASTEXITCODE&lt;/span&gt; &lt;span class="o"&gt;-ne&lt;/span&gt; &lt;span class="mf"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Evidence comparison failed.&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;The test prints &lt;code&gt;PASS: fixture comparison and 11 mutation cases; no Azure calls made.&lt;/code&gt; It creates uniquely named temporary JSON files and cleans them up. The comparator reads its inputs and prints JSON without changing the files. If execution policy blocks a script, follow your organization&amp;rsquo;s approved process rather than disabling machine policy.&lt;/p&gt;
&lt;p&gt;To check the ZIP, run &lt;code&gt;Get-FileHash -LiteralPath .\azure-exposure-reduction-toolkit-v1.zip -Algorithm SHA256&lt;/code&gt; and compare the hash with the downloaded checksum. This detects different bytes; it is not a signature or proof of publisher authenticity.&lt;/p&gt;
&lt;h2 id="series-and-modules"&gt;Series and modules
&lt;/h2&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Series article&lt;/th&gt;
&lt;th&gt;Toolkit module&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a class="link" href="https://blog.brewedinthecloud.com/p/exposure-finding-to-path-reachability/" &gt;From Finding to Path: Model Azure Exposure as Reachability&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Path record and inventory context&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a class="link" href="https://blog.brewedinthecloud.com/p/exposure-controls-by-threat-boundary/" &gt;WAF, Firewall, DDoS or Network Security Perimeter? Choose by Threat Boundary&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Threat-to-control decision matrix&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a class="link" href="https://blog.brewedinthecloud.com/p/exposure-shared-path-enforcement/" &gt;Constrain Shared Network Paths with Azure Firewall and AVNM Security Admin Rules&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Enforcement and scope test matrix&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a class="link" href="https://blog.brewedinthecloud.com/p/exposure-private-access-egress-guardrails/" &gt;Private Access with Explicit Egress and Exfiltration Guardrails&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Destination/operation and residual-risk worksheet&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a class="link" href="https://blog.brewedinthecloud.com/p/exposure-repeatable-remediation-exceptions/" &gt;Make Remediation Repeatable with Policy, IaC and Expiring Exceptions&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Change and exception workflow&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a class="link" href="https://blog.brewedinthecloud.com/p/exposure-reduction-evidence/" &gt;Measure Exposure Reduction, Not Just Control Deployment&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Evidence-pack contract and local comparison&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;The series is scheduled for November 3, 5, 10, 12, 17 and 19, 2026. Article links become available as each article is published. The downloaded workbook and local comparison can be used independently of those pages.&lt;/p&gt;
&lt;h2 id="prerequisites-and-safety-boundary"&gt;Prerequisites and safety boundary
&lt;/h2&gt;&lt;p&gt;Use only a disposable, author-owned Azure scope with synthetic data and explicit deployment/test authorization. Separate read-only inventory permissions, configuration write permissions and service data permissions. The illustrative service is Blob on supported general-purpose v2 Storage; do not assume equivalent behavior for DFS, Files or another PaaS service.&lt;/p&gt;
&lt;p&gt;Record the selected Azure cloud/region, SKU, API/resource versions, CLI/module versions, diagnostic table schema and test principal. Confirm current documentation and resource support before execution. Set a cost/time cap before enabling Firewall, AVNM or billable diagnostics.&lt;/p&gt;
&lt;p&gt;Nothing here deploys Azure resources automatically. Do not use an existing tenant merely because a command accepts its identifiers. Never collect tokens, keys or sensitive object contents in evidence exports.&lt;/p&gt;
&lt;h2 id="1-path-record-and-read-only-inventory"&gt;1. Path record and read-only inventory
&lt;/h2&gt;&lt;p&gt;Use a stable record for each source/principal/destination/operation relationship:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;pathId&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;lab-app-to-controlled-blob-write&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;source&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&amp;lt;declared-source-workload&amp;gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;principal&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&amp;lt;declared-test-principal-id&amp;gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;destination&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&amp;lt;controlled-destination-resource-id&amp;gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;operation&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;synthetic-blob-write&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;intent&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;prohibited&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;dnsContext&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&amp;lt;resolver-and-zone-links&amp;gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;routeContext&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&amp;lt;effective-route-evidence-reference&amp;gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;authorityContext&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&amp;lt;scoped-data-role-evidence-reference&amp;gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;reopeningAuthority&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&amp;lt;control-plane-owner-and-scope&amp;gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;expectedAfter&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;blocked&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;positiveControls&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;approved-blob-read&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;telemetry&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;responder-access&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;retestTriggers&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;role-change&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;route-change&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;dns-change&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;service-change&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;This is a practitioner record, not an Azure resource payload. The finding&amp;rsquo;s provenance and observation time should accompany it.&lt;/p&gt;
&lt;p&gt;Run the bundle&amp;rsquo;s inventory query in Azure Resource Graph, not Log Analytics:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;span class="lnt"&gt;8
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;resources
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;| where type =~ &amp;#34;microsoft.network/privateendpoints&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;| mv-expand connection = properties.privateLinkServiceConnections
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;| project endpointId = id,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; subnetId = tostring(properties.subnet.id),
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; targetId = tostring(connection.properties.privateLinkServiceId),
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; groupIds = connection.properties.groupIds,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; location
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;It discovers declared automatic Private Endpoint connections, not usable operations. Manually requested connections use a different property and need separate inspection. Empty output can reflect missing read scope, inventory delay or no matching resources; it does not prove no path exists. For a supported VM NIC, this read-only Azure CLI inspection collects routing context:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;az&lt;/span&gt; &lt;span class="n"&gt;network&lt;/span&gt; &lt;span class="n"&gt;nic&lt;/span&gt; &lt;span class="nb"&gt;show-effective&lt;/span&gt;&lt;span class="n"&gt;-route-table&lt;/span&gt; &lt;span class="p"&gt;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="n"&gt;-resource-group&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&amp;lt;lab-resource-group&amp;gt;&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="n"&gt;-name&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&amp;lt;lab-source-nic&amp;gt;&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="n"&gt;-output&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$LASTEXITCODE&lt;/span&gt; &lt;span class="o"&gt;-ne&lt;/span&gt; &lt;span class="mf"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Route inspection failed.&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Record the selected destination and route, not just the existence of an exported table. Read failures or missing scope make the context unknown.&lt;/p&gt;
&lt;h2 id="2-threat-to-control-matrix"&gt;2. Threat-to-control matrix
&lt;/h2&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Path failure&lt;/th&gt;
&lt;th&gt;Candidate&lt;/th&gt;
&lt;th&gt;Required boundary evidence&lt;/th&gt;
&lt;th&gt;Counterexample&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Unwanted application request&lt;/td&gt;
&lt;td&gt;WAF on selected supported host&lt;/td&gt;
&lt;td&gt;Effective policy/mode and harmless rule-match result&lt;/td&gt;
&lt;td&gt;Direct-origin access or an authorized harmful operation remains possible&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Unwanted traversing connection&lt;/td&gt;
&lt;td&gt;Azure Firewall&lt;/td&gt;
&lt;td&gt;Selected route, effective parent/child policy and rule result&lt;/td&gt;
&lt;td&gt;An alternate route never reaches the appliance&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Unwanted supported PaaS public access&lt;/td&gt;
&lt;td&gt;NSP&lt;/td&gt;
&lt;td&gt;Supported association, mode and service-specific access result&lt;/td&gt;
&lt;td&gt;Private Endpoint traffic is not blocked by explicit NSP rules&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Network-layer availability pressure&lt;/td&gt;
&lt;td&gt;Eligible DDoS offering&lt;/td&gt;
&lt;td&gt;Actual coverage configuration and support review&lt;/td&gt;
&lt;td&gt;Application-layer overload or dependency failure remains&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Use a harmless test marker against an author-owned application. Do not provide exploit payloads or generate DDoS traffic. Coverage review is not a mitigation experiment.&lt;/p&gt;
&lt;h2 id="3-shared-path-enforcement-matrix"&gt;3. Shared-path enforcement matrix
&lt;/h2&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Case&lt;/th&gt;
&lt;th&gt;Expected documented relationship&lt;/th&gt;
&lt;th&gt;Required observation&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;AVNM Allow plus NSG deny&lt;/td&gt;
&lt;td&gt;NSG may reject&lt;/td&gt;
&lt;td&gt;Fresh connection, supported target and effective configuration&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AVNM Deny plus NSG allow&lt;/td&gt;
&lt;td&gt;Admin deny blocks&lt;/td&gt;
&lt;td&gt;Same case with corroborating enforcement evidence&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AVNM AlwaysAllow plus NSG deny&lt;/td&gt;
&lt;td&gt;Further NSG evaluation bypassed&lt;/td&gt;
&lt;td&gt;Narrow approved case; record the loss of workload-level restriction&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Firewall application restriction plus broad network allow&lt;/td&gt;
&lt;td&gt;Earlier matching network rule can terminate evaluation&lt;/td&gt;
&lt;td&gt;Policy hierarchy, rule types and actual flow&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Out-of-scope source/target&lt;/td&gt;
&lt;td&gt;Claimed central boundary may not apply&lt;/td&gt;
&lt;td&gt;Separate result; never fold into an in-scope pass&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Current AVNM documentation excludes Private Endpoints from security admin-rule application and describes eventual consistency. Check the full current exclusion list for the chosen topology.&lt;/p&gt;
&lt;p&gt;This module is a bounded test matrix, not a deployable Firewall/AVNM configuration. If you implement it, select supported API versions and a disposable canary scope, compile your IaC, inspect the deployment diff, and document permissions, convergence, rollback and cleanup. Do not reuse historical AVNM examples or assume a simulation mode.&lt;/p&gt;
&lt;h2 id="4-controlled-egress-and-residual-risk"&gt;4. Controlled egress and residual risk
&lt;/h2&gt;&lt;p&gt;From the actual source context, resolve the normal service name and inspect TCP connectivity:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;$name&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&amp;lt;lab-storage-account&amp;gt;.blob.core.windows.net&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;Resolve-DnsName&lt;/span&gt; &lt;span class="n"&gt;-Name&lt;/span&gt; &lt;span class="nv"&gt;$name&lt;/span&gt; &lt;span class="n"&gt;-ErrorAction&lt;/span&gt; &lt;span class="n"&gt;Stop&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;$connection&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Test-NetConnection&lt;/span&gt; &lt;span class="n"&gt;-ComputerName&lt;/span&gt; &lt;span class="nv"&gt;$name&lt;/span&gt; &lt;span class="n"&gt;-Port&lt;/span&gt; &lt;span class="mf"&gt;443&lt;/span&gt; &lt;span class="p"&gt;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;-InformationLevel&lt;/span&gt; &lt;span class="n"&gt;Detailed&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;-not&lt;/span&gt; &lt;span class="nv"&gt;$connection&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;TcpTestSucceeded&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;TCP probe failed; investigate before interpreting service access.&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;This deliberately stops on a failed diagnostic probe; it is not the prohibited-operation acceptance test. A blocked data operation needs its own service result and control attribution.&lt;/p&gt;
&lt;p&gt;For each destination record source resolver, returned address, principal, subresource, operation, expected/actual result, error/request reference, control evidence and residual. Test approved reads, controlled unintended writes, separately declared public access, telemetry continuity and responder access.&lt;/p&gt;
&lt;p&gt;Keep service-side onward movement separate from workload egress. Identify the owner and review export, replication or downstream consumers rather than claiming the first-hop restriction covers them.&lt;/p&gt;
&lt;h2 id="5-change-and-exception-workflow"&gt;5. Change and exception workflow
&lt;/h2&gt;&lt;p&gt;Use this sequence: reviewed path claim -&amp;gt; versioned diff -&amp;gt; scoped preflight -&amp;gt; approved canary -&amp;gt; operation/positive-control tests -&amp;gt; expansion or stop -&amp;gt; residual/rollback record.&lt;/p&gt;
&lt;p&gt;The exception record needs owner, approver, resource/assignment scope, waiver or mitigated rationale, expiry, compensating test, renewal conditions and an expiry action. Azure Policy&amp;rsquo;s &lt;code&gt;expiresOn&lt;/code&gt; ends honoring the exemption; Microsoft documents that the object remains. Do not assume expiry immediately changes existing deployed state.&lt;/p&gt;
&lt;p&gt;Validate actual policy effects, aliases, remediation identity roles and applicability. Add an incident override that prevents routine automation restoring unsafe reachability while responders contain a workload. Test the override&amp;rsquo;s expiry and reconciliation process too.&lt;/p&gt;
&lt;h2 id="6-evidence-comparison"&gt;6. Evidence comparison
&lt;/h2&gt;&lt;p&gt;The local PowerShell helper compares sanitized exports only. It does not query Azure, deploy controls or calculate a security score.&lt;/p&gt;
&lt;p&gt;Each input contains &lt;code&gt;scopeVersion&lt;/code&gt;, &lt;code&gt;configurationVersion&lt;/code&gt;, &lt;code&gt;observedAtUtc&lt;/code&gt;, and &lt;code&gt;cases&lt;/code&gt;. Each case contains &lt;code&gt;pathId&lt;/code&gt;, &lt;code&gt;source&lt;/code&gt;, &lt;code&gt;principal&lt;/code&gt;, &lt;code&gt;destination&lt;/code&gt;, &lt;code&gt;operation&lt;/code&gt;, &lt;code&gt;intent&lt;/code&gt; (&lt;code&gt;prohibited&lt;/code&gt; or &lt;code&gt;required&lt;/code&gt;), &lt;code&gt;status&lt;/code&gt; (&lt;code&gt;reachable&lt;/code&gt;, &lt;code&gt;blocked&lt;/code&gt; or &lt;code&gt;unknown&lt;/code&gt;) and &lt;code&gt;evidenceRefs&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Comparisons reject mismatched scope, changed case identities, duplicate/missing cases, invalid states, non-UTC observation times and absent evidence references. A scope change needs a new comparison contract, not a silently smaller denominator. For unknown cases, an evidence reference can identify the failed collection or test record; it must not invent the missing observation.&lt;/p&gt;
&lt;p&gt;Use the quick-start commands above with the bundled fixtures. Their dates are invented ordering inputs, not observations. Expected results deliberately include both an improved candidate and a newly reachable path:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Report field&lt;/th&gt;
&lt;th&gt;Fixture result&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;assuranceStatus&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;not-assessed&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;candidateRemoved&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;unwanted-write&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;newlyReachable&lt;/code&gt; and &lt;code&gt;remainingReachableProhibited&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;alternate-write&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;inconclusive&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;unknown-export&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;baselineRequiredNotReachable&lt;/code&gt; and &lt;code&gt;requiredNotReachable&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;empty arrays&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;The report lists candidate removed prohibited paths, remaining reachable paths, newly reachable prohibited paths, unknowns and failed required cases. A &lt;code&gt;candidate-removed&lt;/code&gt; classification is a bookkeeping result, not proof of attributable enforcement or durable containment. Verify raw evidence, recovery checks and reopening authority before drawing that conclusion.&lt;/p&gt;
&lt;p&gt;For your own evidence, copy the fixtures to new files, preserve stable case identities and replace synthetic values with authorized, sanitized observations. Use actual configuration versions and UTC timestamps. Evidence references must identify real records, including collection failures for unknown cases. The comparator does not open or authenticate those referenced records.&lt;/p&gt;
&lt;p&gt;The bundle&amp;rsquo;s Firewall query runs in an authorized Log Analytics workspace with resource-specific network-rule logging and &lt;code&gt;AZFWNetworkRule&lt;/code&gt; available. Replace the illustrative window and addresses:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;let windowStart = datetime(2026-11-10T00:00:00Z);
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;let windowEnd = datetime(2026-11-10T00:05:00Z);
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;let sourceIp = &amp;#34;10.20.1.4&amp;#34;;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;let destinationIp = &amp;#34;10.30.1.4&amp;#34;;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;AZFWNetworkRule
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;| where TimeGenerated between (windowStart .. windowEnd)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;| where SourceIp == sourceIp and DestinationIp == destinationIp
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;| project TimeGenerated, _ResourceId, Protocol, SourceIp, SourcePort,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; DestinationIp, DestinationPort, Action, ActionReason,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Policy, RuleCollectionGroup, RuleCollection, Rule
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;| order by TimeGenerated asc
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;These fields do not supply a deterministic principal-to-Blob-operation join. Time/tuple correlation can be ambiguous with translation or concurrent traffic. Missing rows remain inconclusive until collection, transit and window assumptions are checked.&lt;/p&gt;
&lt;h2 id="validation-acceptance-and-maintenance"&gt;Validation, acceptance and maintenance
&lt;/h2&gt;&lt;p&gt;Version 1&amp;rsquo;s fixture assertions and 11 mutation cases have been run locally on Windows PowerShell 5.1. They cover unchanged and unknown results, required-path failure, scope/case mismatches, duplicate IDs, changed principals, invalid status, missing evidence and timestamp constraints. This validates local comparison behavior, not Azure enforcement. The workbook and queries are documentary/procedural examples; they have not been executed against a live Azure scope.&lt;/p&gt;
&lt;p&gt;Before executing an Azure procedure, complete the workbook&amp;rsquo;s assumption ledger: cloud/region, SKU/service support, selected API versions, client versions, scope/roles, DNS/routes, actual diagnostic schema and collection timing. Record the documentation basis separately from dated lab observations.&lt;/p&gt;
&lt;p&gt;Accept a change only when the intended boundary is supported by evidence, required paths still work and residuals have accountable ownership. Newly reachable prohibited paths, failed recovery and unresolved observations need explicit disposition; one removed candidate is not an overall pass.&lt;/p&gt;
&lt;p&gt;Retest after API, schema, support, topology or role changes. Run the local self-test after editing the comparator or fixtures. General telemetry collection guidance remains in the &lt;a class="link" href="https://blog.brewedinthecloud.com/azure-security-telemetry-toolkit/" &gt;Azure Security Telemetry Toolkit&lt;/a&gt;; this companion focuses on deciding and validating a bounded exposure change.&lt;/p&gt;
&lt;h2 id="references"&gt;References
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/virtual-network-manager/concept-security-admins" target="_blank" rel="noopener"
&gt;AVNM security admin rules&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/firewall/rule-processing" target="_blank" rel="noopener"
&gt;Azure Firewall rule processing&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/storage/common/storage-private-endpoints" target="_blank" rel="noopener"
&gt;Storage Private Endpoints&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/private-link/network-security-perimeter-concepts" target="_blank" rel="noopener"
&gt;NSP concepts&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/governance/policy/concepts/exemption-structure" target="_blank" rel="noopener"
&gt;Policy exemption structure&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/azure-monitor/reference/tables/azfwnetworkrule" target="_blank" rel="noopener"
&gt;AZFWNetworkRule schema&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Azure Security Telemetry Toolkit</title><link>https://blog.brewedinthecloud.com/azure-security-telemetry-toolkit/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://blog.brewedinthecloud.com/azure-security-telemetry-toolkit/</guid><description>&lt;p&gt;This toolkit supports the six-part Azure Security Telemetry series. It is deliberately practical: use it to start a review, validate assumptions, and adapt the patterns to your own subscriptions, workspaces, Sentinel deployment, Defender XDR portal, and Defender for Cloud configuration.&lt;/p&gt;
&lt;p&gt;It is not a Microsoft standard. The scorecard included here is Chris Hailes&amp;rsquo;s practitioner framework for measuring whether Azure security telemetry is useful during real investigations, not merely collected.&lt;/p&gt;
&lt;h2 id="series-articles"&gt;Series articles
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://blog.brewedinthecloud.com/p/azure-security-telemetry-control-plane" &gt;Azure Security Telemetry: Start with the Control Plane&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://blog.brewedinthecloud.com/p/azure-security-telemetry-diagnostic-settings" &gt;Collecting Azure Resource Logs Without Creating Noise&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://blog.brewedinthecloud.com/p/azure-security-telemetry-sentinel-normalization" &gt;Designing Microsoft Sentinel Around Normalized Signals&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://blog.brewedinthecloud.com/p/azure-security-telemetry-defender-xdr" &gt;Using Defender XDR Advanced Hunting as a Cross-Domain Lens&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://blog.brewedinthecloud.com/p/azure-security-telemetry-defender-cloud-export" &gt;Turning Defender for Cloud Findings into Operational Signals&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://blog.brewedinthecloud.com/p/azure-security-telemetry-operating-model" &gt;Operating Azure Security Telemetry as a Product&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="prerequisites-and-boundaries"&gt;Prerequisites and boundaries
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Azure Activity Log routed to a Log Analytics workspace where the &lt;code&gt;AzureActivity&lt;/code&gt; table is available.&lt;/li&gt;
&lt;li&gt;Resource diagnostic settings deployed to the services that matter for your investigation scenarios.&lt;/li&gt;
&lt;li&gt;Microsoft Sentinel enabled where ASIM parsers and normalized hunting content are used.&lt;/li&gt;
&lt;li&gt;Microsoft Defender XDR advanced hunting access in the Defender portal for identity, endpoint, cloud app, and alert-evidence queries.&lt;/li&gt;
&lt;li&gt;Defender for Cloud enabled with continuous export configured to Log Analytics where &lt;code&gt;SecurityAlert&lt;/code&gt; and &lt;code&gt;SecurityRecommendation&lt;/code&gt; are queried.&lt;/li&gt;
&lt;li&gt;Tenant-specific validation before production use. Category groups, diagnostic categories, table availability, and Defender XDR schema coverage vary by service, license, connector, and portal integration state.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="control-plane-reconstruction-kql"&gt;Control-plane reconstruction KQL
&lt;/h2&gt;&lt;p&gt;Use this in Azure Monitor Logs or Microsoft Sentinel against the &lt;code&gt;AzureActivity&lt;/code&gt; table. It reconstructs security-relevant management operations with caller, correlation, operation, target, result, and timing context.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;span class="lnt"&gt;27
&lt;/span&gt;&lt;span class="lnt"&gt;28
&lt;/span&gt;&lt;span class="lnt"&gt;29
&lt;/span&gt;&lt;span class="lnt"&gt;30
&lt;/span&gt;&lt;span class="lnt"&gt;31
&lt;/span&gt;&lt;span class="lnt"&gt;32
&lt;/span&gt;&lt;span class="lnt"&gt;33
&lt;/span&gt;&lt;span class="lnt"&gt;34
&lt;/span&gt;&lt;span class="lnt"&gt;35
&lt;/span&gt;&lt;span class="lnt"&gt;36
&lt;/span&gt;&lt;span class="lnt"&gt;37
&lt;/span&gt;&lt;span class="lnt"&gt;38
&lt;/span&gt;&lt;span class="lnt"&gt;39
&lt;/span&gt;&lt;span class="lnt"&gt;40
&lt;/span&gt;&lt;span class="lnt"&gt;41
&lt;/span&gt;&lt;span class="lnt"&gt;42
&lt;/span&gt;&lt;span class="lnt"&gt;43
&lt;/span&gt;&lt;span class="lnt"&gt;44
&lt;/span&gt;&lt;span class="lnt"&gt;45
&lt;/span&gt;&lt;span class="lnt"&gt;46
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;let lookback = 14d;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;let securityRelevantOperations = dynamic([
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;Microsoft.Authorization/roleAssignments/write&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;Microsoft.Authorization/roleAssignments/delete&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;Microsoft.Authorization/policyAssignments/write&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;Microsoft.Authorization/policyExemptions/write&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;Microsoft.Insights/diagnosticSettings/write&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;Microsoft.Insights/diagnosticSettings/delete&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;Microsoft.Network/networkSecurityGroups/securityRules/write&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;Microsoft.Network/networkSecurityGroups/write&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;Microsoft.Network/azureFirewalls/write&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;Microsoft.KeyVault/vaults/write&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;Microsoft.Storage/storageAccounts/write&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;Microsoft.Security/pricings/write&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;]);
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;AzureActivity
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;| where TimeGenerated &amp;gt;= ago(lookback)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;| where CategoryValue in (&amp;#34;Administrative&amp;#34;, &amp;#34;Policy&amp;#34;, &amp;#34;Security&amp;#34;)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;| where OperationNameValue in~ (securityRelevantOperations)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; or OperationNameValue has_any (&amp;#34;diagnosticSettings&amp;#34;, &amp;#34;roleAssignments&amp;#34;, &amp;#34;policyAssignments&amp;#34;, &amp;#34;networkSecurityGroups&amp;#34;, &amp;#34;keyVault&amp;#34;, &amp;#34;storageAccounts&amp;#34;)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;| extend AuthorizationAction = tostring(Authorization_d.action),
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; AuthorizationScope = tostring(Authorization_d.scope),
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; RequestMethod = tostring(HTTPRequest.method),
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ClientRequestId = tostring(HTTPRequest.clientRequestId),
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ClaimsAppId = tostring(Claims_d.appid),
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ClaimsUpn = tostring(Claims_d.upn)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;| project TimeGenerated,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Caller,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ClaimsUpn,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ClaimsAppId,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; CallerIpAddress,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; CorrelationId,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; OperationId,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; OperationNameValue,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ActivityStatusValue,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ActivitySubstatusValue,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; SubscriptionId,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ResourceGroup,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ResourceProviderValue,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ResourceId,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; AuthorizationAction,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; AuthorizationScope,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; RequestMethod,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ClientRequestId,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Properties_d
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;| order by TimeGenerated desc
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Assumptions: &lt;code&gt;AzureActivity&lt;/code&gt; contains subscription-level or management group level events that have been routed to the workspace. &lt;code&gt;CorrelationId&lt;/code&gt; groups events from the same broader action, while &lt;code&gt;OperationId&lt;/code&gt; identifies the operation event. Use &lt;code&gt;Authorization_d&lt;/code&gt;, &lt;code&gt;Claims_d&lt;/code&gt;, and &lt;code&gt;Properties_d&lt;/code&gt; where available rather than parsing legacy string fields.&lt;/p&gt;
&lt;h2 id="tiered-diagnostic-settings-bicep-pattern"&gt;Tiered diagnostic-settings Bicep pattern
&lt;/h2&gt;&lt;p&gt;This sample shows a resource-class pattern, not a universal diagnostic policy. It uses &lt;code&gt;Microsoft.Insights/diagnosticSettings@2021-05-01-preview&lt;/code&gt;, the &lt;code&gt;Audit&lt;/code&gt; category group for mandatory evidence, and &lt;code&gt;allLogs&lt;/code&gt; for a conditional investigative tier when a service and cost model justify it.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;span class="lnt"&gt;27
&lt;/span&gt;&lt;span class="lnt"&gt;28
&lt;/span&gt;&lt;span class="lnt"&gt;29
&lt;/span&gt;&lt;span class="lnt"&gt;30
&lt;/span&gt;&lt;span class="lnt"&gt;31
&lt;/span&gt;&lt;span class="lnt"&gt;32
&lt;/span&gt;&lt;span class="lnt"&gt;33
&lt;/span&gt;&lt;span class="lnt"&gt;34
&lt;/span&gt;&lt;span class="lnt"&gt;35
&lt;/span&gt;&lt;span class="lnt"&gt;36
&lt;/span&gt;&lt;span class="lnt"&gt;37
&lt;/span&gt;&lt;span class="lnt"&gt;38
&lt;/span&gt;&lt;span class="lnt"&gt;39
&lt;/span&gt;&lt;span class="lnt"&gt;40
&lt;/span&gt;&lt;span class="lnt"&gt;41
&lt;/span&gt;&lt;span class="lnt"&gt;42
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bicep" data-lang="bicep"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nf"&gt;description&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Existing Key Vault name used as the example high-risk resource class.&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;keyVaultName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nf"&gt;description&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Central Log Analytics workspace resource ID.&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;logAnalyticsWorkspaceId&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nf"&gt;allowed&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;mandatoryEvidence&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;investigative&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nf"&gt;description&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;mandatoryEvidence sends the Audit category group. investigative sends allLogs for deeper troubleshooting where justified.&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;telemetryTier&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;mandatoryEvidence&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;keyVault&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.KeyVault/vaults@2023-07-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;existing&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;keyVaultName&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;diagnosticSetting&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Insights/diagnosticSettings@2021-05-01-preview&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;set-by-platform-security-baseline&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;scope&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;keyVault&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;workspaceId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;logAnalyticsWorkspaceId&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;logAnalyticsDestinationType&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Dedicated&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;logs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;telemetryTier&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;mandatoryEvidence&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;?&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;categoryGroup&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Audit&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;enabled&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;categoryGroup&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;allLogs&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;enabled&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;metrics&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;category&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;AllMetrics&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;enabled&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Adaptation guidance: do not copy this blindly across resource providers. First list the diagnostic categories and category groups supported by the target resource type, then decide which categories are mandatory evidence and which are conditional investigation support. Use Azure Policy &lt;code&gt;DeployIfNotExists&lt;/code&gt; for scale and drift control, but keep per-resource-class decisions visible in the baseline.&lt;/p&gt;
&lt;h2 id="asim-aligned-sentinel-normalization-example"&gt;ASIM-aligned Sentinel normalization example
&lt;/h2&gt;&lt;p&gt;This query uses the Microsoft Sentinel ASIM authentication filtering parser. It is intended for workspaces where authentication sources are onboarded through supported ASIM parsers.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;let lookback = 1d;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;let failureThreshold = 10;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;imAuthentication(starttime = ago(lookback), endtime = now())
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;| where EventType == &amp;#34;Logon&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;| where EventResult in (&amp;#34;Failure&amp;#34;, &amp;#34;Success&amp;#34;)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;| summarize
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; FailedLogons = countif(EventResult == &amp;#34;Failure&amp;#34;),
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; SuccessfulLogons = countif(EventResult == &amp;#34;Success&amp;#34;),
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; FirstSeen = min(EventStartTime),
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; LastSeen = max(EventEndTime),
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; SourceIps = make_set(SrcIpAddr, 10),
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Products = make_set(EventProduct, 10)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; by TargetUsername, TargetUserId, LogonMethod
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;| where FailedLogons &amp;gt;= failureThreshold and SuccessfulLogons &amp;gt; 0
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;| project TargetUsername, TargetUserId, LogonMethod, FailedLogons, SuccessfulLogons, FirstSeen, LastSeen, SourceIps, Products
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;| order by FailedLogons desc
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Assumptions: the parser returns ASIM fields such as &lt;code&gt;EventType&lt;/code&gt;, &lt;code&gt;EventResult&lt;/code&gt;, &lt;code&gt;EventStartTime&lt;/code&gt;, &lt;code&gt;EventEndTime&lt;/code&gt;, &lt;code&gt;TargetUsername&lt;/code&gt;, &lt;code&gt;TargetUserId&lt;/code&gt;, &lt;code&gt;LogonMethod&lt;/code&gt;, &lt;code&gt;SrcIpAddr&lt;/code&gt;, and &lt;code&gt;EventProduct&lt;/code&gt;. Validate parser output with known events before promoting the query to an analytic rule.&lt;/p&gt;
&lt;h2 id="defender-xdr-advanced-hunting-examples"&gt;Defender XDR advanced hunting examples
&lt;/h2&gt;&lt;p&gt;These examples run in Microsoft Defender XDR advanced hunting, not Azure Monitor Logs. Use them to add identity, device, cloud app, and alert-evidence context around Azure investigations. Do not assume direct joins to &lt;code&gt;AzureActivity&lt;/code&gt; inside Defender XDR unless Microsoft Sentinel tables are onboarded into the Defender portal and visible to your role.&lt;/p&gt;
&lt;h3 id="identity-and-cloud-app-context-for-privileged-activity"&gt;Identity and cloud-app context for privileged activity
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;let lookback = 1d;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;let adminIndicators = dynamic([&amp;#34;Add member to role&amp;#34;, &amp;#34;Add app role assignment&amp;#34;, &amp;#34;Consent to application&amp;#34;, &amp;#34;Update application&amp;#34;]);
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;CloudAppEvents
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;| where Timestamp &amp;gt;= ago(lookback)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;| where IsAdminOperation == true or ActionType has_any (adminIndicators) or ActivityType has_any (adminIndicators)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;| project Timestamp, AccountObjectId, AccountId, AccountDisplayName, Application, ActionType, ActivityType, IPAddress, CountryCode, OSPlatform, ObjectName, ObjectType, RawEventData
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;| order by Timestamp desc
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="endpoint-process-context-around-a-suspicious-administrator"&gt;Endpoint process context around a suspicious administrator
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;let lookback = 1d;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;let accountUpn = &amp;#34;admin@contoso.com&amp;#34;;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;DeviceEvents
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;| where Timestamp &amp;gt;= ago(lookback)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;| where InitiatingProcessAccountUpn =~ accountUpn
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;| project Timestamp, DeviceName, ActionType, InitiatingProcessFileName, InitiatingProcessCommandLine, InitiatingProcessSHA1, RemoteIP, RemoteUrl, ReportId
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;| order by Timestamp desc
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="alert-evidence-for-azure-or-cloud-resource-entities"&gt;Alert evidence for Azure or cloud-resource entities
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;let lookback = 7d;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;AlertEvidence
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;| where Timestamp &amp;gt;= ago(lookback)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;| where CloudPlatform =~ &amp;#34;Azure&amp;#34; or isnotempty(ResourceID) or EntityType in~ (&amp;#34;CloudResource&amp;#34;, &amp;#34;AzureResource&amp;#34;, &amp;#34;User&amp;#34;, &amp;#34;Device&amp;#34;)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;| project Timestamp, AlertId, Title, Severity, ServiceSource, EntityType, EvidenceRole, AccountUpn, DeviceName, CloudResource, ResourceType, ResourceID, SubscriptionId
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;| order by Timestamp desc
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="defender-for-cloud-continuous-export"&gt;Defender for Cloud continuous export
&lt;/h2&gt;&lt;p&gt;For scale, prefer the Microsoft built-in Azure Policy definitions for continuous export:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;ffb6f416-7bd2-4488-8828-56585fef2be9&lt;/code&gt; deploys export to a Log Analytics workspace for Defender for Cloud alerts and recommendations.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;cdfcce10-4578-4ecd-9703-530938e4abcb&lt;/code&gt; deploys export to Event Hubs for Defender for Cloud alerts and recommendations.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Where you manage the automation resource directly, this Bicep pattern exports alerts, recommendations, recommendation snapshots, secure score, and attack paths to a Log Analytics workspace. Validate event-source selection and filters in a non-production subscription before broad assignment.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;span class="lnt"&gt;27
&lt;/span&gt;&lt;span class="lnt"&gt;28
&lt;/span&gt;&lt;span class="lnt"&gt;29
&lt;/span&gt;&lt;span class="lnt"&gt;30
&lt;/span&gt;&lt;span class="lnt"&gt;31
&lt;/span&gt;&lt;span class="lnt"&gt;32
&lt;/span&gt;&lt;span class="lnt"&gt;33
&lt;/span&gt;&lt;span class="lnt"&gt;34
&lt;/span&gt;&lt;span class="lnt"&gt;35
&lt;/span&gt;&lt;span class="lnt"&gt;36
&lt;/span&gt;&lt;span class="lnt"&gt;37
&lt;/span&gt;&lt;span class="lnt"&gt;38
&lt;/span&gt;&lt;span class="lnt"&gt;39
&lt;/span&gt;&lt;span class="lnt"&gt;40
&lt;/span&gt;&lt;span class="lnt"&gt;41
&lt;/span&gt;&lt;span class="lnt"&gt;42
&lt;/span&gt;&lt;span class="lnt"&gt;43
&lt;/span&gt;&lt;span class="lnt"&gt;44
&lt;/span&gt;&lt;span class="lnt"&gt;45
&lt;/span&gt;&lt;span class="lnt"&gt;46
&lt;/span&gt;&lt;span class="lnt"&gt;47
&lt;/span&gt;&lt;span class="lnt"&gt;48
&lt;/span&gt;&lt;span class="lnt"&gt;49
&lt;/span&gt;&lt;span class="lnt"&gt;50
&lt;/span&gt;&lt;span class="lnt"&gt;51
&lt;/span&gt;&lt;span class="lnt"&gt;52
&lt;/span&gt;&lt;span class="lnt"&gt;53
&lt;/span&gt;&lt;span class="lnt"&gt;54
&lt;/span&gt;&lt;span class="lnt"&gt;55
&lt;/span&gt;&lt;span class="lnt"&gt;56
&lt;/span&gt;&lt;span class="lnt"&gt;57
&lt;/span&gt;&lt;span class="lnt"&gt;58
&lt;/span&gt;&lt;span class="lnt"&gt;59
&lt;/span&gt;&lt;span class="lnt"&gt;60
&lt;/span&gt;&lt;span class="lnt"&gt;61
&lt;/span&gt;&lt;span class="lnt"&gt;62
&lt;/span&gt;&lt;span class="lnt"&gt;63
&lt;/span&gt;&lt;span class="lnt"&gt;64
&lt;/span&gt;&lt;span class="lnt"&gt;65
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bicep" data-lang="bicep"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;resourceGroup&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;param&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;workspaceResourceId&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;continuousExport&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Security/automations@2019-01-01-preview&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;export-defender-for-cloud-to-law&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Continuous export of Defender for Cloud operational security findings to Log Analytics.&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;isEnabled&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;scopes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Subscription scope&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;scopePath&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;subscription&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;sources&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;eventSource&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Alerts&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;ruleSets&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;rules&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;propertyJPath&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Severity&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;propertyType&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;String&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;expectedValue&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;high&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;operator&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Equals&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;rules&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;propertyJPath&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Severity&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;propertyType&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;String&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;expectedValue&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;medium&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;operator&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Equals&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;eventSource&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Assessments&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;eventSource&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;AssessmentsSnapshot&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;eventSource&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;SecureScores&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;eventSource&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;SecureScoreControls&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;eventSource&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;AttackPaths&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;actions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;actionType&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Workspace&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;workspaceResourceId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;workspaceResourceId&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Query exported recommendations and alerts from Log Analytics:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;let lookback = 30d;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;SecurityRecommendation
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;| where TimeGenerated &amp;gt;= ago(lookback)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;| summarize
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; LatestTime = max(TimeGenerated),
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; States = make_set(RecommendationState, 5),
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Severities = make_set(RecommendationSeverity, 5),
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; SnapshotRecords = countif(IsSnapshot == true)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; by AssessedResourceId, RecommendationDisplayName, RecommendationId
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;| order by LatestTime desc
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;let lookback = 14d;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;SecurityAlert
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;| where TimeGenerated &amp;gt;= ago(lookback)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;| where ProductName has &amp;#34;Defender for Cloud&amp;#34; or ProviderName has &amp;#34;Security Center&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;| project TimeGenerated, AlertName, AlertSeverity, Status, ProductName, ProviderName, ResourceId, CompromisedEntity, Tactics, Techniques, SystemAlertId, AlertLink
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;| order by TimeGenerated desc
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="hailes-telemetry-utility-score"&gt;Hailes Telemetry Utility Score
&lt;/h2&gt;&lt;p&gt;The Hailes Telemetry Utility Score is a reusable practitioner scorecard for Azure security telemetry. It measures whether telemetry reduces uncertainty during investigation, not whether a team has collected the most data.&lt;/p&gt;
&lt;p&gt;Score each dimension from 0 to 5:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Dimension&lt;/th&gt;
&lt;th&gt;What good looks like&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Completeness&lt;/td&gt;
&lt;td&gt;Critical subscriptions, identities, resources, Defender findings, and response paths are represented.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Freshness&lt;/td&gt;
&lt;td&gt;Data arrives fast enough for the response decision it supports.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Accuracy&lt;/td&gt;
&lt;td&gt;Fields are mapped correctly, parsers are tested, and source semantics are understood.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Accessibility and coverage&lt;/td&gt;
&lt;td&gt;The right teams can query the right workspaces, tables, and portals without over-privilege.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cost efficiency&lt;/td&gt;
&lt;td&gt;Ingestion and retention spend are tied to detection, investigation, assurance, or response value.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tamper resilience&lt;/td&gt;
&lt;td&gt;Diagnostic settings, workspaces, exports, retention, and administrative paths are protected and monitored.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Formula:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Hailes Telemetry Utility Score = ((completeness + freshness + accuracy + accessibility + costEfficiency + tamperResilience) / 30) * 100
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Thresholds:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Score&lt;/th&gt;
&lt;th&gt;Interpretation&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;85-100&lt;/td&gt;
&lt;td&gt;Operationally dependable for the assessed scenario.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;70-84&lt;/td&gt;
&lt;td&gt;Useful, but one or two dimensions can still break an investigation.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;50-69&lt;/td&gt;
&lt;td&gt;Partial visibility; suitable for backlog prioritization, not assurance.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Below 50&lt;/td&gt;
&lt;td&gt;Collection exists, but the scenario is not defensible.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Example: a production privileged-access scenario scores completeness 4, freshness 4, accuracy 3, accessibility 4, cost efficiency 3, and tamper resilience 2. The score is 66.7. That does not mean the telemetry program failed; it means the next investment should be tamper resilience and parser validation, not another dashboard.&lt;/p&gt;
&lt;h2 id="limitations"&gt;Limitations
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;KQL examples are starting points. Test against your own tables, connector versions, table retention, parser coverage, and role permissions.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;AzureActivity&lt;/code&gt;, &lt;code&gt;SecurityAlert&lt;/code&gt;, and &lt;code&gt;SecurityRecommendation&lt;/code&gt; schemas are documented by Microsoft, but individual fields can be empty depending on provider, connector, export path, and event type.&lt;/li&gt;
&lt;li&gt;Diagnostic category groups are not universal. Validate supported categories per resource type before assigning policy or Bicep modules at scale.&lt;/li&gt;
&lt;li&gt;Defender XDR advanced hunting tables depend on deployed Defender services, licensing, data availability, portal integration, and role access.&lt;/li&gt;
&lt;li&gt;Continuous export requires Defender for Cloud enablement, target write permissions, workspace solution requirements, and tenant-aware design for cross-tenant destinations.&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Links</title><link>https://blog.brewedinthecloud.com/links/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://blog.brewedinthecloud.com/links/</guid><description/></item><item><title>Search</title><link>https://blog.brewedinthecloud.com/search/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://blog.brewedinthecloud.com/search/</guid><description/></item></channel></rss>