<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Runbook Foundry</title>
    <description>The latest articles on DEV Community by Runbook Foundry (@runbookfoundry).</description>
    <link>https://dev.to/runbookfoundry</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4193105%2Ffca21a02-3f08-4534-9019-2663bc19eae1.png</url>
      <title>DEV Community: Runbook Foundry</title>
      <link>https://dev.to/runbookfoundry</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/runbookfoundry"/>
    <language>en</language>
    <item>
      <title>Get a weekly CISA KEV digest with n8n (free workflow)</title>
      <dc:creator>Runbook Foundry</dc:creator>
      <pubDate>Tue, 27 Oct 2026 03:38:12 +0000</pubDate>
      <link>https://dev.to/runbookfoundry/get-a-weekly-cisa-kev-digest-with-n8n-free-workflow-3nk9</link>
      <guid>https://dev.to/runbookfoundry/get-a-weekly-cisa-kev-digest-with-n8n-free-workflow-3nk9</guid>
      <description>&lt;p&gt;CISA's &lt;strong&gt;Known Exploited Vulnerabilities (KEV)&lt;/strong&gt; catalog is the shortest useful patch list there is: every entry is a CVE that CISA has evidence of being exploited in the wild. CISA publishes it as a public JSON feed with no API key, which makes it a good fit for a small n8n workflow.&lt;/p&gt;

&lt;p&gt;This post walks through a workflow that runs every Monday, keeps the entries added in the previous week (Mon-Sun), stars the vendors you actually run, and emails your team an HTML digest. You can build it from the steps below, or get the finished one free: &lt;a href="https://kev-explained.pages.dev/n8n/" rel="noopener noreferrer"&gt;download page with setup notes&lt;/a&gt; or the &lt;a href="https://kev-explained.pages.dev/n8n/kev-patch-digest.json" rel="noopener noreferrer"&gt;raw workflow JSON&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  The feed
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="err"&gt;https://www.cisa.gov/sites/default/files/feeds/known_exploited_vulnerabilities.json&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It returns one object with &lt;code&gt;catalogVersion&lt;/code&gt;, &lt;code&gt;count&lt;/code&gt; and a &lt;code&gt;vulnerabilities&lt;/code&gt; array (1,758 entries in catalog 2026.10.26). Each entry has the fields you need for a digest:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Field&lt;/th&gt;
&lt;th&gt;Example use&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;cveID&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;the row key&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;vendorProject&lt;/code&gt;, &lt;code&gt;product&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;watchlist matching and display&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;dateAdded&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;the "new last week" filter&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;dueDate&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;the remediation deadline for US federal civilian agencies under BOD 22-01. Other organizations can use it as a target date.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;knownRansomwareCampaignUse&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;Known&lt;/code&gt; or &lt;code&gt;Unknown&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;requiredAction&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;CISA's one-line instruction&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The data is CC0 1.0. Credit CISA and don't imply endorsement.&lt;/p&gt;

&lt;h2&gt;
  
  
  The workflow
&lt;/h2&gt;

