Control Domains

MCSB Control Domains

The Microsoft Cloud Security Benchmark organizes security controls into 12 domains. Each domain represents a security design pattern applicable across all Azure services. Use these as your architecture review checklist — walk through each domain for every service in your design.

Pattern-Oriented Approach

Each domain below is presented as a security design pattern — not just what controls exist, but how to apply them in your architecture. Each includes the security principle, key controls, an architecture pattern with Terraform example, and cross-framework mappings.

MCSB Domain Map

graph LR Foundation["Foundation
NS · IM · PA"] Data["Data & Assets
DP · AM"] Ops["Operations
LT · IR · PV · ES"] Resilience["Resilience
BR · DS · GS"] Foundation --> Data --> Ops --> Resilience Resilience -.->|GS governs all| Foundation style Foundation stroke:#4ade80,stroke-width:2px style Data stroke:#22d3ee,stroke-width:2px style Ops stroke:#a855f7,stroke-width:2px style Resilience stroke:#ec4899,stroke-width:2px

NS Network Security

Security Principle: Isolate workloads on private networks, control traffic flows at every boundary, and ensure no service endpoint is unnecessarily exposed to the public internet. Think of the network as your first physical wall — everything inside should be segmented, inspected, and encrypted.

IDControlDesign Pattern
NS-1Network SegmentationDeploy into VNets, apply NSGs per subnet, use ASGs for role-based grouping
NS-2Secure Cloud ServicesPrivate Link for PaaS, disable public access, IP ACLs as backup
NS-3Edge FirewallAzure Firewall Premium at hub VNet for north-south inspection
NS-4IDS/IPSAzure Firewall Premium IDPS in Alert+Deny mode
NS-5DDoS ProtectionDDoS Protection Standard on VNets with public endpoints
NS-6WAFFront Door or App Gateway WAF in Prevention mode with OWASP 3.2 ruleset
NS-7Simplify ConfigAzure Firewall Manager for centralized policy across hub/spoke
NS-8Disable Insecure ProtocolsDisable TLS 1.0/1.1, SMBv1, unencrypted HTTP at service level
NS-9Private ConnectivityExpressRoute or VPN Gateway with IPsec for on-prem links
NS-10DNS SecurityAzure DNS Private Zones, DNS forwarding rules, DNSSEC

Architecture Pattern: Hub-Spoke Network Isolation

hcl
# Terraform — Hub VNet with Firewall + Spoke with Private Endpoints
resource "azurerm_virtual_network" "hub" {
  name                = "vnet-hub-prod"
  address_space       = ["10.0.0.0/16"]
  resource_group_name = azurerm_resource_group.hub.name
  location            = azurerm_resource_group.hub.location
}

resource "azurerm_subnet" "firewall" {
  name                 = "AzureFirewallSubnet"    # Required name
  virtual_network_name = azurerm_virtual_network.hub.name
  resource_group_name  = azurerm_resource_group.hub.name
  address_prefixes     = ["10.0.1.0/26"]
}

resource "azurerm_firewall" "hub" {
  name                = "fw-hub-prod"
  sku_name            = "AZFW_VNet"
  sku_tier            = "Premium"                 # Required for IDPS
  threat_intel_mode   = "Deny"
  location            = azurerm_resource_group.hub.location
  resource_group_name = azurerm_resource_group.hub.name

  ip_configuration {
    name                 = "fw-ipconfig"
    subnet_id            = azurerm_subnet.firewall.id
    public_ip_address_id = azurerm_public_ip.fw.id
  }
}

# Spoke VNet with NSG-protected private endpoint subnet
resource "azurerm_network_security_group" "pe_subnet" {
  name                = "nsg-pe-subnet"
  location            = azurerm_resource_group.spoke.location
  resource_group_name = azurerm_resource_group.spoke.name

  security_rule {
    name                       = "DenyInternetOutbound"
    priority                   = 100
    direction                  = "Outbound"
    access                     = "Deny"
    protocol                   = "*"
    source_port_range          = "*"
    destination_port_range     = "*"
    source_address_prefix      = "*"
    destination_address_prefix = "Internet"
  }
}
# Terraform — Hub VNet with Firewall + Spoke with Private Endpoints
resource "azurerm_virtual_network" "hub" {
  name                = "vnet-hub-prod"
  address_space       = ["10.0.0.0/16"]
  resource_group_name = azurerm_resource_group.hub.name
  location            = azurerm_resource_group.hub.location
}

resource "azurerm_subnet" "firewall" {
  name                 = "AzureFirewallSubnet"    # Required name
  virtual_network_name = azurerm_virtual_network.hub.name
  resource_group_name  = azurerm_resource_group.hub.name
  address_prefixes     = ["10.0.1.0/26"]
}

resource "azurerm_firewall" "hub" {
  name                = "fw-hub-prod"
  sku_name            = "AZFW_VNet"
  sku_tier            = "Premium"                 # Required for IDPS
  threat_intel_mode   = "Deny"
  location            = azurerm_resource_group.hub.location
  resource_group_name = azurerm_resource_group.hub.name

  ip_configuration {
    name                 = "fw-ipconfig"
    subnet_id            = azurerm_subnet.firewall.id
    public_ip_address_id = azurerm_public_ip.fw.id
  }
}

# Spoke VNet with NSG-protected private endpoint subnet
resource "azurerm_network_security_group" "pe_subnet" {
  name                = "nsg-pe-subnet"
  location            = azurerm_resource_group.spoke.location
  resource_group_name = azurerm_resource_group.spoke.name

  security_rule {
    name                       = "DenyInternetOutbound"
    priority                   = 100
    direction                  = "Outbound"
    access                     = "Deny"
    protocol                   = "*"
    source_port_range          = "*"
    destination_port_range     = "*"
    source_address_prefix      = "*"
    destination_address_prefix = "Internet"
  }
}

Framework mapping: NIST SP 800-53 SC-7, SC-8, AC-4 • CIS v8 9.2, 9.3, 12.1 • PCI-DSS v4 1.2–1.4 • ISO 27001 A.8.20–A.8.22

IM Identity Management

Security Principle: Every access decision must be identity-driven. Centralize on Entra ID, eliminate local authentication methods, use managed identities for all service-to-service communication, and enforce MFA with phishing-resistant methods. Identity is your new perimeter.

IDControlDesign Pattern
IM-1Centralized IdentityEntra ID as sole auth provider; disable SQL auth, SAS keys, local accounts
IM-2Protect Identity SystemsHarden Entra ID Connect, monitor identity logs, protect sync accounts
IM-3Managed IdentitiesSystem-assigned MI for single-resource, user-assigned MI for shared identity patterns
IM-6Strong AuthenticationEnforce phishing-resistant MFA (FIDO2, Windows Hello, certificate-based)
IM-7Conditional AccessBlock access from untrusted locations, require compliant devices, risk-based policies
IM-8Credential ProtectionKey Vault for all secrets; scan repos with CredScan; auto-rotate keys

Architecture Pattern: Managed Identity Chain

hcl
# Terraform — App Service with Managed Identity accessing Key Vault & SQL
resource "azurerm_linux_web_app" "api" {
  name                = "app-api-prod"
  resource_group_name = azurerm_resource_group.app.name
  location            = azurerm_resource_group.app.location
  service_plan_id     = azurerm_service_plan.main.id

  identity {
    type = "SystemAssigned"    # MI for downstream access
  }

  site_config {
    minimum_tls_version = "1.2"
  }

  app_settings = {
    # Key Vault references — no secrets in config
    "ConnectionStrings__DefaultConnection" = "@Microsoft.KeyVault(VaultName=kv-prod;SecretName=sql-conn)"
  }
}

# Grant MI access to Key Vault via RBAC (not access policy)
resource "azurerm_role_assignment" "app_kv_secrets" {
  scope                = azurerm_key_vault.main.id
  role_definition_name = "Key Vault Secrets User"
  principal_id         = azurerm_linux_web_app.api.identity[0].principal_id
}

# Grant MI access to SQL Database
resource "azurerm_role_assignment" "app_sql" {
  scope                = azurerm_mssql_database.main.id
  role_definition_name = "Contributor"
  principal_id         = azurerm_linux_web_app.api.identity[0].principal_id
}
# Terraform — App Service with Managed Identity accessing Key Vault & SQL
resource "azurerm_linux_web_app" "api" {
  name                = "app-api-prod"
  resource_group_name = azurerm_resource_group.app.name
  location            = azurerm_resource_group.app.location
  service_plan_id     = azurerm_service_plan.main.id

  identity {
    type = "SystemAssigned"    # MI for downstream access
  }

  site_config {
    minimum_tls_version = "1.2"
  }

  app_settings = {
    # Key Vault references — no secrets in config
    "ConnectionStrings__DefaultConnection" = "@Microsoft.KeyVault(VaultName=kv-prod;SecretName=sql-conn)"
  }
}

# Grant MI access to Key Vault via RBAC (not access policy)
resource "azurerm_role_assignment" "app_kv_secrets" {
  scope                = azurerm_key_vault.main.id
  role_definition_name = "Key Vault Secrets User"
  principal_id         = azurerm_linux_web_app.api.identity[0].principal_id
}

# Grant MI access to SQL Database
resource "azurerm_role_assignment" "app_sql" {
  scope                = azurerm_mssql_database.main.id
  role_definition_name = "Contributor"
  principal_id         = azurerm_linux_web_app.api.identity[0].principal_id
}

Framework mapping: NIST SP 800-53 AC-2, AC-3, IA-2, IA-5 • CIS v8 5.1–5.3, 6.1 • PCI-DSS v4 7.1–8.3 • ISO 27001 A.5.15, A.8.2

PA Privileged Access

Security Principle: No standing privileged access. Use just-in-time elevation via PIM, separate admin accounts from daily-use accounts, enforce PAW for sensitive operations, and audit every privileged action. Assume breach — limit the blast radius an attacker gets from any single compromised identity.

IDControlDesign Pattern
PA-1Separate Privileged UsersDedicated admin accounts; no Global Admin for daily work
PA-2No Standing AccessPIM for JIT elevation; max 4-hour activation windows
PA-5Emergency Access2+ break-glass accounts excluded from CA policies; monitored with alerts
PA-7Least PrivilegeAzure RBAC with built-in roles; custom roles only when built-in insufficient
PA-8Cloud Provider SupportCustomer Lockbox for all Microsoft data access requests

Framework mapping: NIST SP 800-53 AC-2(7), AC-6, AC-6(5) • CIS v8 5.4, 6.5, 6.8 • PCI-DSS v4 7.2, 8.2, 8.6 • ISO 27001 A.5.15, A.8.18

DP Data Protection

Security Principle: Encrypt everything at rest and in transit. Know where your sensitive data lives, classify it, and protect it proportionally. Use platform-managed keys by default, customer-managed keys for regulated workloads, and Key Vault for all key lifecycle management.

IDControlDesign Pattern
DP-1Data Discovery & ClassificationMicrosoft Purview for cross-service sensitive data discovery and labeling
DP-2Threat Monitoring for DataDefender for SQL/Storage/CosmosDB for anomalous data access detection
DP-3Encrypt Data in TransitTLS 1.2+ mandatory; HTTPS-only mode; disable insecure ciphers
DP-4Encryption at Rest (PMK)Platform-managed keys — on by default for most Azure services
DP-5Encryption at Rest (CMK)Customer-managed keys via Key Vault for regulated workloads; auto-rotate
DP-6Key ManagementKey Vault Premium (HSM-backed); rotation policies; separate DEK/KEK
DP-7Certificate ManagementKey Vault certificates with auto-renewal; monitor expiry alerts
DP-8Secure Key/Cert RepositorySoft delete + purge protection; RBAC; private endpoint for Key Vault

Architecture Pattern: CMK Encryption with Key Vault

hcl
# Terraform — Key Vault with CMK for SQL Database and Storage
resource "azurerm_key_vault" "main" {
  name                       = "kv-prod-001"
  resource_group_name        = azurerm_resource_group.security.name
  location                   = azurerm_resource_group.security.location
  tenant_id                  = data.azurerm_client_config.current.tenant_id
  sku_name                   = "premium"          # HSM-backed
  soft_delete_retention_days = 90
  purge_protection_enabled   = true               # Required for CMK
  enable_rbac_authorization  = true               # RBAC over access policies

  network_acls {
    default_action = "Deny"
    bypass         = "AzureServices"
  }
}

resource "azurerm_key_vault_key" "sql_cmk" {
  name         = "sql-tde-cmk"
  key_vault_id = azurerm_key_vault.main.id
  key_type     = "RSA"
  key_size     = 2048
  key_opts     = ["unwrapKey", "wrapKey"]

  rotation_policy {
    automatic {
      time_before_expiry = "P30D"
    }
    expire_after = "P365D"
  }
}
# Terraform — Key Vault with CMK for SQL Database and Storage
resource "azurerm_key_vault" "main" {
  name                       = "kv-prod-001"
  resource_group_name        = azurerm_resource_group.security.name
  location                   = azurerm_resource_group.security.location
  tenant_id                  = data.azurerm_client_config.current.tenant_id
  sku_name                   = "premium"          # HSM-backed
  soft_delete_retention_days = 90
  purge_protection_enabled   = true               # Required for CMK
  enable_rbac_authorization  = true               # RBAC over access policies

  network_acls {
    default_action = "Deny"
    bypass         = "AzureServices"
  }
}

resource "azurerm_key_vault_key" "sql_cmk" {
  name         = "sql-tde-cmk"
  key_vault_id = azurerm_key_vault.main.id
  key_type     = "RSA"
  key_size     = 2048
  key_opts     = ["unwrapKey", "wrapKey"]

  rotation_policy {
    automatic {
      time_before_expiry = "P30D"
    }
    expire_after = "P365D"
  }
}

AM Asset Management

Security Principle: You can't protect what you don't know about. Maintain a current inventory of all Azure resources, restrict what can be deployed via Azure Policy, tag everything for governance, and ensure security teams have visibility into all assets.

IDControlDesign Pattern
AM-1Track Asset InventoryAzure Resource Graph queries; enforce tagging via Policy
AM-2Approved Services OnlyAzure Policy deny rules for unapproved resource types and regions
AM-3Secure Asset LifecycleSecurity policies enforced at creation; secure decommissioning procedures
AM-4Limit Management AccessSeparate subscriptions for sensitive workloads; management group hierarchy
AM-5Approved VM ApplicationsAdaptive Application Controls or AppLocker for VM application whitelisting

LT Logging and Threat Detection

Security Principle: Enable threat detection on every service that offers it, collect all logs centrally, and ensure your SIEM has enough retention and correlation capabilities. The question isn't if you'll be attacked — it's whether you'll detect and respond fast enough.

IDControlDesign Pattern
LT-1Threat DetectionEnable all Defender plans; Defender for Cloud CSPM for security posture
LT-2Identity Threat DetectionEntra ID Protection risk policies; sign-in risk + user risk triggers
LT-3Resource LoggingDiagnosticSettings on every resource → Log Analytics workspace
LT-4Network LoggingNSG flow logs v2, VNet flow logs, Traffic Analytics
LT-5Centralize LogsMicrosoft Sentinel as SIEM; DCR-based data collection
LT-6Log Retention90-day interactive, 2-year archive; cold tier for compliance
LT-7Time SyncAll Azure resources use Microsoft NTP; verify custom VMs

IR Incident Response

Security Principle: Prepare before incidents happen. Have playbooks, automation, and contact chains ready. When an incident occurs, leverage Sentinel's investigation graph, automated containment playbooks, and systematic post-incident review to continuously improve.

IDControlDesign Pattern
IR-1Update IR PlanCloud-specific playbooks for each service in the architecture
IR-2Notification SetupSecurity contacts in Defender for Cloud; automated alert routing
IR-3High-Quality IncidentsSentinel analytics rules with proper entity mapping and severity
IR-4InvestigationSentinel investigation graph, UEBA, threat hunting workbooks
IR-5Automated ResponseSOAR playbooks: isolate VM, revoke token, block IP, notify SOC
IR-6Lessons LearnedPost-incident reviews, updated runbooks, detection coverage verification

PV Posture and Vulnerability Management

Security Principle: Know your security posture at all times. Define baselines, enforce them with policy, scan continuously for vulnerabilities, and remediate rapidly. Combine CSPM, vulnerability assessment, and regular red team testing for comprehensive coverage.

IDControlDesign Pattern
PV-1Secure ConfigurationsAzure Policy initiative aligned to MCSB; Defender for Cloud secure score
PV-2Audit & EnforceAzure Policy compliance dashboard; auto-remediation for critical findings
PV-5Vulnerability AssessmentDefender for Cloud VA; Qualys integration; container image scanning
PV-6Auto-RemediateDefender workflow automation; Azure Update Manager for patching
PV-7Red Team OperationsRegular pentesting per Microsoft rules of engagement; test cloud attack paths

ES Endpoint Security

Security Principle: Every VM and server in your cloud environment needs EDR and anti-malware. Deploy MDE via auto-provisioning, keep signatures current, and monitor endpoint health centrally.

IDControlDesign Pattern
ES-1EDRDefender for Endpoint on all servers; auto-provisioned via Defender for Cloud
ES-2Anti-MalwareMicrosoft Antimalware or MDE real-time protection on all Windows/Linux VMs
ES-3Signature UpdatesAutomated signature and platform updates; Defender for Cloud health monitoring

BR Backup and Recovery

Security Principle: Backups are your last line of defense against ransomware and data destruction. Automate backups, protect them with immutability, test restores regularly, and ensure recovery meets your RPO/RTO commitments.

IDControlDesign Pattern
BR-1Automated BackupsAzure Backup or native backup with defined retention and schedules
BR-2Protect Backup DataImmutable vaults, soft delete, RBAC on backup stores, MUA
BR-3Monitor BackupsBackup Center dashboard; Azure Monitor alerts for backup failures
BR-4Test RecoveryQuarterly restore drills; validate RTO/RPO; document results

DS DevOps Security

Security Principle: Security at the speed of DevOps. Embed threat modeling, SAST, DAST, dependency scanning, and secrets detection into your pipelines. Harden build infrastructure. Sign artifacts and verify the supply chain.

IDControlDesign Pattern
DS-1Threat ModelingSTRIDE per sprint; Threagile in CI/CD; architecture review gates
DS-2Supply Chain SecurityDependabot/Renovate; pin versions; verify signatures; SBOM generation
DS-3Secure InfrastructureEphemeral build agents; limited service connections; environment separation
DS-4SAST in PipelineSemgrep/CodeQL on every PR; quality gates block merges on Critical/High
DS-5DAST in PipelineZAP/Burp scans against staging in release pipeline
DS-6Workload SecuritySigned commits; branch protection; approval gates; deploy from trusted pipelines only
DS-7Pipeline MonitoringAudit pipeline runs; track secret access; alert on anomalous deployments

GS Governance and Strategy

Security Principle: Security doesn't happen by accident. Define roles, document strategy, set policies, and align the organization. Governance is the glue that makes all other domains work together consistently across teams and time.

IDControlDesign Pattern
GS-1Roles & ResponsibilitiesRACI matrix for cloud security functions; all roles staffed and accountable
GS-2Segmentation StrategyManagement group hierarchy; subscription vending; separation of duties
GS-3Data Protection StrategyClassification taxonomy, encryption standards, data handling procedures
GS-4Network Security StrategyHub-spoke model, connectivity policies, firewall rules baseline
GS-5Posture Management StrategyDefender for Cloud CSPM, remediation SLAs per severity, secure score targets
GS-6Identity StrategyIdentity governance, authentication standards, PAM policies
GS-7Logging & IR StrategySIEM architecture, retention requirements, detection coverage targets
GS-8Backup StrategyRPO/RTO targets, frequency, immutability, restore testing schedule

Architecture Review Checklist

Use This in Design Reviews

Walk through this checklist for every Azure service in your architecture. For each control, document: Is it supported? Is it on by default? Who's responsible? What's the Terraform config?

Foundation

  • ☐ VNet integration or private endpoints configured
  • ☐ Public access disabled or restricted to known IPs
  • ☐ NSGs applied to all subnets with deny-all default
  • ☐ WAF in front of all web-facing services
  • ☐ Entra ID as sole authentication provider
  • ☐ Local auth / SAS keys disabled where possible
  • ☐ Managed identities for all service-to-service comms
  • ☐ MFA enforced for all human identities
  • ☐ PIM configured for all privileged roles
  • ☐ Customer Lockbox enabled

Data & Assets

  • ☐ Data classification applied to all data stores
  • ☐ TLS 1.2+ enforced on all connections
  • ☐ Encryption at rest verified (PMK minimum)
  • ☐ CMK configured for regulated workloads
  • ☐ Key Vault with purge protection for all secrets
  • ☐ Certificates in Key Vault with auto-rotation
  • ☐ Resource tagging policy enforced
  • ☐ Allowed service types restricted via Azure Policy

Operations

  • ☐ Defender enabled for all applicable services
  • ☐ Diagnostic settings enabled → Log Analytics
  • ☐ Sentinel connected with analytics rules active
  • ☐ IR playbooks created for each service
  • ☐ Automated containment playbooks deployed
  • ☐ Vulnerability assessment scans scheduled
  • ☐ Azure Policy compliance reviewed weekly
  • ☐ EDR deployed on all VMs and servers

Resilience & DevOps

  • ☐ Azure Backup configured with defined retention
  • ☐ Immutable backup vaults enabled
  • ☐ Restore drills scheduled quarterly
  • ☐ SAST integrated in CI/CD pipelines
  • ☐ Dependency scanning active (Dependabot/Renovate)
  • ☐ Signed commits and branch protection enforced
  • ☐ Security roles and RACI documented
  • ☐ Posture management SLAs defined