Home > Docs > Best Practices > Security > Zero-Trust Blueprint
π‘οΈ Zero-Trust Architecture Blueprint for Microsoft Fabric¶
NIST 800-207 Zero Trust Principles β Fabric Implementation β Wave 5
Last Updated: 2026-04-27 | Version: 1.0.0 | Sibling of: SOC 2 Type II Readiness (Wave 5 anchor)
Disclaimer: This document provides architectural and technical guidance for designing a zero-trust posture on Microsoft Fabric. It is not a turn-key control set β every organization must tune Conditional Access, device compliance, and policy-as-code to its own risk tolerance, regulatory regime, and user population. Validate every policy in audit-only mode before enforcement.
π Table of Contents¶
- π― Overview
- π Why Zero Trust for Fabric
- ποΈ The Six Zero-Trust Pillars
- ποΈ Reference Architecture
- π Pillar 1 β Identity
- π» Pillar 2 β Devices & Endpoints
- π Pillar 3 β Network
- π¦ Pillar 4 β Applications
- π Pillar 5 β Data
- ποΈ Pillar 6 β Infrastructure
- π Continuous Verification
- πΊοΈ Implementation Roadmap (Crawl/Walk/Run)
- π Conditional Access Policy Bundles
- β Validation Tests
- π° Casino Implementation
- ποΈ Federal Implementation
- π« Anti-Patterns
- π Implementation Checklist
- π References
π― Overview¶
Zero Trust is a security model that replaces the traditional "trust the network perimeter" assumption with a posture of continuous, contextual verification of every access request. The canonical formulation is NIST SP 800-207 β the U.S. federal reference architecture β and Microsoft's commercial implementation builds on it via Entra ID, Conditional Access, Defender, Purview, and Workspace Identity.
The Three NIST 800-207 Tenets¶
| Tenet | What It Means | Fabric Translation |
|---|---|---|
| Verify explicitly | Every access request is authenticated, authorized, and inspected based on all available context (identity, device, location, workload, data classification, behavior) | Conditional Access evaluates user, device, sign-in risk, and resource on every Fabric Portal / API request |
| Use least-privilege access | Just-enough-access (JEA) and just-in-time (JIT) only; no standing privileges | PIM-elevated Fabric admin roles, Workspace Identity scoped to a single workspace, OneLake row/column filters |
| Assume breach | Minimize blast radius via segmentation, encrypt end-to-end, drive analytics to detect anomalies | Private Endpoints, OAP, CMK, Defender for Cloud + Sentinel telemetry from Workspace Monitoring |
What This Document Covers¶
- The six pillars of the Microsoft Zero-Trust model mapped to concrete Fabric configuration
- A reference architecture you can adapt to your tenant
- A crawl/walk/run roadmap so you don't try to land everything at once
- Five+ ready-to-deploy Conditional Access policy JSON bundles
- Validation tests you can run quarterly to prove enforcement
- Casino and Federal applied examples (CTR/SAR data, FedRAMP, HIPAA, DOJ restricted)
π Scope: This is the zero-trust blueprint sibling to the SOC 2 Type II readiness anchor. Other Wave 5 docs cover STRIDE threat modeling, data exfiltration prevention, audit trail immutability, and the privacy-rights pair (GDPR, CCPA). This doc relies on the existing Identity & RBAC, Network Security, OAP, and CMK deep-dives β read those first if you have not already.
π Why Zero Trust for Fabric¶
The traditional perimeter β the corporate VPN, a hardened firewall, "everything inside is trusted" β does not exist for a SaaS analytics platform like Fabric:
| Old Assumption | Why It Fails for Fabric |
|---|---|
| "Users are inside the corporate network" | Fabric Portal is app.fabric.microsoft.com, always reached via public DNS β VPN does not gate it |
| "Service-to-service traffic is trusted by default" | Fabric workspaces talk to ADLS Gen2, Key Vault, Purview, Eventhouse across Azure regions and tenants |
| "Devices on the LAN are managed" | BYOD, contractors, and partner auditors all need access from devices you do not own |
| "Once authenticated, the session is trusted" | Token-theft attacks (AitM phishing, device-code abuse, refresh-token replay) bypass MFA at sign-in |
| "Production data stays in production" | Notebook downloads, pipeline copy activities, and Power BI exports leak data sideways |
Zero trust addresses each gap explicitly: identity is the new perimeter, devices are continuously evaluated, network paths are private and inspected, and every session is re-evaluated against current risk.
Threat Classes Mitigated¶
| Threat | Zero-Trust Mitigation |
|---|---|
| Credential theft / password spray | Phishing-resistant MFA + risk-based Conditional Access |
| AitM / token replay | Continuous Access Evaluation (CAE), short token lifetimes, device binding |
| Lateral movement | Workspace Identity (per-workspace scope), OneLake Security row/column filters |
| Data exfiltration via copy/export | OAP + tenant-export controls + sensitivity labels + DLP |
| Insider misuse | PIM JIT + access reviews + Defender for Identity anomaly detection |
| Compromised SP / leaked secret | Workspace Identity (no shared secrets) + federated credentials for CI/CD |
| Misconfiguration drift | Bicep policy-as-code + Defender for Cloud assessment |
ποΈ The Six Zero-Trust Pillars¶
Microsoft's Zero-Trust model splits the NIST tenets across six implementation pillars. Every pillar must be advanced together β partial coverage leaves obvious gaps an attacker can pivot through.
| Pillar | Question Answered | Primary Fabric Controls |
|---|---|---|
| π Identity | Who is making the request? | Entra ID, MFA, Conditional Access, PIM, Workspace Identity |
| π» Devices / Endpoints | What device is the request coming from? | Intune compliance, device-bound tokens, app protection policies |
| π Network | What network path is being used? | Private Endpoints, Workspace IP firewall, OAP, VNet integration |
| π¦ Applications | Which app is being accessed and how? | App-only auth, API throttling, Lakehouse SQL endpoint scopes |
| π Data | What is the classification and is it protected? | Purview labels, CMK, OneLake Security, DLP, tokenization |
| ποΈ Infrastructure | Is the platform itself hardened and observed? | Bicep IaC + policy-as-code, Defender for Cloud, Workspace Monitoring |
Maturity rule: Score each pillar Crawl / Walk / Run independently. A "Run" identity story with a "Crawl" data story still leaks.
ποΈ Reference Architecture¶
flowchart TB
subgraph User["π€ User Access"]
Device[End-User Device]
Compl{Intune<br/>Compliant?}
end
subgraph IdP["π Identity Plane"]
Entra[Entra ID]
CA[Conditional Access]
MFA[Phishing-Resistant MFA]
PIM[PIM JIT Elevation]
Risk[ID Protection<br/>Sign-in Risk]
end
subgraph SvcId["π€ Service Identity"]
WI[Workspace Identity]
FedCred[Federated Credentials<br/>OIDC]
end
subgraph Net["π Network Plane"]
IPF[Workspace IP Firewall]
PE[Private Endpoints]
OAP[Outbound Access Protection]
MV[Managed VNet]
end
subgraph Fabric["π¦ Microsoft Fabric"]
Portal[Fabric Portal / API]
WS[Workspace]
OL[(OneLake)]
Spark[Spark / Pipelines]
end
subgraph Data["π Data Plane"]
Labels[Purview Sensitivity Labels]
CMK[Customer-Managed Keys]
OLS[OneLake Security<br/>Row/Column]
DLP[DLP Policies]
end
subgraph Cont["π Continuous Verification"]
CAE[Continuous Access<br/>Evaluation]
Defender[Defender for Cloud<br/>+ Defender for Identity]
Sentinel[Microsoft Sentinel]
WM[Workspace Monitoring]
end
Device --> Compl
Compl -->|Yes| CA
Compl -->|No| Block1[β Blocked]
CA --> MFA
MFA --> Risk
Risk --> PIM
PIM --> Portal
WI --> Spark
FedCred --> WI
Portal --> IPF
IPF --> WS
WS --> PE
PE --> OL
Spark --> MV
MV --> OAP
OL --> Labels
OL --> CMK
OL --> OLS
Labels --> DLP
Portal -.->|Telemetry| Cont
WS -.->|Telemetry| Cont
OL -.->|Telemetry| Cont
CAE -.->|Re-evaluate session| CA
style Block1 fill:#ea4335,color:#fff What This Diagram Says, in Plain English¶
- The user device must be Intune-compliant before Conditional Access even evaluates the sign-in.
- Conditional Access stacks MFA, sign-in-risk evaluation, and PIM JIT elevation on top of authentication.
- Service-to-service traffic uses Workspace Identity β no client secrets stored anywhere.
- The network layer is private by default: Private Endpoints inbound, OAP outbound, IP firewall on the workspace.
- Data is labelled, encrypted with CMK, filtered by OneLake Security, and DLP-policed.
- Every action is telemetered to Defender + Sentinel, and Continuous Access Evaluation revokes sessions in near-real-time when risk changes.
π Pillar 1 β Identity¶
The identity perimeter is the only perimeter that travels with the user. Get this pillar wrong and nothing else matters.
1.1 Tenant Foundations¶
| Requirement | Implementation |
|---|---|
| Sync source of truth | Entra ID with Password Hash Sync (PHS) or Pass-Through Auth (PTA) β never federation-only without backup |
| Break-glass accounts | Minimum 2 cloud-only Global Admins, exempt from CA, secrets in offline vault, monitored by Sentinel |
| User lifecycle | HR-driven joiner/mover/leaver via Entra ID lifecycle workflows or SCIM |
| Guest access | Cross-tenant Access Settings restrict B2B to allowlisted partner tenants |
1.2 Authentication Strength¶
| Strength Tier | Method | Use For |
|---|---|---|
| Phishing-resistant | FIDO2 security keys, Windows Hello for Business, Platform SSO with hardware-bound key, certificate-based auth (PIV/CAC) | All Fabric admins, federal users, high-risk roles |
| Passwordless | Microsoft Authenticator (passwordless), Authenticator Lite | All standard Fabric users |
| MFA (push or OTP) | Authenticator push w/ number-match, OATH TOTP, hardware token | Fallback only β disable SMS/voice |
| Password-only | β Not acceptable for any Fabric access |
MFA is mandatory, not optional. Microsoft's enforced MFA rollout already covers the Fabric Portal as of 2024-25. Verify your tenant has not granted exclusion exemptions.
1.3 Risk-Based Conditional Access¶
Entra ID Identity Protection scores user risk (account compromise indicators) and sign-in risk (anomalous session signals). Wire both into Conditional Access:
| Risk Level | Sign-In Action | User Action |
|---|---|---|
| Low | Standard MFA | None |
| Medium | Step-up to phishing-resistant MFA | Notify, require password change at next sign-in |
| High | Block sign-in OR require step-up + compliant device | Force secure password change with MFA |
See Policy 5 below for the JSON.
1.4 Privileged Identity Management (PIM)¶
Standing admin rights are zero-trust kryptonite. Enforce JIT for every Fabric-relevant role:
| Role | Activation Window | Approval Required | MFA on Activation |
|---|---|---|---|
| Fabric Administrator | 4 hours max | β (security manager) | Phishing-resistant |
| Capacity Admin | 4 hours max | β | Phishing-resistant |
| Workspace Admin (sensitive workspaces) | 8 hours max | β | Phishing-resistant |
| Power Platform Admin | 4 hours max | β | Phishing-resistant |
| Global Admin (break-glass excluded) | 1 hour max | β (CISO + ticket ID) | Phishing-resistant |
1.5 Service Identity β Eliminate Shared Secrets¶
| Old Pattern (avoid) | New Pattern (zero-trust) |
|---|---|
| Service Principal client secret in Key Vault | Workspace Identity scoped per-workspace |
| Service Principal secret in GitHub Secrets | Federated credentials (OIDC) β no secret at all |
| Long-lived API keys for ADLS shortcuts | Workspace Identity + RBAC on the storage account |
| Per-user PAT for fabric-cicd | Workload Identity Federation from GitHub Actions |
The infra/modules/security/workspace-identity.bicep module deploys a user-assigned managed identity wired with Key Vault Secrets User, Storage Blob Data Contributor, and (optionally) Purview Data Curator role assignments β exactly the JIT-scoped service identity the zero-trust model wants.
1.6 Identity Governance¶
| Practice | Cadence | Owner |
|---|---|---|
| Access review for Fabric admin roles | Quarterly | Security |
| Access review for sensitive workspace membership | Quarterly | Workspace Admin |
| Access review for guest accounts touching Fabric | Monthly | Data Steward |
| Service Principal / Workspace Identity inventory | Monthly | Platform team |
| Stale account cleanup (>90 days inactive) | Monthly (automated) | Identity team |
π» Pillar 2 β Devices & Endpoints¶
A trusted user on an untrusted device is still untrusted.
2.1 Device Compliance Baseline (Intune)¶
| Setting | Required Value | Why |
|---|---|---|
| OS version | Within N-1 of latest | Patched against known CVEs |
| Disk encryption | BitLocker / FileVault on | Protect data at rest if device is stolen |
| Firewall | Enabled | Reduce LAN exposure |
| Antimalware | Defender for Endpoint (or equivalent) signed-in | EDR telemetry |
| Screen lock | β€ 15 minutes idle | Reduce shoulder-surf and walk-away risk |
| Jailbreak / root detection | Block | Prevent OS-level exploits |
| Threat level | "Low" or below from MDE | Block known-compromised devices |
2.2 Conditional Access β Require Compliant Device¶
The non-negotiable Fabric policy: a non-compliant device cannot sign in to the Fabric Portal. See Policy 3.
2.3 Unmanaged & BYOD Devices¶
| Scenario | Allowed? | Control |
|---|---|---|
| Personal device, no Intune | Read-only via App Protection Policies (Mobile Application Management) for Power BI Mobile / Office | Block download, copy/paste fence to corporate apps only |
| Personal Windows / Mac | Block by default; allow per-exception with VDI (Windows 365 / AVD) | Session policies (Defender for Cloud Apps reverse proxy) |
| Contractor laptop | Must be enrolled in your tenant Intune or use vetted partner device | Time-bound CA exemption with quarterly review |
2.4 Mobile Application Management (MAM)¶
Even if the device is unmanaged, the app can be protected:
| MAM Control | Effect |
|---|---|
| Require app PIN | Adds an authentication step on the Fabric/Power BI mobile app |
| Block save-to-personal-storage | Prevents copy of dashboard data to personal OneDrive |
| Encrypt org data at rest | App-managed encryption inside the Fabric/PBI mobile app |
| Selective wipe on departure | Removes corporate data without touching personal data |
π Pillar 3 β Network¶
3.1 Inbound β Private by Default¶
| Surface | Control | Reference |
|---|---|---|
| Fabric Portal access | Workspace IP firewall (allow only corp egress + VPN) | Network Security Β§ IP Firewall |
| ADLS Gen2 / Key Vault / Event Hubs | Private Endpoints + Private DNS | Network Security Β§ Private Endpoints |
| Spark / Pipelines / Dataflows | Managed VNet with managed private endpoints | Network Security Β§ Managed VNet |
| On-prem data sources | Self-Hosted Integration Runtime (outbound HTTPS only) | Network Security Β§ On-Premises |
3.2 Outbound β Default Deny, Explicit Allow¶
This is what stops a compromised notebook from exfiltrating Bronze data to an attacker-controlled storage account.
- OAP enabled at every production workspace; default action Deny
- Explicit allowlist of approved ADLS Gen2 accounts and containers
- Cross-workspace allowlist restricted to same domain (casino β casino, federal-USDA β shared-gold ReadOnly)
- Connector allowlist limited to Fabric-native + approved Azure services
- No generic HTTP / FTP / SFTP connectors in regulated workspaces
See the full pattern in Outbound Access Protection.
3.3 Public Exposure Audit¶
A zero-trust workspace has zero public-facing data plane. Quarterly checklist:
- Every storage account:
publicNetworkAccess: Disabled - Every Key Vault:
publicNetworkAccess: Disabled - Every Event Hub namespace: Private Endpoint only
- Every SQL Database (Fabric SQL DB and Azure SQL): Private Endpoint only
- OneLake exposure: workspace-scoped only, no anonymous shortcuts
- Power BI tenant setting "Allow public Internet access": Disabled for sensitive workspaces
π¦ Pillar 4 β Applications¶
4.1 App-Only Authentication¶
Every non-interactive Fabric workload β pipelines that call REST APIs, custom apps that read OneLake, GraphQL endpoints β uses Workspace Identity (preferred) or a federated-credential Service Principal (fallback). No client secrets.
// Example excerpt β see infra/modules/security/workspace-identity.bicep for the full module
module wsIdentity '../security/workspace-identity.bicep' = {
name: 'wsIdentity-${workloadName}'
params: {
location: location
projectPrefix: projectPrefix
environment: environment
enableKeyVaultAccess: true
keyVaultId: keyVault.id
enableStorageAccess: true
storageAccountId: storage.id
enablePurviewAccess: true
purviewAccountId: purview.id
}
}
4.2 API Throttling & Rate Limiting¶
| Surface | Default Throttle | Action on Burst |
|---|---|---|
| Fabric REST API | Microsoft-managed, but tenant capacity may saturate | Use exponential backoff in clients; alert via capacity throttling runbook |
| GraphQL API for Fabric | Rate-limit per app registration | Defender for Cloud Apps custom alert if > N rps from single SP |
| Lakehouse SQL endpoint | Capacity-bound | Workspace Monitoring KQL alert on long-running query count |
| Power BI dataset refresh | Per-workspace concurrency | Schedule staggered refresh; semantic-link API for orchestration |
4.3 Application-Layer Authorization¶
| Endpoint | Authorization Layer |
|---|---|
| Lakehouse SQL endpoint | OneLake Security row/column filters + GRANT/REVOKE on schemas |
| GraphQL API | Per-field role mapping; signed-in identity propagated to underlying SQL endpoint |
| Power BI report | Workspace role + dataset RLS + report-level item permissions |
| Eventhouse query | Database-level principals; KQL row-level policies |
| Notebook | Workspace role + Lakehouse permissions on tables read/written |
Cross-reference: Identity & RBAC Patterns Β§ Data Security covers RLS / CLS / OLS implementation in depth.
π Pillar 5 β Data¶
5.1 Classification β You Cannot Protect What You Have Not Labelled¶
| Class | Examples (Casino) | Examples (Federal) | Required Controls |
|---|---|---|---|
| Public | Marketing site, published reports | NOAA public datasets | TLS in transit; integrity hash |
| Internal | Aggregated KPI dashboards | Aggregated agency stats | TLS, workspace RBAC |
| Confidential | Player profile, slot performance | CUI, FOUO | TLS, workspace RBAC, OneLake row filter |
| Highly Confidential | CTR, SAR, W-2G filings; unhashed PII | PHI (Tribal Health), DOJ restricted, FedRAMP CUI | TLS, OLS hidden, CMK, DLP, audit |
Apply via Microsoft Purview sensitivity labels at workspace, lakehouse, and item granularity.
5.2 Encryption at Rest β Customer-Managed Keys¶
CMK with key rotation gives you the cryptographic kill switch when something goes wrong. Detailed configuration is in Customer-Managed Keys. Zero-trust requirements:
- Key Vault behind Private Endpoint only
- Key rotation policy: β€ 90 days for Highly Confidential, β€ 365 days for Confidential
- Key access audited to Sentinel
- Soft-delete + purge protection enabled
- Break-glass key recovery procedure tested annually
5.3 Encryption in Transit¶
- TLS 1.2+ enforced on every Fabric endpoint (Microsoft default β verify, don't assume)
- For US Federal workloads in regulated regions: TLS 1.2 with FIPS 140-2 / 140-3 validated cipher suites
- Internal east-west Spark traffic: encrypted within the Managed VNet
- On-premises gateway β Azure: TLS 1.2 on all SHIR connections
5.4 Row-Level / Column-Level / Object-Level Security¶
OneLake Security and DAX/SQL row filters together enforce least-privilege visibility:
| Layer | When To Use | Example |
|---|---|---|
| OLS | Hide entire tables from non-cleared users | Hide fact_ctr_filings from non-compliance users |
| CLS | Mask columns in shared tables | Hide ssn_hash from analysts |
| RLS | Restrict rows by user identity | Floor manager sees only their property |
5.5 Data Loss Prevention (DLP)¶
| DLP Surface | Action |
|---|---|
| Power BI export | Block export for "Highly Confidential" labelled datasets |
| Microsoft 365 (Teams, Outlook) | Block sharing of Fabric-exported files matching CTR/SAR/PHI patterns |
| Defender for Cloud Apps | Real-time session policy: block download from unmanaged device |
| Purview DLP | Detect SSN / credit-card / NPI patterns in OneLake files; alert + auto-label |
5.6 Tokenization & Pseudonymization¶
For sensitive identifiers that still need referential integrity:
| Technique | Use Case | Reversibility |
|---|---|---|
| Hash with secret salt (HMAC-SHA-256) | Player SSN, patient MRN | Irreversible (one-way) |
| Format-preserving encryption (FPE) | Card number for analytics | Reversible with key |
| Format-preserving tokenization | Cross-system join key | Reversible via vault |
| K-anonymity aggregation | Geographic / demographic reporting | One-way |
Reminder: Phase 11 fixed the SSN-hash salt to require the
FABRIC_POC_HASH_SALTenv var β do not regress that. Hard-coding the salt voids the pseudonymization guarantee.
ποΈ Pillar 6 β Infrastructure¶
6.1 Policy-as-Code¶
Every zero-trust control above must be expressible as Bicep + Azure Policy. Drift detection comes for free.
| Control | Bicep Module | Policy Initiative |
|---|---|---|
| Private Endpoints required | infra/modules/network/private-endpoint.bicep | "Storage accounts should disable public network access" |
| CMK | infra/modules/security/key-vault.bicep (Wave 1) | "Storage accounts should use customer-managed key" |
| Workspace Identity | infra/modules/security/workspace-identity.bicep | "Managed identities should be enabled on Fabric workspaces" |
| TLS 1.2+ | Storage / SQL deployment params | "Storage accounts should require TLS 1.2" |
| Diagnostic settings | infra/modules/monitoring/log-analytics-workspace.bicep (Wave 1) | "Diagnostic logs should be enabled" |
6.2 Defender for Cloud¶
Enable Defender plans for the resources Fabric depends on:
- Defender for Storage β flags malware in Bronze landings, anomalous access patterns
- Defender for Key Vault β alerts on suspicious key access (e.g., from new IP, after-hours)
- Defender for SQL β covers Fabric SQL Database and Azure SQL mirrored sources
- Defender for Resource Manager β flags suspicious resource-management API calls
- Defender CSPM β continuous Secure Score, regulatory compliance dashboards
Findings stream to Sentinel for cross-correlation with Fabric audit logs.
6.3 Continuous Configuration Assessment¶
Quarterly drift-detection routine:
# Bicep what-if against the deployed state β anything different is drift
az deployment sub what-if \
--location eastus2 \
--template-file infra/main.bicep \
--parameters infra/environments/prod/prod.bicepparam
# Azure Policy compliance scan
az policy state summarize --management-group-id <mg-id>
# Defender Secure Score trend
az security secure-scores list
π Continuous Verification¶
Authentication at the front door is not enough β the session must be re-evaluated as context changes.
7.1 Continuous Access Evaluation (CAE)¶
Entra ID + critical Microsoft services (including Fabric / Power BI) revoke active tokens within ~minutes when:
- User account is disabled or password changed
- User risk rises to High
- IP address moves to a blocked location
- Device falls out of compliance mid-session
No customer config required for the CAE protocol itself, but you must:
- Use CAE-aware clients (Power BI Desktop β₯ 2.118, Fabric Portal β yes; older custom REST clients β verify)
- Tune session lifetime via Conditional Access (see Policy 6)
7.2 Risk-Based Step-Up¶
Use sign-in-risk and user-risk signals to dynamically demand stronger auth mid-session:
Low risk β Allow with current MFA
Medium risk β Step up to phishing-resistant MFA
High risk β Force password reset + block until reset complete
7.3 Session Controls¶
| Control | Setting | Where |
|---|---|---|
| Sign-in frequency | 4 hours for sensitive workspaces, 24h standard | Conditional Access session controls |
| Persistent browser | Disabled for shared devices, kiosks | Conditional Access session controls |
| Token lifetime | Defaults are fine if CAE-aware client; otherwise tighten via Token Lifetime Policy | Entra ID PowerShell |
7.4 Anomaly Detection¶
| Source | Detects |
|---|---|
| Defender for Identity | On-prem AD reconnaissance, golden ticket, lateral movement (if Entra Connect deployed) |
| Defender for Cloud Apps | Impossible travel, mass download, suspicious OAuth grant, ransomware pattern |
| Microsoft Sentinel | Cross-source correlation: Fabric audit + Entra sign-in + Defender alerts |
| Workspace Monitoring | Anomalous query volume, unusual capacity bursts, off-hours admin activity |
| Purview audit | Sensitivity-label downgrade, mass delete, unusual export |
πΊοΈ Implementation Roadmap (Crawl/Walk/Run)¶
You will fail if you try to land all six pillars at once. Sequence the rollout.
π£ Crawl β Foundations (Weeks 1-4)¶
- MFA enforced for all Fabric users (no exceptions other than monitored break-glass)
- Conditional Access policies in Report-Only mode for one full sign-in cycle (~7 days)
- Block legacy authentication (Policy 1)
- Require MFA for admin roles (Policy 2)
- Workspace Identity enabled on new Fabric workspaces
- Break-glass accounts created, secrets in offline vault, monitored
- Defender for Cloud "Foundational" plan on Fabric subscription
πΆ Walk β Hardening (Weeks 5-12)¶
- Promote CA policies to Enforce after Report-Only triage
- Intune device compliance baseline rolled out; require compliant device for Fabric (Policy 3)
- Block sign-in from anonymous IPs / Tor (Policy 4)
- Private Endpoints + Private DNS for all data-tier resources (ADLS, KV, EH, SQL)
- Workspace IP firewall enabled per workspace
- OAP enabled in production workspaces; default-deny outbound
- Sensitivity labels applied at workspace + Highly Confidential items
- Migrate existing Service Principals to Workspace Identity / federated credentials
- PIM JIT for Fabric Administrator + Capacity Admin roles
- Defender for Storage + Defender for Key Vault enabled
π Run β Continuous Verification (Weeks 13-26)¶
- CAE-aware everywhere (verify legacy REST clients)
- High-risk sign-in step-up policy (Policy 5)
- High-risk user β password change (Policy 7)
- Session controls for sensitive workspaces (Policy 6)
- Sentinel ingestion of Entra sign-in + Fabric audit + Defender alerts
- Policy-as-code: Azure Policy initiatives enforce all six pillars
- Quarterly access reviews running, evidence captured for SOC 2
- Quarterly validation tests (see Β§ Validation Tests)
- Deception: honeypot Lakehouse table + alert on any read
- DLP policies enforced at Power BI export, Teams share, M365 outbound
π Conditional Access Policy Bundles¶
Every JSON below is a starting template. Test in Report-Only mode before enforcement. Replace GUIDs / group names with your tenant's values. Names follow the pattern CA-{Scope}-{Action}-{Target}.
Policy 1 β Block Legacy Authentication¶
Legacy auth (POP, IMAP, SMTP, Exchange ActiveSync, basic auth) does not support MFA. Block it everywhere as the first move.
{
"displayName": "CA-All-Block-LegacyAuth",
"state": "enabled",
"conditions": {
"users": {
"includeUsers": ["All"],
"excludeUsers": ["<break-glass-1-objectid>", "<break-glass-2-objectid>"]
},
"applications": {
"includeApplications": ["All"]
},
"clientAppTypes": [
"exchangeActiveSync",
"other"
]
},
"grantControls": {
"operator": "OR",
"builtInControls": ["block"]
}
}
Deploy via PowerShell:
Connect-MgGraph -Scopes "Policy.ReadWrite.ConditionalAccess"
$body = Get-Content .\policies\ca-block-legacyauth.json -Raw
Invoke-MgGraphRequest -Method POST `
-Uri "https://graph.microsoft.com/v1.0/identity/conditionalAccess/policies" `
-Body $body -ContentType "application/json"
Policy 2 β Require MFA for Fabric Admin Roles¶
Phishing-resistant MFA for any directory role that can change tenant-wide Fabric settings.
{
"displayName": "CA-FabricAdmins-Require-PhishingResistantMFA",
"state": "enabled",
"conditions": {
"users": {
"includeRoles": [
"62e90394-69f5-4237-9190-012177145e10",
"f28a1f50-f6e7-4571-818b-6a12f2af6b6c",
"a9ea8996-122f-4c74-9520-8edcd192826c"
]
},
"applications": {
"includeApplications": [
"00000009-0000-0000-c000-000000000000",
"871c010f-5e61-4fb1-83ac-98610a7e9110"
]
}
},
"grantControls": {
"operator": "AND",
"authenticationStrength": {
"id": "00000000-0000-0000-0000-000000000004"
}
}
}
Role GUIDs above: Global Admin / Fabric Administrator / Power Platform Admin. App GUIDs: Power BI Service / Microsoft Fabric. Verify in your tenant before deploying.
Policy 3 β Require Compliant Device for Fabric¶
The hard rule: no compliant device, no Fabric.
{
"displayName": "CA-AllUsers-Require-CompliantDevice-Fabric",
"state": "enabled",
"conditions": {
"users": {
"includeUsers": ["All"],
"excludeGroups": ["<sg-fabric-mam-byod-objectid>"],
"excludeUsers": ["<break-glass-1-objectid>", "<break-glass-2-objectid>"]
},
"applications": {
"includeApplications": [
"00000009-0000-0000-c000-000000000000",
"871c010f-5e61-4fb1-83ac-98610a7e9110"
]
},
"platforms": {
"includePlatforms": ["windows", "macOS", "iOS", "android", "linux"]
}
},
"grantControls": {
"operator": "OR",
"builtInControls": ["compliantDevice", "domainJoinedDevice"]
}
}
The excluded BYOD group falls through to a separate App Protection Policy that enforces MAM controls instead β see Policy 8.
Policy 4 β Block Anonymous, Tor, and High-Risk Locations¶
Use Entra named locations + threat intel.
{
"displayName": "CA-AllUsers-Block-AnonymousAndHighRiskLocations",
"state": "enabled",
"conditions": {
"users": {
"includeUsers": ["All"],
"excludeUsers": ["<break-glass-1-objectid>", "<break-glass-2-objectid>"]
},
"applications": {
"includeApplications": ["All"]
},
"locations": {
"includeLocations": [
"<named-location-tor-objectid>",
"<named-location-anonymous-vpn-objectid>",
"<named-location-embargoed-countries-objectid>"
]
}
},
"grantControls": {
"operator": "OR",
"builtInControls": ["block"]
}
}
Policy 5 β High-Risk Sign-In β Require MFA + Compliant Device¶
Step-up when Identity Protection scores the sign-in risky.
{
"displayName": "CA-AllUsers-HighRiskSignIn-RequireMFAandCompliantDevice",
"state": "enabled",
"conditions": {
"users": {
"includeUsers": ["All"],
"excludeUsers": ["<break-glass-1-objectid>", "<break-glass-2-objectid>"]
},
"applications": {
"includeApplications": ["All"]
},
"signInRiskLevels": ["high"]
},
"grantControls": {
"operator": "AND",
"authenticationStrength": {
"id": "00000000-0000-0000-0000-000000000004"
},
"builtInControls": ["compliantDevice"]
}
}
Policy 6 β Session Controls for Sensitive Workspaces¶
Tighten reauthentication frequency and disable persistent browser sessions for users in sensitive workspaces (casino-compliance, federal-doj, tribal-healthcare).
{
"displayName": "CA-SensitiveWorkspaces-SessionControls",
"state": "enabled",
"conditions": {
"users": {
"includeGroups": [
"<sg-fabric-casino-compliance-objectid>",
"<sg-fabric-federal-doj-objectid>",
"<sg-fabric-tribal-healthcare-objectid>"
]
},
"applications": {
"includeApplications": [
"00000009-0000-0000-c000-000000000000",
"871c010f-5e61-4fb1-83ac-98610a7e9110"
]
}
},
"sessionControls": {
"signInFrequency": {
"value": 4,
"type": "hours",
"isEnabled": true
},
"persistentBrowser": {
"mode": "never",
"isEnabled": true
}
},
"grantControls": {
"operator": "AND",
"authenticationStrength": {
"id": "00000000-0000-0000-0000-000000000004"
}
}
}
Policy 7 β High-Risk User β Password Change¶
When Identity Protection elevates a user to High risk, force a secure password change before they can do anything else.
{
"displayName": "CA-AllUsers-HighRiskUser-RequirePasswordChange",
"state": "enabled",
"conditions": {
"users": {
"includeUsers": ["All"],
"excludeUsers": ["<break-glass-1-objectid>", "<break-glass-2-objectid>"]
},
"applications": {
"includeApplications": ["All"]
},
"userRiskLevels": ["high"]
},
"grantControls": {
"operator": "AND",
"builtInControls": ["mfa", "passwordChange"]
}
}
Policy 8 β BYOD App Protection¶
For approved BYOD users, require an Intune App Protection Policy (MAM) instead of full device compliance.
{
"displayName": "CA-BYOD-Require-AppProtection-Fabric",
"state": "enabled",
"conditions": {
"users": {
"includeGroups": ["<sg-fabric-mam-byod-objectid>"]
},
"applications": {
"includeApplications": [
"00000009-0000-0000-c000-000000000000",
"871c010f-5e61-4fb1-83ac-98610a7e9110"
]
},
"platforms": {
"includePlatforms": ["iOS", "android"]
}
},
"grantControls": {
"operator": "AND",
"builtInControls": ["compliantApplication"],
"authenticationStrength": {
"id": "00000000-0000-0000-0000-000000000004"
}
}
}
Bicep Wrapper for CA Policy Deployment¶
Conditional Access policies are managed via Microsoft Graph, not ARM/Bicep directly. Use a deployment script resource to invoke Graph from a Bicep deployment:
@description('Deploy Conditional Access policies via Microsoft Graph')
resource caPolicyDeployment 'Microsoft.Resources/deploymentScripts@2023-08-01' = {
name: 'ds-deploy-ca-policies'
location: location
kind: 'AzurePowerShell'
identity: {
type: 'UserAssigned'
userAssignedIdentities: {
'${graphDeployerIdentityId}': {}
}
}
properties: {
azPowerShellVersion: '11.0'
retentionInterval: 'P1D'
timeout: 'PT30M'
scriptContent: '''
$policies = Get-ChildItem -Path ./ca-policies -Filter *.json
Connect-MgGraph -Identity -Scopes "Policy.ReadWrite.ConditionalAccess"
foreach ($p in $policies) {
$body = Get-Content $p.FullName -Raw
Invoke-MgGraphRequest -Method POST `
-Uri "https://graph.microsoft.com/v1.0/identity/conditionalAccess/policies" `
-Body $body -ContentType "application/json"
}
'''
}
}
β Validation Tests¶
Quarterly tests prove the controls actually enforce. Schedule them in your security calendar; capture evidence for SOC 2.
Quarterly Test 1 β Non-Compliant Device Blocked¶
Procedure:
- Use a test account in
sg-fabric-test-users, on a deliberately non-compliant device (Intune compliance status "Non-compliant"). - Attempt to sign in to
app.fabric.microsoft.com.
Expected: Sign-in blocked. Entra sign-in log shows Failure reason: Access has been blocked by Conditional Access policies. Policy listed: CA-AllUsers-Require-CompliantDevice-Fabric.
Evidence: Sign-in log export (CSV), screenshot of block page, KQL query result.
SigninLogs
| where TimeGenerated > ago(7d)
| where UserPrincipalName == "test.user@contoso.com"
| where AppDisplayName has "Fabric" or AppDisplayName has "Power BI"
| where ConditionalAccessStatus == "failure"
| project TimeGenerated, UserPrincipalName, ConditionalAccessPolicies, ResultDescription
Quarterly Test 2 β High-Risk Sign-In Triggers Step-Up¶
Procedure:
- With a test account, sign in from a Tor exit node (or simulate via Entra ID Protection "Confirm sign-in compromised" admin action).
- Attempt to access Fabric Portal.
Expected: Step-up to phishing-resistant MFA required. If user only has push MFA, sign-in blocked.
Quarterly Test 3 β Privileged Access Without PIM Activation¶
Procedure:
- Assign a test user the Fabric Administrator role as Eligible (not Active).
- Without activating via PIM, attempt to change a tenant-level Fabric setting.
Expected: Action denied. PIM audit log shows no activation. Fabric admin log shows authorization failure.
Quarterly Test 4 β Legacy Auth Blocked¶
Procedure: Attempt to authenticate to a Microsoft 365 endpoint using IMAP / basic auth from a script.
Expected: Block. Sign-in log shows policy CA-All-Block-LegacyAuth enforced.
Quarterly Test 5 β OAP Blocks Unauthorized Storage¶
Procedure: From a notebook in a production workspace, attempt to write to a non-allowlisted ADLS Gen2 account.
Expected: 403 Forbidden. Audit log entry OutboundAccessProtection / Block.
Annual Test β Tabletop Token-Theft Scenario¶
Walk a red-team scenario: attacker obtains a valid refresh token via AitM phishing. Confirm the kill chain breaks at:
- Device compliance (token bound to non-compliant device β blocked at next CAE re-evaluation)
- Sign-in risk (impossible-travel detection from new IP β step-up)
- CAE revocation (admin-triggered "confirm compromised" cuts session in minutes)
π° Casino Implementation¶
Risk-Tiered Access¶
| Persona | Workspace | Sensitivity | Controls |
|---|---|---|---|
| Floor Manager | ws_casino_ops (Viewer) | Confidential | Compliant device, MFA, RLS by property, 8h session |
| Slot Analyst | ws_casino_ops (Viewer) | Confidential | Compliant device, MFA, RLS by property + slot only, no PII (CLS) |
| Compliance Officer | ws_casino_compliance (Member) | Highly Confidential | Compliant device, phishing-resistant MFA, full PII access, 4h session, OLS unlocks CTR/SAR |
| External Auditor (NIGC) | Item-share only on compliance dashboard | Highly Confidential | Per-policy device check, time-bound, item-share (no workspace), watermark, no export |
| BI Developer | ws_casino_dev (Contributor) | Internal (synthetic data) | Compliant device, MFA, no production data |
| CI/CD pipeline | Federated SP via OIDC | Confidential | No interactive login; scoped to workspace; deployments audited |
Casino-Specific Conditional Access Adjustments¶
// Add to Policy 6 (Session Controls) β apply 2-hour reauth to compliance group
"sessionControls": {
"signInFrequency": { "value": 2, "type": "hours", "isEnabled": true },
"persistentBrowser": { "mode": "never", "isEnabled": true }
}
CTR/SAR access requires compliance group + phishing-resistant MFA + OneLake Security row policy that names the user. Floor staff and back-office staff get distinctly different policy stacks β never assume "casino = one policy".
ποΈ Federal Implementation¶
FedRAMP-Aligned Stack (DOT/FAA, EPA, DOI)¶
| FedRAMP Control | Zero-Trust Mapping |
|---|---|
| AC-2 / AC-3 | Workspace RBAC + Workspace Identity |
| AC-6 / AC-6(1) | PIM JIT, no standing privilege |
| AC-17 | Conditional Access + compliant device + VPN/ExpressRoute |
| IA-2(1) / IA-2(11) | Phishing-resistant MFA (PIV/CAC where applicable) |
| IA-2(12) | PIV/CAC acceptance via Entra federation |
| SC-7 / SC-7(5) | Private Endpoints + Workspace IP firewall + OAP default-deny |
| SC-8 / SC-8(1) | TLS 1.2+ FIPS-validated |
| SC-12 / SC-13 | CMK with FIPS-validated HSM-backed Key Vault Premium |
| AU-2 / AU-12 | Workspace Monitoring + Sentinel + immutable audit storage |
For DOT/FAA specifically, reuse Policy 2 but raise authenticationStrength to phishing-resistant for all federal users, not just admins.
HIPAA-Aligned Stack (Tribal Healthcare)¶
PHI access in ws_tribal_healthcare:
- Phishing-resistant MFA mandatory for all users (no MFA-only fallback)
- Compliant device required (no BYOD MAM exception β block instead)
- OAP zero cross-workspace egress (PHI never leaves)
- CMK with HSM-backed Key Vault Premium
- 1-hour session reauth
- Audit log retention 7 years (HIPAA + state law)
42 CFR Part 2requires additional consent gating for substance-abuse data β handle via OneLake Security column policies + DLP
DOJ Restricted Access¶
- All access via PIV/CAC only (no other phishing-resistant method allowed)
- Workspace IP firewall scoped to DOJ network egress + designated SOC subnet
- Defender for Identity tuned for legal-hold-relevant anomalies
- Mandatory legal-hold: deletion blocked at workspace policy + Purview retention label
Cross-Agency Federal Pattern¶
Cross-agency analytics never operate at individual-record granularity. Approved aggregates land in ws_federal_shared via OneLake shortcuts; the agency-of-origin retains the data plane. Conditional Access for cross-agency analysts requires multi-agency approval (group sg-fabric-crossagency-approved) and time-bound membership via PIM-for-Groups.
π« Anti-Patterns¶
| Anti-Pattern | Why It Hurts | Do This Instead |
|---|---|---|
| MFA exempt for "executives" | Executives are the highest-value targets; the exemption is an attacker's shopping list | No exemptions; provide hardware FIDO2 keys to executives instead |
| CA policies never leave Report-Only | Untested policies don't protect anyone | Promote to Enforce within 14 days of Report-Only validation |
| Single break-glass account | One outage takes you out of your tenant | Always two break-glass accounts in different vaults, monitored |
| Workspace Identity used everywhere, RBAC granted broadly | Defeats least privilege; effectively a god-mode SP | Scope each Workspace Identity to only the resources it needs |
| Standing Fabric Administrator | Compromised admin = tenant-wide compromise | PIM JIT every privileged role; max 4-hour windows |
| Service Principal with client secret in Key Vault | Secret rotation drift; secret can be exfiltrated by anyone with KV access | Workspace Identity / federated credentials β no secret to leak |
| Public ADLS + "we trust the firewall" | The perimeter you trust is the perimeter that doesn't exist | Private Endpoints + publicNetworkAccess: Disabled |
| No OAP because "it's hard to allowlist" | Easier to allowlist a few approved destinations than to recover from data theft | Start with default-deny + a known-good allowlist; iterate |
| Sensitivity labels applied but no DLP | Labels without enforcement are decoration | Wire labels to DLP policies blocking export and forward |
| Trusting "the device is fine because it's corporate" | Corporate devices get phished too | Continuous compliance evaluation via Intune + MDE threat scores |
π Implementation Checklist¶
Before declaring "zero-trust ready":
Identity¶
- Phishing-resistant MFA for admins enforced
- MFA for all users enforced (no exemptions outside monitored break-glass)
- Legacy auth blocked tenant-wide
- PIM JIT enabled for Fabric Administrator, Capacity Admin, Global Admin
- Quarterly access reviews scheduled and running
- Workspace Identity used for all new Fabric workloads
- Federated credentials (OIDC) used for CI/CD; no SP secrets in repo
Devices¶
- Intune compliance baseline rolled out
- Conditional Access requires compliant device for Fabric
- App Protection Policy in place for approved BYOD group
- Defender for Endpoint deployed; threat-level signals feed CA
Network¶
- Private Endpoints on every ADLS, Key Vault, Event Hub, SQL DB
- Public network access disabled on those resources
- Workspace IP firewall configured per workspace
- OAP enabled in production with default-deny + reviewed allowlist
- Managed VNet enabled for Spark / Pipeline / Dataflow workloads
Applications¶
- App-only auth via Workspace Identity (preferred) or federated SP
- API throttling alerts in place
- Lakehouse SQL endpoint, GraphQL, Power BI all enforce app-layer authorization
Data¶
- Purview sensitivity labels applied at workspace + Highly Confidential items
- CMK enabled with rotation policy β€ 90 days for HC, β€ 365 days for Confidential
- TLS 1.2+ enforced everywhere
- OneLake Security row/column filters applied for all sensitive tables
- DLP policies in place for Power BI export, Teams share, M365 outbound
- Tokenization / hash-with-salt for PII identifiers; salt in env var, not hardcoded
Infrastructure¶
- Bicep IaC covers every above control
- Azure Policy initiative enforces zero-trust baseline
- Defender for Cloud plans enabled (Storage, Key Vault, SQL, RM, CSPM)
- Workspace Monitoring + Sentinel ingesting Fabric audit
- Quarterly drift scan and remediation
Continuous Verification¶
- CAE-aware clients verified
- Risk-based step-up policies enforced
- Session controls applied to sensitive workspaces
- Anomaly detection wired (Defender for Identity / Defender for Cloud Apps / Sentinel)
- Quarterly validation tests scheduled with named owners
- Annual tabletop exercise on token-theft scenario
π References¶
NIST & Zero Trust Foundations¶
- NIST SP 800-207 β Zero Trust Architecture
- NIST SP 1800-35 β Implementing a Zero Trust Architecture
- CISA Zero Trust Maturity Model 2.0
- DoD Zero Trust Reference Architecture
Microsoft Zero Trust¶
- Microsoft Zero Trust adoption framework
- Conditional Access for Fabric
- Continuous Access Evaluation (CAE)
- Entra ID Protection β risk policies
- Privileged Identity Management (PIM)
- Workspace Identity for Fabric
- OneLake Security
- Microsoft Defender for Cloud
- Microsoft Defender for Identity
- Microsoft Sentinel for Fabric
Wave 5 Sibling Docs¶
- SOC 2 Type II Readiness (Wave 5 anchor)
- STRIDE Threat Model
- Data Exfiltration Prevention
- Audit Trail Immutability
- GDPR Right to Deletion
- CCPA Privacy Rights
- ISO 27001 Mapping
- Supply Chain Security
Foundational Best Practices (Existing)¶
- Identity & RBAC Patterns
- Network Security
- Outbound Access Protection
- Customer-Managed Keys
- Data Governance Deep Dive
- SQL Audit Logs Compliance