&lt;p&gt;Nine nodes, all core (plus sticky notes):&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Every Monday 08:00&lt;/strong&gt; (Schedule Trigger) → &lt;strong&gt;Flag: live run&lt;/strong&gt; (Code: &lt;code&gt;return [{json:{_dryRun:false}}]&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Test workflow (manual)&lt;/strong&gt; (Manual Trigger) → &lt;strong&gt;Flag: dry run&lt;/strong&gt; (Code: &lt;code&gt;return [{json:{_dryRun:true}}]&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Both flags → &lt;strong&gt;Download CISA KEV feed&lt;/strong&gt; (HTTP Request, GET, 30 s timeout)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Filter &amp;amp; build digest&lt;/strong&gt; (Code)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dry run?&lt;/strong&gt; (IF on &lt;code&gt;_dryRun&lt;/code&gt;) → true: &lt;strong&gt;Dry run: log only&lt;/strong&gt; (No Op); false: &lt;strong&gt;Email digest&lt;/strong&gt; (Send Email, SMTP, HTML)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Time zone:&lt;/strong&gt; the 08:00 trigger uses the workflow's time zone (Settings &amp;gt; Timezone). The workflow JSON doesn't set one, so it falls back to the instance's &lt;code&gt;GENERIC_TIMEZONE&lt;/code&gt;, which defaults to America/New_York (self-hosted; on n8n Cloud the default is the owner's detected time zone, or GMT). The week window doesn't use that time zone: the Code node compares CISA's date-only &lt;code&gt;dateAdded&lt;/code&gt; with the run's UTC date. If you're more than 8 hours ahead of UTC (for example Tokyo, Sydney or Auckland), Monday 08:00 local is still Sunday in UTC, so each digest covers Sunday to Saturday and says "from  to ". To get Mon-Sun there, set the trigger hour to at least your UTC offset, rounded up, using your summer offset if you have daylight saving.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Code node
&lt;/h3&gt;

&lt;p&gt;This is the core of it, trimmed for the post:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;WATCHLIST&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;microsoft&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;google&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;apple&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;fortinet&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;citrix&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;ivanti&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;atlassian&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;oracle&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;adobe&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;apache&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;LOOKBACK_DAYS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// keep 7 for the weekly Monday schedule&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;feed&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;$input&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;first&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nx"&gt;json&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;vulns&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Array&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;isArray&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;feed&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;vulnerabilities&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="nx"&gt;feed&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;vulnerabilities&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[];&lt;/span&gt;
&lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;vulns&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;KEV feed returned no vulnerabilities; check the URL or network.&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// dateAdded is date-only (YYYY-MM-DD), so compare UTC date strings, not timestamps.&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;day&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;d&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;d&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toISOString&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;slice&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;end&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;day&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;                                   &lt;span class="c1"&gt;// exclusive: today's additions go into next week's digest&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;start&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;day&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;now&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;LOOKBACK_DAYS&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="mi"&gt;864&lt;/span&gt;&lt;span class="nx"&gt;e5&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt; &lt;span class="c1"&gt;// inclusive&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;recent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;vulns&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;v&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;typeof&lt;/span&gt; &lt;span class="nx"&gt;v&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;dateAdded&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;string&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nx"&gt;v&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;dateAdded&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="nx"&gt;start&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nx"&gt;v&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;dateAdded&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nx"&gt;end&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;v&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;v&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;watch&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;WATCHLIST&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;includes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;v&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;vendorProject&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;toLowerCase&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt; &lt;span class="p"&gt;}))&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sort&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;watch&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;watch&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;dueDate&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;dueDate&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="c1"&gt;// ...then build an HTML table from `recent` (escape every field) and return&lt;/span&gt;
&lt;span class="c1"&gt;// { newCount, watchHits, html } for the email node.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Three details matter:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Compare date strings, not timestamps.&lt;/strong&gt; &lt;code&gt;dateAdded&lt;/code&gt; has no time, so &lt;code&gt;new Date('2026-10-23')&lt;/code&gt; is midnight UTC. My first version compared it to &lt;code&gt;Date.now()&lt;/code&gt; minus seven days, and anything CISA added on a Monday after the run had aged out by the next Monday, so it was never reported. With string comparison and today excluded, a Monday run covers the previous Monday through Sunday (UTC dates), exactly once.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fail loudly on an empty feed.&lt;/strong&gt; A network hiccup that returns nothing shouldn't produce a cheerful "no new entries" email.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Escape everything&lt;/strong&gt; you put into the HTML. The feed is trusted, but escaping is cheap.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  The email
&lt;/h3&gt;

&lt;p&gt;Subject: &lt;code&gt;=Weekly KEV patch digest: {{ $json.newCount }} new ({{ $json.watchHits }} on watchlist)&lt;/code&gt;. Body: &lt;code&gt;={{ $json.html }}&lt;/code&gt;, in HTML format. A week with no additions still sends a short "No new KEV entries added in the previous week (Mon-Sun,  to )." email, so silence always means something broke.&lt;/p&gt;

&lt;p&gt;Tip: link each CVE in the table to an explainer page so readers don't have to search. KEV Explained has a plain page for every KEV entry at &lt;code&gt;https://kev-explained.pages.dev/cve/&amp;lt;CVE-ID&amp;gt;/&lt;/code&gt;, with the required action, due date and links to NVD and the vendor advisory.&lt;/p&gt;

&lt;h2&gt;
  
  
  Three things that bit me
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;isExecuted&lt;/code&gt; is not a reliable dry-run switch.&lt;/strong&gt; My first version checked &lt;code&gt;$('Test workflow (manual)').isExecuted&lt;/code&gt; before sending. That's fine when you click Test in the editor. But &lt;code&gt;n8n execute&lt;/code&gt; on the CLI started from the schedule trigger and the email went out. Separate flag nodes per trigger plus an IF node are explicit and easy to see on the canvas.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Expressions need the leading &lt;code&gt;=&lt;/code&gt;.&lt;/strong&gt; If you edit the workflow JSON by hand, a subject like &lt;code&gt;Weekly digest: {{ $json.newCount }}&lt;/code&gt; is sent literally. It has to be &lt;code&gt;=Weekly digest: {{ $json.newCount }}&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Vendor names are CISA's, not yours.&lt;/strong&gt; Matching is on lowercase &lt;code&gt;vendorProject&lt;/code&gt;. &lt;code&gt;Microsoft&lt;/code&gt;, &lt;code&gt;Fortinet&lt;/code&gt; and &lt;code&gt;Ivanti&lt;/code&gt; are what you'd guess, but PHP shows up as both &lt;code&gt;PHP&lt;/code&gt; and &lt;code&gt;PHP Group&lt;/code&gt;. Run a quick &lt;code&gt;jq -r '.vulnerabilities[].vendorProject' known_exploited_vulnerabilities.json | sort -u&lt;/code&gt; on the feed before you fill in the watchlist.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Want it daily? (untested sketch)
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Untested sketch:&lt;/strong&gt; switch the Schedule Trigger to a Days interval; split the Code node so it returns one item per CVE; add a &lt;strong&gt;Remove Duplicates&lt;/strong&gt; node (Operation: &lt;strong&gt;Remove Items Processed in Previous Executions&lt;/strong&gt; → Keep Items Where: &lt;strong&gt;Value Is New&lt;/strong&gt; → Value to Dedupe On: &lt;code&gt;cveID&lt;/code&gt;); then build the HTML in a second Code node. I haven't tested this; run it alongside the weekly one first.&lt;/p&gt;

&lt;h2&gt;
  
  
  Testing it
&lt;/h2&gt;

&lt;p&gt;On self-hosted n8n 2.44.7, against the live feed (catalog 2026.10.26), a test copy with the clock pinned to Monday Oct 26 found 8 entries added Oct 19-25 (6 dated Oct 20, 2 dated Oct 23) and sent its digest to a local test mail server. The same test with the clock pinned to Monday Nov 2, on self-hosted n8n against the same feed, picks up the 2 entries dated Oct 26, which the Oct 26 run correctly left out. I haven't tested it on n8n Cloud or n8n 1.x.&lt;/p&gt;

&lt;p&gt;Before you activate it:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Set the workflow time zone.&lt;/li&gt;
&lt;li&gt;Attach an SMTP credential and replace the placeholder recipient.&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Test workflow&lt;/strong&gt; and check the Code node output.&lt;/li&gt;
&lt;li&gt;Run it once from the schedule trigger to a test mailbox, then activate it.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Ideas to extend it
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Add EPSS scores with a second HTTP Request to FIRST's API, and sort by them within the watchlist.&lt;/li&gt;
&lt;li&gt;Send to Teams or Slack instead of email.&lt;/li&gt;
&lt;li&gt;Open a ticket for each watchlist hit, with the CISA due date as the deadline.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;I built this workflow for Runbook Foundry; the full JSON is free at the link above. Drafted with AI assistance; test-run on self-hosted n8n 2.44.7.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Not affiliated with n8n GmbH or CISA. Not tested on n8n Cloud. n8n is a trademark of n8n GmbH. KEV data: CISA Known Exploited Vulnerabilities Catalog, CC0 1.0; use does not imply endorsement by CISA or DHS.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>n8n</category>
      <category>security</category>
      <category>automation</category>
      <category>sysadmin</category>
    </item>
    <item>
      <title>IT Offboarding Checklist Template for Microsoft 365 and Google Workspace (Same-Day Steps)</title>
      <dc:creator>Runbook Foundry</dc:creator>
      <pubDate>Tue, 27 Oct 2026 01:34:30 +0000</pubDate>
      <link>https://dev.to/runbookfoundry/it-offboarding-checklist-template-for-microsoft-365-and-google-workspace-same-day-steps-582n</link>
      <guid>https://dev.to/runbookfoundry/it-offboarding-checklist-template-for-microsoft-365-and-google-workspace-same-day-steps-582n</guid>
      <description>&lt;p&gt;&lt;strong&gt;Free download:&lt;/strong&gt; &lt;a href="https://runbookfoundry.pages.dev/templates/offboarding-checklist?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=topcta" rel="noopener noreferrer"&gt;IT offboarding checklist (free template)&lt;/a&gt;. It's ordered for urgent exits; for a planned exit, do the transfer steps first. Copy it, then use the steps below to fill it in. I make these templates.&lt;/p&gt;

&lt;p&gt;Offboarding gaps are rarely clever. An account stayed active, a phone kept syncing mail, or a shared password never changed. A short checklist that runs in the same order every time closes those gaps, and it leaves a dated record you can show if an auditor, insurer or customer asks.&lt;/p&gt;

&lt;p&gt;This guide covers what to do &lt;strong&gt;before&lt;/strong&gt;, &lt;strong&gt;on&lt;/strong&gt; and &lt;strong&gt;after&lt;/strong&gt; the last day in Microsoft 365 and Google Workspace.&lt;/p&gt;

&lt;h2&gt;
  
  
  Order matters: transfer, then cut, then clean up
&lt;/h2&gt;

&lt;p&gt;If you disable an account first, you can lose access to the files, mailbox and app ownership you still need. If you wait too long, the person keeps access. Use this order:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Inventory&lt;/strong&gt; what they can reach (identity, SaaS, devices, shared secrets).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Transfer&lt;/strong&gt; data and ownership you need to keep.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cut access&lt;/strong&gt; at a set time, with sessions revoked.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Clean up&lt;/strong&gt; licenses, devices, and shared credentials, and record evidence.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;For a hostile or high-risk exit, swap steps 2 and 3. Cut access first and recover data as an admin afterward.&lt;/p&gt;

&lt;h2&gt;
  
  
  Before the last day (T-5 to T-1)
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Get the exit date and time &lt;strong&gt;from HR in writing&lt;/strong&gt;, and say whether it is planned or immediate.&lt;/li&gt;
&lt;li&gt;List every system the person uses. Start with the identity provider's app assignments, then ask their manager about anything outside SSO: payroll, banking, the domain registrar, social accounts, vendor portals.&lt;/li&gt;
&lt;li&gt;Find what they &lt;strong&gt;own&lt;/strong&gt;: shared drives, Teams or Groups, calendars, scheduled flows or Apps Script, forms, and any OAuth apps they authorized.&lt;/li&gt;
&lt;li&gt;Note shared credentials they knew (Wi-Fi, alarm codes, password-manager shared folders) so you can rotate them.&lt;/li&gt;
&lt;li&gt;Arrange device return and decide whether to keep or wipe each device.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  On the last day: Microsoft 365
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Reset the password&lt;/strong&gt; and choose &lt;strong&gt;Sign out of all sessions&lt;/strong&gt; (Microsoft 365 admin center &amp;gt; Users &amp;gt; Active users &amp;gt; select user). Microsoft notes that blocking sign-in can take time to take effect, so resetting the password is the fast step (&lt;a href="https://learn.microsoft.com/en-us/microsoft-365/admin/add-users/remove-former-employee-step-1?view=o365-worldwide" rel="noopener noreferrer"&gt;Microsoft Learn&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Block sign-in&lt;/strong&gt; on the same user page.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Revoke refresh tokens&lt;/strong&gt; if you script it: &lt;code&gt;Revoke-EntraUserAllRefreshToken&lt;/code&gt; and &lt;code&gt;Set-EntraUser -AccountEnabled $false&lt;/code&gt; (&lt;a href="https://learn.microsoft.com/en-us/powershell/entra-powershell/offboard-user?view=entra-powershell" rel="noopener noreferrer"&gt;Microsoft Learn&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Remove MFA methods&lt;/strong&gt; and registered devices so a cached authenticator can't be reused.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Convert the mailbox to shared&lt;/strong&gt; or set forwarding to the manager, and add an auto-reply if customers email this person.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Transfer OneDrive&lt;/strong&gt; access to the manager before the license is removed. Deleted users' OneDrive has a retention window, so don't leave this for later.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Remove the user from groups, Teams ownership and admin roles.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Wipe or retire devices&lt;/strong&gt; in Intune, or collect them.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  On the last day: Google Workspace
&lt;/h2&gt;

&lt;p&gt;Google's own checklist covers the core steps (&lt;a href="https://support.google.com/a/answer/6329207?hl=en" rel="noopener noreferrer"&gt;Google Workspace Admin Help&lt;/a&gt;):&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Change the password&lt;/strong&gt; and &lt;strong&gt;reset sign-in cookies&lt;/strong&gt; (Admin console &amp;gt; Directory &amp;gt; Users &amp;gt; select user &amp;gt; Security).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Revoke app passwords, security keys and OAuth tokens&lt;/strong&gt; on the same Security panel.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Remove recovery email and phone&lt;/strong&gt; so password recovery can't be used.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Suspend&lt;/strong&gt; the user while you transfer data.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Transfer Drive and Calendar ownership&lt;/strong&gt; (Admin console &amp;gt; Account &amp;gt; Data transfer), then delete the account or keep it as an archived user.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Wipe or remove the account&lt;/strong&gt; from managed mobile devices.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Everything outside SSO
&lt;/h2&gt;

&lt;p&gt;This is where most gaps live. For each app on your inventory, record &lt;strong&gt;who&lt;/strong&gt; removed the account, &lt;strong&gt;when&lt;/strong&gt;, and &lt;strong&gt;how you checked it&lt;/strong&gt;. Pay special attention to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Finance: bank portals, payment processors, expense tools&lt;/li&gt;
&lt;li&gt;Your domain registrar and DNS host&lt;/li&gt;
&lt;li&gt;Social media and ad accounts&lt;/li&gt;
&lt;li&gt;Shared password-manager folders (rotate any secret they could see)&lt;/li&gt;
&lt;li&gt;API keys, service accounts and automation they created&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  After the last day (T+1 to T+30)
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Check sign-in logs for the account over the following week.&lt;/li&gt;
&lt;li&gt;Remove licenses once data transfer is confirmed.&lt;/li&gt;
&lt;li&gt;Close out the ticket with evidence: screenshots or log extracts of disabled accounts, device wipe confirmations, and the list of rotated credentials.&lt;/li&gt;
&lt;li&gt;Add anything you missed to the template so the next offboarding is faster.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Make it repeatable
&lt;/h2&gt;

&lt;p&gt;A one-off list helps once. A template that HR starts and IT completes helps every time. Copy the checklist into your ticketing system or a shared doc and give each step a named owner, so HR can start it and IT can finish it the same way every time.&lt;/p&gt;

&lt;h2&gt;
  
  
  Common mistakes
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Disabling before transferring&lt;/strong&gt; files, mailbox or automation ownership.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Forgetting sessions.&lt;/strong&gt; A password reset without session revocation leaves signed-in apps working.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No owner for non-SSO apps.&lt;/strong&gt; Assign each one to a named person with a deadline.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No record.&lt;/strong&gt; If you can't show what was done and when, it didn't happen as far as an auditor is concerned.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is general guidance. Check your own legal, HR and data-retention requirements before deleting accounts or data.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Drafted with AI assistance and reviewed for accuracy.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Not affiliated with, endorsed by, or sponsored by Microsoft or Google. Microsoft 365, Entra and Intune are trademarks of Microsoft; Google Workspace is a trademark of Google LLC.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>security</category>
      <category>sysadmin</category>
      <category>microsoft365</category>
      <category>googleworkspace</category>
    </item>
    <item>
      <title>AI Governance Policy Template for Small Companies: What to Include</title>
      <dc:creator>Runbook Foundry</dc:creator>
      <pubDate>Thu, 22 Oct 2026 18:37:30 +0000</pubDate>
      <link>https://dev.to/runbookfoundry/ai-governance-policy-template-for-small-companies-what-to-include-265l</link>
      <guid>https://dev.to/runbookfoundry/ai-governance-policy-template-for-small-companies-what-to-include-265l</guid>
      <description>&lt;p&gt;An acceptable use policy tells employees what they can do with AI. A governance policy tells the &lt;em&gt;company&lt;/em&gt; how it decides. Who approves a new AI tool? Who owns the risk when a model drafts customer emails or screens invoices? What happens when an AI agent with access to your systems does something nobody expected?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Free download: &lt;a href="https://runbookfoundry.gumroad.com/l/free-ai-acceptable-use-policy?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=topcta" rel="noopener noreferrer"&gt;a free AI acceptable use policy template to pair with your governance policy&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Large enterprises answer these questions with committees and frameworks. A small company needs the same answers on a few pages. This guide covers what to include, what to leave out and a sample outline you can adapt.&lt;/p&gt;

&lt;h2&gt;
  
  
  Governance policy vs. acceptable use policy
&lt;/h2&gt;

&lt;p&gt;They work together, but they do different jobs:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Acceptable use policy&lt;/th&gt;
&lt;th&gt;Governance policy&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Audience&lt;/td&gt;
&lt;td&gt;Every employee&lt;/td&gt;
&lt;td&gt;Owners, managers, IT, whoever buys software&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Answers&lt;/td&gt;
&lt;td&gt;"What can I put into this tool?"&lt;/td&gt;
&lt;td&gt;"How do we approve, monitor and retire AI?"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Length&lt;/td&gt;
&lt;td&gt;1–2 pages&lt;/td&gt;
&lt;td&gt;3–6 pages&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Changes&lt;/td&gt;
&lt;td&gt;When the approved tool list changes&lt;/td&gt;
&lt;td&gt;When your risk appetite or regulations change&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;If you only have time for one, write the acceptable use policy first. Staff are using AI today. Then add the governance policy so the decisions behind that list stop living in one person's head.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Purpose and scope
&lt;/h2&gt;

&lt;p&gt;Start with two or three sentences. Say why the policy exists (to use AI productively while protecting customers, staff and company data) and what it covers. Be explicit that scope includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Standalone AI tools (chat assistants, image and code generators)&lt;/li&gt;
&lt;li&gt;AI features built into software you already pay for&lt;/li&gt;
&lt;li&gt;AI agents or automations that take actions, not just produce text&lt;/li&gt;
&lt;li&gt;Models or AI services your company builds into its own products&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The built-in features are the ones most often missed. A note-taker that switches itself on in meetings is in scope, even if nobody "bought an AI tool".&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Roles and accountability
&lt;/h2&gt;

&lt;p&gt;Small companies don't need a committee. They need names next to decisions. Define at least:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;AI owner:&lt;/strong&gt; one person accountable for the policy and the AI inventory. Often the operations lead or the person who already owns IT.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;System owners:&lt;/strong&gt; for each approved AI use, the person who answers for how it's used and what it outputs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Approvers:&lt;/strong&gt; who can say yes to a new tool or use case, and the threshold at which the owner or leadership must sign off.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Everyone:&lt;/strong&gt; report incidents and unexpected AI behaviour, and follow the acceptable use policy.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Write roles, not job titles that will change. "The person responsible for IT" survives a reorganization better than a name.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. AI inventory
&lt;/h2&gt;

&lt;p&gt;You can't govern what you can't see. Require a simple register with one row per AI use:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Tool or feature name and vendor&lt;/li&gt;
&lt;li&gt;Business purpose and system owner&lt;/li&gt;
&lt;li&gt;Data it can access (public, internal, confidential, personal, regulated)&lt;/li&gt;
&lt;li&gt;Whether it can take actions (send, delete, purchase, change settings)&lt;/li&gt;
&lt;li&gt;Risk tier (see below)&lt;/li&gt;
&lt;li&gt;Date approved and next review date&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A spreadsheet is fine. Update it whenever a tool is approved or retired, and at each quarterly review.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Risk tiers
&lt;/h2&gt;

&lt;p&gt;Not every AI use deserves the same scrutiny. Three tiers are usually enough:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Low:&lt;/strong&gt; public or non-sensitive data, a human reviews every output, no actions taken. Example: drafting a blog outline. Approval by the system owner.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Medium:&lt;/strong&gt; internal or confidential data, or outputs that reach customers. Example: summarizing support tickets. Requires AI owner approval and a vendor check.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;High:&lt;/strong&gt; personal or regulated data, decisions about people (hiring, credit, pricing for individuals), or AI that takes actions in your systems. Requires leadership approval, a documented risk assessment, and named human oversight.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The tier drives everything else: how much vendor review, how often to check outputs, and who signs off.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Approval process for new tools and use cases
&lt;/h2&gt;

&lt;p&gt;Describe the path from "I'd like to use this" to "approved":&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Requester fills in a short intake form: tool, purpose, data involved, who will use it.&lt;/li&gt;
&lt;li&gt;AI owner assigns a risk tier.&lt;/li&gt;
&lt;li&gt;Vendor review proportional to the tier (see next section).&lt;/li&gt;
&lt;li&gt;Decision recorded in the inventory, with any conditions ("internal data only", "outputs reviewed before sending").&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Set a target turnaround, such as five working days for low-risk requests. If approval is slow, people route around it.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Vendor and contract requirements
&lt;/h2&gt;

&lt;p&gt;For medium and high tiers, check the vendor terms before approval. Key questions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Does the vendor train models on your inputs or outputs? Can you opt out, and is it off by default on your plan?&lt;/li&gt;
&lt;li&gt;How long are prompts and outputs retained, and where?&lt;/li&gt;
&lt;li&gt;Is there a data processing agreement covering personal data?&lt;/li&gt;
&lt;li&gt;Can you get admin controls: single sign-on, audit logs, the ability to disable features?&lt;/li&gt;
&lt;li&gt;Who owns the outputs, and what indemnity, if any, does the vendor offer?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Record the answers. Terms change, so re-check at each review.&lt;/p&gt;

&lt;h2&gt;
  
  
  7. Human oversight and output quality
&lt;/h2&gt;

&lt;p&gt;AI makes confident mistakes. The policy should state plainly that a person remains accountable for anything AI produces or does on the company's behalf. For each tier, define:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Whether every output is reviewed before use, or a sample is checked&lt;/li&gt;
&lt;li&gt;Who reviews it and what they check (accuracy, tone, bias, confidential content)&lt;/li&gt;
&lt;li&gt;For AI that takes actions: what it may do unattended, what needs confirmation, and spending or permission limits&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For agents in particular, give them the least access they need, use separate accounts so their actions are logged, and keep a documented way to switch them off quickly.&lt;/p&gt;

&lt;h2&gt;
  
  
  8. Fairness, transparency and people decisions
&lt;/h2&gt;

&lt;p&gt;If AI touches decisions about people (job applicants, employees, customers), add specific rules:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;AI may assist, but a person makes the final decision.&lt;/li&gt;
&lt;li&gt;Check outputs for patterns that disadvantage particular groups.&lt;/li&gt;
&lt;li&gt;Tell people when they are interacting with AI or when AI materially contributed to a decision about them, where the law requires or it's simply the decent thing to do.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Several jurisdictions now regulate automated decisions in hiring and lending. Flag this section for legal review.&lt;/p&gt;

&lt;h2&gt;
  
  
  9. Incidents
&lt;/h2&gt;

&lt;p&gt;Define what counts as an AI incident: confidential data entered into an unapproved tool, a harmful or wrong output that reached a customer, an agent taking an unexpected action. Then route it into your existing incident process: who to tell, how fast, and how to record lessons learned. You don't need a separate AI incident plan.&lt;/p&gt;

&lt;h2&gt;
  
  
  10. Training and awareness
&lt;/h2&gt;

&lt;p&gt;A short annual session plus onboarding is enough for most small companies. Cover the acceptable use rules, how to request a new tool, and how to report a problem. Keep a record of who completed it.&lt;/p&gt;

&lt;h2&gt;
  
  
  11. Review cycle
&lt;/h2&gt;

&lt;p&gt;AI tools and terms change fast. Commit to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A quarterly review of the inventory and approved tool list&lt;/li&gt;
&lt;li&gt;An annual review of the policy itself&lt;/li&gt;
&lt;li&gt;An ad hoc review when a major vendor changes terms or a new regulation applies to you&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Sample outline
&lt;/h2&gt;

&lt;p&gt;Copy this structure and fill it in:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Purpose and scope&lt;/li&gt;
&lt;li&gt;Definitions (AI tool, AI feature, AI agent, personal data, confidential data)&lt;/li&gt;
&lt;li&gt;Roles and responsibilities&lt;/li&gt;
&lt;li&gt;AI inventory requirements&lt;/li&gt;
&lt;li&gt;Risk tiers and criteria&lt;/li&gt;
&lt;li&gt;Approval process&lt;/li&gt;
&lt;li&gt;Vendor and contract requirements&lt;/li&gt;
&lt;li&gt;Human oversight and output review&lt;/li&gt;
&lt;li&gt;People decisions, fairness and transparency&lt;/li&gt;
&lt;li&gt;Incident reporting&lt;/li&gt;
&lt;li&gt;Training&lt;/li&gt;
&lt;li&gt;Review and exceptions&lt;/li&gt;
&lt;li&gt;Related policies (acceptable use, data classification, information security, privacy)&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Common mistakes to avoid
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Copying an enterprise framework wholesale.&lt;/strong&gt; Forty pages nobody reads protects nobody. Start small and add detail where your real risks are.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No owner.&lt;/strong&gt; A policy without a named accountable person decays within a quarter.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ignoring agents.&lt;/strong&gt; Tools that can act on your behalf need tighter limits than tools that only write text.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Treating approval as one-off.&lt;/strong&gt; Re-check vendors and uses at every review.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is general guidance, not legal advice. Have qualified counsel review your final policy, especially if you handle regulated data or make automated decisions about people.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Resources:&lt;/strong&gt; &lt;a href="https://runbookfoundry.gumroad.com/l/free-ai-acceptable-use-policy?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=resources" rel="noopener noreferrer"&gt;Free AI acceptable use policy template&lt;/a&gt;. I make these templates.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Drafted with AI assistance and reviewed for accuracy.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Not affiliated with, endorsed by, or sponsored by NIST, ISO, IEC or the European Union.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>security</category>
      <category>policy</category>
      <category>governance</category>
    </item>
    <item>
      <title>A Conditional Access Baseline for Small Microsoft Entra Tenants (Report-Only First)</title>
      <dc:creator>Runbook Foundry</dc:creator>
      <pubDate>Thu, 22 Oct 2026 00:07:30 +0000</pubDate>
      <link>https://dev.to/runbookfoundry/a-conditional-access-baseline-for-small-microsoft-entra-tenants-report-only-first-2gb5</link>
      <guid>https://dev.to/runbookfoundry/a-conditional-access-baseline-for-small-microsoft-entra-tenants-report-only-first-2gb5</guid>
      <description>&lt;p&gt;Conditional Access is the most useful security control in a Microsoft 365 tenant and the easiest one to lock yourself out with. One badly scoped "block" policy can stop every admin from signing in, including you.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Free download: &lt;a href="https://runbookfoundry.pages.dev/templates/conditional-access-report-only-log?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=topcta" rel="noopener noreferrer"&gt;a Conditional Access report-only log template&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The answer isn't to avoid it. It's to build a small, boring baseline, test each policy in &lt;strong&gt;report-only mode&lt;/strong&gt;, and only then switch it on. This guide covers which policies to start with in a small tenant (roughly 5 to 300 users), how to read the report-only results, and a rollout order that doesn't wreck anyone's Monday.&lt;/p&gt;

&lt;p&gt;Menu paths and recommendations were checked against Microsoft Learn in October 2026. Microsoft renames things often, so treat the docs as the source of truth if a label has moved.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prerequisites
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Licensing.&lt;/strong&gt; Conditional Access needs Microsoft Entra ID P1, which is included in Microsoft 365 Business Premium and E3/E5. Risk-based policies need P2. If you only have the free tier, use &lt;strong&gt;security defaults&lt;/strong&gt; instead. They give you MFA registration, admin MFA, legacy authentication blocking and device code flow blocking with no configuration.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Security defaults vs Conditional Access.&lt;/strong&gt; You can't run both. Microsoft's guidance is that organizations replacing security defaults with Conditional Access must turn security defaults off (&lt;strong&gt;Entra ID &amp;gt; Overview &amp;gt; Properties &amp;gt; Manage security defaults&lt;/strong&gt;), and should then turn on Conditional Access policies straight away so there's no gap. Plan that switch for a quiet time and have your policies ready first.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Check for Microsoft-managed policies.&lt;/strong&gt; Open &lt;strong&gt;Entra ID &amp;gt; Conditional Access &amp;gt; Policies&lt;/strong&gt; and look at the &lt;em&gt;Created by&lt;/em&gt; column. Microsoft creates some policies in your tenant in report-only mode, for example MFA for all users, MFA for admins accessing admin portals, blocking legacy authentication and blocking device code flow. According to Microsoft Learn, they're switched on no less than 30 days after they're introduced unless you turn them off, and you'll get email and Message center notice two weeks before. Know what's there so nothing surprises you, and add your emergency access exclusions to them too.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Role.&lt;/strong&gt; You need at least the Conditional Access Administrator role to create policies.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 0: Emergency access accounts
&lt;/h2&gt;

&lt;p&gt;Do this before anything else. Microsoft recommends &lt;strong&gt;two or more&lt;/strong&gt; emergency access ("break-glass") accounts:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Cloud-only accounts on your &lt;code&gt;*.onmicrosoft.com&lt;/code&gt; domain, not synced or federated&lt;/li&gt;
&lt;li&gt;Permanently assigned Global Administrator&lt;/li&gt;
&lt;li&gt;Protected with a &lt;strong&gt;passkey (FIDO2)&lt;/strong&gt; or certificate-based authentication, using a different method from your normal admin accounts&lt;/li&gt;
&lt;li&gt;Credentials stored securely, in separate locations, and not tied to one person's phone&lt;/li&gt;
&lt;li&gt;Sign-in alerts set up, so any use is noticed&lt;/li&gt;
&lt;li&gt;Tested at least every 90 days&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Put both accounts in a security group such as &lt;code&gt;CA-Exclude-EmergencyAccess&lt;/code&gt;. Exclude that group from every policy that blocks or restricts sign-in. Microsoft notes that report-only policies don't strictly need the exclusion, but add it from day one anyway, so it's already there when you switch the policy on.&lt;/p&gt;

&lt;p&gt;Also make a list of &lt;strong&gt;service accounts&lt;/strong&gt; and anything that signs in non-interactively, such as the Entra Connect sync account if you use hybrid identity, or a scanner that sends email. These need deliberate handling, not blanket exclusions.&lt;/p&gt;

&lt;p&gt;Exclude at least two emergency-access accounts from every policy, and write down how they're stored, who can use them, and how their sign-ins are monitored.&lt;/p&gt;

&lt;h2&gt;
  
  
  The starter baseline: six policies
&lt;/h2&gt;

&lt;p&gt;Use a clear naming standard so the list is readable at a glance, for example &lt;code&gt;CA01-AllUsers-Block-LegacyAuth&lt;/code&gt;. Every policy below starts with &lt;strong&gt;Enable policy = Report-only&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  CA01: Block legacy authentication
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Users:&lt;/strong&gt; All users. Exclude the emergency access group.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Target resources:&lt;/strong&gt; All resources.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Conditions &amp;gt; Client apps:&lt;/strong&gt; Configure = Yes. Check only &lt;em&gt;Exchange ActiveSync clients&lt;/em&gt; and &lt;em&gt;Other clients&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Grant:&lt;/strong&gt; Block access.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Legacy protocols can't do MFA, and Microsoft's analysis attributes the large majority of password spray attacks to them. Before enforcing, check who still uses them: &lt;strong&gt;Entra ID &amp;gt; Monitoring &amp;amp; health &amp;gt; Sign-in logs&lt;/strong&gt;, add the &lt;em&gt;Client app&lt;/em&gt; column, filter to the legacy protocols, and check the &lt;em&gt;non-interactive&lt;/em&gt; sign-ins tab too. The usual culprits are old multifunction printers, line-of-business apps and ancient mail clients.&lt;/p&gt;

&lt;h3&gt;
  
  
  CA02: Require MFA for all users
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Users:&lt;/strong&gt; All users. Exclude the emergency access group (and the directory synchronization accounts role if you use Entra Connect).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Target resources:&lt;/strong&gt; All resources, with no app exclusions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Grant:&lt;/strong&gt; Grant access &amp;gt; &lt;em&gt;Require authentication strength&lt;/em&gt; &amp;gt; the built-in &lt;strong&gt;Multifactor authentication&lt;/strong&gt; strength.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Microsoft's tip is that every organization should have this baseline: all users, all resources, MFA. Resist adding "trusted office IP" exclusions unless you really need them. Attackers don't sit in your office, but stolen sessions and compromised devices can look like they do.&lt;/p&gt;

&lt;h3&gt;
  
  
  CA03: Require phishing-resistant MFA for admins
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Users:&lt;/strong&gt; Directory roles. Include at least Global Administrator, Privileged Role Administrator, Security Administrator, Conditional Access Administrator, Exchange Administrator, SharePoint Administrator, User Administrator, Helpdesk Administrator, Authentication Administrator, Privileged Authentication Administrator, Application Administrator, Cloud Application Administrator, Password Administrator and Billing Administrator. Exclude the emergency access group.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Target resources:&lt;/strong&gt; All resources.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Grant:&lt;/strong&gt; Require authentication strength &amp;gt; &lt;strong&gt;Phishing-resistant MFA&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Warning:&lt;/strong&gt; make sure every admin has registered a passkey (FIDO2), Windows Hello for Business or certificate-based authentication first, using a Temporary Access Pass if needed. Turning this on before they're registered is the classic lockout. Also note that Conditional Access only targets built-in roles. Custom and administrative-unit-scoped roles aren't covered.&lt;/p&gt;

&lt;h3&gt;
  
  
  CA04: Require MFA for Microsoft admin portals
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Users:&lt;/strong&gt; The same admin roles as CA03. Exclude the emergency access group.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Target resources:&lt;/strong&gt; Select resources &amp;gt; &lt;strong&gt;Microsoft Admin Portals&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Grant:&lt;/strong&gt; Require authentication strength &amp;gt; Multifactor authentication.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This overlaps with CA02 and CA03 on purpose. If someone later edits or scopes down one policy, this one still protects the admin portals.&lt;/p&gt;

&lt;h3&gt;
  
  
  CA05: Secure security info registration
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Users:&lt;/strong&gt; All users. Exclude all guest and external users, and the emergency access group.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Target resources:&lt;/strong&gt; User actions &amp;gt; &lt;strong&gt;Register security information&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Conditions &amp;gt; Locations:&lt;/strong&gt; Include Any location. Exclude All trusted locations.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Grant:&lt;/strong&gt; Require authentication strength.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This stops an attacker who has just phished a password from registering their own MFA method. Issue new starters a Temporary Access Pass so they can register from anywhere. One caveat: report-only mode doesn't evaluate policies scoped to User actions, so you won't get report-only data for this one. Test it on a small test group instead. Microsoft also notes that from July 6, 2026, these policies apply during Windows Hello for Business and macOS Platform SSO registration, so test those flows if you use them.&lt;/p&gt;

&lt;h3&gt;
  
  
  CA06: Block device code flow
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Users:&lt;/strong&gt; All users. Exclude the emergency access group and any documented exceptions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Target resources:&lt;/strong&gt; All resources.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Conditions &amp;gt; Authentication flows:&lt;/strong&gt; Configure = Yes, select &lt;em&gt;Device code flow&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Grant:&lt;/strong&gt; Block access.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Device code flow is rarely needed in small businesses but often abused in phishing. If you have Teams Rooms or similar shared devices that rely on it, scope a narrow exception rather than leaving the flow open to everyone.&lt;/p&gt;

&lt;h2&gt;
  
  
  Next-wave policies (after the baseline is on)
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;MFA for guests.&lt;/strong&gt; Include guest and external users, target all resources, require MFA (if CA02 doesn't already cover them).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Risk-based policies (P2).&lt;/strong&gt; Require MFA for medium-or-higher sign-in risk and a secure password change for high user risk.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Block countries you don't operate in&lt;/strong&gt;, using a named location. Treat it as noise reduction, not a strong control, because VPNs get around it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Device-based access&lt;/strong&gt; once Intune enrollment is in good shape, plus app protection on mobile.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Shorter admin sessions:&lt;/strong&gt; sign-in frequency and no persistent browser for admin roles.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Running report-only properly
&lt;/h2&gt;

&lt;p&gt;Report-only means the policy is evaluated at every sign-in and logged, but nothing is enforced. Users aren't prompted and nobody is blocked. Give each policy &lt;strong&gt;at least 7 days&lt;/strong&gt;, and 14 if your business has weekly or month-end cycles.&lt;/p&gt;

&lt;p&gt;Three places to look:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Policy impact.&lt;/strong&gt; Open the policy and select the &lt;em&gt;Policy impact&lt;/em&gt; view. It shows what the policy would have done to interactive sign-ins over the past 24 hours, 7 days or month. It needs at least the Security Reader role.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sign-in logs.&lt;/strong&gt; &lt;strong&gt;Entra ID &amp;gt; Monitoring &amp;amp; health &amp;gt; Sign-in logs&lt;/strong&gt;, open a sign-in and check the &lt;em&gt;Report-only&lt;/em&gt; tab. Results are:

&lt;ul&gt;
&lt;li&gt;
&lt;em&gt;Report-only: Success&lt;/em&gt;: would have been allowed&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Report-only: Failure&lt;/em&gt;: would have been blocked. Investigate every one.&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Report-only: User action required&lt;/em&gt;: the user would have been prompted (for example, for MFA)&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Report-only: Not applied&lt;/em&gt;: conditions didn't match, for example an excluded user&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Conditional Access insights workbook&lt;/strong&gt;, if you send sign-in logs to a Log Analytics workspace. It's best for seeing several policies together.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;For each &lt;em&gt;Failure&lt;/em&gt;, decide: is it an attacker (good, the policy works), a legacy device that needs replacing, or a legitimate scenario that needs a narrow, documented exclusion?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A report-only quirk:&lt;/strong&gt; policies that require a managed device can still pop a certificate prompt on macOS, iOS and Android during evaluation. Microsoft's advice is to exclude those platforms from report-only device policies.&lt;/p&gt;

&lt;h2&gt;
  
  
  Switching policies on
&lt;/h2&gt;

&lt;p&gt;Turn on one policy at a time, in this order:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;CA01&lt;/strong&gt; (block legacy auth), once the sign-in logs show no legitimate legacy use&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CA04&lt;/strong&gt;, then &lt;strong&gt;CA03&lt;/strong&gt; (admins first; it's a small group you can help in person)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CA02&lt;/strong&gt; (all users), after a user communication with the date and how to register&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CA05&lt;/strong&gt; and &lt;strong&gt;CA06&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;For each one:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;[ ] Report-only for 7 to 14 days with no unexplained failures&lt;/li&gt;
&lt;li&gt;[ ] Exclusions documented with an owner and a review date&lt;/li&gt;
&lt;li&gt;[ ] Help desk told what to expect and how to issue a Temporary Access Pass&lt;/li&gt;
&lt;li&gt;[ ] Emergency access account sign-in tested&lt;/li&gt;
&lt;li&gt;[ ] Switch &lt;em&gt;Enable policy&lt;/em&gt; from Report-only to &lt;strong&gt;On&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;[ ] Watch sign-in logs closely for the first 48 hours&lt;/li&gt;
&lt;li&gt;[ ] Rollback plan ready: switch the policy back to Report-only, rather than deleting it&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Keeping it healthy
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Review exclusions every 90 days. Exclusions are where baselines quietly die.&lt;/li&gt;
&lt;li&gt;Export your policies (JSON via Microsoft Graph) after every change, so you have a backup and a history.&lt;/li&gt;
&lt;li&gt;Test the emergency access accounts quarterly.&lt;/li&gt;
&lt;li&gt;Review any new Microsoft-managed policies when Message center announces them.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A small tenant with these six policies on, real emergency access accounts and documented exclusions is ahead of most organizations its size, and you got there without locking anyone out.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Resources:&lt;/strong&gt; &lt;a href="https://runbookfoundry.gumroad.com/l/free-m365-gws-hardening-checklist?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=resources" rel="noopener noreferrer"&gt;Free M365 + Google Workspace hardening checklist&lt;/a&gt; · &lt;a href="https://runbookfoundry.pages.dev/templates/conditional-access-report-only-log?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=resources" rel="noopener noreferrer"&gt;Free Conditional Access report-only log&lt;/a&gt;. I make these templates.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Drafted with AI assistance and reviewed for accuracy.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Not affiliated with Microsoft or Google.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>security</category>
      <category>azure</category>
      <category>microsoft365</category>
      <category>sysadmin</category>
    </item>
    <item>
      <title>How to Write an AI Acceptable Use Policy for Employees (With a Sample Outline)</title>
      <dc:creator>Runbook Foundry</dc:creator>
      <pubDate>Wed, 21 Oct 2026 00:07:31 +0000</pubDate>
      <link>https://dev.to/runbookfoundry/how-to-write-an-ai-acceptable-use-policy-for-employees-with-a-sample-outline-4omh</link>
      <guid>https://dev.to/runbookfoundry/how-to-write-an-ai-acceptable-use-policy-for-employees-with-a-sample-outline-4omh</guid>
      <description>&lt;p&gt;Your staff are already using AI tools. Someone is pasting meeting notes into a chatbot to get a summary. Someone else installed a browser extension that "writes better emails". A manager is asking an assistant to rank job applicants. None of this is necessarily bad, but without rules you have no idea which company data has gone where, and nobody knows what they're allowed to do.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Free download: &lt;a href="https://runbookfoundry.gumroad.com/l/free-ai-acceptable-use-policy?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=topcta" rel="noopener noreferrer"&gt;a free AI acceptable use policy template&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;An AI acceptable use policy (AUP) fixes that. It doesn't need to be long. The best ones fit on a page or two, use plain language, and answer the three questions employees actually have: &lt;em&gt;Which tools can I use? What can I put into them? What am I still responsible for?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;This guide walks through how to write one for a small or mid-sized organization, with examples and a short sample outline you can adapt.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why a short policy beats a perfect one
&lt;/h2&gt;

&lt;p&gt;Small businesses tend to stall on AI policy because it feels like it needs a lawyer, a committee and a risk framework. Those things help later. Right now, the biggest risks are simple and common:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Data leakage:&lt;/strong&gt; confidential or personal data pasted into a consumer tool whose terms allow the provider to keep or train on it&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Unchecked output:&lt;/strong&gt; AI-drafted content sent to customers with wrong facts, made-up references or someone else's copyrighted text&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Automated decisions about people:&lt;/strong&gt; screening, scoring or disciplining staff or applicants with no human review&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Shadow tools:&lt;/strong&gt; extensions, plugins and "AI features" quietly switched on inside apps you already pay for&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A clear one-page policy published this month addresses all four. You can build the fuller program (tool intake reviews, an AI inventory, vendor contract terms) over the following quarter.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 1: Decide who owns it
&lt;/h2&gt;

&lt;p&gt;Pick one accountable owner. In a small business that's usually the IT lead, operations manager or whoever owns security. Name a second approver from HR or leadership. Write both into the policy header along with an effective date and a review date (at least annually; AI tools change fast, so six months is better).&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 2: Inventory what people already use
&lt;/h2&gt;

&lt;p&gt;Before writing rules, find out what's happening. A 10-minute anonymous survey works well:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Which AI tools have you used for work in the last month?&lt;/li&gt;
&lt;li&gt;Are you signed in with a work account, a personal account or no account?&lt;/li&gt;
&lt;li&gt;What do you use them for (drafting, summarizing, coding, research, images, meetings)?&lt;/li&gt;
&lt;li&gt;Have you ever pasted customer, employee or financial information into one?&lt;/li&gt;
&lt;li&gt;What would you like to use AI for but haven't, because you weren't sure it was allowed?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Pair it with a quick technical check: browser extensions on managed devices, OAuth apps connected to your email and file storage, and AI features enabled in your existing SaaS admin consoles. The answers will tell you which tools to approve, which to block and where the real data risk is.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 3: Define approved tools in tiers
&lt;/h2&gt;

&lt;p&gt;A tiered model is easier for staff than a long allow/deny list:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tier&lt;/th&gt;
&lt;th&gt;What it means&lt;/th&gt;
&lt;th&gt;Example&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Approved for internal data&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Company-licensed, signed in with a work account, with contract terms that say your data isn't used to train models&lt;/td&gt;
&lt;td&gt;The assistant built into your company's office suite, if your plan's terms cover this&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Approved for public data only&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Fine for brainstorming or rewriting public information. No company or personal data.&lt;/td&gt;
&lt;td&gt;A free chatbot used to draft a generic job ad&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Not approved&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Blocked or forbidden for company work&lt;/td&gt;
&lt;td&gt;Unvetted browser extensions, apps that want access to your whole mailbox&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Keep the actual list on a separate page (an intranet page or shared doc) and link it from the policy, so you can update tools without re-approving the policy.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 4: Write data rules people can apply in five seconds
&lt;/h2&gt;

&lt;p&gt;This is the most important section. Tie it to the data categories you already use, or define simple ones:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Data type&lt;/th&gt;
&lt;th&gt;Approved for internal data&lt;/th&gt;
&lt;th&gt;Public-only tools&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Public information (website copy, published docs)&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Internal (non-sensitive notes, process docs)&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Confidential (financials, contracts, strategy, source code)&lt;/td&gt;
&lt;td&gt;Only if the tool is explicitly approved for it&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Personal data (customer or employee details)&lt;/td&gt;
&lt;td&gt;Only if the tool is explicitly approved for it&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Credentials (passwords, API keys, tokens)&lt;/td&gt;
&lt;td&gt;Never&lt;/td&gt;
&lt;td&gt;Never&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Add a tie-breaker: &lt;strong&gt;"When unsure, treat it as confidential and ask."&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Worked examples help more than definitions. Include three or four:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ "Summarize these anonymized meeting notes" in the company assistant&lt;/li&gt;
&lt;li&gt;✅ "Suggest five subject lines for this public product announcement" in any approved tool&lt;/li&gt;
&lt;li&gt;❌ "Here's our customer export, find the churn risks" in a personal chatbot account&lt;/li&gt;
&lt;li&gt;❌ "Debug this script" when the script contains a live API key&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Step 5: Make humans accountable for output
&lt;/h2&gt;

&lt;p&gt;AI output is a draft, not a source. The policy should say plainly:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You are responsible for anything you send, publish or act on, however it was produced.&lt;/li&gt;
&lt;li&gt;Check facts, numbers, names and references before use. AI tools can confidently invent all four.&lt;/li&gt;
&lt;li&gt;Check for bias, security problems (especially in generated code) and copied material.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI must not make final decisions about people&lt;/strong&gt;: hiring, performance, pay, discipline, credit or access. A person reviews and documents the decision.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Step 6: Be clear on transparency
&lt;/h2&gt;

&lt;p&gt;Decide when people must disclose AI use. A practical rule: disclose when content is substantially AI-generated &lt;strong&gt;and&lt;/strong&gt; it's customer-facing, published, legal, or the customer or contract requires it. Internal drafts usually don't need a label. Never present AI output as independently verified fact without checking it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 7: List what's prohibited
&lt;/h2&gt;

&lt;p&gt;Keep this short and concrete:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Creating deceptive, harassing, discriminatory or illegal content&lt;/li&gt;
&lt;li&gt;Impersonating real people (voice, image or writing) without consent&lt;/li&gt;
&lt;li&gt;Generating malware or trying to get around security controls&lt;/li&gt;
&lt;li&gt;Recording or transcribing colleagues or customers without the notice and consent the law and your policies require&lt;/li&gt;
&lt;li&gt;Using personal AI accounts for company work&lt;/li&gt;
&lt;li&gt;Connecting AI tools or extensions to company email, files or systems without IT approval&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Step 8: Say how to report problems
&lt;/h2&gt;

&lt;p&gt;Mistakes will happen. Make it safe to report them quickly: "If you think you've put the wrong data into an AI tool, or you see unapproved AI use, tell [contact] right away. Reporting in good faith will not be held against you." That sentence does more for security than any monitoring tool.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 9: Exceptions, enforcement and acknowledgment
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Exceptions:&lt;/strong&gt; written approval from a named role, recorded with an expiry date.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Enforcement:&lt;/strong&gt; point to your existing disciplinary process rather than inventing a new one.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Acknowledgment:&lt;/strong&gt; a signature line or an e-sign step at the bottom. You'll want a record that people read it.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Sample AI acceptable use policy outline
&lt;/h2&gt;

&lt;p&gt;Here is a short outline you can turn into a one- or two-page policy. Replace the bracketed fields.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Purpose and scope.&lt;/strong&gt; Covers generative AI tools (chatbots, writing, coding, image and meeting assistants, and AI features inside existing apps). Applies to all employees, contractors and temporary staff on any device when company work or data is involved.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Approved tools.&lt;/strong&gt; Use only tools on the Approved AI Tools list at [link], signed in with your company account. Request new tools, extensions or AI features from [contact] before use.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Data rules.&lt;/strong&gt; The data table above, plus "never enter credentials" and "when unsure, treat as confidential."&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Human review and accountability.&lt;/strong&gt; You own the output. Verify before use. No final decisions about people without documented human review.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Transparency.&lt;/strong&gt; Disclose substantial AI use in customer-facing, published or legal material, or where required.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Prohibited uses.&lt;/strong&gt; The list from Step 7.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Security and incident reporting.&lt;/strong&gt; Report data mistakes and unapproved use to [contact]. Good-faith reports are protected.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Exceptions and enforcement.&lt;/strong&gt; Written exceptions from [role]. Violations handled under existing policies.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ownership and review.&lt;/strong&gt; Owner [name/role], approver [name/role], effective [date], next review [date].&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Acknowledgment.&lt;/strong&gt; Name, signature, date.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Rolling it out in two weeks
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Week 1&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;[ ] Run the usage survey and the technical check&lt;/li&gt;
&lt;li&gt;[ ] Draft the policy using the outline above&lt;/li&gt;
&lt;li&gt;[ ] Publish the Approved AI Tools list (start with two or three tools)&lt;/li&gt;
&lt;li&gt;[ ] Have HR and, ideally, legal counsel review it&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Week 2&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;[ ] Leadership approves and announces it, ideally in a short all-hands slot rather than only by email&lt;/li&gt;
&lt;li&gt;[ ] Collect acknowledgments&lt;/li&gt;
&lt;li&gt;[ ] Turn off or restrict AI features and extensions that aren't on the approved list, using your admin consoles&lt;/li&gt;
&lt;li&gt;[ ] Put a review date in the calendar&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Afterwards:&lt;/strong&gt; add a simple intake form for new tool requests, keep a list of the AI tools and features in use, and check that the contracts for your approved tools cover data use, retention and training the way you expect. For each approved tool, note who approved it, when, and why, so the decision is easy to revisit later.&lt;/p&gt;

&lt;h2&gt;
  
  
  Common mistakes to avoid
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Banning everything.&lt;/strong&gt; People will use personal accounts anyway, and you lose visibility. Approve something useful.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Writing for lawyers.&lt;/strong&gt; If staff can't apply it in five seconds, they won't.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Forgetting built-in AI.&lt;/strong&gt; The biggest exposure is often an AI feature switched on by default in a tool you already use.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Publishing and walking away.&lt;/strong&gt; Tools, terms and features change quarterly. Review the list at least that often.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is general guidance, not legal advice. Have qualified counsel review your final policy, especially if you handle regulated data or operate in several jurisdictions.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Resources:&lt;/strong&gt; &lt;a href="https://runbookfoundry.gumroad.com/l/free-ai-acceptable-use-policy?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=resources" rel="noopener noreferrer"&gt;Free AI acceptable use policy template&lt;/a&gt;. I make these templates.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Drafted with AI assistance and reviewed for accuracy.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Not affiliated with Microsoft or Google.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>security</category>
      <category>policy</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Google Workspace Security Audit: 25 Settings to Check Today (With Admin Console Paths)</title>
      <dc:creator>Runbook Foundry</dc:creator>
      <pubDate>Tue, 20 Oct 2026 00:09:10 +0000</pubDate>
      <link>https://dev.to/runbookfoundry/google-workspace-security-audit-25-settings-to-check-today-with-admin-console-paths-i44</link>
      <guid>https://dev.to/runbookfoundry/google-workspace-security-audit-25-settings-to-check-today-with-admin-console-paths-i44</guid>
      <description>&lt;p&gt;Most Google Workspace tenants at small businesses were set up in an afternoon, years ago, by whoever was handy. The defaults are reasonable, but "reasonable" leaves gaps: one super admin with SMS codes, mail forwarding open to anyone, Drive links shared with "anyone on the internet", and OAuth apps nobody remembers approving.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Free download: &lt;a href="https://runbookfoundry.gumroad.com/l/free-m365-gws-hardening-checklist?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=topcta" rel="noopener noreferrer"&gt;the Microsoft 365 &amp;amp; Google Workspace hardening checklist&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This is a read-first audit. Work through the 25 settings below, write down what you find, and only then decide what to change. Every path starts from the Google Admin console (admin.google.com) and was checked against Google's current admin help pages in October 2026. Google moves menus around, so if a path doesn't match, search the setting name in the console's search bar.&lt;/p&gt;

&lt;h2&gt;
  
  
  Before you start
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Use a super admin account&lt;/strong&gt;, but not your daily one if you can avoid it. Some settings below are visible only to super admins.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Record, don't fix.&lt;/strong&gt; Make a simple sheet with four columns: Setting, Current value, Recommended, Action. Changes go through a test organizational unit (OU) first.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Know your OUs.&lt;/strong&gt; Most settings can be applied per OU or per group. A setting can look right at the top level and be overridden for one department. Check the left-hand OU panel on each page.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Check your edition.&lt;/strong&gt; A few items depend on edition. Where that matters, it's noted.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Admin accounts and sign-in (1 to 8)
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1. How many super admins you have&lt;/strong&gt;&lt;br&gt;
Path: &lt;strong&gt;Account &amp;gt; Admin roles &amp;gt; Super Admin&lt;/strong&gt;, then view the assigned admins.&lt;br&gt;
Target: two to four named people. One is a single point of failure; ten means ten accounts that can take over the tenant. Use narrower prebuilt or custom roles for help desk work.&lt;/p&gt;

&lt;p&gt;Settings only stay secure if the right people hold admin rights, so repeat this check every quarter: list every admin, confirm each one still needs the role, and note the date you checked.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Super admins have separate admin-only accounts&lt;/strong&gt;&lt;br&gt;
Path: &lt;strong&gt;Directory &amp;gt; Users&lt;/strong&gt;, open each super admin, then &lt;strong&gt;Admin roles and privileges&lt;/strong&gt;.&lt;br&gt;
Target: the super admin identity is not the same account used for daily email, browsing and chat. Daily accounts are the most phished.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Super admin self-recovery&lt;/strong&gt;&lt;br&gt;
Path: &lt;strong&gt;Security &amp;gt; Authentication &amp;gt; Account recovery &amp;gt; Super admin account recovery&lt;/strong&gt;.&lt;br&gt;
Target: a deliberate decision. Google recommends turning self-recovery off if you have several super admins who can help each other. If you leave it on, make sure each super admin's recovery phone and email belong to them and are current.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. 2-Step Verification is allowed and enforced&lt;/strong&gt;&lt;br&gt;
Path: &lt;strong&gt;Security &amp;gt; Authentication &amp;gt; 2-step verification&lt;/strong&gt;.&lt;br&gt;
Target: "Allow users to turn on 2-Step Verification" checked, and Enforcement set to On (or "Turn on enforcement from date") for every OU. Set a short new-user enrollment period, such as one to two weeks. Google is also enforcing 2SV for administrator accounts.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. Phishing-resistant 2SV for admins&lt;/strong&gt;&lt;br&gt;
Path: same page, select the OU or group that holds your admins, then &lt;strong&gt;Methods&lt;/strong&gt;.&lt;br&gt;
Target: "Only security key". Google's help notes that this option now accepts passkeys as well as hardware keys. Check who has keys enrolled first (&lt;strong&gt;Reporting &amp;gt; User Reports &amp;gt; Security&lt;/strong&gt;) so you don't lock anyone out, and generate backup codes for emergencies.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;6. Passkeys allowed&lt;/strong&gt;&lt;br&gt;
Path: &lt;strong&gt;Security &amp;gt; Authentication &amp;gt; Passwordless &amp;gt; Skip passwords&lt;/strong&gt;.&lt;br&gt;
Target: "Allow users to skip their password and authenticate with a passkey" checked, at least for a test OU. Passkeys are phishing-resistant and usually easier for staff than codes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;7. Password policy&lt;/strong&gt;&lt;br&gt;
Path: &lt;strong&gt;Security &amp;gt; Authentication &amp;gt; Password management&lt;/strong&gt;.&lt;br&gt;
Target: enforce strong passwords, a minimum length of at least 12 characters, "Enforce password policy at next sign-in" checked, and password reuse not allowed. Avoid forced periodic expiry, which tends to produce weaker passwords.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;8. Web session length&lt;/strong&gt;&lt;br&gt;
Path: &lt;strong&gt;Security &amp;gt; Access and data control &amp;gt; Google session control&lt;/strong&gt;.&lt;br&gt;
Target: a defined session duration rather than "never expires", for example 12 to 24 hours for most users and shorter for admins. Shorter sessions limit the value of a stolen session cookie.&lt;/p&gt;

&lt;h2&gt;
  
  
  Email (9 to 16)
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;9. SPF, DKIM and DMARC&lt;/strong&gt;&lt;br&gt;
Path for DKIM: &lt;strong&gt;Apps &amp;gt; Google Workspace &amp;gt; Gmail &amp;gt; Authenticate email&lt;/strong&gt;. SPF and DMARC live at your DNS host.&lt;br&gt;
Target: DKIM generated and authenticating for every sending domain (2048-bit where your DNS host allows it). One valid SPF record per domain. A DMARC record that moves from &lt;code&gt;p=none&lt;/code&gt; with reporting to &lt;code&gt;p=quarantine&lt;/code&gt; or &lt;code&gt;p=reject&lt;/code&gt; once legitimate senders are aligned.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;10. Enhanced pre-delivery message scanning&lt;/strong&gt;&lt;br&gt;
Path: &lt;strong&gt;Apps &amp;gt; Google Workspace &amp;gt; Gmail &amp;gt; Spam, Phishing and Malware&lt;/strong&gt;.&lt;br&gt;
Target: enhanced pre-delivery scanning turned on. It lets Gmail take a little longer to catch phishing before it reaches the inbox.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;11. Attachment protections&lt;/strong&gt;&lt;br&gt;
Path: &lt;strong&gt;Apps &amp;gt; Google Workspace &amp;gt; Gmail &amp;gt; Safety&lt;/strong&gt;, then &lt;strong&gt;Attachments&lt;/strong&gt;.&lt;br&gt;
Target: protection against encrypted attachments, attachments with scripts and anomalous attachment types turned on, with an action stronger than the default warning (spam or quarantine). Check "Apply future recommended settings automatically".&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;12. Link and external image protections&lt;/strong&gt;&lt;br&gt;
Path: &lt;strong&gt;Apps &amp;gt; Google Workspace &amp;gt; Gmail &amp;gt; Safety&lt;/strong&gt;, then &lt;strong&gt;Links and external images&lt;/strong&gt;.&lt;br&gt;
Target: identify links behind shortened URLs, scan linked images, warn on clicks to untrusted domains, and apply future recommended settings automatically.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;13. Spoofing and authentication protections&lt;/strong&gt;&lt;br&gt;
Path: &lt;strong&gt;Apps &amp;gt; Google Workspace &amp;gt; Gmail &amp;gt; Safety&lt;/strong&gt;, then &lt;strong&gt;Spoofing and authentication&lt;/strong&gt;.&lt;br&gt;
Target: all five protections on (similar domain names, employee name spoofing, inbound mail spoofing your domain, unauthenticated mail, and Groups protection). These directly reduce invoice and CEO-fraud email.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;14. Automatic forwarding&lt;/strong&gt;&lt;br&gt;
Path: &lt;strong&gt;Apps &amp;gt; Google Workspace &amp;gt; Gmail &amp;gt; End User Access&lt;/strong&gt;, then &lt;strong&gt;Automatic forwarding&lt;/strong&gt;.&lt;br&gt;
Target: "Allow users to automatically forward incoming email to another address" unchecked for most OUs. Attackers set up forwarding to quietly copy a mailbox after a takeover. Allow it only for OUs with a documented need.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;15. POP and IMAP access&lt;/strong&gt;&lt;br&gt;
Path: &lt;strong&gt;Apps &amp;gt; Google Workspace &amp;gt; Gmail &amp;gt; End User Access&lt;/strong&gt;, then &lt;strong&gt;POP and IMAP access&lt;/strong&gt;.&lt;br&gt;
Target: off, unless an OU has a documented client that needs it. Older mail clients are a common way around modern sign-in protections.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;16. External recipient warning&lt;/strong&gt;&lt;br&gt;
Path: &lt;strong&gt;Apps &amp;gt; Google Workspace &amp;gt; Gmail &amp;gt; End User Access&lt;/strong&gt;, then the external recipient warning setting.&lt;br&gt;
Target: on. It catches misaddressed email and replies to look-alike domains.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sharing and collaboration (17 to 19)
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;17. Drive external sharing&lt;/strong&gt;&lt;br&gt;
Path: &lt;strong&gt;Apps &amp;gt; Google Workspace &amp;gt; Drive and Docs &amp;gt; Sharing settings &amp;gt; Sharing options&lt;/strong&gt;.&lt;br&gt;
Target: external sharing either off or limited to allowlisted domains for sensitive OUs. Where it stays on, warn users when sharing outside the organization and don't let files be published to the web without review. Then review what's already shared publicly. Settings stop new exposure but don't fix the old.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;18. Calendar external sharing&lt;/strong&gt;&lt;br&gt;
Path: &lt;strong&gt;Apps &amp;gt; Google Workspace &amp;gt; Calendar &amp;gt; Sharing settings&lt;/strong&gt;.&lt;br&gt;
Target: external sharing of primary calendars set to "Only free/busy information". Full details leak meeting titles, dial-ins and who reports to whom.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;19. Groups for Business sharing&lt;/strong&gt;&lt;br&gt;
Path: &lt;strong&gt;Apps &amp;gt; Google Workspace &amp;gt; Groups for Business &amp;gt; Sharing settings&lt;/strong&gt;.&lt;br&gt;
Target: external access to groups restricted by default, and group owners not able to let people outside the organization join. Then check that no group lets "anyone on the web" view or post.&lt;/p&gt;

&lt;h2&gt;
  
  
  Apps, API access and AI (20 to 23)
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;20. Third-party app access (OAuth)&lt;/strong&gt;&lt;br&gt;
Path: &lt;strong&gt;Security &amp;gt; Access and data control &amp;gt; API controls&lt;/strong&gt;, then &lt;strong&gt;Manage App Access&lt;/strong&gt; and &lt;strong&gt;Settings&lt;/strong&gt;.&lt;br&gt;
Target: review every app with access to Gmail, Drive or admin data, and mark each one Trusted, Limited or Blocked on purpose. Under Settings, decide what users can do with unconfigured third-party apps. Restricting access to high-risk Google data such as Gmail and Drive is a strong default.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;21. Domain-wide delegation&lt;/strong&gt;&lt;br&gt;
Path: &lt;strong&gt;Security &amp;gt; Access and data control &amp;gt; API controls &amp;gt; Manage Domain Wide Delegation&lt;/strong&gt;.&lt;br&gt;
Target: every client ID has a known owner, a current purpose and the minimum scopes. Delete anything nobody can explain. Domain-wide delegation lets a service act as any user, so treat it as a crown-jewel credential.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;22. Marketplace app installs&lt;/strong&gt;&lt;br&gt;
Path: &lt;strong&gt;Apps &amp;gt; Google Workspace Marketplace apps &amp;gt; Apps list &amp;gt; User Install Settings&lt;/strong&gt;.&lt;br&gt;
Target: "Allow users to install and run only selected apps" (allowlisted apps), with a simple request process for new ones.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;23. Gemini and AI access&lt;/strong&gt;&lt;br&gt;
Path: &lt;strong&gt;Generative AI &amp;gt; Gemini app&lt;/strong&gt;.&lt;br&gt;
Target: access turned on only for the OUs or groups your AI acceptable use policy covers. Make sure staff know which AI tools are approved and what data they may use with them. Tidy your Drive sharing (item 17) first, because AI assistants can surface whatever a user already has access to.&lt;/p&gt;

&lt;h2&gt;
  
  
  Devices, data and monitoring (24 and 25)
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;24. Mobile device management&lt;/strong&gt;&lt;br&gt;
Path: &lt;strong&gt;Devices &amp;gt; Mobile &amp;amp; endpoints &amp;gt; Settings &amp;gt; Universal &amp;gt; General &amp;gt; Mobile management&lt;/strong&gt;.&lt;br&gt;
Target: at least Basic management, with a screen lock required, so you can sign a lost phone out of company data. Use Advanced where your edition supports it and you need device approval or full wipe.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;25. Takeout and alerting&lt;/strong&gt;&lt;br&gt;
Paths: &lt;strong&gt;Data &amp;gt; Data import &amp;amp; export &amp;gt; Google Takeout&lt;/strong&gt; and &lt;strong&gt;Security &amp;gt; Alert center&lt;/strong&gt;.&lt;br&gt;
Target: Google Takeout turned off for departing-user and sensitive OUs, so a leaver can't bulk-download their mailbox and Drive. In the Alert center, make sure alerts such as suspicious login, leaked password, government-backed attack and super admin changes reach a mailbox someone actually reads. An alert nobody sees isn't an alert.&lt;/p&gt;

&lt;h2&gt;
  
  
  Scoring your audit
&lt;/h2&gt;

&lt;p&gt;Give each item a status: &lt;strong&gt;OK&lt;/strong&gt;, &lt;strong&gt;Gap&lt;/strong&gt;, or &lt;strong&gt;Accepted risk&lt;/strong&gt; (with a reason and an owner). Then sort the gaps:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;This week:&lt;/strong&gt; 1, 4, 5, 9, 13, 14, 20. These close the most common account takeover and business email compromise paths.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;This month:&lt;/strong&gt; 2, 3, 7, 11, 12, 15, 17, 21, 25.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;This quarter:&lt;/strong&gt; everything else, plus a review of existing public Drive shares.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Making changes safely
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Test first.&lt;/strong&gt; Create a "Test-Security" OU with IT and one or two willing staff. Apply the change there and wait a few days.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Communicate before enforcing.&lt;/strong&gt; Tell people what's changing, when, and what they need to do (for example, enroll a passkey before the 2SV date).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Have a way back in.&lt;/strong&gt; Keep at least one tested super admin with a hardware key stored securely before you tighten admin 2SV.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Write it down.&lt;/strong&gt; Log the date, the setting, the old value and the new value. When something breaks next month, the change log is the first place you'll look.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Re-audit quarterly.&lt;/strong&gt; Google adds new settings, staff change and exceptions creep back in.&lt;/li&gt;
&lt;/ol&gt;




&lt;p&gt;&lt;strong&gt;Resources:&lt;/strong&gt; &lt;a href="https://runbookfoundry.gumroad.com/l/free-m365-gws-hardening-checklist?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=resources" rel="noopener noreferrer"&gt;Free M365 + Google Workspace hardening checklist&lt;/a&gt;. I make these templates.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Drafted with AI assistance and reviewed for accuracy.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Not affiliated with Microsoft or Google.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>security</category>
      <category>googleworkspace</category>
      <category>sysadmin</category>
      <category>checklist</category>
    </item>
    <item>
      <title>What % of top domains are spoofable in October 2026?</title>
      <dc:creator>Runbook Foundry</dc:creator>
      <pubDate>Mon, 19 Oct 2026 23:56:46 +0000</pubDate>
      <link>https://dev.to/runbookfoundry/what-of-top-domains-are-spoofable-in-october-2026-47c0</link>
      <guid>https://dev.to/runbookfoundry/what-of-top-domains-are-spoofable-in-october-2026-47c0</guid>
      <description>&lt;p&gt;Anyone can put your domain in the &lt;code&gt;From:&lt;/code&gt; line of an email. Whether receiving servers believe it comes down to a few DNS records, and DMARC is the one that tells them what to do when a message fails authentication.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Free download: &lt;a href="https://runbookfoundry.gumroad.com/l/free-m365-gws-hardening-checklist?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=topcta" rel="noopener noreferrer"&gt;the Microsoft 365 &amp;amp; Google Workspace hardening checklist&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;So I wanted to know: among the most-linked domains on the web, how many still leave that door open?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Short answer: 27.9%.&lt;/strong&gt; Of 974 domains we could audit from the Majestic Million top 1,000, 272 publish no DMARC record, publish one with &lt;code&gt;p=none&lt;/code&gt;, or publish an invalid record. A policy of &lt;code&gt;none&lt;/code&gt; asks receivers to do nothing.&lt;/p&gt;

&lt;h2&gt;
  
  
  Method
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Source list:&lt;/strong&gt; the Majestic Million top 1,000 by GlobalRank, downloaded on October 19, 2026. This is a one-day snapshot.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Attribution (CC BY 3.0):&lt;/strong&gt; "Majestic Million" by Majestic (&lt;a href="https://majestic.com/reports/majestic-million" rel="noopener noreferrer"&gt;https://majestic.com/reports/majestic-million&lt;/a&gt;), licensed under the &lt;a href="https://creativecommons.org/licenses/by/3.0/" rel="noopener noreferrer"&gt;Creative Commons Attribution 3.0 Unported License&lt;/a&gt;. Domains were normalized; no other changes were made to the list.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Checks:&lt;/strong&gt; passive DNS lookups (DMARC, SPF, MX, a set of common DKIM selectors, MTA-STS, TLS-RPT, BIMI) and one HTTPS request per domain. Nothing was sent to any mailbox and nothing was probed.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Coverage:&lt;/strong&gt; 20 of the 1,000 entries are public suffixes rather than registrable domains, so they were skipped. Of the remaining 980, 974 resolved cleanly. One returned NXDOMAIN and five returned DNS errors. &lt;strong&gt;All percentages below are of those 974.&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;"Spoofable"&lt;/strong&gt; means the &lt;em&gt;effective&lt;/em&gt; DMARC policy isn't enforced: the record is missing, says &lt;code&gt;p=none&lt;/code&gt;, or is invalid. Subdomains are judged by the policy they inherit from their organizational domain (&lt;code&gt;sp=&lt;/code&gt; or &lt;code&gt;p=&lt;/code&gt;).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Every figure was recomputed from the per-domain CSV with a short Python script. This post only reports aggregates, and no individual domains are named.&lt;/p&gt;

&lt;h2&gt;
  
  
  Findings
&lt;/h2&gt;

&lt;h3&gt;
  
  
  DMARC policy distribution
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fvtu7tvmp45v8tvul8sym.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fvtu7tvmp45v8tvul8sym.png" alt="DMARC effective policy distribution" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Effective policy&lt;/th&gt;
&lt;th&gt;Domains&lt;/th&gt;
&lt;th&gt;Share&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;reject&lt;/td&gt;
&lt;td&gt;517&lt;/td&gt;
&lt;td&gt;53.1%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;quarantine&lt;/td&gt;
&lt;td&gt;185&lt;/td&gt;
&lt;td&gt;19.0%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;none&lt;/td&gt;
&lt;td&gt;165&lt;/td&gt;
&lt;td&gt;16.9%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;missing&lt;/td&gt;
&lt;td&gt;107&lt;/td&gt;
&lt;td&gt;11.0%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The good news first: &lt;strong&gt;72.1% enforce DMARC&lt;/strong&gt;, and most of them have gone all the way to &lt;code&gt;reject&lt;/code&gt;. Among the biggest sites on the web, enforcement is now the norm.&lt;/p&gt;

&lt;p&gt;The other 27.9% matters, though. These domains are heavily linked, widely recognized, and exactly what a phisher wants to put in a &lt;code&gt;From:&lt;/code&gt; header.&lt;/p&gt;

&lt;h3&gt;
  
  
  Spoofable share by mail provider
&lt;/h3&gt;

&lt;p&gt;We classified each domain by its MX records.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmxrj001koxphxa8zx3a0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmxrj001koxphxa8zx3a0.png" alt="Spoofable share by mail provider" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Provider (from MX)&lt;/th&gt;
&lt;th&gt;Domains&lt;/th&gt;
&lt;th&gt;Spoofable&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Google Workspace&lt;/td&gt;
&lt;td&gt;270&lt;/td&gt;
&lt;td&gt;18.1%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Microsoft 365&lt;/td&gt;
&lt;td&gt;161&lt;/td&gt;
&lt;td&gt;20.5%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Proofpoint&lt;/td&gt;
&lt;td&gt;93&lt;/td&gt;
&lt;td&gt;17.2%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mimecast&lt;/td&gt;
&lt;td&gt;26&lt;/td&gt;
&lt;td&gt;19.2%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Other / self-hosted&lt;/td&gt;
&lt;td&gt;253&lt;/td&gt;
&lt;td&gt;40.7%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;None (no MX or null MX)&lt;/td&gt;
&lt;td&gt;165&lt;/td&gt;
&lt;td&gt;38.2%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;(Zoho had only 6 domains, too few to chart.)&lt;/p&gt;

&lt;p&gt;The pattern: domains on a major hosted platform or a secure email gateway are spoofable about 17-21% of the time. Domains on &lt;strong&gt;other or self-hosted mail are about twice as likely (40.7%)&lt;/strong&gt;. The provider doesn't set your DMARC policy for you, but the big platforms' admin consoles, setup wizards, and bulk-sender documentation all push toward it.&lt;/p&gt;

&lt;p&gt;The "no MX" group is easy to overlook. A domain that never receives mail can still be impersonated in outbound mail. Parked and non-mail domains should publish &lt;code&gt;v=spf1 -all&lt;/code&gt; and &lt;code&gt;p=reject&lt;/code&gt;. It takes two TXT records and costs nothing.&lt;/p&gt;

&lt;h3&gt;
  
  
  The rest of the stack
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;No SPF record:&lt;/strong&gt; 151 domains (15.5%). Another 10 (1.0%) go over SPF's 10-DNS-lookup limit, which makes evaluation return a permanent error.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SPF ending:&lt;/strong&gt; &lt;code&gt;-all&lt;/code&gt; 45.5%, &lt;code&gt;~all&lt;/code&gt; 35.4%, &lt;code&gt;?all&lt;/code&gt; 3.2%.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MTA-STS in enforce mode:&lt;/strong&gt; just &lt;strong&gt;15 domains (1.5%)&lt;/strong&gt;. TLS-RPT: 51 (5.2%). Encrypting mail in transit with downgrade protection is still rare.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;BIMI with a logo:&lt;/strong&gt; 150 (15.4%), 108 of which reference a mark certificate.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Average posture score:&lt;/strong&gt; &lt;strong&gt;62.3 / 100&lt;/strong&gt; on the audit's composite scale. Grade distribution: A 82, B 332, C 304, D 139, F 117.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Why p=none isn't protection
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;p=none&lt;/code&gt; is monitoring mode. It tells receivers: "If a message claiming to be from me fails SPF and DKIM alignment, deliver it anyway, and send me a report." That's a useful &lt;em&gt;first step&lt;/em&gt;, because the reports show you every service that sends mail as your domain. But it's a step, not a destination.&lt;/p&gt;

&lt;p&gt;To a phisher, a domain at &lt;code&gt;p=none&lt;/code&gt; is effectively the same as a domain with no record. Receivers may still apply their own heuristics, but you've explicitly opted out of telling them to reject forgeries. 165 domains in this list (16.9%) are in that state.&lt;/p&gt;

&lt;h2&gt;
  
  
  The bulk-sender rules changed the baseline
&lt;/h2&gt;

&lt;p&gt;The big mailbox providers now set a minimum for high-volume senders:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Gmail&lt;/strong&gt; (&lt;a href="https://support.google.com/a/answer/81126" rel="noopener noreferrer"&gt;Email sender guidelines&lt;/a&gt;): since February 1, 2024, anyone sending more than 5,000 messages a day to personal Gmail accounts needs SPF &lt;em&gt;and&lt;/em&gt; DKIM, a DMARC record ("your DMARC enforcement policy can be set to none"), and a &lt;code&gt;From:&lt;/code&gt; domain aligned with SPF or DKIM. Marketing and subscribed mail must support one-click unsubscribe and show a visible unsubscribe link. Spam rates in Postmaster Tools must stay below 0.30%, and Google recommends staying under 0.10%.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Yahoo&lt;/strong&gt; (&lt;a href="https://senders.yahooinc.com/best-practices/" rel="noopener noreferrer"&gt;Sender Hub requirements&lt;/a&gt;): enforcement began in February 2024 and rolled out gradually. Bulk senders need SPF and DKIM, a valid DMARC policy of "at least p=none" that passes with an aligned &lt;code&gt;From:&lt;/code&gt; domain, one-click unsubscribe (RFC 8058 POST recommended) honored within 2 days, and a spam rate below 0.3%. Yahoo doesn't publish a fixed volume threshold.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Microsoft&lt;/strong&gt; (&lt;a href="https://techcommunity.microsoft.com/blog/microsoftdefenderforoffice365blog/strengthening-email-ecosystem-outlook%e2%80%99s-new-requirements-for-high%e2%80%90volume-senders/4399730" rel="noopener noreferrer"&gt;Outlook.com high-volume sender announcement&lt;/a&gt;, April 2025): domains sending more than 5,000 emails a day to Outlook.com, Hotmail.com and Live.com addresses must pass SPF and DKIM and publish DMARC of at least &lt;code&gt;p=none&lt;/code&gt;, aligned with SPF or DKIM, from May 5, 2025; non-compliant mail goes to Junk at first, with later rejection (&lt;code&gt;550 5.7.515&lt;/code&gt;). Unsubscribe links and list hygiene are listed as recommended practices rather than hard requirements, and no specific spam-rate limit is set.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Note the bar: &lt;strong&gt;&lt;code&gt;p=none&lt;/code&gt; is enough to comply at all three&lt;/strong&gt;. These rules got almost everyone to &lt;em&gt;publish&lt;/em&gt; DMARC, which may be why only 11.0% of this list has no record at all. They didn't make anyone &lt;em&gt;enforce&lt;/em&gt; it. Compliance and protection are two separate milestones.&lt;/p&gt;

&lt;h2&gt;
  
  
  A step-by-step DMARC rollout
&lt;/h2&gt;

&lt;p&gt;Moving to enforcement is mostly an inventory exercise. Here's a sequence that rarely breaks legitimate mail:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Inventory senders.&lt;/strong&gt; List everything that sends as your domain: your mail platform, marketing tools, CRM, ticketing, billing, HR systems, and any servers that send alerts.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fix SPF.&lt;/strong&gt; One record that includes only the services you actually use, under 10 lookups, ending in &lt;code&gt;~all&lt;/code&gt; for now (&lt;code&gt;-all&lt;/code&gt; once you're confident).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Turn on DKIM everywhere.&lt;/strong&gt; Use 2048-bit keys where you can, signing with &lt;em&gt;your&lt;/em&gt; domain (aligned) rather than the vendor's.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Publish &lt;code&gt;p=none&lt;/code&gt; with reporting:&lt;/strong&gt;
&lt;code&gt;v=DMARC1; p=none; rua=mailto:dmarc-reports@yourdomain.example; fo=1&lt;/code&gt;
Send aggregate reports to a mailbox or a DMARC report analyzer.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Watch for 2-4 weeks.&lt;/strong&gt; Every legitimate source should pass aligned SPF or DKIM. Fix the ones that don't.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Move to &lt;code&gt;p=quarantine&lt;/code&gt;&lt;/strong&gt;, optionally ramping with &lt;code&gt;pct=25&lt;/code&gt;, then &lt;code&gt;50&lt;/code&gt;, then &lt;code&gt;100&lt;/code&gt;. Keep reading reports.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Move to &lt;code&gt;p=reject&lt;/code&gt;&lt;/strong&gt;, and set &lt;code&gt;sp=reject&lt;/code&gt; unless subdomains need their own policies.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Keep reporting on.&lt;/strong&gt; New SaaS tools show up all the time, and the reports are how you catch them before they break.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Extras:&lt;/strong&gt; &lt;code&gt;v=spf1 -all&lt;/code&gt; plus &lt;code&gt;p=reject&lt;/code&gt; on every non-mail domain, then MTA-STS and TLS-RPT for transport security.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Limitations
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;DKIM can't be fully enumerated.&lt;/strong&gt; DNS doesn't let you list selectors. The audit checks a set of common ones, so "DKIM not found" doesn't prove DKIM is missing, and we deliberately left DKIM out of the headline.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A snapshot is not a verdict.&lt;/strong&gt; This is public DNS as of October 19, 2026. Records change daily, and a domain at &lt;code&gt;p=none&lt;/code&gt; may be partway through a planned rollout.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Spoofable ≠ spoofed.&lt;/strong&gt; We measured policy, not abuse. Receivers also apply their own reputation filtering.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Provider detection is MX-based.&lt;/strong&gt; A domain can receive mail through one service and send through several others.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The top 1,000 by links isn't the whole internet.&lt;/strong&gt; Long-tail domains may look different.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Resources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://runbookfoundry.gumroad.com/l/free-m365-gws-hardening-checklist?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=resources" rel="noopener noreferrer"&gt;Free Microsoft 365 &amp;amp; Google Workspace hardening checklist&lt;/a&gt;. I make this template.&lt;/li&gt;
&lt;li&gt;DMARC specification: &lt;a href="https://www.rfc-editor.org/rfc/rfc9989" rel="noopener noreferrer"&gt;RFC 9989&lt;/a&gt; (May 2026), which replaces &lt;a href="https://www.rfc-editor.org/rfc/rfc7489" rel="noopener noreferrer"&gt;RFC 7489&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Majestic Million: &lt;a href="https://majestic.com/reports/majestic-million" rel="noopener noreferrer"&gt;majestic.com/reports/majestic-million&lt;/a&gt; (CC BY 3.0)&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Drafted with AI assistance and reviewed for accuracy.&lt;/p&gt;

&lt;p&gt;Not affiliated with Microsoft, Google or Yahoo.&lt;/p&gt;

</description>
      <category>security</category>
      <category>email</category>
      <category>dns</category>
      <category>devops</category>
    </item>
    <item>
      <title>How to Run a Ransomware Tabletop Exercise for a Small Business in 90 Minutes</title>
      <dc:creator>Runbook Foundry</dc:creator>
      <pubDate>Mon, 19 Oct 2026 02:52:45 +0000</pubDate>
      <link>https://dev.to/runbookfoundry/how-to-run-a-ransomware-tabletop-exercise-for-a-small-business-in-90-minutes-4651</link>
      <guid>https://dev.to/runbookfoundry/how-to-run-a-ransomware-tabletop-exercise-for-a-small-business-in-90-minutes-4651</guid>
      <description>&lt;p&gt;Most small businesses have some kind of incident response plan. Far fewer have ever said it out loud with the people who would actually use it. A tabletop exercise fixes that. You get the owner, the office manager, whoever handles IT (in-house or MSP) and the person who talks to customers into one room, read them a realistic ransomware story one piece at a time, and write down every place where they hesitate.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Free download: &lt;a href="https://runbookfoundry.pages.dev/templates/tabletop-scenario?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=topcta" rel="noopener noreferrer"&gt;a free one-page tabletop exercise scenario (account takeover)&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You don't need a consultant, a lab or a full afternoon. This guide shows you how to run one in 90 minutes, and it includes a complete sample scenario you can use as-is.&lt;/p&gt;

&lt;h2&gt;
  
  
  What a tabletop is (and what it isn't)
&lt;/h2&gt;

&lt;p&gt;A tabletop exercise is a facilitated discussion. Nobody touches production systems. The facilitator presents an "inject", a new development in the story, and the group talks through what they would do, who decides, and how they would know.&lt;/p&gt;

&lt;p&gt;It &lt;strong&gt;is&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A safe, no-blame way to test plans, decision rights and contact lists&lt;/li&gt;
&lt;li&gt;Cheap evidence that you practice, which insurers, auditors and larger customers increasingly ask about&lt;/li&gt;
&lt;li&gt;A source of a short, prioritized list of fixes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It &lt;strong&gt;isn't&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A test of individuals or a performance review&lt;/li&gt;
&lt;li&gt;A penetration test or a live restore&lt;/li&gt;
&lt;li&gt;Finished when the meeting ends. The fixes are the point.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Before the session: 30 minutes of prep
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1. Pick a sponsor.&lt;/strong&gt; The owner or a senior manager opens the session and receives the findings. Without a sponsor, people skip it or treat it as an IT meeting.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Pick 5 to 8 participants.&lt;/strong&gt; For a small business that usually means:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Owner or general manager (business decisions, payments, legal contact)&lt;/li&gt;
&lt;li&gt;IT lead or MSP contact (technical response)&lt;/li&gt;
&lt;li&gt;Finance or bookkeeping (payroll, invoicing, bank contacts)&lt;/li&gt;
&lt;li&gt;Office or operations manager (staff communication, phones, facilities)&lt;/li&gt;
&lt;li&gt;Whoever handles customers or marketing (external messages)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;3. Assign three roles that aren't players:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Facilitator&lt;/strong&gt;: reads injects, asks questions, keeps time. Ideally someone who won't be answering.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Scribe&lt;/strong&gt;: records decisions, owners, open questions and gaps.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Timekeeper&lt;/strong&gt;: can be the facilitator, but a visible timer helps.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;4. Gather what people would really reach for:&lt;/strong&gt; the incident response plan (even if it's two pages), the cyber insurance policy and its claims hotline, the list of critical systems, backup details, and the staff and vendor contact list. Print them. If something doesn't exist, that's your first finding.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. Tailor the scenario.&lt;/strong&gt; Replace the bracketed names below with your real systems. A scenario that says "the file server" lands better when it says "the Q: drive on SRV-01".&lt;/p&gt;

&lt;h2&gt;
  
  
  The 90-minute agenda
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Time&lt;/th&gt;
&lt;th&gt;Segment&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;0:00 to 0:05&lt;/td&gt;
&lt;td&gt;Sponsor welcome, purpose, ground rules&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0:05 to 0:10&lt;/td&gt;
&lt;td&gt;Scenario setup and starting assumptions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0:10 to 1:10&lt;/td&gt;
&lt;td&gt;Four injects, about 15 minutes each&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1:10 to 1:25&lt;/td&gt;
&lt;td&gt;Hot wash: what worked, what didn't, top fixes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1:25 to 1:30&lt;/td&gt;
&lt;td&gt;Owners, dates and close&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Read these &lt;strong&gt;ground rules&lt;/strong&gt; aloud at the start:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;No fault, no blame. We are testing the plan, not people.&lt;/li&gt;
&lt;li&gt;Answer with the tools, people and authority you have today, not what you wish you had.&lt;/li&gt;
&lt;li&gt;Decisions don't have to be perfect. Make a call and say why.&lt;/li&gt;
&lt;li&gt;Don't fight the scenario. If a detail doesn't fit, we'll adjust it and move on.&lt;/li&gt;
&lt;li&gt;Findings are reported without names attached.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Free sample scenario: "The Friday Invoice"
&lt;/h2&gt;

&lt;p&gt;This scenario is written for a 10 to 50 person business using a cloud email suite, a shared file server or NAS, and an accounting system. Adjust the details to fit.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Starting assumptions (read aloud):&lt;/strong&gt; It's an ordinary Friday. The office closes at 5 p.m. Backups run nightly. The IT person or MSP is reachable by phone. Nobody has reported anything unusual this week.&lt;/p&gt;

&lt;h3&gt;
  
  
  Inject 1: Friday, 4:40 p.m.
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;The bookkeeper mentions that an "invoice" email from a regular supplier had a link that opened a page asking her to sign in again. She did, then the page went blank. She shrugged and went back to work. Ten minutes later, two staff report that files on the shared drive have strange extensions and won't open.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Discussion questions:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Who is the first person told, and how? Who is told second?&lt;/li&gt;
&lt;li&gt;What is the very first technical action? Who is allowed to take it?&lt;/li&gt;
&lt;li&gt;Do we disconnect anything right now? What exactly, and who decides?&lt;/li&gt;
&lt;li&gt;The bookkeeper's account may be compromised. What do we do with it in the next 15 minutes?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;What good looks like:&lt;/strong&gt; someone clearly owns the call to isolate affected machines. The suspected account gets its password reset and its sessions revoked. Somebody starts a written timeline. The IT contact is reached by phone, not email.&lt;/p&gt;

&lt;h3&gt;
  
  
  Inject 2: Friday, 6:15 p.m.
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;A ransom note appears on the file server and on three desktops. It claims the attackers copied "all finance and HR data" and will publish it in 72 hours unless paid. The office is closed and most staff have gone home.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Discussion questions:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Who do we call now: the insurer's hotline, a breach coach, an incident response firm, the police? In what order? Where are those numbers written down?&lt;/li&gt;
&lt;li&gt;Does anyone have the authority to engage outside help that costs money tonight?&lt;/li&gt;
&lt;li&gt;Who decides whether paying is even on the table, and who must be consulted first?&lt;/li&gt;
&lt;li&gt;What do we tell staff who will arrive on Monday?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;What good looks like:&lt;/strong&gt; the insurer is contacted early, because many policies require notice and sometimes require using approved vendors. Nobody contacts the attackers without legal and insurer guidance. Evidence is preserved rather than wiped in a rush to rebuild.&lt;/p&gt;

&lt;h3&gt;
  
  
  Inject 3: Saturday, 10:00 a.m.
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;The IT lead reports that last night's backup job ran at 11 p.m., after the encryption started, and the backup target was a network share that is now encrypted too. The cloud backup has a copy from Thursday night, but nobody has ever restored more than a single file from it.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Discussion questions:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;How long would a full restore from the Thursday copy take? Has anyone ever measured it?&lt;/li&gt;
&lt;li&gt;What do we restore first? Who decided that order, and is it written down?&lt;/li&gt;
&lt;li&gt;Which systems can the business live without for a week? Which ones for a day?&lt;/li&gt;
&lt;li&gt;How do we make sure we aren't restoring onto machines the attacker still controls?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;What good looks like:&lt;/strong&gt; the group agrees on a recovery order based on business impact, such as accounting, email and then file shares. Someone notes that restore time is unknown and adds a test restore to the action list. Rebuilding is held until the entry point is understood.&lt;/p&gt;

&lt;h3&gt;
  
  
  Inject 4: Monday, 8:30 a.m.
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;A customer calls the front desk. They received an email from your bookkeeper's address asking them to update the bank details for your invoices. A local reporter has also emailed asking for comment about "a data leak".&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Discussion questions:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Who speaks for the company, and what do they say? Is a holding statement ready?&lt;/li&gt;
&lt;li&gt;How do we warn customers about the fraudulent bank-details request without causing panic?&lt;/li&gt;
&lt;li&gt;Who checks whether any payments were already redirected?&lt;/li&gt;
&lt;li&gt;Do we have notification obligations to customers, employees or regulators? Who would know?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;What good looks like:&lt;/strong&gt; one spokesperson. A short holding statement that says only what is known and avoids claims you can't support yet, such as "no data was accessed". A call to the bank. A plan to contact legal counsel about notification duties.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Sample holding statement&lt;/strong&gt; (adapt it and have counsel approve before use):&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"[Company] is responding to a cybersecurity incident affecting some of our systems. We acted quickly to contain it and are working with specialists to restore services safely. If you receive any request to change our payment details, please call us on a number you already have before acting. We will contact anyone directly affected."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Facilitation tips that make the difference
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Read, then wait.&lt;/strong&gt; Silence is uncomfortable. Let it work. Don't answer your own questions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Push for specifics.&lt;/strong&gt; "Who exactly? How would you reach them at 9 p.m. on a Friday? Where is that number written?"&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Add friction if it's too easy.&lt;/strong&gt; "The IT person is on a flight." "The owner's phone is the compromised device."&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bring quiet people in.&lt;/strong&gt; Ask finance and the front desk directly. The best findings often come from them.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Park rabbit holes.&lt;/strong&gt; Write deep technical debates on a parking-lot list and move on.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The hot wash (15 minutes)
&lt;/h2&gt;

&lt;p&gt;Ask these five questions and have the scribe capture the answers:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;What worked well that we should keep?&lt;/li&gt;
&lt;li&gt;Where did we hesitate, and why?&lt;/li&gt;
&lt;li&gt;What information did we need but couldn't find?&lt;/li&gt;
&lt;li&gt;Which decisions had no clear owner?&lt;/li&gt;
&lt;li&gt;If this happened tomorrow, what one thing would we want fixed first?&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Turning findings into action
&lt;/h2&gt;

&lt;p&gt;The exercise is only worth the fixes it produces. Within a week, write a one-page after-action summary:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Date, scenario and participants&lt;/strong&gt; (roles, not names, if you prefer)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Top 3 to 5 findings&lt;/strong&gt;, each written as a gap: "No one knew the insurer's claims hotline number."&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;One action per finding&lt;/strong&gt;, with an owner and a due date&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;When you'll check progress&lt;/strong&gt;, for example at 30 and 90 days&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Typical first-exercise actions for small businesses:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;[ ] Print an emergency contact sheet (IT, MSP, insurer hotline, bank, counsel) and store it offline&lt;/li&gt;
&lt;li&gt;[ ] Confirm you can still sign in if your admin accounts are locked or compromised, and write down the emergency-access (break-glass) steps so that scenario is quick to test&lt;/li&gt;
&lt;li&gt;[ ] Do a full test restore of one critical system and time it&lt;/li&gt;
&lt;li&gt;[ ] Keep at least one backup copy that is offline or immutable, not just a network share&lt;/li&gt;
&lt;li&gt;[ ] Write down who can approve emergency spending and engage outside responders&lt;/li&gt;
&lt;li&gt;[ ] Prepare a holding statement and name one spokesperson&lt;/li&gt;
&lt;li&gt;[ ] Add a "call to confirm" rule for any change to payment details&lt;/li&gt;
&lt;li&gt;[ ] Turn on multi-factor authentication for every email account, starting with finance and admins&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Run another exercise in six months with a different scenario, such as a compromised cloud account or a supplier outage. Compare your scores. Getting better is the evidence.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Resources:&lt;/strong&gt; &lt;a href="https://runbookfoundry.gumroad.com/l/free-m365-gws-hardening-checklist?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=resources" rel="noopener noreferrer"&gt;Free M365 + Google Workspace hardening checklist&lt;/a&gt; · &lt;a href="https://runbookfoundry.pages.dev/templates/tabletop-scenario?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=resources" rel="noopener noreferrer"&gt;Free one-page tabletop exercise scenario&lt;/a&gt;. I make these templates.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Drafted with AI assistance and reviewed for accuracy.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Not affiliated with Microsoft or Google.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>security</category>
      <category>ransomware</category>
      <category>sysadmin</category>
      <category>tutorial</category>
    </item>
  </channel>
</rss>
