← Help Home

TATER Tuning — M365 Tenant Tuning Setup

Apply the Tuning dial model to your M365 tenant. 8 product lines, automatic enforcement, automatic drift detection.

What this is

The TATER Tuning page (Security → TATER Tuning) shows two kinds of columns:

Both column types share the same dial UX, the same level-up workflow, and (after rollout) the same Phase 6 self-healing loop (drift detected → MonitoringFinding open → clears auto-resolve the next cycle).

Rollout checklist

This needs to be done once per tenant (i.e. per Caron Bletzer, per TATER Security, etc.). After it's wired, every dial change on a tenant column gets enforced automatically on the next runbook cycle.

Prerequisites

Step 1 — Upload the runbook

From the repo:

az automation runbook create \
  --name "Run-Tenant-Tuning" \
  --resource-group rg-tater-prod \
  --automation-account-name <aa-name> \
  --type PowerShell \
  --runbook-content @Runbooks/Run-Tenant-Tuning.ps1

az automation runbook publish \
  --name "Run-Tenant-Tuning" \
  --resource-group rg-tater-prod \
  --automation-account-name <aa-name>

Step 2 — Set the OrgName variable

The runbook needs to tag findings with a human-readable label (e.g. "Caron Bletzer"). The other vars (ApiBaseUrl, ApiKey, StorageAccountName, KeyVaultName, CertName, AppClientId, TenantDomain, OrganizationId) are inherited from your existing Scan-M365Cloud setup.

az automation variable create \
  --name "OrgName" \
  --resource-group rg-tater-prod \
  --automation-account-name <aa-name> \
  --value "Caron Bletzer"

Step 3 — Schedule daily

Daily at 4 AM ET (an hour after Scan-Endpoints, two after Scan-M365Cloud):

az automation schedule create \
  --name "daily-tenant-tuning" \
  --resource-group rg-tater-prod \
  --automation-account-name <aa-name> \
  --frequency Day --interval 1 \
  --start-time "2026-06-10T04:00:00-04:00"

az automation runbook schedule link \
  --runbook-name "Run-Tenant-Tuning" \
  --schedule-name "daily-tenant-tuning" \
  --resource-group rg-tater-prod \
  --automation-account-name <aa-name>

Step 4 — Test fire

Trigger the runbook once manually:

az automation runbook start \
  --name "Run-Tenant-Tuning" \
  --resource-group rg-tater-prod \
  --automation-account-name <aa-name>

Watch the job in Azure Portal. The output stream should show:

[TenantTuning] Org <orgId> has N tenant apps configured.
[TenantTuning] Graph connected.
[TenantTuning] EXO connected.
[TenantTuning] SPO connected.
─── [defender-m365] Level 2 — 5 script(s) ───
  Running REM_DEF_SafeLinks.ps1 ...
  ...
[TenantTuning] State accepted. findingsCreated=0 findingsResolved=0
[TenantTuning] Done.

What you'll see in TATER after the first run

How drift detection works for tenant cells

Same 3-consecutive-cycles rule as device drift. A control failing enforcement on day 1 just gets logged. Day 2, logged. Day 3 — MonitoringFinding opens at the appropriate severity (Defender + Entra = High; Exchange + SharePoint = Medium; Power BI / Purview = Medium; Teams / Power Platform = Low). When the runbook reports clean on a subsequent day, the finding auto-resolves.

Risk-accept overrides on tenant cells

Identical workflow to device cells: open the cell, list the control id (the REM filename without .ps1) in the Risk-accept overrides section, add a reason and expiry. The runbook skips it on the next cycle and any open finding resolves the cycle after.

Limitations today

Last updated 2026-06-09