From 6afb12bad7075b84b43a1e5370d557a7a3ba7313 Mon Sep 17 00:00:00 2001 From: erjosito <9462396+erjosito@users.noreply.github.com> Date: Mon, 12 Aug 2024 16:29:04 +0000 Subject: [PATCH] [create-pull-request] automated change --- checklists-ext/fullwaf_checklist.en.json | 1780 +- checklists/azure_storage_checklist.en.json | 1128 +- checklists/azure_storage_checklist.es.json | 566 + checklists/azure_storage_checklist.ja.json | 566 + checklists/azure_storage_checklist.ko.json | 566 + checklists/azure_storage_checklist.pt.json | 566 + .../azure_storage_checklist.zh-Hant.json | 566 + checklists/checklist.en.master.json | 19592 +++++++++------- checklists/waf_checklist.en.json | 1780 +- checklists/waf_checklist.es.json | 434 +- checklists/waf_checklist.ja.json | 434 +- checklists/waf_checklist.ko.json | 434 +- checklists/waf_checklist.pt.json | 434 +- checklists/waf_checklist.zh-Hant.json | 434 +- .../macrofree/azure_storage_checklist.en.xlsx | Bin 0 -> 26066 bytes .../macrofree/azure_storage_checklist.es.xlsx | Bin 0 -> 26859 bytes .../macrofree/azure_storage_checklist.ja.xlsx | Bin 0 -> 28159 bytes .../macrofree/azure_storage_checklist.ko.xlsx | Bin 0 -> 27646 bytes .../macrofree/azure_storage_checklist.pt.xlsx | Bin 0 -> 26768 bytes .../azure_storage_checklist.zh-Hant.xlsx | Bin 0 -> 27123 bytes .../macrofree/checklist.en.master.xlsx | Bin 439831 -> 476940 bytes spreadsheet/macrofree/waf_checklist.en.xlsx | Bin 176673 -> 201186 bytes spreadsheet/macrofree/waf_checklist.es.xlsx | Bin 187767 -> 193873 bytes spreadsheet/macrofree/waf_checklist.ja.xlsx | Bin 204812 -> 213921 bytes spreadsheet/macrofree/waf_checklist.ko.xlsx | Bin 198519 -> 206406 bytes spreadsheet/macrofree/waf_checklist.pt.xlsx | Bin 187869 -> 195071 bytes .../macrofree/waf_checklist.zh-Hant.xlsx | Bin 193318 -> 200124 bytes .../alz_checklist.en_network_counters.json | 462 +- ...hecklist.en_network_counters_template.json | 2 +- .../alz_checklist.en_network_tabcounters.json | 1050 +- ...klist.en_network_tabcounters_template.json | 2 +- .../alz_checklist.en_network_workbook.json | 480 +- ...hecklist.en_network_workbook_template.json | 2 +- ...hecklist.en_network_counters_workbook.json | 212 +- ...en_network_counters_workbook_template.json | 2 +- ...elivery_checklist.en_network_workbook.json | 140 +- ...hecklist.en_network_workbook_template.json | 2 +- ...torage_checklist.en_counters_workbook.json | 536 + ...ecklist.en_counters_workbook_template.json | 57 + .../azure_storage_checklist.en_workbook.json | 295 + ...torage_checklist.en_workbook_template.json | 57 + 41 files changed, 22801 insertions(+), 9778 deletions(-) create mode 100644 checklists/azure_storage_checklist.es.json create mode 100644 checklists/azure_storage_checklist.ja.json create mode 100644 checklists/azure_storage_checklist.ko.json create mode 100644 checklists/azure_storage_checklist.pt.json create mode 100644 checklists/azure_storage_checklist.zh-Hant.json create mode 100644 spreadsheet/macrofree/azure_storage_checklist.en.xlsx create mode 100644 spreadsheet/macrofree/azure_storage_checklist.es.xlsx create mode 100644 spreadsheet/macrofree/azure_storage_checklist.ja.xlsx create mode 100644 spreadsheet/macrofree/azure_storage_checklist.ko.xlsx create mode 100644 spreadsheet/macrofree/azure_storage_checklist.pt.xlsx create mode 100644 spreadsheet/macrofree/azure_storage_checklist.zh-Hant.xlsx create mode 100644 workbooks/azure_storage_checklist.en_counters_workbook.json create mode 100644 workbooks/azure_storage_checklist.en_counters_workbook_template.json create mode 100644 workbooks/azure_storage_checklist.en_workbook.json create mode 100644 workbooks/azure_storage_checklist.en_workbook_template.json diff --git a/checklists-ext/fullwaf_checklist.en.json b/checklists-ext/fullwaf_checklist.en.json index c9bd293fb..ea9c41ce6 100644 --- a/checklists-ext/fullwaf_checklist.en.json +++ b/checklists-ext/fullwaf_checklist.en.json @@ -1,5 +1,1759 @@ { "items": [ + { + "checklist": "Azure Landing Zone Review", + "guid": "70c15989-c726-42c7-b0d3-24b7375b9201", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/ready/landing-zone/design-area/multi-tenant/considerations-recommendations", + "service": "Entra", + "severity": "Medium", + "text": "Use one Entra tenant for managing your Azure resources, unless you have a clear regulatory or business requirement for multi-tenants.", + "training": "https://learn.microsoft.com/training/modules/deploy-resources-scopes-bicep/2-understand-deployment-scopes", + "waf": "Operations" + }, + { + "checklist": "Azure Landing Zone Review", + "guid": "6309957b-821a-43d1-b9d9-7fcf1802b747", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/ready/landing-zone/design-area/multi-tenant/automation", + "service": "Entra", + "severity": "Low", + "text": "Use Multi-Tenant Automation approach to managing your Microsoft Entra ID Tenants.", + "training": "https://learn.microsoft.com/entra/architecture/multi-tenant-user-management-introduction/", + "waf": "Operations" + }, + { + "checklist": "Azure Landing Zone Review", + "guid": "78e11934-499a-45ed-8ef7-aae5578f0ecf", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/ready/landing-zone/design-area/multi-tenant/lighthouse", + "service": "Entra", + "severity": "High", + "text": "Use Azure Lighthouse for Multi-Tenant Management with the same IDs.", + "training": "https://learn.microsoft.com/azure/lighthouse/concepts/cross-tenant-management-experience", + "waf": "Operations" + }, + { + "checklist": "Azure Landing Zone Review", + "guid": "5d82e6df-6f61-42f2-82e2-3132d293be3d", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/ready/landing-zone/design-area/azure-billing-microsoft-customer-agreement#design-recommendations", + "service": "Entra", + "severity": "High", + "text": "If you give a partner access to administer your tenant, use Azure Lighthouse.", + "training": "https://learn.microsoft.com/azure/lighthouse/how-to/onboard-customer", + "waf": "Cost" + }, + { + "checklist": "Azure Landing Zone Review", + "guid": "348ef254-c27d-442e-abba-c7571559ab91", + "link": "https://learn.microsoft.com/azure/role-based-access-control/overview", + "service": "Entra", + "severity": "High", + "text": "Enforce a RBAC model that aligns to your cloud operating model. Scope and Assign across Management Groups and Subscriptions.", + "training": "https://learn.microsoft.com/learn/paths/implement-resource-mgmt-security/", + "waf": "Reliability" + }, + { + "checklist": "Azure Landing Zone Review", + "guid": "12e7f983-f630-4472-8dd6-9c5b5c2622f5", + "link": "https://learn.microsoft.com/azure/active-directory/roles/security-planning#identify-microsoft-accounts-in-administrative-roles-that-need-to-be-switched-to-work-or-school-accounts", + "service": "Entra", + "severity": "High", + "text": "Only use the authentication type Work or school account for all account types. Avoid using the Microsoft account", + "training": "https://learn.microsoft.com/learn/modules/explore-basic-services-identity-types/", + "waf": "Reliability" + }, + { + "checklist": "Azure Landing Zone Review", + "guid": "4b69bad3-3aad-45e8-a68e-1d76667313b4", + "link": "https://learn.microsoft.com/azure/active-directory/fundamentals/active-directory-groups-create-azure-portal", + "service": "Entra", + "severity": "Medium", + "text": "Only use groups to assign permissions. Add on-premises groups to the Entra ID only group if a group management system is already in place.", + "training": "https://learn.microsoft.com/learn/paths/manage-identity-and-access/", + "waf": "Reliability" + }, + { + "checklist": "Azure Landing Zone Review", + "guid": "53e8908a-e28c-484c-93b6-b7808b9fe5c4", + "link": "https://learn.microsoft.com/azure/active-directory/conditional-access/overview", + "service": "Entra", + "severity": "High", + "text": "Enforce Microsoft Entra ID Conditional Access policies for any user with rights to Azure environments.", + "training": "https://learn.microsoft.com/learn/modules/plan-implement-administer-conditional-access/", + "waf": "Reliability" + }, + { + "checklist": "Azure Landing Zone Review", + "guid": "1049d403-a923-4c34-94d0-0018ac6a9e01", + "link": "https://learn.microsoft.com/azure/active-directory/authentication/concept-mfa-howitworks", + "service": "Entra", + "severity": "High", + "text": "Enforce multi-factor authentication for any user with rights to the Azure environments.", + "training": "https://learn.microsoft.com/learn/modules/secure-aad-users-with-mfa/", + "waf": "Reliability" + }, + { + "checklist": "Azure Landing Zone Review", + "guid": "14658d35-58fd-4772-99b8-21112df27ee4", + "link": "https://learn.microsoft.com/azure/active-directory/privileged-identity-management/pim-configure", + "service": "Entra", + "severity": "Medium", + "text": "Enforce Microsoft Entra ID Privileged Identity Management (PIM) to establish zero standing access and least privilege.", + "training": "https://learn.microsoft.com/learn/modules/azure-ad-privileged-identity-management/", + "waf": "Reliability" + }, + { + "checklist": "Azure Landing Zone Review", + "guid": "8b9fe5c4-1049-4d40-9a92-3c3474d00018", + "link": "https://learn.microsoft.com/entra/identity/domain-services/overview", + "service": "Entra", + "severity": "Medium", + "text": "If planning to switch from Active Directory Domain Services to Entra domain services, evaluate the compatibility of all workloads.", + "training": "https://learn.microsoft.com/learn/modules/implement-hybrid-identity-windows-server/", + "waf": "Reliability" + }, + { + "checklist": "Azure Landing Zone Review", + "guid": "1cf0b8da-70bd-44d0-94af-8d99cfc89ae1", + "link": "https://learn.microsoft.com/azure/active-directory/reports-monitoring/concept-activity-logs-azure-monitor", + "service": "Entra", + "severity": "Medium", + "text": "Integrate Microsoft Entra ID logs with the platform-central Azure Monitor. Azure Monitor allows for a single source of truth around log and monitoring data in Azure, giving organizations a cloud native options to meet requirements around log collection and retention.", + "training": "https://learn.microsoft.com/entra/identity/monitoring-health/howto-integrate-activity-logs-with-azure-monitor-logs", + "waf": "Reliability" + }, + { + "ammp": true, + "checklist": "Azure Landing Zone Review", + "guid": "984a859c-773e-47d2-9162-3a765a917e1f", + "link": "https://learn.microsoft.com/azure/active-directory/roles/security-emergency-access", + "service": "Entra", + "severity": "High", + "text": "Implement an emergency access or break-glass accounts to prevent tenant-wide account lockout.", + "training": "https://learn.microsoft.com/learn/modules/azure-ad-privileged-identity-management/", + "waf": "Reliability" + }, + { + "checklist": "Azure Landing Zone Review", + "guid": "35037e68-9349-4c15-b371-228514f4cdff", + "link": "https://learn.microsoft.com/azure/active-directory/roles/best-practices", + "service": "Entra", + "severity": "Medium", + "text": "Do not use on-premises synced accounts for Microsoft Entra ID role assignments, unless you have a scenario that specifically requires it.", + "training": "https://learn.microsoft.com/learn/modules/design-identity-security-strategy/", + "waf": "Reliability" + }, + { + "checklist": "Azure Landing Zone Review", + "guid": "d5d1e4e6-1465-48d3-958f-d77249b82111", + "link": "https://learn.microsoft.com/azure/active-directory/app-proxy/application-proxy", + "service": "Entra", + "severity": "Medium", + "text": "When using Microsoft Entra ID Application Proxy to give remote users access to applications, manage it as a Platform resource as you can only have one instance per tenant.", + "training": "https://learn.microsoft.com/learn/paths/implement-applications-external-access-azure-ad/", + "waf": "Reliability" + }, + { + "arm-service": "Microsoft.Network/virtualNetworks", + "checklist": "Azure Landing Zone Review", + "guid": "e8bbac75-7155-49ab-a153-e8908ae28c84", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/ready/enterprise-scale/network-topology-and-connectivity", + "service": "VNet", + "severity": "Medium", + "text": "Use a hub-and-spoke network topology for network scenarios that require maximum flexibility.", + "training": "https://learn.microsoft.com/learn/paths/architect-network-infrastructure/", + "waf": "Reliability" + }, + { + "arm-service": "Microsoft.Network/virtualNetworks", + "checklist": "Azure Landing Zone Review", + "guid": "7dd61623-a364-4a90-9eca-e48ebd54cd7d", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/ready/azure-best-practices/traditional-azure-networking-topology", + "service": "VNet", + "severity": "High", + "text": "Deploy shared networking services, including ExpressRoute gateways, VPN gateways, and Azure Firewall or partner NVAs in the central-hub virtual network. If necessary, also deploy DNS services.", + "training": "https://learn.microsoft.com/training/modules/hub-and-spoke-network-architecture/", + "waf": "Cost" + }, + { + "arm-service": "Microsoft.Network/virtualNetworks", + "checklist": "Azure Landing Zone Review", + "guid": "143b16c3-1d7a-4a9b-9470-4489a8042d88", + "link": "https://learn.microsoft.com/azure/ddos-protection/ddos-protection-overview", + "service": "VNet", + "severity": "High", + "text": "Use a DDoS Network or IP protection plan for all public IP addresses in application landing zones.", + "training": "https://learn.microsoft.com/learn/paths/secure-networking-infrastructure/", + "waf": "Reliability" + }, + { + "arm-service": "Microsoft.Compute/virtualMachines", + "checklist": "Azure Landing Zone Review", + "guid": "e2e8abac-3571-4559-ab91-53e89f89dc7b", + "link": "https://learn.microsoft.com/azure/architecture/reference-architectures/dmz/nva-ha", + "service": "NVA", + "severity": "Medium", + "text": "When deploying partner networking technologies or NVAs, follow the partner vendor's guidance.", + "waf": "Reliability" + }, + { + "arm-service": "microsoft.network/expressRouteCircuits", + "checklist": "Azure Landing Zone Review", + "guid": "ce463dbb-bc8a-4c2a-aebc-92a43da1dae2", + "link": "https://learn.microsoft.com/azure/expressroute/expressroute-howto-coexist-resource-manager#to-enable-transit-routing-between-expressroute-and-azure-vpn", + "service": "ExpressRoute", + "severity": "Low", + "text": "If you need transit between ExpressRoute and VPN gateways in hub and spoke scenarios, use Azure Route Server.", + "training": "https://learn.microsoft.com/training/modules/intro-to-azure-route-server/", + "waf": "Reliability" + }, + { + "arm-service": "Microsoft.Network/virtualHubs", + "checklist": "Azure Landing Zone Review", + "graph": "resources | where type=='microsoft.network/virtualnetworks' | project id,subnets=properties.subnets | mv-expand subnets | project id, subnetName = subnets.name, subnetPrefix = subnets.properties.addressPrefix | extend subnetPrefixLength = split(subnetPrefix, '/')[1] | where subnetName == 'RouteServerSubnet' | extend compliant = (subnetPrefixLength <= 27) | distinct id, compliant", + "guid": "91b9d7d5-91e1-4dcb-8f1f-fa7e465646cc", + "link": "https://learn.microsoft.com/azure/route-server/quickstart-configure-route-server-portal#create-a-route-server-1", + "service": "ARS", + "severity": "Low", + "text": "If using Route Server, use a /27 prefix for the Route Server subnet.", + "training": "https://learn.microsoft.com/training/modules/intro-to-azure-route-server/", + "waf": "Reliability" + }, + { + "arm-service": "Microsoft.Network/virtualNetworks", + "checklist": "Azure Landing Zone Review", + "guid": "cc881471-607c-41cc-a0e6-14658dd558f9", + "link": "https://learn.microsoft.com/azure/virtual-network/virtual-networks-faq#can-i-create-a-peering-connection-to-a-vnet-in-a-different-region", + "service": "VNet", + "severity": "Medium", + "text": "For network architectures with multiple hub-and-spoke topologies across Azure regions, use global virtual network peerings between the hub VNets to connect the regions to each other.", + "training": "https://learn.microsoft.com/learn/paths/azure-administrator-manage-virtual-networks/", + "waf": "Performance" + }, + { + "arm-service": "Microsoft.Network/virtualNetworks", + "checklist": "Azure Landing Zone Review", + "guid": "4722d929-c1b1-4cd6-81f5-4b29bade39ad", + "link": "https://learn.microsoft.com/azure/azure-monitor/insights/network-insights-overview", + "service": "VNet", + "severity": "Medium", + "text": "Use Azure Monitor for Networks to monitor the end-to-end state of the networks on Azure.", + "training": "https://learn.microsoft.com/learn/modules/design-implement-network-monitoring/", + "waf": "Operations" + }, + { + "arm-service": "Microsoft.Network/virtualNetworks", + "checklist": "Azure Landing Zone Review", + "graph": "resources | where type == 'microsoft.network/virtualnetworks' | mvexpand properties.virtualNetworkPeerings | summarize peeringcount = count() by id | extend compliant = (peeringcount < 450) | distinct id,compliant", + "guid": "0e7c28ec-9366-4572-83b0-f4664b1d944a", + "link": "https://learn.microsoft.com/azure/azure-resource-manager/management/azure-subscription-service-limits?toc=/azure/virtual-network/toc.json#azure-resource-manager-virtual-networking-limits", + "service": "VNet", + "severity": "Medium", + "text": "If you have more than 400 spoke networks in a region, deploy an additional hub to bypass VNet peering limits (500) and the maximum number of prefixes that can be advertised via ExpressRoute (1000).", + "training": "https://learn.microsoft.com/training/modules/hub-and-spoke-network-architecture/", + "waf": "Reliability" + }, + { + "arm-service": "Microsoft.Network/virtualNetworks", + "checklist": "Azure Landing Zone Review", + "graph": "resources | where type=='microsoft.network/routetables' | mvexpand properties.routes | summarize routeCount = count() by id | extend compliant = (routeCount < 360) | distinct id,compliant", + "guid": "3d457936-e9b7-41eb-bdff-314b26450b12", + "link": "https://learn.microsoft.com/azure/azure-resource-manager/management/azure-subscription-service-limits?toc=/azure/virtual-network/toc.json#azure-resource-manager-virtual-networking-limits", + "service": "VNet", + "severity": "Medium", + "text": "Limit the number of routes per route table to 400.", + "training": "https://learn.microsoft.com/training/modules/hub-and-spoke-network-architecture/", + "waf": "Reliability" + }, + { + "arm-service": "Microsoft.Network/virtualNetworks", + "checklist": "Azure Landing Zone Review", + "graph": "resources | where type == 'microsoft.network/virtualnetworks' | mvexpand properties.virtualNetworkPeerings | project id, peeringName=properties_virtualNetworkPeerings.name, compliant = (properties_virtualNetworkPeerings.properties.allowVirtualNetworkAccess == True)", + "guid": "c76cb5a2-abe2-11ed-afa1-0242ac120002", + "link": "https://learn.microsoft.com/azure/virtual-network/virtual-network-manage-peering", + "service": "VNet", + "severity": "High", + "text": "Use the setting 'Allow traffic to remote virtual network' when configuring VNet peerings.", + "training": "https://learn.microsoft.com/training/modules/hub-and-spoke-network-architecture/", + "waf": "Reliability" + }, + { + "arm-service": "microsoft.network/expressRouteCircuits", + "checklist": "Azure Landing Zone Review", + "guid": "de0d5973-cd4c-4d21-a088-137f5e6c4cfd", + "link": "https://learn.microsoft.com/azure/expressroute/expressroute-howto-macsec", + "service": "ExpressRoute", + "severity": "Medium", + "text": "When you're using ExpressRoute Direct, configure MACsec in order to encrypt traffic at the layer-two level between the organization's routers and MSEE. The diagram shows this encryption in flow.", + "training": "https://learn.microsoft.com/training/modules/design-implement-azure-expressroute/", + "waf": "Reliability" + }, + { + "arm-service": "microsoft.network/expressRouteCircuits", + "checklist": "Azure Landing Zone Review", + "guid": "ed301d6e-872e-452e-9611-cc58b5a4b151", + "link": "https://learn.microsoft.com/azure/vpn-gateway/site-to-site-vpn-private-peering", + "service": "ExpressRoute", + "severity": "Medium", + "text": "For scenarios where MACsec isn't an option (for example, not using ExpressRoute Direct), use a VPN gateway to establish IPsec tunnels over ExpressRoute private peering.", + "training": "https://learn.microsoft.com/learn/paths/implement-network-security/", + "waf": "Reliability" + }, + { + "arm-service": "microsoft.network/expressRouteCircuits", + "checklist": "Azure Landing Zone Review", + "guid": "558fd772-49b8-4211-82df-27ee412e7f98", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/ready/azure-best-practices/plan-for-ip-addressing", + "service": "ExpressRoute", + "severity": "High", + "text": "Ensure no overlapping IP address spaces across Azure regions and on-premises locations are used.", + "training": "https://learn.microsoft.com/learn/paths/architect-network-infrastructure/", + "waf": "Reliability" + }, + { + "arm-service": "Microsoft.Network/virtualNetworks", + "checklist": "Azure Landing Zone Review", + "graph": "resources | where type == 'microsoft.network/virtualnetworks' | extend addressSpace = todynamic(properties.addressSpace) | extend addressPrefix = todynamic(properties.addressSpace.addressPrefixes) | mvexpand addressSpace | mvexpand addressPrefix | project name, id, location, resourceGroup, subscriptionId, cidr = addressPrefix | extend compliant = (cidr matches regex @'^(10\\\\.|172\\\\.(1[6-9]|2[0-9]|3[01])\\\\.|192\\\\.168\\\\.)') | project id, compliant, cidr", + "guid": "3f630472-2dd6-49c5-a5c2-622f54b69bad", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/ready/azure-best-practices/plan-for-ip-addressing", + "service": "VNet", + "severity": "Medium", + "text": "Use IP addresses from the address allocation ranges for private internets (RFC 1918).", + "training": "https://learn.microsoft.com/learn/paths/architect-network-infrastructure/", + "waf": "Reliability" + }, + { + "arm-service": "Microsoft.Network/virtualNetworks", + "checklist": "Azure Landing Zone Review", + "graph": "resources | where type == 'microsoft.network/virtualnetworks' | extend addressSpace = todynamic(properties.addressSpace) | extend addressPrefix = todynamic(properties.addressSpace.addressPrefixes) | mvexpand addressSpace | mvexpand addressPrefix | extend addressMask = split(addressPrefix,'/')[1] | extend compliant = addressMask > 16 | project name, id, subscriptionId, resourceGroup, addressPrefix, compliant", + "guid": "33aad5e8-c68e-41d7-9667-313b4f5664b5", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/ready/azure-best-practices/plan-for-ip-addressing", + "service": "VNet", + "severity": "High", + "text": "Ensure that IP address space isn't wasted, don't create unnecessarily large virtual networks (for example /16).", + "training": "https://learn.microsoft.com/learn/paths/architect-network-infrastructure/", + "waf": "Performance" + }, + { + "arm-service": "Microsoft.Network/virtualNetworks", + "checklist": "Azure Landing Zone Review", + "guid": "f348ef25-4c27-4d42-b8bb-ac7571559ab9", + "link": "https://learn.microsoft.com/azure/site-recovery/concepts-on-premises-to-azure-networking#retain-ip-addresses", + "service": "VNet", + "severity": "High", + "text": "Do not use overlapping IP address ranges for production and disaster recovery sites.", + "training": "https://learn.microsoft.com/learn/paths/az-104-manage-virtual-networks/", + "waf": "Reliability" + }, + { + "arm-service": "Microsoft.Network/dnsZones", + "checklist": "Azure Landing Zone Review", + "guid": "153e8908-ae28-4c84-a33b-6b7808b9fe5c", + "link": "https://learn.microsoft.com/azure/dns/private-dns-getstarted-portal", + "service": "DNS", + "severity": "Medium", + "text": "For environments where name resolution in Azure is all that's required, use Azure Private DNS for resolution with a delegated zone for name resolution (such as 'azure.contoso.com').", + "training": "https://learn.microsoft.com/learn/paths/az-104-manage-virtual-networks/", + "waf": "Operations" + }, + { + "arm-service": "Microsoft.Network/dnsZones", + "checklist": "Azure Landing Zone Review", + "guid": "41049d40-3a92-43c3-974d-00018ac6a9e0", + "link": "https://learn.microsoft.com/azure/dns/dns-private-resolver-overview", + "service": "DNS", + "severity": "Medium", + "text": "For environments where name resolution across Azure and on-premises is required and there is no existing enterprise DNS service like Active Directory, use Azure DNS Private Resolver to route DNS requests to Azure or to on-premises DNS servers.", + "training": "https://learn.microsoft.com/training/modules/intro-to-azure-dns-private-resolver/", + "waf": "Reliability" + }, + { + "arm-service": "Microsoft.Network/dnsZones", + "checklist": "Azure Landing Zone Review", + "guid": "1e6a83de-5de3-42c1-a924-81607d5d1e4e", + "link": "https://learn.microsoft.com/azure/virtual-network/virtual-networks-name-resolution-for-vms-and-role-instances", + "service": "DNS", + "severity": "Low", + "text": "Special workloads that require and deploy their own DNS (such as Red Hat OpenShift) should use their preferred DNS solution.", + "training": "https://learn.microsoft.com/training/courses/az-700t00", + "waf": "Operations" + }, + { + "arm-service": "Microsoft.Network/dnsZones", + "checklist": "Azure Landing Zone Review", + "guid": "614658d3-558f-4d77-849b-821112df27ee", + "link": "https://learn.microsoft.com/azure/dns/private-dns-autoregistration", + "service": "DNS", + "severity": "High", + "text": "Enable auto-registration for Azure DNS to automatically manage the lifecycle of the DNS records for the virtual machines deployed within a virtual network.", + "training": "https://learn.microsoft.com/learn/paths/az-104-manage-virtual-networks/", + "waf": "Operations" + }, + { + "arm-service": "microsoft.network/bastionHosts", + "checklist": "Azure Landing Zone Review", + "guid": "ee1ac551-c4d5-46cf-b035-d0a3c50d87ad", + "link": "https://learn.microsoft.com/azure/bastion/bastion-overview", + "service": "Bastion", + "severity": "Medium", + "text": "Use Azure Bastion to securely connect to your network.", + "training": "https://learn.microsoft.com/training/modules/intro-to-azure-bastion/", + "waf": "Reliability" + }, + { + "arm-service": "microsoft.network/bastionHosts", + "checklist": "Azure Landing Zone Review", + "graph": "resources | where type=='microsoft.network/virtualnetworks' | project id,subnets=properties.subnets | mv-expand subnets | project id, subnetName = subnets.name, subnetPrefix = subnets.properties.addressPrefix | extend subnetPrefixLength = split(subnetPrefix, '/')[1] | where subnetName == 'AzureBastionSubnet' | extend compliant = (subnetPrefixLength <= 26) | distinct id, compliant", + "guid": "6eab9eb6-762b-485e-8ea8-15aa5dba0bd0", + "link": "https://learn.microsoft.com/azure/bastion/bastion-faq#subnet", + "service": "Bastion", + "severity": "Medium", + "text": "Use Azure Bastion in a subnet /26 or larger.", + "training": "https://learn.microsoft.com/training/modules/intro-to-azure-bastion/", + "waf": "Reliability" + }, + { + "arm-service": "microsoft.network/frontdoorwebApplicationFirewalls", + "checklist": "Azure Landing Zone Review", + "guid": "1d7aa9b6-4704-4489-a804-2d88e79d17b7", + "link": "https://learn.microsoft.com/azure/web-application-firewall/afds/afds-overview", + "service": "WAF", + "severity": "Medium", + "text": "Use Azure Front Door and WAF policies to provide global protection across Azure regions for inbound HTTP/S connections to a landing zone.", + "training": "https://learn.microsoft.com/learn/paths/secure-application-delivery/", + "waf": "Reliability" + }, + { + "arm-service": "microsoft.network/frontdoorwebApplicationFirewalls", + "checklist": "Azure Landing Zone Review", + "guid": "3b22a5a6-7e7a-48ed-9b30-e38c3f29812b", + "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/ag-overview", + "service": "WAF", + "severity": "Low", + "text": "When using Azure Front Door and Azure Application Gateway to help protect HTTP/S apps, use WAF policies in Azure Front Door. Lock down Azure Application Gateway to receive traffic only from Azure Front Door.", + "training": "https://learn.microsoft.com/learn/paths/secure-application-delivery/", + "waf": "Reliability" + }, + { + "arm-service": "microsoft.network/frontdoorwebApplicationFirewalls", + "checklist": "Azure Landing Zone Review", + "guid": "2363cefe-179b-4599-be0d-5973cd4cd21b", + "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/ag-overview", + "service": "WAF", + "severity": "High", + "text": "When WAFs and other reverse proxies are required for inbound HTTP/S connections, deploy them within a landing-zone virtual network and together with the apps that they're protecting and exposing to the internet.", + "training": "https://learn.microsoft.com/learn/paths/architect-network-infrastructure/", + "waf": "Reliability" + }, + { + "arm-service": "Microsoft.Network/virtualNetworks", + "checklist": "Azure Landing Zone Review", + "guid": "088137f5-e6c4-4cfd-9e50-4547c2447ec6", + "link": "https://learn.microsoft.com/azure/ddos-protection/ddos-protection-reference-architectures", + "service": "VNet", + "severity": "High", + "text": "Use Azure DDoS Network or IP Protection plans to help protect Public IP Addresses endpoints within the virtual networks.", + "training": "https://learn.microsoft.com/learn/paths/secure-networking-infrastructure/", + "waf": "Reliability" + }, + { + "arm-service": "Microsoft.Network/virtualNetworks", + "checklist": "Azure Landing Zone Review", + "guid": "b034c01e-110b-463a-b36e-e3346e57f225", + "link": "https://learn.microsoft.com/azure/virtual-network/ip-services/default-outbound-access", + "service": "VNet", + "severity": "High", + "text": "Plan for how to manage your network outbound traffic configuration and strategy before the upcoming breaking change. On September 30, 2025, default outbound access for new deployments will be retired and only explicit access configurations will be allowed.", + "training": "https://learn.microsoft.com/training/modules/configure-virtual-networks/", + "waf": "Reliability" + }, + { + "arm-service": "Microsoft.Network/virtualNetworks", + "checklist": "Azure Landing Zone Review", + "guid": "b1c82a3f-2320-4dfa-8972-7ae4823c8930", + "link": "https://learn.microsoft.com/azure/ddos-protection/ddos-protection-reference-architectures", + "service": "VNet", + "severity": "High", + "text": "Add diagnostic settings to save DDoS related logs for all the protected public IP addresses (DDoS IP or Network Protection).", + "training": "https://learn.microsoft.com/learn/paths/secure-networking-infrastructure/", + "waf": "Reliability" + }, + { + "arm-service": "Microsoft.Authorization/policyDefinitions", + "checklist": "Azure Landing Zone Review", + "guid": "3c5a808d-c695-4c14-a63c-c7ab7a510e41", + "link": "https://github.com/Azure/Enterprise-Scale/wiki/ALZ-Policies#corp", + "service": "Policy", + "severity": "High", + "text": "Ensure there is a policy assignment to deny Public IP addresses directly tied to Virtual Machines. Use exclusions if public IPs are needed on specific VMs.", + "training": "https://learn.microsoft.com/training/modules/configure-azure-policy/", + "waf": "Reliability" + }, + { + "arm-service": "microsoft.network/expressRouteCircuits", + "checklist": "Azure Landing Zone Review", + "guid": "359c373e-7dd6-4162-9a36-4a907ecae48e", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/ready/azure-best-practices/connectivity-to-azure", + "service": "ExpressRoute", + "severity": "Medium", + "text": "Use ExpressRoute as the primary connection to Azure. Use VPNs as a source of backup connectivity.", + "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", + "waf": "Performance" + }, + { + "arm-service": "microsoft.network/expressRouteCircuits", + "checklist": "Azure Landing Zone Review", + "description": "You can use AS-path prepending and connection weights to influence traffic from Azure to on-premises, and the full range of BGP attributes in your own routers to influence traffic from on-premises to Azure.", + "guid": "f29812b2-363c-4efe-879b-599de0d5973c", + "link": "https://learn.microsoft.com/azure/expressroute/expressroute-routing", + "service": "ExpressRoute", + "severity": "Medium", + "text": "When you use multiple ExpressRoute circuits or multiple on-prem locations, use BGP attributes to optimize routing.", + "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", + "waf": "Reliability" + }, + { + "arm-service": "microsoft.network/expressRouteCircuits", + "checklist": "Azure Landing Zone Review", + "graph": "resources| where type == 'microsoft.network/virtualnetworkgateways'| where properties.gatewayType =~ 'vpn' or properties.gatewayType == 'ExpressRoute'| extend SKUName = properties.sku.name, SKUTier = properties.sku.tier, Type = properties.gatewayType| extend compliant = SKUTier !in ('Basic', 'Standard')| project name, id, subscriptionId, resourceGroup, compliant", + "guid": "d4cd21b0-8813-47f5-b6c4-cfd3e504547c", + "link": "https://learn.microsoft.com/azure/expressroute/expressroute-about-virtual-network-gateways?source=recommendations#gwsku", + "service": "ExpressRoute", + "severity": "Medium", + "text": "Select the right SKU for the ExpressRoute/VPN gateways based on bandwidth and performance requirements.", + "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", + "waf": "Performance" + }, + { + "arm-service": "microsoft.network/expressRouteCircuits", + "checklist": "Azure Landing Zone Review", + "graph": "resources | where type=='microsoft.network/expressroutecircuits' | extend compliant = (tolower(sku.family) == 'metereddata' or tolower(sku.tier) == 'local') | distinct id,compliant", + "guid": "7025b442-f6e9-4af6-b11f-c9574916016f", + "link": "https://learn.microsoft.com/azure/expressroute/plan-manage-cost", + "service": "ExpressRoute", + "severity": "High", + "text": "Ensure that you're using unlimited-data ExpressRoute circuits only if you reach the bandwidth that justifies their cost.", + "training": "https://learn.microsoft.com/training/modules/design-implement-azure-expressroute/", + "waf": "Cost" + }, + { + "arm-service": "microsoft.network/expressRouteCircuits", + "checklist": "Azure Landing Zone Review", + "graph": "resources | where type=='microsoft.network/connections' | where properties.connectionType == 'ExpressRoute' | project id, gwid=tostring(properties.virtualNetworkGateway1.id), circuitid=tostring(properties.peer.id) | join (resources | where type=='microsoft.network/expressroutecircuits' | project circuitid=tostring(id), circuitsku=sku.tier) on circuitid | project id=gwid, compliant = (circuitsku == 'Local') | summarize compliant=max(compliant) by id", + "guid": "f4e7926a-ec35-476e-a412-5dd17136bd62", + "link": "https://learn.microsoft.com/azure/expressroute/expressroute-faqs#expressroute-local", + "service": "ExpressRoute", + "severity": "High", + "text": "Leverage the Local SKU of ExpressRoute to reduce the cost of your circuits, if your circuit peering location supports your Azure regions for the Local SKU.", + "training": "https://learn.microsoft.com/training/modules/design-implement-azure-expressroute/", + "waf": "Cost" + }, + { + "arm-service": "microsoft.network/expressRouteCircuits", + "checklist": "Azure Landing Zone Review", + "graph": "resources| where type == 'microsoft.network/virtualnetworkgateways'| where properties.gatewayType =~ 'vpn' or properties.gatewayType == 'ExpressRoute'| extend SKUName = properties.sku.name, SKUTier = properties.sku.tier, Type = properties.gatewayType| extend compliant = SKUTier contains 'AZ'| project name, id, subscriptionId, resourceGroup, Type, compliant", + "guid": "2447ec66-138a-4720-8f1c-e16ed301d6e8", + "link": "https://learn.microsoft.com/azure/expressroute/expressroute-about-virtual-network-gateways", + "service": "ExpressRoute", + "severity": "Medium", + "text": "Deploy a zone-redundant ExpressRoute gateway in the supported Azure regions.", + "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", + "waf": "Reliability" + }, + { + "arm-service": "microsoft.network/expressRouteCircuits", + "checklist": "Azure Landing Zone Review", + "guid": "72e52e36-11cc-458b-9a4b-1511e43a58a9", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/ready/azure-best-practices/connectivity-to-azure", + "service": "ExpressRoute", + "severity": "Medium", + "text": "For scenarios that require bandwidth higher than 10 Gbps or dedicated 10/100-Gbps ports, use ExpressRoute Direct.", + "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", + "waf": "Performance" + }, + { + "arm-service": "microsoft.network/expressRouteCircuits", + "checklist": "Azure Landing Zone Review", + "guid": "c2299c4d-7b57-4d0c-9555-62f2b3e4563a", + "link": "https://learn.microsoft.com/azure/expressroute/about-fastpath", + "service": "ExpressRoute", + "severity": "Medium", + "text": "When low latency is required, or throughput from on-premises to Azure must be greater than 10 Gbps, enable FastPath to bypass the ExpressRoute gateway from the data path.", + "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", + "waf": "Performance" + }, + { + "arm-service": "microsoft.network/virtualNetworkGateways", + "checklist": "Azure Landing Zone Review", + "graph": "resources | where type=='microsoft.network/virtualnetworkgateways' | where properties.gatewayType == 'Vpn' | extend compliant = (tolower(properties.sku.name) contains 'az') | distinct id, compliant", + "guid": "4d873974-8b66-42d6-b15f-512a65498f6d", + "link": "https://learn.microsoft.com/azure/vpn-gateway/create-zone-redundant-vnet-gateway", + "service": "VPN", + "severity": "Medium", + "text": "Use zone-redundant VPN gateways to connect branches or remote locations to Azure (where available).", + "training": "https://learn.microsoft.com/training/modules/intro-to-azure-vpn-gateway/", + "waf": "Reliability" + }, + { + "arm-service": "microsoft.network/virtualNetworkGateways", + "checklist": "Azure Landing Zone Review", + "guid": "45866df8-cf85-4ca9-bbe2-65ec1478919e", + "link": "https://learn.microsoft.com/azure/vpn-gateway/vpn-gateway-highlyavailable", + "service": "VPN", + "severity": "Medium", + "text": "Use redundant VPN appliances on-premises (active/active or active/passive).", + "training": "https://learn.microsoft.com/training/modules/intro-to-azure-vpn-gateway/", + "waf": "Reliability" + }, + { + "arm-service": "microsoft.network/expressRouteCircuits", + "checklist": "Azure Landing Zone Review", + "guid": "718cb437-b060-2589-8856-2e93a5c6633b", + "link": "https://learn.microsoft.com/azure/expressroute/expressroute-erdirect-about", + "service": "ExpressRoute", + "severity": "High", + "text": "If using ExpressRoute Direct, consider using ExpressRoute Local circuits to the local Azure regions to save costs.", + "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", + "waf": "Cost" + }, + { + "arm-service": "microsoft.network/expressRouteCircuits", + "checklist": "Azure Landing Zone Review", + "guid": "8042d88e-79d1-47b7-9b22-a5a67e7a8ed4", + "link": "https://learn.microsoft.com/azure/architecture/framework/services/networking/expressroute/reliability", + "service": "ExpressRoute", + "severity": "Medium", + "text": "When traffic isolation or dedicated bandwidth is required, such as for separating production and nonproduction environments, use different ExpressRoute circuits. It will help you ensure isolated routing domains and alleviate noisy-neighbor risks.", + "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", + "waf": "Reliability" + }, + { + "arm-service": "microsoft.network/expressRouteCircuits", + "checklist": "Azure Landing Zone Review", + "guid": "b30e38c3-f298-412b-8363-cefe179b599d", + "link": "https://learn.microsoft.com/azure/expressroute/expressroute-monitoring-metrics-alerts", + "service": "ExpressRoute", + "severity": "Medium", + "text": "Monitor ExpressRoute availability and utilization using built-in Express Route Insights.", + "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", + "waf": "Operations" + }, + { + "arm-service": "microsoft.network/expressRouteCircuits", + "checklist": "Azure Landing Zone Review", + "guid": "5bf68dc9-325e-4873-bf88-f8214ef2e5d2", + "link": "https://learn.microsoft.com/azure/expressroute/how-to-configure-connection-monitor", + "service": "ExpressRoute", + "severity": "Medium", + "text": "Use Connection Monitor for connectivity monitoring across the network, especially between on-premises and Azure.", + "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", + "waf": "Operations" + }, + { + "arm-service": "microsoft.network/expressRouteCircuits", + "checklist": "Azure Landing Zone Review", + "graph": "resources | where type=='microsoft.network/connections' | where properties.connectionType == 'ExpressRoute' | project cxId=id, gwId=tostring(properties.virtualNetworkGateway1.id), circuitId=tostring(properties.peer.id) | join (resources | where type=='microsoft.network/expressroutecircuits' | project circuitId=tostring(id), circuitLocation=tostring(properties.serviceProviderProperties.peeringLocation)) on circuitId | distinct gwId, circuitLocation | summarize countErLocations=count() by id=gwId | extend compliant = (countErLocations >= 2)", + "guid": "e0d5973c-d4cd-421b-8881-37f5e6c4cfd3", + "link": "https://learn.microsoft.com/azure/expressroute/designing-for-disaster-recovery-with-expressroute-privatepeering#need-for-redundant-connectivity-solution", + "service": "ExpressRoute", + "severity": "Medium", + "text": "Use ExpressRoute circuits from different peering locations for redundancy.", + "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", + "waf": "Reliability" + }, + { + "arm-service": "microsoft.network/expressRouteCircuits", + "checklist": "Azure Landing Zone Review", + "guid": "cf3fe65c-fec0-495a-8edc-9675200f2add", + "link": "https://learn.microsoft.com/azure/expressroute/expressroute-howto-coexist-resource-manager", + "service": "ExpressRoute", + "severity": "Medium", + "text": "Use site-to-site VPN as failover of ExpressRoute, if only using a single ExpressRoute circuit.", + "training": "https://learn.microsoft.com/training/modules/design-implement-azure-expressroute/", + "waf": "Reliability" + }, + { + "arm-service": "microsoft.network/expressRouteCircuits", + "checklist": "Azure Landing Zone Review", + "graph": "resources | where type=='microsoft.network/virtualnetworks' | project id,resourceGroup,name,subnets=properties.subnets | mv-expand subnets | project id,resourceGroup,name,subnetName=tostring(subnets.name),routeTableId=tostring(subnets.properties.routeTable.id) | where subnetName == 'GatewaySubnet' | join kind=leftouter (Resources | where type == 'microsoft.network/routetables' | project routeTableName=name,routeTableId=id, disableBgpRoutePropagation=properties.disableBgpRoutePropagation) on routeTableId | project id,compliant = (disableBgpRoutePropagation == False or isnull(disableBgpRoutePropagation))", + "guid": "72105cc8-aaea-4ee1-8c7a-ad25977afcaf", + "link": "https://learn.microsoft.com/azure/vpn-gateway/vpn-gateway-about-vpn-gateway-settings#gwsub", + "service": "ExpressRoute", + "severity": "High", + "text": "If you are using a route table in the GatewaySubnet, make sure that gateway routes are propagated.", + "waf": "Reliability" + }, + { + "arm-service": "microsoft.network/expressRouteCircuits", + "checklist": "Azure Landing Zone Review", + "guid": "d581a947-69a2-4783-942e-9df3664324c8", + "link": "https://learn.microsoft.com/azure/expressroute/designing-for-high-availability-with-expressroute#active-active-connections", + "service": "ExpressRoute", + "severity": "High", + "text": "If using ExpressRoute, your on-premises routing should be dynamic: in the event of a connection failure it should converge to the remaining connection of the circuit. Load should be shared across both connections ideally as active/active, although active/passive is supported too.", + "training": "https://learn.microsoft.com/training/modules/design-implement-azure-expressroute/", + "waf": "Reliability" + }, + { + "arm-service": "microsoft.network/expressRouteCircuits", + "checklist": "Azure Landing Zone Review", + "guid": "b258f058-b9f6-46cd-b28d-990106f0c3f8", + "link": "https://learn.microsoft.com/azure/expressroute/designing-for-high-availability-with-expressroute", + "service": "ExpressRoute", + "severity": "Medium", + "text": "Ensure the two physical links of your ExpressRoute circuit are connected to two distinct edge devices in your network.", + "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", + "waf": "Reliability" + }, + { + "arm-service": "microsoft.network/expressRouteCircuits", + "checklist": "Azure Landing Zone Review", + "guid": "fe2a1b53-6fbd-4c67-b58a-85d7c7a0afcb", + "link": "https://learn.microsoft.com/azure/expressroute/expressroute-bfd", + "service": "ExpressRoute", + "severity": "Medium", + "text": "Ensure Bidirectional Forwarding Detection (BFD) is enabled and configured on customer or provider edge routing devices.", + "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", + "waf": "Reliability" + }, + { + "arm-service": "microsoft.network/expressRouteCircuits", + "checklist": "Azure Landing Zone Review", + "guid": "669b215a-ce43-4371-8f6f-11047f6490f1", + "link": "https://learn.microsoft.com/azure/expressroute/designing-for-disaster-recovery-with-expressroute-privatepeering", + "service": "ExpressRoute", + "severity": "High", + "text": "Connect the ExpressRoute Gateway to two or more circuits from different peering locations for higher resiliency.", + "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", + "waf": "Reliability" + }, + { + "arm-service": "microsoft.network/expressRouteCircuits", + "checklist": "Azure Landing Zone Review", + "guid": "3f79ed00-203b-4c95-9efd-691505f5a1f9", + "link": "https://learn.microsoft.com/azure/vpn-gateway/vpn-gateway-howto-setup-alerts-virtual-network-gateway-log", + "service": "ExpressRoute", + "severity": "Medium", + "text": "Configure diagnostic logs and alerts for ExpressRoute virtual network gateway.", + "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", + "waf": "Operations" + }, + { + "arm-service": "microsoft.network/expressRouteCircuits", + "checklist": "Azure Landing Zone Review", + "guid": "5234c93f-b651-41dd-80c1-234177b91ced", + "link": "https://learn.microsoft.com/azure/expressroute/virtual-network-connectivity-guidance", + "service": "ExpressRoute", + "severity": "Medium", + "text": "Do not use ExpressRoute circuits for VNet-to-VNet communication.", + "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", + "waf": "Performance" + }, + { + "checklist": "Azure Landing Zone Review", + "guid": "8ac6a9e0-1e6a-483d-b5de-32c199248160", + "link": "https://learn.microsoft.com/azure/virtual-wan/virtual-wan-about", + "service": "N/A", + "severity": "Low", + "text": "Do not send Azure traffic to hybrid locations for inspection. Instead, follow the principle 'traffic in Azure stays in Azure' so that communication across resources in Azure occurs via the Microsoft backbone network.", + "waf": "Performance" + }, + { + "arm-service": "Microsoft.Network/azureFirewalls", + "checklist": "Azure Landing Zone Review", + "guid": "e6c4cfd3-e504-4547-a244-7ec66138a720", + "link": "https://learn.microsoft.com/azure/firewall/overview", + "service": "Firewall", + "severity": "High", + "text": "Use Azure Firewall to govern Azure outbound traffic to the internet, non-HTTP/S inbound connections, and East/West traffic filtering (if the organization requires it).", + "training": "https://learn.microsoft.com/learn/paths/secure-networking-infrastructure/", + "waf": "Reliability" + }, + { + "arm-service": "Microsoft.Network/azureFirewalls", + "checklist": "Azure Landing Zone Review", + "guid": "5a4b1511-e43a-458a-ac22-99c4d7b57d0c", + "link": "https://learn.microsoft.com/azure/firewall-manager/policy-overview", + "service": "Firewall", + "severity": "Medium", + "text": "Create a global Azure Firewall policy to govern security posture across the global network environment and assign it to all Azure Firewall instances. Allow for granular policies to meet requirements of specific regions by delegating incremental firewall policies to local security teams via Azure role-based access control.", + "training": "https://learn.microsoft.com/learn/paths/secure-networking-infrastructure/", + "waf": "Reliability" + }, + { + "arm-service": "Microsoft.Network/azureFirewalls", + "checklist": "Azure Landing Zone Review", + "guid": "655562f2-b3e4-4563-a4d8-739748b662d6", + "link": "https://learn.microsoft.com/azure/firewall-manager/deploy-trusted-security-partner", + "service": "Firewall", + "severity": "Low", + "text": "Configure supported partner SaaS security providers within Firewall Manager if the organization wants to use such solutions to help protect outbound connections.", + "training": "https://learn.microsoft.com/learn/paths/secure-networking-infrastructure/", + "waf": "Reliability" + }, + { + "arm-service": "Microsoft.Network/azureFirewalls", + "checklist": "Azure Landing Zone Review", + "graph": "resources | where type=='microsoft.network/firewallpolicies' | extend compliant = (properties.dnsSettings.enableProxy == true) | distinct id,compliant", + "guid": "14d99880-2f88-47e8-a134-62a7d85c94af", + "link": "https://learn.microsoft.com/azure/firewall/fqdn-filtering-network-rules", + "service": "Firewall", + "severity": "High", + "text": "Use application rules to filter outbound traffic on destination host name for supported protocols. Use FQDN-based network rules and Azure Firewall with DNS proxy to filter egress traffic to the Internet over other protocols.", + "training": "https://learn.microsoft.com/learn/paths/secure-networking-infrastructure/", + "waf": "Reliability" + }, + { + "arm-service": "Microsoft.Network/azureFirewalls", + "checklist": "Azure Landing Zone Review", + "graph": "resources | where type=='microsoft.network/firewallpolicies' | extend compliant = (properties.sku.tier == 'Premium') | distinct id,compliant", + "guid": "c10d51ef-f999-455d-bba0-5c90ece07447", + "link": "https://learn.microsoft.com/azure/firewall/premium-features", + "service": "Firewall", + "severity": "High", + "text": "Use Azure Firewall Premium to enable additional security features.", + "training": "https://learn.microsoft.com/training/modules/introduction-azure-firewall/", + "waf": "Reliability" + }, + { + "arm-service": "Microsoft.Network/azureFirewalls", + "checklist": "Azure Landing Zone Review", + "graph": "resources | where type=='microsoft.network/firewallpolicies' | extend compliant = (properties.threatIntelMode == 'Deny') | distinct id,compliant", + "guid": "e9c8f584-6d5e-473b-8dc5-acc9fbaab4e3", + "link": "https://learn.microsoft.com/azure/firewall/premium-features#idps-signature-rules", + "service": "Firewall", + "severity": "High", + "text": "Configure Azure Firewall Threat Intelligence mode to Alert and Deny for additional protection.", + "waf": "Reliability" + }, + { + "arm-service": "Microsoft.Network/azureFirewalls", + "checklist": "Azure Landing Zone Review", + "graph": "resources | where type=='microsoft.network/firewallpolicies' | extend compliant = (properties.intrusionDetection.mode == 'Deny') | project id, compliant", + "guid": "b9d0dff5-bdd4-4cd8-88ed-5811610b2b2c", + "link": "https://learn.microsoft.com/azure/firewall/premium-features#idps", + "service": "Firewall", + "severity": "High", + "text": "Configure Azure Firewall IDPS mode to Deny for additional protection.", + "training": "https://learn.microsoft.com/training/modules/introduction-azure-firewall/", + "waf": "Reliability" + }, + { + "arm-service": "Microsoft.Network/azureFirewalls", + "checklist": "Azure Landing Zone Review", + "graph": "resources | where type=='microsoft.network/virtualnetworks' | project id,resourceGroup,name,subnets=properties.subnets | mv-expand subnets | project id,name,subnetId=tostring(subnets.id), subnetName=tostring(subnets.name),subnetRT=subnets.properties.routeTable.id | where not (subnetName in ('GatewaySubnet', 'AzureFirewallSubnet', 'RouteServerSubnet', 'AzureBastionSubnet')) | extend hasRT = isnotnull(subnetRT) | distinct id, hasRT, subnetId | join kind=fullouter (resources | where type == 'microsoft.network/virtualnetworks' | mvexpand properties.virtualNetworkPeerings | extend isVWAN=(tolower(split(properties_virtualNetworkPeerings.name, '_')[0]) == 'remotevnettohubpeering') | mv-expand properties.subnets | project id, isVWAN, name, subnetId=tostring(properties_subnets.id), subnetName=tostring(properties_subnets.name) | summarize PeeredToVWAN=max(isVWAN) by id, subnetId | project id, subnetId, isVWANpeer = (PeeredToVWAN == true)) on subnetId | project id=iff(isnotempty(id), id, id1), subnetId=iff(isnotempty(subnetId), subnetId, subnetId1), hasRT, isVWANpeer | extend compliant = (hasRT==true or isVWANpeer==true) | distinct id, subnetId, compliant", + "guid": "a3784907-9836-4271-aafc-93535f8ec08b", + "link": "https://learn.microsoft.com/azure/virtual-network/virtual-networks-udr-overview", + "service": "Firewall", + "severity": "High", + "text": "For subnets in VNets not connected to Virtual WAN, attach a route table so that Internet traffic is redirected to Azure Firewall or a Network Virtual Appliance.", + "waf": "Reliability" + }, + { + "arm-service": "Microsoft.Network/azureFirewalls", + "checklist": "Azure Landing Zone Review", + "guid": "715d833d-4708-4527-90ac-1b142c7045ba", + "link": "https://learn.microsoft.com/azure/firewall/firewall-structured-logs", + "service": "Firewall", + "severity": "Medium", + "text": "Add diagnostic settings to save logs, using the Resource Specific destination table, for all Azure Firewall deployments.", + "training": "https://learn.microsoft.com/learn/paths/secure-networking-infrastructure/", + "waf": "Operations" + }, + { + "arm-service": "Microsoft.Network/azureFirewalls", + "checklist": "Azure Landing Zone Review", + "guid": "e960fc6b-4ab2-4db6-9609-3745135f9ffa", + "link": "https://learn.microsoft.com/azure/firewall-manager/migrate-to-policy", + "service": "Firewall", + "severity": "Important", + "text": "Migrate from Azure Firewall Classic rules (if exist) to Firewall Policy.", + "training": "https://learn.microsoft.com/learn/paths/secure-networking-infrastructure/", + "waf": "Operations" + }, + { + "arm-service": "Microsoft.Network/azureFirewalls", + "checklist": "Azure Landing Zone Review", + "graph": "resources | where type=='microsoft.network/virtualnetworks' | project id,subnets=properties.subnets | mv-expand subnets | project id, subnetName = subnets.name, subnetPrefix = subnets.properties.addressPrefix | extend subnetPrefixLength = split(subnetPrefix, '/')[1] | where subnetName == 'AzureFirewallSubnet' | extend compliant = (subnetPrefixLength == 26) | distinct id, compliant", + "guid": "22d6419e-b627-4d95-9e7d-019fa759387f", + "link": "https://learn.microsoft.com/azure/firewall/firewall-faq#why-does-azure-firewall-need-a--26-subnet-size", + "service": "Firewall", + "severity": "High", + "text": "Use a /26 prefix for your Azure Firewall subnets.", + "training": "https://learn.microsoft.com/training/modules/introduction-azure-firewall/", + "waf": "Reliability" + }, + { + "arm-service": "Microsoft.Network/azureFirewalls", + "checklist": "Azure Landing Zone Review", + "guid": "828cec2e-af6c-40c2-8fa2-1b681ee63eb7", + "link": "https://learn.microsoft.com/azure/firewall-manager/rule-hierarchy", + "service": "Firewall", + "severity": "Medium", + "text": "Arrange rules within the firewall policy into Rule Collection Groups and Rule Collections and based on their frequency of use.", + "training": "https://learn.microsoft.com/training/modules/intro-to-azure-firewall-manager/", + "waf": "Performance" + }, + { + "arm-service": "Microsoft.Network/azureFirewalls", + "checklist": "Azure Landing Zone Review", + "guid": "0da83bb1-2f39-49af-b5c9-835fc455e3d1", + "link": "https://learn.microsoft.com/azure/firewall/ip-groups", + "service": "Firewall", + "severity": "Medium", + "text": "Use IP Groups or IP prefixes to reduce number of IP table rules.", + "waf": "Performance" + }, + { + "arm-service": "Microsoft.Network/azureFirewalls", + "checklist": "Azure Landing Zone Review", + "guid": "c44c6f0e-1642-4a61-a17b-0922f835c93a", + "link": "https://learn.microsoft.com/azure/firewall/tutorial-firewall-dnat", + "service": "Firewall", + "severity": "Medium", + "text": "Do not use wildcards as a source IP for DNATS, such as * or any, you should specify source IPs for incoming DNATs.", + "training": "https://learn.microsoft.com/training/modules/introduction-to-azure-virtual-networks/", + "waf": "Performance" + }, + { + "arm-service": "Microsoft.Network/azureFirewalls", + "checklist": "Azure Landing Zone Review", + "guid": "7371dc21-251a-47a3-af14-6e01b9da4757", + "link": "https://learn.microsoft.com/azure/firewall/integrate-with-nat-gateway", + "service": "Firewall", + "severity": "Medium", + "text": "Prevent SNAT Port exhaustion by monitoring SNAT port usage, evaluating NAT Gateway settings, and ensuring seamless failover. If the port count approaches the limit, it’s a sign that SNAT exhaustion might be imminent.", + "training": "https://learn.microsoft.com/training/modules/introduction-to-azure-virtual-networks/", + "waf": "Performance" + }, + { + "arm-service": "Microsoft.Network/azureFirewalls", + "checklist": "Azure Landing Zone Review", + "guid": "346840b8-1064-496e-8396-4b1340172d52", + "link": "https://learn.microsoft.com/azure/firewall/premium-features#tls-inspection", + "service": "Firewall", + "severity": "High", + "text": "If you are using Azure Firewall Premium, enable TLS Inspection.", + "waf": "Performance" + }, + { + "arm-service": "Microsoft.Network/azureFirewalls", + "checklist": "Azure Landing Zone Review", + "guid": "39990a13-915c-45f9-a2d3-562d7d6c4b7c", + "link": "https://learn.microsoft.com/azure/firewall/premium-features#web-categories", + "service": "Firewall", + "severity": "Low", + "text": "Use web categories to allow or deny outbound access to specific topics.", + "waf": "Performance" + }, + { + "arm-service": "Microsoft.Network/azureFirewalls", + "checklist": "Azure Landing Zone Review", + "guid": "6eff7e6c-6c4a-43d7-be3f-6641c2cb3d4a", + "link": "https://learn.microsoft.com/azure/architecture/example-scenario/gateway/application-gateway-before-azure-firewall", + "service": "Firewall", + "severity": "Medium", + "text": "As part of your TLS inspection, plan for receiving traffic from Azure App Gateways for inspection.", + "training": "https://learn.microsoft.com/training/modules/configure-azure-application-gateway/", + "waf": "Performance" + }, + { + "arm-service": "Microsoft.Network/azureFirewalls", + "checklist": "Azure Landing Zone Review", + "guid": "94f3eede-9aa3-4088-92a3-bb9a56509fad", + "link": "https://learn.microsoft.com/azure/firewall/dns-details", + "service": "Firewall", + "severity": "Medium", + "text": "Enable Azure Firewall DNS proxy configuration.", + "training": "https://learn.microsoft.com/training/courses/az-700t00/", + "waf": "Reliability" + }, + { + "arm-service": "Microsoft.Network/azureFirewalls", + "checklist": "Azure Landing Zone Review", + "guid": "1dc04554-dece-4ffb-a49e-5c683e09f8da", + "link": "https://learn.microsoft.com/azure/firewall/firewall-diagnostics", + "service": "Firewall", + "severity": "High", + "text": "Integrate Azure Firewall with Azure Monitor and enable diagnostic logging to store and analyze firewall logs.", + "training": "https://learn.microsoft.com/training/courses/az-700t00/", + "waf": "Operations" + }, + { + "arm-service": "Microsoft.Network/azureFirewalls", + "checklist": "Azure Landing Zone Review", + "guid": "64e7000e-3c06-485e-b455-ced7f454cba3", + "link": "https://learn.microsoft.com/azure/well-architected/service-guides/azure-firewall", + "service": "Firewall", + "severity": "Low", + "text": "Implement backups for your firewall rules", + "training": "https://learn.microsoft.com/training/courses/az-104t00/", + "waf": "Operations" + }, + { + "arm-service": "microsoft.network/applicationGateways", + "checklist": "Azure Landing Zone Review", + "guid": "d301d6e8-72e5-42e3-911c-c58b5a4b1511", + "link": "https://learn.microsoft.com/azure/virtual-network/vnet-integration-for-azure-services", + "service": "AppGW", + "severity": "High", + "text": "Do not disrupt control-plane communication for Azure PaaS services injected into a virtual networks, such as with a 0.0.0.0/0 route or an NSG rule that blocks control plane traffic.", + "training": "https://learn.microsoft.com/learn/paths/implement-network-security/?source=learn", + "waf": "Reliability" + }, + { + "arm-service": "microsoft.network/expressRouteCircuits", + "checklist": "Azure Landing Zone Review", + "guid": "b3e4563a-4d87-4397-98b6-62d6d15f512a", + "link": "https://learn.microsoft.com/azure/private-link/private-endpoint-overview", + "service": "ExpressRoute", + "severity": "Medium", + "text": "Access Azure PaaS services from on-premises via private endpoints and ExpressRoute private peering. This method avoids transiting over the public internet.", + "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", + "waf": "Reliability" + }, + { + "arm-service": "Microsoft.Network/virtualNetworks", + "checklist": "Azure Landing Zone Review", + "graph": "resources | where type =~ 'microsoft.network/virtualnetworks' | project id,resourceGroup,name,subnets = properties.subnets | mv-expand subnets | project id = subnets.id, resourceGroup, VNet = name, serviceEndpoints = subnets.properties.serviceEndpoints, compliant = (isnull(subnets.properties.serviceEndpoints) or array_length(subnets.properties.serviceEndpoints) == 0) | order by compliant asc", + "guid": "4704489a-8042-4d88-b79d-17b73b22a5a6", + "link": "https://learn.microsoft.com/azure/virtual-network/virtual-network-service-endpoints-overview", + "service": "VNet", + "severity": "High", + "text": "Don't enable virtual network service endpoints by default on all subnets.", + "training": "https://learn.microsoft.com/learn/paths/implement-network-security/?source=learn", + "waf": "Reliability" + }, + { + "arm-service": "Microsoft.Network/azureFirewalls", + "checklist": "Azure Landing Zone Review", + "guid": "7e7a8ed4-b30e-438c-9f29-812b2363cefe", + "link": "azure/private-link/inspect-traffic-with-azure-firewall", + "service": "Firewall", + "severity": "Medium", + "text": "Filter egress traffic to Azure PaaS services using FQDNs instead of IP addresses in Azure Firewall or an NVA to prevent data exfiltration. If using Private Link you can block all FQDNs, otherwise allow only the required PaaS services.", + "training": "https://learn.microsoft.com/learn/paths/implement-network-security/?source=learn", + "waf": "Reliability" + }, + { + "arm-service": "microsoft.network/expressRouteCircuits", + "checklist": "Azure Landing Zone Review", + "graph": "resources | where type=='microsoft.network/virtualnetworks' | project id,subnets=properties.subnets | mv-expand subnets | project id, subnetName = subnets.name, subnetPrefix = subnets.properties.addressPrefix | extend subnetPrefixLength = split(subnetPrefix, '/')[1] | where subnetName == 'GatewaySubnet' | extend compliant = (subnetPrefixLength <= 27) | distinct id, compliant", + "guid": "f2aad7e3-bb03-4adc-8606-4123d342a917", + "link": "https://learn.microsoft.com/azure/expressroute/expressroute-howto-add-gateway-resource-manager#add-a-gateway", + "service": "ExpressRoute", + "severity": "High", + "text": "Use at least a /27 prefix for your Gateway subnets.", + "waf": "Reliability" + }, + { + "arm-service": "Microsoft.Network/networkSecurityGroups", + "checklist": "Azure Landing Zone Review", + "graph": "resources | where type=='microsoft.network/networksecuritygroups' | mvexpand properties.securityRules | project id,name,ruleAction=properties_securityRules.properties.access,rulePriority=properties_securityRules.properties.priority,ruleDst=properties_securityRules.properties.destinationAddressPrefix,ruleSrc=properties_securityRules.properties.sourceAddressPrefix,ruleProt=properties_securityRules.properties.protocol,ruleDirection=properties_securityRules.properties.direction,rulePort=properties_securityRules.properties.destinationPortRange | summarize StarDenies=countif(ruleAction=='Deny' and ruleDst=='*' and ruleSrc=='*' and ruleProt=='*' and rulePort=='*') by id,tostring(ruleDirection) | where ruleDirection == 'Inbound' | project id,compliant=(StarDenies>0) | union (resources | where type=='microsoft.network/networksecuritygroups' | where array_length(properties.securityRules)==0 | extend compliant=false | project id,compliant)", + "guid": "11deb39d-8299-4e47-bbe0-0fb5a36318a8", + "link": "https://learn.microsoft.com/azure/virtual-network/service-tags-overview#available-service-tags", + "service": "NSG", + "severity": "High", + "text": "Don't rely on the NSG inbound default rules using the VirtualNetwork service tag to limit connectivity.", + "waf": "Reliability" + }, + { + "arm-service": "Microsoft.Network/networkSecurityGroups", + "checklist": "Azure Landing Zone Review", + "guid": "872e52e3-611c-4c58-a5a4-b1511e43a58a", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/ready/azure-best-practices/plan-for-landing-zone-network-segmentation", + "service": "NSG", + "severity": "Medium", + "text": "Use NSGs to help protect traffic across subnets, as well as east/west traffic across the platform (traffic between landing zones).", + "training": "https://learn.microsoft.com/learn/paths/implement-network-security/", + "waf": "Reliability" + }, + { + "arm-service": "Microsoft.Network/networkSecurityGroups", + "checklist": "Azure Landing Zone Review", + "guid": "a4d87397-48b6-462d-9d15-f512a65498f6", + "link": "https://learn.microsoft.com/azure/virtual-network/network-security-group-how-it-works", + "service": "NSG", + "severity": "Medium", + "text": "Use NSGs and application security groups to micro-segment traffic within the landing zone and avoid using a central NVA to filter traffic flows.", + "training": "https://learn.microsoft.com/learn/paths/implement-network-security/", + "waf": "Reliability" + }, + { + "arm-service": "Microsoft.Network/networkSecurityGroups", + "checklist": "Azure Landing Zone Review", + "guid": "dfe237de-143b-416c-91d7-aa9b64704489", + "link": "https://learn.microsoft.com/azure/network-watcher/vnet-flow-logs-overview", + "service": "NSG", + "severity": "Medium", + "text": "Enable VNet Flow Logs and feed them into Traffic Analytics to gain insights into internal and external traffic flows.", + "training": "https://learn.microsoft.com/learn/modules/design-implement-network-monitoring/", + "waf": "Reliability" + }, + { + "arm-service": "Microsoft.Network/networkSecurityGroups", + "checklist": "Azure Landing Zone Review", + "graph": "resources | where type == 'microsoft.network/networksecuritygroups' | project id, rules = array_length(properties.securityRules) | project id, compliant = (rules < 900)", + "guid": "0390417d-53dc-44d9-b3f4-c8832f359b41", + "link": "https://learn.microsoft.com/azure/azure-resource-manager/management/azure-subscription-service-limits", + "service": "NSG", + "severity": "Medium", + "text": "Do not implement more than 900 NSG rules per NSG, due to the limit of 1000 rules.", + "training": "https://learn.microsoft.com/azure/virtual-network/network-security-group-how-it-works", + "waf": "Reliability" + }, + { + "arm-service": "microsoft.network/virtualWans", + "checklist": "Azure Landing Zone Review", + "guid": "412e7f98-3f63-4047-82dd-69c5b5c2622f", + "link": "https://learn.microsoft.com/azure/virtual-wan/scenario-any-to-any", + "service": "VWAN", + "severity": "Medium", + "text": "Use Virtual WAN if your scenario is explicitly described in the list of Virtual WAN routing designs.", + "training": "https://learn.microsoft.com/learn/modules/introduction-azure-virtual-wan/", + "waf": "Operations" + }, + { + "arm-service": "microsoft.network/virtualWans", + "checklist": "Azure Landing Zone Review", + "guid": "54b69bad-33aa-4d5e-ac68-e1d76667313b", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/ready/azure-best-practices/virtual-wan-network-topology#virtual-wan-network-design-recommendationst", + "service": "VWAN", + "severity": "Medium", + "text": "Use a Virtual WAN hub per Azure region to connect multiple landing zones together across Azure regions via a common global Azure Virtual WAN.", + "training": "https://learn.microsoft.com/training/modules/introduction-azure-virtual-wan/", + "waf": "Performance" + }, + { + "arm-service": "microsoft.network/virtualWans", + "checklist": "Azure Landing Zone Review", + "graph": "resources | where type=='microsoft.network/virtualhubs' | extend compliant = isnotnull(properties.azureFirewall.id) | project id, compliant", + "guid": "7d5d1e4e-6146-458d-9558-fd77249b8211", + "link": "https://learn.microsoft.com/azure/virtual-wan/howto-firewall", + "service": "VWAN", + "severity": "Medium", + "text": "For outbound Internet traffic protection and filtering, deploy Azure Firewall in secured hubs.", + "training": "https://learn.microsoft.com/learn/paths/secure-networking-infrastructure/", + "waf": "Reliability" + }, + { + "arm-service": "microsoft.network/virtualWans", + "checklist": "Azure Landing Zone Review", + "guid": "6667313b-4f56-464b-9e98-4a859c773e7d", + "link": "https://learn.microsoft.com/azure/virtual-wan/migrate-from-hub-spoke-topology", + "service": "VWAN", + "severity": "Medium", + "text": "Ensure that your virtual WAN network architecture aligns to an identified architecture scenario.", + "training": "https://learn.microsoft.com/training/modules/introduction-azure-virtual-wan/", + "waf": "Reliability" + }, + { + "arm-service": "microsoft.network/virtualWans", + "checklist": "Azure Landing Zone Review", + "guid": "261623a7-65a9-417e-8f34-8ef254c27d42", + "link": "https://learn.microsoft.com/azure/virtual-wan/azure-monitor-insights", + "service": "VWAN", + "severity": "Medium", + "text": "Use Azure Monitor Insights for Virtual WAN to monitor the end-to-end topology of the Virtual WAN, status, and key metrics.", + "training": "https://learn.microsoft.com/training/modules/introduction-azure-virtual-wan/", + "waf": "Operations" + }, + { + "arm-service": "microsoft.network/virtualWans", + "checklist": "Azure Landing Zone Review", + "guid": "727c77e1-b9aa-4a37-a024-129d042422c1", + "link": "https://learn.microsoft.com/azure/virtual-wan/virtual-wan-faq#is-branch-to-branch-connectivity-allowed-in-virtual-wan", + "service": "VWAN", + "severity": "Medium", + "text": "Do not disable branch-to-branch traffic in Virtual WAN, unless these flows should be explicitly blocked.", + "training": "https://learn.microsoft.com/training/modules/introduction-azure-virtual-wan/", + "waf": "Reliability" + }, + { + "arm-service": "microsoft.network/virtualWans", + "checklist": "Azure Landing Zone Review", + "guid": "d49ac006-6670-4bc9-9948-d3e0a3a94f4d", + "link": "https://learn.microsoft.com/azure/virtual-wan/about-virtual-hub-routing-preference", + "service": "VWAN", + "severity": "Medium", + "text": "Use AS-Path as hub routing preference, since it is more flexible than ExpressRoute or VPN.", + "training": "https://learn.microsoft.com/training/modules/introduction-azure-virtual-wan/", + "waf": "Reliability" + }, + { + "arm-service": "microsoft.network/virtualWans", + "checklist": "Azure Landing Zone Review", + "guid": "2586b854-237e-47f1-84a1-d45d4cd2310d", + "link": "https://learn.microsoft.com/azure/virtual-wan/about-virtual-hub-routing#labels", + "service": "VWAN", + "severity": "Medium", + "text": "Configure label-based propagation in Virtual WAN, otherwise connectivity between virtual hubs will be impaired.", + "training": "https://learn.microsoft.com/training/modules/introduction-azure-virtual-wan/", + "waf": "Reliability" + }, + { + "arm-service": "microsoft.network/virtualWans", + "checklist": "Azure Landing Zone Review", + "guid": "9c75dfef-573c-461c-a698-68598595581a", + "link": "https://learn.microsoft.com/azure/virtual-wan/virtual-wan-faq#what-is-the-recommended-hub-address-space-during-hub-creation", + "service": "VWAN", + "severity": "High", + "text": "Assign at least a /23 prefix to virtual hubs to ensure enough IP space is available.", + "training": "https://learn.microsoft.com/training/modules/introduction-azure-virtual-wan/", + "waf": "Reliability" + }, + { + "arm-service": "Microsoft.Authorization/policyDefinitions", + "checklist": "Azure Landing Zone Review", + "guid": "5c986cb2-9131-456a-8247-6e49f541acdc", + "link": "https://learn.microsoft.com/azure/governance/policy/overview", + "service": "Policy", + "severity": "High", + "text": "Leverage Azure Policy strategically, define controls for your environment, using Policy Initiatives to group related policies.", + "waf": "Reliability" + }, + { + "arm-service": "Microsoft.Authorization/policyDefinitions", + "checklist": "Azure Landing Zone Review", + "guid": "d8a2adb1-17d6-4326-af62-5ca44e5695f2", + "link": "https://learn.microsoft.com/azure/governance/policy/overview", + "service": "Policy", + "severity": "Medium", + "text": "Map regulatory and compliance requirements to Azure Policy definitions and Azure role assignments.", + "waf": "Reliability" + }, + { + "arm-service": "Microsoft.Authorization/policyDefinitions", + "checklist": "Azure Landing Zone Review", + "guid": "223ace8c-b123-408c-a501-7f154e3ab369", + "link": "https://learn.microsoft.com/azure/governance/policy/overview", + "service": "Policy", + "severity": "Medium", + "text": "Establish Azure Policy definitions at the intermediate root management group so that they can be assigned at inherited scopes.", + "waf": "Reliability" + }, + { + "arm-service": "Microsoft.Authorization/policyDefinitions", + "checklist": "Azure Landing Zone Review", + "guid": "3829e7e3-1618-4368-9a04-77a209945bda", + "link": "https://learn.microsoft.com/azure/governance/policy/overview", + "service": "Policy", + "severity": "High", + "text": "Manage policy assignments at the highest appropriate level with exclusions at bottom levels, if required.", + "waf": "Reliability" + }, + { + "arm-service": "Microsoft.Authorization/policyDefinitions", + "checklist": "Azure Landing Zone Review", + "guid": "43334f24-9116-4341-a2ba-527526944008", + "link": "https://learn.microsoft.com/security/benchmark/azure/mcsb-asset-management#am-2-use-only-approved-services", + "service": "Policy", + "severity": "Low", + "text": "Use Azure Policy to control which services users can provision at the subscription/management group level.", + "waf": "Reliability" + }, + { + "arm-service": "Microsoft.Authorization/policyDefinitions", + "checklist": "Azure Landing Zone Review", + "guid": "be7d7e48-4327-46d8-adc0-55bcf619e8a1", + "link": "https://learn.microsoft.com/azure/governance/policy/overview", + "service": "Policy", + "severity": "High", + "text": "Use built-in policies where possible to minimize operational overhead.", + "waf": "Reliability" + }, + { + "arm-service": "Microsoft.Authorization/policyDefinitions", + "checklist": "Azure Landing Zone Review", + "description": "Assigning the Resource Policy Contributor role to specific scopes allows you to delegate policy management to relevant teams. For instance, a central IT team may oversee management group-level policies, while application teams handle policies for their subscriptions, enabling distributed governance with adherence to organizational standards.", + "guid": "3f988795-25d6-4268-a6d7-0ba6c97be995", + "link": "https://learn.microsoft.com/azure/governance/policy/overview#azure-rbac-permissions-in-azure-policy", + "service": "Policy", + "severity": "Medium", + "text": "Assign the built-in Resource Policy Contributor role at a particular scope to enable application-level governance.", + "waf": "Reliability" + }, + { + "arm-service": "Microsoft.Authorization/policyDefinitions", + "checklist": "Azure Landing Zone Review", + "guid": "19048384-5c98-46cb-8913-156a12476e49", + "link": "https://learn.microsoft.com/azure/governance/policy/overview", + "service": "Policy", + "severity": "Medium", + "text": "Limit the number of Azure Policy assignments made at the root management group scope to avoid managing through exclusions at inherited scopes.", + "waf": "Reliability" + }, + { + "arm-service": "Microsoft.Authorization/policyDefinitions", + "checklist": "Azure Landing Zone Review", + "guid": "5a917e1f-348e-4f25-9c27-d42e8bbac757", + "link": "https://learn.microsoft.com/industry/release-plan/2023wave2/cloud-sovereignty/enable-data-sovereignty-policy-baseline", + "service": "Policy", + "severity": "Medium", + "text": "If any data sovereignty requirements exist, Azure Policies should be deployed to enforce them.", + "training": "https://learn.microsoft.com/learn/paths/secure-your-cloud-data/", + "waf": "Reliability" + }, + { + "arm-service": "Microsoft.Authorization/policyDefinitions", + "checklist": "Azure Landing Zone Review", + "guid": "78b22132-b41c-460b-a4d3-df8f73a67dc2", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/ready/landing-zone/sovereign-landing-zone", + "service": "Policy", + "severity": "Medium", + "text": "For Sovereign Landing Zone, deploy sovereignty policy baseline and assign at correct management group level.", + "waf": "Reliability" + }, + { + "arm-service": "Microsoft.Authorization/policyDefinitions", + "checklist": "Azure Landing Zone Review", + "guid": "caeea0e9-1024-41df-a52e-d99c3f22a6f4", + "link": "https://learn.microsoft.com/industry/sovereignty/policy-portfolio-baseline", + "service": "Policy", + "severity": "Medium", + "text": "For Sovereign Landing Zone, document Sovereign Control objectives to policy mapping.", + "waf": "Reliability" + }, + { + "arm-service": "Microsoft.Authorization/policyDefinitions", + "checklist": "Azure Landing Zone Review", + "guid": "9b461617-db7b-4399-8ac6-d4eb7153893a", + "link": "https://learn.microsoft.com/industry/sovereignty/policy-portfolio-baseline#sovereignty-baseline-policy-initiatives", + "service": "Policy", + "severity": "Medium", + "text": "For Sovereign Landing Zone, ensure process is in place for management of 'Sovereign Control objectives to policy mapping'.", + "waf": "Reliability" + }, + { + "arm-service": "Microsoft.Insights/components", + "checklist": "Azure Landing Zone Review", + "guid": "67e7a8ed-4b30-4e38-a3f2-9812b2363cef", + "link": "https://learn.microsoft.com/azure/azure-monitor/logs/design-logs-deployment", + "service": "Monitor", + "severity": "Medium", + "text": "Use a single monitor logs workspace to manage platforms centrally except where Azure role-based access control (Azure RBAC), data sovereignty requirements, or data retention policies mandate separate workspaces.", + "training": "https://learn.microsoft.com/azure/azure-monitor/logs/design-logs-deployment", + "waf": "Operations" + }, + { + "arm-service": "Microsoft.Insights/components", + "checklist": "Azure Landing Zone Review", + "guid": "5e6c4cfd-3e50-4454-9c24-47ec66138a72", + "link": "https://learn.microsoft.com/azure/azure-monitor/logs/data-retention-archive?tabs=portal-1%2Cportal-2#how-retention-and-archiving-work", + "service": "Monitor", + "severity": "High", + "text": "Export logs to Azure Storage if your log retention requirements exceed twelve years. Use immutable storage with a write-once, read-many policy to make data non-erasable and non-modifiable for a user-specified interval.", + "training": "https://learn.microsoft.com/learn/paths/architect-infrastructure-operations/", + "waf": "Operations" + }, + { + "arm-service": "Microsoft.Compute/virtualMachines", + "checklist": "Azure Landing Zone Review", + "guid": "e7d7e484-3276-4d8b-bc05-5bcf619e8a13", + "link": "https://learn.microsoft.com/azure/governance/machine-configuration/overview", + "service": "VM", + "severity": "Medium", + "text": "Monitor OS level virtual machine (VM) configuration drift using Azure Policy. Enabling Azure Automanage Machine Configuration audit capabilities through policy helps application team workloads to immediately consume feature capabilities with little effort.", + "training": "https://learn.microsoft.com/learn/paths/implement-resource-mgmt-security/", + "waf": "Operations" + }, + { + "arm-service": "Microsoft.Compute/virtualMachines", + "checklist": "Azure Landing Zone Review", + "guid": "f9887952-5d62-4688-9d70-ba6c97be9951", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/ready/landing-zone/design-area/management-operational-compliance#update-management-considerations", + "service": "VM", + "severity": "Medium", + "text": "Use Azure Update Manager as a patching mechanism for Windows and Linux VMs in Azure.", + "training": "https://learn.microsoft.com/azure/update-manager/overview?tabs=azure-vms", + "waf": "Operations" + }, + { + "arm-service": "Microsoft.Compute/virtualMachines", + "checklist": "Azure Landing Zone Review", + "guid": "c806c048-26b7-4ddf-b4c2-b4f0c476925d", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/ready/landing-zone/design-area/management-operational-compliance#update-management-considerations ", + "service": "VM", + "severity": "Medium", + "text": "Use Azure Update Manager as a patching mechanism for Windows and Linux VMs outside of Azure using Azure Arc.", + "training": "https://learn.microsoft.com/azure/update-manager/overview?tabs=azure-vms", + "waf": "Operations" + }, + { + "arm-service": "microsoft.network/networkWatchers", + "checklist": "Azure Landing Zone Review", + "guid": "90483845-c986-4cb2-a131-56a12476e49f", + "link": "https://learn.microsoft.com/azure/network-watcher/network-watcher-monitoring-overview", + "service": "Network Watcher", + "severity": "Medium", + "text": "Use Network Watcher to proactively monitor traffic flows.", + "training": "https://learn.microsoft.com/learn/modules/configure-network-watcher/", + "waf": "Operations" + }, + { + "arm-service": "Microsoft.Insights/components", + "checklist": "Azure Landing Zone Review", + "guid": "6944008b-e7d7-4e48-9327-6d8bdc055bcf", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/ready/azure-setup-guide/monitoring-reporting?tabs=AzureMonitor", + "service": "Monitor", + "severity": "Medium", + "text": "Use Azure Monitor Logs for insights and reporting.", + "training": "https://learn.microsoft.com/training/modules/configure-azure-monitor/", + "waf": "Operations" + }, + { + "arm-service": "Microsoft.Insights/components", + "checklist": "Azure Landing Zone Review", + "guid": "97be9951-9048-4384-9c98-6cb2913156a1", + "link": "https://learn.microsoft.com/azure/azure-monitor/alerts/alerts-overview", + "service": "Monitor", + "severity": "Medium", + "text": "Use Azure Monitor alerts for the generation of operational alerts.", + "training": "https://learn.microsoft.com/training/modules/incident-response-with-alerting-on-azure/", + "waf": "Operations" + }, + { + "arm-service": "Microsoft.Insights/components", + "checklist": "Azure Landing Zone Review", + "guid": "fed3c55f-a67e-4875-aadd-3aba3f9fde31", + "link": "https://learn.microsoft.com/azure/automation/how-to/region-mappings", + "service": "Monitor", + "severity": "Medium", + "text": "When using Change and Inventory Tracking via Azure Automation Accounts, ensure that you have selected supported regions for linking your Log Analytics workspace and automation accounts together.", + "training": "https://learn.microsoft.com/training/modules/explore-azure-automation-devops/", + "waf": "Operations" + }, + { + "arm-service": "Microsoft.RecoveryServices/vaults", + "checklist": "Azure Landing Zone Review", + "guid": "eba8cf22-45c6-4dc1-9b57-2cceb3b97ce5", + "link": "https://learn.microsoft.com/azure/storage/common/storage-redundancy", + "service": "Backup", + "severity": "Low", + "text": "When using Azure Backup, use the correct backup types (GRS, ZRS & LRS) for your backup, as the default setting is GRS.", + "training": "https://learn.microsoft.com/training/modules/design-solution-for-backup-disaster-recovery/", + "waf": "Reliability" + }, + { + "arm-service": "Microsoft.Compute/virtualMachines", + "checklist": "Azure Landing Zone Review", + "guid": "f541acdc-e979-4377-acdb-3751ab2ab13a", + "link": "https://learn.microsoft.com/azure/governance/policy/concepts/guest-configuration", + "service": "VM", + "severity": "Medium", + "text": "Use Azure guest policies to automatically deploy software configurations through VM extensions and enforce a compliant baseline VM configuration.", + "waf": "Reliability" + }, + { + "arm-service": "Microsoft.Compute/virtualMachines", + "checklist": "Azure Landing Zone Review", + "description": "Use Azure Policy's guest configuration features to audit and remediate machine settings (e.g., OS, application, environment) to ensure resources align with expected configurations, and Update Management can enforce patch management for VMs.", + "guid": "da6e55d7-d8a2-4adb-817d-6326af625ca4", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/ready/landing-zone/design-area/management-operational-compliance#monitoring-for-configuration-drift", + "service": "VM", + "severity": "Medium", + "text": "Monitor VM security configuration drift via Azure Policy.", + "training": "https://learn.microsoft.com/training/paths/implement-resource-mgmt-security/", + "waf": "Reliability" + }, + { + "arm-service": "Microsoft.Compute/virtualMachines", + "checklist": "Azure Landing Zone Review", + "guid": "2476e49f-541a-4cdc-b979-377bcdb3751a", + "link": "https://learn.microsoft.com/azure/site-recovery/site-recovery-overview", + "service": "VM", + "severity": "Medium", + "text": "Use Azure Site Recovery for Azure-to-Azure Virtual Machines disaster recovery scenarios. This enables you to replicate workloads across regions.", + "training": "https://learn.microsoft.com/training/modules/protect-infrastructure-with-site-recovery/", + "waf": "Operations" + }, + { + "arm-service": "Microsoft.RecoveryServices/vaults", + "checklist": "Azure Landing Zone Review", + "guid": "f625ca44-e569-45f2-823a-ce8cb12308ca", + "link": "https://learn.microsoft.com/azure/backup/backup-center-overview", + "service": "Backup", + "severity": "Medium", + "text": "Use Azure-native backup capabilities, or an Azure-compatible, 3rd-party backup solution.", + "training": "https://learn.microsoft.com/training/modules/design-solution-for-backup-disaster-recovery/", + "waf": "Operations" + }, + { + "arm-service": "microsoft.network/frontdoorwebApplicationFirewalls", + "checklist": "Azure Landing Zone Review", + "guid": "89cc5e11-aa4d-4c3b-893d-feb99215266a", + "link": "https://learn.microsoft.com/azure/web-application-firewall/afds/waf-front-door-best-practices#add-diagnostic-settings-to-save-your-wafs-logs", + "service": "WAF", + "severity": "High", + "text": "Add diagnostic settings to save WAF logs from application delivery services like Azure Front Door and Azure Application Gateway. Regularly review the logs to check for attacks and for false positive detections.", + "training": "https://learn.microsoft.com/training/modules/capture-application-logs-app-service/", + "waf": "Operations" + }, + { + "arm-service": "microsoft.network/frontdoorwebApplicationFirewalls", + "checklist": "Azure Landing Zone Review", + "guid": "7f408960-c626-44cb-a018-347c8d790cdf", + "link": "https://learn.microsoft.com/azure/web-application-firewall/afds/waf-front-door-best-practices#send-logs-to-microsoft-sentinel", + "service": "WAF", + "severity": "Medium", + "text": "Send WAF logs from your application delivery services like Azure Front Door and Azure Application Gateway to Microsoft Sentinel. Detect attacks and integrate WAF telemetry into your overall Azure environment.", + "training": "https://learn.microsoft.com/training/paths/sc-200-connect-logs-to-azure-sentinel/", + "waf": "Operations" + }, + { + "arm-service": "Microsoft.KeyVault/vaults", + "checklist": "Azure Landing Zone Review", + "guid": "5017f154-e3ab-4369-9829-e7e316183687", + "link": "https://learn.microsoft.com/azure/key-vault/general/overview", + "service": "Key Vault", + "severity": "High", + "text": "Use Azure Key Vault to store your secrets and credentials.", + "training": "https://learn.microsoft.com/training/modules/implement-azure-key-vault/", + "waf": "Reliability" + }, + { + "arm-service": "Microsoft.KeyVault/vaults", + "checklist": "Azure Landing Zone Review", + "graph": "ResourceContainers | where type=='microsoft.resources/subscriptions'| parse id with '/subscriptions/' SubscriptionID| project subscriptionId, SubscriptionName = name| join kind=leftouter (Resources| where type == 'microsoft.keyvault/vaults'| project id, name, subscriptionId) on subscriptionId| join kind= leftouter (Resources| where type == 'microsoft.keyvault/vaults'| summarize ResourceCount = count() by subscriptionId) on subscriptionId| extend RCount = iff(isnull(ResourceCount), 0, ResourceCount)| project-away ResourceCount| extend compliant = (RCount <> 1)", + "guid": "a0477a20-9945-4bda-9333-4f2491163418", + "link": "https://learn.microsoft.com/azure/key-vault/general/overview-throttling", + "service": "Key Vault", + "severity": "Medium", + "text": "Use different Azure Key Vaults for different applications and regions to avoid transaction scale limits and restrict access to secrets.", + "training": "https://learn.microsoft.com/training/modules/configure-and-manage-azure-key-vault/", + "waf": "Reliability" + }, + { + "arm-service": "Microsoft.KeyVault/vaults", + "checklist": "Azure Landing Zone Review", + "guid": "2ba52752-6944-4008-ae7d-7e4843276d8b", + "link": "https://learn.microsoft.com/azure/key-vault/general/best-practices", + "service": "Key Vault", + "severity": "Medium", + "text": "Provision Azure Key Vault with the soft delete and purge policies enabled to allow retention protection for deleted objects.", + "training": "https://learn.microsoft.com/training/modules/implement-azure-key-vault/", + "waf": "Reliability" + }, + { + "arm-service": "Microsoft.KeyVault/vaults", + "checklist": "Azure Landing Zone Review", + "guid": "dc055bcf-619e-48a1-9f98-879525d62688", + "link": "https://learn.microsoft.com/azure/key-vault/general/best-practices", + "service": "Key Vault", + "severity": "Medium", + "text": "Follow a least privilege model by limiting authorization to permanently delete keys, secrets, and certificates to specialized custom Microsoft Entra ID roles.", + "training": "https://learn.microsoft.com/training/modules/implement-azure-key-vault/", + "waf": "Reliability" + }, + { + "arm-service": "Microsoft.KeyVault/vaults", + "checklist": "Azure Landing Zone Review", + "guid": "6d70ba6c-97be-4995-8904-83845c986cb2", + "link": "https://learn.microsoft.com/azure/key-vault/general/best-practices", + "service": "Key Vault", + "severity": "Medium", + "text": "Automate the certificate management and renewal process with public certificate authorities to ease administration.", + "training": "https://learn.microsoft.com/en-us/training/modules/configure-and-manage-azure-key-vault/", + "waf": "Reliability" + }, + { + "arm-service": "Microsoft.KeyVault/vaults", + "checklist": "Azure Landing Zone Review", + "guid": "913156a1-2476-4e49-b541-acdce979377b", + "link": "https://learn.microsoft.com/azure/key-vault/general/best-practices", + "service": "Key Vault", + "severity": "Medium", + "text": "Establish an automated process for key and certificate rotation.", + "training": "https://learn.microsoft.com/training/modules/configure-and-manage-azure-key-vault/", + "waf": "Reliability" + }, + { + "arm-service": "Microsoft.KeyVault/vaults", + "checklist": "Azure Landing Zone Review", + "guid": "cdb3751a-b2ab-413a-ba6e-55d7d8a2adb1", + "link": "https://learn.microsoft.com/azure/key-vault/general/best-practices", + "service": "Key Vault", + "severity": "Medium", + "text": "Enable firewall and virtual network service endpoint or private endpoint on the vault to control access to the key vault.", + "training": "https://learn.microsoft.com/training/modules/design-implement-private-access-to-azure-services/", + "waf": "Reliability" + }, + { + "arm-service": "Microsoft.KeyVault/vaults", + "checklist": "Azure Landing Zone Review", + "guid": "17d6326a-f625-4ca4-9e56-95f2223ace8c", + "link": "https://learn.microsoft.com/azure/key-vault/general/monitor-key-vault", + "service": "Key Vault", + "severity": "Medium", + "text": "Use the platform-central Azure Monitor Log Analytics workspace to audit key, certificate, and secret usage within each instance of Key Vault.", + "training": "https://learn.microsoft.com/training/modules/analyze-infrastructure-with-azure-monitor-logs/", + "waf": "Reliability" + }, + { + "arm-service": "Microsoft.KeyVault/vaults", + "checklist": "Azure Landing Zone Review", + "guid": "b12308ca-5017-4f15-9e3a-b3693829e7e3", + "link": "https://learn.microsoft.com/azure/key-vault/general/best-practices", + "service": "Key Vault", + "severity": "Medium", + "text": "Delegate Key Vault instantiation and privileged access and use Azure Policy to enforce a consistent compliant configuration.", + "training": "https://learn.microsoft.com/training/modules/configure-azure-key-vault-networking-settings/", + "waf": "Reliability" + }, + { + "arm-service": "Microsoft.KeyVault/vaults", + "checklist": "Azure Landing Zone Review", + "guid": "91163418-2ba5-4275-8694-4008be7d7e48", + "link": "https://learn.microsoft.com/azure/key-vault/general/best-practices", + "service": "Key Vault", + "severity": "Medium", + "text": "Use an Azure Key Vault per application per environment per region.", + "training": "https://learn.microsoft.com/training/modules/implement-azure-key-vault/", + "waf": "Reliability" + }, + { + "arm-service": "Microsoft.KeyVault/vaults", + "checklist": "Azure Landing Zone Review", + "guid": "25d62688-6d70-4ba6-a97b-e99519048384", + "link": "https://learn.microsoft.com/azure/key-vault/general/best-practices", + "service": "Key Vault", + "severity": "Medium", + "text": "If you want to bring your own keys, this might not be supported across all considered services. Implement relevant mitigation so that inconsistencies don't hinder desired outcomes. Choose appropriate region pairs and disaster recovery regions that minimize latency.", + "training": "https://learn.microsoft.com/training/modules/configure-and-manage-azure-key-vault/", + "waf": "Reliability" + }, + { + "arm-service": "Microsoft.KeyVault/vaults", + "checklist": "Azure Landing Zone Review", + "guid": "4ac6b67c-b3a4-4ff9-8e87-b07a7ce7bbdb", + "link": "https://learn.microsoft.com/industry/sovereignty/key-management", + "service": "Key Vault", + "severity": "Medium", + "text": "For Sovereign Landing Zone, use Azure Key Vault managed HSM to store your secrets and credentials.", + "training": "https://learn.microsoft.com/training/modules/configure-and-manage-azure-key-vault/", + "waf": "Reliability" + }, + { + "checklist": "Azure Landing Zone Review", + "guid": "4e5695f2-223a-4ce8-ab12-308ca5017f15", + "link": "https://learn.microsoft.com/azure/active-directory/reports-monitoring/overview-reports", + "service": "Entra", + "severity": "Medium", + "text": "Use Microsoft Entra ID reporting capabilities to generate access control audit reports.", + "training": "https://learn.microsoft.com/training/modules/monitor-report-aad-security-events/", + "waf": "Reliability" + }, + { + "checklist": "Azure Landing Zone Review", + "guid": "09945bda-4333-44f2-9911-634182ba5275", + "link": "https://learn.microsoft.com/azure/defender-for-cloud/concept-cloud-security-posture-management", + "service": "Defender", + "severity": "High", + "text": "Enable Defender Cloud Security Posture Management for all subscriptions.", + "training": "https://learn.microsoft.com/training/modules/microsoft-defender-cloud-security-posture/", + "waf": "Reliability" + }, + { + "checklist": "Azure Landing Zone Review", + "guid": "36a72a48-fffe-4c40-9747-0ab5064355ba", + "link": "https://learn.microsoft.com/azure/defender-for-cloud/plan-defender-for-servers-select-plan", + "service": "Defender", + "severity": "High", + "text": "Enable a Defender Cloud Workload Protection Plan for Servers on all subscriptions.", + "training": "https://learn.microsoft.com/training/modules/understand-azure-defender-cloud-workload-protection/", + "waf": "Reliability" + }, + { + "checklist": "Azure Landing Zone Review", + "guid": "77425f48-ecba-43a0-aeac-a3ac733ccc6a", + "link": "https://learn.microsoft.com/azure/defender-for-cloud/connect-azure-subscription", + "service": "Defender", + "severity": "High", + "text": "Enable Defender Cloud Workload Protection Plans for Azure Resources on all subscriptions.", + "training": "https://learn.microsoft.com/training/modules/understand-azure-defender-cloud-workload-protection/", + "waf": "Reliability" + }, + { + "arm-service": "Microsoft.Compute/virtualMachines", + "checklist": "Azure Landing Zone Review", + "guid": "24d96b30-61ee-4436-a1cc-d6ef08bc574b", + "link": "https://learn.microsoft.com/mem/configmgr/protect/deploy-use/endpoint-protection", + "service": "VM", + "severity": "High", + "text": "Enable Endpoint Protection on IaaS Servers.", + "training": "https://learn.microsoft.com/training/modules/design-solutions-securing-server-client-endpoints/", + "waf": "Reliability" + }, + { + "arm-service": "Microsoft.Compute/virtualMachines", + "checklist": "Azure Landing Zone Review", + "guid": "15833ee7-ad6c-46d3-9331-65c7acbe44ab", + "link": "https://learn.microsoft.com/azure/security-center/", + "service": "VM", + "severity": "Medium", + "text": "Monitor base operating system patching drift via Azure Monitor Logs and Defender for Cloud.", + "training": "https://learn.microsoft.com/training/modules/create-log-analytics-workspace-microsoft-defender-cloud/", + "waf": "Reliability" + }, + { + "arm-service": "Microsoft.Insights/components", + "checklist": "Azure Landing Zone Review", + "guid": "e5f8d79f-2e87-4768-924c-516775c6ea95", + "link": "https://learn.microsoft.com/azure/azure-monitor/logs/design-logs-deployment", + "service": "Monitor", + "severity": "Medium", + "text": "Connect default resource configurations to a centralized Azure Monitor Log Analytics workspace.", + "training": "https://learn.microsoft.com/training/modules/analyze-infrastructure-with-azure-monitor-logs/", + "waf": "Reliability" + }, + { + "checklist": "Azure Landing Zone Review", + "guid": "1761e147-f65e-4d09-bbc2-f464f23e2eba", + "link": "https://learn.microsoft.com/industry/sovereignty/transparency-logs", + "service": "Entra", + "severity": "Medium", + "text": "For Sovereign Landing Zone, enable transparancy logs on the Entra ID tenant.", + "waf": "Reliability" + }, + { + "checklist": "Azure Landing Zone Review", + "guid": "d21a922d-5ca7-427a-82a6-35f7b21f1bfc", + "link": "https://learn.microsoft.com/azure/security/fundamentals/customer-lockbox-overview", + "service": "Entra", + "severity": "Medium", + "text": "For Sovereign Landing Zone, enable customer Lockbox on the Entra ID tenant.", + "waf": "Reliability" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Landing Zone Review", + "guid": "b03ed428-4617-4067-a787-85468b9ccf3f", + "link": "https://learn.microsoft.com/azure/storage/common/storage-require-secure-transfer", + "service": "Storage", + "severity": "High", + "text": "Enable secure transfer to storage accounts.", + "training": "https://learn.microsoft.com/training/modules/secure-azure-storage-account/", + "waf": "Reliability" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Landing Zone Review", + "guid": "159aac9f-863f-4f48-82cf-00c28fa97a0e", + "link": "https://learn.microsoft.com/azure/storage/blobs/data-protection-overview#recommendations-for-basic-data-protection", + "service": "Storage", + "severity": "High", + "text": "Enable container soft delete for the storage account to recover a deleted container and its contents.", + "waf": "Reliability" + }, + { + "arm-service": "Microsoft.KeyVault/vaults", + "checklist": "Azure Landing Zone Review", + "guid": "108d5099-a11d-4445-bd8b-e12a5e95412e", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/ready/considerations/development-strategy-development-lifecycle#automated-builds", + "service": "Key Vault", + "severity": "High", + "text": "Use Key Vault secrets to avoid hard-coding sensitive information such as credentials (virtual machines user passwords), certificates or keys.", + "training": "https://learn.microsoft.com/en-us/training/modules/implement-azure-key-vault/", + "waf": "Operations" + }, { "arm-service": "Microsoft.ApiManagement/service", "checklist": "Azure API Management Review", @@ -2476,12 +4230,24 @@ { "arm-service": "Microsoft.Storage/storageAccounts", "checklist": "Azure Storage Review Checklist", - "description": "AAD tokens should be favored over shared access signatures, wherever possible", + "description": ". Enforcing the latest TLS version will reject request from clients using the older version. ", + "graph": "resources | where type == 'microsoft.storage/storageaccounts' | extend compliant = (isnull(properties.minimumTlsVersion) == false and properties.minimumTlsVersion in ('TLS1_2', 'TLS1_3')) | distinct id, compliant", + "guid": "e12be569-a18f-4562-8d5d-ce151b9e7d55", + "link": "https://learn.microsoft.com/azure/storage/common/transport-layer-security-configure-minimum-version", + "service": "Storage", + "severity": "High", + "text": "Enforce the latest TLS version for a storage account", + "waf": "Reliability" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review Checklist", + "description": "Microsoft Entra ID tokens should be favored over shared access signatures, wherever possible", "guid": "e1ce15dd-3f0d-45e7-92d4-1e3611cc57b4", "link": "https://learn.microsoft.com/azure/storage/common/authorize-data-access", "service": "Storage", "severity": "High", - "text": "Use Azure Active Directory (Azure AD) tokens for blob access", + "text": "Use Microsoft Entra ID tokens for blob access", "waf": "Reliability" }, { @@ -2508,12 +4274,13 @@ { "arm-service": "Microsoft.Storage/storageAccounts", "checklist": "Azure Storage Review Checklist", - "description": "Storage account keys ('shared keys') have very little audit capabilities. While it can be monitored on who/when fetched a copy of the keys, once the keys are in the hands of multiple people, it is impossible to attribute usage to a specific user. Solely relying on AAD authentication makes it easier to tie storage access to a user. ", + "description": "Storage account keys ('shared keys') have very little audit capabilities. While it can be monitored on who/when fetched a copy of the keys, once the keys are in the hands of multiple people, it is impossible to attribute usage to a specific user. Solely relying on Entra ID authentication makes it easier to tie storage access to a user. ", + "graph": "resources | where type == 'microsoft.storage/storageaccounts' | extend allowSharedKeyAccess = tostring(properties.allowSharedKeyAccess) | extend compliant = (isnotempty(allowSharedKeyAccess) and allowSharedKeyAccess == 'false') | distinct id, compliant", "guid": "15f51296-5398-4e6d-bd22-7dd142b06c21", "link": "https://learn.microsoft.com/rest/api/storageservices/authorize-with-shared-key", "service": "Storage", "severity": "High", - "text": "Consider disabling storage account keys, so that only AAD access (and user delegation SAS) is supported.", + "text": "Consider disabling storage account keys, so that only Microsoft Entra ID access (and user delegation SAS) is supported.", "waf": "Reliability" }, { @@ -2691,11 +4458,12 @@ "arm-service": "Microsoft.Storage/storageAccounts", "checklist": "Azure Storage Review Checklist", "description": "Leverage Resource Graph Explorer (resources | where type == 'microsoft.storage/storageaccounts' | where properties['allowBlobPublicAccess'] == true) to find storage accounts which allow anonymous blob access.", + "graph": "resources | where type == 'microsoft.storage/storageaccounts' | extend compliant = (properties.allowBlobPublicAccess == 'false') | distinct id, compliant", "guid": "659ae558-b937-4d49-a5e1-112dbd7ba012", "link": "https://learn.microsoft.com/azure/storage/blobs/anonymous-read-access-configure?tabs=portal#allow-or-disallow-public-read-access-for-a-storage-account", "service": "Storage", "severity": "High", - "text": "Consider whether public blob access is needed, or whether it can be disabled for certain storage accounts. ", + "text": "Consider whether public blob anonymous access is needed, or whether it can be disabled for certain storage accounts. ", "waf": "Reliability" }, { @@ -24305,7 +26073,7 @@ ], "metadata": { "name": "WAF checklist", - "timestamp": "August 08, 2024" + "timestamp": "August 12, 2024" }, "severities": [ { diff --git a/checklists/azure_storage_checklist.en.json b/checklists/azure_storage_checklist.en.json index 114601702..3d751716f 100644 --- a/checklists/azure_storage_checklist.en.json +++ b/checklists/azure_storage_checklist.en.json @@ -1,566 +1,566 @@ { - "items": [ - { - "category": "Security", - "subcategory": " Overview", - "text": "Consider the 'Azure security baseline for storage'", - "description": "Apply guidance from the Microsoft cloud security benchmark related to Storage", - "waf": "Security", - "service": "Azure Storage", - "guid": "d237de14-3b16-4c21-b7aa-9b64604489a8", - "id": "A01.01", - "severity": "Medium", - "link": "https://learn.microsoft.com/security/benchmark/azure/baselines/storage-security-baseline" - }, - { - "category": "Security", - "subcategory": "Networking", - "text": "Consider using private endpoints for Azure Storage", - "description": "Azure Storage by default has a public IP address and is Internet-reachable. Private endpoints allow to securely expose Azure Storage only to those Azure Compute resources that need access, thus eliminating exposure to the public Internet", - "waf": "Security", - "service": "Azure Storage", - "guid": "f42d78e7-9d17-4a73-a22a-5a67e7a8ed4b", - "id": "A02.01", - "severity": "High", - "link": "https://learn.microsoft.com/azure/storage/common/storage-private-endpoints" - }, - { - "category": "Security", - "subcategory": "Governance", - "text": "Ensure older storage accounts are not using 'classic deployment model'", - "description": "Newly created storage accounts are created using the ARM deployment model, so that RBAC, auditing etc. are all enabled. Ensure that there are no old storage accounts with classic deployment model in a subscription", - "waf": "Security", - "service": "Azure Storage", - "guid": "30e37c3e-2971-41b2-963c-eee079b598de", - "id": "A03.01", - "severity": "Medium", - "link": "https://learn.microsoft.com/azure/virtual-machines/migration-classic-resource-manager-overview#migration-of-storage-accounts" - }, - { - "category": "Security", - "subcategory": "Governance", - "text": "Enable Microsoft Defender for all of your storage accounts", - "description": "Leverage Microsoft Defender to learn about suspicious activity and misconfigurations.", - "waf": "Security", - "service": "Azure Storage", - "guid": "fc5972cd-4cd2-41b0-a803-7f5e6b4bfd3d", - "id": "A03.02", - "severity": "High", - "link": "https://learn.microsoft.com/azure/storage/common/azure-defender-storage-configure" - }, - { - "category": "Security", - "subcategory": "Data Availability", - "text": "Enable 'soft delete' for blobs", - "description": "The soft-delete mechanism allows to recover accidentally deleted blobs.", - "waf": "Security", - "service": "Azure Storage", - "guid": "503547c1-447e-4c66-828a-7100f1ce16dd", - "id": "A04.01", - "severity": "Medium", - "link": "https://learn.microsoft.com/azure/storage/blobs/soft-delete-blob-overview" - }, - { - "category": "Security", - "subcategory": "Confidentiality", - "text": "Disable 'soft delete' for blobs", - "description": "Consider selectively disabling 'soft delete' for certain blob containers, for example if the application must ensure that deleted information is immediately deleted, e.g. for confidentiality, privacy or compliance reasons. ", - "waf": "Security", - "service": "Azure Storage", - "guid": "3f1d5e87-2e52-4e36-81cc-58b4a4b1510e", - "id": "A05.01", - "severity": "Medium", - "link": "https://learn.microsoft.com/azure/storage/blobs/soft-delete-blob-enable" - }, - { - "category": "Security", - "subcategory": "Data Availability", - "text": "Enable 'soft delete' for containers", - "description": "Soft delete for containers enables you to recover a container after it has been deleted, for example recover from an accidental delete operation.", - "waf": "Security", - "service": "Azure Storage", - "guid": "43a58a9c-2289-4c3d-9b57-d0c655462f2a", - "id": "A06.01", - "severity": "High", - "link": "https://learn.microsoft.com/azure/storage/blobs/soft-delete-container-overview" - }, - { - "category": "Security", - "subcategory": "Confidentiality", - "text": "Disable 'soft delete' for containers", - "description": "Consider selectively disabling 'soft delete' for certain blob containers, for example if the application must ensure that deleted information is immediately deleted, e.g. for confidentiality, privacy or compliance reasons. ", - "waf": "Security", - "service": "Azure Storage", - "guid": "3e3453a3-c863-4964-ab65-2d6c15f51296", - "id": "A07.01", - "severity": "Medium", - "link": "https://learn.microsoft.com/azure/storage/blobs/soft-delete-container-enable" - }, - { - "category": "Security", - "subcategory": "Data Availability", - "text": "Enable resource locks on storage accounts", - "description": "Prevents accidental deletion of a storage account, by forcing the user to first remove the deletion lock, prior to deletion", - "waf": "Security", - "service": "Azure Storage", - "guid": "5398e6de-d227-4dd1-92b0-6c21d7999a64", - "id": "A08.01", - "severity": "High", - "link": "https://learn.microsoft.com/azure/storage/common/lock-account-resource" - }, - { - "category": "Security", - "subcategory": "Data Availability, Compliance", - "text": "Consider immutable blobs", - "description": "Consider 'legal hold' or 'time-based retention' policies for blobs, so that is is impossible to delete the blob, the container, or the storage account. Please note that 'impossible' actually means 'impossible'; once a storage account contains an immutable blob, the only way to 'get rid' of that storage account is by cancelling the Azure subscription.", - "waf": "Security", - "service": "Azure Storage", - "guid": "6f4389a8-f42c-478e-98c0-6a73a22a4956", - "id": "A09.01", - "severity": "High", - "link": "https://learn.microsoft.com/azure/storage/blobs/immutable-storage-overview" - }, - { - "category": "Security", - "subcategory": "Networking", - "text": "Require HTTPS, i.e. disable port 80 on the storage account", - "description": "Consider disabling unprotected HTTP/80 access to the storage account, so that all data transfers are encrypted, integrity protected, and the server is authenticated. ", - "waf": "Security", - "service": "Azure Storage", - "guid": "e7a8dc4a-20e2-47c3-b297-11b1352beee0", - "id": "A10.01", - "severity": "High", - "link": "https://learn.microsoft.com/azure/storage/common/storage-require-secure-transfer" - }, - { - "category": "Security", - "subcategory": "Networking", - "text": "When enforcing HTTPS (disabling HTTP), check that you do not use custom domains (CNAME) for the storage account.", - "description": "When configuring a custom domain (hostname) on a storage account, check whether you need TLS/HTTPS; if so, you might have to put Azure CDN in front of your storage account.", - "waf": "Security", - "service": "Azure Storage", - "guid": "79b588de-fc49-472c-b3cd-21bf77036e5e", - "id": "A10.02", - "severity": "High", - "link": "https://learn.microsoft.com/azure/storage/blobs/storage-custom-domain-name" - }, - { - "category": "Security", - "subcategory": "Networking", - "text": "Limit shared access signature (SAS) tokens to HTTPS connections only", - "description": "Requiring HTTPS when a client uses a SAS token to access blob data helps to minimize the risk of credential loss.", - "waf": "Security", - "service": "Azure Storage", - "guid": "6b4bed3d-5035-447c-8347-dc56028a71ff", - "id": "A10.03", - "severity": "Medium", - "link": "https://learn.microsoft.com/azure/storage/common/storage-sas-overview" - }, - { - "category": "Security", - "subcategory": "Networking", - "text": "Enforce the latest TLS version for a storage account", - "description": ". Enforcing the latest TLS version will reject request from clients using the older version. ", - "waf": "Security", - "service": "Azure Storage", - "guid": "e12be569-a18f-4562-8d5d-ce151b9e7d55", - "id": "A10.4", - "severity": "High", - "graph":"resources | where type == 'microsoft.storage/storageaccounts' | extend compliant = (isnull(properties.minimumTlsVersion) == false and properties.minimumTlsVersion in ('TLS1_2', 'TLS1_3')) | distinct id, compliant", - "link": "https://learn.microsoft.com/azure/storage/common/transport-layer-security-configure-minimum-version" - }, - { - "category": "Security", - "subcategory": "Identity and Access Management", - "text": "Use Microsoft Entra ID tokens for blob access", - "description": "Microsoft Entra ID tokens should be favored over shared access signatures, wherever possible", - "waf": "Security", - "service": "Azure Storage", - "guid": "e1ce15dd-3f0d-45e7-92d4-1e3611cc57b4", - "id": "A11.01", - "severity": "High", - "link": "https://learn.microsoft.com/azure/storage/common/authorize-data-access" - }, - { - "category": "Security", - "subcategory": "Identity and Access Management", - "text": "Least privilege in IaM permissions", - "description": "When assigning a role to a user, group, or application, grant that security principal only those permissions that are necessary for them to perform their tasks. Limiting access to resources helps prevent both unintentional and malicious misuse of your data.", - "waf": "Security", - "service": "Azure Storage", - "guid": "a4b1410d-4395-48a8-a228-9b3d6b57cfc6", - "id": "A11.02", - "severity": "Medium" - }, - { - "category": "Security", - "subcategory": "Identity and Access Management", - "text": "When using SAS, prefer 'user delegation SAS' over storage-account-key based SAS.", - "description": "A user delegation SAS is secured with Azure Active Directory (Azure AD) credentials and also by the permissions specified for the SAS. A user delegation SAS is analogous to a service SAS in terms of its scope and function, but offers security benefits over the service SAS. ", - "waf": "Security", - "service": "Azure Storage", - "guid": "55461e1a-3e34-453a-9c86-39648b652d6c", - "id": "A11.03", - "severity": "High", - "link": "https://learn.microsoft.com/azure/storage/common/storage-sas-overview?toc=%2Fazure%2Fstorage%2Fblobs%2Ftoc.json#best-practices-when-using-sas" - }, - { - "category": "Security", - "subcategory": "Identity and Access Management", - "text": "Consider disabling storage account keys, so that only Microsoft Entra ID access (and user delegation SAS) is supported.", - "description": "Storage account keys ('shared keys') have very little audit capabilities. While it can be monitored on who/when fetched a copy of the keys, once the keys are in the hands of multiple people, it is impossible to attribute usage to a specific user. Solely relying on Entra ID authentication makes it easier to tie storage access to a user. ", - "waf": "Security", - "service": "Azure Storage", - "guid": "15f51296-5398-4e6d-bd22-7dd142b06c21", - "id": "A11.04", - "severity": "High", - "graph":"resources | where type == 'microsoft.storage/storageaccounts' | extend allowSharedKeyAccess = tostring(properties.allowSharedKeyAccess) | extend compliant = (isnotempty(allowSharedKeyAccess) and allowSharedKeyAccess == 'false') | distinct id, compliant", - "link": "https://learn.microsoft.com/rest/api/storageservices/authorize-with-shared-key" - }, - { - "category": "Security", - "subcategory": "Monitoring", - "text": "Consider using Azure Monitor to audit control plane operations on the storage account", - "description": "Use Activity Log data to identify 'when', 'who', 'what' and 'how' the security of your storage account is being viewed or changed (i.e. storage account keys, access policies, etc.).", - "waf": "Security", - "service": "Azure Storage", - "guid": "d7999a64-6f43-489a-af42-c78e78c06a73", - "id": "A12.01", - "severity": "High", - "link": "https://learn.microsoft.com/azure/storage/blobs/blob-storage-monitoring-scenarios#audit-account-activity" - }, - { - "category": "Security", - "subcategory": "Identity and Access Management", - "text": "When using storage account keys, consider enabling a 'key expiration policy'", - "description": "A key expiration policy enables you to set a reminder for the rotation of the account access keys. The reminder is displayed if the specified interval has elapsed and the keys have not yet been rotated.", - "waf": "Security", - "service": "Azure Storage", - "guid": "a22a4956-e7a8-4dc4-a20e-27c3e29711b1", - "id": "A13.01", - "severity": "Medium", - "link": "https://learn.microsoft.com/azure/storage/common/storage-account-keys-manage?tabs=azure-portal#create-a-key-expiration-policy" - }, - { - "category": "Security", - "subcategory": "Identity and Access Management", - "text": "Consider configuring an SAS expiration policy", - "description": "A SAS expiration policy specifies a recommended interval over which the SAS is valid. SAS expiration policies apply to a service SAS or an account SAS. When a user generates service SAS or an account SAS with a validity interval that is larger than the recommended interval, they'll see a warning.", - "waf": "Security", - "service": "Azure Storage", - "guid": "352beee0-79b5-488d-bfc4-972cd3cd21bf", - "id": "A13.02", - "severity": "Medium", - "link": "https://learn.microsoft.com/azure/storage/common/sas-expiration-policy" - }, - { - "category": "Security", - "subcategory": "Identity and Access Management", - "text": "Consider linking SAS to a stored access policy", - "description": "Stored access policies give you the option to revoke permissions for a service SAS without having to regenerate the storage account keys. ", - "waf": "Security", - "service": "Azure Storage", - "guid": "77036e5e-6b4b-4ed3-b503-547c1347dc56", - "id": "A13.03", - "severity": "Medium", - "link": "https://learn.microsoft.com/rest/api/storageservices/define-stored-access-policy" - }, - { - "category": "Security", - "subcategory": "CI/CD", - "text": "Consider configuring your application's source code repository to detect checked-in connection strings and storage account keys.", - "waf": "Security", - "service": "Azure Storage", - "guid": "028a71ff-e1ce-415d-b3f0-d5e772d41e36", - "id": "A14.01", - "severity": "Medium", - "link": "https://microsoft.github.io/code-with-engineering-playbook/continuous-integration/dev-sec-ops/secret-management/recipes/detect-secrets-ado/" - }, - { - "category": "Security", - "subcategory": "Identity and Access Management", - "text": "Consider storing connection strings in Azure KeyVault (in scenarios where managed identities are not possible)", - "description": "Ideally, your application should be using a managed identity to authenticate to Azure Storage. If that is not possible, consider having the storage credential (connection string, storage account key, SAS, service principal credential) in Azure KeyVault or an equivalent service.", - "waf": "Security", - "service": "Azure Storage", - "guid": "11cc57b4-a4b1-4410-b439-58a8c2289b3d", - "id": "A15.01", - "severity": "High", - "link": "https://learn.microsoft.com/azure/architecture/framework/security/design-storage-keys" - }, - { - "category": "Security", - "subcategory": "Identity and Access Management", - "text": "Strive for short validity periods for ad-hoc SAS", - "description": "Use near-term expiration times on an ad hoc SAS service SAS or account SAS. In this way, even if a SAS is compromised, it's valid only for a short time. This practice is especially important if you cannot reference a stored access policy. Near-term expiration times also limit the amount of data that can be written to a blob by limiting the time available to upload to it.", - "waf": "Security", - "service": "Azure Storage", - "guid": "27138b82-1102-4cac-9eae-01e6e842e52f", - "id": "A15.02", - "severity": "High", - "link": "https://learn.microsoft.com/rest/api/storageservices/delegate-access-with-shared-access-signature" - }, - { - "category": "Security", - "subcategory": "Identity and Access Management", - "text": "Apply a narrow scope to a SAS", - "description": "When creating a SAS, be as specific and restrictive as possible. Prefer a SAS for a single resource and operation over a SAS which gives much broader access.", - "waf": "Security", - "service": "Azure Storage", - "guid": "4721d928-c1b1-4cd5-81e5-4a29a9de399c", - "id": "A15.03", - "severity": "Medium", - "link": "https://learn.microsoft.com/rest/api/storageservices/delegate-access-with-shared-access-signature" - }, - { - "category": "Security", - "subcategory": "Identity and Access Management", - "text": "Consider scoping SAS to a specific client IP address, wherever possible", - "description": "A SAS can include parameters on which client IP addresses or address ranges are authorized to request a resource using the SAS. ", - "waf": "Security", - "service": "Azure Storage", - "guid": "fd7b28dc-9355-4562-82bf-e4564b0d834a", - "id": "A15.04", - "severity": "Medium", - "link": "https://learn.microsoft.com/rest/api/storageservices/create-account-sas" - }, - { - "category": "Security", - "subcategory": "Identity and Access Management", - "text": "Consider checking uploaded data, after clients used a SAS to upload a file. ", - "description": "A SAS cannot constrain how much data a client uploads; given the pricing model of amount of storage over time, it might make sense to validate whether clients uploaded maliciously large contents.", - "waf": "Security", - "service": "Azure Storage", - "guid": "348b263e-6dd6-4051-8a36-498f6dbad38e", - "id": "A15.05", - "severity": "Low" - }, - { - "category": "Security", - "subcategory": "Identity and Access Management", - "text": "SFTP: Limit the amount of 'local users' for SFTP access, and audit whether access is needed over time.", - "description": "When accessing blob storage via SFTP using a 'local user account', the 'usual' RBAC controls do not apply. Blob access via NFS or REST might be more restrictive than SFTP access. Unfortunately, as of early 2023, local users are the only form of identity management that is currently supported for the SFTP endpoint", - "waf": "Security", - "service": "Azure Storage", - "guid": "ad53cc7c-e1d7-4aaa-a357-1449ab8053d8", - "id": "A15.06", - "severity": "High", - "link": "https://learn.microsoft.com/azure/storage/blobs/secure-file-transfer-protocol-support#sftp-permission-model" - }, - { - "category": "Security", - "subcategory": "Identity and Access Management", - "text": "SFTP: The SFTP endpoint does not support POSIX-like ACLs.", - "waf": "Security", - "service": "Azure Storage", - "guid": "9f89dc7b-33be-42a1-a27f-7b9e91be1f38", - "id": "A15.07", - "severity": "Medium", - "link": "https://learn.microsoft.com/azure/storage/blobs/secure-file-transfer-protocol-known-issues#authentication-and-authorization" - }, - { - "category": "Security", - "subcategory": "Networking", - "text": "Avoid overly broad CORS policies", - "description": "Storage supports CORS (Cross-Origin Resource Sharing), i.e. an HTTP feature that enables web apps from a different domain to loosen the same-origin policy. When enabling CORS, keep the CorsRules to the least privilege.", - "waf": "Security", - "service": "Azure Storage", - "guid": "cef39812-bd46-43cb-aac8-ac199ebb91a3", - "id": "A16.01", - "severity": "High", - "link": "https://learn.microsoft.com/rest/api/storageservices/cross-origin-resource-sharing--cors--support-for-the-azure-storage-services" - }, - { - "category": "Security", - "subcategory": "Confidentiality and Encryption", - "text": "Determine how data at rest should be encrypted. Understand the thread model for data.", - "description": "Data at rest is always encrypted server-side, and in addition might be encrypted client-side as well. Server-side encryption might happen using a platform-managed key (default) or customer-managed key. Client-side encryption might happen by either having the client supply an encryption/decryption key on a per-blob basis to Azure storage, or by completely handling encryption on the client-side. thus not relying on Azure Storage at all for confidentiality guarantees.", - "waf": "Security", - "service": "Azure Storage", - "guid": "3d90cae2-cc88-4137-86f7-c0cbafe61464", - "id": "A17.01", - "severity": "High", - "link": "https://learn.microsoft.com/azure/storage/common/storage-service-encryption" - }, - { - "category": "Security", - "subcategory": "Confidentiality and Encryption", - "text": "Determine which/if platform encryption should be used.", - "waf": "Security", - "service": "Azure Storage", - "guid": "8dd457e9-2713-48b8-8110-2cac6eae01e6", - "id": "A17.02", - "severity": "Medium", - "link": "https://learn.microsoft.com/azure/storage/common/customer-managed-keys-overview?toc=%2Fazure%2Fstorage%2Fblobs%2Ftoc.json&bc=%2Fazure%2Fstorage%2Fblobs%2Fbreadcrumb%2Ftoc.json" - }, - { - "category": "Security", - "subcategory": "Confidentiality and Encryption", - "text": "Determine which/if client-side encryption should be used.", - "waf": "Security", - "service": "Azure Storage", - "guid": "e842e52f-4721-4d92-ac1b-1cd521e54a29", - "id": "A17.03", - "severity": "Medium", - "link": "https://learn.microsoft.com/azure/storage/blobs/encryption-customer-provided-keys" - }, - { - "category": "Security", - "subcategory": "Identity and Access Management", - "text": "Consider whether public blob anonymous access is needed, or whether it can be disabled for certain storage accounts. ", - "description": "Leverage Resource Graph Explorer (resources | where type == 'microsoft.storage/storageaccounts' | where properties['allowBlobPublicAccess'] == true) to find storage accounts which allow anonymous blob access.", - "waf": "Security", - "service": "Azure Storage", - "guid": "659ae558-b937-4d49-a5e1-112dbd7ba012", - "id": "A18.01", - "severity": "High", - "graph": "resources | where type == 'microsoft.storage/storageaccounts' | extend compliant = (properties.allowBlobPublicAccess == 'false') | distinct id, compliant", - "link": "https://learn.microsoft.com/azure/storage/blobs/anonymous-read-access-configure?tabs=portal#allow-or-disallow-public-read-access-for-a-storage-account" - }, - { - "category": "Operations Management", - "subcategory": "Platform Version", - "text": "Leverage a storagev2 account type for better performance and reliability", - "waf": "Reliability", - "service": "Azure Storage", - "guid": "cb8eb8c0-aa62-4a25-a495-6eaa8dc4a243", - "id": "B01.01", - "severity": "High", - "link": "https://learn.microsoft.com/azure/storage/common/storage-account-upgrade?tabs=azure-portal" - }, - { - "category": "BC and DR", - "subcategory": "Availablity", - "text": "Leverage GRS, ZRS or GZRS storage for the highest availability", - "waf": "Reliability", - "service": "Azure Storage", - "guid": "e05bbe20-9d49-4fda-9777-8424d116785c", - "id": "C01.01", - "severity": "High", - "link": "https://learn.microsoft.com/azure/storage/common/storage-redundancy" - }, - { - "category": "BC and DR", - "subcategory": "Failover", - "text": "For write operation after failover, use customer-Managed Failover ", - "waf": "Reliability", - "service": "Azure Storage", - "guid": "2fa56c56-ad48-4408-be72-734c486ba280", - "id": "C01.02", - "severity": "Medium", - "link": "https://learn.microsoft.com/azure/storage/common/storage-disaster-recovery-guidance" - }, - { - "category": "Operations Management", - "subcategory": "Failover", - "text": "Understand Microsoft-Managed Failover details", - "waf": "Reliability", - "service": "Azure Storage", - "guid": "dc0590cf-65de-48e1-909c-cbd579266bcc", - "id": "C01.03", - "severity": "Medium", - "link": "https://learn.microsoft.com/azure/storage/common/storage-disaster-recovery-guidance#microsoft-managed-failover" - }, - { - "category": "Operations Management", - "subcategory": "Data Protection", - "text": "Enable Soft Delete", - "waf": "Reliability", - "service": "Azure Storage", - "guid": "a274faa1-abfe-49d5-9d04-c3c4919cb1b3", - "id": "C01.04", - "severity": "Medium", - "link": "https://learn.microsoft.com/azure/storage/blobs/soft-delete-blob-enable?tabs=azure-portal" + "items": [ + { + "category": "Security", + "subcategory": " Overview", + "text": "Consider the 'Azure security baseline for storage'", + "description": "Apply guidance from the Microsoft cloud security benchmark related to Storage", + "waf": "Security", + "service": "Azure Storage", + "guid": "d237de14-3b16-4c21-b7aa-9b64604489a8", + "id": "A01.01", + "severity": "Medium", + "link": "https://learn.microsoft.com/security/benchmark/azure/baselines/storage-security-baseline" + }, + { + "category": "Security", + "subcategory": "Networking", + "text": "Consider using private endpoints for Azure Storage", + "description": "Azure Storage by default has a public IP address and is Internet-reachable. Private endpoints allow to securely expose Azure Storage only to those Azure Compute resources that need access, thus eliminating exposure to the public Internet", + "waf": "Security", + "service": "Azure Storage", + "guid": "f42d78e7-9d17-4a73-a22a-5a67e7a8ed4b", + "id": "A02.01", + "severity": "High", + "link": "https://learn.microsoft.com/azure/storage/common/storage-private-endpoints" + }, + { + "category": "Security", + "subcategory": "Governance", + "text": "Ensure older storage accounts are not using 'classic deployment model'", + "description": "Newly created storage accounts are created using the ARM deployment model, so that RBAC, auditing etc. are all enabled. Ensure that there are no old storage accounts with classic deployment model in a subscription", + "waf": "Security", + "service": "Azure Storage", + "guid": "30e37c3e-2971-41b2-963c-eee079b598de", + "id": "A03.01", + "severity": "Medium", + "link": "https://learn.microsoft.com/azure/virtual-machines/migration-classic-resource-manager-overview#migration-of-storage-accounts" + }, + { + "category": "Security", + "subcategory": "Governance", + "text": "Enable Microsoft Defender for all of your storage accounts", + "description": "Leverage Microsoft Defender to learn about suspicious activity and misconfigurations.", + "waf": "Security", + "service": "Azure Storage", + "guid": "fc5972cd-4cd2-41b0-a803-7f5e6b4bfd3d", + "id": "A03.02", + "severity": "High", + "link": "https://learn.microsoft.com/azure/storage/common/azure-defender-storage-configure" + }, + { + "category": "Security", + "subcategory": "Data Availability", + "text": "Enable 'soft delete' for blobs", + "description": "The soft-delete mechanism allows to recover accidentally deleted blobs.", + "waf": "Security", + "service": "Azure Storage", + "guid": "503547c1-447e-4c66-828a-7100f1ce16dd", + "id": "A04.01", + "severity": "Medium", + "link": "https://learn.microsoft.com/azure/storage/blobs/soft-delete-blob-overview" + }, + { + "category": "Security", + "subcategory": "Confidentiality", + "text": "Disable 'soft delete' for blobs", + "description": "Consider selectively disabling 'soft delete' for certain blob containers, for example if the application must ensure that deleted information is immediately deleted, e.g. for confidentiality, privacy or compliance reasons. ", + "waf": "Security", + "service": "Azure Storage", + "guid": "3f1d5e87-2e52-4e36-81cc-58b4a4b1510e", + "id": "A05.01", + "severity": "Medium", + "link": "https://learn.microsoft.com/azure/storage/blobs/soft-delete-blob-enable" + }, + { + "category": "Security", + "subcategory": "Data Availability", + "text": "Enable 'soft delete' for containers", + "description": "Soft delete for containers enables you to recover a container after it has been deleted, for example recover from an accidental delete operation.", + "waf": "Security", + "service": "Azure Storage", + "guid": "43a58a9c-2289-4c3d-9b57-d0c655462f2a", + "id": "A06.01", + "severity": "High", + "link": "https://learn.microsoft.com/azure/storage/blobs/soft-delete-container-overview" + }, + { + "category": "Security", + "subcategory": "Confidentiality", + "text": "Disable 'soft delete' for containers", + "description": "Consider selectively disabling 'soft delete' for certain blob containers, for example if the application must ensure that deleted information is immediately deleted, e.g. for confidentiality, privacy or compliance reasons. ", + "waf": "Security", + "service": "Azure Storage", + "guid": "3e3453a3-c863-4964-ab65-2d6c15f51296", + "id": "A07.01", + "severity": "Medium", + "link": "https://learn.microsoft.com/azure/storage/blobs/soft-delete-container-enable" + }, + { + "category": "Security", + "subcategory": "Data Availability", + "text": "Enable resource locks on storage accounts", + "description": "Prevents accidental deletion of a storage account, by forcing the user to first remove the deletion lock, prior to deletion", + "waf": "Security", + "service": "Azure Storage", + "guid": "5398e6de-d227-4dd1-92b0-6c21d7999a64", + "id": "A08.01", + "severity": "High", + "link": "https://learn.microsoft.com/azure/storage/common/lock-account-resource" + }, + { + "category": "Security", + "subcategory": "Data Availability, Compliance", + "text": "Consider immutable blobs", + "description": "Consider 'legal hold' or 'time-based retention' policies for blobs, so that is is impossible to delete the blob, the container, or the storage account. Please note that 'impossible' actually means 'impossible'; once a storage account contains an immutable blob, the only way to 'get rid' of that storage account is by cancelling the Azure subscription.", + "waf": "Security", + "service": "Azure Storage", + "guid": "6f4389a8-f42c-478e-98c0-6a73a22a4956", + "id": "A09.01", + "severity": "High", + "link": "https://learn.microsoft.com/azure/storage/blobs/immutable-storage-overview" + }, + { + "category": "Security", + "subcategory": "Networking", + "text": "Require HTTPS, i.e. disable port 80 on the storage account", + "description": "Consider disabling unprotected HTTP/80 access to the storage account, so that all data transfers are encrypted, integrity protected, and the server is authenticated. ", + "waf": "Security", + "service": "Azure Storage", + "guid": "e7a8dc4a-20e2-47c3-b297-11b1352beee0", + "id": "A10.01", + "severity": "High", + "link": "https://learn.microsoft.com/azure/storage/common/storage-require-secure-transfer" + }, + { + "category": "Security", + "subcategory": "Networking", + "text": "When enforcing HTTPS (disabling HTTP), check that you do not use custom domains (CNAME) for the storage account.", + "description": "When configuring a custom domain (hostname) on a storage account, check whether you need TLS/HTTPS; if so, you might have to put Azure CDN in front of your storage account.", + "waf": "Security", + "service": "Azure Storage", + "guid": "79b588de-fc49-472c-b3cd-21bf77036e5e", + "id": "A10.02", + "severity": "High", + "link": "https://learn.microsoft.com/azure/storage/blobs/storage-custom-domain-name" + }, + { + "category": "Security", + "subcategory": "Networking", + "text": "Limit shared access signature (SAS) tokens to HTTPS connections only", + "description": "Requiring HTTPS when a client uses a SAS token to access blob data helps to minimize the risk of credential loss.", + "waf": "Security", + "service": "Azure Storage", + "guid": "6b4bed3d-5035-447c-8347-dc56028a71ff", + "id": "A10.03", + "severity": "Medium", + "link": "https://learn.microsoft.com/azure/storage/common/storage-sas-overview" + }, + { + "category": "Security", + "subcategory": "Networking", + "text": "Enforce the latest TLS version for a storage account", + "description": ". Enforcing the latest TLS version will reject request from clients using the older version. ", + "waf": "Security", + "service": "Azure Storage", + "guid": "e12be569-a18f-4562-8d5d-ce151b9e7d55", + "id": "A10.4", + "severity": "High", + "graph": "resources | where type == 'microsoft.storage/storageaccounts' | extend compliant = (isnull(properties.minimumTlsVersion) == false and properties.minimumTlsVersion in ('TLS1_2', 'TLS1_3')) | distinct id, compliant", + "link": "https://learn.microsoft.com/azure/storage/common/transport-layer-security-configure-minimum-version" + }, + { + "category": "Security", + "subcategory": "Identity and Access Management", + "text": "Use Microsoft Entra ID tokens for blob access", + "description": "Microsoft Entra ID tokens should be favored over shared access signatures, wherever possible", + "waf": "Security", + "service": "Azure Storage", + "guid": "e1ce15dd-3f0d-45e7-92d4-1e3611cc57b4", + "id": "A11.01", + "severity": "High", + "link": "https://learn.microsoft.com/azure/storage/common/authorize-data-access" + }, + { + "category": "Security", + "subcategory": "Identity and Access Management", + "text": "Least privilege in IaM permissions", + "description": "When assigning a role to a user, group, or application, grant that security principal only those permissions that are necessary for them to perform their tasks. Limiting access to resources helps prevent both unintentional and malicious misuse of your data.", + "waf": "Security", + "service": "Azure Storage", + "guid": "a4b1410d-4395-48a8-a228-9b3d6b57cfc6", + "id": "A11.02", + "severity": "Medium" + }, + { + "category": "Security", + "subcategory": "Identity and Access Management", + "text": "When using SAS, prefer 'user delegation SAS' over storage-account-key based SAS.", + "description": "A user delegation SAS is secured with Azure Active Directory (Azure AD) credentials and also by the permissions specified for the SAS. A user delegation SAS is analogous to a service SAS in terms of its scope and function, but offers security benefits over the service SAS. ", + "waf": "Security", + "service": "Azure Storage", + "guid": "55461e1a-3e34-453a-9c86-39648b652d6c", + "id": "A11.03", + "severity": "High", + "link": "https://learn.microsoft.com/azure/storage/common/storage-sas-overview?toc=%2Fazure%2Fstorage%2Fblobs%2Ftoc.json#best-practices-when-using-sas" + }, + { + "category": "Security", + "subcategory": "Identity and Access Management", + "text": "Consider disabling storage account keys, so that only Microsoft Entra ID access (and user delegation SAS) is supported.", + "description": "Storage account keys ('shared keys') have very little audit capabilities. While it can be monitored on who/when fetched a copy of the keys, once the keys are in the hands of multiple people, it is impossible to attribute usage to a specific user. Solely relying on Entra ID authentication makes it easier to tie storage access to a user. ", + "waf": "Security", + "service": "Azure Storage", + "guid": "15f51296-5398-4e6d-bd22-7dd142b06c21", + "id": "A11.04", + "severity": "High", + "graph": "resources | where type == 'microsoft.storage/storageaccounts' | extend allowSharedKeyAccess = tostring(properties.allowSharedKeyAccess) | extend compliant = (isnotempty(allowSharedKeyAccess) and allowSharedKeyAccess == 'false') | distinct id, compliant", + "link": "https://learn.microsoft.com/rest/api/storageservices/authorize-with-shared-key" + }, + { + "category": "Security", + "subcategory": "Monitoring", + "text": "Consider using Azure Monitor to audit control plane operations on the storage account", + "description": "Use Activity Log data to identify 'when', 'who', 'what' and 'how' the security of your storage account is being viewed or changed (i.e. storage account keys, access policies, etc.).", + "waf": "Security", + "service": "Azure Storage", + "guid": "d7999a64-6f43-489a-af42-c78e78c06a73", + "id": "A12.01", + "severity": "High", + "link": "https://learn.microsoft.com/azure/storage/blobs/blob-storage-monitoring-scenarios#audit-account-activity" + }, + { + "category": "Security", + "subcategory": "Identity and Access Management", + "text": "When using storage account keys, consider enabling a 'key expiration policy'", + "description": "A key expiration policy enables you to set a reminder for the rotation of the account access keys. The reminder is displayed if the specified interval has elapsed and the keys have not yet been rotated.", + "waf": "Security", + "service": "Azure Storage", + "guid": "a22a4956-e7a8-4dc4-a20e-27c3e29711b1", + "id": "A13.01", + "severity": "Medium", + "link": "https://learn.microsoft.com/azure/storage/common/storage-account-keys-manage?tabs=azure-portal#create-a-key-expiration-policy" + }, + { + "category": "Security", + "subcategory": "Identity and Access Management", + "text": "Consider configuring an SAS expiration policy", + "description": "A SAS expiration policy specifies a recommended interval over which the SAS is valid. SAS expiration policies apply to a service SAS or an account SAS. When a user generates service SAS or an account SAS with a validity interval that is larger than the recommended interval, they'll see a warning.", + "waf": "Security", + "service": "Azure Storage", + "guid": "352beee0-79b5-488d-bfc4-972cd3cd21bf", + "id": "A13.02", + "severity": "Medium", + "link": "https://learn.microsoft.com/azure/storage/common/sas-expiration-policy" + }, + { + "category": "Security", + "subcategory": "Identity and Access Management", + "text": "Consider linking SAS to a stored access policy", + "description": "Stored access policies give you the option to revoke permissions for a service SAS without having to regenerate the storage account keys. ", + "waf": "Security", + "service": "Azure Storage", + "guid": "77036e5e-6b4b-4ed3-b503-547c1347dc56", + "id": "A13.03", + "severity": "Medium", + "link": "https://learn.microsoft.com/rest/api/storageservices/define-stored-access-policy" + }, + { + "category": "Security", + "subcategory": "CI/CD", + "text": "Consider configuring your application's source code repository to detect checked-in connection strings and storage account keys.", + "waf": "Security", + "service": "Azure Storage", + "guid": "028a71ff-e1ce-415d-b3f0-d5e772d41e36", + "id": "A14.01", + "severity": "Medium", + "link": "https://microsoft.github.io/code-with-engineering-playbook/continuous-integration/dev-sec-ops/secret-management/recipes/detect-secrets-ado/" + }, + { + "category": "Security", + "subcategory": "Identity and Access Management", + "text": "Consider storing connection strings in Azure KeyVault (in scenarios where managed identities are not possible)", + "description": "Ideally, your application should be using a managed identity to authenticate to Azure Storage. If that is not possible, consider having the storage credential (connection string, storage account key, SAS, service principal credential) in Azure KeyVault or an equivalent service.", + "waf": "Security", + "service": "Azure Storage", + "guid": "11cc57b4-a4b1-4410-b439-58a8c2289b3d", + "id": "A15.01", + "severity": "High", + "link": "https://learn.microsoft.com/azure/architecture/framework/security/design-storage-keys" + }, + { + "category": "Security", + "subcategory": "Identity and Access Management", + "text": "Strive for short validity periods for ad-hoc SAS", + "description": "Use near-term expiration times on an ad hoc SAS service SAS or account SAS. In this way, even if a SAS is compromised, it's valid only for a short time. This practice is especially important if you cannot reference a stored access policy. Near-term expiration times also limit the amount of data that can be written to a blob by limiting the time available to upload to it.", + "waf": "Security", + "service": "Azure Storage", + "guid": "27138b82-1102-4cac-9eae-01e6e842e52f", + "id": "A15.02", + "severity": "High", + "link": "https://learn.microsoft.com/rest/api/storageservices/delegate-access-with-shared-access-signature" + }, + { + "category": "Security", + "subcategory": "Identity and Access Management", + "text": "Apply a narrow scope to a SAS", + "description": "When creating a SAS, be as specific and restrictive as possible. Prefer a SAS for a single resource and operation over a SAS which gives much broader access.", + "waf": "Security", + "service": "Azure Storage", + "guid": "4721d928-c1b1-4cd5-81e5-4a29a9de399c", + "id": "A15.03", + "severity": "Medium", + "link": "https://learn.microsoft.com/rest/api/storageservices/delegate-access-with-shared-access-signature" + }, + { + "category": "Security", + "subcategory": "Identity and Access Management", + "text": "Consider scoping SAS to a specific client IP address, wherever possible", + "description": "A SAS can include parameters on which client IP addresses or address ranges are authorized to request a resource using the SAS. ", + "waf": "Security", + "service": "Azure Storage", + "guid": "fd7b28dc-9355-4562-82bf-e4564b0d834a", + "id": "A15.04", + "severity": "Medium", + "link": "https://learn.microsoft.com/rest/api/storageservices/create-account-sas" + }, + { + "category": "Security", + "subcategory": "Identity and Access Management", + "text": "Consider checking uploaded data, after clients used a SAS to upload a file. ", + "description": "A SAS cannot constrain how much data a client uploads; given the pricing model of amount of storage over time, it might make sense to validate whether clients uploaded maliciously large contents.", + "waf": "Security", + "service": "Azure Storage", + "guid": "348b263e-6dd6-4051-8a36-498f6dbad38e", + "id": "A15.05", + "severity": "Low" + }, + { + "category": "Security", + "subcategory": "Identity and Access Management", + "text": "SFTP: Limit the amount of 'local users' for SFTP access, and audit whether access is needed over time.", + "description": "When accessing blob storage via SFTP using a 'local user account', the 'usual' RBAC controls do not apply. Blob access via NFS or REST might be more restrictive than SFTP access. Unfortunately, as of early 2023, local users are the only form of identity management that is currently supported for the SFTP endpoint", + "waf": "Security", + "service": "Azure Storage", + "guid": "ad53cc7c-e1d7-4aaa-a357-1449ab8053d8", + "id": "A15.06", + "severity": "High", + "link": "https://learn.microsoft.com/azure/storage/blobs/secure-file-transfer-protocol-support#sftp-permission-model" + }, + { + "category": "Security", + "subcategory": "Identity and Access Management", + "text": "SFTP: The SFTP endpoint does not support POSIX-like ACLs.", + "waf": "Security", + "service": "Azure Storage", + "guid": "9f89dc7b-33be-42a1-a27f-7b9e91be1f38", + "id": "A15.07", + "severity": "Medium", + "link": "https://learn.microsoft.com/azure/storage/blobs/secure-file-transfer-protocol-known-issues#authentication-and-authorization" + }, + { + "category": "Security", + "subcategory": "Networking", + "text": "Avoid overly broad CORS policies", + "description": "Storage supports CORS (Cross-Origin Resource Sharing), i.e. an HTTP feature that enables web apps from a different domain to loosen the same-origin policy. When enabling CORS, keep the CorsRules to the least privilege.", + "waf": "Security", + "service": "Azure Storage", + "guid": "cef39812-bd46-43cb-aac8-ac199ebb91a3", + "id": "A16.01", + "severity": "High", + "link": "https://learn.microsoft.com/rest/api/storageservices/cross-origin-resource-sharing--cors--support-for-the-azure-storage-services" + }, + { + "category": "Security", + "subcategory": "Confidentiality and Encryption", + "text": "Determine how data at rest should be encrypted. Understand the thread model for data.", + "description": "Data at rest is always encrypted server-side, and in addition might be encrypted client-side as well. Server-side encryption might happen using a platform-managed key (default) or customer-managed key. Client-side encryption might happen by either having the client supply an encryption/decryption key on a per-blob basis to Azure storage, or by completely handling encryption on the client-side. thus not relying on Azure Storage at all for confidentiality guarantees.", + "waf": "Security", + "service": "Azure Storage", + "guid": "3d90cae2-cc88-4137-86f7-c0cbafe61464", + "id": "A17.01", + "severity": "High", + "link": "https://learn.microsoft.com/azure/storage/common/storage-service-encryption" + }, + { + "category": "Security", + "subcategory": "Confidentiality and Encryption", + "text": "Determine which/if platform encryption should be used.", + "waf": "Security", + "service": "Azure Storage", + "guid": "8dd457e9-2713-48b8-8110-2cac6eae01e6", + "id": "A17.02", + "severity": "Medium", + "link": "https://learn.microsoft.com/azure/storage/common/customer-managed-keys-overview?toc=%2Fazure%2Fstorage%2Fblobs%2Ftoc.json&bc=%2Fazure%2Fstorage%2Fblobs%2Fbreadcrumb%2Ftoc.json" + }, + { + "category": "Security", + "subcategory": "Confidentiality and Encryption", + "text": "Determine which/if client-side encryption should be used.", + "waf": "Security", + "service": "Azure Storage", + "guid": "e842e52f-4721-4d92-ac1b-1cd521e54a29", + "id": "A17.03", + "severity": "Medium", + "link": "https://learn.microsoft.com/azure/storage/blobs/encryption-customer-provided-keys" + }, + { + "category": "Security", + "subcategory": "Identity and Access Management", + "text": "Consider whether public blob anonymous access is needed, or whether it can be disabled for certain storage accounts. ", + "description": "Leverage Resource Graph Explorer (resources | where type == 'microsoft.storage/storageaccounts' | where properties['allowBlobPublicAccess'] == true) to find storage accounts which allow anonymous blob access.", + "waf": "Security", + "service": "Azure Storage", + "guid": "659ae558-b937-4d49-a5e1-112dbd7ba012", + "id": "A18.01", + "severity": "High", + "graph": "resources | where type == 'microsoft.storage/storageaccounts' | extend compliant = (properties.allowBlobPublicAccess == 'false') | distinct id, compliant", + "link": "https://learn.microsoft.com/azure/storage/blobs/anonymous-read-access-configure?tabs=portal#allow-or-disallow-public-read-access-for-a-storage-account" + }, + { + "category": "Operations Management", + "subcategory": "Platform Version", + "text": "Leverage a storagev2 account type for better performance and reliability", + "waf": "Reliability", + "service": "Azure Storage", + "guid": "cb8eb8c0-aa62-4a25-a495-6eaa8dc4a243", + "id": "B01.01", + "severity": "High", + "link": "https://learn.microsoft.com/azure/storage/common/storage-account-upgrade?tabs=azure-portal" + }, + { + "category": "BC and DR", + "subcategory": "Availablity", + "text": "Leverage GRS, ZRS or GZRS storage for the highest availability", + "waf": "Reliability", + "service": "Azure Storage", + "guid": "e05bbe20-9d49-4fda-9777-8424d116785c", + "id": "C01.01", + "severity": "High", + "link": "https://learn.microsoft.com/azure/storage/common/storage-redundancy" + }, + { + "category": "BC and DR", + "subcategory": "Failover", + "text": "For write operation after failover, use customer-Managed Failover ", + "waf": "Reliability", + "service": "Azure Storage", + "guid": "2fa56c56-ad48-4408-be72-734c486ba280", + "id": "C01.02", + "severity": "Medium", + "link": "https://learn.microsoft.com/azure/storage/common/storage-disaster-recovery-guidance" + }, + { + "category": "Operations Management", + "subcategory": "Failover", + "text": "Understand Microsoft-Managed Failover details", + "waf": "Reliability", + "service": "Azure Storage", + "guid": "dc0590cf-65de-48e1-909c-cbd579266bcc", + "id": "C01.03", + "severity": "Medium", + "link": "https://learn.microsoft.com/azure/storage/common/storage-disaster-recovery-guidance#microsoft-managed-failover" + }, + { + "category": "Operations Management", + "subcategory": "Data Protection", + "text": "Enable Soft Delete", + "waf": "Reliability", + "service": "Azure Storage", + "guid": "a274faa1-abfe-49d5-9d04-c3c4919cb1b3", + "id": "C01.04", + "severity": "Medium", + "link": "https://learn.microsoft.com/azure/storage/blobs/soft-delete-blob-enable?tabs=azure-portal" + } + ], + "categories": [ + { + "name": "Identity and Access Management" + }, + { + "name": "Network Topology and Connectivity" + }, + { + "name": "BC and DR" + }, + { + "name": "Governance and Security" + }, + { + "name": "Cost Governance" + }, + { + "name": "Operations Management" + }, + { + "name": "Application Deployment" + }, + { + "name": "Security" + } + ], + "waf": [ + { + "name": "Reliability" + }, + { + "name": "Security" + }, + { + "name": "Cost" + }, + { + "name": "Operations" + }, + { + "name": "Performance" + } + ], + "yesno": [ + { + "name": "Yes" + }, + { + "name": "No" + } + ], + "status": [ + { + "name": "Not verified", + "description": "This check has not been looked at yet" + }, + { + "name": "Open", + "description": "There is an action item associated to this check" + }, + { + "name": "Fulfilled", + "description": "This check has been verified, and there are no further action items associated to it" + }, + { + "name": "Not required", + "description": "Recommendation understood, but not needed by current requirements" + }, + { + "name": "N/A", + "description": "Not applicable for current design" + } + ], + "severities": [ + { + "name": "High" + }, + { + "name": "Medium" + }, + { + "name": "Low" + } + ], + "metadata": { + "name": "Azure Storage Review Checklist", + "state": "Preview", + "waf": "all", + "timestamp": "August 12, 2024" } - ], - "categories": [ - { - "name": "Identity and Access Management" - }, - { - "name": "Network Topology and Connectivity" - }, - { - "name": "BC and DR" - }, - { - "name": "Governance and Security" - }, - { - "name": "Cost Governance" - }, - { - "name": "Operations Management" - }, - { - "name": "Application Deployment" - }, - { - "name": "Security" - } - ], - "waf": [ - { - "name": "Reliability" - }, - { - "name": "Security" - }, - { - "name": "Cost" - }, - { - "name": "Operations" - }, - { - "name": "Performance" - } - ], - "yesno": [ - { - "name": "Yes" - }, - { - "name": "No" - } - ], - "status": [ - { - "name": "Not verified", - "description": "This check has not been looked at yet" - }, - { - "name": "Open", - "description": "There is an action item associated to this check" - }, - { - "name": "Fulfilled", - "description": "This check has been verified, and there are no further action items associated to it" - }, - { - "name": "Not required", - "description": "Recommendation understood, but not needed by current requirements" - }, - { - "name": "N/A", - "description": "Not applicable for current design" - } - ], - "severities": [ - { - "name": "High" - }, - { - "name": "Medium" - }, - { - "name": "Low" - } - ], - "metadata": { - "name": "Azure Storage Review Checklist", - "state": "Preview", - "waf": "all", - "timestamp": "April 19, 2024" - } -} +} \ No newline at end of file diff --git a/checklists/azure_storage_checklist.es.json b/checklists/azure_storage_checklist.es.json new file mode 100644 index 000000000..b0c270576 --- /dev/null +++ b/checklists/azure_storage_checklist.es.json @@ -0,0 +1,566 @@ +{ + "categories": [ + { + "name": "Gestión de identidades y accesos" + }, + { + "name": "Topología de red y conectividad" + }, + { + "name": "BC y RD" + }, + { + "name": "Gobernanza y seguridad" + }, + { + "name": "Gobernanza de costos" + }, + { + "name": "Gestión de Operaciones" + }, + { + "name": "Implementación de aplicaciones" + }, + { + "name": "Seguridad" + } + ], + "items": [ + { + "category": "Seguridad", + "description": "Aplicación de las instrucciones del banco de pruebas de seguridad en la nube de Microsoft relacionadas con el almacenamiento", + "guid": "d237de14-3b16-4c21-b7aa-9b64604489a8", + "id": "A01.01", + "link": "https://learn.microsoft.com/security/benchmark/azure/baselines/storage-security-baseline", + "service": "Azure Storage", + "severity": "Medio", + "subcategory": " Visión general", + "text": "Tenga en cuenta la \"Línea base de seguridad de Azure para el almacenamiento\"", + "waf": "Seguridad" + }, + { + "category": "Seguridad", + "description": "De forma predeterminada, Azure Storage tiene una dirección IP pública y es accesible desde Internet. Los puntos de conexión privados permiten exponer de forma segura Azure Storage solo a los recursos de Azure Compute que necesitan acceso, lo que elimina la exposición a la Internet pública", + "guid": "f42d78e7-9d17-4a73-a22a-5a67e7a8ed4b", + "id": "A02.01", + "link": "https://learn.microsoft.com/azure/storage/common/storage-private-endpoints", + "service": "Azure Storage", + "severity": "Alto", + "subcategory": "Gestión de redes", + "text": "Considere la posibilidad de usar puntos de conexión privados para Azure Storage", + "waf": "Seguridad" + }, + { + "category": "Seguridad", + "description": "Las cuentas de almacenamiento recién creadas se crean mediante el modelo de implementación de ARM, de modo que RBAC, etcétera de auditoría, estén habilitados. Asegúrese de que no haya cuentas de almacenamiento antiguas con el modelo de implementación clásico en una suscripción", + "guid": "30e37c3e-2971-41b2-963c-eee079b598de", + "id": "A03.01", + "link": "https://learn.microsoft.com/azure/virtual-machines/migration-classic-resource-manager-overview#migration-of-storage-accounts", + "service": "Azure Storage", + "severity": "Medio", + "subcategory": "Gobernanza", + "text": "Asegúrese de que las cuentas de almacenamiento más antiguas no usen el \"modelo de implementación clásica\"", + "waf": "Seguridad" + }, + { + "category": "Seguridad", + "description": "Aproveche Microsoft Defender para obtener información sobre actividades sospechosas y configuraciones incorrectas.", + "guid": "fc5972cd-4cd2-41b0-a803-7f5e6b4bfd3d", + "id": "A03.02", + "link": "https://learn.microsoft.com/azure/storage/common/azure-defender-storage-configure", + "service": "Azure Storage", + "severity": "Alto", + "subcategory": "Gobernanza", + "text": "Habilitación de Microsoft Defender para todas las cuentas de almacenamiento", + "waf": "Seguridad" + }, + { + "category": "Seguridad", + "description": "El mecanismo de eliminación temporal permite recuperar blobs eliminados accidentalmente.", + "guid": "503547c1-447e-4c66-828a-7100f1ce16dd", + "id": "A04.01", + "link": "https://learn.microsoft.com/azure/storage/blobs/soft-delete-blob-overview", + "service": "Azure Storage", + "severity": "Medio", + "subcategory": "Disponibilidad de datos", + "text": "Habilitación de la \"eliminación temporal\" para blobs", + "waf": "Seguridad" + }, + { + "category": "Seguridad", + "description": "Considere la posibilidad de deshabilitar selectivamente la \"eliminación temporal\" para determinados contenedores de blobs, por ejemplo, si la aplicación debe asegurarse de que la información eliminada se elimine inmediatamente, por ejemplo, por motivos de confidencialidad, privacidad o cumplimiento. ", + "guid": "3f1d5e87-2e52-4e36-81cc-58b4a4b1510e", + "id": "A05.01", + "link": "https://learn.microsoft.com/azure/storage/blobs/soft-delete-blob-enable", + "service": "Azure Storage", + "severity": "Medio", + "subcategory": "Confidencialidad", + "text": "Deshabilitación de la \"eliminación temporal\" para blobs", + "waf": "Seguridad" + }, + { + "category": "Seguridad", + "description": "La eliminación temporal de contenedores permite recuperar un contenedor después de que se haya eliminado, por ejemplo, recuperarse de una operación de eliminación accidental.", + "guid": "43a58a9c-2289-4c3d-9b57-d0c655462f2a", + "id": "A06.01", + "link": "https://learn.microsoft.com/azure/storage/blobs/soft-delete-container-overview", + "service": "Azure Storage", + "severity": "Alto", + "subcategory": "Disponibilidad de datos", + "text": "Habilitación de la \"eliminación temporal\" para contenedores", + "waf": "Seguridad" + }, + { + "category": "Seguridad", + "description": "Considere la posibilidad de deshabilitar selectivamente la \"eliminación temporal\" para determinados contenedores de blobs, por ejemplo, si la aplicación debe asegurarse de que la información eliminada se elimine inmediatamente, por ejemplo, por motivos de confidencialidad, privacidad o cumplimiento. ", + "guid": "3e3453a3-c863-4964-ab65-2d6c15f51296", + "id": "A07.01", + "link": "https://learn.microsoft.com/azure/storage/blobs/soft-delete-container-enable", + "service": "Azure Storage", + "severity": "Medio", + "subcategory": "Confidencialidad", + "text": "Deshabilitar la \"eliminación temporal\" para contenedores", + "waf": "Seguridad" + }, + { + "category": "Seguridad", + "description": "Evita la eliminación accidental de una cuenta de almacenamiento, obligando al usuario a quitar primero el bloqueo de eliminación, antes de la eliminación", + "guid": "5398e6de-d227-4dd1-92b0-6c21d7999a64", + "id": "A08.01", + "link": "https://learn.microsoft.com/azure/storage/common/lock-account-resource", + "service": "Azure Storage", + "severity": "Alto", + "subcategory": "Disponibilidad de datos", + "text": "Habilitación de bloqueos de recursos en cuentas de almacenamiento", + "waf": "Seguridad" + }, + { + "category": "Seguridad", + "description": "Considere la posibilidad de aplicar directivas de \"retención legal\" o \"retención basada en tiempo\" para los blobs, de modo que sea imposible eliminar el blob, el contenedor o la cuenta de almacenamiento. Tenga en cuenta que 'imposible' en realidad significa 'imposible'; una vez que una cuenta de almacenamiento contiene un blob inmutable, la única manera de \"deshacerse\" de esa cuenta de almacenamiento es cancelando la suscripción de Azure.", + "guid": "6f4389a8-f42c-478e-98c0-6a73a22a4956", + "id": "A09.01", + "link": "https://learn.microsoft.com/azure/storage/blobs/immutable-storage-overview", + "service": "Azure Storage", + "severity": "Alto", + "subcategory": "Disponibilidad de datos, cumplimiento", + "text": "Considere la posibilidad de blobs inmutables", + "waf": "Seguridad" + }, + { + "category": "Seguridad", + "description": "Considere la posibilidad de deshabilitar el acceso HTTP/80 no protegido a la cuenta de almacenamiento, de modo que todas las transferencias de datos estén cifradas, protegidas contra la integridad y el servidor esté autenticado. ", + "guid": "e7a8dc4a-20e2-47c3-b297-11b1352beee0", + "id": "A10.01", + "link": "https://learn.microsoft.com/azure/storage/common/storage-require-secure-transfer", + "service": "Azure Storage", + "severity": "Alto", + "subcategory": "Gestión de redes", + "text": "Requerir HTTPS, es decir, deshabilitar el puerto 80 en la cuenta de almacenamiento", + "waf": "Seguridad" + }, + { + "category": "Seguridad", + "description": "Al configurar un dominio personalizado (nombre de host) en una cuenta de almacenamiento, compruebe si necesita TLS/HTTPS; si es así, es posible que tenga que colocar Azure CDN delante de la cuenta de almacenamiento.", + "guid": "79b588de-fc49-472c-b3cd-21bf77036e5e", + "id": "A10.02", + "link": "https://learn.microsoft.com/azure/storage/blobs/storage-custom-domain-name", + "service": "Azure Storage", + "severity": "Alto", + "subcategory": "Gestión de redes", + "text": "Al aplicar HTTPS (deshabilitar HTTP), compruebe que no usa dominios personalizados (CNAME) para la cuenta de almacenamiento.", + "waf": "Seguridad" + }, + { + "category": "Seguridad", + "description": "Requerir HTTPS cuando un cliente usa un token de SAS para acceder a los datos de blob ayuda a minimizar el riesgo de pérdida de credenciales.", + "guid": "6b4bed3d-5035-447c-8347-dc56028a71ff", + "id": "A10.03", + "link": "https://learn.microsoft.com/azure/storage/common/storage-sas-overview", + "service": "Azure Storage", + "severity": "Medio", + "subcategory": "Gestión de redes", + "text": "Limitar los tokens de firma de acceso compartido (SAS) solo a las conexiones HTTPS", + "waf": "Seguridad" + }, + { + "category": "Seguridad", + "description": ". Al aplicar la versión más reciente de TLS, se rechazarán las solicitudes de los clientes que utilicen la versión anterior. ", + "graph": "resources | where type == 'microsoft.storage/storageaccounts' | extend compliant = (isnull(properties.minimumTlsVersion) == false and properties.minimumTlsVersion in ('TLS1_2', 'TLS1_3')) | distinct id, compliant", + "guid": "e12be569-a18f-4562-8d5d-ce151b9e7d55", + "id": "A10.4", + "link": "https://learn.microsoft.com/azure/storage/common/transport-layer-security-configure-minimum-version", + "service": "Azure Storage", + "severity": "Alto", + "subcategory": "Gestión de redes", + "text": "Aplicación de la versión más reciente de TLS para una cuenta de almacenamiento", + "waf": "Seguridad" + }, + { + "category": "Seguridad", + "description": "Los tokens de identificador de Microsoft Entra deben favorecerse sobre las firmas de acceso compartido, siempre que sea posible", + "guid": "e1ce15dd-3f0d-45e7-92d4-1e3611cc57b4", + "id": "A11.01", + "link": "https://learn.microsoft.com/azure/storage/common/authorize-data-access", + "service": "Azure Storage", + "severity": "Alto", + "subcategory": "Gestión de identidades y accesos", + "text": "Uso de tokens de identificador de Microsoft Entra para el acceso a blobs", + "waf": "Seguridad" + }, + { + "category": "Seguridad", + "description": "Al asignar un rol a un usuario, grupo o aplicación, conceda a esa entidad de seguridad solo los permisos necesarios para que pueda realizar sus tareas. Limitar el acceso a los recursos ayuda a evitar el uso indebido no intencionado y malintencionado de los datos.", + "guid": "a4b1410d-4395-48a8-a228-9b3d6b57cfc6", + "id": "A11.02", + "service": "Azure Storage", + "severity": "Medio", + "subcategory": "Gestión de identidades y accesos", + "text": "Privilegio mínimo en los permisos de IaM", + "waf": "Seguridad" + }, + { + "category": "Seguridad", + "description": "Una SAS de delegación de usuarios está protegida con credenciales de Azure Active Directory (Azure AD) y también con los permisos especificados para la SAS. Una SAS de delegación de usuarios es análoga a una SAS de servicio en cuanto a su ámbito y función, pero ofrece ventajas de seguridad con respecto a la SAS de servicio. ", + "guid": "55461e1a-3e34-453a-9c86-39648b652d6c", + "id": "A11.03", + "link": "https://learn.microsoft.com/azure/storage/common/storage-sas-overview?toc=%2Fazure%2Fstorage%2Fblobs%2Ftoc.json#best-practices-when-using-sas", + "service": "Azure Storage", + "severity": "Alto", + "subcategory": "Gestión de identidades y accesos", + "text": "Al usar SAS, prefiera \"SAS de delegación de usuarios\" en lugar de SAS basada en clave de cuenta de almacenamiento.", + "waf": "Seguridad" + }, + { + "category": "Seguridad", + "description": "Las claves de la cuenta de almacenamiento ('claves compartidas') tienen muy pocas capacidades de auditoría. Si bien se puede monitorear quién o cuándo obtuvo una copia de las claves, una vez que las claves están en manos de varias personas, es imposible atribuir el uso a un usuario específico. Confiar únicamente en la autenticación de ID de Entra facilita la vinculación del acceso al almacenamiento de un usuario. ", + "graph": "resources | where type == 'microsoft.storage/storageaccounts' | extend allowSharedKeyAccess = tostring(properties.allowSharedKeyAccess) | extend compliant = (isnotempty(allowSharedKeyAccess) and allowSharedKeyAccess == 'false') | distinct id, compliant", + "guid": "15f51296-5398-4e6d-bd22-7dd142b06c21", + "id": "A11.04", + "link": "https://learn.microsoft.com/rest/api/storageservices/authorize-with-shared-key", + "service": "Azure Storage", + "severity": "Alto", + "subcategory": "Gestión de identidades y accesos", + "text": "Considere la posibilidad de deshabilitar las claves de la cuenta de almacenamiento, de modo que solo se admita el acceso a Microsoft Entra ID (y SAS de delegación de usuarios).", + "waf": "Seguridad" + }, + { + "category": "Seguridad", + "description": "Utilice los datos del registro de actividad para identificar \"cuándo\", \"quién\", \"qué\" y \"cómo\" se está viendo o cambiando la seguridad de la cuenta de almacenamiento (es decir, claves de cuenta de almacenamiento, directivas de acceso, etcétera).", + "guid": "d7999a64-6f43-489a-af42-c78e78c06a73", + "id": "A12.01", + "link": "https://learn.microsoft.com/azure/storage/blobs/blob-storage-monitoring-scenarios#audit-account-activity", + "service": "Azure Storage", + "severity": "Alto", + "subcategory": "Monitorización", + "text": "Considere la posibilidad de usar Azure Monitor para auditar las operaciones del plano de control en la cuenta de almacenamiento", + "waf": "Seguridad" + }, + { + "category": "Seguridad", + "description": "Una política de caducidad de claves le permite establecer un recordatorio para la rotación de las claves de acceso de la cuenta. El recordatorio se muestra si ha transcurrido el intervalo especificado y las teclas aún no se han girado.", + "guid": "a22a4956-e7a8-4dc4-a20e-27c3e29711b1", + "id": "A13.01", + "link": "https://learn.microsoft.com/azure/storage/common/storage-account-keys-manage?tabs=azure-portal#create-a-key-expiration-policy", + "service": "Azure Storage", + "severity": "Medio", + "subcategory": "Gestión de identidades y accesos", + "text": "Al usar claves de cuenta de almacenamiento, considere la posibilidad de habilitar una \"directiva de expiración de claves\"", + "waf": "Seguridad" + }, + { + "category": "Seguridad", + "description": "Una directiva de expiración de SAS especifica un intervalo recomendado durante el cual la SAS es válida. Las directivas de caducidad de SAS se aplican a una SAS de servicio o a una SAS de cuenta. Cuando un usuario genera una SAS de servicio o una SAS de cuenta con un intervalo de validez mayor que el intervalo recomendado, verá una advertencia.", + "guid": "352beee0-79b5-488d-bfc4-972cd3cd21bf", + "id": "A13.02", + "link": "https://learn.microsoft.com/azure/storage/common/sas-expiration-policy", + "service": "Azure Storage", + "severity": "Medio", + "subcategory": "Gestión de identidades y accesos", + "text": "Considere la posibilidad de configurar una directiva de expiración de SAS", + "waf": "Seguridad" + }, + { + "category": "Seguridad", + "description": "Las directivas de acceso almacenadas ofrecen la opción de revocar los permisos de una SAS de servicio sin tener que volver a generar las claves de la cuenta de almacenamiento. ", + "guid": "77036e5e-6b4b-4ed3-b503-547c1347dc56", + "id": "A13.03", + "link": "https://learn.microsoft.com/rest/api/storageservices/define-stored-access-policy", + "service": "Azure Storage", + "severity": "Medio", + "subcategory": "Gestión de identidades y accesos", + "text": "Considere la posibilidad de vincular SAS a una directiva de acceso almacenada", + "waf": "Seguridad" + }, + { + "category": "Seguridad", + "guid": "028a71ff-e1ce-415d-b3f0-d5e772d41e36", + "id": "A14.01", + "link": "https://microsoft.github.io/code-with-engineering-playbook/continuous-integration/dev-sec-ops/secret-management/recipes/detect-secrets-ado/", + "service": "Azure Storage", + "severity": "Medio", + "subcategory": "CI/CD", + "text": "Considere la posibilidad de configurar el repositorio de código fuente de la aplicación para detectar cadenas de conexión protegidas y claves de cuenta de almacenamiento.", + "waf": "Seguridad" + }, + { + "category": "Seguridad", + "description": "Lo ideal es que la aplicación use una identidad administrada para autenticarse en Azure Storage. Si eso no es posible, considere la posibilidad de tener la credencial de almacenamiento (cadena de conexión, clave de cuenta de almacenamiento, SAS, credencial de entidad de servicio) en Azure KeyVault o un servicio equivalente.", + "guid": "11cc57b4-a4b1-4410-b439-58a8c2289b3d", + "id": "A15.01", + "link": "https://learn.microsoft.com/azure/architecture/framework/security/design-storage-keys", + "service": "Azure Storage", + "severity": "Alto", + "subcategory": "Gestión de identidades y accesos", + "text": "Considere la posibilidad de almacenar cadenas de conexión en Azure KeyVault (en escenarios en los que las identidades administradas no son posibles)", + "waf": "Seguridad" + }, + { + "category": "Seguridad", + "description": "Utilice los tiempos de caducidad a corto plazo en una SAS de servicio SAS ad hoc o en una SAS de cuenta. De esta manera, incluso si una SAS se ve comprometida, solo es válida durante un corto período de tiempo. Esta práctica es especialmente importante si no puede hacer referencia a una política de acceso almacenada. Los tiempos de expiración a corto plazo también limitan la cantidad de datos que se pueden escribir en un blob al limitar el tiempo disponible para cargarlos en él.", + "guid": "27138b82-1102-4cac-9eae-01e6e842e52f", + "id": "A15.02", + "link": "https://learn.microsoft.com/rest/api/storageservices/delegate-access-with-shared-access-signature", + "service": "Azure Storage", + "severity": "Alto", + "subcategory": "Gestión de identidades y accesos", + "text": "Esfuércese por períodos de validez cortos para SAS ad-hoc", + "waf": "Seguridad" + }, + { + "category": "Seguridad", + "description": "Al crear una SAS, sea lo más específico y restrictivo posible. Prefiera una SAS para un solo recurso y operación en lugar de una SAS que proporciona un acceso mucho más amplio.", + "guid": "4721d928-c1b1-4cd5-81e5-4a29a9de399c", + "id": "A15.03", + "link": "https://learn.microsoft.com/rest/api/storageservices/delegate-access-with-shared-access-signature", + "service": "Azure Storage", + "severity": "Medio", + "subcategory": "Gestión de identidades y accesos", + "text": "Aplicación de un ámbito limitado a una SAS", + "waf": "Seguridad" + }, + { + "category": "Seguridad", + "description": "Una SAS puede incluir parámetros sobre las direcciones IP de cliente o los intervalos de direcciones que están autorizados a solicitar un recurso mediante la SAS. ", + "guid": "fd7b28dc-9355-4562-82bf-e4564b0d834a", + "id": "A15.04", + "link": "https://learn.microsoft.com/rest/api/storageservices/create-account-sas", + "service": "Azure Storage", + "severity": "Medio", + "subcategory": "Gestión de identidades y accesos", + "text": "Considere la posibilidad de definir el ámbito de SAS a una dirección IP de cliente específica, siempre que sea posible", + "waf": "Seguridad" + }, + { + "category": "Seguridad", + "description": "Una SAS no puede restringir la cantidad de datos que carga un cliente; Dado el modelo de precios de la cantidad de almacenamiento a lo largo del tiempo, podría tener sentido validar si los clientes cargaron contenidos malintencionados de gran tamaño.", + "guid": "348b263e-6dd6-4051-8a36-498f6dbad38e", + "id": "A15.05", + "service": "Azure Storage", + "severity": "Bajo", + "subcategory": "Gestión de identidades y accesos", + "text": "Considere la posibilidad de comprobar los datos cargados, después de que los clientes hayan utilizado una SAS para cargar un archivo. ", + "waf": "Seguridad" + }, + { + "category": "Seguridad", + "description": "Al acceder al almacenamiento de blobs a través de SFTP mediante una \"cuenta de usuario local\", no se aplican los controles RBAC \"habituales\". El acceso a blobs a través de NFS o REST puede ser más restrictivo que el acceso SFTP. Desafortunadamente, a partir de principios de 2023, los usuarios locales son la única forma de administración de identidades que actualmente es compatible con el punto de conexión SFTP", + "guid": "ad53cc7c-e1d7-4aaa-a357-1449ab8053d8", + "id": "A15.06", + "link": "https://learn.microsoft.com/azure/storage/blobs/secure-file-transfer-protocol-support#sftp-permission-model", + "service": "Azure Storage", + "severity": "Alto", + "subcategory": "Gestión de identidades y accesos", + "text": "SFTP: Limite la cantidad de \"usuarios locales\" para el acceso SFTP y audite si el acceso es necesario a lo largo del tiempo.", + "waf": "Seguridad" + }, + { + "category": "Seguridad", + "guid": "9f89dc7b-33be-42a1-a27f-7b9e91be1f38", + "id": "A15.07", + "link": "https://learn.microsoft.com/azure/storage/blobs/secure-file-transfer-protocol-known-issues#authentication-and-authorization", + "service": "Azure Storage", + "severity": "Medio", + "subcategory": "Gestión de identidades y accesos", + "text": "SFTP: El punto de conexión SFTP no admite ACL similares a POSIX.", + "waf": "Seguridad" + }, + { + "category": "Seguridad", + "description": "El almacenamiento es compatible con CORS (Cross-Origin Resource Sharing), es decir, una función HTTP que permite a las aplicaciones web de un dominio diferente aflojar la política del mismo origen. Al habilitar CORS, mantenga CorsRules con el mínimo privilegio.", + "guid": "cef39812-bd46-43cb-aac8-ac199ebb91a3", + "id": "A16.01", + "link": "https://learn.microsoft.com/rest/api/storageservices/cross-origin-resource-sharing--cors--support-for-the-azure-storage-services", + "service": "Azure Storage", + "severity": "Alto", + "subcategory": "Gestión de redes", + "text": "Evite las políticas de CORS demasiado amplias", + "waf": "Seguridad" + }, + { + "category": "Seguridad", + "description": "Los datos en reposo siempre se cifran en el lado del servidor y, además, también pueden estar cifrados en el lado del cliente. El cifrado del lado del servidor puede producirse mediante una clave administrada por la plataforma (valor predeterminado) o una clave administrada por el cliente. El cifrado del lado cliente puede producirse haciendo que el cliente proporcione una clave de cifrado y descifrado por blob al almacenamiento de Azure o controlando completamente el cifrado en el lado cliente. por lo tanto, no depende en absoluto de Azure Storage para obtener garantías de confidencialidad.", + "guid": "3d90cae2-cc88-4137-86f7-c0cbafe61464", + "id": "A17.01", + "link": "https://learn.microsoft.com/azure/storage/common/storage-service-encryption", + "service": "Azure Storage", + "severity": "Alto", + "subcategory": "Confidencialidad y encriptación", + "text": "Determine cómo se deben cifrar los datos en reposo. Comprender el modelo de subprocesos para los datos.", + "waf": "Seguridad" + }, + { + "category": "Seguridad", + "guid": "8dd457e9-2713-48b8-8110-2cac6eae01e6", + "id": "A17.02", + "link": "https://learn.microsoft.com/azure/storage/common/customer-managed-keys-overview?toc=%2Fazure%2Fstorage%2Fblobs%2Ftoc.json&bc=%2Fazure%2Fstorage%2Fblobs%2Fbreadcrumb%2Ftoc.json", + "service": "Azure Storage", + "severity": "Medio", + "subcategory": "Confidencialidad y encriptación", + "text": "Determine cuál o si se debe utilizar el cifrado de la plataforma.", + "waf": "Seguridad" + }, + { + "category": "Seguridad", + "guid": "e842e52f-4721-4d92-ac1b-1cd521e54a29", + "id": "A17.03", + "link": "https://learn.microsoft.com/azure/storage/blobs/encryption-customer-provided-keys", + "service": "Azure Storage", + "severity": "Medio", + "subcategory": "Confidencialidad y encriptación", + "text": "Determine qué cifrado del lado del cliente se debe usar, si se debe usar.", + "waf": "Seguridad" + }, + { + "category": "Seguridad", + "description": "Aproveche el Explorador de Resource Graph (resources | where type == 'microsoft.storage/storageaccounts' | where properties['allowBlobPublicAccess'] == true) para buscar cuentas de almacenamiento que permitan el acceso anónimo a blobs.", + "graph": "resources | where type == 'microsoft.storage/storageaccounts' | extend compliant = (properties.allowBlobPublicAccess == 'false') | distinct id, compliant", + "guid": "659ae558-b937-4d49-a5e1-112dbd7ba012", + "id": "A18.01", + "link": "https://learn.microsoft.com/azure/storage/blobs/anonymous-read-access-configure?tabs=portal#allow-or-disallow-public-read-access-for-a-storage-account", + "service": "Azure Storage", + "severity": "Alto", + "subcategory": "Gestión de identidades y accesos", + "text": "Considere si es necesario el acceso anónimo de blob público o si se puede deshabilitar para determinadas cuentas de almacenamiento. ", + "waf": "Seguridad" + }, + { + "category": "Gestión de Operaciones", + "guid": "cb8eb8c0-aa62-4a25-a495-6eaa8dc4a243", + "id": "B01.01", + "link": "https://learn.microsoft.com/azure/storage/common/storage-account-upgrade?tabs=azure-portal", + "service": "Azure Storage", + "severity": "Alto", + "subcategory": "Versión de la plataforma", + "text": "Aproveche un tipo de cuenta storagev2 para mejorar el rendimiento y la confiabilidad", + "waf": "Fiabilidad" + }, + { + "category": "BC y RD", + "guid": "e05bbe20-9d49-4fda-9777-8424d116785c", + "id": "C01.01", + "link": "https://learn.microsoft.com/azure/storage/common/storage-redundancy", + "service": "Azure Storage", + "severity": "Alto", + "subcategory": "Disponibilidad", + "text": "Aproveche el almacenamiento GRS, ZRS o GZRS para obtener la máxima disponibilidad", + "waf": "Fiabilidad" + }, + { + "category": "BC y RD", + "guid": "2fa56c56-ad48-4408-be72-734c486ba280", + "id": "C01.02", + "link": "https://learn.microsoft.com/azure/storage/common/storage-disaster-recovery-guidance", + "service": "Azure Storage", + "severity": "Medio", + "subcategory": "Conmutación por error", + "text": "Para la operación de escritura después de la conmutación por error, use la conmutación por error administrada por el cliente ", + "waf": "Fiabilidad" + }, + { + "category": "Gestión de Operaciones", + "guid": "dc0590cf-65de-48e1-909c-cbd579266bcc", + "id": "C01.03", + "link": "https://learn.microsoft.com/azure/storage/common/storage-disaster-recovery-guidance#microsoft-managed-failover", + "service": "Azure Storage", + "severity": "Medio", + "subcategory": "Conmutación por error", + "text": "Descripción de los detalles de la conmutación por error administrada por Microsoft", + "waf": "Fiabilidad" + }, + { + "category": "Gestión de Operaciones", + "guid": "a274faa1-abfe-49d5-9d04-c3c4919cb1b3", + "id": "C01.04", + "link": "https://learn.microsoft.com/azure/storage/blobs/soft-delete-blob-enable?tabs=azure-portal", + "service": "Azure Storage", + "severity": "Medio", + "subcategory": "Protección de datos", + "text": "Habilitar eliminación temporal", + "waf": "Fiabilidad" + } + ], + "metadata": { + "name": "Azure Storage Review Checklist", + "state": "Preview", + "timestamp": "August 12, 2024", + "waf": "all" + }, + "severities": [ + { + "name": "Alto" + }, + { + "name": "Medio" + }, + { + "name": "Bajo" + } + ], + "status": [ + { + "description": "Este control aún no se ha examinado", + "name": "No verificado" + }, + { + "description": "Hay un elemento de acción asociado a esta comprobación", + "name": "Abrir" + }, + { + "description": "Esta comprobación se ha verificado y no hay más elementos de acción asociados a ella", + "name": "Cumplido" + }, + { + "description": "Recomendación entendida, pero no necesaria por los requisitos actuales", + "name": "No es necesario" + }, + { + "description": "No aplicable para el diseño actual", + "name": "N/A" + } + ], + "waf": [ + { + "name": "Fiabilidad" + }, + { + "name": "Seguridad" + }, + { + "name": "Costar" + }, + { + "name": "Operaciones" + }, + { + "name": "Rendimiento" + } + ], + "yesno": [ + { + "name": "Sí" + }, + { + "name": "No" + } + ] +} \ No newline at end of file diff --git a/checklists/azure_storage_checklist.ja.json b/checklists/azure_storage_checklist.ja.json new file mode 100644 index 000000000..ec33393dd --- /dev/null +++ b/checklists/azure_storage_checklist.ja.json @@ -0,0 +1,566 @@ +{ + "categories": [ + { + "name": "ID およびアクセス管理" + }, + { + "name": "ネットワーク トポロジと接続性" + }, + { + "name": "BC と DR" + }, + { + "name": "ガバナンスとセキュリティ" + }, + { + "name": "コストガバナンス" + }, + { + "name": "オペレーションマネジメント" + }, + { + "name": "アプリケーションのデプロイメント" + }, + { + "name": "安全" + } + ], + "items": [ + { + "category": "安全", + "description": "ストレージに関連する Microsoft クラウド セキュリティ ベンチマークのガイダンスを適用する", + "guid": "d237de14-3b16-4c21-b7aa-9b64604489a8", + "id": "A01.01", + "link": "https://learn.microsoft.com/security/benchmark/azure/baselines/storage-security-baseline", + "service": "Azure Storage", + "severity": "中程度", + "subcategory": "概要", + "text": "「ストレージの Azure セキュリティ ベースライン」を検討する", + "waf": "安全" + }, + { + "category": "安全", + "description": "Azure Storage は、既定ではパブリック IP アドレスを持ち、インターネットからアクセスできます。プライベート エンドポイントを使用すると、アクセスが必要な Azure コンピューティング リソースのみに Azure Storage を安全に公開できるため、パブリック インターネットへの露出がなくなります", + "guid": "f42d78e7-9d17-4a73-a22a-5a67e7a8ed4b", + "id": "A02.01", + "link": "https://learn.microsoft.com/azure/storage/common/storage-private-endpoints", + "service": "Azure Storage", + "severity": "高い", + "subcategory": "ネットワーキング", + "text": "Azure Storage のプライベート エンドポイントの使用を検討する", + "waf": "安全" + }, + { + "category": "安全", + "description": "新しく作成されたストレージ アカウントは ARM デプロイ モデルを使用して作成されるため、RBAC、監査などがすべて有効になります。サブスクリプションにクラシック デプロイ モデルの古いストレージ アカウントがないことを確認します", + "guid": "30e37c3e-2971-41b2-963c-eee079b598de", + "id": "A03.01", + "link": "https://learn.microsoft.com/azure/virtual-machines/migration-classic-resource-manager-overview#migration-of-storage-accounts", + "service": "Azure Storage", + "severity": "中程度", + "subcategory": "統治", + "text": "古いストレージ アカウントが \"クラシック デプロイ モデル\" を使用していないことを確認する", + "waf": "安全" + }, + { + "category": "安全", + "description": "Microsoft Defender を活用して、不審なアクティビティや構成ミスについて学習します。", + "guid": "fc5972cd-4cd2-41b0-a803-7f5e6b4bfd3d", + "id": "A03.02", + "link": "https://learn.microsoft.com/azure/storage/common/azure-defender-storage-configure", + "service": "Azure Storage", + "severity": "高い", + "subcategory": "統治", + "text": "すべてのストレージ アカウントで Microsoft Defender を有効にする", + "waf": "安全" + }, + { + "category": "安全", + "description": "論理的な削除メカニズムにより、誤って削除されたブロブを回復できます。", + "guid": "503547c1-447e-4c66-828a-7100f1ce16dd", + "id": "A04.01", + "link": "https://learn.microsoft.com/azure/storage/blobs/soft-delete-blob-overview", + "service": "Azure Storage", + "severity": "中程度", + "subcategory": "データの可用性", + "text": "BLOB の '論理的な削除' を有効にする", + "waf": "安全" + }, + { + "category": "安全", + "description": "たとえば、機密性、プライバシー、コンプライアンス上の理由など、削除された情報をすぐに削除するようにアプリケーションで確認する必要がある場合など、特定の BLOB コンテナに対して「論理的な削除」を選択的に無効にすることを検討してください。", + "guid": "3f1d5e87-2e52-4e36-81cc-58b4a4b1510e", + "id": "A05.01", + "link": "https://learn.microsoft.com/azure/storage/blobs/soft-delete-blob-enable", + "service": "Azure Storage", + "severity": "中程度", + "subcategory": "機密性", + "text": "BLOB の '論理的な削除' を無効にする", + "waf": "安全" + }, + { + "category": "安全", + "description": "コンテナの論理的な削除を使用すると、コンテナが削除された後に、たとえば、誤って削除した操作から回復するなどして、コンテナを回復できます。", + "guid": "43a58a9c-2289-4c3d-9b57-d0c655462f2a", + "id": "A06.01", + "link": "https://learn.microsoft.com/azure/storage/blobs/soft-delete-container-overview", + "service": "Azure Storage", + "severity": "高い", + "subcategory": "データの可用性", + "text": "コンテナの「論理的な削除」を有効にする", + "waf": "安全" + }, + { + "category": "安全", + "description": "たとえば、機密性、プライバシー、コンプライアンス上の理由など、削除された情報をすぐに削除するようにアプリケーションで確認する必要がある場合など、特定の BLOB コンテナに対して「論理的な削除」を選択的に無効にすることを検討してください。", + "guid": "3e3453a3-c863-4964-ab65-2d6c15f51296", + "id": "A07.01", + "link": "https://learn.microsoft.com/azure/storage/blobs/soft-delete-container-enable", + "service": "Azure Storage", + "severity": "中程度", + "subcategory": "機密性", + "text": "コンテナの「論理的な削除」を無効にする", + "waf": "安全" + }, + { + "category": "安全", + "description": "削除する前に、ユーザーに削除ロックを最初に解除するように強制することで、ストレージ アカウントが誤って削除されるのを防ぎます", + "guid": "5398e6de-d227-4dd1-92b0-6c21d7999a64", + "id": "A08.01", + "link": "https://learn.microsoft.com/azure/storage/common/lock-account-resource", + "service": "Azure Storage", + "severity": "高い", + "subcategory": "データの可用性", + "text": "ストレージ アカウントでのリソース ロックの有効化", + "waf": "安全" + }, + { + "category": "安全", + "description": "BLOB の \"訴訟ホールド\" または \"時間ベースの保持\" ポリシーを検討して、BLOB、コンテナー、またはストレージ アカウントを削除できないようにします。「不可能」は実際には「不可能」を意味することに注意してください。ストレージ アカウントに不変 BLOB が含まれている場合、そのストレージ アカウントを \"削除\" する唯一の方法は、Azure サブスクリプションをキャンセルすることです。", + "guid": "6f4389a8-f42c-478e-98c0-6a73a22a4956", + "id": "A09.01", + "link": "https://learn.microsoft.com/azure/storage/blobs/immutable-storage-overview", + "service": "Azure Storage", + "severity": "高い", + "subcategory": "データの可用性、コンプライアンス", + "text": "不変ブロブについて考える", + "waf": "安全" + }, + { + "category": "安全", + "description": "ストレージ アカウントへの保護されていない HTTP/80 アクセスを無効にして、すべてのデータ転送が暗号化され、整合性が保護され、サーバーが認証されるようにすることを検討してください。", + "guid": "e7a8dc4a-20e2-47c3-b297-11b1352beee0", + "id": "A10.01", + "link": "https://learn.microsoft.com/azure/storage/common/storage-require-secure-transfer", + "service": "Azure Storage", + "severity": "高い", + "subcategory": "ネットワーキング", + "text": "HTTPS を要求する (つまり、ストレージ アカウントのポート 80 を無効にする)", + "waf": "安全" + }, + { + "category": "安全", + "description": "ストレージ アカウントでカスタム ドメイン (ホスト名) を構成する場合は、TLS/HTTPS が必要かどうかを確認します。その場合は、ストレージ アカウントの前に Azure CDN を配置する必要がある場合があります。", + "guid": "79b588de-fc49-472c-b3cd-21bf77036e5e", + "id": "A10.02", + "link": "https://learn.microsoft.com/azure/storage/blobs/storage-custom-domain-name", + "service": "Azure Storage", + "severity": "高い", + "subcategory": "ネットワーキング", + "text": "HTTPS を適用する (HTTP を無効にする) 場合は、ストレージ アカウントにカスタム ドメイン (CNAME) を使用していないことを確認します。", + "waf": "安全" + }, + { + "category": "安全", + "description": "クライアントが SAS トークンを使用して BLOB データにアクセスするときに HTTPS を要求すると、資格情報の損失リスクを最小限に抑えるのに役立ちます。", + "guid": "6b4bed3d-5035-447c-8347-dc56028a71ff", + "id": "A10.03", + "link": "https://learn.microsoft.com/azure/storage/common/storage-sas-overview", + "service": "Azure Storage", + "severity": "中程度", + "subcategory": "ネットワーキング", + "text": "Shared Access Signature (SAS) トークンを HTTPS 接続のみに制限する", + "waf": "安全" + }, + { + "category": "安全", + "description": ".最新の TLS バージョンを適用すると、古いバージョンを使用しているクライアントからの要求が拒否されます。", + "graph": "resources | where type == 'microsoft.storage/storageaccounts' | extend compliant = (isnull(properties.minimumTlsVersion) == false and properties.minimumTlsVersion in ('TLS1_2', 'TLS1_3')) | distinct id, compliant", + "guid": "e12be569-a18f-4562-8d5d-ce151b9e7d55", + "id": "A10.4", + "link": "https://learn.microsoft.com/azure/storage/common/transport-layer-security-configure-minimum-version", + "service": "Azure Storage", + "severity": "高い", + "subcategory": "ネットワーキング", + "text": "ストレージ アカウントに最新の TLS バージョンを適用する", + "waf": "安全" + }, + { + "category": "安全", + "description": "Microsoft Entra ID トークンは、可能な限り、共有アクセス署名よりも優先する必要があります", + "guid": "e1ce15dd-3f0d-45e7-92d4-1e3611cc57b4", + "id": "A11.01", + "link": "https://learn.microsoft.com/azure/storage/common/authorize-data-access", + "service": "Azure Storage", + "severity": "高い", + "subcategory": "ID およびアクセス管理", + "text": "BLOB アクセスに Microsoft Entra ID トークンを使用する", + "waf": "安全" + }, + { + "category": "安全", + "description": "ユーザー、グループ、またはアプリケーションにロールを割り当てる場合は、タスクの実行に必要なアクセス許可のみをそのセキュリティ プリンシパルに付与します。リソースへのアクセスを制限することで、意図しないデータの誤用と悪意のある誤用の両方を防ぐことができます。", + "guid": "a4b1410d-4395-48a8-a228-9b3d6b57cfc6", + "id": "A11.02", + "service": "Azure Storage", + "severity": "中程度", + "subcategory": "ID およびアクセス管理", + "text": "IaM アクセス許可の最小特権", + "waf": "安全" + }, + { + "category": "安全", + "description": "ユーザー委任 SAS は、Azure Active Directory (Azure AD) 資格情報と、SAS に指定されたアクセス許可によって保護されます。ユーザー委任 SAS は、そのスコープと機能の点でサービス SAS に似ていますが、サービス SAS よりもセキュリティ上の利点があります。", + "guid": "55461e1a-3e34-453a-9c86-39648b652d6c", + "id": "A11.03", + "link": "https://learn.microsoft.com/azure/storage/common/storage-sas-overview?toc=%2Fazure%2Fstorage%2Fblobs%2Ftoc.json#best-practices-when-using-sas", + "service": "Azure Storage", + "severity": "高い", + "subcategory": "ID およびアクセス管理", + "text": "SAS を使用する場合は、ストレージ アカウント キー ベースの SAS よりも \"ユーザー委任 SAS\" を優先します。", + "waf": "安全" + }, + { + "category": "安全", + "description": "ストレージ アカウント キー (\"共有キー\") には、監査機能がほとんどありません。誰が/いつキーのコピーをフェッチしたかを監視することはできますが、キーが複数の人の手に渡ると、特定のユーザーに使用状況を帰属させることはできなくなります。Entra ID認証のみに依存すると、ストレージアクセスをユーザーに結び付けることが容易になります。", + "graph": "resources | where type == 'microsoft.storage/storageaccounts' | extend allowSharedKeyAccess = tostring(properties.allowSharedKeyAccess) | extend compliant = (isnotempty(allowSharedKeyAccess) and allowSharedKeyAccess == 'false') | distinct id, compliant", + "guid": "15f51296-5398-4e6d-bd22-7dd142b06c21", + "id": "A11.04", + "link": "https://learn.microsoft.com/rest/api/storageservices/authorize-with-shared-key", + "service": "Azure Storage", + "severity": "高い", + "subcategory": "ID およびアクセス管理", + "text": "Microsoft Entra ID アクセス (およびユーザー委任 SAS) のみがサポートされるように、ストレージ アカウント キーを無効にすることを検討してください。", + "waf": "安全" + }, + { + "category": "安全", + "description": "アクティビティ ログ データを使用して、ストレージ アカウントのセキュリティが (ストレージ アカウント キー、アクセス ポリシーなど) 表示または変更されているのは「いつ」、「誰が」、「何を」、「どのように」特定します。", + "guid": "d7999a64-6f43-489a-af42-c78e78c06a73", + "id": "A12.01", + "link": "https://learn.microsoft.com/azure/storage/blobs/blob-storage-monitoring-scenarios#audit-account-activity", + "service": "Azure Storage", + "severity": "高い", + "subcategory": "モニタリング", + "text": "Azure Monitor を使用して、ストレージ アカウントでのコントロール プレーン操作を監査することを検討してください", + "waf": "安全" + }, + { + "category": "安全", + "description": "キーの有効期限ポリシーを使用すると、アカウント アクセス キーのローテーションのリマインダーを設定できます。リマインダーは、指定した間隔が経過し、キーがまだローテーションされていない場合に表示されます。", + "guid": "a22a4956-e7a8-4dc4-a20e-27c3e29711b1", + "id": "A13.01", + "link": "https://learn.microsoft.com/azure/storage/common/storage-account-keys-manage?tabs=azure-portal#create-a-key-expiration-policy", + "service": "Azure Storage", + "severity": "中程度", + "subcategory": "ID およびアクセス管理", + "text": "ストレージ アカウント キーを使用する場合は、\"キーの有効期限ポリシー\" を有効にすることを検討してください", + "waf": "安全" + }, + { + "category": "安全", + "description": "SAS 有効期限ポリシーは、SAS が有効である推奨間隔を指定します。SAS 有効期限ポリシーは、サービス SAS またはアカウント SAS に適用されます。ユーザーが、推奨間隔よりも長い有効期間でサービス SAS またはアカウント SAS を生成すると、警告が表示されます。", + "guid": "352beee0-79b5-488d-bfc4-972cd3cd21bf", + "id": "A13.02", + "link": "https://learn.microsoft.com/azure/storage/common/sas-expiration-policy", + "service": "Azure Storage", + "severity": "中程度", + "subcategory": "ID およびアクセス管理", + "text": "SAS 有効期限ポリシーの構成を検討する", + "waf": "安全" + }, + { + "category": "安全", + "description": "保存されているアクセス ポリシーでは、ストレージ アカウント キーを再生成しなくても、サービス SAS のアクセス許可を取り消すことができます。", + "guid": "77036e5e-6b4b-4ed3-b503-547c1347dc56", + "id": "A13.03", + "link": "https://learn.microsoft.com/rest/api/storageservices/define-stored-access-policy", + "service": "Azure Storage", + "severity": "中程度", + "subcategory": "ID およびアクセス管理", + "text": "SASを保存されたアクセスポリシーにリンクすることを検討する", + "waf": "安全" + }, + { + "category": "安全", + "guid": "028a71ff-e1ce-415d-b3f0-d5e772d41e36", + "id": "A14.01", + "link": "https://microsoft.github.io/code-with-engineering-playbook/continuous-integration/dev-sec-ops/secret-management/recipes/detect-secrets-ado/", + "service": "Azure Storage", + "severity": "中程度", + "subcategory": "CI/CD", + "text": "チェックインされた接続文字列とストレージ アカウント キーを検出するように、アプリケーションのソース コード リポジトリを構成することを検討してください。", + "waf": "安全" + }, + { + "category": "安全", + "description": "理想的には、アプリケーションでマネージド ID を使用して Azure Storage に対する認証を行う必要があります。それが不可能な場合は、ストレージ資格情報 (接続文字列、ストレージ アカウント キー、SAS、サービス プリンシパル資格情報) を Azure KeyVault または同等のサービスに持つことを検討してください。", + "guid": "11cc57b4-a4b1-4410-b439-58a8c2289b3d", + "id": "A15.01", + "link": "https://learn.microsoft.com/azure/architecture/framework/security/design-storage-keys", + "service": "Azure Storage", + "severity": "高い", + "subcategory": "ID およびアクセス管理", + "text": "Azure KeyVault に接続文字列を格納することを検討してください (マネージド ID が不可能なシナリオの場合)", + "waf": "安全" + }, + { + "category": "安全", + "description": "アドホック SAS サービス SAS またはアカウント SAS で短期的な有効期限を使用します。このように、SASが侵害された場合でも、SASは短時間しか有効ではありません。この方法は、保存されたアクセス ポリシーを参照できない場合に特に重要です。有効期限が近いと、BLOB にアップロードできる時間を制限することで、BLOB に書き込むことができるデータの量も制限されます。", + "guid": "27138b82-1102-4cac-9eae-01e6e842e52f", + "id": "A15.02", + "link": "https://learn.microsoft.com/rest/api/storageservices/delegate-access-with-shared-access-signature", + "service": "Azure Storage", + "severity": "高い", + "subcategory": "ID およびアクセス管理", + "text": "アドホックSASの有効期間を短くするよう努める", + "waf": "安全" + }, + { + "category": "安全", + "description": "SASを作成するときは、できるだけ具体的で制限的にしてください。1 つのリソースと操作には、より広範なアクセスを提供する SAS よりも SAS を優先します。", + "guid": "4721d928-c1b1-4cd5-81e5-4a29a9de399c", + "id": "A15.03", + "link": "https://learn.microsoft.com/rest/api/storageservices/delegate-access-with-shared-access-signature", + "service": "Azure Storage", + "severity": "中程度", + "subcategory": "ID およびアクセス管理", + "text": "SAS に狭いスコープを適用する", + "waf": "安全" + }, + { + "category": "安全", + "description": "SAS には、SAS を使用してリソースを要求する権限を与えられたクライアントの IP アドレスまたはアドレス範囲のパラメーターを含めることができます。", + "guid": "fd7b28dc-9355-4562-82bf-e4564b0d834a", + "id": "A15.04", + "link": "https://learn.microsoft.com/rest/api/storageservices/create-account-sas", + "service": "Azure Storage", + "severity": "中程度", + "subcategory": "ID およびアクセス管理", + "text": "可能な限り、SAS のスコープを特定のクライアント IP アドレスに設定することを検討してください", + "waf": "安全" + }, + { + "category": "安全", + "description": "SAS は、クライアントがアップロードするデータの量を制限することはできません。時間の経過に伴うストレージ量の価格設定モデルを考えると、クライアントが悪意を持って大きなコンテンツをアップロードしたかどうかを検証することは理にかなっているかもしれません。", + "guid": "348b263e-6dd6-4051-8a36-498f6dbad38e", + "id": "A15.05", + "service": "Azure Storage", + "severity": "低い", + "subcategory": "ID およびアクセス管理", + "text": "クライアントが SAS を使用してファイルをアップロードした後、アップロードされたデータを確認することを検討してください。", + "waf": "安全" + }, + { + "category": "安全", + "description": "「ローカル ユーザー アカウント」を使用して SFTP 経由で BLOB ストレージにアクセスする場合、「通常の」RBAC コントロールは適用されません。NFS または REST 経由の BLOB アクセスは、SFTP アクセスよりも制限が厳しい場合があります。残念ながら、2023 年初頭の時点で、SFTP エンドポイントで現在サポートされている ID 管理の形式は、ローカル ユーザーのみです", + "guid": "ad53cc7c-e1d7-4aaa-a357-1449ab8053d8", + "id": "A15.06", + "link": "https://learn.microsoft.com/azure/storage/blobs/secure-file-transfer-protocol-support#sftp-permission-model", + "service": "Azure Storage", + "severity": "高い", + "subcategory": "ID およびアクセス管理", + "text": "SFTP: SFTP アクセスの「ローカル ユーザー」の数を制限し、アクセスが必要かどうかを経時的に監査します。", + "waf": "安全" + }, + { + "category": "安全", + "guid": "9f89dc7b-33be-42a1-a27f-7b9e91be1f38", + "id": "A15.07", + "link": "https://learn.microsoft.com/azure/storage/blobs/secure-file-transfer-protocol-known-issues#authentication-and-authorization", + "service": "Azure Storage", + "severity": "中程度", + "subcategory": "ID およびアクセス管理", + "text": "SFTP: SFTP エンドポイントは POSIX のような ACL をサポートしていません。", + "waf": "安全" + }, + { + "category": "安全", + "description": "ストレージは、CORS(Cross-Origin Resource Sharing)、つまり、異なるドメインのWebアプリが同一生成元ポリシーを緩和できるようにするHTTP機能をサポートしています。CORS を有効にするときは、CorsRules を最小限の特権に保ちます。", + "guid": "cef39812-bd46-43cb-aac8-ac199ebb91a3", + "id": "A16.01", + "link": "https://learn.microsoft.com/rest/api/storageservices/cross-origin-resource-sharing--cors--support-for-the-azure-storage-services", + "service": "Azure Storage", + "severity": "高い", + "subcategory": "ネットワーキング", + "text": "過度に広範なCORSポリシーを避ける", + "waf": "安全" + }, + { + "category": "安全", + "description": "保存データは常にサーバー側で暗号化され、さらにクライアント側でも暗号化される場合があります。サーバー側の暗号化は、プラットフォーム管理キー (デフォルト) またはカスタマー管理キーを使用して行われる場合があります。クライアント側の暗号化は、クライアントが BLOB ごとに暗号化/暗号化解除キーを Azure ストレージに提供するか、クライアント側で暗号化を完全に処理することによって行われます。したがって、機密性の保証については Azure Storage にまったく依存しません。", + "guid": "3d90cae2-cc88-4137-86f7-c0cbafe61464", + "id": "A17.01", + "link": "https://learn.microsoft.com/azure/storage/common/storage-service-encryption", + "service": "Azure Storage", + "severity": "高い", + "subcategory": "機密性と暗号化", + "text": "保存データの暗号化方法を決定します。データのスレッドモデルを理解する。", + "waf": "安全" + }, + { + "category": "安全", + "guid": "8dd457e9-2713-48b8-8110-2cac6eae01e6", + "id": "A17.02", + "link": "https://learn.microsoft.com/azure/storage/common/customer-managed-keys-overview?toc=%2Fazure%2Fstorage%2Fblobs%2Ftoc.json&bc=%2Fazure%2Fstorage%2Fblobs%2Fbreadcrumb%2Ftoc.json", + "service": "Azure Storage", + "severity": "中程度", + "subcategory": "機密性と暗号化", + "text": "プラットフォームの暗号化を使用するかどうかを決定します。", + "waf": "安全" + }, + { + "category": "安全", + "guid": "e842e52f-4721-4d92-ac1b-1cd521e54a29", + "id": "A17.03", + "link": "https://learn.microsoft.com/azure/storage/blobs/encryption-customer-provided-keys", + "service": "Azure Storage", + "severity": "中程度", + "subcategory": "機密性と暗号化", + "text": "クライアント側の暗号化を使用するかどうかを決定します。", + "waf": "安全" + }, + { + "category": "安全", + "description": "Resource Graph エクスプローラー (resources | where type == 'microsoft.storage/storageaccounts' | where properties['allowBlobPublicAccess'] == true) を利用して、匿名 BLOB アクセスを許可するストレージ アカウントを見つけます。", + "graph": "resources | where type == 'microsoft.storage/storageaccounts' | extend compliant = (properties.allowBlobPublicAccess == 'false') | distinct id, compliant", + "guid": "659ae558-b937-4d49-a5e1-112dbd7ba012", + "id": "A18.01", + "link": "https://learn.microsoft.com/azure/storage/blobs/anonymous-read-access-configure?tabs=portal#allow-or-disallow-public-read-access-for-a-storage-account", + "service": "Azure Storage", + "severity": "高い", + "subcategory": "ID およびアクセス管理", + "text": "パブリック BLOB の匿名アクセスが必要かどうか、または特定のストレージ アカウントに対して無効にできるかどうかを検討します。", + "waf": "安全" + }, + { + "category": "オペレーションマネジメント", + "guid": "cb8eb8c0-aa62-4a25-a495-6eaa8dc4a243", + "id": "B01.01", + "link": "https://learn.microsoft.com/azure/storage/common/storage-account-upgrade?tabs=azure-portal", + "service": "Azure Storage", + "severity": "高い", + "subcategory": "プラットフォームバージョン", + "text": "storagev2 アカウントタイプを活用して、パフォーマンスと信頼性を向上させます", + "waf": "確実" + }, + { + "category": "BC と DR", + "guid": "e05bbe20-9d49-4fda-9777-8424d116785c", + "id": "C01.01", + "link": "https://learn.microsoft.com/azure/storage/common/storage-redundancy", + "service": "Azure Storage", + "severity": "高い", + "subcategory": "可用性", + "text": "GRS、ZRS、またはGZRSストレージを活用して、最高の可用性を実現", + "waf": "確実" + }, + { + "category": "BC と DR", + "guid": "2fa56c56-ad48-4408-be72-734c486ba280", + "id": "C01.02", + "link": "https://learn.microsoft.com/azure/storage/common/storage-disaster-recovery-guidance", + "service": "Azure Storage", + "severity": "中程度", + "subcategory": "フェイルオーバー", + "text": "フェールオーバー後の書き込み操作には、顧客管理のフェールオーバーを使用します", + "waf": "確実" + }, + { + "category": "オペレーションマネジメント", + "guid": "dc0590cf-65de-48e1-909c-cbd579266bcc", + "id": "C01.03", + "link": "https://learn.microsoft.com/azure/storage/common/storage-disaster-recovery-guidance#microsoft-managed-failover", + "service": "Azure Storage", + "severity": "中程度", + "subcategory": "フェイルオーバー", + "text": "Microsoft マネージド フェールオーバーの詳細を理解する", + "waf": "確実" + }, + { + "category": "オペレーションマネジメント", + "guid": "a274faa1-abfe-49d5-9d04-c3c4919cb1b3", + "id": "C01.04", + "link": "https://learn.microsoft.com/azure/storage/blobs/soft-delete-blob-enable?tabs=azure-portal", + "service": "Azure Storage", + "severity": "中程度", + "subcategory": "データ保護", + "text": "ソフト削除を有効にする", + "waf": "確実" + } + ], + "metadata": { + "name": "Azure Storage Review Checklist", + "state": "Preview", + "timestamp": "August 12, 2024", + "waf": "all" + }, + "severities": [ + { + "name": "高い" + }, + { + "name": "中程度" + }, + { + "name": "低い" + } + ], + "status": [ + { + "description": "このチェックはまだ見ていません", + "name": "未確認" + }, + { + "description": "このチェックにはアクションアイテムが関連付けられています", + "name": "開ける" + }, + { + "description": "このチェックは検証済みであり、これ以上のアクション アイテムは関連付けられていません", + "name": "達成" + }, + { + "description": "推奨事項は理解されているが、現在の要件では必要ではない", + "name": "必須ではありません" + }, + { + "description": "現在のデザインには適用されません", + "name": "該当なし" + } + ], + "waf": [ + { + "name": "確実" + }, + { + "name": "安全" + }, + { + "name": "費用" + }, + { + "name": "オペレーションズ" + }, + { + "name": "パフォーマンス" + } + ], + "yesno": [ + { + "name": "はい" + }, + { + "name": "いいえ" + } + ] +} \ No newline at end of file diff --git a/checklists/azure_storage_checklist.ko.json b/checklists/azure_storage_checklist.ko.json new file mode 100644 index 000000000..dabfa75af --- /dev/null +++ b/checklists/azure_storage_checklist.ko.json @@ -0,0 +1,566 @@ +{ + "categories": [ + { + "name": "ID 및 액세스 관리" + }, + { + "name": "네트워크 토폴로지 및 연결성" + }, + { + "name": "BC 및 DR" + }, + { + "name": "거버넌스 및 보안" + }, + { + "name": "비용 관리" + }, + { + "name": "운영 관리" + }, + { + "name": "응용 프로그램 배포" + }, + { + "name": "안전" + } + ], + "items": [ + { + "category": "안전", + "description": "스토리지와 관련된 Microsoft 클라우드 보안 벤치마크의 지침 적용", + "guid": "d237de14-3b16-4c21-b7aa-9b64604489a8", + "id": "A01.01", + "link": "https://learn.microsoft.com/security/benchmark/azure/baselines/storage-security-baseline", + "service": "Azure Storage", + "severity": "보통", + "subcategory": " 개요", + "text": "'스토리지에 대한 Azure 보안 기준'을 고려합니다.", + "waf": "안전" + }, + { + "category": "안전", + "description": "Azure Storage는 기본적으로 공용 IP 주소를 가지며 인터넷에 연결할 수 있습니다. 프라이빗 엔드포인트를 사용하면 액세스가 필요한 Azure Compute 리소스에만 Azure Storage를 안전하게 노출할 수 있으므로 공용 인터넷에 노출되지 않습니다", + "guid": "f42d78e7-9d17-4a73-a22a-5a67e7a8ed4b", + "id": "A02.01", + "link": "https://learn.microsoft.com/azure/storage/common/storage-private-endpoints", + "service": "Azure Storage", + "severity": "높다", + "subcategory": "네트워킹", + "text": "Azure Storage에 프라이빗 엔드포인트를 사용하는 것이 좋습니다.", + "waf": "안전" + }, + { + "category": "안전", + "description": "새로 만든 스토리지 계정은 ARM 배포 모델을 사용하여 생성되므로 RBAC, 감사 등이 모두 활성화됩니다. 구독에 클래식 배포 모델을 사용하는 이전 저장소 계정이 없는지 확인합니다.", + "guid": "30e37c3e-2971-41b2-963c-eee079b598de", + "id": "A03.01", + "link": "https://learn.microsoft.com/azure/virtual-machines/migration-classic-resource-manager-overview#migration-of-storage-accounts", + "service": "Azure Storage", + "severity": "보통", + "subcategory": "지배구조", + "text": "이전 스토리지 계정이 '클래식 배포 모델'을 사용하지 않는지 확인", + "waf": "안전" + }, + { + "category": "안전", + "description": "Microsoft Defender를 활용하여 의심스러운 활동 및 잘못된 구성에 대해 알아보세요.", + "guid": "fc5972cd-4cd2-41b0-a803-7f5e6b4bfd3d", + "id": "A03.02", + "link": "https://learn.microsoft.com/azure/storage/common/azure-defender-storage-configure", + "service": "Azure Storage", + "severity": "높다", + "subcategory": "지배구조", + "text": "모든 스토리지 계정에 대해 Microsoft Defender 사용", + "waf": "안전" + }, + { + "category": "안전", + "description": "일시 삭제 메커니즘을 사용하면 실수로 삭제된 Blob을 복구할 수 있습니다.", + "guid": "503547c1-447e-4c66-828a-7100f1ce16dd", + "id": "A04.01", + "link": "https://learn.microsoft.com/azure/storage/blobs/soft-delete-blob-overview", + "service": "Azure Storage", + "severity": "보통", + "subcategory": "데이터 가용성", + "text": "Blob에 대해 '일시 삭제' 사용Enable 'soft delete' for blobs", + "waf": "안전" + }, + { + "category": "안전", + "description": "예를 들어 애플리케이션이 기밀성, 개인 정보 보호 또는 규정 준수를 위해 삭제된 정보가 즉시 삭제되도록 해야 하는 경우와 같이 특정 Blob 컨테이너에 대해 '일시 삭제'를 선택적으로 사용하지 않도록 설정하는 것이 좋습니다. ", + "guid": "3f1d5e87-2e52-4e36-81cc-58b4a4b1510e", + "id": "A05.01", + "link": "https://learn.microsoft.com/azure/storage/blobs/soft-delete-blob-enable", + "service": "Azure Storage", + "severity": "보통", + "subcategory": "기밀성", + "text": "Blob에 대해 '일시 삭제' 사용 안 함", + "waf": "안전" + }, + { + "category": "안전", + "description": "컨테이너에 대한 일시 삭제를 사용하면 컨테이너가 삭제된 후 복구할 수 있습니다(예: 실수로 삭제한 작업에서 복구).", + "guid": "43a58a9c-2289-4c3d-9b57-d0c655462f2a", + "id": "A06.01", + "link": "https://learn.microsoft.com/azure/storage/blobs/soft-delete-container-overview", + "service": "Azure Storage", + "severity": "높다", + "subcategory": "데이터 가용성", + "text": "컨테이너에 대해 '일시 삭제' 사용Enable 'soft delete' for containers", + "waf": "안전" + }, + { + "category": "안전", + "description": "예를 들어 애플리케이션이 기밀성, 개인 정보 보호 또는 규정 준수를 위해 삭제된 정보가 즉시 삭제되도록 해야 하는 경우와 같이 특정 Blob 컨테이너에 대해 '일시 삭제'를 선택적으로 사용하지 않도록 설정하는 것이 좋습니다. ", + "guid": "3e3453a3-c863-4964-ab65-2d6c15f51296", + "id": "A07.01", + "link": "https://learn.microsoft.com/azure/storage/blobs/soft-delete-container-enable", + "service": "Azure Storage", + "severity": "보통", + "subcategory": "기밀성", + "text": "컨테이너에 대해 '일시 삭제' 사용 안 함", + "waf": "안전" + }, + { + "category": "안전", + "description": "사용자가 삭제하기 전에 먼저 삭제 잠금을 제거하도록 강제하여 스토리지 계정의 우발적인 삭제를 방지합니다.", + "guid": "5398e6de-d227-4dd1-92b0-6c21d7999a64", + "id": "A08.01", + "link": "https://learn.microsoft.com/azure/storage/common/lock-account-resource", + "service": "Azure Storage", + "severity": "높다", + "subcategory": "데이터 가용성", + "text": "스토리지 계정에 대한 리소스 잠금 사용Enable resource locks on storage accounts", + "waf": "안전" + }, + { + "category": "안전", + "description": "Blob에 대한 '법적 보존' 또는 '시간 기반 보존' 정책을 고려하면 Blob, 컨테이너 또는 스토리지 계정을 삭제할 수 없습니다. '불가능한'은 실제로 '불가능한'을 의미합니다. 스토리지 계정에 변경할 수 없는 Blob이 포함되면 해당 스토리지 계정을 '제거'하는 유일한 방법은 Azure 구독을 취소하는 것입니다.", + "guid": "6f4389a8-f42c-478e-98c0-6a73a22a4956", + "id": "A09.01", + "link": "https://learn.microsoft.com/azure/storage/blobs/immutable-storage-overview", + "service": "Azure Storage", + "severity": "높다", + "subcategory": "데이터 가용성, 규정 준수", + "text": "변경할 수 없는 Blob 고려", + "waf": "안전" + }, + { + "category": "안전", + "description": "스토리지 계정에 대한 보호되지 않는 HTTP/80 액세스를 사용하지 않도록 설정하여 모든 데이터 전송이 암호화되고 무결성이 보호되며 서버가 인증되도록 하는 것이 좋습니다. ", + "guid": "e7a8dc4a-20e2-47c3-b297-11b1352beee0", + "id": "A10.01", + "link": "https://learn.microsoft.com/azure/storage/common/storage-require-secure-transfer", + "service": "Azure Storage", + "severity": "높다", + "subcategory": "네트워킹", + "text": "HTTPS 필요, 즉 스토리지 계정에서 포트 80 사용 안 함Require HTTPS, i.e. disable port 80 on the storage account", + "waf": "안전" + }, + { + "category": "안전", + "description": "스토리지 계정에서 사용자 지정 도메인(호스트 이름)을 구성할 때 TLS/HTTPS가 필요한지 확인합니다. 이 경우 스토리지 계정 앞에 Azure CDN을 배치해야 할 수 있습니다.", + "guid": "79b588de-fc49-472c-b3cd-21bf77036e5e", + "id": "A10.02", + "link": "https://learn.microsoft.com/azure/storage/blobs/storage-custom-domain-name", + "service": "Azure Storage", + "severity": "높다", + "subcategory": "네트워킹", + "text": "HTTPS를 적용(HTTP 사용 안 함)할 때 스토리지 계정에 사용자 지정 도메인(CNAME)을 사용하지 않는지 확인합니다.", + "waf": "안전" + }, + { + "category": "안전", + "description": "클라이언트가 SAS 토큰을 사용하여 Blob 데이터에 액세스할 때 HTTPS를 요구하면 자격 증명 손실 위험을 최소화하는 데 도움이 됩니다.", + "guid": "6b4bed3d-5035-447c-8347-dc56028a71ff", + "id": "A10.03", + "link": "https://learn.microsoft.com/azure/storage/common/storage-sas-overview", + "service": "Azure Storage", + "severity": "보통", + "subcategory": "네트워킹", + "text": "SAS(공유 액세스 서명) 토큰을 HTTPS 연결로만 제한", + "waf": "안전" + }, + { + "category": "안전", + "description": ". 최신 TLS 버전을 적용하면 이전 버전을 사용하는 클라이언트의 요청이 거부됩니다. ", + "graph": "resources | where type == 'microsoft.storage/storageaccounts' | extend compliant = (isnull(properties.minimumTlsVersion) == false and properties.minimumTlsVersion in ('TLS1_2', 'TLS1_3')) | distinct id, compliant", + "guid": "e12be569-a18f-4562-8d5d-ce151b9e7d55", + "id": "A10.4", + "link": "https://learn.microsoft.com/azure/storage/common/transport-layer-security-configure-minimum-version", + "service": "Azure Storage", + "severity": "높다", + "subcategory": "네트워킹", + "text": "스토리지 계정에 대한 최신 TLS 버전 적용Enforce the latest TLS version for a storage account", + "waf": "안전" + }, + { + "category": "안전", + "description": "가능한 경우 Microsoft Entra ID 토큰을 공유 액세스 서명보다 선호해야 합니다", + "guid": "e1ce15dd-3f0d-45e7-92d4-1e3611cc57b4", + "id": "A11.01", + "link": "https://learn.microsoft.com/azure/storage/common/authorize-data-access", + "service": "Azure Storage", + "severity": "높다", + "subcategory": "ID 및 액세스 관리", + "text": "Blob 액세스에 Microsoft Entra ID 토큰 사용Use Microsoft Entra ID tokens for blob access", + "waf": "안전" + }, + { + "category": "안전", + "description": "사용자, 그룹 또는 응용 프로그램에 역할을 할당할 때 해당 보안 주체가 작업을 수행하는 데 필요한 권한만 부여합니다. 리소스에 대한 액세스를 제한하면 의도하지 않은 데이터 오용과 악의적인 데이터 오용을 모두 방지할 수 있습니다.", + "guid": "a4b1410d-4395-48a8-a228-9b3d6b57cfc6", + "id": "A11.02", + "service": "Azure Storage", + "severity": "보통", + "subcategory": "ID 및 액세스 관리", + "text": "IaM 권한의 최소 권한", + "waf": "안전" + }, + { + "category": "안전", + "description": "사용자 위임 SAS는 Azure AD(Azure Active Directory) 자격 증명과 SAS에 대해 지정된 권한으로 보호됩니다. 사용자 위임 SAS는 범위와 기능 측면에서 서비스 SAS와 유사하지만 서비스 SAS에 비해 보안상의 이점을 제공합니다. ", + "guid": "55461e1a-3e34-453a-9c86-39648b652d6c", + "id": "A11.03", + "link": "https://learn.microsoft.com/azure/storage/common/storage-sas-overview?toc=%2Fazure%2Fstorage%2Fblobs%2Ftoc.json#best-practices-when-using-sas", + "service": "Azure Storage", + "severity": "높다", + "subcategory": "ID 및 액세스 관리", + "text": "SAS를 사용하는 경우 스토리지 계정 키 기반 SAS보다 '사용자 위임 SAS'를 선호합니다.", + "waf": "안전" + }, + { + "category": "안전", + "description": "스토리지 계정 키('공유 키')에는 감사 기능이 거의 없습니다. 누가/언제 키 복사본을 가져왔는지 모니터링할 수 있지만 키가 여러 사람의 손에 들어가면 특정 사용자의 사용을 귀속시킬 수 없습니다. Entra ID 인증에만 의존하면 스토리지 액세스를 사용자에게 더 쉽게 연결할 수 있습니다. ", + "graph": "resources | where type == 'microsoft.storage/storageaccounts' | extend allowSharedKeyAccess = tostring(properties.allowSharedKeyAccess) | extend compliant = (isnotempty(allowSharedKeyAccess) and allowSharedKeyAccess == 'false') | distinct id, compliant", + "guid": "15f51296-5398-4e6d-bd22-7dd142b06c21", + "id": "A11.04", + "link": "https://learn.microsoft.com/rest/api/storageservices/authorize-with-shared-key", + "service": "Azure Storage", + "severity": "높다", + "subcategory": "ID 및 액세스 관리", + "text": "Microsoft Entra ID 액세스(및 사용자 위임 SAS)만 지원되도록 스토리지 계정 키를 사용하지 않도록 설정하는 것이 좋습니다.", + "waf": "안전" + }, + { + "category": "안전", + "description": "활동 로그 데이터를 사용하여 스토리지 계정의 보안을 '언제', '누가', '무엇을' 및 '어떻게' 확인하거나 변경합니다(예: 스토리지 계정 키, 액세스 정책 등).", + "guid": "d7999a64-6f43-489a-af42-c78e78c06a73", + "id": "A12.01", + "link": "https://learn.microsoft.com/azure/storage/blobs/blob-storage-monitoring-scenarios#audit-account-activity", + "service": "Azure Storage", + "severity": "높다", + "subcategory": "모니터링", + "text": "Azure Monitor를 사용하여 스토리지 계정에 대한 컨트롤 플레인 작업을 감사하는 것이 좋습니다", + "waf": "안전" + }, + { + "category": "안전", + "description": "키 만료 정책을 사용하면 계정 액세스 키의 교체에 대한 미리 알림을 설정할 수 있습니다. 지정된 간격이 경과하고 키가 아직 회전되지 않은 경우 알림이 표시됩니다.", + "guid": "a22a4956-e7a8-4dc4-a20e-27c3e29711b1", + "id": "A13.01", + "link": "https://learn.microsoft.com/azure/storage/common/storage-account-keys-manage?tabs=azure-portal#create-a-key-expiration-policy", + "service": "Azure Storage", + "severity": "보통", + "subcategory": "ID 및 액세스 관리", + "text": "스토리지 계정 키를 사용하는 경우 '키 만료 정책'을 사용하도록 설정하는 것이 좋습니다.", + "waf": "안전" + }, + { + "category": "안전", + "description": "SAS 만료 정책은 SAS가 유효한 권장 간격을 지정합니다. SAS 만료 정책은 서비스 SAS 또는 계정 SAS에 적용됩니다. 사용자가 권장 간격보다 큰 유효성 간격으로 서비스 SAS 또는 계정 SAS를 생성하면 경고가 표시됩니다.", + "guid": "352beee0-79b5-488d-bfc4-972cd3cd21bf", + "id": "A13.02", + "link": "https://learn.microsoft.com/azure/storage/common/sas-expiration-policy", + "service": "Azure Storage", + "severity": "보통", + "subcategory": "ID 및 액세스 관리", + "text": "SAS 만료 정책을 구성하는 것이 좋습니다.", + "waf": "안전" + }, + { + "category": "안전", + "description": "저장된 액세스 정책은 스토리지 계정 키를 다시 생성할 필요 없이 서비스 SAS에 대한 사용 권한을 취소할 수 있는 옵션을 제공합니다. ", + "guid": "77036e5e-6b4b-4ed3-b503-547c1347dc56", + "id": "A13.03", + "link": "https://learn.microsoft.com/rest/api/storageservices/define-stored-access-policy", + "service": "Azure Storage", + "severity": "보통", + "subcategory": "ID 및 액세스 관리", + "text": "SAS를 저장된 액세스 정책에 연결하는 것이 좋습니다.", + "waf": "안전" + }, + { + "category": "안전", + "guid": "028a71ff-e1ce-415d-b3f0-d5e772d41e36", + "id": "A14.01", + "link": "https://microsoft.github.io/code-with-engineering-playbook/continuous-integration/dev-sec-ops/secret-management/recipes/detect-secrets-ado/", + "service": "Azure Storage", + "severity": "보통", + "subcategory": "CI/CD (영문)", + "text": "체크 인된 연결 문자열 및 저장소 계정 키를 검색하도록 응용 프로그램의 소스 코드 리포지토리를 구성하는 것이 좋습니다.", + "waf": "안전" + }, + { + "category": "안전", + "description": "이상적으로 애플리케이션은 관리 ID를 사용하여 Azure Storage에 인증해야 합니다. 가능하지 않은 경우 Azure KeyVault 또는 동등한 서비스에 스토리지 자격 증명(연결 문자열, 스토리지 계정 키, SAS, 서비스 주체 자격 증명)을 사용하는 것이 좋습니다.", + "guid": "11cc57b4-a4b1-4410-b439-58a8c2289b3d", + "id": "A15.01", + "link": "https://learn.microsoft.com/azure/architecture/framework/security/design-storage-keys", + "service": "Azure Storage", + "severity": "높다", + "subcategory": "ID 및 액세스 관리", + "text": "Azure KeyVault에 연결 문자열을 저장하는 것이 좋습니다(관리 ID를 사용할 수 없는 시나리오에서).", + "waf": "안전" + }, + { + "category": "안전", + "description": "임시 SAS 서비스 SAS 또는 계정 SAS에서 가까운 만료 시간을 사용합니다. 이러한 방식으로 SAS가 손상되더라도 짧은 시간 동안만 유효합니다. 이 방법은 저장된 액세스 정책을 참조할 수 없는 경우에 특히 중요합니다. 또한 단기 만료 시간은 Blob에 업로드할 수 있는 시간을 제한하여 Blob에 쓸 수 있는 데이터의 양을 제한합니다.", + "guid": "27138b82-1102-4cac-9eae-01e6e842e52f", + "id": "A15.02", + "link": "https://learn.microsoft.com/rest/api/storageservices/delegate-access-with-shared-access-signature", + "service": "Azure Storage", + "severity": "높다", + "subcategory": "ID 및 액세스 관리", + "text": "임시 SAS의 유효 기간을 단축하기 위해 노력", + "waf": "안전" + }, + { + "category": "안전", + "description": "SAS를 만들 때는 가능한 한 구체적이고 제한적이어야 합니다. 훨씬 더 광범위한 액세스를 제공하는 SAS보다 단일 리소스 및 작업에 대해 SAS를 선호합니다.", + "guid": "4721d928-c1b1-4cd5-81e5-4a29a9de399c", + "id": "A15.03", + "link": "https://learn.microsoft.com/rest/api/storageservices/delegate-access-with-shared-access-signature", + "service": "Azure Storage", + "severity": "보통", + "subcategory": "ID 및 액세스 관리", + "text": "SAS에 좁은 범위 적용", + "waf": "안전" + }, + { + "category": "안전", + "description": "SAS에는 SAS를 사용하여 리소스를 요청할 수 있는 권한이 있는 클라이언트 IP 주소 또는 주소 범위에 대한 매개 변수가 포함될 수 있습니다. ", + "guid": "fd7b28dc-9355-4562-82bf-e4564b0d834a", + "id": "A15.04", + "link": "https://learn.microsoft.com/rest/api/storageservices/create-account-sas", + "service": "Azure Storage", + "severity": "보통", + "subcategory": "ID 및 액세스 관리", + "text": "가능한 경우 SAS 범위를 특정 클라이언트 IP 주소로 지정하는 것이 좋습니다", + "waf": "안전" + }, + { + "category": "안전", + "description": "SAS는 클라이언트가 업로드하는 데이터의 양을 제한할 수 없습니다. 시간 경과에 따른 스토리지 양의 가격 책정 모델을 감안할 때 클라이언트가 악의적으로 큰 콘텐츠를 업로드했는지 여부를 확인하는 것이 합리적일 수 있습니다.", + "guid": "348b263e-6dd6-4051-8a36-498f6dbad38e", + "id": "A15.05", + "service": "Azure Storage", + "severity": "낮다", + "subcategory": "ID 및 액세스 관리", + "text": "클라이언트가 SAS를 사용하여 파일을 업로드한 후 업로드된 데이터를 확인하는 것이 좋습니다. ", + "waf": "안전" + }, + { + "category": "안전", + "description": "'로컬 사용자 계정'을 사용하여 SFTP를 통해 Blob Storage에 액세스하는 경우 '일반적인' RBAC 컨트롤이 적용되지 않습니다. NFS 또는 REST를 통한 Blob 액세스는 SFTP 액세스보다 더 제한적일 수 있습니다. 안타깝게도 2023년 초부터 로컬 사용자는 현재 SFTP 엔드포인트에 대해 지원되는 유일한 ID 관리 형태입니다", + "guid": "ad53cc7c-e1d7-4aaa-a357-1449ab8053d8", + "id": "A15.06", + "link": "https://learn.microsoft.com/azure/storage/blobs/secure-file-transfer-protocol-support#sftp-permission-model", + "service": "Azure Storage", + "severity": "높다", + "subcategory": "ID 및 액세스 관리", + "text": "SFTP: SFTP 액세스를 위한 '로컬 사용자'의 수를 제한하고 시간이 지남에 따라 액세스가 필요한지 여부를 감사합니다.", + "waf": "안전" + }, + { + "category": "안전", + "guid": "9f89dc7b-33be-42a1-a27f-7b9e91be1f38", + "id": "A15.07", + "link": "https://learn.microsoft.com/azure/storage/blobs/secure-file-transfer-protocol-known-issues#authentication-and-authorization", + "service": "Azure Storage", + "severity": "보통", + "subcategory": "ID 및 액세스 관리", + "text": "SFTP: SFTP 엔드포인트는 POSIX와 유사한 ACL을 지원하지 않습니다.", + "waf": "안전" + }, + { + "category": "안전", + "description": "스토리지는 CORS(Cross-Origin Resource Sharing), 즉 다른 도메인의 웹 앱이 동일 출처 정책을 완화할 수 있도록 하는 HTTP 기능을 지원합니다. CORS를 사용하도록 설정하는 경우 CorsRules를 최소 권한으로 유지합니다.", + "guid": "cef39812-bd46-43cb-aac8-ac199ebb91a3", + "id": "A16.01", + "link": "https://learn.microsoft.com/rest/api/storageservices/cross-origin-resource-sharing--cors--support-for-the-azure-storage-services", + "service": "Azure Storage", + "severity": "높다", + "subcategory": "네트워킹", + "text": "지나치게 광범위한 CORS 정책 방지", + "waf": "안전" + }, + { + "category": "안전", + "description": "미사용 데이터는 항상 서버 쪽에서 암호화되며 클라이언트 쪽에서도 암호화될 수 있습니다. 서버 쪽 암호화는 플랫폼 관리형 키(기본값) 또는 고객 관리형 키를 사용하여 발생할 수 있습니다. 클라이언트 쪽 암호화는 클라이언트가 Azure Storage에 Blob별로 암호화/암호 해독 키를 제공하도록 하거나 클라이언트 쪽에서 암호화를 완전히 처리하여 발생할 수 있습니다. 따라서 기밀 보장을 위해 Azure Storage에 전혀 의존하지 않습니다.", + "guid": "3d90cae2-cc88-4137-86f7-c0cbafe61464", + "id": "A17.01", + "link": "https://learn.microsoft.com/azure/storage/common/storage-service-encryption", + "service": "Azure Storage", + "severity": "높다", + "subcategory": "기밀성 및 암호화", + "text": "미사용 데이터를 암호화하는 방법을 결정합니다. 데이터에 대한 스레드 모델을 이해합니다.", + "waf": "안전" + }, + { + "category": "안전", + "guid": "8dd457e9-2713-48b8-8110-2cac6eae01e6", + "id": "A17.02", + "link": "https://learn.microsoft.com/azure/storage/common/customer-managed-keys-overview?toc=%2Fazure%2Fstorage%2Fblobs%2Ftoc.json&bc=%2Fazure%2Fstorage%2Fblobs%2Fbreadcrumb%2Ftoc.json", + "service": "Azure Storage", + "severity": "보통", + "subcategory": "기밀성 및 암호화", + "text": "어떤 플랫폼 암호화를 사용해야 하는지 확인합니다.", + "waf": "안전" + }, + { + "category": "안전", + "guid": "e842e52f-4721-4d92-ac1b-1cd521e54a29", + "id": "A17.03", + "link": "https://learn.microsoft.com/azure/storage/blobs/encryption-customer-provided-keys", + "service": "Azure Storage", + "severity": "보통", + "subcategory": "기밀성 및 암호화", + "text": "클라이언트 쪽 암호화를 사용해야 하는지 여부를 결정합니다.", + "waf": "안전" + }, + { + "category": "안전", + "description": "리소스 그래프 탐색기(리소스 | where type == 'microsoft.storage/storageaccounts' | where properties['allowBlobPublicAccess'] == true)를 활용하여 익명 Blob 액세스를 허용하는 스토리지 계정을 찾습니다.", + "graph": "resources | where type == 'microsoft.storage/storageaccounts' | extend compliant = (properties.allowBlobPublicAccess == 'false') | distinct id, compliant", + "guid": "659ae558-b937-4d49-a5e1-112dbd7ba012", + "id": "A18.01", + "link": "https://learn.microsoft.com/azure/storage/blobs/anonymous-read-access-configure?tabs=portal#allow-or-disallow-public-read-access-for-a-storage-account", + "service": "Azure Storage", + "severity": "높다", + "subcategory": "ID 및 액세스 관리", + "text": "공용 Blob 익명 액세스가 필요한지 또는 특정 스토리지 계정에 대해 사용하지 않도록 설정할 수 있는지 여부를 고려합니다. ", + "waf": "안전" + }, + { + "category": "운영 관리", + "guid": "cb8eb8c0-aa62-4a25-a495-6eaa8dc4a243", + "id": "B01.01", + "link": "https://learn.microsoft.com/azure/storage/common/storage-account-upgrade?tabs=azure-portal", + "service": "Azure Storage", + "severity": "높다", + "subcategory": "플랫폼 버전", + "text": "성능 및 안정성 향상을 위해 storagev2 계정 유형 활용", + "waf": "신뢰도" + }, + { + "category": "BC 및 DR", + "guid": "e05bbe20-9d49-4fda-9777-8424d116785c", + "id": "C01.01", + "link": "https://learn.microsoft.com/azure/storage/common/storage-redundancy", + "service": "Azure Storage", + "severity": "높다", + "subcategory": "가용성", + "text": "최고의 가용성을 위해 GRS, ZRS 또는 GZRS 스토리지 활용", + "waf": "신뢰도" + }, + { + "category": "BC 및 DR", + "guid": "2fa56c56-ad48-4408-be72-734c486ba280", + "id": "C01.02", + "link": "https://learn.microsoft.com/azure/storage/common/storage-disaster-recovery-guidance", + "service": "Azure Storage", + "severity": "보통", + "subcategory": "페일오버", + "text": "장애 조치(failover) 후 쓰기 작업의 경우 고객 관리 장애 조치(failover)를 사용합니다. ", + "waf": "신뢰도" + }, + { + "category": "운영 관리", + "guid": "dc0590cf-65de-48e1-909c-cbd579266bcc", + "id": "C01.03", + "link": "https://learn.microsoft.com/azure/storage/common/storage-disaster-recovery-guidance#microsoft-managed-failover", + "service": "Azure Storage", + "severity": "보통", + "subcategory": "페일오버", + "text": "Microsoft 관리 장애 조치(failover) 세부 정보 이해", + "waf": "신뢰도" + }, + { + "category": "운영 관리", + "guid": "a274faa1-abfe-49d5-9d04-c3c4919cb1b3", + "id": "C01.04", + "link": "https://learn.microsoft.com/azure/storage/blobs/soft-delete-blob-enable?tabs=azure-portal", + "service": "Azure Storage", + "severity": "보통", + "subcategory": "데이터 보호", + "text": "일시 삭제 사용", + "waf": "신뢰도" + } + ], + "metadata": { + "name": "Azure Storage Review Checklist", + "state": "Preview", + "timestamp": "August 12, 2024", + "waf": "all" + }, + "severities": [ + { + "name": "높다" + }, + { + "name": "보통" + }, + { + "name": "낮다" + } + ], + "status": [ + { + "description": "이 검사는 아직 검토되지 않았습니다", + "name": "확인되지 않음" + }, + { + "description": "이 검사와 연관된 작업 항목이 있습니다", + "name": "열다" + }, + { + "description": "이 검사는 확인되었으며 이와 관련된 추가 작업 항목이 없습니다", + "name": "성취" + }, + { + "description": "권장 사항을 이해하지만 현재 요구 사항에 필요하지 않음", + "name": "필요 없음" + }, + { + "description": "현재 설계에는 적용되지 않습니다.", + "name": "해당 없음" + } + ], + "waf": [ + { + "name": "신뢰도" + }, + { + "name": "안전" + }, + { + "name": "비용" + }, + { + "name": "작업" + }, + { + "name": "공연" + } + ], + "yesno": [ + { + "name": "예" + }, + { + "name": "아니요" + } + ] +} \ No newline at end of file diff --git a/checklists/azure_storage_checklist.pt.json b/checklists/azure_storage_checklist.pt.json new file mode 100644 index 000000000..0f2972ca6 --- /dev/null +++ b/checklists/azure_storage_checklist.pt.json @@ -0,0 +1,566 @@ +{ + "categories": [ + { + "name": "Gerenciamento de identidade e acesso" + }, + { + "name": "Topologia e conectividade de rede" + }, + { + "name": "BC e DR" + }, + { + "name": "Governança e segurança" + }, + { + "name": "Governança de custos" + }, + { + "name": "Gestão de Operações" + }, + { + "name": "Implantação de aplicativos" + }, + { + "name": "Segurança" + } + ], + "items": [ + { + "category": "Segurança", + "description": "Aplicar as diretrizes do parâmetro de comparação de segurança de nuvem da Microsoft relacionado ao armazenamento", + "guid": "d237de14-3b16-4c21-b7aa-9b64604489a8", + "id": "A01.01", + "link": "https://learn.microsoft.com/security/benchmark/azure/baselines/storage-security-baseline", + "service": "Azure Storage", + "severity": "Média", + "subcategory": " Visão geral", + "text": "Considere a 'linha de base de segurança do Azure para armazenamento'", + "waf": "Segurança" + }, + { + "category": "Segurança", + "description": "Por padrão, o Armazenamento do Azure tem um endereço IP público e pode ser acessado pela Internet. Os pontos de extremidade privados permitem expor com segurança o Armazenamento do Azure apenas aos recursos de Computação do Azure que precisam de acesso, eliminando assim a exposição à Internet pública", + "guid": "f42d78e7-9d17-4a73-a22a-5a67e7a8ed4b", + "id": "A02.01", + "link": "https://learn.microsoft.com/azure/storage/common/storage-private-endpoints", + "service": "Azure Storage", + "severity": "Alto", + "subcategory": "Rede", + "text": "Considere usar pontos de extremidade privados para o Armazenamento do Azure", + "waf": "Segurança" + }, + { + "category": "Segurança", + "description": "As contas de armazenamento recém-criadas são criadas usando o modelo de implantação do ARM, para que o RBAC, a auditoria etc. estejam habilitados. Verifique se não há contas de armazenamento antigas com o modelo de implantação clássico em uma assinatura", + "guid": "30e37c3e-2971-41b2-963c-eee079b598de", + "id": "A03.01", + "link": "https://learn.microsoft.com/azure/virtual-machines/migration-classic-resource-manager-overview#migration-of-storage-accounts", + "service": "Azure Storage", + "severity": "Média", + "subcategory": "Governança", + "text": "Verifique se as contas de armazenamento mais antigas não estão usando o \"modelo de implantação clássico\"", + "waf": "Segurança" + }, + { + "category": "Segurança", + "description": "Aproveite o Microsoft Defender para saber mais sobre atividades suspeitas e configurações incorretas.", + "guid": "fc5972cd-4cd2-41b0-a803-7f5e6b4bfd3d", + "id": "A03.02", + "link": "https://learn.microsoft.com/azure/storage/common/azure-defender-storage-configure", + "service": "Azure Storage", + "severity": "Alto", + "subcategory": "Governança", + "text": "Habilitar o Microsoft Defender para todas as suas contas de armazenamento", + "waf": "Segurança" + }, + { + "category": "Segurança", + "description": "O mecanismo de exclusão reversível permite recuperar blobs excluídos acidentalmente.", + "guid": "503547c1-447e-4c66-828a-7100f1ce16dd", + "id": "A04.01", + "link": "https://learn.microsoft.com/azure/storage/blobs/soft-delete-blob-overview", + "service": "Azure Storage", + "severity": "Média", + "subcategory": "Disponibilidade de dados", + "text": "Habilitar 'exclusão reversível' para blobs", + "waf": "Segurança" + }, + { + "category": "Segurança", + "description": "Considere desabilitar seletivamente a \"exclusão reversível\" para determinados contêineres de blob, por exemplo, se o aplicativo precisar garantir que as informações excluídas sejam excluídas imediatamente, por exemplo, por motivos de confidencialidade, privacidade ou conformidade. ", + "guid": "3f1d5e87-2e52-4e36-81cc-58b4a4b1510e", + "id": "A05.01", + "link": "https://learn.microsoft.com/azure/storage/blobs/soft-delete-blob-enable", + "service": "Azure Storage", + "severity": "Média", + "subcategory": "Confidencialidade", + "text": "Desabilitar a 'exclusão reversível' para blobs", + "waf": "Segurança" + }, + { + "category": "Segurança", + "description": "A exclusão reversível para contêineres permite que você recupere um contêiner depois que ele foi excluído, por exemplo, recuperar de uma operação de exclusão acidental.", + "guid": "43a58a9c-2289-4c3d-9b57-d0c655462f2a", + "id": "A06.01", + "link": "https://learn.microsoft.com/azure/storage/blobs/soft-delete-container-overview", + "service": "Azure Storage", + "severity": "Alto", + "subcategory": "Disponibilidade de dados", + "text": "Habilitar 'exclusão reversível' para contêineres", + "waf": "Segurança" + }, + { + "category": "Segurança", + "description": "Considere desabilitar seletivamente a \"exclusão reversível\" para determinados contêineres de blob, por exemplo, se o aplicativo precisar garantir que as informações excluídas sejam excluídas imediatamente, por exemplo, por motivos de confidencialidade, privacidade ou conformidade. ", + "guid": "3e3453a3-c863-4964-ab65-2d6c15f51296", + "id": "A07.01", + "link": "https://learn.microsoft.com/azure/storage/blobs/soft-delete-container-enable", + "service": "Azure Storage", + "severity": "Média", + "subcategory": "Confidencialidade", + "text": "Desabilitar a 'exclusão reversível' para contêineres", + "waf": "Segurança" + }, + { + "category": "Segurança", + "description": "Impede a exclusão acidental de uma conta de armazenamento, forçando o usuário a remover primeiro o bloqueio de exclusão, antes da exclusão", + "guid": "5398e6de-d227-4dd1-92b0-6c21d7999a64", + "id": "A08.01", + "link": "https://learn.microsoft.com/azure/storage/common/lock-account-resource", + "service": "Azure Storage", + "severity": "Alto", + "subcategory": "Disponibilidade de dados", + "text": "Habilitar bloqueios de recursos em contas de armazenamento", + "waf": "Segurança" + }, + { + "category": "Segurança", + "description": "Considere as políticas de 'retenção legal' ou 'retenção baseada em tempo' para blobs, de modo que seja impossível excluir o blob, o contêiner ou a conta de armazenamento. Observe que 'impossível' na verdade significa 'impossível'; depois que uma conta de armazenamento contém um blob imutável, a única maneira de \"se livrar\" dessa conta de armazenamento é cancelando a assinatura do Azure.", + "guid": "6f4389a8-f42c-478e-98c0-6a73a22a4956", + "id": "A09.01", + "link": "https://learn.microsoft.com/azure/storage/blobs/immutable-storage-overview", + "service": "Azure Storage", + "severity": "Alto", + "subcategory": "Disponibilidade de dados, conformidade", + "text": "Considere blobs imutáveis", + "waf": "Segurança" + }, + { + "category": "Segurança", + "description": "Considere desabilitar o acesso HTTP/80 desprotegido à conta de armazenamento, para que todas as transferências de dados sejam criptografadas, protegidas por integridade e o servidor seja autenticado. ", + "guid": "e7a8dc4a-20e2-47c3-b297-11b1352beee0", + "id": "A10.01", + "link": "https://learn.microsoft.com/azure/storage/common/storage-require-secure-transfer", + "service": "Azure Storage", + "severity": "Alto", + "subcategory": "Rede", + "text": "Exigir HTTPS, ou seja, desabilitar a porta 80 na conta de armazenamento", + "waf": "Segurança" + }, + { + "category": "Segurança", + "description": "Ao configurar um domínio personalizado (nome do host) em uma conta de armazenamento, verifique se você precisa de TLS/HTTPS; nesse caso, talvez seja necessário colocar a CDN do Azure na frente de sua conta de armazenamento.", + "guid": "79b588de-fc49-472c-b3cd-21bf77036e5e", + "id": "A10.02", + "link": "https://learn.microsoft.com/azure/storage/blobs/storage-custom-domain-name", + "service": "Azure Storage", + "severity": "Alto", + "subcategory": "Rede", + "text": "Ao impor HTTPS (desabilitando o HTTP), verifique se você não usa domínios personalizados (CNAME) para a conta de armazenamento.", + "waf": "Segurança" + }, + { + "category": "Segurança", + "description": "Exigir HTTPS quando um cliente usa um token SAS para acessar dados de blob ajuda a minimizar o risco de perda de credenciais.", + "guid": "6b4bed3d-5035-447c-8347-dc56028a71ff", + "id": "A10.03", + "link": "https://learn.microsoft.com/azure/storage/common/storage-sas-overview", + "service": "Azure Storage", + "severity": "Média", + "subcategory": "Rede", + "text": "Limitar tokens de assinatura de acesso compartilhado (SAS) apenas a conexões HTTPS", + "waf": "Segurança" + }, + { + "category": "Segurança", + "description": ". A imposição da versão mais recente do TLS rejeitará a solicitação de clientes que usam a versão mais antiga. ", + "graph": "resources | where type == 'microsoft.storage/storageaccounts' | extend compliant = (isnull(properties.minimumTlsVersion) == false and properties.minimumTlsVersion in ('TLS1_2', 'TLS1_3')) | distinct id, compliant", + "guid": "e12be569-a18f-4562-8d5d-ce151b9e7d55", + "id": "A10.4", + "link": "https://learn.microsoft.com/azure/storage/common/transport-layer-security-configure-minimum-version", + "service": "Azure Storage", + "severity": "Alto", + "subcategory": "Rede", + "text": "Impor a versão mais recente do TLS para uma conta de armazenamento", + "waf": "Segurança" + }, + { + "category": "Segurança", + "description": "Os tokens de ID do Microsoft Entra devem ser favorecidos em relação às assinaturas de acesso compartilhado, sempre que possível", + "guid": "e1ce15dd-3f0d-45e7-92d4-1e3611cc57b4", + "id": "A11.01", + "link": "https://learn.microsoft.com/azure/storage/common/authorize-data-access", + "service": "Azure Storage", + "severity": "Alto", + "subcategory": "Gerenciamento de identidade e acesso", + "text": "Usar tokens de ID do Microsoft Entra para acesso a blobs", + "waf": "Segurança" + }, + { + "category": "Segurança", + "description": "Ao atribuir uma função a um usuário, grupo ou aplicativo, conceda a essa entidade de segurança apenas as permissões necessárias para que ela execute suas tarefas. Limitar o acesso aos recursos ajuda a evitar o uso indevido não intencional e mal-intencionado de seus dados.", + "guid": "a4b1410d-4395-48a8-a228-9b3d6b57cfc6", + "id": "A11.02", + "service": "Azure Storage", + "severity": "Média", + "subcategory": "Gerenciamento de identidade e acesso", + "text": "Privilégios mínimos em permissões de IaM", + "waf": "Segurança" + }, + { + "category": "Segurança", + "description": "Uma SAS de delegação de usuário é protegida com credenciais do Azure Active Directory (Azure AD) e também pelas permissões especificadas para a SAS. Uma SAS de delegação de usuário é análoga a uma SAS de serviço em termos de escopo e função, mas oferece benefícios de segurança em relação à SAS de serviço. ", + "guid": "55461e1a-3e34-453a-9c86-39648b652d6c", + "id": "A11.03", + "link": "https://learn.microsoft.com/azure/storage/common/storage-sas-overview?toc=%2Fazure%2Fstorage%2Fblobs%2Ftoc.json#best-practices-when-using-sas", + "service": "Azure Storage", + "severity": "Alto", + "subcategory": "Gerenciamento de identidade e acesso", + "text": "Ao usar SAS, prefira 'SAS de delegação de usuário' em vez de SAS baseada em chave de conta de armazenamento.", + "waf": "Segurança" + }, + { + "category": "Segurança", + "description": "As chaves da conta de armazenamento (\"chaves compartilhadas\") têm muito poucos recursos de auditoria. Embora possa ser monitorado em quem/quando buscou uma cópia das chaves, uma vez que as chaves estão nas mãos de várias pessoas, é impossível atribuir o uso a um usuário específico. Confiar apenas na autenticação do Entra ID facilita o acesso ao armazenamento a um usuário. ", + "graph": "resources | where type == 'microsoft.storage/storageaccounts' | extend allowSharedKeyAccess = tostring(properties.allowSharedKeyAccess) | extend compliant = (isnotempty(allowSharedKeyAccess) and allowSharedKeyAccess == 'false') | distinct id, compliant", + "guid": "15f51296-5398-4e6d-bd22-7dd142b06c21", + "id": "A11.04", + "link": "https://learn.microsoft.com/rest/api/storageservices/authorize-with-shared-key", + "service": "Azure Storage", + "severity": "Alto", + "subcategory": "Gerenciamento de identidade e acesso", + "text": "Considere desabilitar as chaves da conta de armazenamento, para que haja suporte apenas para o acesso à ID do Microsoft Entra (e à SAS de delegação de usuário).", + "waf": "Segurança" + }, + { + "category": "Segurança", + "description": "Use os dados do Log de Atividades para identificar \"quando\", \"quem\", \"o quê\" e \"como\" a segurança da sua conta de armazenamento está sendo exibida ou alterada (ou seja, chaves da conta de armazenamento, políticas de acesso etc.).", + "guid": "d7999a64-6f43-489a-af42-c78e78c06a73", + "id": "A12.01", + "link": "https://learn.microsoft.com/azure/storage/blobs/blob-storage-monitoring-scenarios#audit-account-activity", + "service": "Azure Storage", + "severity": "Alto", + "subcategory": "Monitorização", + "text": "Considere usar o Azure Monitor para auditar as operações do painel de controle na conta de armazenamento", + "waf": "Segurança" + }, + { + "category": "Segurança", + "description": "Uma política de expiração de chave permite que você defina um lembrete para a rotação das chaves de acesso da conta. O lembrete é exibido se o intervalo especificado tiver decorrido e as teclas ainda não tiverem sido giradas.", + "guid": "a22a4956-e7a8-4dc4-a20e-27c3e29711b1", + "id": "A13.01", + "link": "https://learn.microsoft.com/azure/storage/common/storage-account-keys-manage?tabs=azure-portal#create-a-key-expiration-policy", + "service": "Azure Storage", + "severity": "Média", + "subcategory": "Gerenciamento de identidade e acesso", + "text": "Ao usar chaves de conta de armazenamento, considere habilitar uma 'política de expiração de chave'", + "waf": "Segurança" + }, + { + "category": "Segurança", + "description": "Uma política de expiração de SAS especifica um intervalo recomendado durante o qual a SAS é válida. As políticas de expiração de SAS se aplicam a uma SAS de serviço ou a uma SAS de conta. Quando um usuário gera SAS de serviço ou uma SAS de conta com um intervalo de validade maior que o intervalo recomendado, ele verá um aviso.", + "guid": "352beee0-79b5-488d-bfc4-972cd3cd21bf", + "id": "A13.02", + "link": "https://learn.microsoft.com/azure/storage/common/sas-expiration-policy", + "service": "Azure Storage", + "severity": "Média", + "subcategory": "Gerenciamento de identidade e acesso", + "text": "Considere configurar uma política de expiração de SAS", + "waf": "Segurança" + }, + { + "category": "Segurança", + "description": "As políticas de acesso armazenadas oferecem a opção de revogar permissões para uma SAS de serviço sem precisar regenerar as chaves da conta de armazenamento. ", + "guid": "77036e5e-6b4b-4ed3-b503-547c1347dc56", + "id": "A13.03", + "link": "https://learn.microsoft.com/rest/api/storageservices/define-stored-access-policy", + "service": "Azure Storage", + "severity": "Média", + "subcategory": "Gerenciamento de identidade e acesso", + "text": "Considere vincular SAS a uma política de acesso armazenada", + "waf": "Segurança" + }, + { + "category": "Segurança", + "guid": "028a71ff-e1ce-415d-b3f0-d5e772d41e36", + "id": "A14.01", + "link": "https://microsoft.github.io/code-with-engineering-playbook/continuous-integration/dev-sec-ops/secret-management/recipes/detect-secrets-ado/", + "service": "Azure Storage", + "severity": "Média", + "subcategory": "CI/CD", + "text": "Considere configurar o repositório de código-fonte do aplicativo para detectar cadeias de conexão e chaves de conta de armazenamento com check-in.", + "waf": "Segurança" + }, + { + "category": "Segurança", + "description": "Idealmente, seu aplicativo deve usar uma identidade gerenciada para autenticar no Armazenamento do Azure. Se isso não for possível, considere ter a credencial de armazenamento (cadeia de conexão, chave da conta de armazenamento, SAS, credencial da entidade de serviço) no Azure KeyVault ou em um serviço equivalente.", + "guid": "11cc57b4-a4b1-4410-b439-58a8c2289b3d", + "id": "A15.01", + "link": "https://learn.microsoft.com/azure/architecture/framework/security/design-storage-keys", + "service": "Azure Storage", + "severity": "Alto", + "subcategory": "Gerenciamento de identidade e acesso", + "text": "Considere armazenar cadeias de conexão no Azure KeyVault (em cenários em que as identidades gerenciadas não são possíveis)", + "waf": "Segurança" + }, + { + "category": "Segurança", + "description": "Use tempos de expiração de curto prazo em uma SAS de serviço SAS ad hoc ou SAS de conta. Dessa forma, mesmo que uma SAS seja comprometida, ela é válida apenas por um curto período de tempo. Essa prática é especialmente importante se você não puder fazer referência a uma política de acesso armazenada. Os tempos de expiração de curto prazo também limitam a quantidade de dados que podem ser gravados em um blob, limitando o tempo disponível para carregar nele.", + "guid": "27138b82-1102-4cac-9eae-01e6e842e52f", + "id": "A15.02", + "link": "https://learn.microsoft.com/rest/api/storageservices/delegate-access-with-shared-access-signature", + "service": "Azure Storage", + "severity": "Alto", + "subcategory": "Gerenciamento de identidade e acesso", + "text": "Esforce-se por períodos de validade curtos para SAS ad-hoc", + "waf": "Segurança" + }, + { + "category": "Segurança", + "description": "Ao criar uma SAS, seja o mais específico e restritivo possível. Prefira uma SAS para um único recurso e operação em vez de uma SAS que oferece acesso muito mais amplo.", + "guid": "4721d928-c1b1-4cd5-81e5-4a29a9de399c", + "id": "A15.03", + "link": "https://learn.microsoft.com/rest/api/storageservices/delegate-access-with-shared-access-signature", + "service": "Azure Storage", + "severity": "Média", + "subcategory": "Gerenciamento de identidade e acesso", + "text": "Aplicar um escopo restrito a uma SAS", + "waf": "Segurança" + }, + { + "category": "Segurança", + "description": "Uma SAS pode incluir parâmetros nos quais os endereços IP do cliente ou intervalos de endereços estão autorizados a solicitar um recurso usando a SAS. ", + "guid": "fd7b28dc-9355-4562-82bf-e4564b0d834a", + "id": "A15.04", + "link": "https://learn.microsoft.com/rest/api/storageservices/create-account-sas", + "service": "Azure Storage", + "severity": "Média", + "subcategory": "Gerenciamento de identidade e acesso", + "text": "Considere definir o escopo da SAS para um endereço IP de cliente específico, sempre que possível", + "waf": "Segurança" + }, + { + "category": "Segurança", + "description": "Uma SAS não pode restringir a quantidade de dados que um cliente carrega; Dado o modelo de preços da quantidade de armazenamento ao longo do tempo, pode fazer sentido validar se os clientes carregaram conteúdos maliciosamente grandes.", + "guid": "348b263e-6dd6-4051-8a36-498f6dbad38e", + "id": "A15.05", + "service": "Azure Storage", + "severity": "Baixo", + "subcategory": "Gerenciamento de identidade e acesso", + "text": "Considere verificar os dados carregados depois que os clientes usaram uma SAS para carregar um arquivo. ", + "waf": "Segurança" + }, + { + "category": "Segurança", + "description": "Ao acessar o armazenamento de blobs por meio do SFTP usando uma \"conta de usuário local\", os controles RBAC \"usuais\" não se aplicam. O acesso a blobs via NFS ou REST pode ser mais restritivo do que o acesso SFTP. Infelizmente, a partir do início de 2023, os usuários locais são a única forma de gerenciamento de identidade com suporte atual para o endpoint SFTP", + "guid": "ad53cc7c-e1d7-4aaa-a357-1449ab8053d8", + "id": "A15.06", + "link": "https://learn.microsoft.com/azure/storage/blobs/secure-file-transfer-protocol-support#sftp-permission-model", + "service": "Azure Storage", + "severity": "Alto", + "subcategory": "Gerenciamento de identidade e acesso", + "text": "SFTP: limite a quantidade de \"usuários locais\" para acesso SFTP e audite se o acesso é necessário ao longo do tempo.", + "waf": "Segurança" + }, + { + "category": "Segurança", + "guid": "9f89dc7b-33be-42a1-a27f-7b9e91be1f38", + "id": "A15.07", + "link": "https://learn.microsoft.com/azure/storage/blobs/secure-file-transfer-protocol-known-issues#authentication-and-authorization", + "service": "Azure Storage", + "severity": "Média", + "subcategory": "Gerenciamento de identidade e acesso", + "text": "SFTP: o endpoint SFTP não oferece suporte a ACLs semelhantes a POSIX.", + "waf": "Segurança" + }, + { + "category": "Segurança", + "description": "O armazenamento oferece suporte ao CORS (Cross-Origin Resource Sharing), ou seja, um recurso HTTP que permite que aplicativos Web de um domínio diferente afrouxem a política de mesma origem. Ao habilitar o CORS, mantenha as CorsRules com o menor privilégio.", + "guid": "cef39812-bd46-43cb-aac8-ac199ebb91a3", + "id": "A16.01", + "link": "https://learn.microsoft.com/rest/api/storageservices/cross-origin-resource-sharing--cors--support-for-the-azure-storage-services", + "service": "Azure Storage", + "severity": "Alto", + "subcategory": "Rede", + "text": "Evite políticas de CORS excessivamente amplas", + "waf": "Segurança" + }, + { + "category": "Segurança", + "description": "Os dados em repouso são sempre criptografados no lado do servidor e, além disso, também podem ser criptografados no lado do cliente. A criptografia do lado do servidor pode ocorrer usando uma chave gerenciada pela plataforma (padrão) ou uma chave gerenciada pelo cliente. A criptografia do lado do cliente pode acontecer fazendo com que o cliente forneça uma chave de criptografia/descriptografia por blob para o armazenamento do Azure ou manipulando completamente a criptografia no lado do cliente. portanto, não dependendo do Armazenamento do Azure para garantias de confidencialidade.", + "guid": "3d90cae2-cc88-4137-86f7-c0cbafe61464", + "id": "A17.01", + "link": "https://learn.microsoft.com/azure/storage/common/storage-service-encryption", + "service": "Azure Storage", + "severity": "Alto", + "subcategory": "Confidencialidade e Criptografia", + "text": "Determine como os dados em repouso devem ser criptografados. Entenda o modelo de thread para dados.", + "waf": "Segurança" + }, + { + "category": "Segurança", + "guid": "8dd457e9-2713-48b8-8110-2cac6eae01e6", + "id": "A17.02", + "link": "https://learn.microsoft.com/azure/storage/common/customer-managed-keys-overview?toc=%2Fazure%2Fstorage%2Fblobs%2Ftoc.json&bc=%2Fazure%2Fstorage%2Fblobs%2Fbreadcrumb%2Ftoc.json", + "service": "Azure Storage", + "severity": "Média", + "subcategory": "Confidencialidade e Criptografia", + "text": "Determine qual/se a criptografia de plataforma deve ser usada.", + "waf": "Segurança" + }, + { + "category": "Segurança", + "guid": "e842e52f-4721-4d92-ac1b-1cd521e54a29", + "id": "A17.03", + "link": "https://learn.microsoft.com/azure/storage/blobs/encryption-customer-provided-keys", + "service": "Azure Storage", + "severity": "Média", + "subcategory": "Confidencialidade e Criptografia", + "text": "Determine qual/se a criptografia do lado do cliente deve ser usada.", + "waf": "Segurança" + }, + { + "category": "Segurança", + "description": "Aproveite o Resource Graph Explorer (resources | where type == 'microsoft.storage/storageaccounts' | where properties['allowBlobPublicAccess'] == true) para localizar contas de armazenamento que permitem acesso anônimo a blobs.", + "graph": "resources | where type == 'microsoft.storage/storageaccounts' | extend compliant = (properties.allowBlobPublicAccess == 'false') | distinct id, compliant", + "guid": "659ae558-b937-4d49-a5e1-112dbd7ba012", + "id": "A18.01", + "link": "https://learn.microsoft.com/azure/storage/blobs/anonymous-read-access-configure?tabs=portal#allow-or-disallow-public-read-access-for-a-storage-account", + "service": "Azure Storage", + "severity": "Alto", + "subcategory": "Gerenciamento de identidade e acesso", + "text": "Considere se o acesso anônimo de blob público é necessário ou se ele pode ser desabilitado para determinadas contas de armazenamento. ", + "waf": "Segurança" + }, + { + "category": "Gestão de Operações", + "guid": "cb8eb8c0-aa62-4a25-a495-6eaa8dc4a243", + "id": "B01.01", + "link": "https://learn.microsoft.com/azure/storage/common/storage-account-upgrade?tabs=azure-portal", + "service": "Azure Storage", + "severity": "Alto", + "subcategory": "Versão da plataforma", + "text": "Aproveite um tipo de conta storagev2 para melhor desempenho e confiabilidade", + "waf": "Fiabilidade" + }, + { + "category": "BC e DR", + "guid": "e05bbe20-9d49-4fda-9777-8424d116785c", + "id": "C01.01", + "link": "https://learn.microsoft.com/azure/storage/common/storage-redundancy", + "service": "Azure Storage", + "severity": "Alto", + "subcategory": "Disponibilidade", + "text": "Aproveite o armazenamento GRS, ZRS ou GZRS para obter a mais alta disponibilidade", + "waf": "Fiabilidade" + }, + { + "category": "BC e DR", + "guid": "2fa56c56-ad48-4408-be72-734c486ba280", + "id": "C01.02", + "link": "https://learn.microsoft.com/azure/storage/common/storage-disaster-recovery-guidance", + "service": "Azure Storage", + "severity": "Média", + "subcategory": "Failover", + "text": "Para operação de gravação após o failover, use o failover gerenciado pelo cliente ", + "waf": "Fiabilidade" + }, + { + "category": "Gestão de Operações", + "guid": "dc0590cf-65de-48e1-909c-cbd579266bcc", + "id": "C01.03", + "link": "https://learn.microsoft.com/azure/storage/common/storage-disaster-recovery-guidance#microsoft-managed-failover", + "service": "Azure Storage", + "severity": "Média", + "subcategory": "Failover", + "text": "Entender os detalhes do failover gerenciado pela Microsoft", + "waf": "Fiabilidade" + }, + { + "category": "Gestão de Operações", + "guid": "a274faa1-abfe-49d5-9d04-c3c4919cb1b3", + "id": "C01.04", + "link": "https://learn.microsoft.com/azure/storage/blobs/soft-delete-blob-enable?tabs=azure-portal", + "service": "Azure Storage", + "severity": "Média", + "subcategory": "Proteção de dados", + "text": "Habilitar exclusão reversível", + "waf": "Fiabilidade" + } + ], + "metadata": { + "name": "Azure Storage Review Checklist", + "state": "Preview", + "timestamp": "August 12, 2024", + "waf": "all" + }, + "severities": [ + { + "name": "Alto" + }, + { + "name": "Média" + }, + { + "name": "Baixo" + } + ], + "status": [ + { + "description": "Esta verificação ainda não foi analisada", + "name": "Não verificado" + }, + { + "description": "Há um item de ação associado a essa verificação", + "name": "Abrir" + }, + { + "description": "Essa verificação foi verificada e não há mais itens de ação associados a ela", + "name": "Cumprido" + }, + { + "description": "Recomendação compreendida, mas não necessária pelos requisitos atuais", + "name": "Não é necessário" + }, + { + "description": "Não aplicável para o projeto atual", + "name": "N/A" + } + ], + "waf": [ + { + "name": "Fiabilidade" + }, + { + "name": "Segurança" + }, + { + "name": "Custar" + }, + { + "name": "Operações" + }, + { + "name": "Desempenho" + } + ], + "yesno": [ + { + "name": "Sim" + }, + { + "name": "Não" + } + ] +} \ No newline at end of file diff --git a/checklists/azure_storage_checklist.zh-Hant.json b/checklists/azure_storage_checklist.zh-Hant.json new file mode 100644 index 000000000..dbf496cf5 --- /dev/null +++ b/checklists/azure_storage_checklist.zh-Hant.json @@ -0,0 +1,566 @@ +{ + "categories": [ + { + "name": "身份和訪問管理" + }, + { + "name": "網路拓撲和連接" + }, + { + "name": "BC 和DR" + }, + { + "name": "治理與安全" + }, + { + "name": "成本治理" + }, + { + "name": "運營管理" + }, + { + "name": "應用程式部署" + }, + { + "name": "安全" + } + ], + "items": [ + { + "category": "安全", + "description": "應用與存儲相關的 Microsoft 雲安全基準中的指導", + "guid": "d237de14-3b16-4c21-b7aa-9b64604489a8", + "id": "A01.01", + "link": "https://learn.microsoft.com/security/benchmark/azure/baselines/storage-security-baseline", + "service": "Azure Storage", + "severity": "中等", + "subcategory": "概述", + "text": "請考慮「存儲的 Azure 安全基線”", + "waf": "安全" + }, + { + "category": "安全", + "description": "默認情況下,Azure 儲存具有公共IP位址,並且可通過Internet訪問。專用終結點允許僅向需要訪問的 Azure 計算資源安全地公開 Azure 存儲,從而消除對公共 Internet 的暴露", + "guid": "f42d78e7-9d17-4a73-a22a-5a67e7a8ed4b", + "id": "A02.01", + "link": "https://learn.microsoft.com/azure/storage/common/storage-private-endpoints", + "service": "Azure Storage", + "severity": "高", + "subcategory": "聯網", + "text": "考慮將專用終結點用於 Azure 存儲", + "waf": "安全" + }, + { + "category": "安全", + "description": "新創建的存儲帳戶是使用ARM部署模型創建的,因此 RBAC、審核等都已啟用。確保訂閱中沒有具有經典部署模型的舊存儲帳戶", + "guid": "30e37c3e-2971-41b2-963c-eee079b598de", + "id": "A03.01", + "link": "https://learn.microsoft.com/azure/virtual-machines/migration-classic-resource-manager-overview#migration-of-storage-accounts", + "service": "Azure Storage", + "severity": "中等", + "subcategory": "統轄", + "text": "確保較舊的存儲帳戶未使用“經典部署模型”", + "waf": "安全" + }, + { + "category": "安全", + "description": "利用 Microsoft Defender 瞭解可疑活動和錯誤配置。", + "guid": "fc5972cd-4cd2-41b0-a803-7f5e6b4bfd3d", + "id": "A03.02", + "link": "https://learn.microsoft.com/azure/storage/common/azure-defender-storage-configure", + "service": "Azure Storage", + "severity": "高", + "subcategory": "統轄", + "text": "為所有存儲帳戶啟用 Microsoft Defender", + "waf": "安全" + }, + { + "category": "安全", + "description": "軟刪除機制允許恢復意外刪除的 blob。", + "guid": "503547c1-447e-4c66-828a-7100f1ce16dd", + "id": "A04.01", + "link": "https://learn.microsoft.com/azure/storage/blobs/soft-delete-blob-overview", + "service": "Azure Storage", + "severity": "中等", + "subcategory": "數據可用性", + "text": "為 blob 啟用“軟刪除”", + "waf": "安全" + }, + { + "category": "安全", + "description": "考慮有選擇地禁用某些 blob 容器的「軟刪除」 例如,如果應用程式必須確保立即刪除已刪除的資訊,例如出於機密性、隱私或合規性原因。", + "guid": "3f1d5e87-2e52-4e36-81cc-58b4a4b1510e", + "id": "A05.01", + "link": "https://learn.microsoft.com/azure/storage/blobs/soft-delete-blob-enable", + "service": "Azure Storage", + "severity": "中等", + "subcategory": "保密性", + "text": "禁用 blob 的“軟刪除”", + "waf": "安全" + }, + { + "category": "安全", + "description": "容器的軟刪除使您能夠在刪除容器后恢復容器,例如從意外刪除操作中恢復。", + "guid": "43a58a9c-2289-4c3d-9b57-d0c655462f2a", + "id": "A06.01", + "link": "https://learn.microsoft.com/azure/storage/blobs/soft-delete-container-overview", + "service": "Azure Storage", + "severity": "高", + "subcategory": "數據可用性", + "text": "為容器啟用“軟刪除”", + "waf": "安全" + }, + { + "category": "安全", + "description": "考慮有選擇地禁用某些 blob 容器的「軟刪除」 例如,如果應用程式必須確保立即刪除已刪除的資訊,例如出於機密性、隱私或合規性原因。", + "guid": "3e3453a3-c863-4964-ab65-2d6c15f51296", + "id": "A07.01", + "link": "https://learn.microsoft.com/azure/storage/blobs/soft-delete-container-enable", + "service": "Azure Storage", + "severity": "中等", + "subcategory": "保密性", + "text": "禁用容器的“軟刪除”", + "waf": "安全" + }, + { + "category": "安全", + "description": "通過強制使用者先刪除刪除鎖,然後再刪除存儲帳戶,防止意外刪除存儲帳戶", + "guid": "5398e6de-d227-4dd1-92b0-6c21d7999a64", + "id": "A08.01", + "link": "https://learn.microsoft.com/azure/storage/common/lock-account-resource", + "service": "Azure Storage", + "severity": "高", + "subcategory": "數據可用性", + "text": "在存儲帳戶上啟用資源鎖定", + "waf": "安全" + }, + { + "category": "安全", + "description": "請考慮對 blob 使用“合法保留”或“基于時間的保留”策略,以便無法刪除 blob、容器或存儲帳戶。請注意,「不可能」實際上意味著「不可能」;一旦存儲帳戶包含不可變的 blob,「擺脫」該存儲帳戶的唯一方法是取消 Azure 訂閱。", + "guid": "6f4389a8-f42c-478e-98c0-6a73a22a4956", + "id": "A09.01", + "link": "https://learn.microsoft.com/azure/storage/blobs/immutable-storage-overview", + "service": "Azure Storage", + "severity": "高", + "subcategory": "數據可用性、合規性", + "text": "考慮不可變的 blob", + "waf": "安全" + }, + { + "category": "安全", + "description": "請考慮禁用對存儲帳戶的未受保護的 HTTP/80 訪問,以便對所有數據傳輸進行加密、完整性保護,並且對伺服器進行身份驗證。", + "guid": "e7a8dc4a-20e2-47c3-b297-11b1352beee0", + "id": "A10.01", + "link": "https://learn.microsoft.com/azure/storage/common/storage-require-secure-transfer", + "service": "Azure Storage", + "severity": "高", + "subcategory": "聯網", + "text": "需要 HTTPS,即在儲存帳戶上禁用埠 80", + "waf": "安全" + }, + { + "category": "安全", + "description": "在儲存帳戶上配置自定義域(主機名)時,請檢查是否需要 TLS/HTTPS;如果是這樣,可能需要將 Azure CDN 放在存儲帳戶的前面。", + "guid": "79b588de-fc49-472c-b3cd-21bf77036e5e", + "id": "A10.02", + "link": "https://learn.microsoft.com/azure/storage/blobs/storage-custom-domain-name", + "service": "Azure Storage", + "severity": "高", + "subcategory": "聯網", + "text": "強制執行 HTTPS(禁用 HTTP)時,請檢查是否不要對儲存帳戶使用自定義域 (CNAME)。", + "waf": "安全" + }, + { + "category": "安全", + "description": "當用戶端使用SAS令牌訪問 blob 資料時,要求使用 HTTPS 有助於最大程度地降低憑據丟失的風險。", + "guid": "6b4bed3d-5035-447c-8347-dc56028a71ff", + "id": "A10.03", + "link": "https://learn.microsoft.com/azure/storage/common/storage-sas-overview", + "service": "Azure Storage", + "severity": "中等", + "subcategory": "聯網", + "text": "將共享訪問簽名 (SAS) 令牌限製為僅 HTTPS 連接", + "waf": "安全" + }, + { + "category": "安全", + "description": ".強制執行最新的 TLS 版本將拒絕來自使用舊版本的用戶端的請求。", + "graph": "resources | where type == 'microsoft.storage/storageaccounts' | extend compliant = (isnull(properties.minimumTlsVersion) == false and properties.minimumTlsVersion in ('TLS1_2', 'TLS1_3')) | distinct id, compliant", + "guid": "e12be569-a18f-4562-8d5d-ce151b9e7d55", + "id": "A10.4", + "link": "https://learn.microsoft.com/azure/storage/common/transport-layer-security-configure-minimum-version", + "service": "Azure Storage", + "severity": "高", + "subcategory": "聯網", + "text": "強制實施存儲帳戶的最新 TLS 版本", + "waf": "安全" + }, + { + "category": "安全", + "description": "在可能的情況下,應優先使用 Microsoft Entra ID 令牌,而不是共用訪問簽名", + "guid": "e1ce15dd-3f0d-45e7-92d4-1e3611cc57b4", + "id": "A11.01", + "link": "https://learn.microsoft.com/azure/storage/common/authorize-data-access", + "service": "Azure Storage", + "severity": "高", + "subcategory": "身份和訪問管理", + "text": "使用 Microsoft Entra ID 令牌進行 blob 訪問", + "waf": "安全" + }, + { + "category": "安全", + "description": "為使用者、組或應用程式分配角色時,請僅授予該安全主體執行任務所需的許可權。限制對資源的訪問有助於防止無意和惡意濫用數據。", + "guid": "a4b1410d-4395-48a8-a228-9b3d6b57cfc6", + "id": "A11.02", + "service": "Azure Storage", + "severity": "中等", + "subcategory": "身份和訪問管理", + "text": "IaM 許可權中的最小特權", + "waf": "安全" + }, + { + "category": "安全", + "description": "使用者委派 SAS 使用 Azure Active Directory (Azure AD) 憑據以及為 SAS 指定的許可權進行保護。使用者委派 SAS 在範圍和功能方面類似於服務 SAS,但與服務 SAS 相比,它提供了安全優勢。", + "guid": "55461e1a-3e34-453a-9c86-39648b652d6c", + "id": "A11.03", + "link": "https://learn.microsoft.com/azure/storage/common/storage-sas-overview?toc=%2Fazure%2Fstorage%2Fblobs%2Ftoc.json#best-practices-when-using-sas", + "service": "Azure Storage", + "severity": "高", + "subcategory": "身份和訪問管理", + "text": "使用 SAS 時,首選「使用者委派 SAS」,而不是基於存儲帳戶密鑰的 SAS。", + "waf": "安全" + }, + { + "category": "安全", + "description": "存儲帳戶金鑰(“共用金鑰”)幾乎沒有審核功能。雖然可以監控誰/何時獲取了密鑰的副本,但一旦密鑰掌握在多人手中,就不可能將使用方式歸因於特定使用者。僅依賴 Entra ID 身份驗證可以更輕鬆地將存儲訪問許可權與用戶綁定。", + "graph": "resources | where type == 'microsoft.storage/storageaccounts' | extend allowSharedKeyAccess = tostring(properties.allowSharedKeyAccess) | extend compliant = (isnotempty(allowSharedKeyAccess) and allowSharedKeyAccess == 'false') | distinct id, compliant", + "guid": "15f51296-5398-4e6d-bd22-7dd142b06c21", + "id": "A11.04", + "link": "https://learn.microsoft.com/rest/api/storageservices/authorize-with-shared-key", + "service": "Azure Storage", + "severity": "高", + "subcategory": "身份和訪問管理", + "text": "請考慮禁用存儲帳戶密鑰,以便僅支援 Microsoft Entra ID 訪問(和使用者委派 SAS)。", + "waf": "安全" + }, + { + "category": "安全", + "description": "使用活動日誌數據來確定查看或更改存儲帳戶安全性的“時間”、“人員”、“內容”和“方式”(即存儲帳戶密鑰、訪問策略等)。", + "guid": "d7999a64-6f43-489a-af42-c78e78c06a73", + "id": "A12.01", + "link": "https://learn.microsoft.com/azure/storage/blobs/blob-storage-monitoring-scenarios#audit-account-activity", + "service": "Azure Storage", + "severity": "高", + "subcategory": "監測", + "text": "請考慮使用 Azure Monitor 審核存儲帳戶上的控制平面操作", + "waf": "安全" + }, + { + "category": "安全", + "description": "通過金鑰過期策略,您可以設置帳戶訪問金鑰輪換的提醒。如果已過指定的時間間隔且尚未旋轉鍵,則會顯示提醒。", + "guid": "a22a4956-e7a8-4dc4-a20e-27c3e29711b1", + "id": "A13.01", + "link": "https://learn.microsoft.com/azure/storage/common/storage-account-keys-manage?tabs=azure-portal#create-a-key-expiration-policy", + "service": "Azure Storage", + "severity": "中等", + "subcategory": "身份和訪問管理", + "text": "使用存儲帳戶密鑰時,請考慮啟用“金鑰過期策略”", + "waf": "安全" + }, + { + "category": "安全", + "description": "SAS 過期策略指定了 SAS 的有效時間間隔。SAS 過期策略適用於服務 SAS 或帳戶 SAS。當使用者生成的服務 SAS 或帳戶 SAS 的有效期間隔大於建議的時間間隔時,他們將看到警告。", + "guid": "352beee0-79b5-488d-bfc4-972cd3cd21bf", + "id": "A13.02", + "link": "https://learn.microsoft.com/azure/storage/common/sas-expiration-policy", + "service": "Azure Storage", + "severity": "中等", + "subcategory": "身份和訪問管理", + "text": "考慮配置 SAS 過期策略", + "waf": "安全" + }, + { + "category": "安全", + "description": "通過存儲訪問策略,可以選擇撤銷服務 SAS 的許可權,而無需重新生成存儲帳戶密鑰。", + "guid": "77036e5e-6b4b-4ed3-b503-547c1347dc56", + "id": "A13.03", + "link": "https://learn.microsoft.com/rest/api/storageservices/define-stored-access-policy", + "service": "Azure Storage", + "severity": "中等", + "subcategory": "身份和訪問管理", + "text": "考慮將 SAS 連結到儲存存取策略", + "waf": "安全" + }, + { + "category": "安全", + "guid": "028a71ff-e1ce-415d-b3f0-d5e772d41e36", + "id": "A14.01", + "link": "https://microsoft.github.io/code-with-engineering-playbook/continuous-integration/dev-sec-ops/secret-management/recipes/detect-secrets-ado/", + "service": "Azure Storage", + "severity": "中等", + "subcategory": "CI/CD", + "text": "請考慮配置應用程式的原始程式碼儲存庫,以檢測簽入的連接字串和存儲帳戶密鑰。", + "waf": "安全" + }, + { + "category": "安全", + "description": "理想情況下,應用程式應使用託管標識向 Azure 儲存進行身份驗證。如果無法做到這一點,請考慮在 Azure KeyVault 或等效服務中擁有存儲憑據(連接字串、存儲帳戶密鑰、SAS、服務主體憑據)。", + "guid": "11cc57b4-a4b1-4410-b439-58a8c2289b3d", + "id": "A15.01", + "link": "https://learn.microsoft.com/azure/architecture/framework/security/design-storage-keys", + "service": "Azure Storage", + "severity": "高", + "subcategory": "身份和訪問管理", + "text": "請考慮在 Azure KeyVault 中儲存連接字串(在無法使用託管標識的情況下)", + "waf": "安全" + }, + { + "category": "安全", + "description": "在臨時 SAS 服務 SAS 或帳戶 SAS 上使用近期過期時間。這樣,即使 SAS 遭到入侵,它也只會在短時間內有效。如果無法引用存儲訪問策略,則這種做法尤為重要。近期過期時間還通過限制可用於上傳到 blob 的時間來限制可以寫入 blob 的數據量。", + "guid": "27138b82-1102-4cac-9eae-01e6e842e52f", + "id": "A15.02", + "link": "https://learn.microsoft.com/rest/api/storageservices/delegate-access-with-shared-access-signature", + "service": "Azure Storage", + "severity": "高", + "subcategory": "身份和訪問管理", + "text": "爭取縮短臨時 SAS 的有效期", + "waf": "安全" + }, + { + "category": "安全", + "description": "創建 SAS 時,請盡可能具體且具有限制性。首選單一資源和操作的 SAS,而不是提供更廣泛訪問許可權的 SAS。", + "guid": "4721d928-c1b1-4cd5-81e5-4a29a9de399c", + "id": "A15.03", + "link": "https://learn.microsoft.com/rest/api/storageservices/delegate-access-with-shared-access-signature", + "service": "Azure Storage", + "severity": "中等", + "subcategory": "身份和訪問管理", + "text": "對SAS應用窄範圍", + "waf": "安全" + }, + { + "category": "安全", + "description": "SAS 可以包含用戶端 IP 位址或位址範圍有權使用 SAS 請求資源的參數。", + "guid": "fd7b28dc-9355-4562-82bf-e4564b0d834a", + "id": "A15.04", + "link": "https://learn.microsoft.com/rest/api/storageservices/create-account-sas", + "service": "Azure Storage", + "severity": "中等", + "subcategory": "身份和訪問管理", + "text": "盡可能考慮將SAS的範圍限定為特定的用戶端IP位址", + "waf": "安全" + }, + { + "category": "安全", + "description": "SAS無法限制用戶端上傳的數據量;考慮到存儲量隨時間變化的定價模型,驗證用戶端是否惡意上傳了大量內容可能很有意義。", + "guid": "348b263e-6dd6-4051-8a36-498f6dbad38e", + "id": "A15.05", + "service": "Azure Storage", + "severity": "低", + "subcategory": "身份和訪問管理", + "text": "在用戶端使用SAS上傳檔后,請考慮檢查上傳的數據。", + "waf": "安全" + }, + { + "category": "安全", + "description": "使用「本地使用者帳戶」通過 SFTP 訪問 blob 儲存時,“通常”的 RBAC 控制不適用。通過 NFS 或 REST 進行的 Blob 訪問可能比 SFTP 訪問更具限制性。遺憾的是,截至 2023 年初,本地使用者是 SFTP 端點目前支援的唯一身份管理形式", + "guid": "ad53cc7c-e1d7-4aaa-a357-1449ab8053d8", + "id": "A15.06", + "link": "https://learn.microsoft.com/azure/storage/blobs/secure-file-transfer-protocol-support#sftp-permission-model", + "service": "Azure Storage", + "severity": "高", + "subcategory": "身份和訪問管理", + "text": "SFTP:限制 SFTP 訪問的「本地使用者」數量,並審核隨著時間的推移是否需要訪問。", + "waf": "安全" + }, + { + "category": "安全", + "guid": "9f89dc7b-33be-42a1-a27f-7b9e91be1f38", + "id": "A15.07", + "link": "https://learn.microsoft.com/azure/storage/blobs/secure-file-transfer-protocol-known-issues#authentication-and-authorization", + "service": "Azure Storage", + "severity": "中等", + "subcategory": "身份和訪問管理", + "text": "SFTP:SFTP 端點不支持類似 POSIX 的 ACL。", + "waf": "安全" + }, + { + "category": "安全", + "description": "存儲支援 CORS(跨源資源分享),即一種 HTTP 功能,使來自不同域的 Web 應用程式能夠放鬆同源策略。啟用 CORS 時,請將 CorsRules 保留為最低許可權。", + "guid": "cef39812-bd46-43cb-aac8-ac199ebb91a3", + "id": "A16.01", + "link": "https://learn.microsoft.com/rest/api/storageservices/cross-origin-resource-sharing--cors--support-for-the-azure-storage-services", + "service": "Azure Storage", + "severity": "高", + "subcategory": "聯網", + "text": "避免過於寬泛的 CORS 策略", + "waf": "安全" + }, + { + "category": "安全", + "description": "靜態數據始終在伺服器端加密,此外也可能在用戶端加密。伺服器端加密可能使用平臺管理的金鑰(預設)或客戶管理的金鑰進行。用戶端加密可以通過讓用戶端按 blob 向 Azure 儲存提供加密/解密金鑰,或者完全在用戶端處理加密來實現。因此,完全不依賴 Azure 存儲來保證機密性。", + "guid": "3d90cae2-cc88-4137-86f7-c0cbafe61464", + "id": "A17.01", + "link": "https://learn.microsoft.com/azure/storage/common/storage-service-encryption", + "service": "Azure Storage", + "severity": "高", + "subcategory": "保密性和加密", + "text": "確定應如何加密靜態數據。了解數據的線程模型。", + "waf": "安全" + }, + { + "category": "安全", + "guid": "8dd457e9-2713-48b8-8110-2cac6eae01e6", + "id": "A17.02", + "link": "https://learn.microsoft.com/azure/storage/common/customer-managed-keys-overview?toc=%2Fazure%2Fstorage%2Fblobs%2Ftoc.json&bc=%2Fazure%2Fstorage%2Fblobs%2Fbreadcrumb%2Ftoc.json", + "service": "Azure Storage", + "severity": "中等", + "subcategory": "保密性和加密", + "text": "確定應使用哪種/是否應使用平臺加密。", + "waf": "安全" + }, + { + "category": "安全", + "guid": "e842e52f-4721-4d92-ac1b-1cd521e54a29", + "id": "A17.03", + "link": "https://learn.microsoft.com/azure/storage/blobs/encryption-customer-provided-keys", + "service": "Azure Storage", + "severity": "中等", + "subcategory": "保密性和加密", + "text": "確定應使用哪種/是否應使用用戶端加密。", + "waf": "安全" + }, + { + "category": "安全", + "description": "利用 Resource Graph 資源管理器 (resources | where type == 'microsoft.storage/storageaccounts' | where properties['allowBlobPublicAccess'] == true) 查找允許匿名 blob 訪問的存儲帳戶。", + "graph": "resources | where type == 'microsoft.storage/storageaccounts' | extend compliant = (properties.allowBlobPublicAccess == 'false') | distinct id, compliant", + "guid": "659ae558-b937-4d49-a5e1-112dbd7ba012", + "id": "A18.01", + "link": "https://learn.microsoft.com/azure/storage/blobs/anonymous-read-access-configure?tabs=portal#allow-or-disallow-public-read-access-for-a-storage-account", + "service": "Azure Storage", + "severity": "高", + "subcategory": "身份和訪問管理", + "text": "考慮是否需要公共 blob 匿名訪問,或者是否可以對某些存儲帳戶禁用公共 blob 匿名訪問。", + "waf": "安全" + }, + { + "category": "運營管理", + "guid": "cb8eb8c0-aa62-4a25-a495-6eaa8dc4a243", + "id": "B01.01", + "link": "https://learn.microsoft.com/azure/storage/common/storage-account-upgrade?tabs=azure-portal", + "service": "Azure Storage", + "severity": "高", + "subcategory": "平臺版本", + "text": "利用 storagev2 帳戶類型獲得更好的性能和可靠性", + "waf": "可靠性" + }, + { + "category": "BC 和DR", + "guid": "e05bbe20-9d49-4fda-9777-8424d116785c", + "id": "C01.01", + "link": "https://learn.microsoft.com/azure/storage/common/storage-redundancy", + "service": "Azure Storage", + "severity": "高", + "subcategory": "可用性", + "text": "利用 GRS、ZRS 或 GZRS 儲存實現最高可用性", + "waf": "可靠性" + }, + { + "category": "BC 和DR", + "guid": "2fa56c56-ad48-4408-be72-734c486ba280", + "id": "C01.02", + "link": "https://learn.microsoft.com/azure/storage/common/storage-disaster-recovery-guidance", + "service": "Azure Storage", + "severity": "中等", + "subcategory": "故障轉移", + "text": "對於故障轉移后的寫入操作,請使用客戶管理的故障轉移", + "waf": "可靠性" + }, + { + "category": "運營管理", + "guid": "dc0590cf-65de-48e1-909c-cbd579266bcc", + "id": "C01.03", + "link": "https://learn.microsoft.com/azure/storage/common/storage-disaster-recovery-guidance#microsoft-managed-failover", + "service": "Azure Storage", + "severity": "中等", + "subcategory": "故障轉移", + "text": "瞭解 Microsoft 託管的故障轉移詳細資訊", + "waf": "可靠性" + }, + { + "category": "運營管理", + "guid": "a274faa1-abfe-49d5-9d04-c3c4919cb1b3", + "id": "C01.04", + "link": "https://learn.microsoft.com/azure/storage/blobs/soft-delete-blob-enable?tabs=azure-portal", + "service": "Azure Storage", + "severity": "中等", + "subcategory": "數據保護", + "text": "啟用軟刪除", + "waf": "可靠性" + } + ], + "metadata": { + "name": "Azure Storage Review Checklist", + "state": "Preview", + "timestamp": "August 12, 2024", + "waf": "all" + }, + "severities": [ + { + "name": "高" + }, + { + "name": "中等" + }, + { + "name": "低" + } + ], + "status": [ + { + "description": "此檢查尚未查看", + "name": "未驗證" + }, + { + "description": "有一個與此檢查關聯的操作項", + "name": "打開" + }, + { + "description": "此檢查已經過驗證,並且沒有與之關聯的其他操作項", + "name": "實現" + }, + { + "description": "建議已理解,但當前要求不需要", + "name": "不需要" + }, + { + "description": "不適用於當前設計", + "name": "N/A" + } + ], + "waf": [ + { + "name": "可靠性" + }, + { + "name": "安全" + }, + { + "name": "成本" + }, + { + "name": "操作" + }, + { + "name": "性能" + } + ], + "yesno": [ + { + "name": "是的" + }, + { + "name": "不" + } + ] +} \ No newline at end of file diff --git a/checklists/checklist.en.master.json b/checklists/checklist.en.master.json index 9c9631f09..0afc6f098 100644 --- a/checklists/checklist.en.master.json +++ b/checklists/checklist.en.master.json @@ -1,5 +1,3539 @@ { "items": [ + { + "category": "Azure Billing and Microsoft Entra ID Tenants", + "checklist": "Azure Landing Zone Review", + "guid": "70c15989-c726-42c7-b0d3-24b7375b9201", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/ready/landing-zone/design-area/multi-tenant/considerations-recommendations", + "service": "Entra", + "services": [ + "Entra" + ], + "severity": "Medium", + "subcategory": "Microsoft Entra ID Tenants", + "text": "Use one Entra tenant for managing your Azure resources, unless you have a clear regulatory or business requirement for multi-tenants.", + "training": "https://learn.microsoft.com/training/modules/deploy-resources-scopes-bicep/2-understand-deployment-scopes", + "waf": "Operations" + }, + { + "category": "Azure Billing and Microsoft Entra ID Tenants", + "checklist": "Azure Landing Zone Review", + "guid": "6309957b-821a-43d1-b9d9-7fcf1802b747", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/ready/landing-zone/design-area/multi-tenant/automation", + "service": "Entra", + "services": [ + "Entra" + ], + "severity": "Low", + "subcategory": "Microsoft Entra ID Tenants", + "text": "Use Multi-Tenant Automation approach to managing your Microsoft Entra ID Tenants.", + "training": "https://learn.microsoft.com/entra/architecture/multi-tenant-user-management-introduction/", + "waf": "Operations" + }, + { + "category": "Azure Billing and Microsoft Entra ID Tenants", + "checklist": "Azure Landing Zone Review", + "guid": "78e11934-499a-45ed-8ef7-aae5578f0ecf", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/ready/landing-zone/design-area/multi-tenant/lighthouse", + "service": "Entra", + "services": [ + "Entra" + ], + "severity": "High", + "subcategory": "Microsoft Entra ID Tenants", + "text": "Use Azure Lighthouse for Multi-Tenant Management with the same IDs.", + "training": "https://learn.microsoft.com/azure/lighthouse/concepts/cross-tenant-management-experience", + "waf": "Operations" + }, + { + "category": "Azure Billing and Microsoft Entra ID Tenants", + "checklist": "Azure Landing Zone Review", + "guid": "5d82e6df-6f61-42f2-82e2-3132d293be3d", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/ready/landing-zone/design-area/azure-billing-microsoft-customer-agreement#design-recommendations", + "service": "Entra", + "services": [ + "Entra" + ], + "severity": "High", + "subcategory": "Cloud Solution Provider", + "text": "If you give a partner access to administer your tenant, use Azure Lighthouse.", + "training": "https://learn.microsoft.com/azure/lighthouse/how-to/onboard-customer", + "waf": "Cost" + }, + { + "category": "Azure Billing and Microsoft Entra ID Tenants", + "checklist": "Azure Landing Zone Review", + "guid": "a24d0de3-d4b9-4dfb-8ddd-bbfaf123fa01", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/ready/landing-zone/design-area/azure-billing-cloud-solution-provider#design-recommendations", + "services": [ + "Entra" + ], + "severity": "Low", + "subcategory": "Cloud Solution Provider", + "text": "If you have a CSP partner, define and document your support request and escalation process.", + "waf": "Cost" + }, + { + "category": "Azure Billing and Microsoft Entra ID Tenants", + "checklist": "Azure Landing Zone Review", + "guid": "32952499-58c8-4e6f-ada5-972e67893d55", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/ready/landing-zone/design-area/azure-billing-microsoft-customer-agreement#design-recommendations", + "services": [ + "Entra", + "Cost" + ], + "severity": "Medium", + "subcategory": "Cloud Solution Provider", + "text": "Setup Cost Reporting and Views with Azure Cost Management.", + "training": "https://learn.microsoft.com/training/modules/analyze-costs-create-budgets-azure-cost-management/", + "waf": "Cost" + }, + { + "category": "Azure Billing and Microsoft Entra ID Tenants", + "checklist": "Azure Landing Zone Review", + "guid": "685cb4f2-ac9c-4b19-9167-993ed0b32415", + "link": "https://learn.microsoft.com/azure/cost-management-billing/manage/direct-ea-administration#manage-notification-contacts", + "services": [ + "Entra", + "LoadBalancer" + ], + "severity": "Medium", + "subcategory": "Enterprise Agreement", + "text": "Configure Notification Contacts to a group mailbox.", + "waf": "Cost" + }, + { + "category": "Azure Billing and Microsoft Entra ID Tenants", + "checklist": "Azure Landing Zone Review", + "guid": "12cd499f-96e2-4e41-a243-231fb3245a1c", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/ready/landing-zone/design-area/azure-billing-enterprise-agreement#design-considerations", + "services": [ + "Entra", + "TrafficManager" + ], + "severity": "Low", + "subcategory": "Enterprise Agreement", + "text": "Use departments and accounts to map your organization's structure to your enrollment hierarchy which can help with separating billing.", + "training": "https://learn.microsoft.com/azure/cost-management-billing/manage/understand-ea-roles", + "waf": "Cost" + }, + { + "category": "Azure Billing and Microsoft Entra ID Tenants", + "checklist": "Azure Landing Zone Review", + "guid": "ca0fe401-12ad-46fc-8a7e-86293866a9f6", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/ready/landing-zone/design-area/azure-billing-enterprise-agreement#design-recommendations", + "services": [ + "Entra", + "Cost" + ], + "severity": "Medium", + "subcategory": "Enterprise Agreement", + "text": "Enable both DA View Charges and AO View Charges on your EA Enrollments to allow users with the correct perms review Cost and Billing Data.", + "training": "https://learn.microsoft.com/azure/cost-management-billing/costs/assign-access-acm-data#enable-access-to-costs-in-the-azure-portal", + "waf": "Security" + }, + { + "category": "Azure Billing and Microsoft Entra ID Tenants", + "checklist": "Azure Landing Zone Review", + "guid": "5cf9f485-2784-49b3-9824-75d9b8bdb57b", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/ready/landing-zone/design-area/azure-billing-enterprise-agreement#design-considerations", + "services": [ + "Entra", + "Cost", + "Subscriptions" + ], + "severity": "Low", + "subcategory": "Enterprise Agreement", + "text": "Use of Enterprise Dev/Test Subscriptions to reduce costs for non-production workloads.", + "training": "https://learn.microsoft.com/azure/devtest/offer/how-to-manage-monitor-devtest", + "waf": "Cost" + }, + { + "category": "Azure Billing and Microsoft Entra ID Tenants", + "checklist": "Azure Landing Zone Review", + "guid": "6ad5c3dd-e5ea-4ff1-81a4-7886ff87845c", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/ready/landing-zone/design-area/azure-billing-microsoft-customer-agreement#design-recommendations", + "services": [ + "Entra" + ], + "severity": "Low", + "subcategory": "Microsoft Customer Agreement", + "text": "Configure Agreement billing account notification contact email.", + "training": "https://learn.microsoft.com/azure/cost-management-billing/manage/mca-setup-account", + "waf": "Cost" + }, + { + "category": "Azure Billing and Microsoft Entra ID Tenants", + "checklist": "Azure Landing Zone Review", + "guid": "90e87802-602f-4dfb-acea-67c60689f1d7", + "link": "https://learn.microsoft.com/azure/cost-management-billing/manage/mca-section-invoice", + "services": [ + "Entra", + "Storage", + "Cost" + ], + "severity": "Low", + "subcategory": "Microsoft Customer Agreement", + "text": "Use Billing Profiles and Invoice sections to structure your agreements billing for effective cost management.", + "training": "https://learn.microsoft.com/azure/cost-management-billing/understand/mca-overview#billing-profiles", + "waf": "Cost" + }, + { + "category": "Azure Billing and Microsoft Entra ID Tenants", + "checklist": "Azure Landing Zone Review", + "guid": "e81a73f0-84c4-4641-b406-14db3b4d1f50", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/ready/landing-zone/design-area/azure-billing-microsoft-customer-agreement#design-recommendations", + "services": [ + "Entra", + "Cost" + ], + "severity": "Low", + "subcategory": "Microsoft Customer Agreement", + "text": "Make use of Microsoft Azure plan for dev/test offer to reduce costs for non-production workloads.", + "training": "https://learn.microsoft.com/azure/devtest/offer/overview-what-is-devtest-offer-visual-studio", + "waf": "Cost" + }, + { + "category": "Azure Billing and Microsoft Entra ID Tenants", + "checklist": "Azure Landing Zone Review", + "guid": "ae757485-92a4-482a-8bc9-eefe6f5b5ec3", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/ready/landing-zone/design-area/azure-billing-microsoft-customer-agreement#design-recommendations", + "services": [ + "Entra", + "RBAC" + ], + "severity": "Medium", + "subcategory": "Microsoft Customer Agreement", + "text": "Define and document a process to periodically audit the agreement billing RBAC role assignments to review who has access to your MCA billing account.", + "training": "https://learn.microsoft.com/azure/cost-management-billing/manage/understand-mca-roles", + "waf": "Cost" + }, + { + "category": "Identity and Access Management", + "checklist": "Azure Landing Zone Review", + "guid": "348ef254-c27d-442e-abba-c7571559ab91", + "link": "https://learn.microsoft.com/azure/role-based-access-control/overview", + "service": "Entra", + "services": [ + "Entra", + "RBAC", + "ACR", + "Subscriptions" + ], + "severity": "High", + "subcategory": "Identity", + "text": "Enforce a RBAC model that aligns to your cloud operating model. Scope and Assign across Management Groups and Subscriptions.", + "training": "https://learn.microsoft.com/learn/paths/implement-resource-mgmt-security/", + "waf": "Security" + }, + { + "category": "Identity and Access Management", + "checklist": "Azure Landing Zone Review", + "guid": "4348bf81-7573-4512-8f46-9061cc198fea", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/ready/landing-zone/design-area/identity-access-landing-zones#identity-and-access-management-in-the-azure-landing-zone-accelerator", + "services": [ + "Entra" + ], + "severity": "High", + "subcategory": "Microsoft Entra ID and Hybrid Identity", + "text": "Use managed identities instead of service principals for authentication to Azure services. You can check for existing service principals via Entra ID > Sign in Logs > Service principal logins.", + "training": "https://learn.microsoft.com/azure/active-directory/managed-identities-azure-resources/overview", + "waf": "Security" + }, + { + "category": "Identity and Access Management", + "checklist": "Azure Landing Zone Review", + "guid": "12e7f983-f630-4472-8dd6-9c5b5c2622f5", + "link": "https://learn.microsoft.com/azure/active-directory/roles/security-planning#identify-microsoft-accounts-in-administrative-roles-that-need-to-be-switched-to-work-or-school-accounts", + "service": "Entra", + "services": [ + "Entra" + ], + "severity": "High", + "subcategory": "Identity", + "text": "Only use the authentication type Work or school account for all account types. Avoid using the Microsoft account", + "training": "https://learn.microsoft.com/learn/modules/explore-basic-services-identity-types/", + "waf": "Security" + }, + { + "category": "Identity and Access Management", + "checklist": "Azure Landing Zone Review", + "guid": "4b69bad3-3aad-45e8-a68e-1d76667313b4", + "link": "https://learn.microsoft.com/azure/active-directory/fundamentals/active-directory-groups-create-azure-portal", + "service": "Entra", + "services": [ + "Entra" + ], + "severity": "Medium", + "subcategory": "Identity", + "text": "Only use groups to assign permissions. Add on-premises groups to the Entra ID only group if a group management system is already in place.", + "training": "https://learn.microsoft.com/learn/paths/manage-identity-and-access/", + "waf": "Security" + }, + { + "category": "Identity and Access Management", + "checklist": "Azure Landing Zone Review", + "guid": "53e8908a-e28c-484c-93b6-b7808b9fe5c4", + "link": "https://learn.microsoft.com/azure/active-directory/conditional-access/overview", + "service": "Entra", + "services": [ + "Entra", + "AzurePolicy" + ], + "severity": "High", + "subcategory": "Identity", + "text": "Enforce Microsoft Entra ID Conditional Access policies for any user with rights to Azure environments.", + "training": "https://learn.microsoft.com/learn/modules/plan-implement-administer-conditional-access/", + "waf": "Security" + }, + { + "category": "Identity and Access Management", + "checklist": "Azure Landing Zone Review", + "guid": "1049d403-a923-4c34-94d0-0018ac6a9e01", + "link": "https://learn.microsoft.com/azure/active-directory/authentication/concept-mfa-howitworks", + "service": "Entra", + "services": [ + "Entra" + ], + "severity": "High", + "subcategory": "Identity", + "text": "Enforce multi-factor authentication for any user with rights to the Azure environments.", + "training": "https://learn.microsoft.com/learn/modules/secure-aad-users-with-mfa/", + "waf": "Security" + }, + { + "category": "Identity and Access Management", + "checklist": "Azure Landing Zone Review", + "guid": "e6a83de5-de32-4c19-a248-1607d5d1e4e6", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/manage/centralize-operations", + "services": [ + "Entra", + "RBAC" + ], + "severity": "High", + "subcategory": "Identity", + "text": "Enforce centralized and delegated responsibilities to manage resources deployed inside the landing zone, based on role and security requirements.", + "training": "https://learn.microsoft.com/learn/paths/azure-administrator-manage-identities-governance/", + "waf": "Security" + }, + { + "category": "Identity and Access Management", + "checklist": "Azure Landing Zone Review", + "guid": "14658d35-58fd-4772-99b8-21112df27ee4", + "link": "https://learn.microsoft.com/azure/active-directory/privileged-identity-management/pim-configure", + "service": "Entra", + "services": [ + "Entra" + ], + "severity": "Medium", + "subcategory": "Identity", + "text": "Enforce Microsoft Entra ID Privileged Identity Management (PIM) to establish zero standing access and least privilege.", + "training": "https://learn.microsoft.com/learn/modules/azure-ad-privileged-identity-management/", + "waf": "Security" + }, + { + "category": "Identity and Access Management", + "checklist": "Azure Landing Zone Review", + "guid": "1559ab91-53e8-4908-ae28-c84c33b6b780", + "link": "https://learn.microsoft.com/azure/architecture/reference-architectures/identity/adds-extend-domain#vm-recommendations", + "services": [ + "VM", + "ACR", + "Entra" + ], + "severity": "High", + "subcategory": "Identity", + "text": "When deploying Active Directory Domain Controllers, use a location with Availability Zones and deploy at least two VMs across these zones. If not available, deploy in an Availability Set.", + "training": "https://learn.microsoft.com/learn/modules/azure-active-directory/", + "waf": "Reliability" + }, + { + "category": "Identity and Access Management", + "checklist": "Azure Landing Zone Review", + "guid": "f5664b5e-984a-4859-a773-e7d261623a76", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/ready/landing-zone/design-area/identity-access#prerequisites-for-a-landing-zone---design-recommendations", + "services": [ + "Entra", + "RBAC", + "ACR", + "Subscriptions" + ], + "severity": "Medium", + "subcategory": "Identity", + "text": "Use Azure custom RBAC roles for the following key roles to provide fine-grain access across your ALZ: Azure platform owner, network management, security operations, subscription owner, application owner. Align these roles to teams and responsibilities within your business.", + "training": "https://learn.microsoft.com/learn/modules/create-custom-azure-roles-with-rbac/", + "waf": "Security" + }, + { + "category": "Identity and Access Management", + "checklist": "Azure Landing Zone Review", + "guid": "8b9fe5c4-1049-4d40-9a92-3c3474d00018", + "link": "https://learn.microsoft.com/entra/identity/domain-services/overview", + "service": "Entra", + "services": [ + "Entra" + ], + "severity": "Medium", + "subcategory": "Identity", + "text": "If planning to switch from Active Directory Domain Services to Entra domain services, evaluate the compatibility of all workloads.", + "training": "https://learn.microsoft.com/learn/modules/implement-hybrid-identity-windows-server/", + "waf": "Security" + }, + { + "category": "Identity and Access Management", + "checklist": "Azure Landing Zone Review", + "guid": "1cf0b8da-70bd-44d0-94af-8d99cfc89ae1", + "link": "https://learn.microsoft.com/azure/active-directory/reports-monitoring/concept-activity-logs-azure-monitor", + "service": "Entra", + "services": [ + "Entra", + "Monitor" + ], + "severity": "Medium", + "subcategory": "Identity", + "text": "Integrate Microsoft Entra ID logs with the platform-central Azure Monitor. Azure Monitor allows for a single source of truth around log and monitoring data in Azure, giving organizations a cloud native options to meet requirements around log collection and retention.", + "training": "https://learn.microsoft.com/entra/identity/monitoring-health/howto-integrate-activity-logs-with-azure-monitor-logs", + "waf": "Security" + }, + { + "ammp": true, + "category": "Identity and Access Management", + "checklist": "Azure Landing Zone Review", + "guid": "984a859c-773e-47d2-9162-3a765a917e1f", + "link": "https://learn.microsoft.com/azure/active-directory/roles/security-emergency-access", + "service": "Entra", + "services": [ + "Entra" + ], + "severity": "High", + "subcategory": "Identity", + "text": "Implement an emergency access or break-glass accounts to prevent tenant-wide account lockout.", + "training": "https://learn.microsoft.com/learn/modules/azure-ad-privileged-identity-management/", + "waf": "Security" + }, + { + "category": "Identity and Access Management", + "checklist": "Azure Landing Zone Review", + "guid": "cd163e39-84a5-4b39-97b7-6973abd70d94", + "link": "https://learn.microsoft.com/azure/active-directory/hybrid/how-to-connect-sync-staging-server", + "services": [ + "Entra", + "ASR" + ], + "severity": "Medium", + "subcategory": "Microsoft Entra ID", + "text": "When deploying Microsoft Entra Connect, use a staging sever for high availability/disaster recovery.", + "training": "https://learn.microsoft.com/entra/identity/hybrid/connect/plan-connect-topologies", + "waf": "Reliability" + }, + { + "category": "Identity and Access Management", + "checklist": "Azure Landing Zone Review", + "guid": "35037e68-9349-4c15-b371-228514f4cdff", + "link": "https://learn.microsoft.com/azure/active-directory/roles/best-practices", + "service": "Entra", + "services": [ + "Entra", + "RBAC" + ], + "severity": "Medium", + "subcategory": "Identity", + "text": "Do not use on-premises synced accounts for Microsoft Entra ID role assignments, unless you have a scenario that specifically requires it.", + "training": "https://learn.microsoft.com/learn/modules/design-identity-security-strategy/", + "waf": "Security" + }, + { + "category": "Identity and Access Management", + "checklist": "Azure Landing Zone Review", + "guid": "d5d1e4e6-1465-48d3-958f-d77249b82111", + "link": "https://learn.microsoft.com/azure/active-directory/app-proxy/application-proxy", + "service": "Entra", + "services": [ + "Entra" + ], + "severity": "Medium", + "subcategory": "Identity", + "text": "When using Microsoft Entra ID Application Proxy to give remote users access to applications, manage it as a Platform resource as you can only have one instance per tenant.", + "training": "https://learn.microsoft.com/learn/paths/implement-applications-external-access-azure-ad/", + "waf": "Security" + }, + { + "category": "Identity and Access Management", + "checklist": "Azure Landing Zone Review", + "guid": "9cf5418b-1520-4b7b-add7-88eb28f833e8", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/ready/landing-zone/design-area/identity-access-landing-zones#identity-and-access-management-in-the-azure-landing-zone-accelerator", + "services": [ + "Entra", + "VNet" + ], + "severity": "High", + "subcategory": "Landing zones", + "text": "Configure Identity network segmentation through the use of a virtual Network and peer back to the hub. Providing authentication inside application landing zone (legacy).", + "training": "https://learn.microsoft.com/azure/architecture/example-scenario/identity/adds-extend-domain", + "waf": "Security" + }, + { + "category": "Identity and Access Management", + "checklist": "Azure Landing Zone Review", + "guid": "d4d1ad54-1abc-4919-b267-3f342d3b49e4", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/ready/landing-zone/design-area/identity-access-landing-zones#rbac-recommendations", + "services": [ + "Storage", + "Entra", + "AKV", + "RBAC", + "ACR" + ], + "severity": "Medium", + "subcategory": "Landing zones", + "text": "Use Azure RBAC to manage data plane access to resources, if possible. E.g. Data Operations across Key Vault, Storage Account and Database Services.", + "training": "https://learn.microsoft.com/azure/role-based-access-control/overview", + "waf": "Security" + }, + { + "category": "Identity and Access Management", + "checklist": "Azure Landing Zone Review", + "guid": "d505ebcb-79b1-4274-9c0d-a27c8bea489c", + "link": "https://learn.microsoft.com/azure/active-directory/privileged-identity-management/pim-create-roles-and-resource-roles-review", + "services": [ + "Entra" + ], + "severity": "Medium", + "subcategory": "Landing zones", + "text": "Use Microsoft Entra ID PIM access reviews to periodically validate resource entitlements.", + "training": "https://learn.microsoft.com/entra/id-governance/privileged-identity-management/pim-perform-roles-and-resource-roles-review", + "waf": "Security" + }, + { + "category": "Resource Organization", + "checklist": "Azure Landing Zone Review", + "description": "Consider using the Azure naming tool available at https://aka.ms/azurenamingtool", + "guid": "cacf55bc-e4e4-46be-96bc-57a5f23a269a", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/ready/azure-best-practices/resource-naming", + "services": [], + "severity": "High", + "subcategory": "Naming and tagging", + "text": "Use a well defined naming scheme for resources, such as Microsoft Best Practice Naming Standards.", + "waf": "Security" + }, + { + "category": "Resource Organization", + "checklist": "Azure Landing Zone Review", + "graph": "resourcecontainers| where type == 'microsoft.resources/subscriptions'| extend ManagementGroup = tostring(tags),mgmtChain = properties.managementGroupAncestorsChain| extend compliant =( array_length(mgmtChain) <= 4 and array_length(mgmtChain) > 1)", + "guid": "2df27ee4-12e7-4f98-9f63-04722dd69c5b", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/ready/landing-zone/design-area/resource-org-management-groups", + "services": [ + "Subscriptions" + ], + "severity": "Medium", + "subcategory": "Subscriptions", + "text": "Enforce reasonably flat management group hierarchy with no more than four levels.", + "training": "https://learn.microsoft.com/learn/modules/azure-architecture-fundamentals/", + "waf": "Security" + }, + { + "category": "Resource Organization", + "checklist": "Azure Landing Zone Review", + "guid": "667313b4-f566-44b5-b984-a859c773e7d2", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/ready/landing-zone/design-area/resource-org-management-groups#management-group-recommendations", + "services": [ + "Subscriptions" + ], + "severity": "Medium", + "subcategory": "Subscriptions", + "text": "Enforce a sandbox management group to allow users to immediately experiment with Azure.", + "training": "https://learn.microsoft.com/learn/paths/enterprise-scale-architecture/", + "waf": "Security" + }, + { + "category": "Resource Organization", + "checklist": "Azure Landing Zone Review", + "guid": "61623a76-5a91-47e1-b348-ef254c27d42e", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/ready/landing-zone/design-area/resource-org-management-groups#management-group-recommendations", + "services": [ + "RBAC", + "AzurePolicy", + "Subscriptions" + ], + "severity": "Medium", + "subcategory": "Subscriptions", + "text": "Enforce a platform management group under the root management group to support common platform policy and Azure role assignment.", + "training": "https://learn.microsoft.com/learn/paths/enterprise-scale-architecture/", + "waf": "Security" + }, + { + "category": "Resource Organization", + "checklist": "Azure Landing Zone Review", + "guid": "8bbac757-1559-4ab9-853e-8908ae28c84c", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/ready/landing-zone/design-area/resource-org-management-groups#management-group-recommendations", + "services": [ + "DNS", + "ExpressRoute", + "Subscriptions", + "VWAN" + ], + "severity": "Medium", + "subcategory": "Subscriptions", + "text": "Enforce a dedicated connectivity subscription in the Connectivity management group to host an Azure Virtual WAN hub, private non-AD Domain Name System (DNS), ExpressRoute circuit, and other networking resources.", + "training": "https://learn.microsoft.com/learn/paths/enterprise-scale-architecture/", + "waf": "Security" + }, + { + "category": "Resource Organization", + "checklist": "Azure Landing Zone Review", + "graph": "resourcecontainers| where type == 'microsoft.resources/subscriptions'| extend ManagementGroup = tostring(tags),mgmtChain = properties.managementGroupAncestorsChain| extend compliant = (array_length(mgmtChain) > 1)", + "guid": "33b6b780-8b9f-4e5c-9104-9d403a923c34", + "link": "https://learn.microsoft.com/azure/governance/management-groups/how-to/protect-resource-hierarchy#setting---default-management-group", + "services": [ + "Subscriptions" + ], + "severity": "Medium", + "subcategory": "Subscriptions", + "text": "Enforce no subscriptions are placed under the root management group.", + "training": "https://learn.microsoft.com/azure/governance/management-groups/overview", + "waf": "Security" + }, + { + "category": "Resource Organization", + "checklist": "Azure Landing Zone Review", + "guid": "74d00018-ac6a-49e0-8e6a-83de5de32c19", + "link": "https://learn.microsoft.com/azure/governance/management-groups/how-to/protect-resource-hierarchy#setting---require-authorization", + "services": [ + "RBAC", + "Subscriptions" + ], + "severity": "Medium", + "subcategory": "Subscriptions", + "text": "Enforce that only privileged users can operate management groups in the tenant by enabling Azure RBAC authorization in the management group hierarchy settings.", + "training": "https://learn.microsoft.com/training/modules/configure-role-based-access-control/", + "waf": "Security" + }, + { + "category": "Resource Organization", + "checklist": "Azure Landing Zone Review", + "guid": "92481607-d5d1-4e4e-9146-58d3558fd772", + "link": "https://learn.microsoft.com/azure/governance/management-groups/overview", + "services": [ + "Subscriptions" + ], + "severity": "Medium", + "subcategory": "Subscriptions", + "text": "Enforce management groups under the root-level management group to represent the types of workloads, based on their security, compliance, connectivity, and feature needs.", + "waf": "Security" + }, + { + "category": "Resource Organization", + "checklist": "Azure Landing Zone Review", + "guid": "49b82111-2df2-47ee-912e-7f983f630472", + "link": "https://learn.microsoft.com/entra/id-governance/access-reviews-overview", + "services": [ + "RBAC", + "Cost", + "AzurePolicy", + "Subscriptions" + ], + "severity": "High", + "subcategory": "Subscriptions", + "text": "Enforce a process to make resource owners aware of their roles and responsibilities, access review, budget review, policy compliance and remediate when necessary.", + "training": "https://learn.microsoft.com/training/modules/plan-implement-manage-access-review/", + "waf": "Security" + }, + { + "category": "Resource Organization", + "checklist": "Azure Landing Zone Review", + "guid": "2dd69c5b-5c26-422f-94b6-9bad33aad5e8", + "link": "https://learn.microsoft.com/azure/azure-resource-manager/management/azure-subscription-service-limits", + "services": [ + "Subscriptions" + ], + "severity": "Medium", + "subcategory": "Subscriptions", + "text": "Ensure that all subscription owners and IT core team are aware of subscription quotas and the impact they have on provision resources for a given subscription.", + "training": "https://learn.microsoft.com/training/modules/configure-subscriptions/", + "waf": "Security" + }, + { + "category": "Resource Organization", + "checklist": "Azure Landing Zone Review", + "guid": "c68e1d76-6673-413b-9f56-64b5e984a859", + "link": "https://learn.microsoft.com/azure/cost-management-billing/reservations/save-compute-costs-reservations", + "services": [ + "Cost", + "Subscriptions" + ], + "severity": "High", + "subcategory": "Subscriptions", + "text": "Use Reserved Instances where appropriate to optimize cost and ensure available capacity in target regions.", + "training": "https://learn.microsoft.com/learn/paths/improve-reliability-modern-operations/", + "waf": "Security" + }, + { + "ammp": true, + "category": "Resource Organization", + "checklist": "Azure Landing Zone Review", + "guid": "c773e7d2-6162-43a7-95a9-17e1f348ef25", + "link": "https://learn.microsoft.com/azure/azure-portal/azure-portal-dashboards", + "services": [ + "Monitor", + "Storage", + "Subscriptions" + ], + "severity": "Medium", + "subcategory": "Subscriptions", + "text": "Establish dashboards and/or visualizations to monitor compute and storage capacity metrics. (i.e. CPU, memory, disk space)", + "training": "https://learn.microsoft.com/training/modules/visualize-data-workbooks/", + "waf": "Security" + }, + { + "category": "Resource Organization", + "checklist": "Azure Landing Zone Review", + "guid": "ae28c84c-33b6-4b78-88b9-fe5c41049d40", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/get-started/manage-costs", + "services": [ + "Cost", + "Subscriptions" + ], + "severity": "High", + "subcategory": "Subscriptions", + "text": "As part of your cloud adoption, implement a detailed cost management plan using the 'Managed cloud costs' process.", + "training": "https://learn.microsoft.com/learn/paths/control-spending-manage-bills/", + "waf": "Security" + }, + { + "category": "Resource Organization", + "checklist": "Azure Landing Zone Review", + "guid": "3a923c34-74d0-4001-aac6-a9e01e6a83de", + "link": "https://learn.microsoft.com/azure/governance/management-groups/overview", + "services": [ + "Entra", + "Subscriptions" + ], + "severity": "Medium", + "subcategory": "Subscriptions", + "text": "If servers will be used for Identity services, like domain controllers, establish a dedicated identity subscription in the identity management group, to host these services. Make sure that resources are set to use the domain controllers available in their region.", + "training": "https://learn.microsoft.com/learn/paths/enterprise-scale-architecture/", + "waf": "Security" + }, + { + "category": "Resource Organization", + "checklist": "Azure Landing Zone Review", + "graph": "resources | extend compliant = isnotnull(['tags']) | project name, id, subscriptionId, resourceGroup, tags, compliant", + "guid": "5de32c19-9248-4160-9d5d-1e4e614658d3", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/ready/azure-best-practices/track-costs", + "services": [ + "Cost", + "Subscriptions" + ], + "severity": "Medium", + "subcategory": "Subscriptions", + "text": "Ensure tags are used for billing and cost management.", + "training": "https://learn.microsoft.com/learn/paths/implement-resource-mgmt-security/", + "waf": "Security" + }, + { + "category": "Resource Organization", + "checklist": "Azure Landing Zone Review", + "guid": "6cc0ea22-42bb-441e-a345-804ab0a09666", + "link": "https://github.com/Azure/sovereign-landing-zone/blob/main/docs/02-Architecture.md", + "services": [ + "Subscriptions" + ], + "severity": "Medium", + "subcategory": "Subscriptions", + "text": "For Sovereign Landing Zone, have a 'confidential corp' and 'confidential online' management group directly under the 'landing zones' MG.", + "training": "https://learn.microsoft.com/industry/sovereignty/slz-overview", + "waf": "Security" + }, + { + "category": "Resource Organization", + "checklist": "Azure Landing Zone Review", + "guid": "250d81ce-8bbe-4f85-9051-6a18a8221e50", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/ready/azure-setup-guide/regions", + "services": [ + "Cost" + ], + "severity": "High", + "subcategory": "Regions", + "text": "Select the right Azure region/s for your deployment. Azure is a global-scale cloud platform that provide global coverage through many regions and geographies. Different Azure regions have different characteristics, access and availability models, costs, capacity, and services offered, then it is important to consider all criteria and requirements.", + "training": "https://learn.microsoft.com/learn/modules/azure-architecture-fundamentals/", + "waf": "Reliability" + }, + { + "category": "Resource Organization", + "checklist": "Azure Landing Zone Review", + "guid": "19ca3f89-397d-44b1-b5b6-5e18661372ac", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/ready/azure-setup-guide/regions#operate-in-multiple-geographic-regions", + "services": [ + "ASR" + ], + "severity": "Medium", + "subcategory": "Regions", + "text": "Deploy your Azure landing zone in a multi-region deployment. Depending on customer size, locations, and users presence, operating in multiple regions can be a common choice to deliver services and run applications closer to them. Using a multi-region deployment is also important to provide geo disaster recovery capabilities, to eliminate the dependency from a single region capacity and diminish the risk of a temporary and localized resource capacity constraint.", + "training": "https://learn.microsoft.com/learn/modules/azure-architecture-fundamentals/", + "waf": "Reliability" + }, + { + "category": "Resource Organization", + "checklist": "Azure Landing Zone Review", + "guid": "4c27d42e-8bba-4c75-9155-9ab9153e8908", + "link": "https://azure.microsoft.com/explore/global-infrastructure/products-by-region/", + "services": [], + "severity": "Medium", + "subcategory": "Regions", + "text": "Ensure required services and features are available within the chosen deployment regions.", + "training": "https://learn.microsoft.com/learn/modules/azure-architecture-fundamentals/", + "waf": "Reliability" + }, + { + "category": "Network Topology and Connectivity", + "checklist": "Azure Landing Zone Review", + "guid": "373f482f-3e39-4d39-8aa4-7e566f6082b6", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/ready/azure-best-practices/plan-for-app-delivery", + "services": [ + "AppGW", + "FrontDoor" + ], + "severity": "Medium", + "subcategory": "App delivery", + "text": "Document a standard for securing the delivery application content from your Workload spokes using Application Gateway and Azure Front Door. You can use the Application Delivery checklist to for recommendations.", + "waf": "Operations" + }, + { + "category": "Network Topology and Connectivity", + "checklist": "Azure Landing Zone Review", + "guid": "e8bbac75-7155-49ab-a153-e8908ae28c84", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/ready/enterprise-scale/network-topology-and-connectivity", + "service": "VNet", + "services": [ + "VNet" + ], + "severity": "Medium", + "subcategory": "Hub and spoke", + "text": "Use a hub-and-spoke network topology for network scenarios that require maximum flexibility.", + "training": "https://learn.microsoft.com/learn/paths/architect-network-infrastructure/", + "waf": "Security" + }, + { + "category": "Network Topology and Connectivity", + "checklist": "Azure Landing Zone Review", + "guid": "7dd61623-a364-4a90-9eca-e48ebd54cd7d", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/ready/azure-best-practices/traditional-azure-networking-topology", + "service": "VNet", + "services": [ + "Entra", + "Firewall", + "NVA", + "VNet", + "ExpressRoute", + "DNS", + "VPN" + ], + "severity": "High", + "subcategory": "Hub and spoke", + "text": "Deploy shared networking services, including ExpressRoute gateways, VPN gateways, and Azure Firewall or partner NVAs in the central-hub virtual network. If necessary, also deploy DNS services.", + "training": "https://learn.microsoft.com/training/modules/hub-and-spoke-network-architecture/", + "waf": "Cost" + }, + { + "category": "Network Topology and Connectivity", + "checklist": "Azure Landing Zone Review", + "guid": "143b16c3-1d7a-4a9b-9470-4489a8042d88", + "link": "https://learn.microsoft.com/azure/ddos-protection/ddos-protection-overview", + "service": "VNet", + "services": [ + "DDoS" + ], + "severity": "High", + "subcategory": "App delivery", + "text": "Use a DDoS Network or IP protection plan for all public IP addresses in application landing zones.", + "training": "https://learn.microsoft.com/learn/paths/secure-networking-infrastructure/", + "waf": "Security" + }, + { + "category": "Network Topology and Connectivity", + "checklist": "Azure Landing Zone Review", + "guid": "e2e8abac-3571-4559-ab91-53e89f89dc7b", + "link": "https://learn.microsoft.com/azure/architecture/reference-architectures/dmz/nva-ha", + "service": "NVA", + "services": [ + "NVA" + ], + "severity": "Medium", + "subcategory": "Hub and spoke", + "text": "When deploying partner networking technologies or NVAs, follow the partner vendor's guidance.", + "waf": "Reliability" + }, + { + "category": "Network Topology and Connectivity", + "checklist": "Azure Landing Zone Review", + "guid": "ce463dbb-bc8a-4c2a-aebc-92a43da1dae2", + "link": "https://learn.microsoft.com/azure/expressroute/expressroute-howto-coexist-resource-manager#to-enable-transit-routing-between-expressroute-and-azure-vpn", + "service": "ExpressRoute", + "services": [ + "ExpressRoute", + "ARS", + "VPN" + ], + "severity": "Low", + "subcategory": "Hub and spoke", + "text": "If you need transit between ExpressRoute and VPN gateways in hub and spoke scenarios, use Azure Route Server.", + "training": "https://learn.microsoft.com/training/modules/intro-to-azure-route-server/", + "waf": "Security" + }, + { + "category": "Network Topology and Connectivity", + "checklist": "Azure Landing Zone Review", + "graph": "resources | where type=='microsoft.network/virtualnetworks' | project id,subnets=properties.subnets | mv-expand subnets | project id, subnetName = subnets.name, subnetPrefix = subnets.properties.addressPrefix | extend subnetPrefixLength = split(subnetPrefix, '/')[1] | where subnetName == 'RouteServerSubnet' | extend compliant = (subnetPrefixLength <= 27) | distinct id, compliant", + "guid": "91b9d7d5-91e1-4dcb-8f1f-fa7e465646cc", + "link": "https://learn.microsoft.com/azure/route-server/quickstart-configure-route-server-portal#create-a-route-server-1", + "service": "ARS", + "services": [ + "VNet", + "ARS" + ], + "severity": "Low", + "subcategory": "Hub and spoke", + "text": "If using Route Server, use a /27 prefix for the Route Server subnet.", + "training": "https://learn.microsoft.com/training/modules/intro-to-azure-route-server/", + "waf": "Security" + }, + { + "category": "Network Topology and Connectivity", + "checklist": "Azure Landing Zone Review", + "guid": "cc881471-607c-41cc-a0e6-14658dd558f9", + "link": "https://learn.microsoft.com/azure/virtual-network/virtual-networks-faq#can-i-create-a-peering-connection-to-a-vnet-in-a-different-region", + "service": "VNet", + "services": [ + "ACR", + "VNet" + ], + "severity": "Medium", + "subcategory": "Hub and spoke", + "text": "For network architectures with multiple hub-and-spoke topologies across Azure regions, use global virtual network peerings between the hub VNets to connect the regions to each other.", + "training": "https://learn.microsoft.com/learn/paths/azure-administrator-manage-virtual-networks/", + "waf": "Performance" + }, + { + "category": "Network Topology and Connectivity", + "checklist": "Azure Landing Zone Review", + "guid": "4722d929-c1b1-4cd6-81f5-4b29bade39ad", + "link": "https://learn.microsoft.com/azure/azure-monitor/insights/network-insights-overview", + "service": "VNet", + "services": [ + "Monitor" + ], + "severity": "Medium", + "subcategory": "Hub and spoke", + "text": "Use Azure Monitor for Networks to monitor the end-to-end state of the networks on Azure.", + "training": "https://learn.microsoft.com/learn/modules/design-implement-network-monitoring/", + "waf": "Operations" + }, + { + "category": "Network Topology and Connectivity", + "checklist": "Azure Landing Zone Review", + "graph": "resources | where type == 'microsoft.network/virtualnetworks' | mvexpand properties.virtualNetworkPeerings | summarize peeringcount = count() by id | extend compliant = (peeringcount < 450) | distinct id,compliant", + "guid": "0e7c28ec-9366-4572-83b0-f4664b1d944a", + "link": "https://learn.microsoft.com/azure/azure-resource-manager/management/azure-subscription-service-limits?toc=/azure/virtual-network/toc.json#azure-resource-manager-virtual-networking-limits", + "service": "VNet", + "services": [ + "VNet", + "ExpressRoute" + ], + "severity": "Medium", + "subcategory": "Hub and spoke", + "text": "If you have more than 400 spoke networks in a region, deploy an additional hub to bypass VNet peering limits (500) and the maximum number of prefixes that can be advertised via ExpressRoute (1000).", + "training": "https://learn.microsoft.com/training/modules/hub-and-spoke-network-architecture/", + "waf": "Reliability" + }, + { + "category": "Network Topology and Connectivity", + "checklist": "Azure Landing Zone Review", + "graph": "resources | where type=='microsoft.network/routetables' | mvexpand properties.routes | summarize routeCount = count() by id | extend compliant = (routeCount < 360) | distinct id,compliant", + "guid": "3d457936-e9b7-41eb-bdff-314b26450b12", + "link": "https://learn.microsoft.com/azure/azure-resource-manager/management/azure-subscription-service-limits?toc=/azure/virtual-network/toc.json#azure-resource-manager-virtual-networking-limits", + "service": "VNet", + "services": [ + "Storage" + ], + "severity": "Medium", + "subcategory": "Hub and spoke", + "text": "Limit the number of routes per route table to 400.", + "training": "https://learn.microsoft.com/training/modules/hub-and-spoke-network-architecture/", + "waf": "Reliability" + }, + { + "category": "Network Topology and Connectivity", + "checklist": "Azure Landing Zone Review", + "graph": "resources | where type == 'microsoft.network/virtualnetworks' | mvexpand properties.virtualNetworkPeerings | project id, peeringName=properties_virtualNetworkPeerings.name, compliant = (properties_virtualNetworkPeerings.properties.allowVirtualNetworkAccess == True)", + "guid": "c76cb5a2-abe2-11ed-afa1-0242ac120002", + "link": "https://learn.microsoft.com/azure/virtual-network/virtual-network-manage-peering", + "service": "VNet", + "services": [ + "VNet" + ], + "severity": "High", + "subcategory": "Hub and spoke", + "text": "Use the setting 'Allow traffic to remote virtual network' when configuring VNet peerings.", + "training": "https://learn.microsoft.com/training/modules/hub-and-spoke-network-architecture/", + "waf": "Reliability" + }, + { + "category": "Network Topology and Connectivity", + "checklist": "Azure Landing Zone Review", + "guid": "de0d5973-cd4c-4d21-a088-137f5e6c4cfd", + "link": "https://learn.microsoft.com/azure/expressroute/expressroute-howto-macsec", + "service": "ExpressRoute", + "services": [ + "ExpressRoute" + ], + "severity": "Medium", + "subcategory": "Encryption", + "text": "When you're using ExpressRoute Direct, configure MACsec in order to encrypt traffic at the layer-two level between the organization's routers and MSEE. The diagram shows this encryption in flow.", + "training": "https://learn.microsoft.com/training/modules/design-implement-azure-expressroute/", + "waf": "Security" + }, + { + "category": "Network Topology and Connectivity", + "checklist": "Azure Landing Zone Review", + "guid": "ed301d6e-872e-452e-9611-cc58b5a4b151", + "link": "https://learn.microsoft.com/azure/vpn-gateway/site-to-site-vpn-private-peering", + "service": "ExpressRoute", + "services": [ + "ExpressRoute", + "VPN" + ], + "severity": "Medium", + "subcategory": "Encryption", + "text": "For scenarios where MACsec isn't an option (for example, not using ExpressRoute Direct), use a VPN gateway to establish IPsec tunnels over ExpressRoute private peering.", + "training": "https://learn.microsoft.com/learn/paths/implement-network-security/", + "waf": "Security" + }, + { + "category": "Network Topology and Connectivity", + "checklist": "Azure Landing Zone Review", + "guid": "558fd772-49b8-4211-82df-27ee412e7f98", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/ready/azure-best-practices/plan-for-ip-addressing", + "service": "ExpressRoute", + "services": [ + "VNet", + "ACR" + ], + "severity": "High", + "subcategory": "IP plan", + "text": "Ensure no overlapping IP address spaces across Azure regions and on-premises locations are used.", + "training": "https://learn.microsoft.com/learn/paths/architect-network-infrastructure/", + "waf": "Security" + }, + { + "category": "Network Topology and Connectivity", + "checklist": "Azure Landing Zone Review", + "graph": "resources | where type == 'microsoft.network/virtualnetworks' | extend addressSpace = todynamic(properties.addressSpace) | extend addressPrefix = todynamic(properties.addressSpace.addressPrefixes) | mvexpand addressSpace | mvexpand addressPrefix | project name, id, location, resourceGroup, subscriptionId, cidr = addressPrefix | extend compliant = (cidr matches regex @'^(10\\\\.|172\\\\.(1[6-9]|2[0-9]|3[01])\\\\.|192\\\\.168\\\\.)') | project id, compliant, cidr", + "guid": "3f630472-2dd6-49c5-a5c2-622f54b69bad", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/ready/azure-best-practices/plan-for-ip-addressing", + "service": "VNet", + "services": [ + "VNet" + ], + "severity": "Medium", + "subcategory": "IP plan", + "text": "Use IP addresses from the address allocation ranges for private internets (RFC 1918).", + "training": "https://learn.microsoft.com/learn/paths/architect-network-infrastructure/", + "waf": "Security" + }, + { + "category": "Network Topology and Connectivity", + "checklist": "Azure Landing Zone Review", + "graph": "resources | where type == 'microsoft.network/virtualnetworks' | extend addressSpace = todynamic(properties.addressSpace) | extend addressPrefix = todynamic(properties.addressSpace.addressPrefixes) | mvexpand addressSpace | mvexpand addressPrefix | extend addressMask = split(addressPrefix,'/')[1] | extend compliant = addressMask > 16 | project name, id, subscriptionId, resourceGroup, addressPrefix, compliant", + "guid": "33aad5e8-c68e-41d7-9667-313b4f5664b5", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/ready/azure-best-practices/plan-for-ip-addressing", + "service": "VNet", + "services": [ + "VNet" + ], + "severity": "High", + "subcategory": "IP plan", + "text": "Ensure that IP address space isn't wasted, don't create unnecessarily large virtual networks (for example /16).", + "training": "https://learn.microsoft.com/learn/paths/architect-network-infrastructure/", + "waf": "Performance" + }, + { + "category": "Network Topology and Connectivity", + "checklist": "Azure Landing Zone Review", + "guid": "f348ef25-4c27-4d42-b8bb-ac7571559ab9", + "link": "https://learn.microsoft.com/azure/site-recovery/concepts-on-premises-to-azure-networking#retain-ip-addresses", + "service": "VNet", + "services": [ + "ASR", + "VNet" + ], + "severity": "High", + "subcategory": "IP plan", + "text": "Do not use overlapping IP address ranges for production and disaster recovery sites.", + "training": "https://learn.microsoft.com/learn/paths/az-104-manage-virtual-networks/", + "waf": "Reliability" + }, + { + "category": "Network Topology and Connectivity", + "checklist": "Azure Landing Zone Review", + "guid": "153e8908-ae28-4c84-a33b-6b7808b9fe5c", + "link": "https://learn.microsoft.com/azure/dns/private-dns-getstarted-portal", + "service": "DNS", + "services": [ + "DNS", + "VNet" + ], + "severity": "Medium", + "subcategory": "IP plan", + "text": "For environments where name resolution in Azure is all that's required, use Azure Private DNS for resolution with a delegated zone for name resolution (such as 'azure.contoso.com').", + "training": "https://learn.microsoft.com/learn/paths/az-104-manage-virtual-networks/", + "waf": "Operations" + }, + { + "category": "Network Topology and Connectivity", + "checklist": "Azure Landing Zone Review", + "guid": "41049d40-3a92-43c3-974d-00018ac6a9e0", + "link": "https://learn.microsoft.com/azure/dns/dns-private-resolver-overview", + "service": "DNS", + "services": [ + "VNet", + "DNS", + "ACR" + ], + "severity": "Medium", + "subcategory": "IP plan", + "text": "For environments where name resolution across Azure and on-premises is required and there is no existing enterprise DNS service like Active Directory, use Azure DNS Private Resolver to route DNS requests to Azure or to on-premises DNS servers.", + "training": "https://learn.microsoft.com/training/modules/intro-to-azure-dns-private-resolver/", + "waf": "Security" + }, + { + "category": "Network Topology and Connectivity", + "checklist": "Azure Landing Zone Review", + "guid": "1e6a83de-5de3-42c1-a924-81607d5d1e4e", + "link": "https://learn.microsoft.com/azure/virtual-network/virtual-networks-name-resolution-for-vms-and-role-instances", + "service": "DNS", + "services": [ + "DNS", + "VNet" + ], + "severity": "Low", + "subcategory": "IP plan", + "text": "Special workloads that require and deploy their own DNS (such as Red Hat OpenShift) should use their preferred DNS solution.", + "training": "https://learn.microsoft.com/training/courses/az-700t00", + "waf": "Operations" + }, + { + "category": "Network Topology and Connectivity", + "checklist": "Azure Landing Zone Review", + "guid": "614658d3-558f-4d77-849b-821112df27ee", + "link": "https://learn.microsoft.com/azure/dns/private-dns-autoregistration", + "service": "DNS", + "services": [ + "VM", + "DNS", + "VNet" + ], + "severity": "High", + "subcategory": "IP plan", + "text": "Enable auto-registration for Azure DNS to automatically manage the lifecycle of the DNS records for the virtual machines deployed within a virtual network.", + "training": "https://learn.microsoft.com/learn/paths/az-104-manage-virtual-networks/", + "waf": "Operations" + }, + { + "category": "Network Topology and Connectivity", + "checklist": "Azure Landing Zone Review", + "guid": "ee1ac551-c4d5-46cf-b035-d0a3c50d87ad", + "link": "https://learn.microsoft.com/azure/bastion/bastion-overview", + "service": "Bastion", + "services": [ + "Bastion" + ], + "severity": "Medium", + "subcategory": "Internet", + "text": "Use Azure Bastion to securely connect to your network.", + "training": "https://learn.microsoft.com/training/modules/intro-to-azure-bastion/", + "waf": "Security" + }, + { + "category": "Network Topology and Connectivity", + "checklist": "Azure Landing Zone Review", + "graph": "resources | where type=='microsoft.network/virtualnetworks' | project id,subnets=properties.subnets | mv-expand subnets | project id, subnetName = subnets.name, subnetPrefix = subnets.properties.addressPrefix | extend subnetPrefixLength = split(subnetPrefix, '/')[1] | where subnetName == 'AzureBastionSubnet' | extend compliant = (subnetPrefixLength <= 26) | distinct id, compliant", + "guid": "6eab9eb6-762b-485e-8ea8-15aa5dba0bd0", + "link": "https://learn.microsoft.com/azure/bastion/bastion-faq#subnet", + "service": "Bastion", + "services": [ + "Bastion", + "VNet" + ], + "severity": "Medium", + "subcategory": "Internet", + "text": "Use Azure Bastion in a subnet /26 or larger.", + "training": "https://learn.microsoft.com/training/modules/intro-to-azure-bastion/", + "waf": "Security" + }, + { + "category": "Network Topology and Connectivity", + "checklist": "Azure Landing Zone Review", + "guid": "1d7aa9b6-4704-4489-a804-2d88e79d17b7", + "link": "https://learn.microsoft.com/azure/web-application-firewall/afds/afds-overview", + "service": "WAF", + "services": [ + "ACR", + "FrontDoor", + "WAF", + "AzurePolicy" + ], + "severity": "Medium", + "subcategory": "Internet", + "text": "Use Azure Front Door and WAF policies to provide global protection across Azure regions for inbound HTTP/S connections to a landing zone.", + "training": "https://learn.microsoft.com/learn/paths/secure-application-delivery/", + "waf": "Security" + }, + { + "category": "Network Topology and Connectivity", + "checklist": "Azure Landing Zone Review", + "guid": "3b22a5a6-7e7a-48ed-9b30-e38c3f29812b", + "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/ag-overview", + "service": "WAF", + "services": [ + "AppGW", + "AzurePolicy", + "FrontDoor", + "WAF" + ], + "severity": "Low", + "subcategory": "Internet", + "text": "When using Azure Front Door and Azure Application Gateway to help protect HTTP/S apps, use WAF policies in Azure Front Door. Lock down Azure Application Gateway to receive traffic only from Azure Front Door.", + "training": "https://learn.microsoft.com/learn/paths/secure-application-delivery/", + "waf": "Security" + }, + { + "category": "Network Topology and Connectivity", + "checklist": "Azure Landing Zone Review", + "guid": "2363cefe-179b-4599-be0d-5973cd4cd21b", + "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/ag-overview", + "service": "WAF", + "services": [ + "VNet", + "WAF" + ], + "severity": "High", + "subcategory": "Internet", + "text": "When WAFs and other reverse proxies are required for inbound HTTP/S connections, deploy them within a landing-zone virtual network and together with the apps that they're protecting and exposing to the internet.", + "training": "https://learn.microsoft.com/learn/paths/architect-network-infrastructure/", + "waf": "Security" + }, + { + "category": "Network Topology and Connectivity", + "checklist": "Azure Landing Zone Review", + "guid": "088137f5-e6c4-4cfd-9e50-4547c2447ec6", + "link": "https://learn.microsoft.com/azure/ddos-protection/ddos-protection-reference-architectures", + "service": "VNet", + "services": [ + "VNet", + "DDoS" + ], + "severity": "High", + "subcategory": "Internet", + "text": "Use Azure DDoS Network or IP Protection plans to help protect Public IP Addresses endpoints within the virtual networks.", + "training": "https://learn.microsoft.com/learn/paths/secure-networking-infrastructure/", + "waf": "Security" + }, + { + "category": "Network Topology and Connectivity", + "checklist": "Azure Landing Zone Review", + "guid": "b034c01e-110b-463a-b36e-e3346e57f225", + "link": "https://learn.microsoft.com/azure/virtual-network/ip-services/default-outbound-access", + "service": "VNet", + "services": [], + "severity": "High", + "subcategory": "Internet", + "text": "Plan for how to manage your network outbound traffic configuration and strategy before the upcoming breaking change. On September 30, 2025, default outbound access for new deployments will be retired and only explicit access configurations will be allowed.", + "training": "https://learn.microsoft.com/training/modules/configure-virtual-networks/", + "waf": "Reliability" + }, + { + "category": "Network Topology and Connectivity", + "checklist": "Azure Landing Zone Review", + "guid": "b1c82a3f-2320-4dfa-8972-7ae4823c8930", + "link": "https://learn.microsoft.com/azure/ddos-protection/ddos-protection-reference-architectures", + "service": "VNet", + "services": [ + "DDoS" + ], + "severity": "High", + "subcategory": "Internet", + "text": "Add diagnostic settings to save DDoS related logs for all the protected public IP addresses (DDoS IP or Network Protection).", + "training": "https://learn.microsoft.com/learn/paths/secure-networking-infrastructure/", + "waf": "Security" + }, + { + "category": "Network Topology and Connectivity", + "checklist": "Azure Landing Zone Review", + "guid": "3c5a808d-c695-4c14-a63c-c7ab7a510e41", + "link": "https://github.com/Azure/Enterprise-Scale/wiki/ALZ-Policies#corp", + "service": "Policy", + "services": [ + "VM", + "AzurePolicy" + ], + "severity": "High", + "subcategory": "Internet", + "text": "Ensure there is a policy assignment to deny Public IP addresses directly tied to Virtual Machines. Use exclusions if public IPs are needed on specific VMs.", + "training": "https://learn.microsoft.com/training/modules/configure-azure-policy/", + "waf": "Security" + }, + { + "category": "Network Topology and Connectivity", + "checklist": "Azure Landing Zone Review", + "guid": "359c373e-7dd6-4162-9a36-4a907ecae48e", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/ready/azure-best-practices/connectivity-to-azure", + "service": "ExpressRoute", + "services": [ + "ExpressRoute", + "VPN", + "Backup" + ], + "severity": "Medium", + "subcategory": "Hybrid", + "text": "Use ExpressRoute as the primary connection to Azure. Use VPNs as a source of backup connectivity.", + "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", + "waf": "Performance" + }, + { + "category": "Network Topology and Connectivity", + "checklist": "Azure Landing Zone Review", + "description": "You can use AS-path prepending and connection weights to influence traffic from Azure to on-premises, and the full range of BGP attributes in your own routers to influence traffic from on-premises to Azure.", + "guid": "f29812b2-363c-4efe-879b-599de0d5973c", + "link": "https://learn.microsoft.com/azure/expressroute/expressroute-routing", + "service": "ExpressRoute", + "services": [ + "ExpressRoute" + ], + "severity": "Medium", + "subcategory": "Hybrid", + "text": "When you use multiple ExpressRoute circuits or multiple on-prem locations, use BGP attributes to optimize routing.", + "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", + "waf": "Reliability" + }, + { + "category": "Network Topology and Connectivity", + "checklist": "Azure Landing Zone Review", + "graph": "resources| where type == 'microsoft.network/virtualnetworkgateways'| where properties.gatewayType =~ 'vpn' or properties.gatewayType == 'ExpressRoute'| extend SKUName = properties.sku.name, SKUTier = properties.sku.tier, Type = properties.gatewayType| extend compliant = SKUTier !in ('Basic', 'Standard')| project name, id, subscriptionId, resourceGroup, compliant", + "guid": "d4cd21b0-8813-47f5-b6c4-cfd3e504547c", + "link": "https://learn.microsoft.com/azure/expressroute/expressroute-about-virtual-network-gateways?source=recommendations#gwsku", + "service": "ExpressRoute", + "services": [ + "ExpressRoute", + "VPN" + ], + "severity": "Medium", + "subcategory": "Hybrid", + "text": "Select the right SKU for the ExpressRoute/VPN gateways based on bandwidth and performance requirements.", + "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", + "waf": "Performance" + }, + { + "category": "Network Topology and Connectivity", + "checklist": "Azure Landing Zone Review", + "graph": "resources | where type=='microsoft.network/expressroutecircuits' | extend compliant = (tolower(sku.family) == 'metereddata' or tolower(sku.tier) == 'local') | distinct id,compliant", + "guid": "7025b442-f6e9-4af6-b11f-c9574916016f", + "link": "https://learn.microsoft.com/azure/expressroute/plan-manage-cost", + "service": "ExpressRoute", + "services": [ + "Cost", + "ExpressRoute" + ], + "severity": "High", + "subcategory": "Hybrid", + "text": "Ensure that you're using unlimited-data ExpressRoute circuits only if you reach the bandwidth that justifies their cost.", + "training": "https://learn.microsoft.com/training/modules/design-implement-azure-expressroute/", + "waf": "Cost" + }, + { + "category": "Network Topology and Connectivity", + "checklist": "Azure Landing Zone Review", + "graph": "resources | where type=='microsoft.network/connections' | where properties.connectionType == 'ExpressRoute' | project id, gwid=tostring(properties.virtualNetworkGateway1.id), circuitid=tostring(properties.peer.id) | join (resources | where type=='microsoft.network/expressroutecircuits' | project circuitid=tostring(id), circuitsku=sku.tier) on circuitid | project id=gwid, compliant = (circuitsku == 'Local') | summarize compliant=max(compliant) by id", + "guid": "f4e7926a-ec35-476e-a412-5dd17136bd62", + "link": "https://learn.microsoft.com/azure/expressroute/expressroute-faqs#expressroute-local", + "service": "ExpressRoute", + "services": [ + "Cost", + "ExpressRoute" + ], + "severity": "High", + "subcategory": "Hybrid", + "text": "Leverage the Local SKU of ExpressRoute to reduce the cost of your circuits, if your circuit peering location supports your Azure regions for the Local SKU.", + "training": "https://learn.microsoft.com/training/modules/design-implement-azure-expressroute/", + "waf": "Cost" + }, + { + "category": "Network Topology and Connectivity", + "checklist": "Azure Landing Zone Review", + "graph": "resources| where type == 'microsoft.network/virtualnetworkgateways'| where properties.gatewayType =~ 'vpn' or properties.gatewayType == 'ExpressRoute'| extend SKUName = properties.sku.name, SKUTier = properties.sku.tier, Type = properties.gatewayType| extend compliant = SKUTier contains 'AZ'| project name, id, subscriptionId, resourceGroup, Type, compliant", + "guid": "2447ec66-138a-4720-8f1c-e16ed301d6e8", + "link": "https://learn.microsoft.com/azure/expressroute/expressroute-about-virtual-network-gateways", + "service": "ExpressRoute", + "services": [ + "ExpressRoute" + ], + "severity": "Medium", + "subcategory": "Hybrid", + "text": "Deploy a zone-redundant ExpressRoute gateway in the supported Azure regions.", + "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", + "waf": "Reliability" + }, + { + "category": "Network Topology and Connectivity", + "checklist": "Azure Landing Zone Review", + "guid": "72e52e36-11cc-458b-9a4b-1511e43a58a9", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/ready/azure-best-practices/connectivity-to-azure", + "service": "ExpressRoute", + "services": [ + "ExpressRoute" + ], + "severity": "Medium", + "subcategory": "Hybrid", + "text": "For scenarios that require bandwidth higher than 10 Gbps or dedicated 10/100-Gbps ports, use ExpressRoute Direct.", + "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", + "waf": "Performance" + }, + { + "category": "Network Topology and Connectivity", + "checklist": "Azure Landing Zone Review", + "guid": "c2299c4d-7b57-4d0c-9555-62f2b3e4563a", + "link": "https://learn.microsoft.com/azure/expressroute/about-fastpath", + "service": "ExpressRoute", + "services": [ + "ExpressRoute" + ], + "severity": "Medium", + "subcategory": "Hybrid", + "text": "When low latency is required, or throughput from on-premises to Azure must be greater than 10 Gbps, enable FastPath to bypass the ExpressRoute gateway from the data path.", + "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", + "waf": "Performance" + }, + { + "category": "Network Topology and Connectivity", + "checklist": "Azure Landing Zone Review", + "graph": "resources | where type=='microsoft.network/virtualnetworkgateways' | where properties.gatewayType == 'Vpn' | extend compliant = (tolower(properties.sku.name) contains 'az') | distinct id, compliant", + "guid": "4d873974-8b66-42d6-b15f-512a65498f6d", + "link": "https://learn.microsoft.com/azure/vpn-gateway/create-zone-redundant-vnet-gateway", + "service": "VPN", + "services": [ + "VPN" + ], + "severity": "Medium", + "subcategory": "Hybrid", + "text": "Use zone-redundant VPN gateways to connect branches or remote locations to Azure (where available).", + "training": "https://learn.microsoft.com/training/modules/intro-to-azure-vpn-gateway/", + "waf": "Reliability" + }, + { + "category": "Network Topology and Connectivity", + "checklist": "Azure Landing Zone Review", + "guid": "45866df8-cf85-4ca9-bbe2-65ec1478919e", + "link": "https://learn.microsoft.com/azure/vpn-gateway/vpn-gateway-highlyavailable", + "service": "VPN", + "services": [ + "VPN" + ], + "severity": "Medium", + "subcategory": "Hybrid", + "text": "Use redundant VPN appliances on-premises (active/active or active/passive).", + "training": "https://learn.microsoft.com/training/modules/intro-to-azure-vpn-gateway/", + "waf": "Reliability" + }, + { + "category": "Network Topology and Connectivity", + "checklist": "Azure Landing Zone Review", + "guid": "718cb437-b060-2589-8856-2e93a5c6633b", + "link": "https://learn.microsoft.com/azure/expressroute/expressroute-erdirect-about", + "service": "ExpressRoute", + "services": [ + "Cost", + "ExpressRoute" + ], + "severity": "High", + "subcategory": "Hybrid", + "text": "If using ExpressRoute Direct, consider using ExpressRoute Local circuits to the local Azure regions to save costs.", + "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", + "waf": "Cost" + }, + { + "category": "Network Topology and Connectivity", + "checklist": "Azure Landing Zone Review", + "guid": "8042d88e-79d1-47b7-9b22-a5a67e7a8ed4", + "link": "https://learn.microsoft.com/azure/architecture/framework/services/networking/expressroute/reliability", + "service": "ExpressRoute", + "services": [ + "ExpressRoute" + ], + "severity": "Medium", + "subcategory": "Hybrid", + "text": "When traffic isolation or dedicated bandwidth is required, such as for separating production and nonproduction environments, use different ExpressRoute circuits. It will help you ensure isolated routing domains and alleviate noisy-neighbor risks.", + "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", + "waf": "Security" + }, + { + "category": "Network Topology and Connectivity", + "checklist": "Azure Landing Zone Review", + "guid": "b30e38c3-f298-412b-8363-cefe179b599d", + "link": "https://learn.microsoft.com/azure/expressroute/expressroute-monitoring-metrics-alerts", + "service": "ExpressRoute", + "services": [ + "Monitor", + "ExpressRoute" + ], + "severity": "Medium", + "subcategory": "Hybrid", + "text": "Monitor ExpressRoute availability and utilization using built-in Express Route Insights.", + "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", + "waf": "Operations" + }, + { + "category": "Network Topology and Connectivity", + "checklist": "Azure Landing Zone Review", + "guid": "5bf68dc9-325e-4873-bf88-f8214ef2e5d2", + "link": "https://learn.microsoft.com/azure/expressroute/how-to-configure-connection-monitor", + "service": "ExpressRoute", + "services": [ + "Monitor", + "ACR", + "NetworkWatcher" + ], + "severity": "Medium", + "subcategory": "Hybrid", + "text": "Use Connection Monitor for connectivity monitoring across the network, especially between on-premises and Azure.", + "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", + "waf": "Operations" + }, + { + "category": "Network Topology and Connectivity", + "checklist": "Azure Landing Zone Review", + "graph": "resources | where type=='microsoft.network/connections' | where properties.connectionType == 'ExpressRoute' | project cxId=id, gwId=tostring(properties.virtualNetworkGateway1.id), circuitId=tostring(properties.peer.id) | join (resources | where type=='microsoft.network/expressroutecircuits' | project circuitId=tostring(id), circuitLocation=tostring(properties.serviceProviderProperties.peeringLocation)) on circuitId | distinct gwId, circuitLocation | summarize countErLocations=count() by id=gwId | extend compliant = (countErLocations >= 2)", + "guid": "e0d5973c-d4cd-421b-8881-37f5e6c4cfd3", + "link": "https://learn.microsoft.com/azure/expressroute/designing-for-disaster-recovery-with-expressroute-privatepeering#need-for-redundant-connectivity-solution", + "service": "ExpressRoute", + "services": [ + "ExpressRoute" + ], + "severity": "Medium", + "subcategory": "Hybrid", + "text": "Use ExpressRoute circuits from different peering locations for redundancy.", + "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", + "waf": "Reliability" + }, + { + "category": "Network Topology and Connectivity", + "checklist": "Azure Landing Zone Review", + "guid": "cf3fe65c-fec0-495a-8edc-9675200f2add", + "link": "https://learn.microsoft.com/azure/expressroute/expressroute-howto-coexist-resource-manager", + "service": "ExpressRoute", + "services": [ + "ExpressRoute", + "VPN" + ], + "severity": "Medium", + "subcategory": "Hybrid", + "text": "Use site-to-site VPN as failover of ExpressRoute, if only using a single ExpressRoute circuit.", + "training": "https://learn.microsoft.com/training/modules/design-implement-azure-expressroute/", + "waf": "Reliability" + }, + { + "category": "Network Topology and Connectivity", + "checklist": "Azure Landing Zone Review", + "graph": "resources | where type=='microsoft.network/virtualnetworks' | project id,resourceGroup,name,subnets=properties.subnets | mv-expand subnets | project id,resourceGroup,name,subnetName=tostring(subnets.name),routeTableId=tostring(subnets.properties.routeTable.id) | where subnetName == 'GatewaySubnet' | join kind=leftouter (Resources | where type == 'microsoft.network/routetables' | project routeTableName=name,routeTableId=id, disableBgpRoutePropagation=properties.disableBgpRoutePropagation) on routeTableId | project id,compliant = (disableBgpRoutePropagation == False or isnull(disableBgpRoutePropagation))", + "guid": "72105cc8-aaea-4ee1-8c7a-ad25977afcaf", + "link": "https://learn.microsoft.com/azure/vpn-gateway/vpn-gateway-about-vpn-gateway-settings#gwsub", + "service": "ExpressRoute", + "services": [ + "Storage", + "VNet" + ], + "severity": "High", + "subcategory": "Hybrid", + "text": "If you are using a route table in the GatewaySubnet, make sure that gateway routes are propagated.", + "waf": "Reliability" + }, + { + "category": "Network Topology and Connectivity", + "checklist": "Azure Landing Zone Review", + "guid": "d581a947-69a2-4783-942e-9df3664324c8", + "link": "https://learn.microsoft.com/azure/expressroute/designing-for-high-availability-with-expressroute#active-active-connections", + "service": "ExpressRoute", + "services": [ + "ACR", + "ExpressRoute" + ], + "severity": "High", + "subcategory": "Hybrid", + "text": "If using ExpressRoute, your on-premises routing should be dynamic: in the event of a connection failure it should converge to the remaining connection of the circuit. Load should be shared across both connections ideally as active/active, although active/passive is supported too.", + "training": "https://learn.microsoft.com/training/modules/design-implement-azure-expressroute/", + "waf": "Reliability" + }, + { + "category": "Network Topology and Connectivity", + "checklist": "Azure Landing Zone Review", + "guid": "b258f058-b9f6-46cd-b28d-990106f0c3f8", + "link": "https://learn.microsoft.com/azure/expressroute/designing-for-high-availability-with-expressroute", + "service": "ExpressRoute", + "services": [ + "ExpressRoute" + ], + "severity": "Medium", + "subcategory": "Hybrid", + "text": "Ensure the two physical links of your ExpressRoute circuit are connected to two distinct edge devices in your network.", + "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", + "waf": "Reliability" + }, + { + "category": "Network Topology and Connectivity", + "checklist": "Azure Landing Zone Review", + "guid": "fe2a1b53-6fbd-4c67-b58a-85d7c7a0afcb", + "link": "https://learn.microsoft.com/azure/expressroute/expressroute-bfd", + "service": "ExpressRoute", + "services": [], + "severity": "Medium", + "subcategory": "Hybrid", + "text": "Ensure Bidirectional Forwarding Detection (BFD) is enabled and configured on customer or provider edge routing devices.", + "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", + "waf": "Reliability" + }, + { + "category": "Network Topology and Connectivity", + "checklist": "Azure Landing Zone Review", + "guid": "669b215a-ce43-4371-8f6f-11047f6490f1", + "link": "https://learn.microsoft.com/azure/expressroute/designing-for-disaster-recovery-with-expressroute-privatepeering", + "service": "ExpressRoute", + "services": [ + "ExpressRoute" + ], + "severity": "High", + "subcategory": "Hybrid", + "text": "Connect the ExpressRoute Gateway to two or more circuits from different peering locations for higher resiliency.", + "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", + "waf": "Reliability" + }, + { + "category": "Network Topology and Connectivity", + "checklist": "Azure Landing Zone Review", + "guid": "3f79ed00-203b-4c95-9efd-691505f5a1f9", + "link": "https://learn.microsoft.com/azure/vpn-gateway/vpn-gateway-howto-setup-alerts-virtual-network-gateway-log", + "service": "ExpressRoute", + "services": [ + "Monitor", + "VNet", + "ExpressRoute" + ], + "severity": "Medium", + "subcategory": "Hybrid", + "text": "Configure diagnostic logs and alerts for ExpressRoute virtual network gateway.", + "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", + "waf": "Operations" + }, + { + "category": "Network Topology and Connectivity", + "checklist": "Azure Landing Zone Review", + "guid": "5234c93f-b651-41dd-80c1-234177b91ced", + "link": "https://learn.microsoft.com/azure/expressroute/virtual-network-connectivity-guidance", + "service": "ExpressRoute", + "services": [ + "VNet", + "ExpressRoute" + ], + "severity": "Medium", + "subcategory": "Hybrid", + "text": "Do not use ExpressRoute circuits for VNet-to-VNet communication.", + "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", + "waf": "Performance" + }, + { + "category": "Network Topology and Connectivity", + "checklist": "Azure Landing Zone Review", + "guid": "8ac6a9e0-1e6a-483d-b5de-32c199248160", + "link": "https://learn.microsoft.com/azure/virtual-wan/virtual-wan-about", + "service": "N/A", + "services": [ + "ACR" + ], + "severity": "Low", + "subcategory": "Hybrid", + "text": "Do not send Azure traffic to hybrid locations for inspection. Instead, follow the principle 'traffic in Azure stays in Azure' so that communication across resources in Azure occurs via the Microsoft backbone network.", + "waf": "Performance" + }, + { + "category": "Network Topology and Connectivity", + "checklist": "Azure Landing Zone Review", + "guid": "e6c4cfd3-e504-4547-a244-7ec66138a720", + "link": "https://learn.microsoft.com/azure/firewall/overview", + "service": "Firewall", + "services": [ + "Firewall" + ], + "severity": "High", + "subcategory": "Firewall", + "text": "Use Azure Firewall to govern Azure outbound traffic to the internet, non-HTTP/S inbound connections, and East/West traffic filtering (if the organization requires it).", + "training": "https://learn.microsoft.com/learn/paths/secure-networking-infrastructure/", + "waf": "Security" + }, + { + "category": "Network Topology and Connectivity", + "checklist": "Azure Landing Zone Review", + "guid": "5a4b1511-e43a-458a-ac22-99c4d7b57d0c", + "link": "https://learn.microsoft.com/azure/firewall-manager/policy-overview", + "service": "Firewall", + "services": [ + "RBAC", + "ACR", + "Firewall", + "AzurePolicy" + ], + "severity": "Medium", + "subcategory": "Firewall", + "text": "Create a global Azure Firewall policy to govern security posture across the global network environment and assign it to all Azure Firewall instances. Allow for granular policies to meet requirements of specific regions by delegating incremental firewall policies to local security teams via Azure role-based access control.", + "training": "https://learn.microsoft.com/learn/paths/secure-networking-infrastructure/", + "waf": "Security" + }, + { + "category": "Network Topology and Connectivity", + "checklist": "Azure Landing Zone Review", + "guid": "655562f2-b3e4-4563-a4d8-739748b662d6", + "link": "https://learn.microsoft.com/azure/firewall-manager/deploy-trusted-security-partner", + "service": "Firewall", + "services": [ + "Firewall" + ], + "severity": "Low", + "subcategory": "Firewall", + "text": "Configure supported partner SaaS security providers within Firewall Manager if the organization wants to use such solutions to help protect outbound connections.", + "training": "https://learn.microsoft.com/learn/paths/secure-networking-infrastructure/", + "waf": "Security" + }, + { + "category": "Network Topology and Connectivity", + "checklist": "Azure Landing Zone Review", + "graph": "resources | where type=='microsoft.network/firewallpolicies' | extend compliant = (properties.dnsSettings.enableProxy == true) | distinct id,compliant", + "guid": "14d99880-2f88-47e8-a134-62a7d85c94af", + "link": "https://learn.microsoft.com/azure/firewall/fqdn-filtering-network-rules", + "service": "Firewall", + "services": [ + "DNS", + "Firewall" + ], + "severity": "High", + "subcategory": "Firewall", + "text": "Use application rules to filter outbound traffic on destination host name for supported protocols. Use FQDN-based network rules and Azure Firewall with DNS proxy to filter egress traffic to the Internet over other protocols.", + "training": "https://learn.microsoft.com/learn/paths/secure-networking-infrastructure/", + "waf": "Security" + }, + { + "category": "Network Topology and Connectivity", + "checklist": "Azure Landing Zone Review", + "graph": "resources | where type=='microsoft.network/firewallpolicies' | extend compliant = (properties.sku.tier == 'Premium') | distinct id,compliant", + "guid": "c10d51ef-f999-455d-bba0-5c90ece07447", + "link": "https://learn.microsoft.com/azure/firewall/premium-features", + "service": "Firewall", + "services": [ + "Firewall" + ], + "severity": "High", + "subcategory": "Firewall", + "text": "Use Azure Firewall Premium to enable additional security features.", + "training": "https://learn.microsoft.com/training/modules/introduction-azure-firewall/", + "waf": "Security" + }, + { + "category": "Network Topology and Connectivity", + "checklist": "Azure Landing Zone Review", + "graph": "resources | where type=='microsoft.network/firewallpolicies' | extend compliant = (properties.threatIntelMode == 'Deny') | distinct id,compliant", + "guid": "e9c8f584-6d5e-473b-8dc5-acc9fbaab4e3", + "link": "https://learn.microsoft.com/azure/firewall/premium-features#idps-signature-rules", + "service": "Firewall", + "services": [ + "Firewall" + ], + "severity": "High", + "subcategory": "Firewall", + "text": "Configure Azure Firewall Threat Intelligence mode to Alert and Deny for additional protection.", + "waf": "Security" + }, + { + "category": "Network Topology and Connectivity", + "checklist": "Azure Landing Zone Review", + "graph": "resources | where type=='microsoft.network/firewallpolicies' | extend compliant = (properties.intrusionDetection.mode == 'Deny') | project id, compliant", + "guid": "b9d0dff5-bdd4-4cd8-88ed-5811610b2b2c", + "link": "https://learn.microsoft.com/azure/firewall/premium-features#idps", + "service": "Firewall", + "services": [ + "Firewall" + ], + "severity": "High", + "subcategory": "Firewall", + "text": "Configure Azure Firewall IDPS mode to Deny for additional protection.", + "training": "https://learn.microsoft.com/training/modules/introduction-azure-firewall/", + "waf": "Security" + }, + { + "category": "Network Topology and Connectivity", + "checklist": "Azure Landing Zone Review", + "graph": "resources | where type=='microsoft.network/virtualnetworks' | project id,resourceGroup,name,subnets=properties.subnets | mv-expand subnets | project id,name,subnetId=tostring(subnets.id), subnetName=tostring(subnets.name),subnetRT=subnets.properties.routeTable.id | where not (subnetName in ('GatewaySubnet', 'AzureFirewallSubnet', 'RouteServerSubnet', 'AzureBastionSubnet')) | extend hasRT = isnotnull(subnetRT) | distinct id, hasRT, subnetId | join kind=fullouter (resources | where type == 'microsoft.network/virtualnetworks' | mvexpand properties.virtualNetworkPeerings | extend isVWAN=(tolower(split(properties_virtualNetworkPeerings.name, '_')[0]) == 'remotevnettohubpeering') | mv-expand properties.subnets | project id, isVWAN, name, subnetId=tostring(properties_subnets.id), subnetName=tostring(properties_subnets.name) | summarize PeeredToVWAN=max(isVWAN) by id, subnetId | project id, subnetId, isVWANpeer = (PeeredToVWAN == true)) on subnetId | project id=iff(isnotempty(id), id, id1), subnetId=iff(isnotempty(subnetId), subnetId, subnetId1), hasRT, isVWANpeer | extend compliant = (hasRT==true or isVWANpeer==true) | distinct id, subnetId, compliant", + "guid": "a3784907-9836-4271-aafc-93535f8ec08b", + "link": "https://learn.microsoft.com/azure/virtual-network/virtual-networks-udr-overview", + "service": "Firewall", + "services": [ + "Storage", + "Firewall", + "NVA", + "VNet", + "VWAN" + ], + "severity": "High", + "subcategory": "Firewall", + "text": "For subnets in VNets not connected to Virtual WAN, attach a route table so that Internet traffic is redirected to Azure Firewall or a Network Virtual Appliance.", + "waf": "Security" + }, + { + "category": "Network Topology and Connectivity", + "checklist": "Azure Landing Zone Review", + "guid": "715d833d-4708-4527-90ac-1b142c7045ba", + "link": "https://learn.microsoft.com/azure/firewall/firewall-structured-logs", + "service": "Firewall", + "services": [ + "Storage", + "Firewall" + ], + "severity": "Medium", + "subcategory": "Firewall", + "text": "Add diagnostic settings to save logs, using the Resource Specific destination table, for all Azure Firewall deployments.", + "training": "https://learn.microsoft.com/learn/paths/secure-networking-infrastructure/", + "waf": "Operations" + }, + { + "category": "Network Topology and Connectivity", + "checklist": "Azure Landing Zone Review", + "guid": "e960fc6b-4ab2-4db6-9609-3745135f9ffa", + "link": "https://learn.microsoft.com/azure/firewall-manager/migrate-to-policy", + "service": "Firewall", + "services": [ + "AzurePolicy", + "Firewall" + ], + "severity": "Important", + "subcategory": "Firewall", + "text": "Migrate from Azure Firewall Classic rules (if exist) to Firewall Policy.", + "training": "https://learn.microsoft.com/learn/paths/secure-networking-infrastructure/", + "waf": "Operations" + }, + { + "category": "Network Topology and Connectivity", + "checklist": "Azure Landing Zone Review", + "graph": "resources | where type=='microsoft.network/virtualnetworks' | project id,subnets=properties.subnets | mv-expand subnets | project id, subnetName = subnets.name, subnetPrefix = subnets.properties.addressPrefix | extend subnetPrefixLength = split(subnetPrefix, '/')[1] | where subnetName == 'AzureFirewallSubnet' | extend compliant = (subnetPrefixLength == 26) | distinct id, compliant", + "guid": "22d6419e-b627-4d95-9e7d-019fa759387f", + "link": "https://learn.microsoft.com/azure/firewall/firewall-faq#why-does-azure-firewall-need-a--26-subnet-size", + "service": "Firewall", + "services": [ + "VNet", + "Firewall" + ], + "severity": "High", + "subcategory": "Segmentation", + "text": "Use a /26 prefix for your Azure Firewall subnets.", + "training": "https://learn.microsoft.com/training/modules/introduction-azure-firewall/", + "waf": "Security" + }, + { + "category": "Network Topology and Connectivity", + "checklist": "Azure Landing Zone Review", + "guid": "828cec2e-af6c-40c2-8fa2-1b681ee63eb7", + "link": "https://learn.microsoft.com/azure/firewall-manager/rule-hierarchy", + "service": "Firewall", + "services": [ + "AzurePolicy" + ], + "severity": "Medium", + "subcategory": "Firewall", + "text": "Arrange rules within the firewall policy into Rule Collection Groups and Rule Collections and based on their frequency of use.", + "training": "https://learn.microsoft.com/training/modules/intro-to-azure-firewall-manager/", + "waf": "Performance" + }, + { + "category": "Network Topology and Connectivity", + "checklist": "Azure Landing Zone Review", + "guid": "0da83bb1-2f39-49af-b5c9-835fc455e3d1", + "link": "https://learn.microsoft.com/azure/firewall/ip-groups", + "service": "Firewall", + "services": [ + "Storage" + ], + "severity": "Medium", + "subcategory": "Firewall", + "text": "Use IP Groups or IP prefixes to reduce number of IP table rules.", + "waf": "Performance" + }, + { + "category": "Network Topology and Connectivity", + "checklist": "Azure Landing Zone Review", + "guid": "c44c6f0e-1642-4a61-a17b-0922f835c93a", + "link": "https://learn.microsoft.com/azure/firewall/tutorial-firewall-dnat", + "service": "Firewall", + "services": [], + "severity": "Medium", + "subcategory": "Firewall", + "text": "Do not use wildcards as a source IP for DNATS, such as * or any, you should specify source IPs for incoming DNATs.", + "training": "https://learn.microsoft.com/training/modules/introduction-to-azure-virtual-networks/", + "waf": "Performance" + }, + { + "category": "Network Topology and Connectivity", + "checklist": "Azure Landing Zone Review", + "guid": "7371dc21-251a-47a3-af14-6e01b9da4757", + "link": "https://learn.microsoft.com/azure/firewall/integrate-with-nat-gateway", + "service": "Firewall", + "services": [ + "Monitor" + ], + "severity": "Medium", + "subcategory": "Firewall", + "text": "Prevent SNAT Port exhaustion by monitoring SNAT port usage, evaluating NAT Gateway settings, and ensuring seamless failover. If the port count approaches the limit, it’s a sign that SNAT exhaustion might be imminent.", + "training": "https://learn.microsoft.com/training/modules/introduction-to-azure-virtual-networks/", + "waf": "Performance" + }, + { + "category": "Network Topology and Connectivity", + "checklist": "Azure Landing Zone Review", + "guid": "346840b8-1064-496e-8396-4b1340172d52", + "link": "https://learn.microsoft.com/azure/firewall/premium-features#tls-inspection", + "service": "Firewall", + "services": [ + "Firewall" + ], + "severity": "High", + "subcategory": "Firewall", + "text": "If you are using Azure Firewall Premium, enable TLS Inspection.", + "waf": "Performance" + }, + { + "category": "Network Topology and Connectivity", + "checklist": "Azure Landing Zone Review", + "guid": "39990a13-915c-45f9-a2d3-562d7d6c4b7c", + "link": "https://learn.microsoft.com/azure/firewall/premium-features#web-categories", + "service": "Firewall", + "services": [ + "ServiceBus" + ], + "severity": "Low", + "subcategory": "Firewall", + "text": "Use web categories to allow or deny outbound access to specific topics.", + "waf": "Performance" + }, + { + "category": "Network Topology and Connectivity", + "checklist": "Azure Landing Zone Review", + "guid": "6eff7e6c-6c4a-43d7-be3f-6641c2cb3d4a", + "link": "https://learn.microsoft.com/azure/architecture/example-scenario/gateway/application-gateway-before-azure-firewall", + "service": "Firewall", + "services": [], + "severity": "Medium", + "subcategory": "Firewall", + "text": "As part of your TLS inspection, plan for receiving traffic from Azure App Gateways for inspection.", + "training": "https://learn.microsoft.com/training/modules/configure-azure-application-gateway/", + "waf": "Performance" + }, + { + "category": "Network Topology and Connectivity", + "checklist": "Azure Landing Zone Review", + "guid": "94f3eede-9aa3-4088-92a3-bb9a56509fad", + "link": "https://learn.microsoft.com/azure/firewall/dns-details", + "service": "Firewall", + "services": [ + "DNS", + "Firewall" + ], + "severity": "Medium", + "subcategory": "Firewall", + "text": "Enable Azure Firewall DNS proxy configuration.", + "training": "https://learn.microsoft.com/training/courses/az-700t00/", + "waf": "Security" + }, + { + "category": "Network Topology and Connectivity", + "checklist": "Azure Landing Zone Review", + "guid": "1dc04554-dece-4ffb-a49e-5c683e09f8da", + "link": "https://learn.microsoft.com/azure/firewall/firewall-diagnostics", + "service": "Firewall", + "services": [ + "Monitor", + "Firewall" + ], + "severity": "High", + "subcategory": "Firewall", + "text": "Integrate Azure Firewall with Azure Monitor and enable diagnostic logging to store and analyze firewall logs.", + "training": "https://learn.microsoft.com/training/courses/az-700t00/", + "waf": "Operations" + }, + { + "category": "Network Topology and Connectivity", + "checklist": "Azure Landing Zone Review", + "guid": "64e7000e-3c06-485e-b455-ced7f454cba3", + "link": "https://learn.microsoft.com/azure/well-architected/service-guides/azure-firewall", + "service": "Firewall", + "services": [ + "Backup" + ], + "severity": "Low", + "subcategory": "Firewall", + "text": "Implement backups for your firewall rules", + "training": "https://learn.microsoft.com/training/courses/az-104t00/", + "waf": "Operations" + }, + { + "category": "Network Topology and Connectivity", + "checklist": "Azure Landing Zone Review", + "guid": "d301d6e8-72e5-42e3-911c-c58b5a4b1511", + "link": "https://learn.microsoft.com/azure/virtual-network/vnet-integration-for-azure-services", + "service": "App Gateway", + "services": [ + "VNet" + ], + "severity": "High", + "subcategory": "PaaS", + "text": "Do not disrupt control-plane communication for Azure PaaS services injected into a virtual networks, such as with a 0.0.0.0/0 route or an NSG rule that blocks control plane traffic.", + "training": "https://learn.microsoft.com/learn/paths/implement-network-security/?source=learn", + "waf": "Security" + }, + { + "category": "Network Topology and Connectivity", + "checklist": "Azure Landing Zone Review", + "guid": "e43a58a9-c229-49c4-b7b5-7d0c655562f2", + "link": "https://learn.microsoft.com/azure/private-link/private-link-overview", + "services": [ + "PrivateLink" + ], + "severity": "Medium", + "subcategory": "PaaS", + "text": "Use Private Link, where available, for shared Azure PaaS services.", + "training": "https://learn.microsoft.com/learn/paths/secure-application-delivery/", + "waf": "Security" + }, + { + "category": "Network Topology and Connectivity", + "checklist": "Azure Landing Zone Review", + "guid": "b3e4563a-4d87-4397-98b6-62d6d15f512a", + "link": "https://learn.microsoft.com/azure/private-link/private-endpoint-overview", + "service": "ExpressRoute", + "services": [ + "ExpressRoute", + "PrivateLink" + ], + "severity": "Medium", + "subcategory": "PaaS", + "text": "Access Azure PaaS services from on-premises via private endpoints and ExpressRoute private peering. This method avoids transiting over the public internet.", + "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", + "waf": "Security" + }, + { + "category": "Network Topology and Connectivity", + "checklist": "Azure Landing Zone Review", + "graph": "resources | where type =~ 'microsoft.network/virtualnetworks' | project id,resourceGroup,name,subnets = properties.subnets | mv-expand subnets | project id = subnets.id, resourceGroup, VNet = name, serviceEndpoints = subnets.properties.serviceEndpoints, compliant = (isnull(subnets.properties.serviceEndpoints) or array_length(subnets.properties.serviceEndpoints) == 0) | order by compliant asc", + "guid": "4704489a-8042-4d88-b79d-17b73b22a5a6", + "link": "https://learn.microsoft.com/azure/virtual-network/virtual-network-service-endpoints-overview", + "service": "VNet", + "services": [ + "VNet" + ], + "severity": "High", + "subcategory": "PaaS", + "text": "Don't enable virtual network service endpoints by default on all subnets.", + "training": "https://learn.microsoft.com/learn/paths/implement-network-security/?source=learn", + "waf": "Security" + }, + { + "category": "Network Topology and Connectivity", + "checklist": "Azure Landing Zone Review", + "guid": "7e7a8ed4-b30e-438c-9f29-812b2363cefe", + "link": "azure/private-link/inspect-traffic-with-azure-firewall", + "service": "Firewall", + "services": [ + "DNS", + "NVA", + "Firewall", + "PrivateLink" + ], + "severity": "Medium", + "subcategory": "PaaS", + "text": "Filter egress traffic to Azure PaaS services using FQDNs instead of IP addresses in Azure Firewall or an NVA to prevent data exfiltration. If using Private Link you can block all FQDNs, otherwise allow only the required PaaS services.", + "training": "https://learn.microsoft.com/learn/paths/implement-network-security/?source=learn", + "waf": "Security" + }, + { + "category": "Network Topology and Connectivity", + "checklist": "Azure Landing Zone Review", + "graph": "resources | where type=='microsoft.network/virtualnetworks' | project id,subnets=properties.subnets | mv-expand subnets | project id, subnetName = subnets.name, subnetPrefix = subnets.properties.addressPrefix | extend subnetPrefixLength = split(subnetPrefix, '/')[1] | where subnetName == 'GatewaySubnet' | extend compliant = (subnetPrefixLength <= 27) | distinct id, compliant", + "guid": "f2aad7e3-bb03-4adc-8606-4123d342a917", + "link": "https://learn.microsoft.com/azure/expressroute/expressroute-howto-add-gateway-resource-manager#add-a-gateway", + "service": "ExpressRoute", + "services": [ + "ExpressRoute", + "VNet", + "VPN" + ], + "severity": "High", + "subcategory": "Segmentation", + "text": "Use at least a /27 prefix for your Gateway subnets.", + "waf": "Security" + }, + { + "category": "Network Topology and Connectivity", + "checklist": "Azure Landing Zone Review", + "graph": "resources | where type=='microsoft.network/networksecuritygroups' | mvexpand properties.securityRules | project id,name,ruleAction=properties_securityRules.properties.access,rulePriority=properties_securityRules.properties.priority,ruleDst=properties_securityRules.properties.destinationAddressPrefix,ruleSrc=properties_securityRules.properties.sourceAddressPrefix,ruleProt=properties_securityRules.properties.protocol,ruleDirection=properties_securityRules.properties.direction,rulePort=properties_securityRules.properties.destinationPortRange | summarize StarDenies=countif(ruleAction=='Deny' and ruleDst=='*' and ruleSrc=='*' and ruleProt=='*' and rulePort=='*') by id,tostring(ruleDirection) | where ruleDirection == 'Inbound' | project id,compliant=(StarDenies>0) | union (resources | where type=='microsoft.network/networksecuritygroups' | where array_length(properties.securityRules)==0 | extend compliant=false | project id,compliant)", + "guid": "11deb39d-8299-4e47-bbe0-0fb5a36318a8", + "link": "https://learn.microsoft.com/azure/virtual-network/service-tags-overview#available-service-tags", + "service": "NSG", + "services": [ + "VNet" + ], + "severity": "High", + "subcategory": "Segmentation", + "text": "Don't rely on the NSG inbound default rules using the VirtualNetwork service tag to limit connectivity.", + "waf": "Security" + }, + { + "category": "Network Topology and Connectivity", + "checklist": "Azure Landing Zone Review", + "guid": "c2447ec6-6138-4a72-80f1-ce16ed301d6e", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/ready/azure-best-practices/plan-for-landing-zone-network-segmentation", + "services": [ + "VNet" + ], + "severity": "Medium", + "subcategory": "Segmentation", + "text": "Delegate subnet creation to the landing zone owner.", + "training": "https://learn.microsoft.com/learn/paths/implement-resource-mgmt-security/", + "waf": "Security" + }, + { + "category": "Network Topology and Connectivity", + "checklist": "Azure Landing Zone Review", + "guid": "872e52e3-611c-4c58-a5a4-b1511e43a58a", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/ready/azure-best-practices/plan-for-landing-zone-network-segmentation", + "service": "NSG", + "services": [ + "ACR", + "VNet" + ], + "severity": "Medium", + "subcategory": "Segmentation", + "text": "Use NSGs to help protect traffic across subnets, as well as east/west traffic across the platform (traffic between landing zones).", + "training": "https://learn.microsoft.com/learn/paths/implement-network-security/", + "waf": "Security" + }, + { + "category": "Network Topology and Connectivity", + "checklist": "Azure Landing Zone Review", + "guid": "a4d87397-48b6-462d-9d15-f512a65498f6", + "link": "https://learn.microsoft.com/azure/virtual-network/network-security-group-how-it-works", + "service": "NSG", + "services": [ + "Entra", + "NVA", + "VNet" + ], + "severity": "Medium", + "subcategory": "Segmentation", + "text": "Use NSGs and application security groups to micro-segment traffic within the landing zone and avoid using a central NVA to filter traffic flows.", + "training": "https://learn.microsoft.com/learn/paths/implement-network-security/", + "waf": "Security" + }, + { + "category": "Network Topology and Connectivity", + "checklist": "Azure Landing Zone Review", + "guid": "dfe237de-143b-416c-91d7-aa9b64704489", + "link": "https://learn.microsoft.com/azure/network-watcher/vnet-flow-logs-overview", + "service": "NSG", + "services": [ + "VNet", + "NetworkWatcher" + ], + "severity": "Medium", + "subcategory": "Segmentation", + "text": "Enable VNet Flow Logs and feed them into Traffic Analytics to gain insights into internal and external traffic flows.", + "training": "https://learn.microsoft.com/learn/modules/design-implement-network-monitoring/", + "waf": "Security" + }, + { + "category": "Network Topology and Connectivity", + "checklist": "Azure Landing Zone Review", + "graph": "resources | where type == 'microsoft.network/networksecuritygroups' | project id, rules = array_length(properties.securityRules) | project id, compliant = (rules < 900)", + "guid": "0390417d-53dc-44d9-b3f4-c8832f359b41", + "link": "https://learn.microsoft.com/azure/azure-resource-manager/management/azure-subscription-service-limits", + "service": "NSG", + "services": [ + "VNet" + ], + "severity": "Medium", + "subcategory": "Segmentation", + "text": "Do not implement more than 900 NSG rules per NSG, due to the limit of 1000 rules.", + "training": "https://learn.microsoft.com/azure/virtual-network/network-security-group-how-it-works", + "waf": "Reliability" + }, + { + "category": "Network Topology and Connectivity", + "checklist": "Azure Landing Zone Review", + "guid": "412e7f98-3f63-4047-82dd-69c5b5c2622f", + "link": "https://learn.microsoft.com/azure/virtual-wan/scenario-any-to-any", + "service": "VWAN", + "services": [ + "VWAN" + ], + "severity": "Medium", + "subcategory": "Virtual WAN", + "text": "Use Virtual WAN if your scenario is explicitly described in the list of Virtual WAN routing designs.", + "training": "https://learn.microsoft.com/learn/modules/introduction-azure-virtual-wan/", + "waf": "Operations" + }, + { + "category": "Network Topology and Connectivity", + "checklist": "Azure Landing Zone Review", + "guid": "54b69bad-33aa-4d5e-ac68-e1d76667313b", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/ready/azure-best-practices/virtual-wan-network-topology#virtual-wan-network-design-recommendationst", + "service": "VWAN", + "services": [ + "ACR", + "VWAN" + ], + "severity": "Medium", + "subcategory": "Virtual WAN", + "text": "Use a Virtual WAN hub per Azure region to connect multiple landing zones together across Azure regions via a common global Azure Virtual WAN.", + "training": "https://learn.microsoft.com/training/modules/introduction-azure-virtual-wan/", + "waf": "Performance" + }, + { + "category": "Network Topology and Connectivity", + "checklist": "Azure Landing Zone Review", + "graph": "resources | where type=='microsoft.network/virtualhubs' | extend compliant = isnotnull(properties.azureFirewall.id) | project id, compliant", + "guid": "7d5d1e4e-6146-458d-9558-fd77249b8211", + "link": "https://learn.microsoft.com/azure/virtual-wan/howto-firewall", + "service": "VWAN", + "services": [ + "VWAN", + "Firewall" + ], + "severity": "Medium", + "subcategory": "Virtual WAN", + "text": "For outbound Internet traffic protection and filtering, deploy Azure Firewall in secured hubs.", + "training": "https://learn.microsoft.com/learn/paths/secure-networking-infrastructure/", + "waf": "Security" + }, + { + "category": "Network Topology and Connectivity", + "checklist": "Azure Landing Zone Review", + "guid": "6667313b-4f56-464b-9e98-4a859c773e7d", + "link": "https://learn.microsoft.com/azure/virtual-wan/migrate-from-hub-spoke-topology", + "service": "VWAN", + "services": [ + "VWAN" + ], + "severity": "Medium", + "subcategory": "Virtual WAN", + "text": "Ensure that your virtual WAN network architecture aligns to an identified architecture scenario.", + "training": "https://learn.microsoft.com/training/modules/introduction-azure-virtual-wan/", + "waf": "Reliability" + }, + { + "category": "Network Topology and Connectivity", + "checklist": "Azure Landing Zone Review", + "guid": "261623a7-65a9-417e-8f34-8ef254c27d42", + "link": "https://learn.microsoft.com/azure/virtual-wan/azure-monitor-insights", + "service": "VWAN", + "services": [ + "Monitor", + "VWAN" + ], + "severity": "Medium", + "subcategory": "Virtual WAN", + "text": "Use Azure Monitor Insights for Virtual WAN to monitor the end-to-end topology of the Virtual WAN, status, and key metrics.", + "training": "https://learn.microsoft.com/training/modules/introduction-azure-virtual-wan/", + "waf": "Operations" + }, + { + "category": "Network Topology and Connectivity", + "checklist": "Azure Landing Zone Review", + "guid": "727c77e1-b9aa-4a37-a024-129d042422c1", + "link": "https://learn.microsoft.com/azure/virtual-wan/virtual-wan-faq#is-branch-to-branch-connectivity-allowed-in-virtual-wan", + "service": "VWAN", + "services": [ + "VWAN" + ], + "severity": "Medium", + "subcategory": "Virtual WAN", + "text": "Do not disable branch-to-branch traffic in Virtual WAN, unless these flows should be explicitly blocked.", + "training": "https://learn.microsoft.com/training/modules/introduction-azure-virtual-wan/", + "waf": "Reliability" + }, + { + "category": "Network Topology and Connectivity", + "checklist": "Azure Landing Zone Review", + "guid": "d49ac006-6670-4bc9-9948-d3e0a3a94f4d", + "link": "https://learn.microsoft.com/azure/virtual-wan/about-virtual-hub-routing-preference", + "service": "VWAN", + "services": [ + "VWAN", + "ExpressRoute", + "VPN" + ], + "severity": "Medium", + "subcategory": "Virtual WAN", + "text": "Use AS-Path as hub routing preference, since it is more flexible than ExpressRoute or VPN.", + "training": "https://learn.microsoft.com/training/modules/introduction-azure-virtual-wan/", + "waf": "Reliability" + }, + { + "category": "Network Topology and Connectivity", + "checklist": "Azure Landing Zone Review", + "guid": "2586b854-237e-47f1-84a1-d45d4cd2310d", + "link": "https://learn.microsoft.com/azure/virtual-wan/about-virtual-hub-routing#labels", + "service": "VWAN", + "services": [ + "VWAN" + ], + "severity": "Medium", + "subcategory": "Virtual WAN", + "text": "Configure label-based propagation in Virtual WAN, otherwise connectivity between virtual hubs will be impaired.", + "training": "https://learn.microsoft.com/training/modules/introduction-azure-virtual-wan/", + "waf": "Reliability" + }, + { + "category": "Network Topology and Connectivity", + "checklist": "Azure Landing Zone Review", + "guid": "9c75dfef-573c-461c-a698-68598595581a", + "link": "https://learn.microsoft.com/azure/virtual-wan/virtual-wan-faq#what-is-the-recommended-hub-address-space-during-hub-creation", + "service": "VWAN", + "services": [ + "VWAN" + ], + "severity": "High", + "subcategory": "Virtual WAN", + "text": "Assign at least a /23 prefix to virtual hubs to ensure enough IP space is available.", + "training": "https://learn.microsoft.com/training/modules/introduction-azure-virtual-wan/", + "waf": "Reliability" + }, + { + "category": "Governance", + "checklist": "Azure Landing Zone Review", + "guid": "5c986cb2-9131-456a-8247-6e49f541acdc", + "link": "https://learn.microsoft.com/azure/governance/policy/overview", + "service": "Policy", + "services": [ + "AzurePolicy" + ], + "severity": "High", + "subcategory": "Governance", + "text": "Leverage Azure Policy strategically, define controls for your environment, using Policy Initiatives to group related policies.", + "waf": "Security" + }, + { + "category": "Governance", + "checklist": "Azure Landing Zone Review", + "guid": "d8a2adb1-17d6-4326-af62-5ca44e5695f2", + "link": "https://learn.microsoft.com/azure/governance/policy/overview", + "service": "Policy", + "services": [ + "RBAC", + "AzurePolicy" + ], + "severity": "Medium", + "subcategory": "Governance", + "text": "Map regulatory and compliance requirements to Azure Policy definitions and Azure role assignments.", + "waf": "Security" + }, + { + "category": "Governance", + "checklist": "Azure Landing Zone Review", + "guid": "223ace8c-b123-408c-a501-7f154e3ab369", + "link": "https://learn.microsoft.com/azure/governance/policy/overview", + "service": "Policy", + "services": [ + "AzurePolicy", + "Subscriptions" + ], + "severity": "Medium", + "subcategory": "Governance", + "text": "Establish Azure Policy definitions at the intermediate root management group so that they can be assigned at inherited scopes.", + "waf": "Security" + }, + { + "category": "Governance", + "checklist": "Azure Landing Zone Review", + "guid": "3829e7e3-1618-4368-9a04-77a209945bda", + "link": "https://learn.microsoft.com/azure/governance/policy/overview", + "service": "Policy", + "services": [ + "AzurePolicy" + ], + "severity": "High", + "subcategory": "Governance", + "text": "Manage policy assignments at the highest appropriate level with exclusions at bottom levels, if required.", + "waf": "Security" + }, + { + "category": "Governance", + "checklist": "Azure Landing Zone Review", + "guid": "43334f24-9116-4341-a2ba-527526944008", + "link": "https://learn.microsoft.com/security/benchmark/azure/mcsb-asset-management#am-2-use-only-approved-services", + "service": "Policy", + "services": [ + "AzurePolicy", + "Subscriptions" + ], + "severity": "Low", + "subcategory": "Governance", + "text": "Use Azure Policy to control which services users can provision at the subscription/management group level.", + "waf": "Security" + }, + { + "category": "Governance", + "checklist": "Azure Landing Zone Review", + "guid": "be7d7e48-4327-46d8-adc0-55bcf619e8a1", + "link": "https://learn.microsoft.com/azure/governance/policy/overview", + "service": "Policy", + "services": [ + "AzurePolicy" + ], + "severity": "High", + "subcategory": "Governance", + "text": "Use built-in policies where possible to minimize operational overhead.", + "waf": "Security" + }, + { + "category": "Governance", + "checklist": "Azure Landing Zone Review", + "description": "Assigning the Resource Policy Contributor role to specific scopes allows you to delegate policy management to relevant teams. For instance, a central IT team may oversee management group-level policies, while application teams handle policies for their subscriptions, enabling distributed governance with adherence to organizational standards.", + "guid": "3f988795-25d6-4268-a6d7-0ba6c97be995", + "link": "https://learn.microsoft.com/azure/governance/policy/overview#azure-rbac-permissions-in-azure-policy", + "service": "Policy", + "services": [ + "Entra", + "RBAC", + "AzurePolicy", + "Subscriptions" + ], + "severity": "Medium", + "subcategory": "Governance", + "text": "Assign the built-in Resource Policy Contributor role at a particular scope to enable application-level governance.", + "waf": "Security" + }, + { + "category": "Governance", + "checklist": "Azure Landing Zone Review", + "guid": "19048384-5c98-46cb-8913-156a12476e49", + "link": "https://learn.microsoft.com/azure/governance/policy/overview", + "service": "Policy", + "services": [ + "AzurePolicy", + "Subscriptions" + ], + "severity": "Medium", + "subcategory": "Governance", + "text": "Limit the number of Azure Policy assignments made at the root management group scope to avoid managing through exclusions at inherited scopes.", + "waf": "Security" + }, + { + "category": "Governance", + "checklist": "Azure Landing Zone Review", + "guid": "5a917e1f-348e-4f25-9c27-d42e8bbac757", + "link": "https://learn.microsoft.com/industry/release-plan/2023wave2/cloud-sovereignty/enable-data-sovereignty-policy-baseline", + "service": "Policy", + "services": [ + "AzurePolicy" + ], + "severity": "Medium", + "subcategory": "Governance", + "text": "If any data sovereignty requirements exist, Azure Policies should be deployed to enforce them.", + "training": "https://learn.microsoft.com/learn/paths/secure-your-cloud-data/", + "waf": "Security" + }, + { + "category": "Governance", + "checklist": "Azure Landing Zone Review", + "guid": "78b22132-b41c-460b-a4d3-df8f73a67dc2", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/ready/landing-zone/sovereign-landing-zone", + "service": "Policy", + "services": [ + "AzurePolicy", + "Subscriptions" + ], + "severity": "Medium", + "subcategory": "Governance", + "text": "For Sovereign Landing Zone, deploy sovereignty policy baseline and assign at correct management group level.", + "waf": "Security" + }, + { + "category": "Governance", + "checklist": "Azure Landing Zone Review", + "guid": "caeea0e9-1024-41df-a52e-d99c3f22a6f4", + "link": "https://learn.microsoft.com/industry/sovereignty/policy-portfolio-baseline", + "service": "Policy", + "services": [ + "AzurePolicy" + ], + "severity": "Medium", + "subcategory": "Governance", + "text": "For Sovereign Landing Zone, document Sovereign Control objectives to policy mapping.", + "waf": "Security" + }, + { + "category": "Governance", + "checklist": "Azure Landing Zone Review", + "guid": "9b461617-db7b-4399-8ac6-d4eb7153893a", + "link": "https://learn.microsoft.com/industry/sovereignty/policy-portfolio-baseline#sovereignty-baseline-policy-initiatives", + "service": "Policy", + "services": [ + "AzurePolicy" + ], + "severity": "Medium", + "subcategory": "Governance", + "text": "For Sovereign Landing Zone, ensure process is in place for management of 'Sovereign Control objectives to policy mapping'.", + "waf": "Security" + }, + { + "category": "Governance", + "checklist": "Azure Landing Zone Review", + "guid": "29fd366b-a180-452b-9bd7-954b7700c667", + "link": "https://learn.microsoft.com/azure/cost-management-billing/costs/tutorial-acm-create-budgets?bc=%2Fazure%2Fcloud-adoption-framework%2F_bread%2Ftoc.json&toc=%2Fazure%2Fcloud-adoption-framework%2Ftoc.json", + "services": [ + "Monitor", + "Cost", + "TrafficManager" + ], + "severity": "Medium", + "subcategory": "Optimize your cloud investment", + "text": "Configure 'Actual' and 'Forecasted' Budget Alerts.", + "waf": "Cost" + }, + { + "category": "Management", + "checklist": "Azure Landing Zone Review", + "guid": "67e7a8ed-4b30-4e38-a3f2-9812b2363cef", + "link": "https://learn.microsoft.com/azure/azure-monitor/logs/design-logs-deployment", + "service": "Monitor", + "services": [ + "Entra", + "RBAC", + "Monitor", + "AzurePolicy" + ], + "severity": "Medium", + "subcategory": "Monitoring", + "text": "Use a single monitor logs workspace to manage platforms centrally except where Azure role-based access control (Azure RBAC), data sovereignty requirements, or data retention policies mandate separate workspaces.", + "training": "https://learn.microsoft.com/azure/azure-monitor/logs/design-logs-deployment", + "waf": "Operations" + }, + { + "category": "Management", + "checklist": "Azure Landing Zone Review", + "guid": "5e6c4cfd-3e50-4454-9c24-47ec66138a72", + "link": "https://learn.microsoft.com/azure/azure-monitor/logs/data-retention-archive?tabs=portal-1%2Cportal-2#how-retention-and-archiving-work", + "service": "Monitor", + "services": [ + "Monitor", + "Storage", + "ARS", + "AzurePolicy" + ], + "severity": "High", + "subcategory": "Monitoring", + "text": "Export logs to Azure Storage if your log retention requirements exceed twelve years. Use immutable storage with a write-once, read-many policy to make data non-erasable and non-modifiable for a user-specified interval.", + "training": "https://learn.microsoft.com/learn/paths/architect-infrastructure-operations/", + "waf": "Operations" + }, + { + "category": "Management", + "checklist": "Azure Landing Zone Review", + "guid": "e7d7e484-3276-4d8b-bc05-5bcf619e8a13", + "link": "https://learn.microsoft.com/azure/governance/machine-configuration/overview", + "service": "VM", + "services": [ + "VM", + "Monitor", + "AzurePolicy" + ], + "severity": "Medium", + "subcategory": "Monitoring", + "text": "Monitor OS level virtual machine (VM) configuration drift using Azure Policy. Enabling Azure Automanage Machine Configuration audit capabilities through policy helps application team workloads to immediately consume feature capabilities with little effort.", + "training": "https://learn.microsoft.com/learn/paths/implement-resource-mgmt-security/", + "waf": "Operations" + }, + { + "category": "Management", + "checklist": "Azure Landing Zone Review", + "guid": "f9887952-5d62-4688-9d70-ba6c97be9951", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/ready/landing-zone/design-area/management-operational-compliance#update-management-considerations", + "service": "VM", + "services": [ + "VM" + ], + "severity": "Medium", + "subcategory": "Operational compliance", + "text": "Use Azure Update Manager as a patching mechanism for Windows and Linux VMs in Azure.", + "training": "https://learn.microsoft.com/azure/update-manager/overview?tabs=azure-vms", + "waf": "Operations" + }, + { + "category": "Management", + "checklist": "Azure Landing Zone Review", + "guid": "c806c048-26b7-4ddf-b4c2-b4f0c476925d", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/ready/landing-zone/design-area/management-operational-compliance#update-management-considerations ", + "service": "VM", + "services": [ + "VM" + ], + "severity": "Medium", + "subcategory": "Operational compliance", + "text": "Use Azure Update Manager as a patching mechanism for Windows and Linux VMs outside of Azure using Azure Arc.", + "training": "https://learn.microsoft.com/azure/update-manager/overview?tabs=azure-vms", + "waf": "Operations" + }, + { + "category": "Management", + "checklist": "Azure Landing Zone Review", + "guid": "90483845-c986-4cb2-a131-56a12476e49f", + "link": "https://learn.microsoft.com/azure/network-watcher/network-watcher-monitoring-overview", + "service": "Network Watcher", + "services": [ + "Monitor", + "NetworkWatcher" + ], + "severity": "Medium", + "subcategory": "Monitoring", + "text": "Use Network Watcher to proactively monitor traffic flows.", + "training": "https://learn.microsoft.com/learn/modules/configure-network-watcher/", + "waf": "Operations" + }, + { + "category": "Management", + "checklist": "Azure Landing Zone Review", + "guid": "541acdce-9793-477b-adb3-751ab2ab13ad", + "link": "https://learn.microsoft.com/azure/azure-resource-manager/management/lock-resources?tabs=json", + "services": [ + "Monitor" + ], + "severity": "Medium", + "subcategory": "Monitoring", + "text": "Use resource locks to prevent accidental deletion of critical shared services.", + "training": "https://learn.microsoft.com/learn/paths/implement-resource-mgmt-security/", + "waf": "Operations" + }, + { + "category": "Management", + "checklist": "Azure Landing Zone Review", + "guid": "a6e55d7d-8a2a-4db1-87d6-326af625ca44", + "link": "https://learn.microsoft.com/azure/governance/policy/concepts/effect-deny", + "services": [ + "Monitor", + "RBAC", + "AzurePolicy" + ], + "severity": "Low", + "subcategory": "Monitoring", + "text": "Use deny policies to supplement Azure role assignments. The combination of deny policies and Azure role assignments ensures the appropriate guardrails are in place to enforce who can deploy and configure resources and what resources they can deploy and configure.", + "training": "https://learn.microsoft.com/azure/role-based-access-control/deny-assignments?tabs=azure-portal", + "waf": "Operations" + }, + { + "category": "Management", + "checklist": "Azure Landing Zone Review", + "guid": "e5695f22-23ac-4e8c-a123-08ca5017f154", + "link": "https://learn.microsoft.com/azure/service-health/alerts-activity-log-service-notifications-portal", + "services": [ + "Monitor" + ], + "severity": "Medium", + "subcategory": "Monitoring", + "text": "Include service and resource health events as part of the overall platform monitoring solution. Tracking service and resource health from the platform perspective is an important component of resource management in Azure.", + "training": "https://learn.microsoft.com/training/modules/intro-to-azure-service-health/", + "waf": "Operations" + }, + { + "category": "Management", + "checklist": "Azure Landing Zone Review", + "guid": "d5f345bf-97ab-41a7-819c-6104baa7d48c", + "link": "https://learn.microsoft.com/azure/azure-monitor/alerts/action-groups", + "services": [ + "Monitor" + ], + "severity": "Medium", + "subcategory": "Monitoring", + "text": "Include alerts and action groups as part of the Azure Service Health platform to ensure that alerts or issues can be actioned.", + "training": "https://learn.microsoft.com/en-gb/training/modules/incident-response-with-alerting-on-azure/7-actions-and-alert-processing-rules", + "waf": "Operations" + }, + { + "category": "Management", + "checklist": "Azure Landing Zone Review", + "guid": "e3ab3693-829e-47e3-8618-3687a0477a20", + "link": "https://learn.microsoft.com/azure/sentinel/quickstart-onboard", + "services": [ + "Monitor" + ], + "severity": "Medium", + "subcategory": "Monitoring", + "text": "Don't send raw log entries back to on-premises monitoring systems. Instead, adopt a principle that data born in Azure stays in Azure. If on-premises SIEM integration is required, then send critical alerts instead of logs.", + "training": "https://learn.microsoft.com/azure/cloud-adoption-framework/decision-guides/logging-and-reporting/", + "waf": "Operations" + }, + { + "category": "Management", + "checklist": "Azure Landing Zone Review", + "guid": "6944008b-e7d7-4e48-9327-6d8bdc055bcf", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/ready/azure-setup-guide/monitoring-reporting?tabs=AzureMonitor", + "service": "Monitor", + "services": [ + "Monitor" + ], + "severity": "Medium", + "subcategory": "Monitoring", + "text": "Use Azure Monitor Logs for insights and reporting.", + "training": "https://learn.microsoft.com/training/modules/configure-azure-monitor/", + "waf": "Operations" + }, + { + "category": "Management", + "checklist": "Azure Landing Zone Review", + "guid": "619e8a13-f988-4795-85d6-26886d70ba6c", + "link": "https://learn.microsoft.com/azure/azure-monitor/agents/diagnostics-extension-overview", + "services": [ + "Monitor", + "Storage" + ], + "severity": "Medium", + "subcategory": "Monitoring", + "text": "When necessary, use shared storage accounts within the landing zone for Azure diagnostic extension log storage.", + "training": "https://learn.microsoft.com/training/modules/configure-virtual-machine-extensions/", + "waf": "Operations" + }, + { + "category": "Management", + "checklist": "Azure Landing Zone Review", + "guid": "97be9951-9048-4384-9c98-6cb2913156a1", + "link": "https://learn.microsoft.com/azure/azure-monitor/alerts/alerts-overview", + "service": "Monitor", + "services": [ + "Monitor" + ], + "severity": "Medium", + "subcategory": "Monitoring", + "text": "Use Azure Monitor alerts for the generation of operational alerts.", + "training": "https://learn.microsoft.com/training/modules/incident-response-with-alerting-on-azure/", + "waf": "Operations" + }, + { + "category": "Management", + "checklist": "Azure Landing Zone Review", + "guid": "859c3900-4514-41eb-b010-475d695abd74", + "link": "https://learn.microsoft.com/azure/architecture/best-practices/monitoring", + "services": [ + "Monitor" + ], + "severity": "Medium", + "subcategory": "Monitoring", + "text": "Ensure that monitoring requirements have been assessed and that appropriate data collection and alerting configurations are applied.", + "training": "https://learn.microsoft.com/training/paths/az-104-monitor-backup-resources/", + "waf": "Operations" + }, + { + "category": "Management", + "checklist": "Azure Landing Zone Review", + "guid": "fed3c55f-a67e-4875-aadd-3aba3f9fde31", + "link": "https://learn.microsoft.com/azure/automation/how-to/region-mappings", + "service": "Monitor", + "services": [ + "Monitor" + ], + "severity": "Medium", + "subcategory": "Monitoring", + "text": "When using Change and Inventory Tracking via Azure Automation Accounts, ensure that you have selected supported regions for linking your Log Analytics workspace and automation accounts together.", + "training": "https://learn.microsoft.com/training/modules/explore-azure-automation-devops/", + "waf": "Operations" + }, + { + "category": "Management", + "checklist": "Azure Landing Zone Review", + "guid": "aa45be6a-8f2d-4896-b0e3-775e6e94e610", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/ready/landing-zone/design-area/management-monitor", + "services": [ + "Monitor", + "AzurePolicy" + ], + "severity": "Medium", + "subcategory": "Monitoring", + "text": "Deploy AMBA to establish monitoring for platform components of your landing zone - AMBA is a framework solution that is available and provides an easy way to scale alerting by using Azure Policy.", + "training": "https://azure.github.io/azure-monitor-baseline-alerts/patterns/alz/", + "waf": "Operations" + }, + { + "category": "Management", + "checklist": "Azure Landing Zone Review", + "guid": "7ea02e1c-7166-45a3-bdf5-098891367fcb", + "link": "https://learn.microsoft.com/azure/reliability/cross-region-replication-azure", + "services": [], + "severity": "Medium", + "subcategory": "Data Protection", + "text": "Enable cross-region replication in Azure for BCDR with paired regions.", + "training": "https://learn.microsoft.com/training/modules/provide-disaster-recovery-replicate-storage-data/", + "waf": "Reliability" + }, + { + "category": "Management", + "checklist": "Azure Landing Zone Review", + "guid": "eba8cf22-45c6-4dc1-9b57-2cceb3b97ce5", + "link": "https://learn.microsoft.com/azure/storage/common/storage-redundancy", + "service": "Backup", + "services": [ + "Backup" + ], + "severity": "Low", + "subcategory": "Data Protection", + "text": "When using Azure Backup, use the correct backup types (GRS, ZRS & LRS) for your backup, as the default setting is GRS.", + "training": "https://learn.microsoft.com/training/modules/design-solution-for-backup-disaster-recovery/", + "waf": "Reliability" + }, + { + "category": "Management", + "checklist": "Azure Landing Zone Review", + "guid": "f541acdc-e979-4377-acdb-3751ab2ab13a", + "link": "https://learn.microsoft.com/azure/governance/policy/concepts/guest-configuration", + "service": "VM", + "services": [ + "VM", + "AzurePolicy" + ], + "severity": "Medium", + "subcategory": "Operational compliance", + "text": "Use Azure guest policies to automatically deploy software configurations through VM extensions and enforce a compliant baseline VM configuration.", + "waf": "Security" + }, + { + "category": "Management", + "checklist": "Azure Landing Zone Review", + "description": "Use Azure Policy's guest configuration features to audit and remediate machine settings (e.g., OS, application, environment) to ensure resources align with expected configurations, and Update Management can enforce patch management for VMs.", + "guid": "da6e55d7-d8a2-4adb-817d-6326af625ca4", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/ready/landing-zone/design-area/management-operational-compliance#monitoring-for-configuration-drift", + "service": "VM", + "services": [ + "VM", + "Monitor", + "AzurePolicy" + ], + "severity": "Medium", + "subcategory": "Operational compliance", + "text": "Monitor VM security configuration drift via Azure Policy.", + "training": "https://learn.microsoft.com/training/paths/implement-resource-mgmt-security/", + "waf": "Security" + }, + { + "category": "Management", + "checklist": "Azure Landing Zone Review", + "guid": "2476e49f-541a-4cdc-b979-377bcdb3751a", + "link": "https://learn.microsoft.com/azure/site-recovery/site-recovery-overview", + "service": "VM", + "services": [ + "VM", + "ASR", + "ACR" + ], + "severity": "Medium", + "subcategory": "Protect and Recover", + "text": "Use Azure Site Recovery for Azure-to-Azure Virtual Machines disaster recovery scenarios. This enables you to replicate workloads across regions.", + "training": "https://learn.microsoft.com/training/modules/protect-infrastructure-with-site-recovery/", + "waf": "Operations" + }, + { + "category": "Management", + "checklist": "Azure Landing Zone Review", + "guid": "b2ab13ad-a6e5-45d7-b8a2-adb117d6326a", + "link": "https://learn.microsoft.com/azure/architecture/framework/resiliency/backup-and-recovery", + "services": [ + "ASR" + ], + "severity": "Medium", + "subcategory": "Protect and Recover", + "text": "Use native PaaS service disaster recovery capabilities. Perform failover testing with these capabilities.", + "training": "https://learn.microsoft.com/en-us/training/modules/explore-iaas-paas-platform-tools-for-high-availability-disaster-recovery/", + "waf": "Operations" + }, + { + "category": "Management", + "checklist": "Azure Landing Zone Review", + "guid": "f625ca44-e569-45f2-823a-ce8cb12308ca", + "link": "https://learn.microsoft.com/azure/backup/backup-center-overview", + "service": "Backup", + "services": [ + "Backup" + ], + "severity": "Medium", + "subcategory": "Protect and Recover", + "text": "Use Azure-native backup capabilities, or an Azure-compatible, 3rd-party backup solution.", + "training": "https://learn.microsoft.com/training/modules/design-solution-for-backup-disaster-recovery/", + "waf": "Operations" + }, + { + "category": "Management", + "checklist": "Azure Landing Zone Review", + "guid": "89cc5e11-aa4d-4c3b-893d-feb99215266a", + "link": "https://learn.microsoft.com/azure/web-application-firewall/afds/waf-front-door-best-practices#add-diagnostic-settings-to-save-your-wafs-logs", + "service": "WAF", + "services": [ + "AppGW", + "WAF", + "FrontDoor" + ], + "severity": "High", + "subcategory": "App delivery", + "text": "Add diagnostic settings to save WAF logs from application delivery services like Azure Front Door and Azure Application Gateway. Regularly review the logs to check for attacks and for false positive detections.", + "training": "https://learn.microsoft.com/training/modules/capture-application-logs-app-service/", + "waf": "Operations" + }, + { + "category": "Management", + "checklist": "Azure Landing Zone Review", + "guid": "7f408960-c626-44cb-a018-347c8d790cdf", + "link": "https://learn.microsoft.com/azure/web-application-firewall/afds/waf-front-door-best-practices#send-logs-to-microsoft-sentinel", + "service": "WAF", + "services": [ + "Sentinel", + "AppGW", + "WAF", + "FrontDoor" + ], + "severity": "Medium", + "subcategory": "App delivery", + "text": "Send WAF logs from your application delivery services like Azure Front Door and Azure Application Gateway to Microsoft Sentinel. Detect attacks and integrate WAF telemetry into your overall Azure environment.", + "training": "https://learn.microsoft.com/training/paths/sc-200-connect-logs-to-azure-sentinel/", + "waf": "Operations" + }, + { + "category": "Security", + "checklist": "Azure Landing Zone Review", + "guid": "b86ad884-08e3-4727-94b8-75ba18f20459", + "link": "https://learn.microsoft.com/security/benchmark/azure/security-control-incident-response", + "services": [], + "severity": "Medium", + "subcategory": "Access control", + "text": "Determine the incident response plan for Azure services before allowing it into production.", + "training": "https://learn.microsoft.com/training/modules/intro-to-azure-incident-readiness/", + "waf": "Security" + }, + { + "category": "Security", + "checklist": "Azure Landing Zone Review", + "guid": "01365d38-e43f-49cc-ad86-8266abca264f", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/ready/landing-zone/design-area/security-zero-trust", + "services": [], + "severity": "Medium", + "subcategory": "Access control", + "text": "Apply a zero-trust approach for access to the Azure platform.", + "training": "https://learn.microsoft.com/training/modules/introduction-zero-trust-best-practice-frameworks/", + "waf": "Security" + }, + { + "category": "Security", + "checklist": "Azure Landing Zone Review", + "guid": "5017f154-e3ab-4369-9829-e7e316183687", + "link": "https://learn.microsoft.com/azure/key-vault/general/overview", + "service": "Key Vault", + "services": [ + "AKV" + ], + "severity": "High", + "subcategory": "Encryption and keys", + "text": "Use Azure Key Vault to store your secrets and credentials.", + "training": "https://learn.microsoft.com/training/modules/implement-azure-key-vault/", + "waf": "Security" + }, + { + "category": "Security", + "checklist": "Azure Landing Zone Review", + "graph": "ResourceContainers | where type=='microsoft.resources/subscriptions'| parse id with '/subscriptions/' SubscriptionID| project subscriptionId, SubscriptionName = name| join kind=leftouter (Resources| where type == 'microsoft.keyvault/vaults'| project id, name, subscriptionId) on subscriptionId| join kind= leftouter (Resources| where type == 'microsoft.keyvault/vaults'| summarize ResourceCount = count() by subscriptionId) on subscriptionId| extend RCount = iff(isnull(ResourceCount), 0, ResourceCount)| project-away ResourceCount| extend compliant = (RCount <> 1)", + "guid": "a0477a20-9945-4bda-9333-4f2491163418", + "link": "https://learn.microsoft.com/azure/key-vault/general/overview-throttling", + "service": "Key Vault", + "services": [ + "AKV" + ], + "severity": "Medium", + "subcategory": "Encryption and keys", + "text": "Use different Azure Key Vaults for different applications and regions to avoid transaction scale limits and restrict access to secrets.", + "training": "https://learn.microsoft.com/training/modules/configure-and-manage-azure-key-vault/", + "waf": "Security" + }, + { + "category": "Security", + "checklist": "Azure Landing Zone Review", + "guid": "2ba52752-6944-4008-ae7d-7e4843276d8b", + "link": "https://learn.microsoft.com/azure/key-vault/general/best-practices", + "service": "Key Vault", + "services": [ + "AzurePolicy", + "AKV" + ], + "severity": "Medium", + "subcategory": "Encryption and keys", + "text": "Provision Azure Key Vault with the soft delete and purge policies enabled to allow retention protection for deleted objects.", + "training": "https://learn.microsoft.com/training/modules/implement-azure-key-vault/", + "waf": "Security" + }, + { + "category": "Security", + "checklist": "Azure Landing Zone Review", + "guid": "dc055bcf-619e-48a1-9f98-879525d62688", + "link": "https://learn.microsoft.com/azure/key-vault/general/best-practices", + "service": "Key Vault", + "services": [ + "Entra", + "RBAC", + "AKV" + ], + "severity": "Medium", + "subcategory": "Encryption and keys", + "text": "Follow a least privilege model by limiting authorization to permanently delete keys, secrets, and certificates to specialized custom Microsoft Entra ID roles.", + "training": "https://learn.microsoft.com/training/modules/implement-azure-key-vault/", + "waf": "Security" + }, + { + "category": "Security", + "checklist": "Azure Landing Zone Review", + "guid": "6d70ba6c-97be-4995-8904-83845c986cb2", + "link": "https://learn.microsoft.com/azure/key-vault/general/best-practices", + "service": "Key Vault", + "services": [ + "AKV" + ], + "severity": "Medium", + "subcategory": "Encryption and keys", + "text": "Automate the certificate management and renewal process with public certificate authorities to ease administration.", + "training": "https://learn.microsoft.com/en-us/training/modules/configure-and-manage-azure-key-vault/", + "waf": "Security" + }, + { + "category": "Security", + "checklist": "Azure Landing Zone Review", + "guid": "913156a1-2476-4e49-b541-acdce979377b", + "link": "https://learn.microsoft.com/azure/key-vault/general/best-practices", + "service": "Key Vault", + "services": [ + "AKV" + ], + "severity": "Medium", + "subcategory": "Encryption and keys", + "text": "Establish an automated process for key and certificate rotation.", + "training": "https://learn.microsoft.com/training/modules/configure-and-manage-azure-key-vault/", + "waf": "Security" + }, + { + "category": "Security", + "checklist": "Azure Landing Zone Review", + "guid": "cdb3751a-b2ab-413a-ba6e-55d7d8a2adb1", + "link": "https://learn.microsoft.com/azure/key-vault/general/best-practices", + "service": "Key Vault", + "services": [ + "VNet", + "AKV", + "PrivateLink" + ], + "severity": "Medium", + "subcategory": "Encryption and keys", + "text": "Enable firewall and virtual network service endpoint or private endpoint on the vault to control access to the key vault.", + "training": "https://learn.microsoft.com/training/modules/design-implement-private-access-to-azure-services/", + "waf": "Security" + }, + { + "category": "Security", + "checklist": "Azure Landing Zone Review", + "guid": "17d6326a-f625-4ca4-9e56-95f2223ace8c", + "link": "https://learn.microsoft.com/azure/key-vault/general/monitor-key-vault", + "service": "Key Vault", + "services": [ + "Entra", + "Monitor", + "AKV" + ], + "severity": "Medium", + "subcategory": "Encryption and keys", + "text": "Use the platform-central Azure Monitor Log Analytics workspace to audit key, certificate, and secret usage within each instance of Key Vault.", + "training": "https://learn.microsoft.com/training/modules/analyze-infrastructure-with-azure-monitor-logs/", + "waf": "Security" + }, + { + "category": "Security", + "checklist": "Azure Landing Zone Review", + "guid": "b12308ca-5017-4f15-9e3a-b3693829e7e3", + "link": "https://learn.microsoft.com/azure/key-vault/general/best-practices", + "service": "Key Vault", + "services": [ + "AzurePolicy", + "AKV" + ], + "severity": "Medium", + "subcategory": "Encryption and keys", + "text": "Delegate Key Vault instantiation and privileged access and use Azure Policy to enforce a consistent compliant configuration.", + "training": "https://learn.microsoft.com/training/modules/configure-azure-key-vault-networking-settings/", + "waf": "Security" + }, + { + "category": "Security", + "checklist": "Azure Landing Zone Review", + "guid": "16183687-a047-47a2-8994-5bda43334f24", + "link": "https://learn.microsoft.com/azure/security/fundamentals/encryption-atrest", + "services": [ + "AKV" + ], + "severity": "Medium", + "subcategory": "Encryption and keys", + "text": "Default to Microsoft-managed keys for principal encryption functionality and use customer-managed keys when required.", + "training": "https://learn.microsoft.com/training/modules/implement-azure-key-vault/", + "waf": "Security" + }, + { + "category": "Security", + "checklist": "Azure Landing Zone Review", + "guid": "91163418-2ba5-4275-8694-4008be7d7e48", + "link": "https://learn.microsoft.com/azure/key-vault/general/best-practices", + "service": "Key Vault", + "services": [ + "AKV" + ], + "severity": "Medium", + "subcategory": "Encryption and keys", + "text": "Use an Azure Key Vault per application per environment per region.", + "training": "https://learn.microsoft.com/training/modules/implement-azure-key-vault/", + "waf": "Security" + }, + { + "category": "Security", + "checklist": "Azure Landing Zone Review", + "guid": "25d62688-6d70-4ba6-a97b-e99519048384", + "link": "https://learn.microsoft.com/azure/key-vault/general/best-practices", + "service": "Key Vault", + "services": [ + "ASR", + "ACR", + "AKV" + ], + "severity": "Medium", + "subcategory": "Encryption and keys", + "text": "If you want to bring your own keys, this might not be supported across all considered services. Implement relevant mitigation so that inconsistencies don't hinder desired outcomes. Choose appropriate region pairs and disaster recovery regions that minimize latency.", + "training": "https://learn.microsoft.com/training/modules/configure-and-manage-azure-key-vault/", + "waf": "Security" + }, + { + "category": "Security", + "checklist": "Azure Landing Zone Review", + "guid": "4ac6b67c-b3a4-4ff9-8e87-b07a7ce7bbdb", + "link": "https://learn.microsoft.com/industry/sovereignty/key-management", + "service": "Key Vault", + "services": [ + "AKV" + ], + "severity": "Medium", + "subcategory": "Encryption and keys", + "text": "For Sovereign Landing Zone, use Azure Key Vault managed HSM to store your secrets and credentials.", + "training": "https://learn.microsoft.com/training/modules/configure-and-manage-azure-key-vault/", + "waf": "Security" + }, + { + "category": "Security", + "checklist": "Azure Landing Zone Review", + "guid": "4e5695f2-223a-4ce8-ab12-308ca5017f15", + "link": "https://learn.microsoft.com/azure/active-directory/reports-monitoring/overview-reports", + "service": "Entra", + "services": [ + "Entra" + ], + "severity": "Medium", + "subcategory": "Operations", + "text": "Use Microsoft Entra ID reporting capabilities to generate access control audit reports.", + "training": "https://learn.microsoft.com/training/modules/monitor-report-aad-security-events/", + "waf": "Security" + }, + { + "category": "Security", + "checklist": "Azure Landing Zone Review", + "guid": "4e3ab369-3829-4e7e-9161-83687a0477a2", + "link": "https://learn.microsoft.com/azure/azure-monitor/logs/logs-data-export?tabs=portal", + "services": [ + "Monitor", + "Storage", + "ARS" + ], + "severity": "Medium", + "subcategory": "Operations", + "text": "Export Azure activity logs to Azure Monitor Logs for long-term data retention. Export to Azure Storage for long-term storage beyond two years, if necessary.", + "training": "https://learn.microsoft.com/training/modules/analyze-infrastructure-with-azure-monitor-logs/", + "waf": "Security" + }, + { + "category": "Security", + "checklist": "Azure Landing Zone Review", + "guid": "09945bda-4333-44f2-9911-634182ba5275", + "link": "https://learn.microsoft.com/azure/defender-for-cloud/concept-cloud-security-posture-management", + "service": "Defender", + "services": [ + "Defender", + "Subscriptions" + ], + "severity": "High", + "subcategory": "Operations", + "text": "Enable Defender Cloud Security Posture Management for all subscriptions.", + "training": "https://learn.microsoft.com/training/modules/microsoft-defender-cloud-security-posture/", + "waf": "Security" + }, + { + "category": "Security", + "checklist": "Azure Landing Zone Review", + "guid": "36a72a48-fffe-4c40-9747-0ab5064355ba", + "link": "https://learn.microsoft.com/azure/defender-for-cloud/plan-defender-for-servers-select-plan", + "service": "Defender", + "services": [ + "Defender", + "Subscriptions" + ], + "severity": "High", + "subcategory": "Operations", + "text": "Enable a Defender Cloud Workload Protection Plan for Servers on all subscriptions.", + "training": "https://learn.microsoft.com/training/modules/understand-azure-defender-cloud-workload-protection/", + "waf": "Security" + }, + { + "category": "Security", + "checklist": "Azure Landing Zone Review", + "guid": "77425f48-ecba-43a0-aeac-a3ac733ccc6a", + "link": "https://learn.microsoft.com/azure/defender-for-cloud/connect-azure-subscription", + "service": "Defender", + "services": [ + "Defender", + "Subscriptions" + ], + "severity": "High", + "subcategory": "Operations", + "text": "Enable Defender Cloud Workload Protection Plans for Azure Resources on all subscriptions.", + "training": "https://learn.microsoft.com/training/modules/understand-azure-defender-cloud-workload-protection/", + "waf": "Security" + }, + { + "category": "Security", + "checklist": "Azure Landing Zone Review", + "guid": "24d96b30-61ee-4436-a1cc-d6ef08bc574b", + "link": "https://learn.microsoft.com/mem/configmgr/protect/deploy-use/endpoint-protection", + "service": "VM", + "services": [], + "severity": "High", + "subcategory": "Operations", + "text": "Enable Endpoint Protection on IaaS Servers.", + "training": "https://learn.microsoft.com/training/modules/design-solutions-securing-server-client-endpoints/", + "waf": "Security" + }, + { + "category": "Security", + "checklist": "Azure Landing Zone Review", + "guid": "15833ee7-ad6c-46d3-9331-65c7acbe44ab", + "link": "https://learn.microsoft.com/azure/security-center/", + "service": "VM", + "services": [ + "Defender", + "Monitor" + ], + "severity": "Medium", + "subcategory": "Operations", + "text": "Monitor base operating system patching drift via Azure Monitor Logs and Defender for Cloud.", + "training": "https://learn.microsoft.com/training/modules/create-log-analytics-workspace-microsoft-defender-cloud/", + "waf": "Security" + }, + { + "category": "Security", + "checklist": "Azure Landing Zone Review", + "guid": "e5f8d79f-2e87-4768-924c-516775c6ea95", + "link": "https://learn.microsoft.com/azure/azure-monitor/logs/design-logs-deployment", + "service": "Monitor", + "services": [ + "Entra", + "Monitor" + ], + "severity": "Medium", + "subcategory": "Operations", + "text": "Connect default resource configurations to a centralized Azure Monitor Log Analytics workspace.", + "training": "https://learn.microsoft.com/training/modules/analyze-infrastructure-with-azure-monitor-logs/", + "waf": "Security" + }, + { + "category": "Security", + "checklist": "Azure Landing Zone Review", + "guid": "1761e147-f65e-4d09-bbc2-f464f23e2eba", + "link": "https://learn.microsoft.com/industry/sovereignty/transparency-logs", + "service": "Entra", + "services": [ + "Entra" + ], + "severity": "Medium", + "subcategory": "Operations", + "text": "For Sovereign Landing Zone, enable transparancy logs on the Entra ID tenant.", + "waf": "Security" + }, + { + "category": "Security", + "checklist": "Azure Landing Zone Review", + "guid": "d21a922d-5ca7-427a-82a6-35f7b21f1bfc", + "link": "https://learn.microsoft.com/azure/security/fundamentals/customer-lockbox-overview", + "service": "Entra", + "services": [ + "Entra" + ], + "severity": "Medium", + "subcategory": "Operations", + "text": "For Sovereign Landing Zone, enable customer Lockbox on the Entra ID tenant.", + "waf": "Security" + }, + { + "category": "Security", + "checklist": "Azure Landing Zone Review", + "guid": "874a748b-662d-46d1-9051-2a66498f6dfe", + "link": "https://learn.microsoft.com/azure/event-grid/set-alerts", + "services": [ + "Monitor" + ], + "severity": "Low", + "subcategory": "Operations", + "text": "Use an Azure Event Grid-based solution for log-oriented, real-time alerts.", + "training": "https://learn.microsoft.com/training/modules/azure-event-grid/", + "waf": "Security" + }, + { + "category": "Security", + "checklist": "Azure Landing Zone Review", + "guid": "b03ed428-4617-4067-a787-85468b9ccf3f", + "link": "https://learn.microsoft.com/azure/storage/common/storage-require-secure-transfer", + "service": "Storage", + "services": [ + "Storage" + ], + "severity": "High", + "subcategory": "Overview", + "text": "Enable secure transfer to storage accounts.", + "training": "https://learn.microsoft.com/training/modules/secure-azure-storage-account/", + "waf": "Security" + }, + { + "category": "Security", + "checklist": "Azure Landing Zone Review", + "guid": "159aac9f-863f-4f48-82cf-00c28fa97a0e", + "link": "https://learn.microsoft.com/azure/storage/blobs/data-protection-overview#recommendations-for-basic-data-protection", + "service": "Storage", + "services": [ + "Storage" + ], + "severity": "High", + "subcategory": "Overview", + "text": "Enable container soft delete for the storage account to recover a deleted container and its contents.", + "waf": "Security" + }, + { + "category": "Security", + "checklist": "Azure Landing Zone Review", + "guid": "6f704104-85c1-441f-96d3-c9819911645e", + "link": "https://learn.microsoft.com/azure/active-directory/roles/security-planning", + "services": [ + "Entra" + ], + "severity": "High", + "subcategory": "Secure privileged access", + "text": "Separate privileged admin accounts for Azure administrative tasks.", + "training": "https://learn.microsoft.com/training/modules/design-solutions-secure-privileged-access/", + "waf": "Security" + }, + { + "category": "Security", + "checklist": "Azure Landing Zone Review", + "guid": "9a19bf39-c95d-444c-9c89-19ca1f6d5215", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/ready/landing-zone/design-area/service-enablement-framework", + "services": [], + "severity": "Medium", + "subcategory": "Service enablement framework", + "text": "Plan how new azure services will be implemented.", + "waf": "Security" + }, + { + "category": "Security", + "checklist": "Azure Landing Zone Review", + "guid": "ae514b93-3d45-485e-8112-9bd7ba012f7b", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/ready/landing-zone/design-area/service-enablement-framework", + "services": [], + "severity": "Medium", + "subcategory": "Service enablement framework", + "text": "Plan how service request will be fulfilled for Azure services.", + "waf": "Security" + }, + { + "category": "Platform Automation and DevOps", + "checklist": "Azure Landing Zone Review", + "guid": "e85f4226-bf06-4e35-8a8b-7aee4d2d633a", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/ready/landing-zone/design-area/platform-automation-devops", + "services": [], + "severity": "High", + "subcategory": "DevOps Team Topologies", + "text": "Ensure you have a cross functional DevOps Platform Team to build, manage and maintain your Azure Landing Zone architecture.", + "training": "https://learn.microsoft.com/training/modules/choose-an-agile-approach/", + "waf": "Operations" + }, + { + "category": "Platform Automation and DevOps", + "checklist": "Azure Landing Zone Review", + "guid": "634146bf-7085-4419-a7b5-f96d2726f6da", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/ready/considerations/devops-teams-topologies#design-recommendations", + "services": [], + "severity": "Low", + "subcategory": "DevOps Team Topologies", + "text": "Aim to define functions for Azure Landing Zone Platform team.", + "training": "https://learn.microsoft.com/training/paths/az-400-work-git-for-enterprise-devops/", + "waf": "Operations" + }, + { + "category": "Platform Automation and DevOps", + "checklist": "Azure Landing Zone Review", + "guid": "a9e65070-c59e-4112-8bf6-c11364d4a2a5", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/ready/considerations/devops-teams-topologies#design-recommendations", + "services": [ + "RBAC" + ], + "severity": "Low", + "subcategory": "DevOps Team Topologies", + "text": "Aim to define functions for application workload teams to be self-sufficient and not require DevOps Platform Team support. Achieve this through the use of custom RBAC role.", + "training": "https://learn.microsoft.com/training/paths/az-400-work-git-for-enterprise-devops/", + "waf": "Operations" + }, + { + "category": "Platform Automation and DevOps", + "checklist": "Azure Landing Zone Review", + "guid": "165eb5e9-b434-448a-9e24-178632186212", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/ready/considerations/infrastructure-as-code", + "services": [], + "severity": "Medium", + "subcategory": "DevOps Team Topologies", + "text": "Use a CI/CD pipeline to deploy IaC artifacts and ensure the quality of your deployment and Azure environments.", + "training": "https://learn.microsoft.com/training/modules/manage-multiple-environments-using-bicep-azure-pipelines/", + "waf": "Operations" + }, + { + "category": "Platform Automation and DevOps", + "checklist": "Azure Landing Zone Review", + "guid": "0cadb8c7-8fa5-4fbf-8f39-d1fadb3b0460", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/ready/considerations/development-strategy-development-lifecycle#automated-builds", + "services": [], + "severity": "Medium", + "subcategory": "DevOps Team Topologies", + "text": "Include unit tests for IaC and application code as part of your build process.", + "training": "https://learn.microsoft.com/training/modules/run-quality-tests-build-pipeline/", + "waf": "Operations" + }, + { + "category": "Platform Automation and DevOps", + "checklist": "Azure Landing Zone Review", + "guid": "108d5099-a11d-4445-bd8b-e12a5e95412e", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/ready/considerations/development-strategy-development-lifecycle#automated-builds", + "service": "Key Vault", + "services": [ + "VM", + "AKV" + ], + "severity": "High", + "subcategory": "DevOps Team Topologies", + "text": "Use Key Vault secrets to avoid hard-coding sensitive information such as credentials (virtual machines user passwords), certificates or keys.", + "training": "https://learn.microsoft.com/en-us/training/modules/implement-azure-key-vault/", + "waf": "Operations" + }, + { + "category": "Platform Automation and DevOps", + "checklist": "Azure Landing Zone Review", + "guid": "a52e0c98-76b9-4a09-a1c9-6b2babf22ac4", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/ready/landing-zone/design-area/subscription-vending", + "services": [ + "Subscriptions" + ], + "severity": "Low", + "subcategory": "DevOps Team Topologies", + "text": "Implement automation for new landing zone for applications and workloads through subscription vending.", + "waf": "Operations" + }, + { + "category": "Platform Automation and DevOps", + "checklist": "Azure Landing Zone Review", + "guid": "cfe363b5-f579-4284-bc56-a42153e4c10b", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/ready/considerations/infrastructure-as-code", + "services": [], + "severity": "High", + "subcategory": "Development Lifecycle", + "text": "Ensure a version control system is used for source code of applications and IaC developed. Microsoft recommends Git.", + "training": "https://learn.microsoft.com/training/paths/intro-to-vc-git/", + "waf": "Operations" + }, + { + "category": "Platform Automation and DevOps", + "checklist": "Azure Landing Zone Review", + "guid": "c7245dd4-af8a-403a-8bb7-890c1a7cfa9d", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/ready/considerations/development-strategy-development-lifecycle", + "services": [], + "severity": "Low", + "subcategory": "Development Lifecycle", + "text": "Follow a branching strategy to allow teams to collaborate better and efficiently manage version control of IaC and application Code. Review options such as Github Flow.", + "training": "https://learn.microsoft.com/training/modules/manage-git-branches-workflows/", + "waf": "Operations" + }, + { + "category": "Platform Automation and DevOps", + "checklist": "Azure Landing Zone Review", + "guid": "12aeea20-9165-4b3e-bdf2-6795fcd3cdbe", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/ready/considerations/development-strategy-development-lifecycle", + "services": [], + "severity": "Medium", + "subcategory": "Development Lifecycle", + "text": "Adopt a pull request strategy to help keep control of code changes merged into branches.", + "training": "https://learn.microsoft.com/training/modules/review-azure-infrastructure-changes-using-bicep-pull-requests/", + "waf": "Operations" + }, + { + "category": "Platform Automation and DevOps", + "checklist": "Azure Landing Zone Review", + "guid": "2676ae46-65ca-444e-8695-fdddeace4cb1", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/ready/landing-zone/design-area/management-platform", + "services": [], + "severity": "Medium", + "subcategory": "Development Lifecycle", + "text": "Establish a process for using code to implement quick fixes. Always register quick fixes in your team's backlog so each fix can be reworked at a later point, and you can limit technical debt.", + "training": "https://learn.microsoft.com/training/modules/branch-merge-git/", + "waf": "Operations" + }, + { + "category": "Platform Automation and DevOps", + "checklist": "Azure Landing Zone Review", + "guid": "2cdc9d99-dbcc-4ad4-97f5-e7d358bdfa73", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/ready/considerations/infrastructure-as-code", + "services": [], + "severity": "High", + "subcategory": "Development Strategy", + "text": "Leverage Declarative Infrastructure as Code Tools such as Azure Bicep, ARM Templates or Terraform to build and maintain your Azure Landing Zone architecture. Both from a Platform and Application workload perspective.", + "training": "https://learn.microsoft.com/training/modules/introduction-to-infrastructure-as-code-using-bicep/", + "waf": "Operations" + }, + { + "category": "Platform Automation and DevOps", + "checklist": "Azure Landing Zone Review", + "guid": "cc87a3bc-c572-4ad2-92ed-8cabab66160f", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/ready/considerations/landing-zone-security#secure", + "services": [], + "severity": "High", + "subcategory": "Security", + "text": "Integrate security into the already combined process of development and operations in DevOps to mitigate risks in the innovation process.", + "training": "https://learn.microsoft.com/training/paths/az-400-implement-security-validate-code-bases-compliance/", + "waf": "Operations" + }, { "category": "Governance", "checklist": "Azure API Management Review", @@ -37,9 +3571,9 @@ "link": "https://learn.microsoft.com/azure/api-management/policy-fragments", "service": "APIM", "services": [ + "ACR", "APIM", - "AzurePolicy", - "ACR" + "AzurePolicy" ], "severity": "Medium", "subcategory": "Development best practices", @@ -67,8 +3601,8 @@ "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-use-azure-monitor#resource-logs", "service": "APIM", "services": [ - "APIM", - "Monitor" + "Monitor", + "APIM" ], "severity": "High", "subcategory": "Monitoring", @@ -82,8 +3616,8 @@ "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-app-insights", "service": "APIM", "services": [ - "APIM", - "Monitor" + "Monitor", + "APIM" ], "severity": "Medium", "subcategory": "Monitoring", @@ -97,8 +3631,8 @@ "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-use-azure-monitor", "service": "APIM", "services": [ - "APIM", - "Monitor" + "Monitor", + "APIM" ], "severity": "High", "subcategory": "Monitoring", @@ -113,8 +3647,8 @@ "service": "APIM", "services": [ "Entra", - "AKV", - "APIM" + "APIM", + "AKV" ], "severity": "High", "subcategory": "Data protection", @@ -202,9 +3736,9 @@ "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-deploy-multi-region", "service": "APIM", "services": [ + "ACR", "ASR", - "APIM", - "ACR" + "APIM" ], "severity": "Medium", "subcategory": "Business continuity and disaster recovery", @@ -233,9 +3767,9 @@ "link": "https://learn.microsoft.com/security/benchmark/azure/baselines/api-management-security-baseline?toc=%2Fazure%2Fapi-management%2F&bc=%2Fazure%2Fapi-management%2Fbreadcrumb%2Ftoc.json#service-native-backup-capability", "service": "APIM", "services": [ - "Backup", + "ASR", "APIM", - "ASR" + "Backup" ], "severity": "High", "subcategory": "Business continuity and disaster recovery", @@ -428,9 +3962,9 @@ "service": "APIM", "services": [ "Entra", - "APIM", "VNet", - "Monitor" + "Monitor", + "APIM" ], "severity": "Medium", "subcategory": "Security", @@ -445,9 +3979,9 @@ "service": "APIM", "services": [ "Entra", + "VNet", "APIM", - "PrivateLink", - "VNet" + "PrivateLink" ], "severity": "Medium", "subcategory": "Security", @@ -603,8 +4137,8 @@ "link": "https://learn.microsoft.com/security/benchmark/azure/baselines/api-management-security-baseline?toc=%2Fazure%2Fapi-management%2F&bc=%2Fazure%2Fapi-management%2Fbreadcrumb%2Ftoc.json#im-8-restrict-the-exposure-of-credential-and-secrets", "service": "APIM", "services": [ - "AKV", - "APIM" + "APIM", + "AKV" ], "severity": "High", "subcategory": "Data protection", @@ -634,8 +4168,8 @@ "service": "APIM", "services": [ "Entra", - "APIM", "AppGW", + "APIM", "WAF" ], "severity": "High", @@ -662,8 +4196,8 @@ "link": "https://learn.microsoft.com/azure/architecture/web-apps/spring-apps/architectures/spring-apps-multi-region", "service": "Spring Apps", "services": [ - "TrafficManager", "ASR", + "TrafficManager", "FrontDoor" ], "severity": "Medium", @@ -754,8 +4288,8 @@ "service": "AVS", "services": [ "Entra", - "AVS", - "Subscriptions" + "Subscriptions", + "AVS" ], "severity": "High", "subcategory": "Identity", @@ -912,11 +4446,11 @@ "guid": "eb710a37-cbc1-4055-8dd5-a936a8bb7cf5", "service": "AVS", "services": [ + "Monitor", "NetworkWatcher", + "ExpressRoute", "AVS", - "VPN", - "Monitor", - "ExpressRoute" + "VPN" ], "severity": "High", "subcategory": "Monitoring", @@ -929,11 +4463,11 @@ "guid": "976e24f2-a7f8-426c-9253-2a92a2a7ed99", "service": "AVS", "services": [ - "NetworkWatcher", - "AVS", - "VM", "Monitor", - "ExpressRoute" + "VM", + "NetworkWatcher", + "ExpressRoute", + "AVS" ], "severity": "Medium", "subcategory": "Monitoring", @@ -946,10 +4480,10 @@ "guid": "f41ce6a0-64f3-4805-bc65-3ab50df01265", "service": "AVS", "services": [ - "Monitor", - "AVS", "VM", - "NetworkWatcher" + "Monitor", + "NetworkWatcher", + "AVS" ], "severity": "Medium", "subcategory": "Monitoring", @@ -1063,9 +4597,9 @@ "guid": "586cb291-ec16-4a1d-876e-f9f141acdce5", "service": "AVS", "services": [ - "Entra", + "VM", "AVS", - "VM" + "Entra" ], "severity": "High", "subcategory": "Security (identity)", @@ -1091,8 +4625,8 @@ "guid": "a2adb1c3-d232-46af-825c-a44e1695fddd", "service": "AVS", "services": [ - "AVS", "AppGW", + "AVS", "Firewall" ], "severity": "High", @@ -1119,8 +4653,8 @@ "guid": "29e3eec2-1836-487a-8077-a2b5945bda43", "service": "AVS", "services": [ - "AVS", - "Monitor" + "Monitor", + "AVS" ], "severity": "Medium", "subcategory": "Security (network)", @@ -1133,11 +4667,11 @@ "guid": "334fdf91-c234-4182-a652-75269440b4be", "service": "AVS", "services": [ + "VNet", "DDoS", - "AVS", - "VPN", "ExpressRoute", - "VNet" + "AVS", + "VPN" ], "severity": "Medium", "subcategory": "Security (network)", @@ -1163,8 +4697,8 @@ "guid": "9ccbd869-266a-4cca-874f-aa19bf39d95d", "service": "AVS", "services": [ - "AVS", - "Defender" + "Defender", + "AVS" ], "severity": "Medium", "subcategory": "Security (guest/VM)", @@ -1177,8 +4711,8 @@ "guid": "44c7c891-9ca1-4f6d-9315-ae524ba34d45", "service": "AVS", "services": [ - "AVS", - "Arc" + "Arc", + "AVS" ], "severity": "Medium", "subcategory": "Security (guest/VM)", @@ -1191,8 +4725,8 @@ "guid": "85e12139-bd7b-4b01-8f7b-95ef6e043e2a", "service": "AVS", "services": [ - "AVS", - "SQL" + "SQL", + "AVS" ], "severity": "Low", "subcategory": "Security (guest/VM)", @@ -1205,8 +4739,8 @@ "guid": "a3592718-e6e2-4051-9267-6ae46691e883", "service": "AVS", "services": [ - "AKV", - "AVS" + "AVS", + "AKV" ], "severity": "Low", "subcategory": "Security (guest/VM)", @@ -1245,9 +4779,9 @@ "guid": "d88408f3-7273-44c8-96ba-280214590146", "service": "AVS", "services": [ - "AVS", + "Storage", "AzurePolicy", - "Storage" + "AVS" ], "severity": "High", "subcategory": "Governance (platform)", @@ -1260,8 +4794,8 @@ "guid": "d89f2e87-7784-424d-9167-85c6fa95b96a", "service": "AVS", "services": [ - "AVS", - "ASR" + "ASR", + "AVS" ], "severity": "High", "subcategory": "Governance (platform)", @@ -1287,8 +4821,8 @@ "guid": "bf39d95d-44c7-4c89-89ca-1f6d5315ae52", "service": "AVS", "services": [ - "AVS", - "AzurePolicy" + "AzurePolicy", + "AVS" ], "severity": "Medium", "subcategory": "Governance (platform)", @@ -1301,8 +4835,8 @@ "guid": "4ba34d45-85e1-4213-abd7-bb012f7b95ef", "service": "AVS", "services": [ - "AVS", - "Cost" + "Cost", + "AVS" ], "severity": "Medium", "subcategory": "Governance (platform)", @@ -1315,8 +4849,8 @@ "guid": "6e043e2a-a359-4271-ae6e-205172676ae4", "service": "AVS", "services": [ - "AVS", - "Cost" + "Cost", + "AVS" ], "severity": "Low", "subcategory": "Governance (platform)", @@ -1355,9 +4889,9 @@ "guid": "48b262d6-cc5f-4512-a253-98e6db9d37da", "service": "AVS", "services": [ - "AVS", "VM", - "Defender" + "Defender", + "AVS" ], "severity": "Medium", "subcategory": "Governance (guest/VM)", @@ -1370,9 +4904,9 @@ "guid": "41741583-3ef7-4ad7-a6d3-733165c7acbe", "service": "AVS", "services": [ - "AVS", "VM", - "Arc" + "Arc", + "AVS" ], "severity": "Medium", "subcategory": "Governance (guest/VM)", @@ -1398,9 +4932,9 @@ "guid": "4ed90dae-2cc8-44c4-9b6b-781cbafe6c46", "service": "AVS", "services": [ - "AVS", "VM", - "Monitor" + "Monitor", + "AVS" ], "severity": "Medium", "subcategory": "Governance (guest/VM)", @@ -1414,9 +4948,9 @@ "service": "AVS", "services": [ "VM", + "AzurePolicy", "AVS", - "Backup", - "AzurePolicy" + "Backup" ], "severity": "Medium", "subcategory": "Governance (guest/VM)", @@ -1429,9 +4963,9 @@ "guid": "ee29711b-d352-4caa-ab79-b198dab81932", "service": "AVS", "services": [ - "AVS", "Defender", - "Monitor" + "Monitor", + "AVS" ], "severity": "Medium", "subcategory": "Compliance", @@ -1444,8 +4978,8 @@ "guid": "c9fc9d1b-b780-436f-9e6b-fbb9ed503547", "service": "AVS", "services": [ - "AVS", - "Defender" + "Defender", + "AVS" ], "severity": "Medium", "subcategory": "Compliance", @@ -1497,8 +5031,8 @@ "guid": "e43a18a9-cd28-49ce-b6b1-7db8255461e2", "service": "AVS", "services": [ - "AVS", - "Monitor" + "Monitor", + "AVS" ], "severity": "High", "subcategory": "Monitoring", @@ -1511,8 +5045,8 @@ "guid": "6b84ee5d-f47d-42d9-8881-b1cd5d1e54a2", "service": "AVS", "services": [ - "AVS", - "Monitor" + "Monitor", + "AVS" ], "severity": "High", "subcategory": "Monitoring", @@ -1525,8 +5059,8 @@ "guid": "9659e396-80e7-4828-ac93-5657d02bff45", "service": "AVS", "services": [ - "AVS", - "Monitor" + "Monitor", + "AVS" ], "severity": "High", "subcategory": "Monitoring", @@ -1539,8 +5073,8 @@ "guid": "64b0d934-a348-4726-be79-d6b5c3a36495", "service": "AVS", "services": [ - "AVS", - "Monitor" + "Monitor", + "AVS" ], "severity": "High", "subcategory": "Monitoring", @@ -1554,8 +5088,8 @@ "service": "AVS", "services": [ "Monitor", - "AVS", - "Storage" + "Storage", + "AVS" ], "severity": "Medium", "subcategory": "Monitoring", @@ -1568,8 +5102,8 @@ "guid": "9674c5ed-85b8-459c-9733-be2b1a27b775", "service": "AVS", "services": [ - "AVS", - "Monitor" + "Monitor", + "AVS" ], "severity": "Low", "subcategory": "Monitoring", @@ -1582,10 +5116,10 @@ "guid": "a91be1f3-88f0-43a4-b2cd-463cbbbc8682", "service": "AVS", "services": [ - "AVS", "VM", + "Storage", "AzurePolicy", - "Storage" + "AVS" ], "severity": "High", "subcategory": "Operations", @@ -1611,9 +5145,9 @@ "guid": "0e43a18a-9cd2-489b-bd6b-17db8255461e", "service": "AVS", "services": [ + "Storage", "AVS", - "Backup", - "Storage" + "Backup" ], "severity": "Medium", "subcategory": "Operations", @@ -1626,8 +5160,8 @@ "guid": "2aee3453-aec8-4339-848b-262d6cc5f512", "service": "AVS", "services": [ - "AVS", - "Arc" + "Arc", + "AVS" ], "severity": "Medium", "subcategory": "Operations", @@ -1640,8 +5174,8 @@ "guid": "925398e6-da9d-437d-ac43-bc6cd1d79a9b", "service": "AVS", "services": [ - "AVS", - "Monitor" + "Monitor", + "AVS" ], "severity": "Medium", "subcategory": "Operations", @@ -1667,9 +5201,9 @@ "guid": "17e7a8d9-0ae0-4e27-aee2-9711bd352caa", "service": "AVS", "services": [ - "AVS", + "Monitor", "AzurePolicy", - "Monitor" + "AVS" ], "severity": "Medium", "subcategory": "Operations", @@ -1682,8 +5216,8 @@ "guid": "aee3553a-fc83-4392-98b2-62d6cc5f5129", "service": "AVS", "services": [ - "AVS", - "Defender" + "Defender", + "AVS" ], "severity": "Medium", "subcategory": "Security", @@ -1710,8 +5244,8 @@ "guid": "5e6bfbb9-ed50-4354-9cc4-47e826028a71", "service": "AVS", "services": [ - "AVS", - "ASR" + "ASR", + "AVS" ], "severity": "Medium", "subcategory": "Disaster Recovery", @@ -1724,8 +5258,8 @@ "guid": "f0f1cac6-d9ef-41d5-b832-d42e3611c818", "service": "AVS", "services": [ - "AVS", - "ASR" + "ASR", + "AVS" ], "severity": "Medium", "subcategory": "Disaster Recovery", @@ -1738,8 +5272,8 @@ "guid": "b0afbc51-0e43-4a18-a9cd-289bed6b17db", "service": "AVS", "services": [ - "AVS", - "ASR" + "ASR", + "AVS" ], "severity": "High", "subcategory": "Disaster Recovery", @@ -1752,8 +5286,8 @@ "guid": "8255461e-2aee-4345-9aec-8339248b262d", "service": "AVS", "services": [ - "AVS", - "ASR" + "ASR", + "AVS" ], "severity": "Medium", "subcategory": "Disaster Recovery", @@ -1766,8 +5300,8 @@ "guid": "6cc5f512-9253-498e-9da9-d37dac43bc6c", "service": "AVS", "services": [ - "AVS", - "ASR" + "ASR", + "AVS" ], "severity": "High", "subcategory": "Disaster Recovery", @@ -1780,9 +5314,9 @@ "guid": "d1d79a9b-2460-4448-aa8f-42d78e78cb6a", "service": "AVS", "services": [ - "AVS", "ASR", "NVA", + "AVS", "ExpressRoute" ], "severity": "Medium", @@ -1903,8 +5437,8 @@ "guid": "0f1cac6d-9ef1-4d5e-a32e-42e3611c818b", "service": "AVS", "services": [ - "AVS", - "AzurePolicy" + "AzurePolicy", + "AVS" ], "severity": "Low", "subcategory": "Automated Deployment", @@ -1917,8 +5451,8 @@ "guid": "e2cc95d4-8c6b-4791-bca0-f6c56589e558", "service": "AVS", "services": [ - "AKV", - "AVS" + "AVS", + "AKV" ], "severity": "Low", "subcategory": "Automated Connectivity", @@ -1931,9 +5465,9 @@ "guid": "255461e2-aee3-4553-afc8-339248b262d6", "service": "AVS", "services": [ - "AKV", "AVS", - "ExpressRoute" + "ExpressRoute", + "AKV" ], "severity": "Low", "subcategory": "Automated Connectivity", @@ -1972,8 +5506,8 @@ "guid": "3bd2a0a1-7e7a-48d9-8ae0-e37cee29711b", "service": "AVS", "services": [ - "AVS", - "Subscriptions" + "Subscriptions", + "AVS" ], "severity": "Medium", "subcategory": "Automated Scale", @@ -1986,9 +5520,9 @@ "guid": "d352caaa-b79b-4198-bab8-1932c9fc9d1b", "service": "AVS", "services": [ - "AVS", + "Storage", "AzurePolicy", - "Storage" + "AVS" ], "severity": "Medium", "subcategory": "Automated Scale", @@ -2040,8 +5574,8 @@ "guid": "1dc15a1c-075e-4e9f-841a-cccd579376bc", "service": "AVS", "services": [ - "AVS", - "Monitor" + "Monitor", + "AVS" ], "severity": "Medium", "subcategory": "Automated Scale", @@ -2055,8 +5589,8 @@ "link": "https://learn.microsoft.com/azure/active-directory/app-proxy/application-proxy#how-application-proxy-works", "service": "AVS", "services": [ - "AVS", - "VM" + "VM", + "AVS" ], "severity": "High", "subcategory": "Architecture", @@ -2085,8 +5619,8 @@ "guid": "bc91a43d-90da-4e2c-a881-4706f7c1cbaf", "service": "AVS", "services": [ - "VPN", - "AVS" + "AVS", + "VPN" ], "severity": "Medium", "subcategory": "Networking", @@ -2126,9 +5660,9 @@ "link": "https://learn.microsoft.com/azure/web-application-firewall/afds/waf-front-door-policy-settings", "service": "AVS", "services": [ - "AVS", "VM", - "Storage" + "Storage", + "AVS" ], "severity": "Medium", "subcategory": "Architecture", @@ -2142,9 +5676,9 @@ "link": "https://learn.microsoft.com/azure/frontdoor/best-practices#avoid-combining-traffic-manager-and-front-door", "service": "AVS", "services": [ + "Storage", "AVS", - "ExpressRoute", - "Storage" + "ExpressRoute" ], "severity": "Medium", "subcategory": "Architecture", @@ -2158,9 +5692,9 @@ "link": "https://learn.microsoft.com/azure/frontdoor/best-practices#use-the-same-domain-name-on-front-door-and-your-origin", "service": "AVS", "services": [ + "Storage", "AVS", - "ExpressRoute", - "Storage" + "ExpressRoute" ], "severity": "Medium", "subcategory": "Architecture", @@ -2174,8 +5708,8 @@ "link": "https://learn.microsoft.com/azure/frontdoor/best-practices#disable-health-probes-when-theres-only-one-origin-in-an-origin-group", "service": "AVS", "services": [ - "AVS", - "ASR" + "ASR", + "AVS" ], "severity": "High", "subcategory": "Architecture", @@ -2263,8 +5797,8 @@ "link": "https://learn.microsoft.com/azure/container-registry/container-registry-azure-policy", "service": "ACR", "services": [ - "AzurePolicy", - "ACR" + "ACR", + "AzurePolicy" ], "severity": "High", "subcategory": "Data Protection", @@ -2279,8 +5813,8 @@ "link": "https://learn.microsoft.com/azure/container-registry/container-registry-tutorial-sign-build-push", "service": "ACR", "services": [ - "AKV", - "ACR" + "ACR", + "AKV" ], "severity": "High", "subcategory": "Data Protection", @@ -2295,8 +5829,8 @@ "link": "https://learn.microsoft.com/azure/container-registry/tutorial-customer-managed-keys", "service": "ACR", "services": [ - "AKV", - "ACR" + "ACR", + "AKV" ], "severity": "Medium", "subcategory": "Data Protection", @@ -2395,8 +5929,8 @@ "services": [ "Entra", "EventHubs", - "PrivateLink", - "ACR" + "ACR", + "PrivateLink" ], "severity": "High", "subcategory": "Identity and Access Control", @@ -2412,8 +5946,8 @@ "service": "ACR", "services": [ "Entra", - "AzurePolicy", - "ACR" + "ACR", + "AzurePolicy" ], "severity": "Medium", "subcategory": "Identity and Access Control", @@ -2428,9 +5962,9 @@ "link": "https://learn.microsoft.com/azure/container-registry/monitor-service", "service": "ACR", "services": [ - "Entra", "Monitor", - "ACR" + "ACR", + "Entra" ], "severity": "Medium", "subcategory": "Logging and Monitoring", @@ -2445,10 +5979,10 @@ "link": "https://learn.microsoft.com/azure/container-registry/container-registry-private-link", "service": "ACR", "services": [ - "PrivateLink", "VNet", + "ACR", "Firewall", - "ACR" + "PrivateLink" ], "severity": "Medium", "subcategory": "Network Security", @@ -2463,8 +5997,8 @@ "link": "https://learn.microsoft.com/azure/container-registry/container-registry-access-selected-networks#disable-public-network-access", "service": "ACR", "services": [ - "PrivateLink", - "ACR" + "ACR", + "PrivateLink" ], "severity": "Medium", "subcategory": "Network Security", @@ -2479,8 +6013,8 @@ "link": "https://learn.microsoft.com/azure/container-registry/container-registry-skus", "service": "ACR", "services": [ - "PrivateLink", - "ACR" + "ACR", + "PrivateLink" ], "severity": "Medium", "subcategory": "Network Security", @@ -2538,9 +6072,9 @@ "guid": "976f32a7-30d1-6caa-c2a0-207fdc26571b", "link": "https://learn.microsoft.com/azure/azure-vmware/set-up-backup-server-for-azure-vmware-solution", "services": [ + "Storage", "AVS", - "Backup", - "Storage" + "Backup" ], "severity": "Medium", "subcategory": "Backup", @@ -2569,9 +6103,9 @@ "guid": "be28860f-3d29-a79a-1a0e-36f1b23b36ae", "link": "Best practice to deploy backup in the same region as your AVS deployment", "services": [ + "ASR", "AVS", - "Backup", - "ASR" + "Backup" ], "severity": "Medium", "subcategory": "Business Continuity", @@ -2613,8 +6147,8 @@ "guid": "f379436d-3051-daa0-01fb-dc4e0e04d677", "link": "https://docs.microsoft.com/azure/azure-vmware/disaster-recovery-using-vmware-site-recovery-manager", "services": [ - "AVS", - "ASR" + "ASR", + "AVS" ], "severity": "Medium", "subcategory": "Disaster Recovery", @@ -2628,8 +6162,8 @@ "guid": "367f71d8-3cf6-51a0-91a5-3db3d570cc19", "link": "https://docs.microsoft.com/azure/site-recovery/avs-tutorial-prepare-azure", "services": [ - "AVS", - "ASR" + "ASR", + "AVS" ], "severity": "Medium", "subcategory": "Disaster Recovery", @@ -2643,8 +6177,8 @@ "guid": "ee02ada0-1887-bb3a-b84c-423f45a09ef9", "link": "https://docs.microsoft.com/azure/site-recovery/avs-tutorial-prepare-azure", "services": [ - "AVS", - "ASR" + "ASR", + "AVS" ], "severity": "Medium", "subcategory": "Disaster Recovery", @@ -2658,8 +6192,8 @@ "guid": "0c2b74e5-9c28-780d-1df3-12d3de4aaa76", "link": "https://docs.microsoft.com/azure/azure-vmware/connect-multiple-private-clouds-same-region", "services": [ - "AVS", - "ASR" + "ASR", + "AVS" ], "severity": "Medium", "subcategory": "Disaster Recovery", @@ -2673,8 +6207,8 @@ "guid": "c2a34ec4-2933-4e6c-dc36-e20e67abbe3f", "link": "https://docs.microsoft.com/azure/cloud-adoption-framework/ready/azure-best-practices/plan-for-ip-addressing", "services": [ - "AVS", - "ASR" + "ASR", + "AVS" ], "severity": "Medium", "subcategory": "Disaster Recovery", @@ -2688,9 +6222,9 @@ "guid": "b44fb6ec-bfc1-3a8e-dba2-ca97f0991d2c", "link": "This depends if you have multiple AVS Private Clouds. If so and they are in the same region then use AVS Interconnect. If they are in separate regions then use ExpressRoute Global Reach.", "services": [ - "AVS", "ASR", "NVA", + "AVS", "ExpressRoute" ], "severity": "Medium", @@ -2780,8 +6314,8 @@ "guid": "91f7a87b-21ac-d712-959c-8df2ba034253", "link": "https://learn.microsoft.com/azure/virtual-network/quick-create-portal", "services": [ - "AVS", - "VNet" + "VNet", + "AVS" ], "severity": "Medium", "subcategory": "Hub & Spoke", @@ -2795,10 +6329,10 @@ "guid": "58a027e2-f37f-b540-45d5-e44843aba26b", "link": "https://learn.microsoft.com/azure/vpn-gateway/vpn-gateway-about-vpn-gateway-settings", "services": [ - "VPN", - "AVS", + "ExpressRoute", "VNet", - "ExpressRoute" + "AVS", + "VPN" ], "severity": "Medium", "subcategory": "Hub & Spoke", @@ -2812,10 +6346,10 @@ "guid": "d4806549-0913-3e79-b580-ac2d3706e65a", "link": "https://learn.microsoft.com/azure/vpn-gateway/vpn-gateway-about-vpn-gateway-settings", "services": [ - "VPN", - "AVS", + "ExpressRoute", "VNet", - "ExpressRoute" + "AVS", + "VPN" ], "severity": "Medium", "subcategory": "Hub & Spoke", @@ -2829,10 +6363,10 @@ "guid": "864d7a8b-7016-c769-a717-61af6bfb73d2", "link": "https://learn.microsoft.com/azure/vpn-gateway/vpn-gateway-about-vpn-gateway-settings", "services": [ - "VPN", - "AVS", + "ExpressRoute", "VNet", - "ExpressRoute" + "AVS", + "VPN" ], "severity": "Medium", "subcategory": "Hub & Spoke", @@ -2846,8 +6380,8 @@ "guid": "cc2e11b9-7911-7da1-458c-d7fcef794aad", "link": "https://learn.microsoft.com/azure/azure-vmware/enable-public-internet-access", "services": [ - "AVS", - "NVA" + "NVA", + "AVS" ], "severity": "Medium", "subcategory": "Internet", @@ -2877,8 +6411,8 @@ "link": "https://learn.microsoft.com/azure/bastion/tutorial-create-host-portal", "services": [ "Bastion", - "AVS", - "VNet" + "VNet", + "AVS" ], "severity": "Medium", "subcategory": "Jumpbox & Bastion", @@ -2893,8 +6427,8 @@ "link": "https://learn.microsoft.com/azure/virtual-network/network-security-groups-overview", "services": [ "Bastion", - "AVS", - "VM" + "VM", + "AVS" ], "severity": "Medium", "subcategory": "Jumpbox & Bastion", @@ -2908,8 +6442,8 @@ "guid": "9988598f-2a9f-6b12-9b46-488415ceb325", "link": "https://learn.microsoft.com/azure/azure-vmware/configure-site-to-site-vpn-gateway", "services": [ - "VPN", - "AVS" + "AVS", + "VPN" ], "severity": "Medium", "subcategory": "VPN", @@ -2923,8 +6457,8 @@ "guid": "956ce5e9-a862-fe2b-a50d-a22923569357", "link": "https://www.omnicalculator.com/other/data-transfer#:~:text=To%20calculate%20the%20data%20transfer%20speed%3A%201%20Download,measured%20time%20to%20find%20the%20data%20transfer%20speed.", "services": [ - "VPN", - "AVS" + "AVS", + "VPN" ], "severity": "Medium", "subcategory": "VPN", @@ -2938,8 +6472,8 @@ "guid": "e095116f-0bdc-4b51-4d71-b9e469d56f59", "link": "https://learn.microsoft.com/azure/architecture/solution-ideas/articles/azure-vmware-solution-foundation-networking", "services": [ - "VPN", - "AVS" + "AVS", + "VPN" ], "severity": "Medium", "subcategory": "VPN", @@ -2968,9 +6502,9 @@ "guid": "51d6affd-8e02-6aea-d3d4-0baf618b3076", "link": "https://learn.microsoft.com/azure/virtual-wan/virtual-wan-point-to-site-portal", "services": [ - "VPN", + "VWAN", "AVS", - "VWAN" + "VPN" ], "severity": "Medium", "subcategory": "vWAN hub", @@ -2984,8 +6518,8 @@ "guid": "e32a4c67-3dc0-c134-1c12-52d46dcbab5b", "link": "https://learn.microsoft.com/azure/virtual-wan/virtual-wan-expressroute-portal", "services": [ - "AVS", "Firewall", + "AVS", "VWAN" ], "severity": "Medium", @@ -3156,8 +6690,8 @@ "link": "Best practice", "services": [ "Entra", - "AVS", - "Monitor" + "Monitor", + "AVS" ], "severity": "Medium", "subcategory": "Security ", @@ -3186,9 +6720,9 @@ "guid": "8f426fd0-d73b-d398-1f6f-df0cbe262a82", "link": "https://learn.microsoft.com/azure/azure-arc/vmware-vsphere/overview", "services": [ - "AVS", "VM", - "Arc" + "Arc", + "AVS" ], "severity": "Medium", "subcategory": "Operations", @@ -3202,9 +6736,9 @@ "guid": "11dbe773-e380-9191-1418-e886fa7a6fd0", "link": "https://docs.microsoft.com/azure/governance/policy/overview", "services": [ - "AVS", + "Monitor", "AzurePolicy", - "Monitor" + "AVS" ], "severity": "Medium", "subcategory": "Operations", @@ -3246,8 +6780,8 @@ "guid": "86b314f9-1f1e-317a-4dfb-cf510ad4a030", "link": "https://docs.microsoft.com/azure/cloud-adoption-framework/ready/azure-best-practices/resource-abbreviations", "services": [ - "AKV", - "AVS" + "AVS", + "AKV" ], "severity": "Medium", "subcategory": "Operations", @@ -3261,8 +6795,8 @@ "guid": "e22a2d99-eb71-7d7c-07af-6d4cdb1d4443", "link": "https://docs.microsoft.com/azure/azure-vmware/configure-alerts-for-azure-vmware-solution", "services": [ - "AVS", - "Monitor" + "Monitor", + "AVS" ], "severity": "Medium", "subcategory": "Alerts", @@ -3276,8 +6810,8 @@ "guid": "6d02f159-627d-79bf-a931-fab6d947eda2", "link": "https://docs.microsoft.com/azure/azure-vmware/configure-alerts-for-azure-vmware-solution", "services": [ - "AVS", - "Monitor" + "Monitor", + "AVS" ], "severity": "Medium", "subcategory": "Alerts", @@ -3291,8 +6825,8 @@ "guid": "1cc97b39-2c7e-246f-6d73-789cfebfe951", "link": "https://www.virtualworkloads.com/2021/04/azure-vmware-solution-azure-service-health/", "services": [ - "AVS", - "Monitor" + "Monitor", + "AVS" ], "severity": "Medium", "subcategory": "Alerts", @@ -3306,11 +6840,11 @@ "guid": "0962606c-e3b4-62a9-5661-e4ffd62a4509", "link": "https://docs.microsoft.com/azure/azure-vmware/set-up-backup-server-for-azure-vmware-solution", "services": [ - "Backup", - "AVS", - "VM", + "Monitor", "AzurePolicy", - "Monitor" + "VM", + "Backup", + "AVS" ], "severity": "Medium", "subcategory": "Backup", @@ -3324,9 +6858,9 @@ "guid": "4ec7ccfb-795e-897e-4a84-fd31c04eadc6", "link": "https://docs.microsoft.com/azure/azure-vmware/configure-alerts-for-azure-vmware-solution", "services": [ - "AVS", + "Monitor", "AzurePolicy", - "Monitor" + "AVS" ], "severity": "Medium", "subcategory": "Capacity", @@ -3340,10 +6874,10 @@ "guid": "7f8f175d-13f4-5298-9e61-0bc7e9fcc279", "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/azure-vmware/govern", "services": [ - "AVS", + "Monitor", "Cost", - "Subscriptions", - "Monitor" + "AVS", + "Subscriptions" ], "severity": "Medium", "subcategory": "Costs", @@ -3358,8 +6892,8 @@ "link": "https://docs.microsoft.com/azure/azure-portal/azure-portal-dashboards", "services": [ "Monitor", - "AVS", - "NetworkWatcher" + "NetworkWatcher", + "AVS" ], "severity": "Medium", "subcategory": "Dashboard", @@ -3373,9 +6907,9 @@ "guid": "f9afdcc9-649d-d840-9fb5-a3c0edcc697d", "link": "https://docs.microsoft.com/azure/azure-vmware/configure-vmware-syslogs", "services": [ - "AVS", + "Monitor", "Storage", - "Monitor" + "AVS" ], "severity": "Medium", "subcategory": "Logs & Metrics", @@ -3389,8 +6923,8 @@ "guid": "7cbac8c3-4eda-d5d9-9bda-c6b5abba9fb6", "link": "Is vROPS or vRealize Network Insight going to be used? ", "services": [ - "AVS", - "Monitor" + "Monitor", + "AVS" ], "severity": "Medium", "subcategory": "Logs & Metrics", @@ -3404,9 +6938,9 @@ "guid": "b243521a-644d-f865-7fb6-21f9019c0dd2", "link": "https://docs.microsoft.com/azure/azure-vmware/configure-vmware-syslogs", "services": [ - "AVS", "VM", - "Monitor" + "Monitor", + "AVS" ], "severity": "Medium", "subcategory": "Logs & Metrics", @@ -3420,11 +6954,11 @@ "guid": "2ca97d91-dd36-7229-b668-01036ccc3cd3", "link": "https://learn.microsoft.com/azure/network-watcher/connection-monitor-create-using-portal", "services": [ + "Monitor", "NetworkWatcher", + "ExpressRoute", "AVS", - "VPN", - "Monitor", - "ExpressRoute" + "VPN" ], "severity": "Medium", "subcategory": "Network", @@ -3438,9 +6972,9 @@ "guid": "99209143-60fe-19f0-5633-8b5671277ba5", "link": "https://learn.microsoft.com/azure/network-watcher/connection-monitor-create-using-portal", "services": [ + "Monitor", "AVS", - "ExpressRoute", - "Monitor" + "ExpressRoute" ], "severity": "Medium", "subcategory": "Network", @@ -3454,8 +6988,8 @@ "guid": "b9e5867c-57d3-036f-fb1b-3f0a71664efe", "link": "https://learn.microsoft.com/azure/network-watcher/connection-monitor-create-using-portal", "services": [ - "AVS", - "Monitor" + "Monitor", + "AVS" ], "severity": "Medium", "subcategory": "Network", @@ -3469,8 +7003,8 @@ "guid": "4af7c5f7-e5e9-bedf-a8cf-314b81735962", "link": "Firewall logging and alerting rules are configured (Azure Firewall or 3rd party)", "services": [ - "AVS", - "Monitor" + "Monitor", + "AVS" ], "severity": "Medium", "subcategory": "Security", @@ -3484,8 +7018,8 @@ "guid": "74be60a3-cfac-f057-eda6-3ee087e805d5", "link": "https://docs.microsoft.com/azure/cloud-adoption-framework/scenarios/azure-vmware/eslz-network-topology-connectivity", "services": [ - "AVS", - "Monitor" + "Monitor", + "AVS" ], "severity": "Medium", "subcategory": "Security", @@ -3499,8 +7033,8 @@ "guid": "a434b3b5-f258-0845-cd76-d7df6ef5890e", "link": "https://docs.microsoft.com/azure/azure-vmware/configure-vmware-syslogs", "services": [ - "AVS", - "Monitor" + "Monitor", + "AVS" ], "severity": "Medium", "subcategory": "VMWare", @@ -3514,9 +7048,9 @@ "guid": "fb00b69a-83ec-ce72-446e-6c23a0cab09a", "link": "https://docs.microsoft.com/azure/azure-monitor/agents/agent-windows?tabs=setup-wizard", "services": [ - "AVS", "VM", - "Monitor" + "Monitor", + "AVS" ], "severity": "Medium", "subcategory": "VMware", @@ -3558,9 +7092,9 @@ "guid": "ebd3cc3c-ac3d-4293-950d-cecd8445a523", "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/azure-vmware/eslz-network-topology-connectivity", "services": [ + "NVA", "ARS", - "AVS", - "NVA" + "AVS" ], "severity": "Medium", "subcategory": "Hub & Spoke", @@ -3603,10 +7137,10 @@ "guid": "e942c03d-beaa-3d9f-0526-9b26cd5e9937", "link": "Research and choose optimal solution for each application", "services": [ - "AVS", + "FrontDoor", "AppGW", - "NVA", - "FrontDoor" + "AVS", + "NVA" ], "severity": "Medium", "subcategory": "Internet", @@ -3636,14 +7170,14 @@ "link": "https://docs.microsoft.com/azure/ddos-protection/manage-ddos-protection", "services": [ "AppGW", + "VNet", "DDoS", - "AVS", "VM", - "VPN", - "LoadBalancer", "FrontDoor", "ExpressRoute", - "VNet" + "VPN", + "AVS", + "LoadBalancer" ], "severity": "Medium", "subcategory": "Security", @@ -3685,9 +7219,9 @@ "guid": "3f621543-dfac-c471-54a6-7b2849b6909a", "link": "https://learn.microsoft.com/azure/architecture/networking/hub-spoke-vwan-architecture", "services": [ + "VWAN", "AVS", - "Firewall", - "VWAN" + "Firewall" ], "severity": "Medium", "subcategory": "Virtual WAN", @@ -3716,8 +7250,8 @@ "guid": "7d049005-eb35-4a93-50a5-3b31a9f61161", "link": "https://docs.microsoft.com/azure/azure-vmware/configure-nsx-network-components-azure-portal", "services": [ - "AVS", - "Subscriptions" + "Subscriptions", + "AVS" ], "severity": "Medium", "subcategory": "Automated Scale", @@ -3731,9 +7265,9 @@ "guid": "7242c1de-da37-27f3-1ddd-565ccccb8ece", "link": "https://docs.microsoft.com/azure/cloud-adoption-framework/scenarios/azure-vmware/eslz-platform-automation-and-devops#automated-scale", "services": [ - "AVS", + "Storage", "AzurePolicy", - "Storage" + "AVS" ], "severity": "Medium", "subcategory": "Automated Scale", @@ -3789,8 +7323,8 @@ "guid": "7bd65a5e-7b5d-652d-dbea-fc6f73a42857", "link": "https://docs.microsoft.com/azure/cloud-adoption-framework/scenarios/azure-vmware/eslz-management-and-monitoring", "services": [ - "AVS", - "Monitor" + "Monitor", + "AVS" ], "severity": "Medium", "subcategory": "Automated Scale", @@ -3804,8 +7338,8 @@ "guid": "95e374af-8a2a-2672-7ab7-b4a1be43ada7", "link": "https://learn.microsoft.com/azure/private-link/private-link-overview", "services": [ - "PrivateLink", - "AVS" + "AVS", + "PrivateLink" ], "severity": "Medium", "subcategory": "Networking", @@ -3847,8 +7381,8 @@ "guid": "e52d1615-9cc6-565c-deb6-743ed7e90f4b", "link": "Internal policy or regulatory compliance", "services": [ - "AVS", - "AzurePolicy" + "AzurePolicy", + "AVS" ], "severity": "Medium", "subcategory": "Pre-deployment", @@ -3890,8 +7424,8 @@ "guid": "96c76997-30a6-bb92-024d-f4f93f5f57fa", "link": "Done through the subscription/resource providers/ AVS register in the portal", "services": [ - "AVS", - "Subscriptions" + "Subscriptions", + "AVS" ], "severity": "Medium", "subcategory": "Pre-deployment", @@ -3905,8 +7439,8 @@ "guid": "5898e3ff-5e6b-bee1-6f85-22fee261ce63", "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/azure-vmware/enterprise-scale-landing-zone", "services": [ - "AVS", - "Subscriptions" + "Subscriptions", + "AVS" ], "severity": "Medium", "subcategory": "Pre-deployment", @@ -3962,8 +7496,8 @@ "guid": "0c87f999-e517-21ef-f355-f210ad4134d2", "link": "https://docs.vmware.com/en/VMware-NSX-T-Data-Center/3.2/installation/GUID-4B3860B8-1883-48CA-B2F3-7C2205D91D6D.html", "services": [ - "AVS", - "VNet" + "VNet", + "AVS" ], "severity": "Medium", "subcategory": "Pre-deployment", @@ -4005,8 +7539,8 @@ "guid": "f2b73c4f-3d46-32c9-5df1-5b8dfcd3947f", "link": "https://azure.microsoft.com/en-ca/pricing/details/azure-vmware/#:~:text=Azure%20VMware%20Solution%20%20%20%20Instance%20size,TB%20%28all%20NVMe%29%20%20%20N%2FA%20%2Fhour%20", "services": [ - "AVS", - "Cost" + "Cost", + "AVS" ], "severity": "Medium", "subcategory": "Pre-deployment", @@ -4020,8 +7554,8 @@ "guid": "94ac48ab-ade5-3fa7-f800-263feeb97070", "link": "https://docs.microsoft.com/azure/azure-vmware/concepts-storage#storage-policies-and-fault-tolerance", "services": [ - "AVS", - "ASR" + "ASR", + "AVS" ], "severity": "Medium", "subcategory": "Pre-deployment", @@ -4063,8 +7597,8 @@ "guid": "70cfbddc-d3d4-9188-77c8-1cabaefef646", "link": "General recommendation for storing encryption keys.", "services": [ - "AKV", - "AVS" + "AVS", + "AKV" ], "severity": "Medium", "subcategory": "Encryption", @@ -4078,8 +7612,8 @@ "guid": "c1a81638-18df-0ce9-a73a-4b9a8a8dd392", "link": "https://docs.microsoft.com/azure/azure-vmware/concepts-storage#data-at-rest-encryption", "services": [ - "AVS", - "SQL" + "SQL", + "AVS" ], "severity": "Medium", "subcategory": "Encryption", @@ -4093,9 +7627,9 @@ "guid": "8d0a8f51-8d35-19cd-c2fe-4e3512fb467e", "link": "https://docs.microsoft.com/azure/key-vault/general/authentication", "services": [ - "AKV", "AVS", - "ExpressRoute" + "ExpressRoute", + "AKV" ], "severity": "Medium", "subcategory": "Encryption", @@ -4138,8 +7672,8 @@ "guid": "f42b0b09-c591-238a-1580-2de3c485ebd2", "link": "https://learn.microsoft.com/azure/azure-vmware/azure-security-integration#prerequisites", "services": [ - "AVS", - "Defender" + "Defender", + "AVS" ], "severity": "Medium", "subcategory": "Security", @@ -4153,8 +7687,8 @@ "guid": "bcdd2348-3d0e-c6bb-1092-aa4cd1a66d6b", "link": "https://docs.microsoft.com/azure/azure-vmware/azure-security-integration", "services": [ - "AVS", - "AzurePolicy" + "AzurePolicy", + "AVS" ], "severity": "Medium", "subcategory": "Security", @@ -4308,8 +7842,8 @@ "guid": "16ab821a-27c6-b6d3-6042-10dc4d6dfcb7", "link": "https://docs.vmware.com/en/VMware-vSphere/7.0/com.vmware.vsphere.storage.doc/GUID-01D3CF47-A84A-4988-8103-A0487D6441AA.html", "services": [ - "AVS", - "Storage" + "Storage", + "AVS" ], "severity": "Medium", "subcategory": "Storage", @@ -4323,9 +7857,9 @@ "guid": "eb2f9313-afb2-ab35-aa24-6d97a3cb0611", "link": "3rd-Party tools", "services": [ - "AVS", "VM", - "Storage" + "Storage", + "AVS" ], "severity": "Medium", "subcategory": "Storage", @@ -4339,9 +7873,9 @@ "guid": "3f2a5cff-c8a6-634a-1f1b-53ef9d321381", "link": "Contact VMware", "services": [ - "AVS", "VM", - "Storage" + "Storage", + "AVS" ], "severity": "Medium", "subcategory": "Storage", @@ -4355,8 +7889,8 @@ "guid": "efc8a311-74f8-0252-c6a0-4bac7610e266", "link": "Contact VMware", "services": [ - "AVS", - "Storage" + "Storage", + "AVS" ], "severity": "Medium", "subcategory": "Storage", @@ -4370,8 +7904,8 @@ "guid": "ab6c89cd-a26f-b894-fe59-61863975458e", "link": "Contact VMware", "services": [ - "AVS", - "Storage" + "Storage", + "AVS" ], "severity": "Medium", "subcategory": "Storage", @@ -4385,10 +7919,10 @@ "guid": "7628d446-6b10-9678-9cec-f407d990de43", "link": "https://learn.microsoft.com/azure/azure-vmware/concepts-storage#storage-policies-and-fault-tolerance", "services": [ - "AVS", "VM", + "Storage", "AzurePolicy", - "Storage" + "AVS" ], "severity": "Medium", "subcategory": "Storage", @@ -4402,10 +7936,10 @@ "guid": "37fef358-7ab9-43a9-542c-22673955200e", "link": "https://learn.microsoft.com/azure/azure-vmware/configure-storage-policy", "services": [ - "AVS", "VM", + "Storage", "AzurePolicy", - "Storage" + "AVS" ], "severity": "Medium", "subcategory": "Storage", @@ -4419,9 +7953,9 @@ "guid": "ebebd109-9f9d-d85e-1b2f-d302012843b7", "link": "https://learn.microsoft.com/azure/azure-vmware/concepts-storage#storage-policies-and-fault-tolerance", "services": [ - "AVS", + "Storage", "AzurePolicy", - "Storage" + "AVS" ], "severity": "Medium", "subcategory": "Storage", @@ -4435,8 +7969,8 @@ "guid": "1be821bd-4f37-216a-3e3d-2a5ac6996863", "link": "https://learn.microsoft.com/azure/azure-vmware/netapp-files-with-azure-vmware-solution", "services": [ - "AVS", - "Storage" + "Storage", + "AVS" ], "severity": "Medium", "subcategory": "Storage", @@ -4515,8 +8049,8 @@ "link": "https://learn.microsoft.com/azure/service-bus-messaging/service-bus-outages-disasters#geo-disaster-recovery", "services": [ "ServiceBus", - "ASR", - "Storage" + "Storage", + "ASR" ], "severity": "Medium", "subcategory": "Geo-Disaster Recovery", @@ -4586,9 +8120,9 @@ "guid": "4a69b9d3-39ac-44e7-a68d-1d75657202b4", "link": "https://learn.microsoft.com/azure/well-architected/service-guides/service-bus/reliability#checklist", "services": [ - "PrivateLink", "ServiceBus", - "Storage" + "Storage", + "PrivateLink" ], "severity": "Medium", "subcategory": "Best Practices", @@ -4628,8 +8162,8 @@ "link": "https://learn.microsoft.com/azure/well-architected/service-guides/service-bus/reliability#checklist", "services": [ "ServiceBus", - "ASR", - "Storage" + "Storage", + "ASR" ], "severity": "Medium", "subcategory": "Best Practices", @@ -4741,11 +8275,11 @@ "link": "https://learn.microsoft.com/azure/service-bus-messaging/service-bus-sas#shared-access-authorization-policies", "service": "Service Bus", "services": [ - "Entra", "AzurePolicy", - "TrafficManager", + "Entra", + "ServiceBus", "RBAC", - "ServiceBus" + "TrafficManager" ], "severity": "Medium", "subcategory": "Identity and Access Management", @@ -4761,12 +8295,12 @@ "link": "https://learn.microsoft.com/azure/service-bus-messaging/service-bus-managed-service-identity", "service": "Service Bus", "services": [ + "Storage", "Entra", "AKV", - "Storage", + "ServiceBus", "VM", - "AppSvc", - "ServiceBus" + "AppSvc" ], "severity": "Medium", "subcategory": "Identity and Access Management", @@ -4782,11 +8316,11 @@ "link": "https://learn.microsoft.com/azure/service-bus-messaging/authenticate-application#azure-built-in-roles-for-azure-service-bus", "service": "Service Bus", "services": [ - "Entra", "Storage", - "RBAC", + "Entra", "Subscriptions", - "ServiceBus" + "ServiceBus", + "RBAC" ], "severity": "High", "subcategory": "Identity and Access Management", @@ -4820,9 +8354,9 @@ "link": "https://learn.microsoft.com/azure/service-bus-messaging/private-link-service", "service": "Service Bus", "services": [ - "PrivateLink", "ServiceBus", - "VNet" + "VNet", + "PrivateLink" ], "severity": "Medium", "subcategory": "Networking", @@ -5693,8 +9227,8 @@ "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/business-continuity-disaster-recovery", "service": "Cognitive Services", "services": [ - "Backup", - "ASR" + "ASR", + "Backup" ], "severity": "High", "subcategory": "Backup", @@ -5789,8 +9323,8 @@ "link": "https://learn.microsoft.com/en-us/azure/app-service/monitor-instances-health-check", "service": "App Services", "services": [ - "AppSvc", - "Monitor" + "Monitor", + "AppSvc" ], "severity": "Medium", "subcategory": "Monitoring", @@ -5875,8 +9409,8 @@ "link": "https://learn.microsoft.com/en-us/azure/app-service/monitor-instances-health-check", "service": "App Services", "services": [ - "AppSvc", - "Monitor" + "Monitor", + "AppSvc" ], "severity": "Medium", "subcategory": "Monitoring", @@ -5890,8 +9424,8 @@ "link": "https://learn.microsoft.com/en-us/azure/azure-monitor/app/availability-overview", "service": "App Services", "services": [ - "AppSvc", - "Monitor" + "Monitor", + "AppSvc" ], "severity": "Medium", "subcategory": "Monitoring", @@ -5905,8 +9439,8 @@ "link": "https://learn.microsoft.com/en-us/azure/azure-monitor/app/availability-standard-tests", "service": "App Services", "services": [ - "AppSvc", - "Monitor" + "Monitor", + "AppSvc" ], "severity": "Low", "subcategory": "Monitoring", @@ -5970,8 +9504,8 @@ "link": "https://learn.microsoft.com/azure/app-service/overview-hosting-plans", "service": "App Services", "services": [ - "AppSvc", - "Subscriptions" + "Subscriptions", + "AppSvc" ], "severity": "Medium", "subcategory": "Data Protection", @@ -5986,8 +9520,8 @@ "link": "https://learn.microsoft.com/azure/app-service/operating-system-functionality#file-access", "service": "App Services", "services": [ - "AppSvc", - "TrafficManager" + "TrafficManager", + "AppSvc" ], "severity": "Medium", "subcategory": "Data Protection", @@ -6068,8 +9602,8 @@ "service": "App Services", "services": [ "Entra", - "AppSvc", - "ACR" + "ACR", + "AppSvc" ], "severity": "High", "subcategory": "Identity and Access Control", @@ -6084,9 +9618,9 @@ "link": "https://learn.microsoft.com/azure/app-service/troubleshoot-diagnostic-logs", "service": "App Services", "services": [ - "Entra", + "Monitor", "AppSvc", - "Monitor" + "Entra" ], "severity": "Medium", "subcategory": "Logging and Monitoring", @@ -6101,9 +9635,9 @@ "link": "https://learn.microsoft.com/azure/azure-monitor/essentials/activity-log", "service": "App Services", "services": [ - "Entra", + "Monitor", "AppSvc", - "Monitor" + "Entra" ], "severity": "Medium", "subcategory": "Logging and Monitoring", @@ -6118,10 +9652,10 @@ "link": "https://learn.microsoft.com/azure/app-service/overview-vnet-integration", "service": "App Services", "services": [ - "NVA", "Monitor", - "AppSvc", + "NVA", "VNet", + "AppSvc", "Firewall" ], "severity": "Medium", @@ -6137,11 +9671,11 @@ "link": "https://learn.microsoft.com/azure/app-service/networking/nat-gateway-integration", "service": "App Services", "services": [ - "PrivateLink", "Storage", "NVA", - "AppSvc", "VNet", + "PrivateLink", + "AppSvc", "Firewall" ], "severity": "Low", @@ -6157,8 +9691,8 @@ "link": "https://learn.microsoft.com/azure/app-service/networking-features#access-restrictions", "service": "App Services", "services": [ - "PrivateLink", - "AppSvc" + "AppSvc", + "PrivateLink" ], "severity": "High", "subcategory": "Network Security", @@ -6173,11 +9707,11 @@ "link": "https://learn.microsoft.com/azure/app-service/networking/app-gateway-with-service-endpoints", "service": "App Services", "services": [ + "Monitor", "AppGW", + "WAF", "FrontDoor", - "Monitor", - "AppSvc", - "WAF" + "AppSvc" ], "severity": "High", "subcategory": "Network Security", @@ -6192,9 +9726,9 @@ "link": "https://learn.microsoft.com/azure/app-service/networking-features#access-restrictions", "service": "App Services", "services": [ - "PrivateLink", + "WAF", "AppSvc", - "WAF" + "PrivateLink" ], "severity": "High", "subcategory": "Network Security", @@ -6210,8 +9744,8 @@ "link": "https://learn.microsoft.com/azure/app-service/configure-ssl-bindings#enforce-tls-versions", "service": "App Services", "services": [ - "AppSvc", - "AzurePolicy" + "AzurePolicy", + "AppSvc" ], "severity": "Medium", "subcategory": "Network Security", @@ -6227,8 +9761,8 @@ "link": "https://learn.microsoft.com/azure/app-service/configure-ssl-bindings#enforce-https", "service": "App Services", "services": [ - "AppSvc", - "WAF" + "WAF", + "AppSvc" ], "severity": "High", "subcategory": "Network Security", @@ -6243,8 +9777,8 @@ "link": "https://learn.microsoft.com/azure/app-service/app-service-web-tutorial-rest-api", "service": "App Services", "services": [ - "AppSvc", - "Storage" + "Storage", + "AppSvc" ], "severity": "High", "subcategory": "Network Security", @@ -6275,8 +9809,8 @@ "link": "https://learn.microsoft.com/azure/defender-for-cloud/defender-for-app-service-introduction", "service": "App Services", "services": [ - "AppSvc", - "Defender" + "Defender", + "AppSvc" ], "severity": "Medium", "subcategory": "Network Security", @@ -6291,13 +9825,13 @@ "link": "https://learn.microsoft.com/azure/ddos-protection/ddos-protection-overview", "service": "App Services", "services": [ - "AppGW", - "DDoS", "EventHubs", - "NVA", - "AppSvc", + "AppGW", "VNet", - "WAF" + "WAF", + "NVA", + "DDoS", + "AppSvc" ], "severity": "Medium", "subcategory": "Network Security", @@ -6312,10 +9846,10 @@ "link": "https://learn.microsoft.com/azure/app-service/configure-custom-container#use-an-image-from-a-network-protected-registry", "service": "App Services", "services": [ - "PrivateLink", - "AppSvc", + "ACR", "VNet", - "ACR" + "AppSvc", + "PrivateLink" ], "severity": "Medium", "subcategory": "Network Security", @@ -6390,8 +9924,8 @@ "link": "https://learn.microsoft.com/azure/storage/common/storage-private-endpoints", "service": "Azure Storage", "services": [ - "PrivateLink", - "Storage" + "Storage", + "PrivateLink" ], "severity": "High", "subcategory": "Networking", @@ -6423,8 +9957,8 @@ "link": "https://learn.microsoft.com/azure/storage/common/azure-defender-storage-configure", "service": "Azure Storage", "services": [ - "Storage", - "Defender" + "Defender", + "Storage" ], "severity": "High", "subcategory": "Governance", @@ -6515,8 +10049,8 @@ "service": "Azure Storage", "services": [ "Storage", - "Subscriptions", - "AzurePolicy" + "AzurePolicy", + "Subscriptions" ], "severity": "High", "subcategory": "Data Availability, Compliance", @@ -6571,7 +10105,23 @@ { "category": "Security", "checklist": "Azure Storage Review Checklist", - "description": "AAD tokens should be favored over shared access signatures, wherever possible", + "description": ". Enforcing the latest TLS version will reject request from clients using the older version. ", + "graph": "resources | where type == 'microsoft.storage/storageaccounts' | extend compliant = (isnull(properties.minimumTlsVersion) == false and properties.minimumTlsVersion in ('TLS1_2', 'TLS1_3')) | distinct id, compliant", + "guid": "e12be569-a18f-4562-8d5d-ce151b9e7d55", + "link": "https://learn.microsoft.com/azure/storage/common/transport-layer-security-configure-minimum-version", + "service": "Azure Storage", + "services": [ + "Storage" + ], + "severity": "High", + "subcategory": "Networking", + "text": "Enforce the latest TLS version for a storage account", + "waf": "Security" + }, + { + "category": "Security", + "checklist": "Azure Storage Review Checklist", + "description": "Microsoft Entra ID tokens should be favored over shared access signatures, wherever possible", "guid": "e1ce15dd-3f0d-45e7-92d4-1e3611cc57b4", "link": "https://learn.microsoft.com/azure/storage/common/authorize-data-access", "service": "Azure Storage", @@ -6581,7 +10131,7 @@ ], "severity": "High", "subcategory": "Identity and Access Management", - "text": "Use Azure Active Directory (Azure AD) tokens for blob access", + "text": "Use Microsoft Entra ID tokens for blob access", "waf": "Security" }, { @@ -6619,19 +10169,20 @@ { "category": "Security", "checklist": "Azure Storage Review Checklist", - "description": "Storage account keys ('shared keys') have very little audit capabilities. While it can be monitored on who/when fetched a copy of the keys, once the keys are in the hands of multiple people, it is impossible to attribute usage to a specific user. Solely relying on AAD authentication makes it easier to tie storage access to a user. ", + "description": "Storage account keys ('shared keys') have very little audit capabilities. While it can be monitored on who/when fetched a copy of the keys, once the keys are in the hands of multiple people, it is impossible to attribute usage to a specific user. Solely relying on Entra ID authentication makes it easier to tie storage access to a user. ", + "graph": "resources | where type == 'microsoft.storage/storageaccounts' | extend allowSharedKeyAccess = tostring(properties.allowSharedKeyAccess) | extend compliant = (isnotempty(allowSharedKeyAccess) and allowSharedKeyAccess == 'false') | distinct id, compliant", "guid": "15f51296-5398-4e6d-bd22-7dd142b06c21", "link": "https://learn.microsoft.com/rest/api/storageservices/authorize-with-shared-key", "service": "Azure Storage", "services": [ "Entra", - "AKV", "Storage", - "Monitor" + "Monitor", + "AKV" ], "severity": "High", "subcategory": "Identity and Access Management", - "text": "Consider disabling storage account keys, so that only AAD access (and user delegation SAS) is supported.", + "text": "Consider disabling storage account keys, so that only Microsoft Entra ID access (and user delegation SAS) is supported.", "waf": "Security" }, { @@ -6642,10 +10193,10 @@ "link": "https://learn.microsoft.com/azure/storage/blobs/blob-storage-monitoring-scenarios#audit-account-activity", "service": "Azure Storage", "services": [ - "AKV", + "Monitor", "Storage", "AzurePolicy", - "Monitor" + "AKV" ], "severity": "High", "subcategory": "Monitoring", @@ -6661,9 +10212,9 @@ "service": "Azure Storage", "services": [ "Entra", - "AKV", "Storage", - "AzurePolicy" + "AzurePolicy", + "AKV" ], "severity": "Medium", "subcategory": "Identity and Access Management", @@ -6696,9 +10247,9 @@ "service": "Azure Storage", "services": [ "Entra", - "AKV", "Storage", - "AzurePolicy" + "AzurePolicy", + "AKV" ], "severity": "Medium", "subcategory": "Identity and Access Management", @@ -6712,8 +10263,8 @@ "link": "https://microsoft.github.io/code-with-engineering-playbook/continuous-integration/dev-sec-ops/secret-management/recipes/detect-secrets-ado/", "service": "Azure Storage", "services": [ - "AKV", - "Storage" + "Storage", + "AKV" ], "severity": "Medium", "subcategory": "CI/CD", @@ -6895,6 +10446,7 @@ "category": "Security", "checklist": "Azure Storage Review Checklist", "description": "Leverage Resource Graph Explorer (resources | where type == 'microsoft.storage/storageaccounts' | where properties['allowBlobPublicAccess'] == true) to find storage accounts which allow anonymous blob access.", + "graph": "resources | where type == 'microsoft.storage/storageaccounts' | extend compliant = (properties.allowBlobPublicAccess == 'false') | distinct id, compliant", "guid": "659ae558-b937-4d49-a5e1-112dbd7ba012", "link": "https://learn.microsoft.com/azure/storage/blobs/anonymous-read-access-configure?tabs=portal#allow-or-disallow-public-read-access-for-a-storage-account", "service": "Azure Storage", @@ -6904,7 +10456,7 @@ ], "severity": "High", "subcategory": "Identity and Access Management", - "text": "Consider whether public blob access is needed, or whether it can be disabled for certain storage accounts. ", + "text": "Consider whether public blob anonymous access is needed, or whether it can be disabled for certain storage accounts. ", "waf": "Security" }, { @@ -7017,11 +10569,11 @@ "link": "https://learn.microsoft.com/azure/event-hubs/authorize-access-shared-access-signature#shared-access-authorization-policies", "service": "Event Hubs", "services": [ - "Entra", + "EventHubs", "AzurePolicy", + "Entra", "RBAC", - "TrafficManager", - "EventHubs" + "TrafficManager" ], "severity": "Medium", "subcategory": "Identity and Access Management", @@ -7037,11 +10589,11 @@ "link": "https://learn.microsoft.com/azure/event-hubs/authenticate-managed-identity?tabs=latest", "service": "Event Hubs", "services": [ + "EventHubs", + "Storage", "Entra", "AKV", - "Storage", - "VM", - "EventHubs" + "VM" ], "severity": "Medium", "subcategory": "Identity and Access Management", @@ -7075,9 +10627,9 @@ "link": "https://learn.microsoft.com/azure/event-hubs/monitor-event-hubs-reference", "service": "Event Hubs", "services": [ + "Monitor", "EventHubs", - "VNet", - "Monitor" + "VNet" ], "severity": "Medium", "subcategory": "Monitoring", @@ -7093,9 +10645,9 @@ "link": "https://learn.microsoft.com/azure/event-hubs/private-link-service", "service": "Event Hubs", "services": [ - "PrivateLink", "EventHubs", - "VNet" + "VNet", + "PrivateLink" ], "severity": "Medium", "subcategory": "Networking", @@ -7216,8 +10768,8 @@ "link": "https://learn.microsoft.com/azure/frontdoor/best-practices#use-latest-version-for-customer-managed-certificates", "service": "Front Door", "services": [ - "AKV", - "FrontDoor" + "FrontDoor", + "AKV" ], "severity": "Medium", "subcategory": "Front Door", @@ -7289,8 +10841,8 @@ "link": "https://learn.microsoft.com/azure/application-gateway/configuration-infrastructure#size-of-the-subnet", "service": "App Gateway", "services": [ - "VNet", - "AppGW" + "AppGW", + "VNet" ], "severity": "Medium", "subcategory": "App Gateway", @@ -7308,10 +10860,10 @@ "services": [ "Entra", "AppGW", - "Subscriptions", - "NVA", "VNet", - "WAF" + "WAF", + "NVA", + "Subscriptions" ], "severity": "Medium", "subcategory": "App Gateway", @@ -7372,9 +10924,9 @@ "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/ag-overview", "service": "Front Door", "services": [ - "WAF", "AzurePolicy", - "FrontDoor" + "FrontDoor", + "WAF" ], "severity": "Medium", "subcategory": "Front Door", @@ -7390,9 +10942,9 @@ "service": "Front Door", "services": [ "AppGW", - "WAF", "AzurePolicy", - "FrontDoor" + "FrontDoor", + "WAF" ], "severity": "Medium", "subcategory": "App delivery", @@ -7423,8 +10975,8 @@ "link": "https://learn.microsoft.com/azure/active-directory/app-proxy/application-proxy#how-application-proxy-works", "service": "Entra", "services": [ - "Entra", - "AVD" + "AVD", + "Entra" ], "severity": "Low", "subcategory": "App delivery", @@ -7456,9 +11008,9 @@ "link": "https://learn.microsoft.com/azure/web-application-firewall/afds/waf-front-door-policy-settings", "service": "Front Door", "services": [ - "WAF", "AzurePolicy", - "FrontDoor" + "FrontDoor", + "WAF" ], "severity": "High", "subcategory": "Front Door", @@ -7565,9 +11117,9 @@ "link": "https://learn.microsoft.com/azure/frontdoor/best-practices#use-managed-tls-certificates", "service": "Front Door", "services": [ - "AKV", "Cost", - "FrontDoor" + "FrontDoor", + "AKV" ], "severity": "High", "subcategory": "Front Door", @@ -7581,8 +11133,8 @@ "link": "https://learn.microsoft.com/azure/web-application-firewall/afds/waf-front-door-best-practices#define-your-waf-configuration-as-code", "service": "Front Door", "services": [ - "FrontDoor", - "WAF" + "WAF", + "FrontDoor" ], "severity": "Medium", "subcategory": "Front Door", @@ -7626,8 +11178,8 @@ "link": "https://learn.microsoft.com/azure/frontdoor/best-practices#enable-the-waf", "service": "Front Door", "services": [ - "FrontDoor", - "WAF" + "WAF", + "FrontDoor" ], "severity": "High", "subcategory": "Front Door", @@ -7642,8 +11194,8 @@ "link": "https://learn.microsoft.com/azure/web-application-firewall/afds/waf-front-door-best-practices#tune-your-waf", "service": "Front Door", "services": [ - "FrontDoor", - "WAF" + "WAF", + "FrontDoor" ], "severity": "High", "subcategory": "Front Door", @@ -7658,9 +11210,9 @@ "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/application-gateway-waf-request-size-limits#request-body-inspection", "service": "Front Door", "services": [ - "WAF", "AzurePolicy", - "FrontDoor" + "FrontDoor", + "WAF" ], "severity": "High", "subcategory": "Front Door", @@ -7675,8 +11227,8 @@ "link": "https://learn.microsoft.com/azure/web-application-firewall/afds/waf-front-door-best-practices#enable-default-rule-sets", "service": "Front Door", "services": [ - "FrontDoor", - "WAF" + "WAF", + "FrontDoor" ], "severity": "High", "subcategory": "Front Door", @@ -7691,8 +11243,8 @@ "link": "https://learn.microsoft.com/azure/web-application-firewall/afds/waf-front-door-best-practices#enable-bot-management-rules", "service": "Front Door", "services": [ - "FrontDoor", - "WAF" + "WAF", + "FrontDoor" ], "severity": "High", "subcategory": "Front Door", @@ -7706,8 +11258,8 @@ "link": "https://learn.microsoft.com/azure/web-application-firewall/afds/waf-front-door-best-practices#use-the-latest-ruleset-versions", "service": "Front Door", "services": [ - "FrontDoor", - "WAF" + "WAF", + "FrontDoor" ], "severity": "Medium", "subcategory": "Front Door", @@ -7721,8 +11273,8 @@ "link": "https://learn.microsoft.com/azure/web-application-firewall/afds/waf-front-door-best-practices#add-rate-limiting", "service": "Front Door", "services": [ - "FrontDoor", - "WAF" + "WAF", + "FrontDoor" ], "severity": "Medium", "subcategory": "Front Door", @@ -7736,8 +11288,8 @@ "link": "https://learn.microsoft.com/azure/web-application-firewall/afds/waf-front-door-best-practices#use-a-high-threshold-for-rate-limits", "service": "Front Door", "services": [ - "FrontDoor", - "WAF" + "WAF", + "FrontDoor" ], "severity": "Medium", "subcategory": "Front Door", @@ -7765,8 +11317,8 @@ "link": "https://learn.microsoft.com/azure/web-application-firewall/afds/waf-front-door-best-practices#specify-the-unknown-zz-location", "service": "Front Door", "services": [ - "FrontDoor", - "WAF" + "WAF", + "FrontDoor" ], "severity": "Medium", "subcategory": "Front Door", @@ -7935,8 +11487,8 @@ "link": "https://learn.microsoft.com/azure/web-application-firewall/afds/waf-front-door-best-practices#add-diagnostic-settings-to-save-your-wafs-logs", "service": "Front Door", "services": [ - "FrontDoor", - "WAF" + "WAF", + "FrontDoor" ], "severity": "Medium", "subcategory": "Front Door", @@ -7967,8 +11519,8 @@ "service": "Front Door", "services": [ "Sentinel", - "FrontDoor", - "WAF" + "WAF", + "FrontDoor" ], "severity": "Medium", "subcategory": "Front Door", @@ -8012,10 +11564,10 @@ "link": "https://learn.microsoft.com/azure/virtual-wan/scenario-secured-hub-app-gateway", "service": "App Gateway", "services": [ - "VPN", - "VNet", "AppGW", - "ExpressRoute" + "VNet", + "ExpressRoute", + "VPN" ], "severity": "Medium", "subcategory": "App Gateway", @@ -8280,8 +11832,8 @@ "guid": "b94ee5ef-47d2-4d92-a81b-1cd6d1f54b29", "link": "https://techcommunity.microsoft.com/t5/fasttrack-for-azure/sharing-metadata-across-different-databricks-workspaces-using/ba-p/3679757", "services": [ - "Backup", - "ACR" + "ACR", + "Backup" ], "severity": "Medium", "subcategory": "Backup", @@ -8294,8 +11846,8 @@ "guid": "769e3969-0e78-428a-a936-657d03b0f466", "link": "https://techcommunity.microsoft.com/t5/fasttrack-for-azure/disaster-recovery-strategy-in-azure-databricks-using-the-hive/ba-p/3684581", "services": [ - "Backup", - "ASR" + "ASR", + "Backup" ], "severity": "Medium", "subcategory": "Backup", @@ -8484,11 +12036,11 @@ "link": "https://learn.microsoft.com/azure/ddos-protection/ddos-protection-overview", "services": [ "Entra", - "DDoS", - "Subscriptions", "VNet", - "Firewall", - "WAF" + "Subscriptions", + "WAF", + "DDoS", + "Firewall" ], "severity": "Low", "subcategory": "DDoS", @@ -8512,8 +12064,8 @@ "guid": "44008ae7-d7e4-4743-876c-8bdbf55bce61", "link": "https://learn.microsoft.com/azure/frontdoor/front-door-overview", "services": [ - "FrontDoor", - "WAF" + "WAF", + "FrontDoor" ], "severity": "Medium", "subcategory": "Internet", @@ -8526,8 +12078,8 @@ "guid": "9e8a03f9-7879-4424-b626-786d60b96c97", "link": "https://learn.microsoft.com/azure/openshift/howto-secure-openshift-with-front-door", "services": [ - "PrivateLink", - "FrontDoor" + "FrontDoor", + "PrivateLink" ], "severity": "Medium", "subcategory": "Internet", @@ -8540,8 +12092,8 @@ "guid": "be985190-4838-435c-a86b-b2912155a114", "link": "https://learn.microsoft.com/azure/openshift/howto-restrict-egress", "services": [ - "AzurePolicy", "NVA", + "AzurePolicy", "Firewall" ], "severity": "Medium", @@ -8568,8 +12120,8 @@ "guid": "ab039da6-d54d-47c8-a29d-b107d5325ae6", "link": "https://learn.microsoft.com/azure/container-registry/container-registry-private-link", "services": [ - "PrivateLink", - "ACR" + "ACR", + "PrivateLink" ], "severity": "Medium", "subcategory": "Private access", @@ -8856,8 +12408,8 @@ "guid": "76af4a69-1e88-439a-ba46-667e13c10567", "link": "https://learn.microsoft.com/azure/openshift/howto-segregate-machinesets", "services": [ - "VNet", - "AKS" + "AKS", + "VNet" ], "severity": "Medium", "subcategory": "Cluster Design", @@ -8941,8 +12493,8 @@ "guid": "08fe8273-4c48-46ba-880d-c0591cf75ee8", "link": "https://learn.microsoft.com/azure/azure-arc/kubernetes/quickstart-connect-cluster", "services": [ - "Arc", - "AKS" + "AKS", + "Arc" ], "severity": "High", "subcategory": "Control plane", @@ -8966,9 +12518,9 @@ "guid": "d55d14c3-c492-49cb-8b3d-1325ae124ba3", "link": "https://learn.microsoft.com/azure/defender-for-cloud/defender-for-containers-introduction", "services": [ - "Arc", "Defender", - "AKS" + "AKS", + "Arc" ], "severity": "Medium", "subcategory": "Posture", @@ -8981,9 +12533,9 @@ "guid": "4d0685ed-dce9-4be3-ab0d-db3b55fb2ec1", "link": "https://learn.microsoft.com/azure/azure-arc/kubernetes/tutorial-akv-secrets-provider", "services": [ - "AKV", + "AKS", "Arc", - "AKS" + "AKV" ], "severity": "Medium", "subcategory": "Secrets", @@ -9007,8 +12559,8 @@ "guid": "b4935ada-4232-44ec-b81c-123181a64174", "link": "https://learn.microsoft.com/azure/governance/policy/concepts/policy-for-kubernetes#install-azure-policy-extension-for-azure-arc-enabled-kubernetes", "services": [ - "AzurePolicy", - "Monitor" + "Monitor", + "AzurePolicy" ], "severity": "Medium", "subcategory": "Workload", @@ -9034,8 +12586,8 @@ "guid": "e209d4a0-da57-4778-924d-216785d2fa56", "link": "https://learn.microsoft.com/azure/container-registry/container-registry-private-link", "services": [ - "Subscriptions", - "ACR" + "ACR", + "Subscriptions" ], "severity": "Low", "subcategory": "Workload", @@ -9280,8 +12832,8 @@ "guid": "c851fd44-7cf1-459c-95a4-f6455d75a981", "link": "https://learn.microsoft.com/azure/architecture/guide/multitenant/approaches/cost-management-allocation", "services": [ - "Cost", - "Monitor" + "Monitor", + "Cost" ], "severity": "Medium", "subcategory": "Cost Optimization", @@ -9446,8 +12998,8 @@ "guid": "f785b143-2c1e-4466-9baa-dde8ba4c7aaa", "link": "https://learn.microsoft.com/azure-stack/hci/concepts/fault-tolerance#parity", "services": [ - "Backup", - "Storage" + "Storage", + "Backup" ], "severity": "Medium", "subcategory": "S2D", @@ -9812,9 +13364,9 @@ "guid": "074541e3-fe08-458a-8062-32d13dcc10c6", "link": "https://learn.microsoft.com/azure/backup/back-up-azure-stack-hyperconverged-infrastructure-virtual-machines", "services": [ - "Backup", "VM", - "ASR" + "ASR", + "Backup" ], "severity": "High", "subcategory": "VM", @@ -10002,8 +13554,8 @@ "guid": "8ea49f70-1038-4283-b0c4-230165d3eabc", "link": "https://learn.microsoft.com/azure-stack/hci/manage/azure-site-recovery", "services": [ - "Backup", - "ASR" + "ASR", + "Backup" ], "severity": "Medium", "subcategory": "Disaster Recovery", @@ -10104,9 +13656,9 @@ "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/monitoring#set-up-alerts", "service": "Azure OpenAI", "services": [ - "AKV", + "Monitor", "Subscriptions", - "Monitor" + "AKV" ], "severity": "High", "subcategory": "Alerts", @@ -10248,8 +13800,8 @@ "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/latency#batching", "service": "Azure OpenAI", "services": [ - "Storage", - "ServiceBus" + "ServiceBus", + "Storage" ], "severity": "Medium", "subcategory": "Elasticity segregation", @@ -10378,8 +13930,8 @@ "link": "https://learn.microsoft.com/azure/backup/backup-overview", "service": "Azure OpenAI", "services": [ - "Backup", - "ASR" + "ASR", + "Backup" ], "severity": "Medium", "subcategory": "Data Backup and Disaster Recovery", @@ -10469,8 +14021,8 @@ "link": "https://learn.microsoft.com/azure/defender-for-cloud/defender-for-cloud-introduction", "service": "Azure OpenAI", "services": [ - "Sentinel", "Defender", + "Sentinel", "Monitor" ], "severity": "High", @@ -10858,8 +14410,8 @@ "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/manage-costs", "service": "Azure OpenAI", "services": [ - "Cost", - "Monitor" + "Monitor", + "Cost" ], "severity": "Medium", "subcategory": "Cost monitoring", @@ -11039,9 +14591,9 @@ "service": "Azure OpenAI", "services": [ "Entra", + "ACR", "APIM", - "LoadBalancer", - "ACR" + "LoadBalancer" ], "severity": "Medium", "subcategory": "Load Balancing", @@ -11335,10 +14887,10 @@ "guid": "170265f4-bb46-4a39-9af7-f317284797b1", "link": "https://learn.microsoft.com/azure/aks/operator-best-practices-multi-region", "services": [ - "LoadBalancer", "TrafficManager", + "AKS", "FrontDoor", - "AKS" + "LoadBalancer" ], "severity": "Medium", "subcategory": "High Availability", @@ -11396,8 +14948,8 @@ "link": "https://learn.microsoft.com/azure/container-registry/container-registry-geo-replication", "service": "ACR", "services": [ - "ACR", - "AKS" + "AKS", + "ACR" ], "severity": "High", "subcategory": "High Availability", @@ -11411,8 +14963,8 @@ "link": "https://learn.microsoft.com/azure/aks/availability-zones#azure-disk-availability-zone-support", "services": [ "Storage", - "ASR", - "AKS" + "AKS", + "ASR" ], "severity": "High", "subcategory": "Disaster Recovery", @@ -11500,8 +15052,8 @@ "link": "https://learn.microsoft.com/azure/governance/policy/concepts/policy-for-kubernetes", "service": "AKS", "services": [ - "AzurePolicy", - "AKS" + "AKS", + "AzurePolicy" ], "severity": "Medium", "subcategory": "Compliance", @@ -11544,8 +15096,8 @@ "link": "https://learn.microsoft.com/azure/container-registry/", "service": "AKS", "services": [ - "ACR", - "AKS" + "AKS", + "ACR" ], "severity": "Medium", "subcategory": "Compliance", @@ -11614,8 +15166,8 @@ "link": "https://github.com/Azure/secrets-store-csi-driver-provider-azure", "service": "AKS", "services": [ - "AKV", - "AKS" + "AKS", + "AKV" ], "severity": "Medium", "subcategory": "Secrets", @@ -11629,8 +15181,8 @@ "link": "https://learn.microsoft.com/azure/aks/update-credentials", "service": "AKS", "services": [ - "AKV", - "AKS" + "AKS", + "AKV" ], "severity": "High", "subcategory": "Secrets", @@ -11644,8 +15196,8 @@ "link": "https://learn.microsoft.com/azure/aks/use-kms-etcd-encryption", "service": "AKS", "services": [ - "AKV", - "AKS" + "AKS", + "AKV" ], "severity": "Medium", "subcategory": "Secrets", @@ -11659,8 +15211,8 @@ "link": "https://learn.microsoft.com/azure/confidential-computing/confidential-nodes-aks-overview", "service": "AKS", "services": [ - "AKV", - "AKS" + "AKS", + "AKV" ], "severity": "Low", "subcategory": "Secrets", @@ -11674,9 +15226,9 @@ "link": "https://learn.microsoft.com/azure/defender-for-cloud/defender-for-containers-enable", "service": "AKS", "services": [ - "AKV", "Defender", - "AKS" + "AKS", + "AKV" ], "severity": "Medium", "subcategory": "Secrets", @@ -11875,9 +15427,9 @@ "link": "https://azure.github.io/application-gateway-kubernetes-ingress/setup/install-existing/", "service": "AKS", "services": [ + "AKS", "ACR", - "AppGW", - "AKS" + "AppGW" ], "severity": "Medium", "subcategory": "Best practices", @@ -11921,8 +15473,8 @@ "link": "https://learn.microsoft.com/azure/aks/load-balancer-standard", "service": "AKS", "services": [ - "LoadBalancer", - "AKS" + "AKS", + "LoadBalancer" ], "severity": "High", "subcategory": "Best practices", @@ -11936,8 +15488,8 @@ "link": "https://learn.microsoft.com/azure/aks/use-multiple-node-pools#add-a-node-pool-with-a-unique-subnet", "service": "AKS", "services": [ - "VNet", - "AKS" + "AKS", + "VNet" ], "severity": "Medium", "subcategory": "Best practices", @@ -11951,10 +15503,10 @@ "link": "https://learn.microsoft.com/azure/private-link/private-link-overview", "service": "AKS", "services": [ - "PrivateLink", - "VNet", "Cost", - "AKS" + "AKS", + "VNet", + "PrivateLink" ], "severity": "Medium", "subcategory": "Cost", @@ -11967,8 +15519,8 @@ "guid": "e8a03f97-8794-468d-96a7-86d60f96c97b", "link": "https://learn.microsoft.com/azure/expressroute/designing-for-disaster-recovery-with-expressroute-privatepeering", "services": [ - "VPN", - "AKS" + "AKS", + "VPN" ], "severity": "Medium", "subcategory": "HA", @@ -11997,8 +15549,8 @@ "link": "https://learn.microsoft.com/azure/aks/configure-azure-cni", "service": "AKS", "services": [ - "VNet", - "AKS" + "AKS", + "VNet" ], "severity": "High", "subcategory": "IPAM", @@ -12027,8 +15579,8 @@ "link": "https://learn.microsoft.com/azure/aks/internal-lb", "service": "AKS", "services": [ - "VNet", - "AKS" + "AKS", + "VNet" ], "severity": "Low", "subcategory": "IPAM", @@ -12127,8 +15679,8 @@ "link": "https://learn.microsoft.com/azure/aks/limit-egress-traffic", "service": "AKS", "services": [ - "NVA", - "AKS" + "AKS", + "NVA" ], "severity": "High", "subcategory": "Security", @@ -12173,8 +15725,8 @@ "link": "https://learn.microsoft.com/azure/aks/use-network-policies", "service": "AKS", "services": [ - "AzurePolicy", - "AKS" + "AKS", + "AzurePolicy" ], "severity": "Medium", "subcategory": "Security", @@ -12189,8 +15741,8 @@ "link": "https://learn.microsoft.com/azure/aks/use-network-policies", "service": "AKS", "services": [ - "AzurePolicy", - "AKS" + "AKS", + "AzurePolicy" ], "severity": "High", "subcategory": "Security", @@ -12204,8 +15756,8 @@ "link": "https://learn.microsoft.com/azure/aks/operator-best-practices-network", "service": "AKS", "services": [ - "AzurePolicy", - "AKS" + "AKS", + "AzurePolicy" ], "severity": "High", "subcategory": "Security", @@ -12219,8 +15771,8 @@ "link": "https://learn.microsoft.com/azure/aks/operator-best-practices-network", "service": "AKS", "services": [ - "WAF", - "AKS" + "AKS", + "WAF" ], "severity": "High", "subcategory": "Security", @@ -12235,9 +15787,9 @@ "link": "https://learn.microsoft.com/azure/virtual-network/ddos-protection-overview", "service": "AKS", "services": [ + "AKS", "VNet", - "DDoS", - "AKS" + "DDoS" ], "severity": "Medium", "subcategory": "Security", @@ -12602,9 +16154,9 @@ "link": "https://learn.microsoft.com/azure/virtual-machines/premium-storage-performance", "service": "AKS", "services": [ - "Storage", "Monitor", "EventHubs", + "Storage", "ServiceBus", "AKS" ], @@ -12620,10 +16172,10 @@ "link": "https://learn.microsoft.com/azure/aks/load-balancer-standard", "service": "AKS", "services": [ - "LoadBalancer", "Monitor", - "NVA", - "AKS" + "AKS", + "LoadBalancer", + "NVA" ], "severity": "Medium", "subcategory": "Monitoring", @@ -12680,8 +16232,8 @@ "link": "https://learn.microsoft.com/azure/azure-resource-manager/management/azure-subscription-service-limits", "service": "AKS", "services": [ - "Subscriptions", - "AKS" + "AKS", + "Subscriptions" ], "severity": "High", "subcategory": "Resources", @@ -12871,8 +16423,8 @@ "service": "AKS", "services": [ "Storage", - "SQL", - "AKS" + "AKS", + "SQL" ], "severity": "Medium", "subcategory": "Storage", @@ -12916,8 +16468,8 @@ "link": "https://learn.microsoft.com/azure/architecture/guide/multitenant/considerations/tenancy-models", "service": "Azure Monitor", "services": [ - "Cost", - "Monitor" + "Monitor", + "Cost" ], "severity": "Medium", "subcategory": "Azure Monitor - enforce data collection rules", @@ -12932,8 +16484,8 @@ "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/ready/landing-zone/design-area/multi-tenant/automation", "service": "Azure Backup", "services": [ - "Backup", - "Cost" + "Cost", + "Backup" ], "severity": "Medium", "subcategory": "Backup", @@ -12973,9 +16525,9 @@ "guid": "3b0d834a-3487-426d-b69c-6b5c2a26494b", "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/ready/landing-zone/design-area/azure-billing-microsoft-customer-agreement#design-recommendations", "services": [ - "Backup", "Storage", - "Cost" + "Cost", + "Backup" ], "severity": "Medium", "subcategory": "Delete/archive", @@ -12989,9 +16541,9 @@ "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/ready/landing-zone/design-area/azure-billing-microsoft-customer-agreement#design-recommendations", "service": "Azure Backup", "services": [ - "Backup", "Storage", "Cost", + "Backup", "ASR" ], "severity": "Medium", @@ -13006,8 +16558,8 @@ "link": "https://learn.microsoft.com/azure/cost-management-billing/manage/direct-ea-administration#manage-notification-contacts", "service": "Azure Monitor", "services": [ - "Cost", - "Monitor" + "Monitor", + "Cost" ], "severity": "Medium", "subcategory": "Log Analytics retention for workspaces", @@ -13068,9 +16620,9 @@ "service": "VM", "services": [ "VM", - "Backup", "Storage", - "Cost" + "Cost", + "Backup" ], "severity": "Medium", "subcategory": "stopped/deallocated VMs: check disks", @@ -13210,8 +16762,8 @@ "guid": "b835556d-f2bf-4e45-93b0-d834a348726d", "link": "https://learn.microsoft.com/azure/governance/policy/overview", "services": [ - "Cost", - "Monitor" + "Monitor", + "Cost" ], "severity": "Medium", "subcategory": "Automation", @@ -13399,8 +16951,8 @@ "service": "VM", "services": [ "VM", - "SQL", "Cost", + "SQL", "AzurePolicy" ], "severity": "Medium", @@ -13415,8 +16967,8 @@ "link": "https://learn.microsoft.com/azure/active-directory/privileged-identity-management/pim-configure", "service": "VM", "services": [ - "LoadBalancer", - "Cost" + "Cost", + "LoadBalancer" ], "severity": "Medium", "subcategory": "Check Red Hat Licences if applicable", @@ -13429,8 +16981,8 @@ "guid": "a76af4a6-91e8-4839-ada4-6667e13c1056", "link": "https://learn.microsoft.com/azure/active-directory/roles/security-planning#identify-microsoft-accounts-in-administrative-roles-that-need-to-be-switched-to-work-or-school-accounts", "services": [ - "AppSvc", - "Cost" + "Cost", + "AppSvc" ], "severity": "Medium", "subcategory": "Functions", @@ -13461,8 +17013,8 @@ "service": "VM", "services": [ "VM", - "ARS", - "Cost" + "Cost", + "ARS" ], "severity": "Medium", "subcategory": "Reservations/savings plans", @@ -13532,8 +17084,8 @@ "link": "https://learn.microsoft.com/azure/active-directory/app-proxy/application-proxy", "service": "Azure SQL", "services": [ - "SQL", "Cost", + "SQL", "AzurePolicy" ], "severity": "Medium", @@ -13549,8 +17101,8 @@ "service": "VM", "services": [ "VM", - "SQL", - "Cost" + "Cost", + "SQL" ], "severity": "Medium", "subcategory": "SQL Database Reservations", @@ -13688,8 +17240,8 @@ "link": "https://learn.microsoft.com/azure/azure-monitor/logs/data-retention-archive?tabs=portal-1%2Cportal-2#how-retention-and-archiving-work", "service": "Azure Backup", "services": [ - "Backup", - "Cost" + "Cost", + "Backup" ], "severity": "Medium", "subcategory": "Backup", @@ -13704,9 +17256,9 @@ "link": "https://learn.microsoft.com/azure/databricks/clusters/cluster-config-best-practices#automatic-termination", "service": "Databricks", "services": [ - "LoadBalancer", + "VM", "Cost", - "VM" + "LoadBalancer" ], "severity": "Medium", "subcategory": "Databricks", @@ -13852,9 +17404,9 @@ "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/ready/azure-setup-guide/monitoring-reporting?tabs=AzureMonitor", "service": "Front Door", "services": [ - "AppSvc", "Cost", - "FrontDoor" + "FrontDoor", + "AppSvc" ], "severity": "Medium", "subcategory": "Networking", @@ -13954,9 +17506,9 @@ "link": "https://learn.microsoft.com/azure/site-recovery/site-recovery-overview", "service": "Site Recovery", "services": [ - "ASR", + "Storage", "Cost", - "Storage" + "ASR" ], "severity": "Medium", "subcategory": "Storage", @@ -14000,9 +17552,9 @@ "link": "https://learn.microsoft.com/azure/reliability/availability-zones-overview", "service": "Synapse", "services": [ + "Monitor", "EventHubs", - "Cost", - "Monitor" + "Cost" ], "severity": "Medium", "subcategory": "Synapse", @@ -14031,8 +17583,8 @@ "link": "https://learn.microsoft.com/azure/load-balancer/load-balancer-overview", "service": "Synapse", "services": [ - "SQL", - "Cost" + "Cost", + "SQL" ], "severity": "Medium", "subcategory": "Synapse", @@ -14248,8 +17800,8 @@ "service": "Cognitive Search", "services": [ "Storage", - "Backup", - "ASR" + "ASR", + "Backup" ], "severity": "High", "subcategory": "Disaster Recovery", @@ -14340,8 +17892,8 @@ "link": "https://learn.microsoft.com/azure/azure-sql/virtual-machines/windows/performance-guidelines-best-practices-checklist?view=azuresql#storage", "services": [ "Storage", - "SQL", - "Cost" + "Cost", + "SQL" ], "severity": "High", "subcategory": "Storage", @@ -14466,8 +18018,8 @@ "services": [ "VM", "SQL", - "LoadBalancer", - "VNet" + "VNet", + "LoadBalancer" ], "severity": "Medium", "subcategory": "HADR", @@ -14510,10 +18062,10 @@ "guid": "667313c4-0567-44b5-b985-b859c773e7e2", "link": "https://learn.microsoft.com/azure/azure-sql/virtual-machines/windows/availability-group-vnn-azure-load-balancer-configure?view=azuresql-vm&tabs=ilb", "services": [ - "LoadBalancer", + "VM", "SQL", "VNet", - "VM" + "LoadBalancer" ], "severity": "High", "subcategory": "HADR", @@ -14679,8 +18231,8 @@ "services": [ "VM", "Storage", - "SQL", - "Cost" + "Cost", + "SQL" ], "severity": "Low", "subcategory": "Cost Optimization", @@ -14695,8 +18247,8 @@ "guid": "7ed67178-b824-4546-ae1a-ee3453aec823", "link": "https://azure.microsoft.com/en-ca/pricing/hybrid-benefit/", "services": [ - "SQL", - "Cost" + "Cost", + "SQL" ], "severity": "Low", "subcategory": "Cost Optimization", @@ -14865,8 +18417,8 @@ "guid": "c9a7f821-b8eb-48c0-aa77-e25e4d5aeaa8", "link": "https://learn.microsoft.com/azure/azure-sql/managed-instance/vnet-existing-add-subnet?view=azuresql-mi", "services": [ - "VNet", - "SQL" + "SQL", + "VNet" ], "severity": "Medium", "subcategory": "Pre Migration", @@ -14881,8 +18433,8 @@ "guid": "dc4e2436-bb33-46d7-85f1-7960eee0b9b5", "link": "https://learn.microsoft.com/azure/azure-sql/managed-instance/vnet-subnet-determine-size?view=azuresql-mi", "services": [ - "VNet", - "SQL" + "SQL", + "VNet" ], "severity": "High", "subcategory": "Deployment", @@ -15016,8 +18568,8 @@ "guid": "3334fdf9-1c23-4418-8b65-275269440b4b", "link": "https://learn.microsoft.com/azure/azure-sql/migration-guides/managed-instance/sql-server-to-managed-instance-guide?view=azuresql-mi#backup-and-restore", "services": [ - "Backup", - "SQL" + "SQL", + "Backup" ], "severity": "Low", "subcategory": "Migration", @@ -15073,9 +18625,9 @@ "guid": "141acdce-5793-477b-adb3-751ab2ac1fad", "link": "https://learn.microsoft.com/azure/azure-sql/managed-instance/auto-failover-group-configure-sql-mi?view=azuresql&tabs=azure-portal#test-failover", "services": [ - "LoadBalancer", "EventHubs", - "SQL" + "SQL", + "LoadBalancer" ], "severity": "High", "subcategory": "Post Migration", @@ -15105,10 +18657,10 @@ "guid": "35ad9422-23e1-4381-8523-081a94174158", "link": "https://learn.microsoft.com/azure/architecture/example-scenario/data/sql-managed-instance-cmk", "services": [ - "AKV", - "Backup", "SQL", - "AzurePolicy" + "AzurePolicy", + "AKV", + "Backup" ], "severity": "Low", "subcategory": "Post Migration", @@ -15138,10 +18690,10 @@ "guid": "9d89f2e8-7778-4424-b516-785c6fa96b96", "link": "https://learn.microsoft.com/azure/azure-sql/database/long-term-retention-overview?view=azuresql-mi", "services": [ - "ARS", - "Backup", + "Storage", "SQL", - "Storage" + "ARS", + "Backup" ], "severity": "Low", "subcategory": "Post Migration", @@ -15156,8 +18708,8 @@ "guid": "ad88408f-3727-434c-a76b-a28021459014", "link": "https://azure.microsoft.com/en-gb/pricing/hybrid-benefit/#overview", "services": [ - "SQL", - "Cost" + "Cost", + "SQL" ], "severity": "Low", "subcategory": "Post Migration", @@ -15172,8 +18724,8 @@ "guid": "65d38e53-f9cc-4bd8-9926-6acca274faa1", "link": "https://learn.microsoft.com/azure/azure-sql/database/threat-detection-overview?view=azuresql", "services": [ - "SQL", - "Defender" + "Defender", + "SQL" ], "severity": "Medium", "subcategory": "Post Migration", @@ -15215,8 +18767,8 @@ "link": "https://learn.microsoft.com/azure/reliability/reliability-traffic-manager?toc=%2Fazure%2Fdns%2Ftoc.json", "services": [ "DNS", - "TrafficManager", - "ASR" + "ASR", + "TrafficManager" ], "severity": "Medium", "subcategory": "Azure DNS", @@ -15256,8 +18808,8 @@ "guid": "2676ae46-691e-4883-9ad9-42223e138105", "link": "https://learn.microsoft.com/azure/reliability/reliability-virtual-machines?toc=%2Fazure%2Fvirtual-machines%2Ftoc.json&bc=%2Fazure%2Fvirtual-machines%2Fbreadcrumb%2Ftoc.json&tabs=graph", "services": [ - "DNS", - "VM" + "VM", + "DNS" ], "severity": "Medium", "subcategory": "VM Based DNS Service", @@ -15270,9 +18822,9 @@ "guid": "23081a94-1741-4583-9ff7-ad7c6d373316", "link": "https://www.windows-active-directory.com/azure-ad-dns-for-custom-domain-names-with-advanced-dns-settings.html", "services": [ + "Entra", "DNS", - "VM", - "Entra" + "VM" ], "severity": "Medium", "subcategory": "VM Based DNS Service", @@ -15397,8 +18949,8 @@ "services": [ "Storage", "Cost", - "ASR", - "AzurePolicy" + "AzurePolicy", + "ASR" ], "subcategory": "DR Configuration", "text": "For applications, where cost is a concern and can withstand some downtime during failure, create on-demand data recovery cluster configuration", @@ -15450,9 +19002,9 @@ "guid": "56c57ba5-9119-4bf8-b8f5-c586c7d9cdc1", "link": "https://azure.microsoft.com/support/legal/sla/virtual-desktop/v1_0/", "services": [ - "VM", - "ASR", "AVD", + "ASR", + "VM", "Subscriptions" ], "severity": "High", @@ -15467,10 +19019,10 @@ "guid": "6acc076e-f9b1-441a-a989-579e76b897e7", "link": "https://learn.microsoft.com/azure/architecture/example-scenario/wvd/azure-virtual-desktop-multi-region-bcdr", "services": [ - "VM", + "AVD", "Storage", "ASR", - "AVD" + "VM" ], "severity": "Medium", "subcategory": "Compute", @@ -15484,8 +19036,8 @@ "guid": "10a7da7b-e996-46e1-9d3c-4ada97cc3d13", "link": "https://docs.microsoft.com/azure/virtual-desktop/disaster-recovery", "services": [ - "ASR", - "AVD" + "AVD", + "ASR" ], "severity": "Low", "subcategory": "Compute", @@ -15499,8 +19051,8 @@ "guid": "25ab225c-6f4e-4168-9fdd-dea8a4b7cdeb", "link": "https://techcommunity.microsoft.com/t5/azure-virtual-desktop-blog/announcing-general-availability-of-support-for-azure/ba-p/3636262", "services": [ - "ASR", "AVD", + "ASR", "ACR" ], "severity": "High", @@ -15515,10 +19067,10 @@ "guid": "4c61fc3f-c14e-4ea6-b69e-8d9a3eec218e", "link": "https://docs.microsoft.com/azure/virtual-desktop/disaster-recovery", "services": [ - "Backup", - "VM", "AVD", - "ASR" + "ASR", + "VM", + "Backup" ], "severity": "Medium", "subcategory": "Compute", @@ -15532,10 +19084,10 @@ "guid": "5da58639-ca3a-4961-890b-29663c5e10d", "link": "https://learn.microsoft.com/azure/site-recovery/azure-to-azure-how-to-enable-zone-to-zone-disaster-recovery", "services": [ - "Backup", + "AVD", "VM", "ASR", - "AVD", + "Backup", "Cost" ], "severity": "Medium", @@ -15551,9 +19103,9 @@ "link": "https://learn.microsoft.com/azure/virtual-machines/azure-compute-gallery", "services": [ "Storage", + "AVD", "VM", "ASR", - "AVD", "ACR" ], "severity": "Low", @@ -15568,8 +19120,8 @@ "guid": "fd339489-8c12-488b-9c6a-57cfb644451e", "link": "https://docs.microsoft.com/azure/virtual-desktop/disaster-recovery", "services": [ - "ASR", - "AVD" + "AVD", + "ASR" ], "severity": "Medium", "subcategory": "Dependencies", @@ -15583,9 +19135,9 @@ "guid": "687ab077-adb5-49e5-a960-3334fdf8cc23", "link": "https://docs.microsoft.com/fslogix/manage-profile-content-cncpt", "services": [ + "AVD", "Storage", - "ASR", - "AVD" + "ASR" ], "severity": "Medium", "subcategory": "Storage", @@ -15600,10 +19152,10 @@ "link": "https://docs.microsoft.com/azure/virtual-desktop/disaster-recovery", "services": [ "Storage", - "Backup", - "ASR", + "AzurePolicy", "AVD", - "AzurePolicy" + "ASR", + "Backup" ], "severity": "Medium", "subcategory": "Storage", @@ -15617,9 +19169,9 @@ "guid": "9f7547c1-746d-4c56-868a-714435bd09dd", "link": "https://docs.microsoft.com/azure/virtual-desktop/disaster-recovery", "services": [ + "AVD", "Storage", - "ASR", - "AVD" + "ASR" ], "severity": "Medium", "subcategory": "Storage", @@ -15633,10 +19185,10 @@ "guid": "3d4f3537-c134-46dc-9602-7a71efe1bd05", "link": "https://docs.microsoft.com/azure/backup/backup-afs", "services": [ - "Backup", + "AVD", "Storage", - "ASR", - "AVD" + "Backup", + "ASR" ], "severity": "Medium", "subcategory": "Storage", @@ -15650,9 +19202,9 @@ "guid": "10d4e875-d502-4142-a795-f2b6eff34f88", "link": "https://learn.microsoft.com/azure/storage/files/files-redundancy#zone-redundant-storage", "services": [ + "AVD", "Storage", - "ASR", - "AVD" + "ASR" ], "severity": "High", "subcategory": "Storage", @@ -15666,11 +19218,11 @@ "guid": "23429db7-2281-4376-85cc-57b4a4b18142", "link": "https://learn.microsoft.com/azure/azure-netapp-files/cross-region-replication-create-peering", "services": [ - "Backup", "Storage", - "ASR", "AVD", - "ACR" + "ASR", + "ACR", + "Backup" ], "severity": "Medium", "subcategory": "Storage", @@ -15726,9 +19278,9 @@ "guid": "5a2adb2c-3e23-426b-b225-ca44e1696fdd", "link": "https://learn.microsoft.com/azure/virtual-machines/shared-image-galleries", "services": [ + "AVD", "Storage", - "VM", - "AVD" + "VM" ], "severity": "Low", "subcategory": "Golden Images", @@ -15784,8 +19336,8 @@ "guid": "829e3fec-2183-4687-a017-7a2b5945bda4", "link": "https://github.com/The-Virtual-Desktop-Team/Virtual-Desktop-Optimization-Tool", "services": [ - "RBAC", - "AVD" + "AVD", + "RBAC" ], "severity": "Low", "subcategory": "Golden Images", @@ -15799,8 +19351,8 @@ "guid": "e3d3e084-4276-4d4b-bc01-5bcf219e4a1e", "link": "https://learn.microsoft.com/azure/virtual-desktop/install-office-on-wvd-master-image#install-onedrive-in-per-machine-mode", "services": [ - "Storage", - "AVD" + "AVD", + "Storage" ], "severity": "Low", "subcategory": "Golden Images", @@ -15842,9 +19394,9 @@ "guid": "90083845-c587-4cb3-a1ec-16a1d076ef9f", "link": "https://docs.microsoft.com/azure/virtual-desktop/app-attach-file-share", "services": [ + "AVD", "Storage", - "Cost", - "AVD" + "Cost" ], "severity": "Medium", "subcategory": "MSIX & AppAttach", @@ -15872,10 +19424,10 @@ "guid": "66e15d4d-5a2a-4db2-a3e2-326bf225ca41", "link": "https://docs.microsoft.com/azure/virtual-desktop/app-attach-file-share", "services": [ + "AVD", "RBAC", "Storage", - "VM", - "AVD" + "VM" ], "severity": "Medium", "subcategory": "MSIX & AppAttach", @@ -15931,8 +19483,8 @@ "guid": "e4633254-3185-40a1-b120-bd563a1c8e9d", "link": "https://docs.microsoft.com/azure/virtual-machines/generation-2", "services": [ - "VM", - "AVD" + "AVD", + "VM" ], "severity": "Medium", "subcategory": "Session Host", @@ -15960,8 +19512,8 @@ "guid": "8468c55a-775c-46ee-a5b8-6ad8844ce3b2", "link": "https://learn.microsoft.com/azure/virtual-desktop/terminology#host-pools", "services": [ - "VM", - "AVD" + "AVD", + "VM" ], "severity": "High", "subcategory": "Capacity Planning", @@ -15975,8 +19527,8 @@ "guid": "4e98495f-d3c0-4af2-aa59-a793395a32a7", "link": "https://learn.microsoft.com/azure/virtual-desktop/terminology?WT.mc_id=Portal-fx#host-pools", "services": [ - "VM", - "AVD" + "AVD", + "VM" ], "severity": "High", "subcategory": "Capacity Planning", @@ -16018,8 +19570,8 @@ "guid": "b3724959-4943-4577-a3a9-e10ff6345f24", "link": "https://learn.microsoft.com/windows-server/remote/remote-desktop-services/virtual-machine-recs", "services": [ - "VM", - "AVD" + "AVD", + "VM" ], "severity": "Medium", "subcategory": "Capacity Planning", @@ -16033,8 +19585,8 @@ "guid": "b384b7ed-1cdd-457e-a2cd-c8d4d55bc144", "link": "https://learn.microsoft.com/azure/virtual-desktop/terminology?WT.mc_id=Portal-fx#application-groups", "services": [ - "Storage", - "AVD" + "AVD", + "Storage" ], "severity": "High", "subcategory": "Capacity Planning", @@ -16048,9 +19600,9 @@ "guid": "971cc4a4-b1f7-4c12-90e0-1ad96808f00c", "link": "https://learn.microsoft.com/azure/azure-resource-manager/management/azure-subscription-service-limits#azure-virtual-desktop-service-limits", "services": [ - "Entra", "AVD", - "ACR" + "ACR", + "Entra" ], "severity": "Medium", "subcategory": "Capacity Planning", @@ -16078,9 +19630,9 @@ "guid": "38b19ab6-0693-4992-9394-5590883916ec", "link": "https://learn.microsoft.com/azure/virtual-desktop/configure-host-pool-personal-desktop-assignment-type?tabs=azure#reassign-a-personal-desktop", "services": [ + "AVD", "Storage", - "VM", - "AVD" + "VM" ], "severity": "Low", "subcategory": "Capacity Planning", @@ -16094,8 +19646,8 @@ "guid": "e1112dbd-7ba0-412e-9b94-ef6e047d2ea2", "link": "https://docs.microsoft.com/windows-server/remote/remote-desktop-services/virtual-machine-recs", "services": [ - "VM", - "AVD" + "AVD", + "VM" ], "severity": "High", "subcategory": "Capacity Planning", @@ -16109,8 +19661,8 @@ "guid": "992b1cd6-d2f5-44b2-a769-e3a691e8838a", "link": "https://learn.microsoft.com/azure/architecture/example-scenario/wvd/windows-virtual-desktop#considerations", "services": [ - "Storage", - "AVD" + "AVD", + "Storage" ], "severity": "High", "subcategory": "Capacity Planning", @@ -16138,8 +19690,8 @@ "guid": "b47a393a-0803-4272-a479-8b1578b219a4", "link": "https://learn.microsoft.com/azure/virtual-network/accelerated-networking-overview", "services": [ - "VM", - "AVD" + "AVD", + "VM" ], "severity": "Low", "subcategory": "Capacity Planning", @@ -16167,10 +19719,10 @@ "guid": "6abca2a4-fda1-4dbf-9dc9-5d48c7c791dc", "link": "https://learn.microsoft.com/azure/architecture/example-scenario/wvd/windows-virtual-desktop?toc=%2Fazure%2Fvirtual-desktop%2Ftoc.json&bc=%2Fazure%2Fvirtual-desktop%2Fbreadcrumb%2Ftoc.json", "services": [ - "VPN", - "Storage", "AVD", - "ExpressRoute" + "Storage", + "ExpressRoute", + "VPN" ], "severity": "Medium", "subcategory": "Clients & Users", @@ -16254,9 +19806,9 @@ "guid": "8053d89e-89dc-47b3-9be2-a1a27f7a9e91", "link": "https://docs.microsoft.com/azure/azure-resource-manager/management/azure-subscription-service-limits", "services": [ + "AVD", "Storage", - "VM", - "AVD" + "VM" ], "severity": "Low", "subcategory": "General", @@ -16270,10 +19822,10 @@ "guid": "c14aea7e-65e8-4d9a-9aec-218e6436b073", "link": "https://docs.microsoft.com/azure/architecture/reference-architectures/identity/adds-extend-domain", "services": [ - "Entra", + "AVD", "Storage", "VNet", - "AVD" + "Entra" ], "severity": "Medium", "subcategory": "Active Directory", @@ -16287,8 +19839,8 @@ "guid": "6db55f57-9603-4334-adf9-cc23418db612", "link": "https://docs.microsoft.com/azure/virtual-desktop/create-host-pools-azure-marketplace", "services": [ - "Entra", - "AVD" + "AVD", + "Entra" ], "severity": "Medium", "subcategory": "Active Directory", @@ -16302,8 +19854,8 @@ "guid": "7126504b-b47a-4393-a080-327294798b15", "link": "https://docs.microsoft.com/previous-versions/windows/desktop/Policy/group-policy-hierarchy", "services": [ - "Entra", - "AVD" + "AVD", + "Entra" ], "severity": "Medium", "subcategory": "Active Directory", @@ -16317,8 +19869,8 @@ "guid": "2226a8e3-50a4-4ac3-8bd6-ee150553051f", "link": "https://learn.microsoft.com/fslogix/how-to-use-group-policy-templates", "services": [ - "Entra", - "AVD" + "AVD", + "Entra" ], "severity": "Medium", "subcategory": "Active Directory", @@ -16332,9 +19884,9 @@ "guid": "347dc560-28a7-41ff-b1cd-15dd2f0d5e77", "link": "https://learn.microsoft.com/azure/virtual-desktop/prerequisites?tabs=portal#session-hosts", "services": [ - "Entra", + "AVD", "VM", - "AVD" + "Entra" ], "severity": "Medium", "subcategory": "Active Directory", @@ -16348,8 +19900,8 @@ "guid": "2d41e361-1cc5-47b4-a4b1-410d43958a8c", "link": "https://docs.microsoft.com/azure/virtual-desktop/manage-app-groups", "services": [ - "Entra", - "AVD" + "AVD", + "Entra" ], "severity": "Medium", "subcategory": "Active Directory", @@ -16363,10 +19915,10 @@ "guid": "2289b3d6-b57c-4fc6-9546-1e1a3e3453a3", "link": "https://docs.microsoft.com/azure/storage/files/storage-files-identity-ad-ds-enable", "services": [ - "Entra", - "Storage", "AVD", - "AzurePolicy" + "Storage", + "AzurePolicy", + "Entra" ], "severity": "High", "subcategory": "Active Directory", @@ -16380,8 +19932,8 @@ "guid": "5119bf8e-8f58-4542-a7d9-cec166cd072a", "link": "https://learn.microsoft.com/azure/virtual-desktop/prerequisites?tabs=portal#identity", "services": [ - "Entra", - "AVD" + "AVD", + "Entra" ], "severity": "High", "subcategory": "Active Directory", @@ -16395,9 +19947,9 @@ "guid": "e777fd5e-c5f1-4d6e-8fa9-fc210b88e338", "link": "https://learn.microsoft.com/azure/storage/files/storage-files-identity-auth-hybrid-identities-enable", "services": [ - "Entra", + "AVD", "Storage", - "AVD" + "Entra" ], "severity": "Medium", "subcategory": "Microsoft Entra ID", @@ -16411,10 +19963,10 @@ "guid": "6ceb5443-5125-4922-9442-93bb628537a5", "link": "https://learn.microsoft.com/azure/virtual-desktop/prerequisites?tabs=portal#identity", "services": [ - "Entra", - "VNet", "AVD", - "Subscriptions" + "VNet", + "Subscriptions", + "Entra" ], "severity": "High", "subcategory": "Requirements", @@ -16428,8 +19980,8 @@ "guid": "b4ce4781-7557-4a1f-8043-332ae199d44c", "link": "https://learn.microsoft.com/azure/virtual-desktop/authentication", "services": [ - "Entra", - "AVD" + "AVD", + "Entra" ], "severity": "High", "subcategory": "Requirements", @@ -16443,8 +19995,8 @@ "guid": "f9b141a8-98a5-435e-9378-97e71ca7da7b", "link": "https://learn.microsoft.com/azure/virtual-desktop/prerequisites?tabs=portal#supported-identity-scenarios", "services": [ - "Entra", - "AVD" + "AVD", + "Entra" ], "severity": "Medium", "subcategory": "Requirements", @@ -16458,8 +20010,8 @@ "guid": "5f9f680a-ba07-4429-bbf7-93d7071561f4", "link": "https://learn.microsoft.com/azure/virtual-desktop/authentication#single-sign-on-sso", "services": [ - "Entra", - "AVD" + "AVD", + "Entra" ], "severity": "Medium", "subcategory": "Requirements", @@ -16473,9 +20025,9 @@ "guid": "ea962a15-9394-46da-a7cc-3923266b2258", "link": "https://learn.microsoft.com/azure/virtual-desktop/prerequisites?tabs=portal#supported-identity-scenarios", "services": [ - "Entra", + "AVD", "VM", - "AVD" + "Entra" ], "severity": "High", "subcategory": "Requirements", @@ -16489,8 +20041,8 @@ "guid": "6f4a1651-bddd-4ea8-a487-cdeb4861bc3b", "link": "https://docs.microsoft.com/azure/active-directory-domain-services/compare-identity-solutions", "services": [ - "Entra", - "AVD" + "AVD", + "Entra" ], "severity": "Low", "subcategory": "Requirements", @@ -16504,9 +20056,9 @@ "guid": "5549524b-36c0-4f1a-892b-ab3ca78f5db2", "link": "https://learn.microsoft.com/azure/virtual-desktop/administrative-template", "services": [ - "Entra", "AVD", - "Monitor" + "Monitor", + "Entra" ], "severity": "Low", "subcategory": "Management", @@ -16520,8 +20072,8 @@ "guid": "3334fdf9-1c23-4418-8b65-285269440b4b", "link": "https://learn.microsoft.com/azure/virtual-desktop/management", "services": [ - "VM", "AVD", + "VM", "Monitor" ], "severity": "Low", @@ -16551,9 +20103,9 @@ "guid": "7138b820-102c-4e16-be30-1e6e872e52e3", "link": "https://learn.microsoft.com/azure/virtual-desktop/autoscale-scenarios", "services": [ - "VM", "AVD", "Cost", + "VM", "Monitor" ], "severity": "Medium", @@ -16568,9 +20120,9 @@ "guid": "55f612fe-f215-4f0d-a956-10e7dd96bcbc", "link": "https://learn.microsoft.com/azure/virtual-desktop/start-virtual-machine-connect", "services": [ - "VM", "AVD", "Cost", + "VM", "Monitor" ], "severity": "Low", @@ -16585,10 +20137,10 @@ "guid": "79a686ea-d971-4ea0-a9a8-1aea074c94cb", "link": "https://learn.microsoft.com/azure/virtual-desktop/start-virtual-machine-connect-faq#are-vms-automatically-deallocated-when-a-user-stops-using-them", "services": [ - "VM", - "AVD", - "AzurePolicy", "Monitor", + "AzurePolicy", + "AVD", + "VM", "Cost" ], "severity": "Low", @@ -16603,13 +20155,13 @@ "guid": "51bcafca-476a-48fa-9b91-9645a7679f20", "link": "https://learn.microsoft.com/azure/virtual-desktop/tag-virtual-desktop-resources", "services": [ + "Monitor", "Storage", - "DNS", "AVD", - "VPN", - "Monitor", - "Cost", "ExpressRoute", + "DNS", + "Cost", + "VPN", "VWAN" ], "severity": "Low", @@ -16624,10 +20176,10 @@ "guid": "611dd68c-5a4b-4252-8e44-a59a9c2399c4", "link": "https://learn.microsoft.com/azure/virtual-desktop/azure-advisor-recommendations", "services": [ - "Entra", - "Cost", "AVD", - "Monitor" + "Cost", + "Monitor", + "Entra" ], "severity": "Low", "subcategory": "Management", @@ -16671,8 +20223,8 @@ "guid": "d1e8c38e-c936-4667-913c-005674b1e944", "link": "https://docs.microsoft.com/azure/virtual-desktop/create-validation-host-pool", "services": [ - "VM", "AVD", + "VM", "Monitor" ], "severity": "Medium", @@ -16687,8 +20239,8 @@ "guid": "a459c373-e7ed-4616-83b3-65a917ecbe48", "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/wvd/eslz-platform-automation-and-devops", "services": [ - "VM", "AVD", + "VM", "Monitor" ], "severity": "Medium", @@ -16703,8 +20255,8 @@ "guid": "ebe54cd7-df2e-48bb-ac35-81559bb9153e", "link": "https://docs.microsoft.com/azure/virtual-desktop/faq", "services": [ - "VM", "AVD", + "VM", "Monitor" ], "severity": "Medium", @@ -16734,8 +20286,8 @@ "guid": "81770afb-c4c0-4e43-a186-58d2857ed671", "link": "https://docs.microsoft.com/azure/virtual-desktop/diagnostics-log-analytics", "services": [ - "VM", "AVD", + "VM", "Monitor" ], "severity": "Medium", @@ -16750,8 +20302,8 @@ "guid": "2463cffe-179c-4599-be0d-5973dd4ce32c", "link": "https://docs.microsoft.com/azure/storage/files/storage-files-monitoring?tabs=azure-portal", "services": [ - "Storage", "AVD", + "Storage", "Monitor" ], "severity": "Medium", @@ -16781,10 +20333,10 @@ "guid": "dd399cfd-7b28-4dc8-9555-6202bfe4563b", "link": "https://docs.microsoft.com/azure/architecture/reference-architectures/hybrid-networking/", "services": [ - "VPN", "AVD", - "NVA", - "ExpressRoute" + "ExpressRoute", + "VPN", + "NVA" ], "severity": "Medium", "subcategory": "Networking", @@ -16798,8 +20350,8 @@ "guid": "c8639648-a652-4d6c-85e5-02965388e5de", "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/wvd/eslz-network-topology-and-connectivity", "services": [ - "VNet", "AVD", + "VNet", "VWAN" ], "severity": "Medium", @@ -16814,8 +20366,8 @@ "guid": "d227dd14-2b06-4c21-a799-9a646f4389a7", "link": "https://docs.microsoft.com/azure/architecture/reference-architectures/hybrid-networking/", "services": [ - "VPN", - "AVD" + "AVD", + "VPN" ], "severity": "Medium", "subcategory": "Networking", @@ -16829,9 +20381,9 @@ "guid": "fc4972cd-3cd2-41bf-9703-6e5e6b4bed3d", "link": "https://docs.microsoft.com/azure/firewall/protect-windows-virtual-desktop", "services": [ - "VNet", "AVD", "NVA", + "VNet", "Firewall" ], "severity": "Medium", @@ -16875,9 +20427,9 @@ "guid": "523181a9-4174-4158-93ff-7ae7c6d37431", "link": "https://docs.microsoft.com/azure/firewall/protect-windows-virtual-desktop", "services": [ - "VNet", "AVD", "NVA", + "VNet", "Firewall" ], "severity": "Low", @@ -16892,8 +20444,8 @@ "guid": "cc6edca0-aeca-4566-9e92-cf246f1465af", "link": "https://learn.microsoft.com/azure/virtual-desktop/proxy-server-support", "services": [ - "VM", - "AVD" + "AVD", + "VM" ], "severity": "High", "subcategory": "Networking", @@ -16907,8 +20459,8 @@ "guid": "516785c6-fa96-4c96-ad88-408f372734c8", "link": "https://learn.microsoft.com/azure/virtual-desktop/rdp-bandwidth", "services": [ - "VM", - "AVD" + "AVD", + "VM" ], "severity": "Low", "subcategory": "Networking", @@ -16922,10 +20474,10 @@ "guid": "ec27d589-9178-426d-8df2-ff60020f30a6", "link": "https://learn.microsoft.com/azure/storage/files/storage-files-networking-endpoints", "services": [ - "PrivateLink", "Storage", - "AVD", "VNet", + "PrivateLink", + "AVD", "Cost" ], "severity": "Medium", @@ -16940,8 +20492,8 @@ "guid": "b2074747-d01a-4f61-b1aa-92ad793d9ff4", "link": "https://docs.microsoft.com/azure/virtual-desktop/shortpath", "services": [ - "VPN", - "AVD" + "AVD", + "VPN" ], "severity": "Medium", "subcategory": "Networking", @@ -16984,10 +20536,10 @@ "guid": "0fd32907-98bc-4178-adc5-a06ca7144351", "link": "https://learn.microsoft.com/azure/virtual-machines/disk-encryption-overview", "services": [ - "AKV", + "AVD", "Storage", "VM", - "AVD" + "AKV" ], "severity": "Low", "subcategory": "Host Configuration", @@ -17001,8 +20553,8 @@ "guid": "36a5a67f-bb9e-4d5b-9547-8c4479816b28", "link": "https://learn.microsoft.com/azure/virtual-desktop/security-guide#azure-virtual-desktop-support-for-trusted-launch", "services": [ - "VM", "AVD", + "VM", "Monitor" ], "severity": "Medium", @@ -17017,8 +20569,8 @@ "guid": "135d3899-4b31-44d3-bc8f-028871a359d8", "link": "https://learn.microsoft.com/windows/whats-new/windows-11-requirements", "services": [ - "VM", - "AVD" + "AVD", + "VM" ], "severity": "High", "subcategory": "Host Configuration", @@ -17103,12 +20655,12 @@ "guid": "1814387e-5ca9-4c26-a9b3-2ab5bdfc6998", "link": "https://learn.microsoft.com/azure/virtual-desktop/security-guide#enable-microsoft-defender-for-cloud", "services": [ - "AKV", "Storage", - "Defender", - "VM", + "AKV", + "Subscriptions", "AVD", - "Subscriptions" + "VM", + "Defender" ], "severity": "Medium", "subcategory": "Management", @@ -17122,9 +20674,9 @@ "guid": "a0916a76-4980-4ad0-b278-ee293c1bc352", "link": "https://learn.microsoft.com/azure/virtual-desktop/security-guide#collect-audit-logs", "services": [ - "Entra", "AVD", - "Monitor" + "Monitor", + "Entra" ], "severity": "Medium", "subcategory": "Management", @@ -17138,9 +20690,9 @@ "guid": "baaab757-1849-4ab8-893d-c9fc9d1bb73b", "link": "https://docs.microsoft.com/azure/virtual-desktop/rbac", "services": [ - "Entra", + "AVD", "RBAC", - "AVD" + "Entra" ], "severity": "Low", "subcategory": "Management", @@ -17169,8 +20721,8 @@ "guid": "916d697d-8ead-4ed2-9bdd-186f1ac252b9", "link": "https://learn.microsoft.com/azure/virtual-desktop/set-up-mfa", "services": [ - "Entra", - "AVD" + "AVD", + "Entra" ], "severity": "Medium", "subcategory": "Microsoft Entra ID", @@ -17198,8 +20750,8 @@ "guid": "9164e990-9ae2-48c8-9c33-b6b7808bafe6", "link": "https://learn.microsoft.com/azure/virtual-desktop/fslogix-containers-azure-files#best-practices-for-azure-virtual-desktop", "services": [ - "Storage", - "AVD" + "AVD", + "Storage" ], "severity": "Medium", "subcategory": "Azure Files", @@ -17213,10 +20765,10 @@ "guid": "5784b6ca-5e9e-4bcf-8b54-c95459ea7369", "link": "https://learn.microsoft.com/azure/storage/files/storage-files-smb-multichannel-performance", "services": [ - "Storage", - "Cost", "AVD", - "ACR" + "Storage", + "ACR", + "Cost" ], "severity": "Low", "subcategory": "Azure Files", @@ -17230,8 +20782,8 @@ "guid": "4a359836-ee79-4d6c-9d3a-364a5b7abae3", "link": "https://azure.microsoft.com/global-infrastructure/services/", "services": [ - "Storage", - "AVD" + "AVD", + "Storage" ], "severity": "Medium", "subcategory": "Azure NetApp Files", @@ -17245,8 +20797,8 @@ "guid": "a2661898-866a-4c8d-9d1f-8cfc86e88024", "link": "https://learn.microsoft.com/azure/virtual-desktop/create-fslogix-profile-container", "services": [ - "Storage", - "AVD" + "AVD", + "Storage" ], "severity": "Medium", "subcategory": "Azure NetApp Files", @@ -17260,9 +20812,9 @@ "guid": "6647e977-db49-48a8-bc35-743f17499d42", "link": "https://docs.microsoft.com/azure/azure-netapp-files/create-active-directory-connections", "services": [ + "AVD", "Storage", - "VNet", - "AVD" + "VNet" ], "severity": "High", "subcategory": "Azure NetApp Files", @@ -17276,8 +20828,8 @@ "guid": "3611c818-b0a0-4bc5-80e4-3a18a9cd289c", "link": "https://docs.microsoft.com/azure/virtual-machines/disks-types", "services": [ - "Storage", - "AVD" + "AVD", + "Storage" ], "severity": "Medium", "subcategory": "Capacity Planning", @@ -17291,9 +20843,9 @@ "guid": "ed6b17db-8255-4462-b2ae-e4553afc8339", "link": "https://docs.microsoft.com/azure/virtual-desktop/store-fslogix-profile", "services": [ + "AVD", "Storage", - "VM", - "AVD" + "VM" ], "severity": "High", "subcategory": "Capacity Planning", @@ -17307,8 +20859,8 @@ "guid": "2fad62bd-5004-453c-ace4-64d862e7f5a4", "link": "https://learn.microsoft.com/azure/virtual-desktop/store-fslogix-profile", "services": [ - "Storage", - "AVD" + "AVD", + "Storage" ], "severity": "High", "subcategory": "Capacity Planning", @@ -17322,8 +20874,8 @@ "guid": "680e7828-9c93-4665-9d02-bff4564b0d93", "link": "https://learn.microsoft.com/azure/virtual-desktop/faq#what-s-the-largest-profile-size-fslogix-can-handle-", "services": [ - "Storage", - "AVD" + "AVD", + "Storage" ], "severity": "High", "subcategory": "Capacity Planning", @@ -17337,9 +20889,9 @@ "guid": "8aad53cc-79e2-4e86-9673-57c549675c5e", "link": "https://docs.microsoft.com/azure/virtual-desktop/fslogix-containers-azure-files", "services": [ + "AVD", "Storage", - "Cost", - "AVD" + "Cost" ], "severity": "High", "subcategory": "Capacity Planning", @@ -17353,9 +20905,9 @@ "guid": "df47d2d9-2881-4b1c-b5d1-e54a29759e39", "link": "https://learn.microsoft.com/fslogix/concepts-container-types#when-to-use-profile-and-odfc-containers", "services": [ + "AVD", "Storage", - "ASR", - "AVD" + "ASR" ], "severity": "High", "subcategory": "FSLogix", @@ -17369,8 +20921,8 @@ "guid": "83f63047-22ee-479d-9b5c-3632054b69ba", "link": "https://learn.microsoft.com/fslogix/overview-prerequisites#configure-antivirus-file-and-folder-exclusions", "services": [ - "Storage", - "AVD" + "AVD", + "Storage" ], "severity": "Medium", "subcategory": "FSLogix", @@ -17384,8 +20936,8 @@ "guid": "01e6a84d-e5df-443d-8992-481718d5d1e5", "link": "https://docs.microsoft.com/fslogix/profile-container-configuration-reference", "services": [ - "Storage", - "AVD" + "AVD", + "Storage" ], "severity": "High", "subcategory": "FSLogix", @@ -17399,10 +20951,10 @@ "guid": "d34aad5e-8c78-4e1d-9666-7313c405674c", "link": "https://learn.microsoft.com/fslogix/concepts-configuration-examples", "services": [ - "AKV", - "Storage", "AVD", - "ACR" + "Storage", + "ACR", + "AKV" ], "severity": "High", "subcategory": "FSLogix", @@ -17416,8 +20968,8 @@ "guid": "5e985b85-9c77-43e7-b261-623b775a917e", "link": "https://learn.microsoft.com/fslogix/concepts-multi-concurrent-connections", "services": [ - "Storage", - "AVD" + "AVD", + "Storage" ], "severity": "High", "subcategory": "FSLogix", @@ -17431,9 +20983,9 @@ "guid": "b2d1215a-e114-4ba3-9df5-85ecdcd9bd3b", "link": "https://docs.microsoft.com/fslogix/cloud-cache-configuration-reference", "services": [ + "AVD", "Storage", - "VM", - "AVD" + "VM" ], "severity": "Low", "subcategory": "FSLogix", @@ -17447,8 +20999,8 @@ "guid": "0b50ca97-b1d2-473c-b4d9-6e98b0f912de", "link": "https://docs.microsoft.com/fslogix/manage-profile-content-cncpt#redirectionsxml", "services": [ - "Storage", - "AVD" + "AVD", + "Storage" ], "severity": "Medium", "subcategory": "FSLogix", @@ -17632,8 +21184,8 @@ "link": "https://learn.microsoft.com/azure/cosmos-db/high-availability#multiple-write-regions", "service": "CosmosDB", "services": [ - "CosmosDB", - "ACR" + "ACR", + "CosmosDB" ], "severity": "Medium", "subcategory": "High Availability", @@ -17648,8 +21200,8 @@ "link": "https://learn.microsoft.com/azure/cosmos-db/high-availability#slas", "service": "CosmosDB", "services": [ - "CosmosDB", - "ACR" + "ACR", + "CosmosDB" ], "severity": "Medium", "subcategory": "High Availability", @@ -17694,9 +21246,9 @@ "link": "https://learn.microsoft.com/azure/cosmos-db/online-backup-and-restore", "service": "CosmosDB", "services": [ - "Backup", + "Storage", "CosmosDB", - "Storage" + "Backup" ], "severity": "Medium", "subcategory": "Backup Strategy", @@ -17712,8 +21264,8 @@ "link": "https://learn.microsoft.com/azure/cosmos-db/periodic-backup-restore-introduction", "service": "CosmosDB", "services": [ - "Backup", - "CosmosDB" + "CosmosDB", + "Backup" ], "severity": "Medium", "subcategory": "Backup Strategy", @@ -17729,8 +21281,8 @@ "link": "https://learn.microsoft.com/azure/cosmos-db/continuous-backup-restore-introduction", "service": "CosmosDB", "services": [ - "Backup", - "CosmosDB" + "CosmosDB", + "Backup" ], "severity": "Medium", "subcategory": "Backup Strategy", @@ -17775,9 +21327,9 @@ "link": "https://learn.microsoft.com/azure/well-architected/sap/design-areas/data-platform", "service": "SAP", "services": [ + "SAP", "Backup", - "ASR", - "SAP" + "ASR" ], "severity": "Medium", "subcategory": "Backup and restore", @@ -17790,9 +21342,9 @@ "guid": "c4b8e117-930b-4dbd-ae50-7bc5faf6f91a", "service": "SAP", "services": [ - "Backup", + "SAP", "ASR", - "SAP" + "Backup" ], "severity": "Medium", "subcategory": "Disaster recovery", @@ -17806,11 +21358,11 @@ "link": "https://learn.microsoft.com/azure/reliability/cross-region-replication-azure", "service": "SAP", "services": [ - "Backup", - "SQL", "Storage", "ASR", - "SAP" + "Backup", + "SAP", + "SQL" ], "severity": "High", "subcategory": "Disaster recovery", @@ -17825,8 +21377,8 @@ "link": "https://learn.microsoft.com/azure/sap/workloads/high-availability-zones", "service": "SAP", "services": [ - "ASR", - "SAP" + "SAP", + "ASR" ], "severity": "Medium", "subcategory": "Disaster recovery", @@ -17841,10 +21393,10 @@ "link": "https://learn.microsoft.com/azure/expressroute/designing-for-disaster-recovery-with-expressroute-privatepeering", "service": "SAP", "services": [ - "VPN", - "ASR", + "SAP", "ExpressRoute", - "SAP" + "VPN", + "ASR" ], "severity": "High", "subcategory": "Disaster recovery", @@ -17859,10 +21411,10 @@ "link": "https://learn.microsoft.com/azure/key-vault/general/disaster-recovery-guidance", "service": "SAP", "services": [ - "AKV", + "SAP", "ACR", - "ASR", - "SAP" + "AKV", + "ASR" ], "severity": "Low", "subcategory": "Disaster recovery", @@ -17876,9 +21428,9 @@ "link": "https://learn.microsoft.com/azure/architecture/guide/sap/sap-s4hana", "service": "SAP", "services": [ + "SAP", "VNet", - "ASR", - "SAP" + "ASR" ], "severity": "Medium", "subcategory": "Disaster recovery", @@ -17893,8 +21445,8 @@ "service": "SAP", "services": [ "Storage", - "ASR", - "SAP" + "SAP", + "ASR" ], "severity": "Low", "subcategory": "Disaster recovery", @@ -17909,8 +21461,8 @@ "link": "https://learn.microsoft.com/azure/sap/workloads/disaster-recovery-sap-guide?tabs=windows", "service": "SAP", "services": [ - "ASR", - "SAP" + "SAP", + "ASR" ], "severity": "High", "subcategory": "Disaster recovery", @@ -17925,9 +21477,9 @@ "link": "https://learn.microsoft.com/ja-jp/azure/virtual-network/virtual-networks-faq", "service": "SAP", "services": [ - "ASR", + "SAP", "VNet", - "SAP" + "ASR" ], "severity": "High", "subcategory": "Disaster recovery", @@ -17941,10 +21493,10 @@ "guid": "0258ed30-fe42-434f-87b9-58f91f908e0a", "service": "SAP", "services": [ - "Entra", - "ASR", "VM", - "SAP" + "SAP", + "Entra", + "ASR" ], "severity": "High", "subcategory": "Disaster recovery", @@ -17959,8 +21511,8 @@ "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/eslz-business-continuity-and-disaster-recovery", "service": "SAP", "services": [ - "ASR", - "SAP" + "SAP", + "ASR" ], "severity": "High", "subcategory": "High availability", @@ -17975,8 +21527,8 @@ "link": "https://learn.microsoft.com/azure/sap/workloads/planning-supported-configurations", "service": "SAP", "services": [ - "ASR", - "SAP" + "SAP", + "ASR" ], "severity": "High", "subcategory": "High availability", @@ -17991,10 +21543,10 @@ "link": "https://learn.microsoft.com/azure/sap/workloads/disaster-recovery-sap-guide?tabs=windows", "service": "SAP", "services": [ - "Storage", "VM", - "ASR", - "SAP" + "Storage", + "SAP", + "ASR" ], "severity": "High", "subcategory": "High availability", @@ -18010,8 +21562,8 @@ "service": "SAP", "services": [ "Storage", - "ASR", - "SAP" + "SAP", + "ASR" ], "severity": "High", "subcategory": "High availability", @@ -18026,8 +21578,8 @@ "link": "https://learn.microsoft.com/azure/sap/workloads/sap-high-availability-guide-wsfc-shared-disk", "service": "SAP", "services": [ - "ASR", - "SAP" + "SAP", + "ASR" ], "severity": "High", "subcategory": "High availability", @@ -18042,9 +21594,9 @@ "link": "https://learn.microsoft.com/azure/sap/workloads/high-availability-guide-standard-load-balancer-outbound-connections", "service": "SAP", "services": [ + "SAP", "LoadBalancer", - "ASR", - "SAP" + "ASR" ], "severity": "High", "subcategory": "High availability", @@ -18059,9 +21611,9 @@ "link": "https://learn.microsoft.com/azure/load-balancer/load-balancer-ha-ports-overview?source=recommendations", "service": "SAP", "services": [ + "SAP", "LoadBalancer", - "ASR", - "SAP" + "ASR" ], "severity": "High", "subcategory": "High availability", @@ -18076,8 +21628,8 @@ "link": "https://learn.microsoft.com/azure/virtual-machines/availability", "service": "SAP", "services": [ - "ASR", - "SAP" + "SAP", + "ASR" ], "severity": "High", "subcategory": "High availability", @@ -18092,10 +21644,10 @@ "link": "https://www.microsoft.com/licensing/docs/view/Service-Level-Agreements-SLA-for-Online-Services?lang=1", "service": "SAP", "services": [ - "Entra", - "ASR", "VM", - "SAP" + "SAP", + "Entra", + "ASR" ], "severity": "High", "subcategory": "High availability", @@ -18110,9 +21662,9 @@ "service": "SAP", "services": [ "Entra", - "ASR", "VM", "RBAC", + "ASR", "SAP" ], "severity": "High", @@ -18128,8 +21680,8 @@ "link": "https://learn.microsoft.com/azure/virtual-machines/co-location", "service": "SAP", "services": [ - "ASR", - "SAP" + "SAP", + "ASR" ], "severity": "Medium", "subcategory": "High availability", @@ -18144,9 +21696,9 @@ "link": "https://learn.microsoft.com/azure/virtual-machines/availability-set-overview", "service": "SAP", "services": [ - "ASR", "VM", - "SAP" + "SAP", + "ASR" ], "severity": "High", "subcategory": "High availability", @@ -18162,8 +21714,8 @@ "service": "SAP", "services": [ "Entra", - "ASR", - "SAP" + "SAP", + "ASR" ], "severity": "High", "subcategory": "High availability", @@ -18177,9 +21729,9 @@ "link": "https://learn.microsoft.com/azure/sap/workloads/proximity-placement-scenarios", "service": "SAP", "services": [ + "SAP", "ACR", - "ASR", - "SAP" + "ASR" ], "severity": "High", "subcategory": "High availability", @@ -18194,8 +21746,8 @@ "service": "SAP", "services": [ "Entra", - "ASR", - "SAP" + "SAP", + "ASR" ], "severity": "High", "subcategory": "High availability", @@ -18210,10 +21762,10 @@ "link": "https://learn.microsoft.com/azure/sap/workloads/high-availability-guide-suse-multi-sid", "service": "SAP", "services": [ - "Entra", - "ASR", "VM", - "SAP" + "SAP", + "Entra", + "ASR" ], "severity": "Medium", "subcategory": "High availability", @@ -18228,10 +21780,10 @@ "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/eslz-business-continuity-and-disaster-recovery", "service": "SAP", "services": [ - "Storage", "VM", - "ASR", - "SAP" + "Storage", + "SAP", + "ASR" ], "severity": "Medium", "subcategory": "High availability", @@ -18245,8 +21797,8 @@ "link": "https://learn.microsoft.com/azure/sap/workloads/high-availability-guide-rhel-with-hana-ascs-ers-dialog-instance", "service": "SAP", "services": [ - "ASR", - "SAP" + "SAP", + "ASR" ], "severity": "Medium", "subcategory": "High availability", @@ -18262,8 +21814,8 @@ "service": "SAP", "services": [ "Storage", - "ASR", - "SAP" + "SAP", + "ASR" ], "severity": "High", "subcategory": "Storage", @@ -18279,8 +21831,8 @@ "service": "SAP", "services": [ "Storage", - "ASR", - "SAP" + "SAP", + "ASR" ], "severity": "High", "subcategory": "Storage", @@ -18296,8 +21848,8 @@ "service": "SAP", "services": [ "Storage", - "ASR", - "SAP" + "SAP", + "ASR" ], "severity": "High", "subcategory": "Storage", @@ -18313,8 +21865,8 @@ "service": "SAP", "services": [ "Storage", - "ASR", - "SAP" + "SAP", + "ASR" ], "severity": "High", "subcategory": "Storage", @@ -18328,8 +21880,8 @@ "link": "https://techcommunity.microsoft.com/t5/running-sap-applications-on-the/optimize-your-azure-costs-by-automating-sap-system-start-stop/ba-p/2120675", "service": "SAP", "services": [ - "Cost", - "SAP" + "SAP", + "Cost" ], "severity": "Medium", "subcategory": " ", @@ -18343,10 +21895,10 @@ "link": "https://learn.microsoft.com/azure/sap/workloads/hana-vm-premium-ssd-v1", "service": "SAP", "services": [ - "Storage", "VM", - "Cost", - "SAP" + "Storage", + "SAP", + "Cost" ], "severity": "Low", "subcategory": " ", @@ -18360,10 +21912,10 @@ "link": "https://learn.microsoft.com/azure/sap/workloads/hana-vm-premium-ssd-v1", "service": "SAP", "services": [ - "Storage", "VM", - "Cost", - "SAP" + "Storage", + "SAP", + "Cost" ], "severity": "Low", "subcategory": " ", @@ -18379,8 +21931,8 @@ "services": [ "Entra", "RBAC", - "Subscriptions", - "SAP" + "SAP", + "Subscriptions" ], "severity": "High", "subcategory": "Identity", @@ -18473,8 +22025,8 @@ "service": "SAP", "services": [ "Entra", - "AKV", - "SAP" + "SAP", + "AKV" ], "severity": "Medium", "subcategory": "Identity", @@ -18490,8 +22042,8 @@ "service": "SAP", "services": [ "Entra", - "AKV", - "SAP" + "SAP", + "AKV" ], "severity": "Medium", "subcategory": "Identity", @@ -18610,9 +22162,9 @@ "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/ready/landing-zone/design-area/resource-org-management-groups", "service": "SAP", "services": [ - "Subscriptions", + "SAP", "AzurePolicy", - "SAP" + "Subscriptions" ], "severity": "Medium", "subcategory": "Subscriptions", @@ -18627,8 +22179,8 @@ "link": "https://learn.microsoft.com/azure/architecture/guide/sap/sap-whole-landscape", "service": "SAP", "services": [ - "Subscriptions", - "SAP" + "SAP", + "Subscriptions" ], "severity": "High", "subcategory": "Subscriptions", @@ -18643,8 +22195,8 @@ "link": "https://learn.microsoft.com/azure/architecture/guide/sap/sap-whole-landscape", "service": "SAP", "services": [ - "Subscriptions", - "SAP" + "SAP", + "Subscriptions" ], "severity": "High", "subcategory": "Subscriptions", @@ -18660,8 +22212,8 @@ "service": "SAP", "services": [ "VM", - "Subscriptions", - "SAP" + "SAP", + "Subscriptions" ], "severity": "High", "subcategory": "Subscriptions", @@ -18676,8 +22228,8 @@ "link": "https://learn.microsoft.com/rest/api/reserved-vm-instances/quotaapi?branch=capacity", "service": "SAP", "services": [ - "Subscriptions", - "SAP" + "SAP", + "Subscriptions" ], "severity": "Low", "subcategory": "Subscriptions", @@ -18692,8 +22244,8 @@ "service": "SAP", "services": [ "VM", - "Subscriptions", - "SAP" + "SAP", + "Subscriptions" ], "severity": "High", "subcategory": "Subscriptions", @@ -18707,8 +22259,8 @@ "link": "https://azure.microsoft.com/explore/global-infrastructure/products-by-region/", "service": "SAP", "services": [ - "Subscriptions", - "SAP" + "SAP", + "Subscriptions" ], "severity": "High", "subcategory": "Subscriptions", @@ -18723,10 +22275,10 @@ "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/eslz-resource-organization", "service": "SAP", "services": [ + "SAP", "TrafficManager", - "Cost", "Subscriptions", - "SAP" + "Cost" ], "severity": "Medium", "subcategory": "Subscriptions", @@ -18742,8 +22294,8 @@ "service": "SAP", "services": [ "Monitor", - "Backup", - "SAP" + "SAP", + "Backup" ], "severity": "High", "subcategory": "BCDR", @@ -18758,10 +22310,10 @@ "link": "https://learn.microsoft.com/azure/azure-netapp-files/azacsnap-introduction", "service": "SAP", "services": [ - "Entra", + "Monitor", "Storage", + "Entra", "VM", - "Monitor", "SAP" ], "severity": "Medium", @@ -18792,8 +22344,8 @@ "service": "SAP", "services": [ "Entra", - "Monitor", - "SAP" + "SAP", + "Monitor" ], "severity": "Medium", "subcategory": "Management", @@ -18809,8 +22361,8 @@ "service": "SAP", "services": [ "Monitor", - "Cost", - "SAP" + "SAP", + "Cost" ], "severity": "Low", "subcategory": "Management", @@ -18825,8 +22377,8 @@ "service": "SAP", "services": [ "Entra", - "Monitor", - "SAP" + "SAP", + "Monitor" ], "severity": "Medium", "subcategory": "Management", @@ -18840,9 +22392,9 @@ "link": "https://learn.microsoft.com/azure/update-manager/scheduled-patching?tabs=schedule-updates-single-machine%2Cschedule-updates-scale-overview", "service": "SAP", "services": [ - "Monitor", "VM", - "SAP" + "SAP", + "Monitor" ], "severity": "Medium", "subcategory": "Management", @@ -18874,8 +22426,8 @@ "service": "SAP", "services": [ "Monitor", - "SQL", - "SAP" + "SAP", + "SQL" ], "severity": "Medium", "subcategory": "Monitoring", @@ -18890,10 +22442,10 @@ "link": "https://learn.microsoft.com/azure/sap/workloads/vm-extension-for-sap", "service": "SAP", "services": [ - "Entra", - "Monitor", "VM", - "SAP" + "SAP", + "Monitor", + "Entra" ], "severity": "High", "subcategory": "Monitoring", @@ -18909,8 +22461,8 @@ "service": "SAP", "services": [ "Monitor", - "AzurePolicy", - "SAP" + "SAP", + "AzurePolicy" ], "severity": "Medium", "subcategory": "Monitoring", @@ -18925,9 +22477,9 @@ "link": "https://learn.microsoft.com/azure/network-watcher/connection-monitor-overview", "service": "SAP", "services": [ - "NetworkWatcher", "Monitor", - "SAP" + "SAP", + "NetworkWatcher" ], "severity": "Medium", "subcategory": "Monitoring", @@ -18942,9 +22494,9 @@ "link": "https://github.com/Azure/SAP-on-Azure-Scripts-and-Utilities/tree/main/QualityCheck", "service": "SAP", "services": [ - "Monitor", "VM", - "SAP" + "SAP", + "Monitor" ], "severity": "Medium", "subcategory": "Monitoring", @@ -18959,8 +22511,8 @@ "service": "SAP", "services": [ "Monitor", - "Subscriptions", - "SAP" + "SAP", + "Subscriptions" ], "severity": "High", "subcategory": "Monitoring", @@ -18977,8 +22529,8 @@ "services": [ "Monitor", "Storage", - "ASR", - "SAP" + "SAP", + "ASR" ], "severity": "Medium", "subcategory": "Monitoring", @@ -18993,8 +22545,8 @@ "link": "https://learn.microsoft.com/azure/sentinel/sap/deployment-overview", "service": "SAP", "services": [ - "Sentinel", "Monitor", + "Sentinel", "SAP" ], "severity": "Medium", @@ -19011,8 +22563,8 @@ "service": "SAP", "services": [ "Monitor", - "Cost", - "SAP" + "SAP", + "Cost" ], "severity": "Medium", "subcategory": "Monitoring", @@ -19027,9 +22579,9 @@ "link": "https://learn.microsoft.com/azure/virtual-network/virtual-network-test-latency?tabs=windows", "service": "SAP", "services": [ - "Monitor", "VM", - "SAP" + "SAP", + "Monitor" ], "severity": "Low", "subcategory": "Performance", @@ -19044,8 +22596,8 @@ "service": "SAP", "services": [ "Monitor", - "ASR", - "SAP" + "SAP", + "ASR" ], "severity": "Medium", "subcategory": "Performance", @@ -19109,8 +22661,8 @@ "service": "SAP", "services": [ "Monitor", - "SQL", - "SAP" + "SAP", + "SQL" ], "severity": "Medium", "subcategory": "Performance", @@ -19126,8 +22678,8 @@ "service": "SAP", "services": [ "Monitor", - "ASR", - "SAP" + "SAP", + "ASR" ], "severity": "High", "subcategory": "Reliability", @@ -19142,10 +22694,10 @@ "link": "https://learn.microsoft.com/azure/ddos-protection/ddos-protection-overview", "service": "SAP", "services": [ + "SAP", "AppGW", - "WAF", "AzurePolicy", - "SAP" + "WAF" ], "severity": "Medium", "subcategory": "App delivery", @@ -19160,8 +22712,8 @@ "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/eslz-network-topology-and-connectivity", "service": "SAP", "services": [ - "DNS", "VM", + "DNS", "SAP" ], "severity": "Medium", @@ -19178,8 +22730,8 @@ "service": "SAP", "services": [ "DNS", - "VNet", - "SAP" + "SAP", + "VNet" ], "severity": "Medium", "subcategory": "DNS", @@ -19195,8 +22747,8 @@ "service": "SAP", "services": [ "ACR", - "VNet", - "SAP" + "SAP", + "VNet" ], "severity": "Medium", "subcategory": "Hybrid", @@ -19211,8 +22763,8 @@ "link": "https://learn.microsoft.com/azure/sap/workloads/planning-guide", "service": "SAP", "services": [ - "NVA", - "SAP" + "SAP", + "NVA" ], "severity": "High", "subcategory": "Hybrid", @@ -19227,9 +22779,9 @@ "link": "https://learn.microsoft.com/training/modules/introduction-azure-virtual-wan/?source=recommendations", "service": "SAP", "services": [ - "VWAN", + "SAP", "ACR", - "SAP" + "VWAN" ], "severity": "Medium", "subcategory": "Hybrid", @@ -19244,9 +22796,9 @@ "link": "https://learn.microsoft.com/azure/well-architected/services/networking/network-virtual-appliances/reliability", "service": "SAP", "services": [ - "VNet", + "SAP", "NVA", - "SAP" + "VNet" ], "severity": "Medium", "subcategory": "Hybrid", @@ -19261,10 +22813,10 @@ "link": "https://learn.microsoft.com/azure/architecture/networking/hub-spoke-vwan-architecture", "service": "SAP", "services": [ - "VWAN", - "VNet", + "SAP", "NVA", - "SAP" + "VNet", + "VWAN" ], "severity": "Medium", "subcategory": "Hybrid", @@ -19279,9 +22831,9 @@ "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/ready/azure-best-practices/plan-for-ip-addressing", "service": "SAP", "services": [ - "VNet", "VM", - "SAP" + "SAP", + "VNet" ], "severity": "High", "subcategory": "IP plan", @@ -19296,9 +22848,9 @@ "link": "https://learn.microsoft.com/training/modules/protect-on-premises-infrastructure-with-azure-site-recovery/?source=recommendations", "service": "SAP", "services": [ + "SAP", "VNet", - "ASR", - "SAP" + "ASR" ], "severity": "High", "subcategory": "IP plan", @@ -19313,8 +22865,8 @@ "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/ready/azure-best-practices/plan-for-ip-addressing", "service": "SAP", "services": [ - "VNet", - "SAP" + "SAP", + "VNet" ], "severity": "High", "subcategory": "IP plan", @@ -19330,8 +22882,8 @@ "service": "SAP", "services": [ "Storage", - "VNet", - "SAP" + "SAP", + "VNet" ], "severity": "Medium", "subcategory": "IP plan", @@ -19346,8 +22898,8 @@ "link": "https://learn.microsoft.com/azure/well-architected/services/networking/azure-firewall?toc=%2Fazure%2Ffirewall%2Ftoc.json&bc=%2Fazure%2Ffirewall%2Fbreadcrumb%2Ftoc.json", "service": "SAP", "services": [ - "Firewall", - "SAP" + "SAP", + "Firewall" ], "severity": "Medium", "subcategory": "Internet", @@ -19362,9 +22914,9 @@ "link": "https://learn.microsoft.com/azure/sap/workloads/expose-sap-process-orchestration-on-azure", "service": "SAP", "services": [ + "SAP", "AppGW", - "WAF", - "SAP" + "WAF" ], "severity": "Medium", "subcategory": "Internet", @@ -19380,10 +22932,10 @@ "service": "SAP", "services": [ "AzurePolicy", - "FrontDoor", + "WAF", "ACR", - "SAP", - "WAF" + "FrontDoor", + "SAP" ], "severity": "Medium", "subcategory": "Internet", @@ -19398,11 +22950,11 @@ "link": "https://learn.microsoft.com/azure/web-application-firewall/afds/afds-overview", "service": "SAP", "services": [ - "AppGW", "AzurePolicy", + "AppGW", + "WAF", "FrontDoor", - "SAP", - "WAF" + "SAP" ], "severity": "Medium", "subcategory": "Internet", @@ -19417,10 +22969,10 @@ "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/ag-overview", "service": "SAP", "services": [ - "LoadBalancer", + "SAP", "AppGW", "WAF", - "SAP" + "LoadBalancer" ], "severity": "Medium", "subcategory": "Internet", @@ -19435,9 +22987,9 @@ "link": "https://learn.microsoft.com/azure/frontdoor/front-door-overview", "service": "SAP", "services": [ - "VWAN", + "SAP", "ACR", - "SAP" + "VWAN" ], "severity": "Medium", "subcategory": "Internet", @@ -19452,12 +23004,12 @@ "link": "https://learn.microsoft.com/azure/virtual-network/vnet-integration-for-azure-services", "service": "SAP", "services": [ - "PrivateLink", - "Backup", "Storage", + "VNet", + "PrivateLink", "ACR", - "SAP", - "VNet" + "Backup", + "SAP" ], "severity": "Medium", "subcategory": "Internet", @@ -19488,8 +23040,8 @@ "link": "https://learn.microsoft.com/azure/load-balancer/load-balancer-multivip-overview", "service": "SAP", "services": [ - "LoadBalancer", - "SAP" + "SAP", + "LoadBalancer" ], "severity": "Medium", "subcategory": "Segmentation", @@ -19505,8 +23057,8 @@ "service": "SAP", "services": [ "VM", - "VNet", - "SAP" + "SAP", + "VNet" ], "severity": "Medium", "subcategory": "Segmentation", @@ -19521,8 +23073,8 @@ "link": "https://me.sap.com/notes/2015553", "service": "SAP", "services": [ - "VNet", - "SAP" + "SAP", + "VNet" ], "severity": "High", "subcategory": "Segmentation", @@ -19567,9 +23119,9 @@ "link": "https://me.sap.com/notes/2015553", "service": "SAP", "services": [ + "SAP", "VNet", - "Cost", - "SAP" + "Cost" ], "severity": "High", "subcategory": "Segmentation", @@ -19584,8 +23136,8 @@ "link": "https://learn.microsoft.com/azure/sap/workloads/high-availability-guide-rhel", "service": "SAP", "services": [ - "LoadBalancer", - "SAP" + "SAP", + "LoadBalancer" ], "severity": "High", "subcategory": "Segmentation", @@ -19600,8 +23152,8 @@ "link": "https://learn.microsoft.com/azure/sap/workloads/rise-integration", "service": "SAP", "services": [ - "VNet", - "SAP" + "SAP", + "VNet" ], "severity": "Medium", "subcategory": "Segmentation", @@ -19615,9 +23167,9 @@ "link": "https://learn.microsoft.com/azure/backup/sap-hana-database-about", "service": "SAP", "services": [ - "Backup", "VM", - "SAP" + "SAP", + "Backup" ], "severity": "High", "subcategory": " ", @@ -19632,8 +23184,8 @@ "service": "SAP", "services": [ "Monitor", - "ASR", - "SAP" + "SAP", + "ASR" ], "severity": "Medium", "subcategory": " ", @@ -19662,9 +23214,9 @@ "link": "https://learn.microsoft.com/azure/virtual-machines/workloads/oracle/oracle-database-backup-strategies", "service": "SAP", "services": [ - "Backup", "VM", - "SAP" + "SAP", + "Backup" ], "severity": "Medium", "subcategory": " ", @@ -19679,8 +23231,8 @@ "service": "SAP", "services": [ "Storage", - "SQL", - "SAP" + "SAP", + "SQL" ], "severity": "Medium", "subcategory": " ", @@ -19694,9 +23246,9 @@ "link": "https://learn.microsoft.com/azure/azure-sql/virtual-machines/windows/automated-backup?view=azuresql", "service": "SAP", "services": [ - "Backup", "VM", - "SAP" + "SAP", + "Backup" ], "severity": "Medium", "subcategory": " ", @@ -19767,8 +23319,8 @@ "service": "SAP", "services": [ "Monitor", - "SQL", - "SAP" + "SAP", + "SQL" ], "severity": "Medium", "subcategory": " ", @@ -19858,8 +23410,8 @@ "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/sap-lza-database-security", "service": "SAP", "services": [ - "SQL", - "SAP" + "SAP", + "SQL" ], "severity": "Low", "subcategory": "Governance", @@ -19873,8 +23425,8 @@ "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/sap-lza-database-security", "service": "SAP", "services": [ - "SQL", - "SAP" + "SAP", + "SQL" ], "severity": "High", "subcategory": "Governance", @@ -19889,11 +23441,11 @@ "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/eslz-security-governance-and-compliance", "service": "SAP", "services": [ + "Storage", "AKV", "Backup", - "SQL", - "Storage", - "SAP" + "SAP", + "SQL" ], "severity": "High", "subcategory": "Secrets", @@ -19908,9 +23460,9 @@ "link": "https://learn.microsoft.com/azure/storage/common/storage-service-encryption", "service": "SAP", "services": [ - "AKV", "Storage", - "SAP" + "SAP", + "AKV" ], "severity": "Medium", "subcategory": "Secrets", @@ -19925,8 +23477,8 @@ "link": "https://learn.microsoft.com/azure/key-vault/general/overview", "service": "SAP", "services": [ - "AKV", - "SAP" + "SAP", + "AKV" ], "severity": "High", "subcategory": "Secrets", @@ -19941,10 +23493,10 @@ "link": "https://learn.microsoft.com/azure/azure-resource-manager/management/lock-resources?tabs=json", "service": "SAP", "services": [ - "AKV", "AzurePolicy", - "RBAC", "Subscriptions", + "AKV", + "RBAC", "SAP" ], "severity": "Medium", @@ -19960,9 +23512,9 @@ "link": "https://learn.microsoft.com/azure/key-vault/general/soft-delete-overview", "service": "SAP", "services": [ - "AKV", + "SAP", "AzurePolicy", - "SAP" + "AKV" ], "severity": "Medium", "subcategory": "Secrets", @@ -19978,9 +23530,9 @@ "service": "SAP", "services": [ "RBAC", - "AKV", + "SAP", "AzurePolicy", - "SAP" + "AKV" ], "severity": "High", "subcategory": "Secrets", @@ -19995,10 +23547,10 @@ "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/eslz-security-governance-and-compliance", "service": "SAP", "services": [ - "AKV", - "Storage", "Defender", - "SAP" + "Storage", + "SAP", + "AKV" ], "severity": "High", "subcategory": "Secrets", @@ -20013,10 +23565,10 @@ "link": "https://learn.microsoft.com/azure/defender-for-cloud/just-in-time-access-overview?tabs=defender-for-container-arch-aks", "service": "SAP", "services": [ - "RBAC", - "AKV", "Defender", - "SAP" + "RBAC", + "SAP", + "AKV" ], "severity": "High", "subcategory": "Secrets", @@ -20031,8 +23583,8 @@ "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/eslz-security-governance-and-compliance", "service": "SAP", "services": [ - "AKV", - "SAP" + "SAP", + "AKV" ], "severity": "Low", "subcategory": "Secrets", @@ -20047,8 +23599,8 @@ "link": "https://learn.microsoft.com/azure/storage/common/storage-encryption-key-model-get?tabs=portal", "service": "SAP", "services": [ - "AKV", - "SAP" + "SAP", + "AKV" ], "severity": "Medium", "subcategory": "Secrets", @@ -20063,8 +23615,8 @@ "link": "https://learn.microsoft.com/ja-jp/azure/key-vault/general/best-practices", "service": "SAP", "services": [ - "AKV", - "SAP" + "SAP", + "AKV" ], "severity": "High", "subcategory": "Secrets", @@ -20079,8 +23631,8 @@ "link": "https://learn.microsoft.com/azure/key-vault/certificates/certificate-scenarios", "service": "SAP", "services": [ - "AKV", - "SAP" + "SAP", + "AKV" ], "severity": "High", "subcategory": "Secrets", @@ -20096,8 +23648,8 @@ "service": "SAP", "services": [ "RBAC", - "Subscriptions", - "SAP" + "SAP", + "Subscriptions" ], "severity": "High", "subcategory": "Security", @@ -20112,9 +23664,9 @@ "link": "https://blogs.sap.com/2019/07/21/sap-security-operations-on-azure/", "service": "SAP", "services": [ - "PrivateLink", + "SAP", "NVA", - "SAP" + "PrivateLink" ], "severity": "High", "subcategory": "Security", @@ -20129,8 +23681,8 @@ "link": "https://learn.microsoft.com/en-us/training/modules/secure-vms-with-azure-security-center/?source=recommendations", "service": "SAP", "services": [ - "Storage", "VM", + "Storage", "SAP" ], "severity": "Low", @@ -20162,8 +23714,8 @@ "link": "https://learn.microsoft.com/azure/architecture/guide/sap/sap-whole-landscape", "service": "SAP", "services": [ - "VNet", - "SAP" + "SAP", + "VNet" ], "severity": "High", "subcategory": "Security", @@ -20178,8 +23730,8 @@ "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/eslz-security-governance-and-compliance", "service": "SAP", "services": [ - "WAF", - "SAP" + "SAP", + "WAF" ], "severity": "Low", "subcategory": "Security", @@ -20194,9 +23746,9 @@ "link": "https://learn.microsoft.com/azure/sap/monitor/enable-tls-azure-monitor-sap-solutions", "service": "SAP", "services": [ - "AKV", "Monitor", - "SAP" + "SAP", + "AKV" ], "severity": "Medium", "subcategory": "Security", @@ -20395,8 +23947,8 @@ "link": "https://learn.microsoft.com/azure/active-directory/managed-identities-azure-resources/tutorial-windows-vm-access-nonaad", "services": [ "Entra", - "AKV", - "Arc" + "Arc", + "AKV" ], "severity": "Low", "subcategory": "Access", @@ -20490,8 +24042,8 @@ "guid": "6ee79d6b-5c2a-4364-a4b6-9bad38aad53c", "link": "https://learn.microsoft.com/azure/azure-arc/servers/plan-at-scale-deployment", "services": [ - "Arc", - "Monitor" + "Monitor", + "Arc" ], "severity": "Medium", "subcategory": "Management", @@ -20505,8 +24057,8 @@ "guid": "c78e1d76-6673-457c-9496-74c5ed85b859", "link": "https://learn.microsoft.com/azure/azure-arc/servers/manage-agent#upgrade-the-agent", "services": [ - "Arc", - "Monitor" + "Monitor", + "Arc" ], "severity": "High", "subcategory": "Management", @@ -20520,9 +24072,9 @@ "guid": "c7733be2-a1a2-47b7-95a9-1be1f388ff39", "link": "https://learn.microsoft.com/azure/azure-arc/servers/manage-vm-extensions", "services": [ + "Monitor", "Arc", - "AzurePolicy", - "Monitor" + "AzurePolicy" ], "severity": "Medium", "subcategory": "Management", @@ -20536,8 +24088,8 @@ "guid": "4c2bd463-cbbb-4c86-a195-abb91a4ed90d", "link": "https://learn.microsoft.com/azure/azure-arc/servers/manage-automatic-vm-extension-upgrade?tabs=azure-portal", "services": [ - "Arc", - "Monitor" + "Monitor", + "Arc" ], "severity": "High", "subcategory": "Management", @@ -20551,8 +24103,8 @@ "guid": "7a927c39-74d1-4102-aac6-aae01e6a84de", "link": "https://learn.microsoft.com/azure/automanage/automanage-arc", "services": [ - "Arc", - "Monitor" + "Monitor", + "Arc" ], "severity": "Medium", "subcategory": "Management", @@ -20565,8 +24117,8 @@ "guid": "37b6b780-cbaf-4e6c-9658-9d457a927c39", "link": "https://learn.microsoft.com/azure/azure-arc/servers/plan-at-scale-deployment#phase-3-manage-and-operate", "services": [ - "Arc", - "Monitor" + "Monitor", + "Arc" ], "severity": "High", "subcategory": "Monitoring", @@ -20579,8 +24131,8 @@ "guid": "74d1102c-ac6a-4ae0-8e6a-84de5df47d2d", "link": "https://learn.microsoft.com/azure/azure-monitor/agents/log-analytics-agent#data-collected", "services": [ - "Arc", - "Monitor" + "Monitor", + "Arc" ], "severity": "Medium", "subcategory": "Monitoring", @@ -20593,8 +24145,8 @@ "guid": "92881b1c-d5d1-4e54-a296-59e3958fd782", "link": "https://learn.microsoft.com/azure/service-health/resource-health-alert-monitor-guide", "services": [ - "Arc", - "Monitor" + "Monitor", + "Arc" ], "severity": "Medium", "subcategory": "Monitoring", @@ -20607,8 +24159,8 @@ "guid": "89c93555-6d02-4bfe-9564-b0d834a34872", "link": "https://learn.microsoft.com/azure/azure-arc/servers/learn/tutorial-enable-vm-insights", "services": [ - "Arc", - "Monitor" + "Monitor", + "Arc" ], "severity": "Medium", "subcategory": "Monitoring", @@ -20621,8 +24173,8 @@ "guid": "5df47d2d-9288-41b1-ad5d-1e54a29659e3", "link": "https://learn.microsoft.com/azure/azure-arc/servers/plan-at-scale-deployment#phase-3-manage-and-operate", "services": [ - "Arc", - "Monitor" + "Monitor", + "Arc" ], "severity": "Medium", "subcategory": "Monitoring", @@ -20636,8 +24188,8 @@ "guid": "ae2cc84c-37b6-4b78-8cba-fe6c46589d45", "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/manage/hybrid/server/best-practices/arc-update-management", "services": [ - "Arc", - "Monitor" + "Monitor", + "Arc" ], "severity": "Low", "subcategory": "Security", @@ -20679,10 +24231,10 @@ "guid": "94174158-33ee-47ad-9c6d-3733165c7acb", "link": "https://learn.microsoft.com/azure/azure-arc/servers/private-link-security", "services": [ - "VPN", "Arc", - "PrivateLink", - "ExpressRoute" + "ExpressRoute", + "VPN", + "PrivateLink" ], "severity": "Medium", "subcategory": "Networking", @@ -20738,9 +24290,9 @@ "guid": "a264f9a1-9bf3-49d9-9d44-c7c8919ca1f6", "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/hybrid/arc-enabled-servers/eslz-arc-servers-connectivity#define-extensions-connectivity-method", "services": [ - "PrivateLink", + "Monitor", "Arc", - "Monitor" + "PrivateLink" ], "severity": "Low", "subcategory": "Networking", @@ -20794,8 +24346,8 @@ "guid": "49674c5e-d85b-4859-a773-3be2a1a27b77", "link": "https://learn.microsoft.com/azure/automation/change-tracking/overview", "services": [ - "Arc", - "Monitor" + "Monitor", + "Arc" ], "severity": "Medium", "subcategory": "Monitoring", @@ -20821,8 +24373,8 @@ "guid": "195abb91-a4ed-490d-ae2c-c84c37b6b780", "link": "https://learn.microsoft.com/azure/key-vault/general/basic-concepts", "services": [ - "AKV", - "Arc" + "Arc", + "AKV" ], "severity": "Medium", "subcategory": "Secrets", @@ -20837,9 +24389,9 @@ "link": "https://learn.microsoft.com/azure/active-directory/develop/howto-create-service-principal-portal#option-2-create-a-new-application-secret", "services": [ "Entra", - "AKV", + "Storage", "Arc", - "Storage" + "AKV" ], "severity": "High", "subcategory": "Secrets", @@ -20853,8 +24405,8 @@ "guid": "a1a27b77-5a91-4be1-b388-ff394c2bd463", "link": "https://learn.microsoft.com/azure/azure-arc/servers/security-overview#using-disk-encryption", "services": [ - "AKV", - "Arc" + "Arc", + "AKV" ], "severity": "Medium", "subcategory": "Secrets", @@ -20910,8 +24462,8 @@ "guid": "5a91be1f-388f-4f39-9c2b-d463cbbbc868", "link": "https://learn.microsoft.com/azure/security-center/security-center-get-started", "services": [ - "Arc", - "Defender" + "Defender", + "Arc" ], "severity": "Medium", "subcategory": "Security", @@ -20950,9 +24502,9 @@ "guid": "676f6951-0368-49e9-808d-c33a692c9a64", "link": "https://learn.microsoft.com/security/benchmark/azure/baselines/sql-database-security-baseline#br-2-encrypt-backup-data", "services": [ + "SQL", "AKV", - "Backup", - "SQL" + "Backup" ], "severity": "Medium", "subcategory": "Azure Key Vault", @@ -20966,9 +24518,9 @@ "guid": "e2518261-b3bc-4bd1-b331-637fb2df833f", "link": "https://learn.microsoft.com/security/benchmark/azure/baselines/sql-database-security-baseline#br-1-ensure-regular-automated-backups", "services": [ - "Backup", + "Storage", "SQL", - "Storage" + "Backup" ], "severity": "Medium", "subcategory": "Backup", @@ -20982,9 +24534,9 @@ "guid": "f8c7cda2-3ed7-43fb-a100-85dcd12a0ee4", "link": "https://learn.microsoft.com/azure/azure-sql/database/automated-backups-overview?tabs=single-database&view=azuresql#backup-storage-redundancy", "services": [ - "Backup", "Storage", - "SQL" + "SQL", + "Backup" ], "severity": "Low", "subcategory": "Backup", @@ -21040,9 +24592,9 @@ "guid": "4e52d73f-5d37-428f-b3a2-e6997e835979", "link": "https://learn.microsoft.com/azure/azure-sql/database/threat-detection-configure", "services": [ + "Defender", "EventHubs", - "SQL", - "Defender" + "SQL" ], "severity": "High", "subcategory": "Advanced Threat Protection", @@ -21056,9 +24608,9 @@ "guid": "dff87489-9edb-4cef-bdda-86e8212b2aa1", "link": "https://learn.microsoft.com/azure/azure-sql/database/azure-defender-for-sql?view=azuresql#enable-microsoft-defender-for-sql ", "services": [ - "Subscriptions", + "Defender", "SQL", - "Defender" + "Subscriptions" ], "severity": "High", "subcategory": "Defender for Azure SQL", @@ -21072,8 +24624,8 @@ "guid": "ca342fdf-d25a-4427-b105-fcd50ff8a0ea", "link": "https://learn.microsoft.com/azure/azure-sql/database/threat-detection-configure", "services": [ - "SQL", "Defender", + "SQL", "Monitor" ], "severity": "High", @@ -21088,8 +24640,8 @@ "guid": "a6101ae7-534c-45ab-86fd-b34c55ea21ca", "link": "https://learn.microsoft.com/azure/defender-for-cloud/sql-azure-vulnerability-assessment-overview", "services": [ - "SQL", "Defender", + "SQL", "Monitor" ], "severity": "High", @@ -21104,8 +24656,8 @@ "guid": "c8c5f112-1e50-4f77-9264-8195b4cd61ac", "link": "https://learn.microsoft.com/azure/defender-for-cloud/sql-azure-vulnerability-assessment-find?view=azuresql", "services": [ - "SQL", - "Defender" + "Defender", + "SQL" ], "severity": "High", "subcategory": "Vulnerability Assessment", @@ -21133,9 +24685,9 @@ "guid": "c03ce136-e3d5-4e17-bf25-ed955ee480d3", "link": "https://learn.microsoft.com/azure/azure-sql/database/security-best-practice?view=azuresql#control-access-of-application-users-to-sensitive-data-through-encryption", "services": [ - "AKV", "Storage", - "SQL" + "SQL", + "AKV" ], "severity": "Low", "subcategory": "Column Encryption", @@ -21149,9 +24701,9 @@ "guid": "c614ac47-bebf-4061-b0a1-43e0c6b5e00d", "link": "https://learn.microsoft.com/azure/azure-sql/database/transparent-data-encryption-byok-create-server", "services": [ - "Backup", "Storage", - "SQL" + "SQL", + "Backup" ], "severity": "High", "subcategory": "Transparent Data Encryption", @@ -21165,8 +24717,8 @@ "guid": "2edb4165-4f54-47cc-a891-5c82c2f21e25", "link": "https://learn.microsoft.com/azure/azure-sql/database/transparent-data-encryption-byok-overview", "services": [ - "AKV", - "SQL" + "SQL", + "AKV" ], "severity": "Medium", "subcategory": "Transparent Data Encryption", @@ -21242,9 +24794,9 @@ "services": [ "Entra", "AKV", - "SQL", "RBAC", - "ACR" + "ACR", + "SQL" ], "severity": "Low", "subcategory": "Managed Identities", @@ -21363,12 +24915,12 @@ "guid": "9b64bc50-b60f-4035-bf7a-28c4806dfb46", "link": "https://learn.microsoft.com/azure/azure-sql/database/auditing-overview", "services": [ + "Monitor", + "EventHubs", + "Storage", "Entra", "Backup", - "Storage", - "SQL", - "Monitor", - "EventHubs" + "SQL" ], "severity": "Low", "subcategory": "Auditing", @@ -21382,11 +24934,11 @@ "guid": "fcd34708-87ac-4efc-aaf6-57a47f76644a", "link": "https://learn.microsoft.com/azure/azure-monitor/essentials/activity-log", "services": [ + "Monitor", + "EventHubs", "Storage", - "SQL", "Subscriptions", - "Monitor", - "EventHubs" + "SQL" ], "severity": "Medium", "subcategory": "Auditing", @@ -21400,8 +24952,8 @@ "guid": "f96e127e-9572-453a-b325-ff89ae9f6b44", "link": "https://learn.microsoft.com/azure/azure-sql/database/auditing-overview", "services": [ - "SQL", - "Monitor" + "Monitor", + "SQL" ], "severity": "Medium", "subcategory": "SIEM/SOAR", @@ -21415,8 +24967,8 @@ "guid": "41503bf8-73da-4a10-af9f-5f7fceb5456f", "link": "https://learn.microsoft.com/azure/azure-monitor/essentials/activity-log", "services": [ - "SQL", - "Monitor" + "Monitor", + "SQL" ], "severity": "Medium", "subcategory": "SIEM/SOAR", @@ -21445,8 +24997,8 @@ "guid": "2c6d356a-1784-475b-a42c-ec187dc8c925", "link": "https://learn.microsoft.com/azure/azure-sql/database/network-access-controls-overview", "services": [ - "PrivateLink", - "SQL" + "SQL", + "PrivateLink" ], "severity": "High", "subcategory": "Connectivity", @@ -21460,9 +25012,9 @@ "guid": "557b3ce5-bada-4296-8d52-a2d447bc1718", "link": "https://learn.microsoft.com/azure/azure-sql/database/connectivity-architecture", "services": [ - "PrivateLink", "SQL", - "AzurePolicy" + "AzurePolicy", + "PrivateLink" ], "severity": "Low", "subcategory": "Connectivity", @@ -21522,10 +25074,10 @@ "guid": "246cd832-f550-4af0-9c74-ca9baeeb8860", "link": "https://learn.microsoft.com/azure/azure-sql/database/private-endpoint-overview?view=azuresql#disable-public-access-to-your-logical-server", "services": [ - "PrivateLink", - "SQL", "Monitor", "VNet", + "PrivateLink", + "SQL", "Firewall" ], "severity": "Medium", @@ -21540,9 +25092,9 @@ "guid": "3a0808ee-ea7a-47ab-bdce-920a6a2b3881", "link": "https://learn.microsoft.com/azure/azure-sql/database/private-endpoint-overview?view=azuresql#disable-public-access-to-your-logical-server", "services": [ - "PrivateLink", "SQL", - "VNet" + "VNet", + "PrivateLink" ], "severity": "High", "subcategory": "Private Access", @@ -21556,9 +25108,9 @@ "guid": "8600527e-e8c4-4424-90ef-1f0dca0224f2", "link": "https://learn.microsoft.com/azure/private-link/private-endpoint-overview#network-security-of-private-endpoints", "services": [ - "PrivateLink", "SQL", - "VNet" + "VNet", + "PrivateLink" ], "severity": "Medium", "subcategory": "Private Access", @@ -21572,8 +25124,8 @@ "guid": "18123ef4-a0a6-45e3-87fe-7f454f65d975", "link": "https://learn.microsoft.com/azure/azure-sql/managed-instance/connectivity-architecture-overview", "services": [ - "VNet", "SQL", + "VNet", "ExpressRoute" ], "severity": "Medium", @@ -21588,8 +25140,8 @@ "guid": "55187443-6852-4fbd-99c6-ce303597ca7f", "link": "https://learn.microsoft.com/azure/azure-sql/database/network-access-controls-overview?view=azuresql#ip-vs-virtual-network-firewall-rules", "services": [ - "VNet", "SQL", + "VNet", "AzurePolicy" ], "severity": "High", @@ -21634,8 +25186,8 @@ "guid": "b8435656-143e-41a8-9922-61d34edb751a", "link": "https://learn.microsoft.com/azure/azure-sql/managed-instance/public-endpoint-overview", "services": [ - "VNet", "SQL", + "VNet", "AzurePolicy" ], "severity": "High", @@ -21650,8 +25202,8 @@ "guid": "057dd298-8726-4aa6-b590-1f81d2e30421", "link": "https://learn.microsoft.com/azure/azure-sql/managed-instance/public-endpoint-overview", "services": [ - "VNet", - "SQL" + "SQL", + "VNet" ], "severity": "High", "subcategory": "Public Access", @@ -21972,8 +25524,8 @@ "link": "https://learn.microsoft.com/azure/key-vault/general/disaster-recovery-guidance", "service": "Key Vault", "services": [ - "AKV", - "ACR" + "ACR", + "AKV" ], "severity": "Medium", "subcategory": "High Availability", @@ -22001,8 +25553,8 @@ "link": "https://learn.microsoft.com/azure/key-vault/general/disaster-recovery-guidance#failover-across-regions", "service": "Key Vault", "services": [ - "AKV", - "AzurePolicy" + "AzurePolicy", + "AKV" ], "severity": "Medium", "subcategory": "High Availability", @@ -22016,11 +25568,11 @@ "link": "https://learn.microsoft.com/azure/key-vault/general/backup?tabs=azure-cli#design-considerations", "service": "Key Vault", "services": [ - "AKV", "Storage", - "Backup", + "Subscriptions", + "AKV", "ASR", - "Subscriptions" + "Backup" ], "severity": "Medium", "subcategory": "Business continuity and disaster recovery", @@ -22034,8 +25586,8 @@ "link": "https://learn.microsoft.com/azure/key-vault/general/soft-delete-overview", "service": "Key Vault", "services": [ - "AKV", - "ASR" + "ASR", + "AKV" ], "severity": "High", "subcategory": "Business continuity and disaster recovery", @@ -22049,8 +25601,8 @@ "link": "https://learn.microsoft.com/azure/key-vault/general/soft-delete-overview", "service": "Key Vault", "services": [ - "AKV", - "ASR" + "ASR", + "AKV" ], "severity": "Low", "subcategory": "Business continuity and disaster recovery", @@ -22064,9 +25616,9 @@ "link": "https://learn.microsoft.com/azure/key-vault/general/backup?tabs=azure-cli#limitations", "service": "Key Vault", "services": [ + "ASR", "AKV", - "Backup", - "ASR" + "Backup" ], "severity": "Low", "subcategory": "Business continuity and disaster recovery", @@ -22080,9 +25632,9 @@ "link": "https://learn.microsoft.com/azure/key-vault/general/backup?tabs=azure-cli#limitations", "service": "Key Vault", "services": [ + "ASR", "AKV", - "Backup", - "ASR" + "Backup" ], "severity": "Low", "subcategory": "Business continuity and disaster recovery", @@ -22096,9 +25648,9 @@ "link": "https://learn.microsoft.com/azure/key-vault/general/soft-delete-overview#purge-protection", "service": "Key Vault", "services": [ - "AKV", + "EventHubs", "ASR", - "EventHubs" + "AKV" ], "severity": "Medium", "subcategory": "Business continuity and disaster recovery", @@ -22202,8 +25754,8 @@ "link": "https://learn.microsoft.com/azure/backup/backup-azure-vms-introduction", "service": "VM", "services": [ - "Backup", - "VM" + "VM", + "Backup" ], "severity": "High", "subcategory": "Virtual Machines", @@ -22248,9 +25800,9 @@ "link": "https://learn.microsoft.com/azure/virtual-machines/managed-disks-overview#temporary-disk", "service": "VM", "services": [ - "SQL", + "VM", "Storage", - "VM" + "SQL" ], "severity": "Medium", "subcategory": "Virtual Machines", @@ -22265,8 +25817,8 @@ "link": "https://learn.microsoft.com/azure/reliability/availability-zones-overview", "service": "VM", "services": [ - "Storage", "VM", + "Storage", "ACR" ], "severity": "Medium", @@ -22297,8 +25849,8 @@ "link": "https://learn.microsoft.com/azure/virtual-machines/availability", "service": "VM", "services": [ - "ASR", - "VM" + "VM", + "ASR" ], "severity": "High", "subcategory": "Virtual Machines", @@ -22313,9 +25865,9 @@ "link": "https://learn.microsoft.com/azure/site-recovery/site-recovery-overview", "service": "VM", "services": [ - "AVS", "VM", - "ASR" + "ASR", + "AVS" ], "severity": "High", "subcategory": "Virtual Machines", @@ -22579,10 +26131,10 @@ "guid": "8df03a82-2cd4-463c-abbc-8ac299ebc92a", "link": "https://learn.microsoft.com/azure/networking/disaster-recovery-dns-traffic-manager", "services": [ + "Monitor", "DNS", - "TrafficManager", "ASR", - "Monitor" + "TrafficManager" ], "severity": "Low", "subcategory": "DNS", @@ -22642,8 +26194,8 @@ "guid": "a359c373-e7dd-4616-83a3-64a907ebae48", "link": "https://learn.microsoft.com/azure/expressroute/designing-for-disaster-recovery-with-expressroute-privatepeering", "services": [ - "Backup", - "ExpressRoute" + "ExpressRoute", + "Backup" ], "severity": "Medium", "subcategory": "ExpressRoute", @@ -22657,10 +26209,10 @@ "guid": "ead53cc7-de2e-48aa-ab35-71549ab9153d", "link": "https://learn.microsoft.com/azure/expressroute/use-s2s-vpn-as-backup-for-expressroute-privatepeering", "services": [ - "VPN", - "Backup", "Cost", - "ExpressRoute" + "ExpressRoute", + "VPN", + "Backup" ], "severity": "Low", "subcategory": "ExpressRoute", @@ -22688,8 +26240,8 @@ "guid": "b2b38c88-6ba2-4c02-8499-114a5d3ce574", "link": "https://learn.microsoft.com/azure/load-balancer/load-balancer-standard-availability-zones", "services": [ - "LoadBalancer", - "VM" + "VM", + "LoadBalancer" ], "severity": "Low", "subcategory": "Load Balancers", @@ -22703,8 +26255,8 @@ "guid": "dccbd979-2a6b-4cca-8b5f-ea1ebf3dd95d", "link": "https://learn.microsoft.com/azure/load-balancer/load-balancer-custom-probe-overview#design-guidance", "services": [ - "LoadBalancer", - "Monitor" + "Monitor", + "LoadBalancer" ], "severity": "Low", "subcategory": "Load Balancers", @@ -22733,8 +26285,8 @@ "guid": "927139b8-2110-42db-b6ea-f11e6f843e53", "link": "https://learn.microsoft.com/azure/vpn-gateway/vpn-gateway-highlyavailable", "services": [ - "VPN", - "ACR" + "ACR", + "VPN" ], "severity": "Medium", "subcategory": "VPN Gateways", @@ -22756,6344 +26308,6212 @@ "waf": "Reliability" }, { - "arm-service": "Microsoft.Devices/provisioningServices", - "checklist": "WAF checklist", - "guid": "cb26b2ba-a9db-45d1-8260-d9c6ec1447d9", - "link": "https://learn.microsoft.com/en-us/azure/logic-apps/single-tenant-overview-compare", - "service": "IoT Hub DPS", - "services": [ - "WAF" - ], - "severity": "High", - "text": "Select the right Logic App hosting plan based on your business & SLO requirements", - "waf": "Reliability" - }, - { - "arm-service": "Microsoft.Devices/provisioningServices", - "checklist": "WAF checklist", - "guid": "f6dd7977-1123-4f39-b488-f91415a8430a", - "link": "https://learn.microsoft.com/en-us/azure/logic-apps/set-up-zone-redundancy-availability-zones?tabs=standard#next-steps", - "service": "IoT Hub DPS", - "services": [ - "WAF" - ], - "severity": "High", - "text": "Protect logic apps from region failures with zone redundancy and availability zones", - "waf": "Reliability" - }, - { - "arm-service": "Microsoft.Devices/provisioningServices", - "checklist": "WAF checklist", - "guid": "8aed4fbf-0830-4883-899d-222a154af478", - "link": "https://learn.microsoft.com/en-us/azure/logic-apps/business-continuity-disaster-recovery-guidance?toc=%2Fazure%2Freliability%2Ftoc.json&bc=%2Fazure%2Freliability%2Fbreadcrumb%2Ftoc.json", - "service": "IoT Hub DPS", - "services": [ - "WAF" - ], - "severity": "High", - "text": "Consider a Cross-Region DR strategy for critical workloads", - "waf": "Reliability" - }, - { - "arm-service": "Microsoft.Devices/provisioningServices", - "checklist": "WAF checklist", - "guid": "da0f033e-d180-4f36-9aa4-c468dba14203", - "link": "https://learn.microsoft.com/en-us/azure/app-service/environment/intro", - "service": "IoT Hub DPS", - "services": [ - "AppSvc", - "WAF" - ], - "severity": "High", - "text": "If deploying to an Isolated environment, use or migrate to App Service Environment (ASE) v3", - "waf": "Reliability" - }, - { - "arm-service": "Microsoft.Devices/provisioningServices", + "arm-service": "Microsoft.ApiManagement/service", "checklist": "WAF checklist", - "guid": "62711604-c9d1-4b0a-bdb7-5fda54a4f6c1", - "link": "https://learn.microsoft.com/en-us/training/modules/deploy-azure-functions/", - "service": "IoT Hub DPS", + "guid": "d7941d4a-7b6f-458f-8714-2f8f8c059ad4", + "link": "https://learn.microsoft.com/azure/api-management/api-management-error-handling-policies", + "service": "APIM", "services": [ - "WAF" + "WAF", + "AzurePolicy" ], "severity": "Medium", - "text": "Leverage Azure DevOps or GitHub to streamline CI/CD and safeguard your Logic App code", + "text": "Implement an error handling policy at the global level", "waf": "Operations" }, { - "arm-service": "Microsoft.Devices/deviceUpdateServices", - "checklist": "WAF checklist", - "guid": "0e03f5ee-4648-423c-bb86-7239480f9171", - "link": "https://learn.microsoft.com/en-us/azure/iot-dps/iot-dps-ha-dr#high-availability", - "service": "Device Update for IoT Hub", - "services": [ - "WAF" - ], - "severity": "High", - "text": "Leverage Availability Zones if regionally applicable (this is automatically enabled).", - "waf": "Reliability" - }, - { - "arm-service": "Microsoft.Devices/deviceUpdateServices", - "checklist": "WAF checklist", - "guid": "c0c273bd-00ad-419a-9f2f-fc72fb181e55", - "link": "https://learn.microsoft.com/en-us/azure/iot-dps/iot-dps-ha-dr#high-availability", - "service": "Device Update for IoT Hub", - "services": [ - "WAF" - ], - "severity": "High", - "text": "Be aware of Microsoft-initiated failovers. These are exercised by Microsoft in rare situations to fail over all the DPS instances from an affected region to the corresponding geo-paired region.", - "waf": "Reliability" - }, - { - "arm-service": "Microsoft.Devices/deviceUpdateServices", - "checklist": "WAF checklist", - "guid": "3af8abe6-07eb-4287-b393-6c4abe3702eb", - "link": "https://learn.microsoft.com/en-us/azure/logic-apps/business-continuity-disaster-recovery-guidance?toc=%2Fazure%2Freliability%2Ftoc.json&bc=%2Fazure%2Freliability%2Fbreadcrumb%2Ftoc.json", - "service": "Device Update for IoT Hub", - "services": [ - "WAF" - ], - "severity": "High", - "text": "Consider a Cross-Region DR strategy for critical workloads", - "waf": "Reliability" - }, - { - "arm-service": "Microsoft.Devices/deviceUpdateServices", - "checklist": "WAF checklist", - "guid": "bd91245c-fe32-4e98-a085-794a40f4bfe1", - "link": "https://learn.microsoft.com/en-us/azure/app-service/environment/intro", - "service": "Device Update for IoT Hub", - "services": [ - "AppSvc", - "WAF" - ], - "severity": "High", - "text": "If deploying to an Isolated environment, use or migrate to App Service Environment (ASE) v3", - "waf": "Reliability" - }, - { - "arm-service": "Microsoft.Web/sites", - "checklist": "WAF checklist", - "guid": "3b7a56de-5020-4642-b3cb-c976e80b6d6d", - "link": "https://learn.microsoft.com/azure/logic-apps/single-tenant-overview-compare", - "service": "Logic Apps", - "services": [ - "WAF" - ], - "severity": "High", - "text": "Select the right Logic App hosting plan based on your business & SLO requirements", - "waf": "Reliability" - }, - { - "arm-service": "Microsoft.Web/sites", - "checklist": "WAF checklist", - "guid": "3d7008bd-6bc1-4b03-8aa8-ec2a3b55786a", - "link": "https://learn.microsoft.com/azure/logic-apps/set-up-zone-redundancy-availability-zones?tabs=standard#next-steps", - "service": "Logic Apps", - "services": [ - "WAF" - ], - "severity": "High", - "text": "Protect logic apps from region failures with zone redundancy and availability zones", - "waf": "Reliability" - }, - { - "arm-service": "Microsoft.Web/sites", - "checklist": "WAF checklist", - "guid": "1cda768f-a206-445d-8234-56f6a6e7286e", - "link": "https://learn.microsoft.com/azure/logic-apps/business-continuity-disaster-recovery-guidance?toc=%2Fazure%2Freliability%2Ftoc.json&bc=%2Fazure%2Freliability%2Fbreadcrumb%2Ftoc.json", - "service": "Logic Apps", - "services": [ - "WAF" - ], - "severity": "High", - "text": "Consider a Cross-Region DR strategy for critical workloads", - "waf": "Reliability" - }, - { - "arm-service": "Microsoft.Web/sites", - "checklist": "WAF checklist", - "guid": "82118ec5-ed6f-4c68-9471-eb0da98a1b34", - "link": "https://learn.microsoft.com/azure/app-service/environment/intro", - "service": "Logic Apps", - "services": [ - "AppSvc", - "WAF" - ], - "severity": "High", - "text": "If deploying to an Isolated environment, use or migrate to App Service Environment (ASE) v3", - "waf": "Reliability" - }, - { - "arm-service": "Microsoft.Web/sites", + "arm-service": "Microsoft.ApiManagement/service", "checklist": "WAF checklist", - "guid": "74275fa5-9e08-4c7e-b096-13b538fe1501", - "link": "https://learn.microsoft.com/training/modules/deploy-azure-functions/", - "service": "Logic Apps", + "guid": "0b0c0765-ff37-4369-90bd-3eb23ce71b08", + "link": "https://learn.microsoft.com/azure/api-management/set-edit-policies?tabs=form#use-base-element-to-set-policy-evaluation-order", + "service": "APIM", "services": [ - "WAF" + "WAF", + "AzurePolicy" ], "severity": "Medium", - "text": "Leverage Azure DevOps or GitHub to streamline CI/CD and safeguard your Logic App code", + "text": "Ensure all APIs policies include a element.", "waf": "Operations" }, { - "arm-service": "Microsoft.BotService/botServices", - "checklist": "WAF checklist", - "guid": "6ad48408-ee72-4734-a476-ba28fdcf590c", - "link": "https://learn.microsoft.com/en-us/azure/reliability/reliability-bot", - "service": "Bot service", - "services": [ - "WAF" - ], - "severity": "Medium", - "text": "Follow reliability support recommendations in Azure Bot Service", - "waf": "Reliability" - }, - { - "arm-service": "Microsoft.BotService/botServices", - "checklist": "WAF checklist", - "guid": "e65de8e1-3f9c-4cbd-9682-66abca264f9a", - "link": "https://learn.microsoft.com/en-us/azure/bot-service/bot-builder-concept-regionalization", - "service": "Bot service", - "services": [ - "WAF" - ], - "severity": "Medium", - "text": "Deploying bots with local data residency and regional compliance", - "waf": "Reliability" - }, - { - "arm-service": "Microsoft.BotService/botServices", - "checklist": "WAF checklist", - "guid": "19bfe9d5-5d04-4c3c-9919-ca1b2d1215ae", - "link": "https://learn.microsoft.com/en-us/azure/reliability/reliability-bot#cross-region-disaster-recovery-in-multi-region-geography", - "service": "Bot service", - "services": [ - "WAF" - ], - "severity": "Medium", - "text": "Azure Bot Service runs in active-active mode for both global and regional services. When an outage occurs, you don't need to detect errors or manage the service. Azure Bot Service automatically performs auto failover and auto recovery in a multi-region geographical architecture. For the EU bot regional service, Azure Bot Service provides two full regions inside Europe with active/active replication to ensure redundancy. For the global bot service, all available regions/geographies can be served as the global footprint.", - "waf": "Reliability" - }, - { - "arm-service": "microsoft.documentdb/databaseAccounts", - "checklist": "WAF checklist", - "guid": "43e52f47-22d9-428c-8b1c-d521e54a29a9", - "link": "https://github.com/Azure/fta-resiliencyplaybooks/blob/main/pass-foundations-playbooks-CosmosDB_v1.docx", - "service": "CosmosDB", - "services": [ - "WAF" - ], - "severity": "Medium", - "text": "FTA Resiliency Playbook", - "waf": "Reliability" - }, - { - "arm-service": "microsoft.documentdb/databaseAccounts", - "checklist": "WAF checklist", - "guid": "de39ac0e-7c28-4dc9-9565-7202bff4564b", - "link": "https://learn.microsoft.com/azure/cosmos-db/high-availability#slas", - "service": "CosmosDB", - "services": [ - "WAF" - ], - "severity": "High", - "text": "Leverage Availablity Zones where regionally applicable and ofcourse if the service offers it", - "waf": "Reliability" - }, - { - "arm-service": "microsoft.documentdb/databaseAccounts", - "checklist": "WAF checklist", - "guid": "0d934a34-8b26-43e7-bd60-513a3649906e", - "link": "https://learn.microsoft.com/azure/cosmos-db/high-availability#replica-outages", - "service": "CosmosDB", - "services": [ - "WAF" - ], - "severity": "Medium", - "text": "Run multiple replicas of the database (>1 ) in Prod", - "waf": "Reliability" - }, - { - "arm-service": "microsoft.documentdb/databaseAccounts", + "arm-service": "Microsoft.ApiManagement/service", "checklist": "WAF checklist", - "description": "Multi-region writes capability allows you to take advantage of the provisioned throughput for your databases and containers across the globe", - "guid": "bad38ead-53cc-47de-8d8a-aab3571449ab", - "link": "https://learn.microsoft.com/azure/cosmos-db/high-availability#multiple-write-regions", - "service": "CosmosDB", + "guid": "a5c45b03-93b6-42fe-b16b-8fccb6a79902", + "link": "https://learn.microsoft.com/azure/api-management/policy-fragments", + "service": "APIM", "services": [ "ACR", - "WAF" + "WAF", + "AzurePolicy" ], "severity": "Medium", - "text": "Leverage Multi-Region Writes", - "waf": "Reliability" + "text": "Use Policy Fragments to avoid repeating same policies definitions across multiple APIs", + "waf": "Operations" }, { - "arm-service": "microsoft.documentdb/databaseAccounts", + "arm-service": "Microsoft.ApiManagement/service", "checklist": "WAF checklist", - "description": "Span Cosmos account across two or more regions with multi-region writes", - "guid": "8153d89f-89dc-47b3-9be2-b1a27f7b9e91", - "link": "https://learn.microsoft.com/azure/cosmos-db/high-availability#slas", - "service": "CosmosDB", + "guid": "c3818a95-6ff3-4474-88dc-e809b46dad6a", + "link": "https://learn.microsoft.com/azure/api-management/monetization-support", + "service": "APIM", "services": [ - "ACR", "WAF" ], "severity": "Medium", - "text": "Distribute your data globally", - "waf": "Reliability" + "text": "If you are planning to monetize your APIs, review the 'monetization support' article for best practices", + "waf": "Operations" }, { - "arm-service": "microsoft.documentdb/databaseAccounts", + "arm-service": "Microsoft.ApiManagement/service", "checklist": "WAF checklist", - "description": "Choose from various consistency levels such as Eventual, Consistent Prefix, Session, Bounded Staleness and strong", - "guid": "9f8ea848-25ec-4140-bc32-2758e6ee9ac0", - "link": "https://learn.microsoft.com/azure/cosmos-db/consistency-levels", - "service": "CosmosDB", + "guid": "a7d0840a-c8c4-4e83-adec-5ca578eb4049", + "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-use-azure-monitor#resource-logs", + "service": "APIM", "services": [ + "Monitor", "WAF" ], "severity": "High", - "text": "Choose from several well-defined consistency models", - "waf": "Reliability" - }, - { - "arm-service": "microsoft.documentdb/databaseAccounts", - "checklist": "WAF checklist", - "description": "Maintain business continuity during regional outages. Azure Cosmos DB supports service-managed failover during a regional outage. During a regional outage, Azure Cosmos DB continues to maintain its latency, availability, consistency, and throughput SLAs. To help make sure that your entire application is highly available, Azure Cosmos DB offers a manual failover API to simulate a regional outage. By using this API, you can carry out regular business continuity drills.", - "guid": "a47e4d1e-bb79-43f9-bf87-69e1032b72fe", - "link": "https://learn.microsoft.com/azure/cosmos-db/how-to-manage-database-account#automatic-failover", - "service": "CosmosDB", - "services": [ - "CosmosDB", - "WAF" - ], - "severity": "Medium", - "text": "Enable Service managed failover", - "waf": "Reliability" - }, - { - "arm-service": "microsoft.documentdb/databaseAccounts", - "checklist": "WAF checklist", - "description": "Azure Cosmos DB automatically takes backups of your data at regular intervals. The automatic backups are taken without affecting the performance or availability of the database operations. All the backups are stored separately in a storage service.", - "guid": "3499c9c1-133d-42f7-a4b1-a5bd06ff1a90", - "link": "https://learn.microsoft.com/azure/cosmos-db/online-backup-and-restore", - "service": "CosmosDB", - "services": [ - "Backup", - "Storage", - "CosmosDB", - "WAF" - ], - "severity": "Medium", - "text": "Enable Automatic Backups", - "training": "https://learn.microsoft.com/learn/modules/explore-basic-services-identity-types/", - "waf": "Reliability" - }, - { - "arm-service": "microsoft.documentdb/databaseAccounts", - "checklist": "WAF checklist", - "description": "This mode is the default backup mode for all existing accounts. In this mode, backup is taken at a periodic interval and the data is restored by creating a request with the support team. In this mode, you configure a backup interval and retention for your account. The maximum retention period extends to a month. The minimum backup interval can be one hour.", - "guid": "a6eb33f6-005c-4d92-9286-7655672d6121", - "link": "https://learn.microsoft.com/azure/cosmos-db/periodic-backup-restore-introduction", - "service": "CosmosDB", - "services": [ - "Backup", - "WAF" - ], - "severity": "Medium", - "text": "Perform Periodic Backups", - "training": "https://learn.microsoft.com/learn/paths/manage-identity-and-access/", - "waf": "Reliability" + "text": "Enable Diagnostics Settings to export logs to Azure Monitor", + "waf": "Operations" }, { - "arm-service": "microsoft.documentdb/databaseAccounts", + "arm-service": "Microsoft.ApiManagement/service", "checklist": "WAF checklist", - "description": "Continous 7 day retention and 30 day retention backups. Azure Cosmos DB performs data backup in the background without consuming any extra provisioned throughput (RUs) or affecting the performance and availability of your database. Continuous backups are taken in every region where the account exists.", - "guid": "d43918a8-cd28-49be-b6b1-7cb8245461e1", - "link": "https://learn.microsoft.com/azure/cosmos-db/continuous-backup-restore-introduction", - "service": "CosmosDB", + "guid": "8691fa38-45ed-4299-a247-fecd98d35deb", + "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-app-insights", + "service": "APIM", "services": [ - "Backup", - "CosmosDB", "WAF" ], "severity": "Medium", - "text": "Continous Backup with point-in-time restore in Azure Cosmos DB", - "training": "https://learn.microsoft.com/learn/modules/create-custom-azure-roles-with-rbac/", - "waf": "Reliability" + "text": "Enable Application Insights for more detailed telemetry", + "waf": "Operations" }, { - "arm-service": "Microsoft.Search/searchServices", + "arm-service": "Microsoft.ApiManagement/service", "checklist": "WAF checklist", - "guid": "41faa1ed-b7f0-447d-8cba-4a4905e5bb83", - "link": "https://learn.microsoft.com/azure/search/search-reliability#high-availability", - "service": "Cognitive Search", + "guid": "55fd27bb-76ac-4a91-bc37-049e885be6b7", + "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-use-azure-monitor", + "service": "APIM", "services": [ + "Monitor", "WAF" ], "severity": "High", - "text": "Enable 2 replicas to have 99.9% availability for read operations", - "waf": "Reliability" + "text": "Configure alerts on the most critical metrics", + "waf": "Operations" }, { - "arm-service": "Microsoft.Search/searchServices", + "arm-service": "Microsoft.ApiManagement/service", "checklist": "WAF checklist", - "guid": "7d956fd9-788a-4845-9b9f-c0340972d810", - "link": "https://learn.microsoft.com/azure/search/search-reliability#high-availability", - "service": "Cognitive Search", + "guid": "39460bdb-156f-4dc2-a87f-1e8c11ab0998", + "link": "https://learn.microsoft.com/security/benchmark/azure/baselines/api-management-security-baseline?toc=%2Fazure%2Fapi-management%2F&bc=%2Fazure%2Fapi-management%2Fbreadcrumb%2Ftoc.json#certificate-management-in-azure-key-vault", + "service": "APIM", "services": [ - "WAF" + "WAF", + "AKV" ], - "severity": "Medium", - "text": "Enable 3 replicas to have 99.9% availability for read/write operations", - "waf": "Reliability" + "severity": "High", + "text": "Ensure that custom SSL certificates are stored an Azure Key Vault so they can be securely accessed and updated", + "waf": "Security" }, { - "arm-service": "Microsoft.Search/searchServices", + "arm-service": "Microsoft.ApiManagement/service", "checklist": "WAF checklist", - "guid": "44dc5f2b-a032-4d03-aae8-90c3f2c0a4c3", - "link": "https://learn.microsoft.com/azure/search/search-reliability#availability-zone-support", - "service": "Cognitive Search", + "guid": "e9217997-5f6c-479d-8576-8f2adf706ec8", + "link": "https://learn.microsoft.com/security/benchmark/azure/baselines/api-management-security-baseline?toc=%2Fazure%2Fapi-management%2F&bc=%2Fazure%2Fapi-management%2Fbreadcrumb%2Ftoc.json#azure-ad-authentication-required-for-data-plane-access", + "service": "APIM", "services": [ + "Entra", "WAF" ], "severity": "High", - "text": "Leverage Availability Zones by enabling read and/or write replicas", - "waf": "Reliability" + "text": "Protect incoming requests to APIs (data plane) with Azure AD", + "waf": "Security" }, { - "arm-service": "Microsoft.Search/searchServices", + "arm-service": "Microsoft.ApiManagement/service", "checklist": "WAF checklist", - "guid": "cd0730f0-0ff1-4b77-9a2b-2a1f7dd5e291", - "link": "https://learn.microsoft.com/azure/search/search-reliability#multiple-services-in-separate-geographic-regions", - "service": "Cognitive Search", + "guid": "5e5f64ba-c90e-480e-8888-398d96cf0bfb", + "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-aad", + "service": "APIM", "services": [ - "ACR", + "Entra", "WAF" ], "severity": "Medium", - "text": "For regional redudancy, Manually create services in 2 or more regions for Search as it doesn't provide an automated method of replicating search indexes across geographic regions", - "waf": "Reliability" + "text": "Use Microsoft Entra ID to authenticate users in the Developer Portal", + "waf": "Security" }, { - "arm-service": "Microsoft.Search/searchServices", + "arm-service": "Microsoft.ApiManagement/service", "checklist": "WAF checklist", - "guid": "3c964882-aec9-4d44-9f68-4b5f2efbbdb6", - "link": "https://learn.microsoft.com/azure/search/search-reliability#synchronize-data-across-multiple-services", - "service": "Cognitive Search", + "guid": "f8e574ce-280f-49c8-b2ef-68279b081cf3", + "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-create-groups", + "service": "APIM", "services": [ - "ACR", "WAF" ], "severity": "Medium", - "text": "To synchronize data across multiple services either Use indexers for updating content on multiple services or Use REST APIs for pushing content updates on multiple services", - "waf": "Reliability" + "text": "Create appropriate groups to control the visibility of the products", + "waf": "Security" }, { - "arm-service": "Microsoft.Search/searchServices", + "arm-service": "Microsoft.ApiManagement/service", "checklist": "WAF checklist", - "guid": "85ee93c9-f53c-4803-be51-e6e4aa37ff4e", - "link": "https://learn.microsoft.com/azure/search/search-reliability#use-azure-traffic-manager-to-coordinate-requests", - "service": "Cognitive Search", + "guid": "06862505-2d9a-4874-9491-2837b00a3475", + "link": "https://learn.microsoft.com/azure/api-management/backends", + "service": "APIM", "services": [ - "TrafficManager", "WAF" ], "severity": "Medium", - "text": "Use Azure Traffic Manager to coordinate requests", - "waf": "Reliability" + "text": "Use Backends feature to eliminate redundant API backend configurations", + "waf": "Operations" }, { - "arm-service": "Microsoft.Search/searchServices", + "arm-service": "Microsoft.ApiManagement/service", "checklist": "WAF checklist", - "guid": "7be10278-57c1-4a61-8ee3-895aebfec5aa", - "link": "https://learn.microsoft.com/azure/search/search-reliability#back-up-and-restore-alternatives", - "service": "Cognitive Search", + "guid": "03b125d5-b69b-4739-b7fd-84b86da4933e", + "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-properties?tabs=azure-portal", + "service": "APIM", "services": [ - "Storage", - "Backup", - "WAF" + "WAF", + "AzurePolicy" ], - "severity": "High", - "text": "Backup and Restore an Azure Cognitive Search Index. Use this sample code to back up index definition and snapshot to a series of Json files", - "waf": "Reliability" + "severity": "Medium", + "text": "Use Named Values to store common values that can be used in policies", + "waf": "Operations" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", + "arm-service": "Microsoft.ApiManagement/service", "checklist": "WAF checklist", - "guid": "21c30d25-ffb7-4f6a-b9ea-b3fec328f787", - "link": "https://github.com/Azure/fta-resiliencyplaybooks/blob/main/paas-foundations-playbooks-cog_svcs_v1.docx", - "service": "Cognitive Services", + "guid": "beae759e-4ddb-4326-bf26-47f87d3454b6", + "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-deploy-multi-region", + "service": "APIM", "services": [ + "ACR", "WAF" ], "severity": "Medium", - "text": "Leverage FTA HandBook for Cognitive Services", + "text": "For DR, leverage the premium tier with deployments scaled across two or more regions for 99.99% SLA", "waf": "Reliability" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", + "arm-service": "Microsoft.ApiManagement/service", "checklist": "WAF checklist", - "guid": "78c34698-16b2-4763-aefe-1b9b599de0d5", - "link": "https://learn.microsoft.com/azure/ai-services/openai/concepts/advanced-prompt-engineering?pivots=programming-language-chat-completions", - "service": "Cognitive Services", + "guid": "9c8d1664-dd9a-49d4-bd83-950af0af4044", + "link": "https://learn.microsoft.com/azure/api-management/high-availability", + "service": "APIM", "services": [ - "Backup", "WAF" ], "severity": "Medium", - "text": "Backup Your Prompts", + "text": "Deploy at least one unit in two or more availability zones for an increased SLA of 99.99%", "waf": "Reliability" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", + "arm-service": "Microsoft.ApiManagement/service", "checklist": "WAF checklist", - "guid": "750ab2ab-039d-4a6d-95d7-c892adb107d5", - "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/business-continuity-disaster-recovery", - "service": "Cognitive Services", + "guid": "8d2db6e8-85c6-4118-a52c-ae76a4f27934", + "link": "https://learn.microsoft.com/security/benchmark/azure/baselines/api-management-security-baseline?toc=%2Fazure%2Fapi-management%2F&bc=%2Fazure%2Fapi-management%2Fbreadcrumb%2Ftoc.json#service-native-backup-capability", + "service": "APIM", "services": [ - "ASR", - "WAF" + "WAF", + "Backup" ], "severity": "High", - "text": "Business Continuity and Disaster Recovery (BCDR) considerations with Azure OpenAI Service", + "text": "Ensure there is an automated backup routine", "waf": "Reliability" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", + "arm-service": "Microsoft.ApiManagement/service", "checklist": "WAF checklist", - "guid": "325af625-ca44-4e46-a5e2-223ace8bb123", - "link": "https://github.com/abacaj/chatgpt-backup#backup-your-chatgpt-conversations", - "service": "Cognitive Services", + "guid": "43e60b94-7bca-43a2-aadf-efb04d63a485", + "link": "https://learn.microsoft.com/azure/api-management/retry-policy", + "service": "APIM", "services": [ - "Backup", - "WAF" + "WAF", + "AzurePolicy" ], "severity": "Medium", - "text": "Backup Your ChatGPT conversations", + "text": "Use Policies to add a fail-over backend URL and caching to reduce failing calls.", "waf": "Reliability" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", + "arm-service": "Microsoft.ApiManagement/service", "checklist": "WAF checklist", - "guid": "07ca5f17-f154-4e3a-a369-2829e7e31618", - "link": "https://learn.microsoft.com/azure/ai-services/speech-service/how-to-custom-speech-continuous-integration-continuous-deployment", - "service": "Cognitive Services", + "guid": "8210699f-8d43-45c2-8f19-57e54134bd8f", + "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-log-event-hubs", + "service": "APIM", "services": [ - "WAF" + "EventHubs", + "WAF", + "AzurePolicy" ], - "severity": "Medium", - "text": "CI/CD for custom speech", - "waf": "Reliability" + "severity": "Low", + "text": "If you need to log at high performance levels, consider Event Hubs policy", + "waf": "Operations" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", + "arm-service": "Microsoft.ApiManagement/service", "checklist": "WAF checklist", - "guid": "3687a046-7a1f-4893-9bda-43324f248116", - "link": "https://learn.microsoft.com/azure/ai-services/qnamaker/tutorials/export-knowledge-base", - "service": "Cognitive Services", + "guid": "121bfc39-fa7b-4096-b93b-ab56c1bc0bed", + "link": "https://learn.microsoft.com/azure/api-management/api-management-sample-flexible-throttling", + "service": "APIM", "services": [ - "WAF" + "WAF", + "AzurePolicy" ], - "severity": "Low", - "text": "Move a knowledge base using export-import", - "waf": "Reliability" + "severity": "Medium", + "text": "Apply throttling policies to control the number of requests per second", + "training": "https://learn.microsoft.com/training/modules/protect-apis-on-api-management/", + "waf": "Performance" }, { - "arm-service": "Microsoft.App/containerApps", + "arm-service": "Microsoft.ApiManagement/service", "checklist": "WAF checklist", - "guid": "af416482-663c-4ed6-b195-b44c7068e09c", - "link": "https://learn.microsoft.com/azure/reliability/reliability-azure-container-apps?tabs=azure-cli#availability-zone-support", - "service": "Container Apps", + "guid": "bb5f356b-3daf-47a2-a9ee-867a8100bbd5", + "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-autoscale", + "service": "APIM", "services": [ "WAF" ], - "severity": "High", - "text": "Leverage Availability Zones if regionally applicable", - "waf": "Reliability" + "severity": "Medium", + "text": "Configure autoscaling to scale out the number of instances when the load increases", + "waf": "Performance" }, { - "arm-service": "Microsoft.App/containerApps", + "arm-service": "Microsoft.ApiManagement/service", "checklist": "WAF checklist", - "guid": "95bc80ec-6499-4d14-a7d2-7d296b1d8abc", - "link": "https://learn.microsoft.com/azure/reliability/reliability-azure-container-apps?tabs=azure-cli#set-up-zone-redundancy-in-your-container-apps-environment", - "service": "Container Apps", + "guid": "84b94abb-59b6-4b9d-8587-3413669468e8", + "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-provision-self-hosted-gateway", + "service": "APIM", "services": [ "WAF" ], - "severity": "High", - "text": "Use more than one replica and enable Zone Redundancy.", - "waf": "Reliability" + "severity": "Medium", + "text": "Deploy self-hosted gateways where Azure doesn't have a region close to the backend APIs.", + "waf": "Performance" }, { - "arm-service": "Microsoft.App/containerApps", + "arm-service": "Microsoft.ApiManagement/service", "checklist": "WAF checklist", - "guid": "ccaa4fc2-fdbc-4432-8bb7-f7e6469e4dc3", - "link": "https://learn.microsoft.com/azure/reliability/reliability-azure-container-apps?tabs=azure-cli#cross-region-disaster-recovery-and-business-continuity", - "service": "Container Apps", + "guid": "1fe8db45-a017-4888-8c4d-4422583cfae0", + "link": "https://learn.microsoft.com/azure/api-management/upgrade-and-scale#upgrade-and-scale", + "service": "APIM", "services": [ "WAF" ], - "severity": "High", - "text": "For cross-region DR, deploy container apps in multiple regions and follow active/active or active/passive application guidance.", + "severity": "Medium", + "text": "Use the premium tier for production workloads.", "waf": "Reliability" }, { - "arm-service": "Microsoft.App/containerApps", + "arm-service": "Microsoft.ApiManagement/service", "checklist": "WAF checklist", - "guid": "2ffada86-c031-4933-bf7d-0c45bc4e5919", - "link": "https://learn.microsoft.com/azure/reliability/reliability-azure-container-apps?tabs=azure-cli#cross-region-disaster-recovery-and-business-continuity", - "service": "Container Apps", + "guid": "1b8d68a4-66cd-44d5-ba94-3ee94440e8d6", + "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-deploy-multi-region#-route-api-calls-to-regional-backend-services", + "service": "APIM", "services": [ - "TrafficManager", - "FrontDoor", - "WAF" + "WAF", + "AzurePolicy" ], - "severity": "High", - "text": "Use Front Door or Traffic Manager to route traffic to the closest region", + "severity": "Medium", + "text": "In multi-region model, use Policies to route the requests to regional backends based on availability or latency.", "waf": "Reliability" }, { - "arm-service": "Microsoft.Web/sites", + "arm-service": "Microsoft.ApiManagement/service", "checklist": "WAF checklist", - "guid": "4238f409-2ea0-43be-a06b-2a993c98aa7b", - "link": "https://learn.microsoft.com/en-us/azure/azure-functions/functions-scale#overview-of-plans", - "service": "Azure Functions", + "guid": "46f07d33-ef9a-44e8-8f98-67c097c5d8cd", + "link": "https://learn.microsoft.com/azure/azure-resource-manager/management/azure-subscription-service-limits#api-management-limits", + "service": "APIM", "services": [ - "WAF" + "Entra", + "WAF", + "APIM" ], "severity": "High", - "text": "Select the right Function hosting plan based on your business & SLO requirements", + "text": "Be aware of APIM's limits", "waf": "Reliability" }, { - "arm-service": "Microsoft.Web/sites", + "arm-service": "Microsoft.ApiManagement/service", "checklist": "WAF checklist", - "guid": "a9808100-d640-4f77-ac56-1ec0600f6752", - "link": "https://learn.microsoft.com/en-us/azure/azure-functions/functions-scale#overview-of-plans", - "service": "Azure Functions", + "guid": "10f58602-f0f9-4d77-972a-956f6e0f2600", + "link": "https://learn.microsoft.com/en-us/azure/api-management/self-hosted-gateway-overview", + "service": "APIM", "services": [ "WAF" ], "severity": "High", - "text": "Leverage Availability Zones where regionally applicable (not available for Consumption tier)", + "text": "Ensure that the self-hosted gateway deployments are resilient.", "waf": "Reliability" }, { - "arm-service": "Microsoft.Web/sites", + "arm-service": "Microsoft.ApiManagement/service", "checklist": "WAF checklist", - "guid": "5969d03e-eacf-4042-b127-73c55e3575fa", - "link": "https://learn.microsoft.com/en-us/azure/reliability/reliability-functions?tabs=azure-portal#cross-region-disaster-recovery-and-business-continuity", - "service": "Azure Functions", + "guid": "7519e385-a88b-4d34-966b-6269d686e890", + "link": "https://learn.microsoft.com/azure/api-management/front-door-api-management", + "service": "APIM", "services": [ - "WAF" + "Entra", + "FrontDoor", + "WAF", + "APIM" ], "severity": "Medium", - "text": "Consider a Cross-Region DR strategy for critical workloads", - "waf": "Reliability" + "text": "Use Azure Front Door in front of APIM for multi-region deployment", + "waf": "Performance" }, { - "arm-service": "Microsoft.Web/sites", + "arm-service": "Microsoft.ApiManagement/service", "checklist": "WAF checklist", - "guid": "47a0aae0-d8a0-43b1-9791-e934dee3754c", - "link": "https://learn.microsoft.com/en-us/azure/app-service/environment/intro", - "service": "Azure Functions", + "guid": "cd45c90e-7690-4753-930b-bf290c69c074", + "link": "https://learn.microsoft.com/security/benchmark/azure/baselines/api-management-security-baseline?toc=%2Fazure%2Fapi-management%2F&bc=%2Fazure%2Fapi-management%2Fbreadcrumb%2Ftoc.json#virtual-network-integration", + "service": "APIM", "services": [ - "AppSvc", + "VNet", "WAF" ], - "severity": "High", - "text": "If deploying to an Isolated environment, use or migrate to App Service Environment (ASE) v3", - "waf": "Reliability" + "severity": "Medium", + "text": "Deploy the service within a Virtual Network (VNet)", + "waf": "Security" }, { - "arm-service": "Microsoft.Web/sites", + "arm-service": "Microsoft.ApiManagement/service", "checklist": "WAF checklist", - "guid": "17232891-f89f-4eaa-90f1-3b34bf798ed5", - "link": "https://learn.microsoft.com/en-us/azure/azure-functions/dedicated-plan#always-on", - "service": "Azure Functions", + "guid": "02661582-b3d1-48d1-9d7b-c6a918a0ca33", + "link": "https://learn.microsoft.com/security/benchmark/azure/baselines/api-management-security-baseline?toc=%2Fazure%2Fapi-management%2F&bc=%2Fazure%2Fapi-management%2Fbreadcrumb%2Ftoc.json#network-security-group-support", + "service": "APIM", "services": [ - "AppSvc", - "WAF" + "Monitor", + "Entra", + "VNet", + "WAF", + "APIM" ], - "severity": "High", - "text": "Ensure 'Always On' is enabled for all Function Apps running on App Service Plan", - "waf": "Reliability" + "severity": "Medium", + "text": "Deploy network security groups (NSG) to your subnets to restrict or monitor traffic to/from APIM.", + "waf": "Security" }, { - "arm-service": "Microsoft.Web/sites", + "arm-service": "Microsoft.ApiManagement/service", "checklist": "WAF checklist", - "guid": "40a325c2-7c0e-49e6-86d8-c273b4dc21ba", - "link": "https://learn.microsoft.com/en-us/azure/azure-functions/storage-considerations?tabs=azure-cli#shared-storage-accounts", - "service": "Azure Functions", + "guid": "67437a28-2721-4a2c-becd-caa54c8237a5", + "link": "https://learn.microsoft.com/security/benchmark/azure/baselines/api-management-security-baseline?toc=%2Fazure%2Fapi-management%2F&bc=%2Fazure%2Fapi-management%2Fbreadcrumb%2Ftoc.json#azure-private-link", + "service": "APIM", "services": [ - "Storage", - "WAF" + "Entra", + "VNet", + "WAF", + "APIM", + "PrivateLink" ], "severity": "Medium", - "text": "Pair a Function App to its own storage account. Try not to re-use storage accounts for Function Apps unless they are tightly coupled", - "waf": "Reliability" + "text": "Deploy Private Endpoints to filter incoming traffic when APIM is not deployed to a VNet.", + "waf": "Security" }, { - "arm-service": "Microsoft.Web/sites", + "arm-service": "Microsoft.ApiManagement/service", "checklist": "WAF checklist", - "guid": "bb42650c-257d-4cb0-822a-131138b8e6f0", - "link": "https://learn.microsoft.com/en-us/training/modules/deploy-azure-functions/", - "service": "Azure Functions", + "guid": "d698adbd-3288-44cb-b10a-9b572da395ae", + "link": "https://learn.microsoft.com/security/benchmark/azure/baselines/api-management-security-baseline?toc=%2Fazure%2Fapi-management%2F&bc=%2Fazure%2Fapi-management%2Fbreadcrumb%2Ftoc.json#disable-public-network-access", + "service": "APIM", "services": [ "WAF" ], - "severity": "Medium", - "text": "Leverage Azure DevOps or GitHub to streamline CI/CD and safeguard your Function App code", - "waf": "Operations" + "severity": "High", + "text": "Disable Public Network Access", + "waf": "Security" }, { + "arm-service": "Microsoft.ApiManagement/service", "checklist": "WAF checklist", - "guid": "4620dc87-e948-4ce8-8426-f3e6e5d7bd85", - "link": "https://learn.microsoft.com/azure/sap/center-sap-solutions/overview", - "service": "SAP", + "guid": "0674d750-0c6f-4ac0-8717-ceec04d0bdbd", + "link": "https://learn.microsoft.com/azure/api-management/automation-manage-api-management", + "service": "APIM", "services": [ - "SAP", "WAF" ], "severity": "Medium", - "text": "Azure Center for SAP solutions (ACSS) is an Azure offering that makes SAP a top-level workload on Azure. ACSS is an end-to-end solution that enables you to create and run SAP systems as a unified workload on Azure and provides a more seamless foundation for innovation. You can take advantage of the management capabilities for both new and existing Azure-based SAP systems.", - "training": "https://learn.microsoft.com/training/modules/explore-azure-center-sap-solutions/?source=recommendations", + "text": "Simplify management with PowerShell automation scripts", "waf": "Operations" }, { + "arm-service": "Microsoft.ApiManagement/service", "checklist": "WAF checklist", - "guid": "5d75e99d-624d-4afe-91d9-e17adc580790", - "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/eslz-platform-automation-and-devops", - "service": "SAP", + "guid": "c385bfcd-49fd-4786-81ba-cedbb4c57345", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/app-platform/api-management/platform-automation-and-devops#design-recommendations", + "service": "APIM", "services": [ - "SAP", - "WAF" + "Entra", + "WAF", + "APIM" ], "severity": "Medium", - "text": "Azure supports automating SAP deployments in Linux and Windows. SAP Deployment Automation Framework is an open-source orchestration tool that can deploy, install, and maintain SAP environments.", - "training": "https://github.com/Azure/sap-automation", + "text": "Configure APIM via Infrastructure-as-code. Review DevOps best practices from the Cloud Adaption Framework APIM Landing Zone Accelerator", "waf": "Operations" }, { + "arm-service": "Microsoft.ApiManagement/service", "checklist": "WAF checklist", - "guid": "d17f6f39-a377-48a2-931f-5ead3ebe33a8", - "link": "https://learn.microsoft.com/azure/well-architected/sap/design-areas/data-platform", - "service": "SAP", + "guid": "6c3a27c0-197f-426c-9ffa-86fed51d9ab6", + "link": "https://learn.microsoft.com/azure/api-management/visual-studio-code-tutorial", + "service": "APIM", "services": [ - "SAP", - "WAF" + "Entra", + "WAF", + "APIM" ], "severity": "Medium", - "text": "Perform a point-in-time recovery for your production databases at any point and in a time frame that meets your RTO; point-in-time recovery typically includes operator errors deleting data either on the DBMS layer or through SAP, incidentally", - "waf": "Reliability" + "text": "Promote usage of Visual Studio Code APIM extension for faster API development", + "waf": "Operations" }, { + "arm-service": "Microsoft.ApiManagement/service", "checklist": "WAF checklist", - "guid": "c4b8e117-930b-4dbd-ae50-7bc5faf6f91a", - "service": "SAP", + "guid": "354f1c03-8112-4965-85ad-c0074bddf231", + "link": "https://learn.microsoft.com/azure/api-management/devops-api-development-templates", + "service": "APIM", "services": [ - "Backup", "WAF" ], "severity": "Medium", - "text": "Test the backup and recovery times to verify that they meet your RTO requirements for restoring all systems simultaneously after a disaster.", - "waf": "Reliability" - }, - { - "checklist": "WAF checklist", - "guid": "b651423c-8552-42db-a545-5cb50c05527a", - "link": "https://learn.microsoft.com/azure/reliability/cross-region-replication-azure", - "service": "SAP", - "services": [ - "Backup", - "SQL", - "Storage", - "ASR", - "SAP", - "WAF" - ], - "severity": "High", - "text": "You can replicate standard storage between paired regions, but you can't use standard storage to store your databases or virtual hard disks. You can replicate backups only between paired regions that you use. For all your other data, run your replication by using native DBMS features like SQL Server Always On or SAP HANA System Replication. Use a combination of Site Recovery, rsync or robocopy, and other third-party software for the SAP application layer.", - "training": "https://learn.microsoft.com/training/paths/ensure-business-continuity-implement-disaster-recovery/", - "waf": "Reliability" + "text": "Implement DevOps and CI/CD in your workflow", + "waf": "Operations" }, { + "arm-service": "Microsoft.ApiManagement/service", "checklist": "WAF checklist", - "guid": "aa208dca-784f-46c6-9014-cc919c542dc9", - "link": "https://learn.microsoft.com/azure/sap/workloads/high-availability-zones", - "service": "SAP", + "guid": "b6439493-426a-45f3-9697-cf65baee208d", + "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-mutual-certificates-for-clients", + "service": "APIM", "services": [ - "SAP", "WAF" ], "severity": "Medium", - "text": "When using Azure Availability Zones to achieve high availability, you must consider latency between SAP application servers and database servers. For zones with high latencies, operational procedures need to be in place to ensure that SAP application servers and database servers are running in the same zone at all times.", - "training": "https://learn.microsoft.com/training/modules/implement-high-availability-for-sap-workloads-azure/?source=recommendations", - "waf": "Reliability" - }, - { - "checklist": "WAF checklist", - "guid": "ba07c007-1f90-43e9-aa4f-601346b80352", - "link": "https://learn.microsoft.com/azure/expressroute/designing-for-disaster-recovery-with-expressroute-privatepeering", - "service": "SAP", - "services": [ - "VPN", - "ASR", - "ExpressRoute", - "WAF" - ], - "severity": "High", - "text": "Set up ExpressRoute connections from on-premises to the primary and secondary Azure disaster recovery regions. Also, as an alternative to using ExpressRoute, consider setting up VPN connections from on-premises to the primary and secondary Azure disaster recovery regions.", - "training": "https://learn.microsoft.com/azure/expressroute/use-s2s-vpn-as-backup-for-expressroute-privatepeering", - "waf": "Reliability" + "text": "Secure APIs using client certificate authentication", + "waf": "Security" }, { + "arm-service": "Microsoft.ApiManagement/service", "checklist": "WAF checklist", - "guid": "d2b30195-b11d-4a8f-a672-28b2b4169a7c", - "link": "https://learn.microsoft.com/azure/key-vault/general/disaster-recovery-guidance", - "service": "SAP", + "guid": "2a67d143-1033-4c0a-8732-680896478f08", + "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-mutual-certificates", + "service": "APIM", "services": [ - "AKV", - "ACR", "WAF" ], - "severity": "Low", - "text": "Replicate key vault contents like certificates, secrets, or keys across regions so you can decrypt data in the DR region.", - "waf": "Reliability" + "severity": "Medium", + "text": "Secure backend services using client certificate authentication", + "waf": "Security" }, { + "arm-service": "Microsoft.ApiManagement/service", "checklist": "WAF checklist", - "guid": "05f1101d-250f-40e7-b2a1-b674ab50edbd", - "link": "https://learn.microsoft.com/azure/architecture/guide/sap/sap-s4hana", - "service": "SAP", + "guid": "074435f5-4a46-41ac-b521-d6114cb5d845", + "link": "https://learn.microsoft.com/azure/api-management/mitigate-owasp-api-threats", + "service": "APIM", "services": [ - "VNet", - "SAP", - "ASR", "WAF" ], "severity": "Medium", - "text": "Peer the primary and disaster recovery virtual networks. For example, for HANA System Replication, an SAP HANA DB virtual network needs to be peered to the disaster recovery site's SAP HANA DB virtual network.", - "waf": "Reliability" + "text": "Review 'Recommendations to mitigate OWASP API Security Top 10 threats' article and check what is applicable to your APIs", + "waf": "Security" }, { + "arm-service": "Microsoft.ApiManagement/service", "checklist": "WAF checklist", - "guid": "d3351bf7-628a-46de-917d-dfc11d3b6b40", - "link": "https://learn.microsoft.com/azure/azure-netapp-files/azure-netapp-files-service-levels", - "service": "SAP", + "guid": "5507c4b8-a7f8-41d6-9661-418c987100c9", + "link": "https://learn.microsoft.com/azure/api-management/authorizations-overview", + "service": "APIM", "services": [ - "SAP", - "Storage", "WAF" ], - "severity": "Low", - "text": "If you use Azure NetApp Files storage for your SAP deployments, at a minimum, create two Azure NetApp Files accounts in the Premium tier, in two regions.", - "training": "https://learn.microsoft.com/training/modules/choose-service-level-azure-netapp-files-hpc-applications/2-identify-decision-criteria", - "waf": "Reliability" + "severity": "Medium", + "text": "Use Authorizations feature to simplify management of OAuth 2.0 token for your backend APIs", + "waf": "Security" }, { + "arm-service": "Microsoft.ApiManagement/service", "checklist": "WAF checklist", - "guid": "726a1d3e-5508-4a06-9d54-93f4b50040c1", - "link": "https://learn.microsoft.com/azure/sap/workloads/disaster-recovery-sap-guide?tabs=windows", - "service": "SAP", + "guid": "2deee033-b906-4bc2-9f26-c8d3699fe091", + "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-manage-protocols-ciphers", + "service": "APIM", "services": [ "WAF" ], "severity": "High", - "text": "Native database replication technology should be used to synchronize the database in a HA pair.", - "training": "https://learn.microsoft.com/training/modules/implement-disaster-recovery-for-sap-workloads-azure/?source=recommendations", - "waf": "Reliability" + "text": "Use the latest TLS version when encrypting information in transit. Disable outdated and unnecessary protocols and ciphers when possible.", + "waf": "Security" }, { + "arm-service": "Microsoft.ApiManagement/service", "checklist": "WAF checklist", - "guid": "6561f847-3db5-4ff8-9200-5ad3c3b436ad", - "link": "https://learn.microsoft.com/ja-jp/azure/virtual-network/virtual-networks-faq", - "service": "SAP", + "guid": "f8af3d94-1d2b-4070-846f-849197524258", + "link": "https://learn.microsoft.com/security/benchmark/azure/baselines/api-management-security-baseline?toc=%2Fazure%2Fapi-management%2F&bc=%2Fazure%2Fapi-management%2Fbreadcrumb%2Ftoc.json#im-8-restrict-the-exposure-of-credential-and-secrets", + "service": "APIM", "services": [ - "VNet", - "WAF" + "WAF", + "AKV" ], "severity": "High", - "text": "The CIDR for the primary virtual network (VNet) shouldn't conflict or overlap with the CIDR of the DR site's VNet", - "training": "https://learn.microsoft.com/training/paths/azure-fundamentals-describe-azure-architecture-services/?source=recommendations", - "waf": "Reliability" + "text": "Ensure that secrets (Named values) are stored an Azure Key Vault so they can be securely accessed and updated", + "waf": "Security" }, { + "arm-service": "Microsoft.ApiManagement/service", "checklist": "WAF checklist", - "guid": "0258ed30-fe42-434f-87b9-58f91f908e0a", - "service": "SAP", + "guid": "791abd8b-7706-4e31-9569-afefde724be3", + "link": "https://learn.microsoft.com/security/benchmark/azure/baselines/api-management-security-baseline?toc=%2Fazure%2Fapi-management%2F&bc=%2Fazure%2Fapi-management%2Fbreadcrumb%2Ftoc.json#managed-identities", + "service": "APIM", "services": [ "Entra", - "ASR", - "VM", "WAF" ], - "severity": "High", - "text": "Use Site Recovery to replicate an application server to a DR site. Site Recovery can also help with replicating central-services cluster VMs to the DR site. When you invoke DR, you'll need to reconfigure the Linux Pacemaker cluster on the DR site (for example, replace the VIP or SBD, run corosync.conf, and more).", - "training": "https://learn.microsoft.com/training/paths/ensure-business-continuity-implement-disaster-recovery/", - "waf": "Reliability" + "severity": "Medium", + "text": "Use managed identities to authenticate to other Azure resources whenever possible", + "waf": "Security" }, { + "arm-service": "Microsoft.ApiManagement/service", "checklist": "WAF checklist", - "guid": "8300cb30-766b-4084-b126-0dd8fb1269a1", - "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/eslz-business-continuity-and-disaster-recovery", - "service": "SAP", + "guid": "220c4ca6-6688-476b-b2b5-425a78e6fb87", + "link": "https://learn.microsoft.com/security/benchmark/azure/baselines/api-management-security-baseline?toc=%2Fazure%2Fapi-management%2F&bc=%2Fazure%2Fapi-management%2Fbreadcrumb%2Ftoc.json#ns-6-deploy-web-application-firewall", + "service": "APIM", "services": [ - "SAP", - "WAF" + "Entra", + "AppGW", + "WAF", + "APIM" ], "severity": "High", - "text": "Consider the availability of SAP software against single points of failure. This includes single points of failure within applications such as DBMSs utilized in SAP NetWeaver and SAP S/4HANA architectures, SAP ABAP and ASCS + SCS. Also, other tools such as SAP Web Dispatcher.", - "training": "https://learn.microsoft.com/training/modules/implement-high-availability-for-sap-workloads-azure/2-explore-high-availability-disaster-recovery-support-azure-for-sap-workloads?source=recommendations", - "waf": "Reliability" + "text": "Use web application firewall (WAF) by deploying Application Gateway in front of APIM", + "waf": "Security" }, { + "arm-service": "Microsoft.AppPlatform/Spring", "checklist": "WAF checklist", - "guid": "56402f11-ccbe-42c3-a2f6-c6f6f38ab579", - "link": "https://learn.microsoft.com/azure/sap/workloads/planning-supported-configurations", - "service": "SAP", + "guid": "6d8e32a8-3892-479d-a40b-10f6b4f6f298", + "link": "https://learn.microsoft.com/azure/spring-apps/concepts-blue-green-deployment-strategies", + "service": "Spring Apps", "services": [ - "SAP", "WAF" ], - "severity": "High", - "text": "For SAP and SAP databases, consider implementing automatic failover clusters. In Windows, Windows Server Failover Clustering supports failover. In Linux, Linux Pacemaker or third-party tools like SIOS Protection Suite and Veritas InfoScale support failover.", - "training": "https://learn.microsoft.com/training/modules/implement-ha-sap-netweaver-anydb/?source=recommendations", + "severity": "Medium", + "text": "Azure Spring Apps permits two deployments for every app, only one of which receives production traffic. You can achieve zero downtime with blue green deployment strategies. Blue green deployment is only available in Standard and Enterprise tiers. You could automate deployment using CI/CD with ADO/GitHub actions", "waf": "Reliability" }, { + "arm-service": "Microsoft.AppPlatform/Spring", "checklist": "WAF checklist", - "guid": "afae6bec-2671-49ae-bc69-140b8ec8d320", - "link": "https://learn.microsoft.com/azure/sap/workloads/disaster-recovery-sap-guide?tabs=windows", - "service": "SAP", + "guid": "fbcb40ac-9480-4a6d-bcf4-8081252a6716", + "link": "https://learn.microsoft.com/azure/architecture/web-apps/spring-apps/architectures/spring-apps-multi-region", + "service": "Spring Apps", "services": [ - "Storage", - "VM", - "WAF" + "TrafficManager", + "WAF", + "FrontDoor" ], - "severity": "High", - "text": "Azure doesn't support architectures in which the primary and secondary VMs share storage for DBMS data. For the DBMS layer, the common architecture pattern is to replicate databases at the same time and with different storage stacks than the ones that the primary and secondary VMs use.", - "training": "https://learn.microsoft.com/training/paths/ensure-business-continuity-implement-disaster-recovery/?source=recommendationshttps%3A%2F%2Flearn.microsoft.com%2Fja-jp%2Ftraining%2Fpaths%2Fensure-business-continuity-implement-disaster-recovery%2F%3Fsource%3Drecommendations", + "severity": "Medium", + "text": "Azure Spring Apps instances could be created in multiple regions for your applications and traffic could be routed by Traffic Manager/Front Door.", "waf": "Reliability" }, { + "arm-service": "Microsoft.AppPlatform/Spring", "checklist": "WAF checklist", - "guid": "ac614e95-6767-4bc3-b8a4-9953533da6ba", - "link": "https://learn.microsoft.com/azure/sap/workloads/dbms-guide-general", - "service": "SAP", + "guid": "ff1ae6a7-9301-4feb-9d11-56cd72f1d4ef", + "link": "https://learn.microsoft.com/azure/reliability/reliability-spring-apps", + "service": "Spring Apps", "services": [ - "SAP", - "Storage", + "ACR", "WAF" ], - "severity": "High", - "text": "The DBMS data and transaction/redo log files are stored in Azure supported block storage or Azure NetApp Files. Azure Files or Azure Premium Files isn't supported as storage for DBMS data and/or redo log files with SAP workload.", - "training": "https://learn.microsoft.com/training/modules/explore-azure-databases/2-explore-database-support-azure-for-sap-workloads", + "severity": "Medium", + "text": "In supported region, Azure Spring Apps can be deployed as zone redundant, which means that instances are automatically distributed across availability zones. This feature is only available in Standard and Enterprise tiers.", "waf": "Reliability" }, { + "arm-service": "Microsoft.AppPlatform/Spring", "checklist": "WAF checklist", - "guid": "1f737179-8e7f-4e1a-a30c-e5a649a3092b", - "link": "https://learn.microsoft.com/azure/sap/workloads/sap-high-availability-guide-wsfc-shared-disk", - "service": "SAP", + "guid": "ffc735ad-fbb1-4802-b43f-ad6387c4c066", + "link": "https://learn.microsoft.com/azure/spring-apps/concept-understand-app-and-deployment", + "service": "Spring Apps", "services": [ - "SAP", "WAF" ], - "severity": "High", - "text": "You can use Azure shared disks in Windows for ASCS + SCS components and specific high-availability scenarios. Set up your failover clusters separately for SAP application layer components and the DBMS layer. Azure doesn't currently support high-availability architectures that combine SAP application layer components and the DBMS layer into one failover cluster.", - "training": "https://learn.microsoft.com/training/modules/implement-ha-sap-netweaver-anydb/?source=recommendations", + "severity": "Medium", + "text": "Use more than 1 app instance for your apps", "waf": "Reliability" }, { + "arm-service": "Microsoft.AppPlatform/Spring", "checklist": "WAF checklist", - "guid": "a78b3d31-3170-44f2-b5d7-651a29f4ccf5", - "link": "https://learn.microsoft.com/azure/sap/workloads/high-availability-guide-standard-load-balancer-outbound-connections", - "service": "SAP", + "guid": "7504c230-6035-4183-95a5-85762acc6075", + "link": "https://learn.microsoft.com/azure/spring-apps/diagnostic-services", + "service": "Spring Apps", "services": [ - "LoadBalancer", - "SAP", + "Monitor", "WAF" ], - "severity": "High", - "text": "Most failover clusters for SAP application layer components (ASCS) and the DBMS layer require a virtual IP address for a failover cluster. Azure Load Balancer should handle the virtual IP address for all other cases. One design principle is to use one load balancer per cluster configuration. We recommend that you use the standard version of the load balancer (Standard Load Balancer SKU).", - "training": "https://learn.microsoft.com/training/modules/implement-high-availability-for-sap-workloads-azure/?source=recommendations", + "severity": "Medium", + "text": "Monitor Azure Spring Apps with logs, metrics and tracing. Integrate ASA with application insights and track failures and create workbooks.", "waf": "Reliability" }, { + "arm-service": "Microsoft.AppPlatform/Spring", "checklist": "WAF checklist", - "guid": "1a541741-5833-4fb4-ae3c-2df743165c3a", - "link": "https://learn.microsoft.com/azure/load-balancer/load-balancer-ha-ports-overview?source=recommendations", - "service": "SAP", + "guid": "1eb48d58-3eec-4ef5-80b0-d2b0dde3f0c6", + "link": "https://learn.microsoft.com/azure/spring-apps/how-to-configure-enterprise-spring-cloud-gateway", + "service": "Spring Apps", "services": [ - "LoadBalancer", "WAF" ], - "severity": "High", - "text": "Make sure the Floating IP is enabled on the Load balancer", - "training": "https://learn.microsoft.com/training/modules/load-balancing-non-https-traffic-azure/?source=recommendations", + "severity": "Medium", + "text": "Set up autoscaling in Spring Cloud Gateway", "waf": "Reliability" }, { + "arm-service": "Microsoft.AppPlatform/Spring", "checklist": "WAF checklist", - "guid": "c47cc4f3-f105-452c-845e-9b307b3856c1", - "link": "https://learn.microsoft.com/azure/virtual-machines/availability", - "service": "SAP", + "guid": "97411607-b6fd-4335-99d1-9885faf4e392", + "link": "https://learn.microsoft.com/azure/spring-apps/how-to-setup-autoscale", + "service": "Spring Apps", "services": [ "WAF" ], - "severity": "High", - "text": "Before you deploy your high-availability infrastructure, and depending on the region you choose, determine whether to deploy with an Azure availability set or an availability zone.", - "training": "https://learn.microsoft.com/training/modules/configure-virtual-machine-availability/?source=recommendations", + "severity": "Low", + "text": "Enable autoscale for the apps with Standard consumption & dedicated plan.", "waf": "Reliability" }, { + "arm-service": "Microsoft.AppPlatform/Spring", "checklist": "WAF checklist", - "guid": "844f69c3-07e5-4ec1-bff7-4be27bcf5fea", - "link": "https://www.microsoft.com/licensing/docs/view/Service-Level-Agreements-SLA-for-Online-Services?lang=1", - "service": "SAP", + "guid": "dfcaffd1-d27c-4ef2-998d-64c1df3a7ac3", + "link": "https://learn.microsoft.com/azure/spring-apps/overview", + "service": "Spring Apps", "services": [ - "Entra", - "SAP", - "VM", "WAF" ], - "severity": "High", - "text": "If you want to meet the infrastructure SLAs for your applications for SAP components (central services, application servers, and databases), you must choose the same high availability options (VMs, availability sets, availability zones) for all components.", + "severity": "Medium", + "text": "Use Enterprise plan for commercial support of spring boot for mission critical apps. With other tiers you get OSS support.", "waf": "Reliability" }, { + "arm-service": "Microsoft.AVS/privateClouds", "checklist": "WAF checklist", - "guid": "cbe05bbe-209d-4490-ba47-778424d11678", - "link": "https://learn.microsoft.com/azure/virtual-machines/availability-set-overview", - "service": "SAP", + "guid": "32e42e36-11c8-418b-8a0b-c510e43a18a9", + "service": "AVS", "services": [ "Entra", - "RBAC", - "VM", - "WAF" + "WAF", + "Subscriptions" ], "severity": "High", - "text": "Do not mix servers of different roles in the same availability set. Keep central services VMs, database VMs, application VMs in their own availability sets", - "training": "https://learn.microsoft.com/training/modules/configure-virtual-machine-availability/?source=recommendations", - "waf": "Reliability" + "text": "Ensure ADDS domain controller(s) are deployed in the identity subscription in native Azure", + "waf": "Security" }, { + "arm-service": "Microsoft.AVS/privateClouds", "checklist": "WAF checklist", - "guid": "f2201000-d045-40a6-a79a-d7cdc01b4d86", - "link": "https://learn.microsoft.com/azure/virtual-machines/co-location", - "service": "SAP", + "guid": "75089c20-990d-4927-b105-885576f76fc2", + "service": "AVS", "services": [ - "WAF" + "WAF", + "AVS" ], "severity": "Medium", - "text": "You can't deploy Azure availability sets within an Azure availability zone unless you use proximity placement groups.", - "training": "https://learn.microsoft.com/azure/sap/workloads/proximity-placement-scenarios", - "waf": "Reliability" + "text": "Ensure ADDS sites and services is configured to keep authentication requests from Azure-based resources (including Azure VMware Solution) local to Azure", + "waf": "Security" }, { + "arm-service": "Microsoft.AVS/privateClouds", "checklist": "WAF checklist", - "guid": "9674e7c7-7796-4181-8920-09f4429543ba", - "link": "https://learn.microsoft.com/azure/virtual-machines/availability-set-overview", - "service": "SAP", + "guid": "de3aad1e-7c28-4ec9-9666-b7570449aa80", + "service": "AVS", "services": [ - "VM", "WAF" ], "severity": "High", - "text": "When you create availability sets, use the maximum number of fault domains and update domains available. For example, if you deploy more than two VMs in one availability set, use the maximum number of fault domains (three) and enough update domains to limit the effect of potential physical hardware failures, network outages, or power interruptions, in addition to Azure planned maintenance. The default number of fault domains is two, and you can't change it online later.", - "training": "https://learn.microsoft.com/training/modules/configure-virtual-machine-availability/?source=recommendations", - "waf": "Reliability" + "text": "Ensure that vCenter is connected to ADDS to enable authentication based on 'named user accounts'", + "waf": "Security" }, { + "arm-service": "Microsoft.AVS/privateClouds", "checklist": "WAF checklist", - "guid": "ae4ecb95-b70f-428f-8b9a-4c5b7e3478a2", - "link": "https://learn.microsoft.com/azure/sap/workloads/proximity-placement-scenarios", - "service": "SAP", + "guid": "cd289ced-6b17-4db8-8554-61e2aee3553a", + "service": "AVS", "services": [ - "Entra", - "SAP", "WAF" ], - "severity": "High", - "text": "When you use Azure proximity placement groups in an availability set deployment, all three SAP components (central services, application server, and database) should be in the same proximity placement group.", - "waf": "Reliability" + "severity": "Medium", + "text": "Ensure that the connection from vCenter to ADDS is using a secure protocol (LDAPS)", + "waf": "Security" }, { + "arm-service": "Microsoft.AVS/privateClouds", "checklist": "WAF checklist", - "guid": "5d2fa56c-56ad-4484-88fe-72734c486ba2", - "link": "https://learn.microsoft.com/azure/sap/workloads/proximity-placement-scenarios", - "service": "SAP", + "guid": "b9d37dac-43bc-46cd-8d79-a9b24604489a", + "service": "AVS", "services": [ - "SAP", - "ACR", "WAF" ], - "severity": "High", - "text": "Use one proximity placement group per SAP SID. Groups don't span across Availability Zones or Azure regions", - "waf": "Reliability" + "severity": "Medium", + "text": "CloudAdmin account in vCenter IdP is used only as an emergency account (break-glass)", + "waf": "Security" }, { + "arm-service": "Microsoft.AVS/privateClouds", "checklist": "WAF checklist", - "guid": "bca3b10e-0ff5-4aec-ac16-4c4bd1a1c13f", - "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/eslz-business-continuity-and-disaster-recovery", - "service": "SAP", + "guid": "53d88e89-d17b-473b-82a5-a67e7a9ed5b3", + "service": "AVS", "services": [ "Entra", - "SAP", "WAF" ], "severity": "High", - "text": "Use one of the following services to run SAP central services clusters, depending on the operating system.", - "training": "https://learn.microsoft.com/training/modules/implement-ha-sap-netweaver-anydb/?source=recommendations", - "waf": "Reliability" + "text": "Ensure that NSX-Manager is integrated with an external Identity provider (LDAPS)", + "waf": "Security" }, { + "arm-service": "Microsoft.AVS/privateClouds", "checklist": "WAF checklist", - "guid": "ed46b937-913e-4018-9c62-8393ab037e53", - "link": "https://learn.microsoft.com/azure/sap/workloads/high-availability-guide-suse-multi-sid", - "service": "SAP", + "guid": "ae0e37ce-e297-411b-b352-caaab79b198d", + "service": "AVS", "services": [ - "Entra", - "VM", - "WAF" + "RBAC", + "WAF", + "AVS" ], "severity": "Medium", - "text": "Azure doesn't currently support combining ASCS and DB HA in the same Linux Pacemaker cluster; separate them into individual clusters. However, you can combine up to five multiple central-services clusters into a pair of VMs.", - "training": "https://learn.microsoft.com/training/modules/implement-ha-sap-netweaver-anydb/?source=recommendations", - "waf": "Reliability" + "text": "Has an RBAC model been created for use within VMware vSphere", + "waf": "Security" }, { + "arm-service": "Microsoft.AVS/privateClouds", "checklist": "WAF checklist", - "guid": "f656e745-0cfb-453e-8008-0528fa21c933", - "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/eslz-business-continuity-and-disaster-recovery", - "service": "SAP", + "guid": "ab81932c-9fc9-4d1b-a780-36f5e6bfbb9e", + "service": "AVS", "services": [ - "Storage", - "VM", + "RBAC", "WAF" ], "severity": "Medium", - "text": "Deploy both VMs in the high-availability pair in an availability set or in availability zones. These VMs should be the same size and have the same storage configuration.", - "waf": "Reliability" + "text": "RBAC permissions should be granted on ADDS groups and not on specific users", + "waf": "Security" }, { + "arm-service": "Microsoft.AVS/privateClouds", "checklist": "WAF checklist", - "guid": "7f684ebc-95da-425e-b329-e782dbed050f", - "link": "https://learn.microsoft.com/azure/sap/workloads/high-availability-guide-rhel-with-hana-ascs-ers-dialog-instance", - "service": "SAP", + "guid": "d503547c-c447-4e82-9128-a71f0f1cac6d", + "service": "AVS", "services": [ - "SAP", - "WAF" + "RBAC", + "WAF", + "AVS" ], - "severity": "Medium", - "text": "Azure supports installing and configuring SAP HANA and ASCS/SCS and ERS instances on the same high availability cluster running on Red Hat Enterprise Linux (RHEL).", - "training": "https://learn.microsoft.com/training/modules/implement-ha-sap-netweaver-anydb/?source=recommendations", - "waf": "Reliability" + "severity": "High", + "text": "RBAC permissions on the Azure VMware Solution resource in Azure are 'locked down' to a limited set of owners only", + "waf": "Security" }, { + "arm-service": "Microsoft.AVS/privateClouds", "checklist": "WAF checklist", - "guid": "07991f7d-6598-4d90-9431-45c62605d3a5", - "link": "https://learn.microsoft.com/azure/sap/workloads/planning-guide-storage", - "service": "SAP", + "guid": "fd9f0df4-68dc-4976-b9a9-e6a79f7682c5", + "service": "AVS", "services": [ - "Storage", + "RBAC", "WAF" ], "severity": "High", - "text": "Run all production systems on Premium managed SSDs and use Azure NetApp Files or Ultra Disk Storage. At least the OS disk should be on the Premium tier so you can achieve better performance and the best SLA.", - "training": "https://learn.microsoft.com/training/modules/explore-azure-storage/?source=recommendations", - "waf": "Reliability" + "text": "Ensure all custom roles are scoped with CloudAdmin permitted authorizations", + "waf": "Security" }, { + "arm-service": "Microsoft.AVS/privateClouds", "checklist": "WAF checklist", - "guid": "73cdaecc-7d74-48d8-a040-88416eebc98c", - "link": "https://learn.microsoft.com/azure/sap/workloads/hana-vm-operations-storage", - "service": "SAP", + "guid": "9ef1d5e8-32e4-42e3-911c-818b0a0bc510", + "link": "https://github.com/Azure/AzureCAT-AVS/tree/main/networking", + "service": "AVS", "services": [ - "SAP", - "Storage", - "WAF" + "WAF", + "AVS" ], "severity": "High", - "text": "You should run SAP HANA on Azure only on the types of storage that are certified by SAP. Note that certain volumes must be run on certain disk configurations, where applicable. These configurations include enabling Write Accelerator and using Premium storage. You also need to ensure that the file system that runs on storage is compatible with the DBMS that runs on the machine.", - "training": "https://learn.microsoft.com/azure/sap/workloads/hana-vm-premium-ssd-v1?source=recommendations", - "waf": "Reliability" + "text": "Is the correct Azure VMware Solution connectivity model selected for the customer use case at hand", + "waf": "Performance" }, { + "arm-service": "Microsoft.AVS/privateClouds", "checklist": "WAF checklist", - "guid": "51904867-a70e-4fa0-b4ff-3e6292846d7c", - "link": "https://learn.microsoft.com/azure/sap/workloads/disaster-recovery-overview-guide#storage", - "service": "SAP", + "guid": "eb710a37-cbc1-4055-8dd5-a936a8bb7cf5", + "service": "AVS", "services": [ - "SAP", - "Storage", - "ASR", - "WAF" + "Monitor", + "WAF", + "NetworkWatcher", + "ExpressRoute", + "VPN" ], "severity": "High", - "text": "Consider configuring high availability depending on the type of storage you use for your SAP workloads. Some storage services available in Azure are not supported by Azure Site Recovery, so your high availability configuration may differ.", - "training": "https://learn.microsoft.com/training/modules/implement-disaster-recovery-for-sap-workloads-azure/2-explore-disaster-recovery-sap-workloads", - "waf": "Reliability" + "text": "Ensure ExpressRoute or VPN connections from on-premises to Azure are monitored using 'connection monitor'", + "waf": "Operations" }, { + "arm-service": "Microsoft.AVS/privateClouds", "checklist": "WAF checklist", - "guid": "1ac2d928-c9b7-42c6-ba18-23b1aea78693", - "link": "https://azure.microsoft.com/ja-jp/explore/global-infrastructure/products-by-region/", - "service": "SAP", + "guid": "976e24f2-a7f8-426c-9253-2a92a2a7ed99", + "service": "AVS", "services": [ - "SAP", - "Storage", - "WAF" + "Monitor", + "WAF", + "VM", + "NetworkWatcher", + "ExpressRoute", + "AVS" ], - "severity": "High", - "text": "Different native Azure storage services (like Azure Files, Azure NetApp Files, Azure Shared Disk) may not be available in all regions. So to have similar SAP setup on the DR region after failover, ensure the respective storage service is offered in DR site.", - "waf": "Reliability" + "severity": "Medium", + "text": "Ensure a connection monitor is created from an Azure native resource to an Azure VMware Solution virtual machine to monitor the Azure VMware Solution back-end ExpressRoute connection", + "waf": "Operations" }, { + "arm-service": "Microsoft.AVS/privateClouds", "checklist": "WAF checklist", - "guid": "925d1f8c-01f3-4a67-948e-aabf0a1fad60", - "link": "https://techcommunity.microsoft.com/t5/running-sap-applications-on-the/optimize-your-azure-costs-by-automating-sap-system-start-stop/ba-p/2120675", - "service": "SAP", + "guid": "f41ce6a0-64f3-4805-bc65-3ab50df01265", + "service": "AVS", "services": [ - "SAP", - "Cost", - "WAF" + "Monitor", + "WAF", + "VM", + "NetworkWatcher", + "AVS" ], "severity": "Medium", - "text": "Automate SAP System Start-Stop to manage costs.", - "waf": "Cost" + "text": "Ensure a connection monitor is created from an on-premises resource to an Azure VMware Solution virtual machine to monitor end-2-end connectivity", + "waf": "Operations" }, { + "arm-service": "Microsoft.AVS/privateClouds", "checklist": "WAF checklist", - "guid": "71dc00cd-4392-4262-8949-20c05e6c0333", - "link": "https://learn.microsoft.com/azure/sap/workloads/hana-vm-premium-ssd-v1", - "service": "SAP", + "guid": "563b4dc7-4a74-48b6-933a-d1a0916a6649", + "service": "AVS", "services": [ - "Storage", - "VM", - "SAP", - "Cost", - "WAF" + "WAF", + "ARS" ], - "severity": "Low", - "text": "In the case of using Azure Premium Storage with SAP HANA, Azure Standard SSD storage can be used to select a cost-conscious storage solution. However, please note that choosing Standard SSD or Standard HDD Azure storage will affect the SLA of the individual VMs. Also, for systems with lower I/O throughput and low latency, such as non-production environments, lower series VMs can be used.", - "waf": "Cost" + "severity": "High", + "text": "When route server is used, ensure no more then 1000 routes are propagated from route server to ExR gateway to on-premises (ARS limit).", + "waf": "Operations" }, { + "arm-service": "Microsoft.AVS/privateClouds", "checklist": "WAF checklist", - "guid": "9877f353-2591-4e8b-8381-e9043fed1010", - "link": "https://learn.microsoft.com/azure/sap/workloads/hana-vm-premium-ssd-v1", - "service": "SAP", + "guid": "6128a71f-0f1c-4ac6-b9ef-1d5e832e42e3", + "service": "AVS", "services": [ - "Storage", - "VM", - "SAP", - "Cost", - "WAF" + "Entra", + "RBAC", + "WAF", + "AVS" ], - "severity": "Low", - "text": "As a lower-cost alternative configuration (multipurpose), you can choose a low-performance SKU for your non-production HANA database server VMs. However, it is important to note that some VM types, such as E-series, are not HANA certified (SAP HANA Hardware Directory) or cannot achieve storage latency of less than 1ms.", - "waf": "Cost" + "severity": "High", + "text": "Is Privileged Identity Management implemented for roles managing the Azure VMware Solution resource in the Azure Portal (no standing permissions allowed)", + "waf": "Security" }, { + "arm-service": "Microsoft.AVS/privateClouds", "checklist": "WAF checklist", - "guid": "fda1dbf3-dc95-4d48-a7c7-91dca0f6c565", - "link": "https://learn.microsoft.com/azure/well-architected/sap/design-areas/security", - "service": "SAP", + "guid": "c4e2436b-b336-4d71-9f17-960eee0b9b5c", + "service": "AVS", "services": [ + "Entra", "RBAC", - "Subscriptions", - "WAF" + "WAF", + "AVS" ], "severity": "High", - "text": "Enforce a RBAC model for management groups, subscriptions, resource groups and resources", - "training": "https://learn.microsoft.com/training/paths/implement-resource-mgmt-security/", + "text": "Privileged Identity Management audit reporting should be implemented for the Azure VMware Solution PIM roles", "waf": "Security" }, { + "arm-service": "Microsoft.AVS/privateClouds", "checklist": "WAF checklist", - "guid": "45911475-e39e-4530-accc-d979366bcda2", - "link": "https://learn.microsoft.com/azure/active-directory/fundamentals/scenario-azure-first-sap-identity-integration", - "service": "SAP", + "guid": "78c447a8-26b2-4863-af0f-1cac599ef1d5", + "service": "AVS", "services": [ "Entra", - "SAP", - "WAF" + "WAF", + "AVS" ], "severity": "Medium", - "text": "Enforce Principal propagation for forwarding the identity from SAP cloud application to SAP on-premises (Including IaaS) through cloud connector", - "training": "https://learn.microsoft.com/training/modules/explore-identity-services/2-explore-azure-virtual-machine-auth-access-control", + "text": "If using Privileged Identity Management is being used, ensure that a valid Entra ID enabled account is created with a valid SMTP record for Azure VMware Solution Automatic Host replacement notifications. (standing permissions required)", "waf": "Security" }, { + "arm-service": "Microsoft.AVS/privateClouds", "checklist": "WAF checklist", - "guid": "750ab1ab-039d-495d-94c7-c8929cb107d5", - "link": "https://learn.microsoft.com/azure/active-directory/fundamentals/scenario-azure-first-sap-identity-integration", - "service": "SAP", + "guid": "8defc4d7-21d3-41d2-90fb-707ae9eab40e", + "service": "AVS", "services": [ - "Entra", - "SAP", "WAF" ], - "severity": "Medium", - "text": "Implement SSO to SAP SaaS applications like SAP Analytics Cloud, SAP Cloud Platform, Business by design, SAP Qualtrics and SAP C4C with Azure AD using SAML.", + "severity": "High", + "text": "Limit use of CloudAdmin account to emergency access only", "waf": "Security" }, { + "arm-service": "Microsoft.AVS/privateClouds", "checklist": "WAF checklist", - "guid": "325ae525-ba34-4d46-a5e2-213ace7bb122", - "link": "https://learn.microsoft.com/azure/active-directory/saas-apps/sap-netweaver-tutorial", - "service": "SAP", + "guid": "d329f798-bc17-48bd-a5a0-6ca7144351d1", + "service": "AVS", "services": [ - "SAP", + "RBAC", "WAF" ], "severity": "Medium", - "text": "Implement SSO to SAP NetWeaver-based web applications like SAP Fiori and SAP Web GUI by using SAML.", - "training": "https://learn.microsoft.com/training/modules/explore-identity-services/8-exercise-integrate-azure-active-directory-sap-netweaver", + "text": "Create custom RBAC roles in vCenter to implement a least-privilege model inside vCenter", "waf": "Security" }, { + "arm-service": "Microsoft.AVS/privateClouds", "checklist": "WAF checklist", - "guid": "9eb54dad-7861-4e1c-973a-f3bb003fc9c1", - "service": "SAP", + "guid": "9dd24429-eb72-4281-97a1-51c5bb4e4f18", + "service": "AVS", "services": [ - "SAP", "WAF" ], "severity": "Medium", - "text": "Implement SSO to SAP NetWeaver-based web applications like SAP Fiori and SAP Web GUI by using SAML.", - "training": "https://learn.microsoft.com/training/modules/explore-identity-services/6-exercise-integrate-azure-active-directory-sap-fiori", + "text": "Is a process defined to regularly rotate cloudadmin (vCenter) and admin (NSX) credentials", "waf": "Security" }, { + "arm-service": "Microsoft.AVS/privateClouds", "checklist": "WAF checklist", - "guid": "f29676ef-0c9c-4c4d-ab21-a55504c0c829", - "link": "https://learn.microsoft.com/azure/active-directory/saas-apps/sap-netweaver-tutorial", - "service": "SAP", + "guid": "586cb291-ec16-4a1d-876e-f9f141acdce5", + "service": "AVS", "services": [ - "SAP", - "WAF" + "VM", + "WAF", + "AVS", + "Entra" ], - "severity": "Medium", - "text": "You can implement SSO to SAP GUI by using SAP NetWeaver SSO or a partner solution.", - "training": "https://learn.microsoft.com/training/modules/explore-identity-services/8-exercise-integrate-azure-active-directory-sap-netweaver", + "severity": "High", + "text": "Use a centralized identity provider to be used for workloads (VM's) running on Azure VMware Solution", "waf": "Security" }, { + "arm-service": "Microsoft.AVS/privateClouds", "checklist": "WAF checklist", - "guid": "23181aa4-1742-4694-9ff8-ae7d7d474317", - "service": "SAP", - "services": [ - "SAP", - "AKV", + "guid": "79377bcd-b375-41ab-8ab0-ead66e15d3d4", + "service": "AVS", + "services": [ "WAF" ], "severity": "Medium", - "text": "For SSO for SAP GUI and web browser access, implement SNC / Kerberos/SPNEGO (simple and protected GSSAPI negotiation mechanism) due to its ease of configuration and maintenance. For SSO with X.509 client certificates, consider the SAP Secure Login Server, which is a component of the SAP SSO solution.", - "training": "https://learn.microsoft.com/training/modules/explore-identity-services/9-exercise-integrate-active-directory-sap-single-sign-on", + "text": "Is East-West traffic filtering implemented within NSX-T", "waf": "Security" }, { + "arm-service": "Microsoft.AVS/privateClouds", "checklist": "WAF checklist", - "guid": "6c8bcbf4-5bbe-4609-b8a0-3e97778424d6", - "link": "https://blogs.sap.com/2017/07/12/sap-single-sign-on-protect-your-sap-landscape-with-x.509-certificates/", - "service": "SAP", + "guid": "a2adb1c3-d232-46af-825c-a44e1695fddd", + "service": "AVS", "services": [ - "SAP", - "AKV", - "WAF" + "AppGW", + "WAF", + "AVS", + "Firewall" ], - "severity": "Medium", - "text": "For SSO for SAP GUI and web browser access, implement SNC / Kerberos/SPNEGO (simple and protected GSSAPI negotiation mechanism) due to its ease of configuration and maintenance. For SSO with X.509 client certificates, consider the SAP Secure Login Server, which is a component of the SAP SSO solution.", + "severity": "High", + "text": "Workloads on Azure VMware Solution are not directly exposed to the internet. Traffic is filtered and inspected by Azure Application Gateway, Azure Firewall or 3rd party solutions", "waf": "Security" }, { + "arm-service": "Microsoft.AVS/privateClouds", "checklist": "WAF checklist", - "guid": "16785d6f-a96c-496a-b885-18f482734c88", - "link": "https://learn.microsoft.com/azure/active-directory/saas-apps/sap-netweaver-tutorial#configure-sap-netweaver-for-oauth", - "service": "SAP", + "guid": "eace4cb1-deb4-4c65-8c3f-c14eeab36938", + "service": "AVS", "services": [ - "SAP", - "WAF" + "WAF", + "AVS" ], - "severity": "Medium", - "text": "Implement SSO by using OAuth for SAP NetWeaver to allow third-party or custom applications to access SAP NetWeaver OData services.", + "severity": "High", + "text": "Auditing and logging is implemented for inbound internet requests to Azure VMware Solution and Azure VMware Solution based workloads", "waf": "Security" }, { + "arm-service": "Microsoft.AVS/privateClouds", "checklist": "WAF checklist", - "guid": "a747c350-8d4c-449c-93af-393dbca77c48", - "link": "https://learn.microsoft.com/azure/active-directory/saas-apps/saphana-tutorial", - "service": "SAP", + "guid": "29e3eec2-1836-487a-8077-a2b5945bda43", + "service": "AVS", "services": [ - "SAP", - "WAF" + "Monitor", + "WAF", + "AVS" ], "severity": "Medium", - "text": "Implement SSO to SAP HANA", + "text": "Session monitoring is implemented for outbound internet connections from Azure VMware Solution or Azure VMware Solution based workloads to identify suspicious/malicious activity", "waf": "Security" }, { + "arm-service": "Microsoft.AVS/privateClouds", "checklist": "WAF checklist", - "guid": "c7bae5bf-daf9-4761-9c56-f92891890aa4", - "link": "https://learn.microsoft.com/azure/sap/workloads/rise-integration#connectivity-with-sap-rise", - "service": "SAP", + "guid": "334fdf91-c234-4182-a652-75269440b4be", + "service": "AVS", "services": [ - "Entra", - "SAP", - "WAF" + "VNet", + "WAF", + "DDoS", + "ExpressRoute", + "VPN" ], "severity": "Medium", - "text": "Consider Azure AD an identity provider for SAP systems hosted on RISE. For more information, see Integrating the Service with Azure AD.", + "text": "Is DDoS standard protection enabled on ExR/VPN Gateway subnet in Azure", "waf": "Security" }, { + "arm-service": "Microsoft.AVS/privateClouds", "checklist": "WAF checklist", - "guid": "e4e48226-ce54-44b6-bb6b-bfa15bd8f753", - "link": "https://github.com/azuredevcollege/SAP/blob/master/sap-oauth-saml-flow/README.md", - "service": "SAP", + "guid": "3d3e0843-276d-44bd-a015-bcf219e4a1eb", + "service": "AVS", "services": [ - "SAP", - "WAF" + "WAF", + "AVS" ], "severity": "Medium", - "text": "For applications that access SAP, you might want to use principal propagation to establish SSO.", + "text": "Use a dedicated privileged access workstation (PAW) to manage Azure VMware Solution, vCenter, NSX manager and HCX manager", "waf": "Security" }, { + "arm-service": "Microsoft.AVS/privateClouds", "checklist": "WAF checklist", - "guid": "59921095-4980-4fc1-a5b6-524a5a560c79", - "link": "https://learn.microsoft.com/azure/active-directory/saas-apps/sap-hana-cloud-platform-identity-authentication-tutorial", - "service": "SAP", + "guid": "9ccbd869-266a-4cca-874f-aa19bf39d95d", + "service": "AVS", "services": [ - "Entra", - "SAP", - "WAF" + "Defender", + "WAF", + "AVS" ], "severity": "Medium", - "text": "If you're using SAP BTP services or SaaS solutions that require SAP Identity Authentication Service (IAS), consider implementing SSO between SAP Cloud Identity Authentication Services and Azure AD to access those SAP services. This integration lets SAP IAS act as a proxy identity provider and forwards authentication requests to Azure AD as the central user store and identity provider.", + "text": "Enable Advanced Threat Detection (Microsoft Defender for Cloud aka ASC) for workloads running on Azure VMware Solution", "waf": "Security" }, { + "arm-service": "Microsoft.AVS/privateClouds", "checklist": "WAF checklist", - "guid": "a709c664-317e-41e4-9e34-67d9016a86f4", - "link": "https://learn.microsoft.com/azure/active-directory/saas-apps/sap-hana-cloud-platform-tutorial", - "service": "SAP", + "guid": "44c7c891-9ca1-4f6d-9315-ae524ba34d45", + "service": "AVS", "services": [ - "SAP", - "WAF" + "Arc", + "WAF", + "AVS" ], "severity": "Medium", - "text": "Implement SSO to SAP BTP", + "text": "Use Azure ARC for Servers to properly govern workloads running on Azure VMware Solution using Azure native technologies (Azure ARC for Azure VMware Solution is not yet available)", "waf": "Security" }, { + "arm-service": "Microsoft.AVS/privateClouds", "checklist": "WAF checklist", - "guid": "01f11b7f-38df-4251-9c76-4dec19abd3e8", - "link": "https://learn.microsoft.com/azure/active-directory/saas-apps/sap-successfactors-inbound-provisioning-cloud-only-tutorial", - "service": "SAP", + "guid": "85e12139-bd7b-4b01-8f7b-95ef6e043e2a", + "service": "AVS", "services": [ - "Entra", - "SAP", - "WAF" + "SQL", + "WAF", + "AVS" ], - "severity": "Medium", - "text": "If you're using SAP SuccessFactors, consider using the Azure AD automated user provisioning. With this integration, as you add new employees to SAP SuccessFactors, you can automatically create their user accounts in Azure AD. Optionally, you can create user accounts in Microsoft 365 or other SaaS applications that are supported by Azure AD. Use write-back of the email address to SAP SuccessFactors.", + "severity": "Low", + "text": "Ensure workloads on Azure VMware Solution use sufficient data encryption during run-time (like in-guest disk encryption and SQL TDE). (vSAN encryption at rest is default)", "waf": "Security" }, { + "arm-service": "Microsoft.AVS/privateClouds", "checklist": "WAF checklist", - "guid": "6ba28021-4591-4147-9e39-e5309cccd979", - "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/ready/landing-zone/design-area/resource-org-management-groups", - "service": "SAP", + "guid": "a3592718-e6e2-4051-9267-6ae46691e883", + "service": "AVS", "services": [ - "SAP", - "Subscriptions", - "AzurePolicy", - "WAF" + "WAF", + "AKV" ], - "severity": "Medium", - "text": "enforce existing Management Group policies to SAP Subscriptions", - "training": "https://learn.microsoft.com/training/modules/enterprise-scale-organization/4-management-group-subscription-organization", - "waf": "Operations" + "severity": "Low", + "text": "When in-guest encryption is used, store encryption keys in Azure Key vault when possible", + "waf": "Security" }, { + "arm-service": "Microsoft.AVS/privateClouds", "checklist": "WAF checklist", - "guid": "366bcda2-750a-4b1a-a039-d95d54c7c892", - "link": "https://learn.microsoft.com/azure/architecture/guide/sap/sap-whole-landscape", - "service": "SAP", + "guid": "5ac94222-3e13-4810-9230-81a941741583", + "service": "AVS", "services": [ - "SAP", - "Subscriptions", - "WAF" + "WAF", + "AVS" ], - "severity": "High", - "text": "Integrate tightly coupled applications into the same SAP subscription to avoid additional routing and management complexity", - "training": "https://learn.microsoft.com/azure/cloud-adoption-framework/ready/landing-zone/design-area/resource-org-subscriptions", - "waf": "Operations" + "severity": "Medium", + "text": "Consider using extended security update support for workloads running on Azure VMware Solution (Azure VMware Solution is eligible for ESU)", + "waf": "Security" }, { + "arm-service": "Microsoft.AVS/privateClouds", "checklist": "WAF checklist", - "guid": "9cb107d5-325a-4e52-9ba3-4d4685e2213a", - "link": "https://learn.microsoft.com/azure/architecture/guide/sap/sap-whole-landscape", - "service": "SAP", + "guid": "3ef7ad7c-6d37-4331-95c7-acbe44bbe609", + "service": "AVS", "services": [ - "Subscriptions", "WAF" ], "severity": "High", - "text": "Leverage Subscription as scale unit and scaling our resources, consider deploying subscription per environment eg. Sandbox, non-prod, prod ", - "training": "https://learn.microsoft.com/training/modules/configure-subscriptions/?source=recommendations", - "waf": "Operations" + "text": "Ensure that the appropriate vSAN Data redundancy method is used (RAID specification)", + "waf": "Reliability" }, { + "arm-service": "Microsoft.AVS/privateClouds", "checklist": "WAF checklist", - "guid": "ce7bb122-f7c9-45f0-9e15-4e3aa3592829", - "link": "https://learn.microsoft.com/azure/quotas/quotas-overview", - "service": "SAP", + "guid": "d88408f3-7273-44c8-96ba-280214590146", + "service": "AVS", "services": [ - "VM", - "Subscriptions", - "WAF" + "Storage", + "WAF", + "AzurePolicy" ], "severity": "High", - "text": "Ensure quota increase as a part of subscription provisioning (e.g. total available VM cores within a subscription)", - "training": "https://learn.microsoft.com/azure/azure-resource-manager/management/azure-subscription-service-limits", - "waf": "Operations" + "text": "Ensure that the Failure-to-tolerate policy is in place to meet your vSAN storage needs", + "waf": "Reliability" }, { + "arm-service": "Microsoft.AVS/privateClouds", "checklist": "WAF checklist", - "guid": "ce4fab2f-433a-4d59-a5a9-3d1032e03ebc", - "link": "https://learn.microsoft.com/rest/api/reserved-vm-instances/quotaapi?branch=capacity", - "service": "SAP", + "guid": "d89f2e87-7784-424d-9167-85c6fa95b96a", + "service": "AVS", "services": [ + "ASR", "WAF" ], - "severity": "Low", - "text": "The Quota API is a REST API that you can use to view and manage quotas for Azure services. Consider using it if necessary.", - "waf": "Operations" + "severity": "High", + "text": "Ensure that you have requested enough quota, ensuring you have considered growth and Disaster Recovery requirement", + "waf": "Reliability" }, { + "arm-service": "Microsoft.AVS/privateClouds", "checklist": "WAF checklist", - "guid": "cbfad17b-f240-42bf-a1d8-f4f4cee661c8", - "link": "https://learn.microsoft.com/azure/quotas/quickstart-increase-quota-portal", - "service": "SAP", + "guid": "5d38e53f-9ccb-4d86-a266-acca274faa19", + "service": "AVS", "services": [ - "VM", - "Subscriptions", "WAF" ], - "severity": "High", - "text": "If deploying to an availability zone, ensure that the VM's zone deployment is available once the quota has been approved. Submit a support request with the subscription, VM series, number of CPUs and availability zone required.", + "severity": "Medium", + "text": "Ensure that access constraints to ESXi are understood, there are access limits which might affect 3rd party solutions.", "waf": "Operations" }, { + "arm-service": "Microsoft.AVS/privateClouds", "checklist": "WAF checklist", - "guid": "e6e20617-3686-4af4-9791-f8935ada4332", - "link": "https://azure.microsoft.com/explore/global-infrastructure/products-by-region/", - "service": "SAP", + "guid": "bf39d95d-44c7-4c89-89ca-1f6d5315ae52", + "service": "AVS", "services": [ - "WAF" + "WAF", + "AzurePolicy" ], - "severity": "High", - "text": "Ensure required services and features are available within the chosen deployment regions eg. ANF , Zone etc.", - "training": "https://learn.microsoft.com/azure/cloud-adoption-framework/migrate/azure-best-practices/multiple-regions?source=recommendations", + "severity": "Medium", + "text": "Ensure that you have a policy around ESXi host density and efficiency, keeping in mind the lead time for requesting new nodes", "waf": "Operations" }, { + "arm-service": "Microsoft.AVS/privateClouds", "checklist": "WAF checklist", - "guid": "4e138115-2318-41aa-9174-26943ff8ae7d", - "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/eslz-resource-organization", - "service": "SAP", + "guid": "4ba34d45-85e1-4213-abd7-bb012f7b95ef", + "service": "AVS", "services": [ - "TrafficManager", "Cost", - "WAF" + "WAF", + "AVS" ], "severity": "Medium", - "text": "Leverage Azure resource tag for cost categorization and resource grouping (: BillTo, Department (or Business Unit), Environment (Production, Stage, Development), Tier (Web Tier, Application Tier), Application Owner, ProjectName)", - "training": "https://learn.microsoft.com/training/paths/implement-resource-mgmt-security/", - "waf": "Operations" + "text": "Ensure a good cost management process is in place for Azure VMware Solution - Azure Cost Management can be used", + "waf": "Cost" }, { + "arm-service": "Microsoft.AVS/privateClouds", "checklist": "WAF checklist", - "guid": "2f7c95f0-6e15-44e3-aa35-92829e6e2061", - "link": "https://learn.microsoft.com/azure/backup/sap-hana-database-about", - "service": "SAP", + "guid": "6e043e2a-a359-4271-ae6e-205172676ae4", + "service": "AVS", "services": [ - "Backup", - "WAF" + "Cost", + "WAF", + "AVS" ], - "severity": "High", - "text": "Help protect your HANA database by using the Azure Backup service.", - "training": "https://learn.microsoft.com/training/modules/implement-azure-backup-sap-workloads-azure-virtual-machines/?source=recommendations", - "waf": "Reliability" + "severity": "Low", + "text": "Are Azure reserved instances used to optimize cost for using Azure VMware Solution", + "waf": "Cost" }, { + "arm-service": "Microsoft.AVS/privateClouds", "checklist": "WAF checklist", - "guid": "302a2fbf-3745-4a5f-a365-c9d1a16ca22c", - "link": "https://learn.microsoft.com/azure/azure-netapp-files/azacsnap-introduction", - "service": "SAP", + "guid": "6691e883-5ac9-4422-83e1-3810523081a9", + "service": "AVS", "services": [ - "Entra", - "Storage", - "VM", "WAF" ], "severity": "Medium", - "text": "If you deploy Azure NetApp Files for your HANA, Oracle, or DB2 database, use the Azure Application Consistent Snapshot tool (AzAcSnap) to take application-consistent snapshots. AzAcSnap also supports Oracle databases. Consider using AzAcSnap on a central VM rather than on individual VMs.", - "waf": "Reliability" + "text": "Consider the use of Azure Private-Link when using other Azure Native Services", + "waf": "Security" }, { + "arm-service": "Microsoft.AVS/privateClouds", "checklist": "WAF checklist", - "guid": "42d37218-a3a7-45df-bff6-1173e7f249ea", - "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/eslz-management-and-monitoring", - "service": "SAP", + "guid": "db611712-6904-40b4-aa3d-3e0803276d4b", + "service": "AVS", "services": [ - "SAP", "WAF" ], "severity": "High", - "text": "Ensure time-zone matches between the operating system and the SAP system.", - "waf": "Operations" + "text": "Ensure all required resource reside within the same Azure availability zone(s)", + "waf": "Performance" }, { + "arm-service": "Microsoft.AVS/privateClouds", "checklist": "WAF checklist", - "guid": "c3c7abc0-716c-4486-893c-40e181d65539", - "link": "https://learn.microsoft.com/azure/sap/workloads/high-availability-guide-rhel-multi-sid", - "service": "SAP", + "guid": "48b262d6-cc5f-4512-a253-98e6db9d37da", + "service": "AVS", "services": [ - "Entra", - "WAF" + "VM", + "Defender", + "WAF", + "AVS" ], "severity": "Medium", - "text": "Don't group different application services in the same cluster. For example, don't combine DRBD and central services clusters on the same cluster. However, you can use the same Pacemaker cluster to manage approximately five different central services (multi-SID cluster).", - "training": "https://learn.microsoft.com/training/modules/implement-ha-sap-netweaver-anydb/?source=recommendations", - "waf": "Reliability" + "text": "Enable Microsoft Defender for Cloud for Azure VMware Solution guest VM workloads", + "waf": "Security" }, { + "arm-service": "Microsoft.AVS/privateClouds", "checklist": "WAF checklist", - "guid": "a491dfc4-9353-4213-9217-eef0949f9467", - "link": "https://azure.microsoft.com/pricing/offers/dev-test/", - "service": "SAP", + "guid": "41741583-3ef7-4ad7-a6d3-733165c7acbe", + "service": "AVS", "services": [ - "Cost", - "WAF" + "VM", + "Arc", + "WAF", + "AVS" ], - "severity": "Low", - "text": "Consider running dev/test systems in a snooze model to save and optimize Azure run costs.", - "waf": "Cost" + "severity": "Medium", + "text": "Use Azure Arc enabled servers to manage your Azure VMware Solution guest VM workloads", + "waf": "Security" }, { + "arm-service": "Microsoft.AVS/privateClouds", "checklist": "WAF checklist", - "guid": "b7056168-6199-4732-a514-cdbb2d5c9c54", - "link": "https://learn.microsoft.com/azure/lighthouse/overview", - "service": "SAP", + "guid": "88f03a4d-2cd4-463c-abbc-868295abc91a", + "service": "AVS", "services": [ - "Entra", - "SAP", - "WAF" + "WAF", + "AVS" ], - "severity": "Medium", - "text": "If you partner with customers by managing their SAP estates, consider Azure Lighthouse. Azure Lighthouse allows managed service providers to use Azure native identity services to authenticate to the customers' environment. It puts the control in the hands of customers, because they can revoke access at any time and audit service providers' actions.", + "severity": "High", + "text": "Enable Diagnostic and metric logging on Azure VMware Solution", "waf": "Operations" }, { + "arm-service": "Microsoft.AVS/privateClouds", "checklist": "WAF checklist", - "guid": "4d116785-d2fa-456c-96ad-48408fe72734", - "link": "https://learn.microsoft.com/azure/update-manager/scheduled-patching?tabs=schedule-updates-single-machine%2Cschedule-updates-scale-overview", - "service": "SAP", + "guid": "4ed90dae-2cc8-44c4-9b6b-781cbafe6c46", + "service": "AVS", "services": [ "VM", - "WAF" + "Monitor", + "WAF", + "AVS" ], "severity": "Medium", - "text": "Use Azure Update Manager to check the status of available updates for a single VM or multiple VMs and consider scheduling regular patching.", - "training": "https://learn.microsoft.com/training/modules/keep-your-virtual-machines-updated/?source=recommendations", + "text": "Deploy the Log Analytics Agents to Azure VMware Solution guest VM workloads", "waf": "Operations" }, { + "arm-service": "Microsoft.AVS/privateClouds", "checklist": "WAF checklist", - "guid": "76c8bcbf-45bb-4e60-ad8a-03e97778424d", - "link": "https://learn.microsoft.com/azure/sap/workloads/lama-installation", - "service": "SAP", + "guid": "589d457a-927c-4397-9d11-02cad6aae11e", + "service": "AVS", "services": [ - "SAP", - "WAF" + "AzurePolicy", + "WAF", + "VM", + "Backup", + "AVS" ], - "severity": "Low", - "text": "Optimize and manage SAP Basis operations by using SAP Landscape Management (LaMa). Use the SAP LaMa connector for Azure to relocate, copy, clone, and refresh SAP systems.", - "training": "https://learn.microsoft.com/training/modules/explore-azure-remote-management/?source=recommendations", + "severity": "Medium", + "text": "Ensure you have a documented and implemented backup policy and solution for Azure VMware Solution VM workloads", "waf": "Operations" }, { + "arm-service": "Microsoft.AVS/privateClouds", "checklist": "WAF checklist", - "guid": "14591147-5e39-4e53-89cc-cd979366bcda", - "link": "https://learn.microsoft.com/azure/sap/monitor/about-azure-monitor-sap-solutions", - "service": "SAP", + "guid": "ee29711b-d352-4caa-ab79-b198dab81932", + "service": "AVS", "services": [ - "SAP", + "Defender", "Monitor", - "SQL", + "WAF", + "AVS" + ], + "severity": "Medium", + "text": "Use Microsoft Defender for Cloud for compliance monitoring of workloads running on Azure VMware Solution", + "waf": "Security" + }, + { + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "WAF checklist", + "guid": "c9fc9d1b-b780-436f-9e6b-fbb9ed503547", + "service": "AVS", + "services": [ + "Defender", "WAF" ], "severity": "Medium", - "text": "Use Azure Monitor for SAP solutions to monitor your SAP workloads(SAP HANA, high-availability SUSE clusters, and SQL systems) on Azure. Consider supplementing Azure Monitor for SAP solutions with SAP Solution Manager.", - "training": "https://learn.microsoft.com/training/modules/implement-azure-monitoring-sap-workloads-azure-virtual-machines/?source=recommendations", - "waf": "Operations" + "text": "Are the applicable compliance baselines added to Microsoft Defender for Cloud", + "waf": "Security" }, { + "arm-service": "Microsoft.AVS/privateClouds", "checklist": "WAF checklist", - "guid": "2750ab1a-b039-4d95-b54c-7c8929cb107d", - "link": "https://learn.microsoft.com/azure/sap/workloads/vm-extension-for-sap", - "service": "SAP", + "guid": "cc447e82-6128-4a71-b0f1-cac6d9ef1d5e", + "service": "AVS", + "services": [ + "WAF", + "AVS" + ], + "severity": "High", + "text": "Was data residency evaluated when selecting Azure regions to use for Azure VMware Solution deployment", + "waf": "Security" + }, + { + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "WAF checklist", + "guid": "832e42e3-611c-4818-a0a0-bc510e43a18a", + "service": "AVS", "services": [ - "Entra", - "VM", - "Monitor", - "SAP", "WAF" ], "severity": "High", - "text": "Run a VM Extension for SAP check. VM Extension for SAP uses the assigned managed identity of a virtual machine (VM) to access VM monitoring and configuration data. The check ensures that all performance metrics in your SAP application come from the underlying Azure Extension for SAP.", - "training": "https://learn.microsoft.com/training/modules/configure-azure-enhanced-monitoring-extension-for-sap/?source=recommendations", - "waf": "Operations" + "text": "Are data processing implications (service provider / service consumer model) clear and documented", + "waf": "Security" }, { + "arm-service": "Microsoft.AVS/privateClouds", "checklist": "WAF checklist", - "guid": "5325ae52-5ba3-44d4-985e-2213ace7bb12", - "link": "https://learn.microsoft.com/azure/azure-monitor/logs/design-logs-deployment", - "service": "SAP", + "guid": "547c1747-dc56-4068-a714-435cd19dd244", + "service": "AVS", "services": [ - "AzurePolicy", "WAF" ], "severity": "Medium", - "text": "Use Azure Policy for access control and compliance reporting. Azure Policy provides the ability to enforce organization-wide settings to ensure consistent policy adherence and fast violation detection. ", - "training": "https://learn.microsoft.com/learn/paths/architect-infrastructure-operations/", - "waf": "Operations" + "text": "Consider using CMK (Customer Managed Key) for vSAN only if needed for compliance reason(s).", + "waf": "Security" }, { + "arm-service": "Microsoft.AVS/privateClouds", "checklist": "WAF checklist", - "guid": "523181aa-4174-4269-93ff-8ae7d7d47431", - "link": "https://learn.microsoft.com/azure/network-watcher/connection-monitor-overview", - "service": "SAP", + "guid": "e43a18a9-cd28-49ce-b6b1-7db8255461e2", + "service": "AVS", "services": [ - "NetworkWatcher", - "SAP", "Monitor", - "WAF" + "WAF", + "AVS" ], - "severity": "Medium", - "text": "Use Connection Monitor in Azure Network Watcher to monitor latency metrics for SAP databases and application servers. Or collect and display network latency measurements by using Azure Monitor.", - "training": "https://techcommunity.microsoft.com/t5/running-sap-applications-on-the/collecting-and-displaying-niping-network-latency-measurements/ba-p/1833979", + "severity": "High", + "text": "Create dashboards to enable core Azure VMware Solution monitoring insights", "waf": "Operations" }, { + "arm-service": "Microsoft.AVS/privateClouds", "checklist": "WAF checklist", - "guid": "73686af4-6791-4f89-95ad-a43324e13811", - "link": "https://github.com/Azure/SAP-on-Azure-Scripts-and-Utilities/tree/main/QualityCheck", - "service": "SAP", + "guid": "6b84ee5d-f47d-42d9-8881-b1cd5d1e54a2", + "service": "AVS", "services": [ - "SAP", - "VM", - "WAF" + "Monitor", + "WAF", + "AVS" ], - "severity": "Medium", - "text": "Perform a quality check for SAP HANA on the provisioned Azure infrastructure to verify that provisioned VMs comply with SAP HANA on Azure best practices.", + "severity": "High", + "text": "Create warning alerts for critical thresholds for automatic alerting on Azure VMware Solution performance (CPU >80%, Avg Memory >80%, vSAN >70%)", "waf": "Operations" }, { + "arm-service": "Microsoft.AVS/privateClouds", "checklist": "WAF checklist", - "guid": "616785d6-fa96-4c96-ad88-518f482734c8", - "link": "https://learn.microsoft.com/azure/sap/workloads/high-availability-zones", - "service": "SAP", + "guid": "9659e396-80e7-4828-ac93-5657d02bff45", + "service": "AVS", "services": [ - "SAP", - "Subscriptions", - "WAF" + "Monitor", + "WAF", + "AVS" ], "severity": "High", - "text": "For each Azure subscription, run a latency test on Azure availability zones before zonal deployment to choose low-latency zones for deployment of SAP on Azure.", - "training": "https://github.com/Azure/SAP-on-Azure-Scripts-and-Utilities/tree/main/AvZone-Latency-Test", - "waf": "Performance" + "text": "Ensure critical alert is created to monitor if vSAN consumption is below 75% as this is a support threshold from VMware", + "waf": "Operations" }, { + "arm-service": "Microsoft.AVS/privateClouds", "checklist": "WAF checklist", - "guid": "410adcba-db46-424f-a6c4-05ecde75c52e", - "link": "https://learn.microsoft.com/azure/advisor/advisor-how-to-improve-reliability", - "service": "SAP", + "guid": "64b0d934-a348-4726-be79-d6b5c3a36495", + "service": "AVS", "services": [ - "Storage", - "ASR", + "Monitor", "WAF" ], - "severity": "Medium", - "text": "Run the Resiliency Report to ensure that the configuration of the entire provisioned Azure infrastructure (Compute, Database, Networking, Storage, Site Recovery) complies with the configuration defined by Cloud Adaption Framework for Azure.", - "training": "https://learn.microsoft.com/training/paths/azure-well-architected-framework/", - "waf": "Reliability" + "severity": "High", + "text": "Ensure alerts are configured for Azure Service Health alerts and notifications", + "waf": "Operations" }, { + "arm-service": "Microsoft.AVS/privateClouds", "checklist": "WAF checklist", - "guid": "86ba2802-1459-4114-95e3-9e5309cccd97", - "link": "https://learn.microsoft.com/azure/sentinel/sap/deployment-overview", - "service": "SAP", + "guid": "b6abad38-aad5-43cc-99e1-d86667357c54", + "service": "AVS", "services": [ - "SAP", - "Sentinel", - "Monitor", - "WAF" + "Storage", + "WAF", + "AVS" ], "severity": "Medium", - "text": "Implement threat protection by using the Microsoft Sentinel solution for SAP. Use this solution to monitor your SAP systems and detect sophisticated threats throughout the business logic and application layers.", - "training": "https://learn.microsoft.com/training/modules/plan-microsoft-sentinel-deployment-sap/?source=recommendations", - "waf": "Security" + "text": "Configure Azure VMware Solution logging to be send to an Azure Storage account or Azure EventHub for processing", + "waf": "Operations" }, { + "arm-service": "Microsoft.AVS/privateClouds", "checklist": "WAF checklist", - "guid": "579266bc-ca27-45fa-a1ab-fe9d55d04c3c", - "link": "https://learn.microsoft.com/azure/cost-management-billing/costs/enable-tag-inheritance", - "service": "SAP", + "guid": "9674c5ed-85b8-459c-9733-be2b1a27b775", + "service": "AVS", "services": [ - "Cost", - "WAF" + "WAF", + "AVS" ], - "severity": "Medium", - "text": "Azure tagging can be leveraged to logically group and track resources, automate their deployments, and most importantly, provide visibility on the incurred costs.", - "training": "https://learn.microsoft.com/training/modules/analyze-costs-create-budgets-azure-cost-management/?source=recommendations", + "severity": "Low", + "text": "If deep insight in VMware vSphere is required: Is vRealize Operations and/or vRealize Network Insights used in the solution?", "waf": "Operations" }, { + "arm-service": "Microsoft.AVS/privateClouds", "checklist": "WAF checklist", - "guid": "04b8e5e5-13cb-4b22-af62-5a8ecfcf0337", - "link": "https://learn.microsoft.com/azure/virtual-network/virtual-network-test-latency?tabs=windows", - "service": "SAP", + "guid": "a91be1f3-88f0-43a4-b2cd-463cbbbc8682", + "service": "AVS", "services": [ - "Monitor", "VM", - "WAF" + "Storage", + "WAF", + "AzurePolicy" ], - "severity": "Low", - "text": "Use inter-VM latency monitoring for latency-sensitive applications.", - "waf": "Performance" + "severity": "High", + "text": "Ensure the vSAN storage policy for VM's is NOT the default storage policy as this policy applies thick provisioning", + "waf": "Operations" }, { + "arm-service": "Microsoft.AVS/privateClouds", "checklist": "WAF checklist", - "guid": "07e5ed53-3d96-43d8-87ea-631b77da5aba", - "link": "https://learn.microsoft.com/azure/sap/workloads/planning-guide-storage", - "service": "SAP", + "guid": "d9ef1d5e-832d-442e-9611-c818b0afbc51", + "service": "AVS", "services": [ - "SAP", - "Monitor", - "ASR", "WAF" ], "severity": "Medium", - "text": "Use Azure Site Recovery monitoring to maintain the health of the disaster recovery service for SAP application servers.", - "training": "https://learn.microsoft.com/training/modules/explore-azure-storage/?source=recommendations", - "waf": "Reliability" + "text": "Ensure vSphere content libraries are not placed on vSAN as vSAN is a finite resource", + "waf": "Operations" }, { + "arm-service": "Microsoft.AVS/privateClouds", "checklist": "WAF checklist", - "guid": "abb6af9c-982c-4cf1-83fb-329fafd1ee56", - "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/eslz-management-and-monitoring", - "service": "SAP", + "guid": "0e43a18a-9cd2-489b-bd6b-17db8255461e", + "service": "AVS", "services": [ - "SAP", "Storage", - "WAF" + "WAF", + "Backup" ], "severity": "Medium", - "text": "Exclude all the database file systems and executable programs from antivirus scans. Including them could lead to performance problems. Check with the database vendors for prescriptive details on the exclusion list. For example, Oracle recommends excluding /oracle//sapdata from antivirus scans.", - "waf": "Performance" + "text": "Ensure data repositories for the backup solution are stored outside of vSAN storage. Either in Azure native or on a disk pool-backed datastore", + "waf": "Operations" }, { + "arm-service": "Microsoft.AVS/privateClouds", "checklist": "WAF checklist", - "guid": "c027f893-f404-41a9-b33d-39d625a14964", - "link": "https://sapit-forme-prod.authentication.eu11.hana.ondemand.com/login", - "service": "SAP", + "guid": "2aee3453-aec8-4339-848b-262d6cc5f512", + "service": "AVS", "services": [ - "SAP", - "WAF" + "Arc", + "WAF", + "AVS" ], - "severity": "Low", - "text": "Consider collecting full database statistics for non-HANA databases after migration. For example, implement SAP note 1020260 - Delivery of Oracle statistics.", - "waf": "Performance" + "severity": "Medium", + "text": "Ensure workloads running on Azure VMware Solution are hybrid managed using Azure Arc for Servers (Arc for Azure VMware Solution is in preview)", + "waf": "Operations" }, { + "arm-service": "Microsoft.AVS/privateClouds", "checklist": "WAF checklist", - "guid": "fdafb1f5-3eee-4354-a8c9-deb8127ebc2e", - "link": "https://learn.microsoft.com/azure/virtual-machines/workloads/oracle/configure-oracle-asm", - "service": "SAP", + "guid": "925398e6-da9d-437d-ac43-bc6cd1d79a9b", + "service": "AVS", "services": [ - "SAP", - "Storage", - "WAF" + "Monitor", + "WAF", + "AVS" ], "severity": "Medium", - "text": "Consider using Oracle Automatic Storage Management (ASM) for all Oracle deployments that use SAP on Azure.", - "training": "https://learn.microsoft.com/training/paths/administer-infrastructure-resources-in-azure/?source=recommendations", - "waf": "Performance" + "text": "Ensure workloads running on Azure VMware Solution are monitored using Azure Log Analytics and Azure Monitor", + "waf": "Operations" }, { + "arm-service": "Microsoft.AVS/privateClouds", "checklist": "WAF checklist", - "guid": "33c5d5bf-daf3-4f0d-bd50-6010fdcec22e", - "link": "https://techcommunity.microsoft.com/t5/running-sap-applications-on-the/announcement-sap-on-azure-oracle-performance-efficiency-scripts/ba-p/3725178", - "service": "SAP", + "guid": "24604489-a8f4-42d7-ae78-cb6a33bd2a09", + "service": "AVS", "services": [ - "SAP", - "SQL", - "WAF" + "WAF", + "AVS" ], "severity": "Medium", - "text": "For SAP on Azure running Oracle, a collection of SQL scripts can help you diagnose performance problems. Automatic Workload Repository (AWR) reports contain valuable information for diagnosing problems in the Oracle system. We recommend that you run an AWR report during several sessions and choose peak times for it, to ensure broad coverage for the analysis.", - "training": "https://learn.microsoft.com/ja-jp/azure/well-architected/oracle-iaas/performance-efficiency", - "waf": "Performance" + "text": "Include workloads running on Azure VMware Solution in existing update management tooling or in Azure Update Management", + "waf": "Operations" }, { + "arm-service": "Microsoft.AVS/privateClouds", "checklist": "WAF checklist", - "guid": "d89fd98d-23e4-4b40-a92e-32db9365522c", - "link": "https://learn.microsoft.com/azure/site-recovery/site-recovery-monitor-and-troubleshoot", - "service": "SAP", + "guid": "17e7a8d9-0ae0-4e27-aee2-9711bd352caa", + "service": "AVS", "services": [ - "SAP", "Monitor", - "ASR", - "WAF" + "WAF", + "AVS", + "AzurePolicy" ], - "severity": "High", - "text": "Use Azure Site Recovery monitoring to maintain the health of the disaster recovery service for SAP application servers.", - "training": "https://learn.microsoft.com/training/modules/protect-on-premises-infrastructure-with-azure-site-recovery/?source=recommendations", + "severity": "Medium", + "text": "Use Azure Policy to onboard Azure VMware Solution workloads in the Azure Management, Monitoring and Security solutions", "waf": "Operations" }, { + "arm-service": "Microsoft.AVS/privateClouds", "checklist": "WAF checklist", - "guid": "5ba34d46-85e2-4213-ace7-bb122f7c95f0", - "link": "https://learn.microsoft.com/azure/ddos-protection/ddos-protection-overview", - "service": "SAP", + "guid": "aee3553a-fc83-4392-98b2-62d6cc5f5129", + "service": "AVS", "services": [ - "AppGW", - "AzurePolicy", - "WAF" + "Defender", + "WAF", + "AVS" ], "severity": "Medium", - "text": "For secure delivery of HTTP/S apps, use Application Gateway v2 and ensure that WAF protection and policies are enabled.", - "training": "https://learn.microsoft.com/training/modules/introduction-azure-web-application-firewall/", + "text": "Ensure workloads running on Azure VMware Solution are onboarded to Microsoft Defender for Cloud", "waf": "Security" }, { + "arm-service": "Microsoft.AVS/privateClouds", "checklist": "WAF checklist", - "guid": "fa9d30bc-1b82-4e4b-bfdf-6b017938b9e6", - "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/eslz-network-topology-and-connectivity", - "service": "SAP", + "guid": "25398e6d-b9d3-47da-a43b-c6cd1d79a9b2", + "service": "AVS", "services": [ - "DNS", - "SAP", - "VM", - "WAF" + "WAF", + "Backup" ], "severity": "Medium", - "text": "If the virtual machine's DNS or virtual name is not changed during migration to Azure, Background DNS and virtual names connect many system interfaces in the SAP landscape, and customers are only sometimes aware of the interfaces that developers define over time. Connection challenges arise between various systems when virtual or DNS names change after migrations, and it's recommended to retain DNS aliases to prevent these types of difficulties.", - "training": "https://learn.microsoft.com/training/modules/explore-azure-networking/4-explore-name-resolution", - "waf": "Operations" + "text": "Ensure backups are not stored on vSAN as vSAN is a finite resource", + "waf": "Reliability" }, { + "arm-service": "Microsoft.AVS/privateClouds", "checklist": "WAF checklist", - "guid": "a2858f78-105b-4f52-b7a9-5b0f4439743b", - "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/eslz-network-topology-and-connectivity", - "service": "SAP", + "guid": "5e6bfbb9-ed50-4354-9cc4-47e826028a71", + "service": "AVS", "services": [ - "DNS", - "SAP", - "VNet", "WAF" ], "severity": "Medium", - "text": "Use different DNS zones to distinguish each environment (sandbox, development, preproduction, and production) from each other. The exception is for SAP deployments with their own VNet; here, private DNS zones might not be necessary.", - "training": "https://learn.microsoft.com/training/modules/explore-azure-networking/4-explore-name-resolution", - "waf": "Operations" + "text": "Have all DR solutions been considered and a solution that is best for your business been decided upon? [SRM/JetStream/Zerto/Veeam/...]", + "waf": "Reliability" }, { + "arm-service": "Microsoft.AVS/privateClouds", "checklist": "WAF checklist", - "guid": "a3592829-e6e2-4061-9368-6af46791f893", - "link": "https://learn.microsoft.com/azure/virtual-network/virtual-network-peering-overview", - "service": "SAP", + "guid": "f0f1cac6-d9ef-41d5-b832-d42e3611c818", + "service": "AVS", "services": [ - "SAP", - "ACR", - "VNet", + "ASR", "WAF" ], "severity": "Medium", - "text": "Local and global VNet peering provide connectivity and are the preferred approaches to ensure connectivity between landing zones for SAP deployments across multiple Azure regions", - "training": "https://learn.microsoft.com/training/modules/configure-vnet-peering/?source=recommendations", + "text": "Use Azure Site Recovery when the Disaster Recovery technology is native Azure IaaS", "waf": "Reliability" }, { + "arm-service": "Microsoft.AVS/privateClouds", "checklist": "WAF checklist", - "guid": "41742694-3ff8-4ae7-b7d4-743176c8bcbf", - "link": "https://learn.microsoft.com/azure/sap/workloads/planning-guide", - "service": "SAP", + "guid": "b0afbc51-0e43-4a18-a9cd-289bed6b17db", + "service": "AVS", "services": [ - "SAP", - "NVA", "WAF" ], "severity": "High", - "text": "It is not supported to deploy any NVA between SAP application and SAP Database server", - "training": "https://me.sap.com/notes/2731110", - "waf": "Performance" + "text": "Use Automated recovery plans with either of the Disaster solutions, avoid manual tasks as much as possible", + "waf": "Reliability" }, { + "arm-service": "Microsoft.AVS/privateClouds", "checklist": "WAF checklist", - "guid": "7d4bc7d2-c34a-452e-8f1d-6ae3c8eafcc3", - "link": "https://learn.microsoft.com/training/modules/introduction-azure-virtual-wan/?source=recommendations", - "service": "SAP", + "guid": "8255461e-2aee-4345-9aec-8339248b262d", + "service": "AVS", "services": [ - "VWAN", - "ACR", - "SAP", + "ASR", "WAF" ], "severity": "Medium", - "text": "Use Virtual WAN for Azure deployments in new, large, or global networks where you need global transit connectivity across Azure regions and on-premises locations. With this approach, you won't need to manually set up transitive routing for Azure networking, and you can follow a standard for SAP on Azure deployments.", - "training": "https://learn.microsoft.com/azure/virtual-wan/virtual-wan-about", - "waf": "Operations" + "text": "Use the geopolitical region pair as the secondary disaster recovery environment", + "waf": "Reliability" }, { + "arm-service": "Microsoft.AVS/privateClouds", "checklist": "WAF checklist", - "guid": "0cedb1f6-ae6c-492b-8b17-8061f50b16d3", - "link": "https://learn.microsoft.com/azure/well-architected/services/networking/network-virtual-appliances/reliability", - "service": "SAP", + "guid": "6cc5f512-9253-498e-9da9-d37dac43bc6c", + "service": "AVS", "services": [ - "VNet", - "NVA", "WAF" ], - "severity": "Medium", - "text": "Consider deploying network virtual appliances (NVAs) between regions only if partner NVAs are used. NVAs between regions or VNets aren't required if native NVAs are present. When you're deploying partner networking technologies and NVAs, follow the vendor's guidance to verify conflicting configurations with Azure networking.", - "training": "https://learn.microsoft.com/training/modules/control-network-traffic-flow-with-routes/?source=recommendations", - "waf": "Operations" + "severity": "High", + "text": "Use 2 different address spaces between the regions, for example: 10.0.0.0/16 and 192.168.0.0/16 for the different regions", + "waf": "Reliability" }, { + "arm-service": "Microsoft.AVS/privateClouds", "checklist": "WAF checklist", - "guid": "facc08c6-ea95-4641-91cd-fa09e573adbd", - "link": "https://learn.microsoft.com/azure/architecture/networking/hub-spoke-vwan-architecture", - "service": "SAP", + "guid": "d1d79a9b-2460-4448-aa8f-42d78e78cb6a", + "service": "AVS", "services": [ "NVA", - "SAP", - "VNet", "WAF", - "VWAN" + "AVS", + "ExpressRoute" ], "severity": "Medium", - "text": "Virtual WAN manages connectivity between spoke VNets for virtual-WAN-based topologies (no need to set up user-defined routing [UDR] or NVAs), and maximum network throughput for VNet-to-VNet traffic in the same virtual hub is 50 gigabits per second. If necessary, SAP landing zones can use VNet peering to connect to other landing zones and overcome this bandwidth limitation.", - "training": "https://learn.microsoft.com/training/modules/hub-and-spoke-network-architecture/?source=recommendations", - "waf": "Operations" + "text": "Will ExpressRoute Global Reach be used for connectivity between the primary and secondary Azure VMware Solution Private Clouds or is routing done through network virtual appliances?", + "waf": "Reliability" }, { + "arm-service": "Microsoft.AVS/privateClouds", "checklist": "WAF checklist", - "guid": "82734c88-6ba2-4802-8459-11475e39e530", - "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/ready/azure-best-practices/plan-for-ip-addressing", - "service": "SAP", + "guid": "33bd2a09-17e7-4a8d-a0ae-0e27cee29711", + "service": "AVS", "services": [ - "SAP", - "VM", - "WAF" + "WAF", + "Backup" ], - "severity": "High", - "text": "Public IP assignment to VM running SAP Workload is not recommended.", - "training": "https://learn.microsoft.com/training/modules/design-ip-addressing-for-azure/?source=recommendations", - "waf": "Security" + "severity": "Medium", + "text": "Have all Backup solutions been considered and a solution that is best for your business been decided upon? [ MABS/CommVault/Metallic.io/Veeam/�. ]", + "waf": "Reliability" }, { + "arm-service": "Microsoft.AVS/privateClouds", "checklist": "WAF checklist", - "guid": "9cccd979-366b-4cda-8750-ab1ab039d95d", - "link": "https://learn.microsoft.com/training/modules/protect-on-premises-infrastructure-with-azure-site-recovery/?source=recommendations", - "service": "SAP", + "guid": "bd352caa-ab79-4b18-adab-81932c9fc9d1", + "service": "AVS", "services": [ - "ASR", - "WAF" + "WAF", + "AVS", + "Backup" ], - "severity": "High", - "text": "Consider reserving IP address on DR side when configuring ASR", - "training": "https://learn.microsoft.com/learn/paths/architect-network-infrastructure/", - "waf": "Operations" + "severity": "Medium", + "text": "Deploy your backup solution in the same region as your Azure VMware Solution private cloud", + "waf": "Reliability" }, { + "arm-service": "Microsoft.AVS/privateClouds", "checklist": "WAF checklist", - "guid": "54c7c892-9cb1-407d-9325-ae525ba34d46", - "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/ready/azure-best-practices/plan-for-ip-addressing", - "service": "SAP", + "guid": "bb77036f-5e6b-4fbb-aed5-03547cc447e8", + "service": "AVS", "services": [ - "WAF" + "WAF", + "Backup" ], - "severity": "High", - "text": "Avoid using overlapping IP address ranges for production and DR sites.", - "training": "https://learn.microsoft.com/training/modules/design-ip-addressing-for-azure/?source=recommendations", - "waf": "Operations" + "severity": "Medium", + "text": "Deploy your backup solution outside of vSan, on Azure native components", + "waf": "Reliability" }, { + "arm-service": "Microsoft.AVS/privateClouds", "checklist": "WAF checklist", - "guid": "6e154e3a-a359-4282-ae6e-206173686af4", - "link": "https://learn.microsoft.com/azure/azure-netapp-files/azure-netapp-files-delegate-subnet", - "service": "SAP", + "guid": "26028a71-f0f1-4cac-9d9e-f1d5e832d42e", + "service": "AVS", + "services": [ + "WAF", + "AVS" + ], + "severity": "Low", + "text": "Is a process in place to request a restore of the VMware components managed by the Azure Platform?", + "waf": "Reliability" + }, + { + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "WAF checklist", + "guid": "4604489a-8f42-4d78-b78c-b7a33bd2a0a1", + "service": "AVS", "services": [ - "Storage", - "VNet", "WAF" ], - "severity": "Medium", - "text": "While Azure does help you to create multiple delegated subnets in a VNet, only one delegated subnet can exist in a VNet for Azure NetApp Files. Attempts to create a new volume will fail if you use more than one delegated subnet for Azure NetApp Files.", - "training": "https://learn.microsoft.com/azure/azure-netapp-files/azure-netapp-files-network-topologies?source=recommendations", + "severity": "Low", + "text": "For manual deployments, all configuration and deployments must be documented", "waf": "Operations" }, { + "arm-service": "Microsoft.AVS/privateClouds", "checklist": "WAF checklist", - "guid": "d8a03e97-7784-424d-9167-85d6fa96c96a", - "link": "https://learn.microsoft.com/azure/well-architected/services/networking/azure-firewall?toc=%2Fazure%2Ffirewall%2Ftoc.json&bc=%2Fazure%2Ffirewall%2Fbreadcrumb%2Ftoc.json", - "service": "SAP", + "guid": "7e7a8d90-ae0e-437c-be29-711bd352caaa", + "service": "AVS", "services": [ - "Firewall", - "WAF" + "WAF", + "AVS" ], - "severity": "Medium", - "text": "Use Azure Firewall to govern Azure outbound traffic to the internet, non-HTTP/S inbound connections, and East/West traffic filtering (if the organization requires it)", - "training": "https://learn.microsoft.com/training/paths/secure-networking-infrastructure/", - "waf": "Security" + "severity": "Low", + "text": "For manual deployments, consider implementing resource locks to prevent accidental actions on your Azure VMware Solution Private Cloud", + "waf": "Operations" }, { + "arm-service": "Microsoft.AVS/privateClouds", "checklist": "WAF checklist", - "guid": "91a65e40-be90-45b3-9f73-f3edbf8dc324", - "link": "https://learn.microsoft.com/azure/sap/workloads/expose-sap-process-orchestration-on-azure", - "service": "SAP", + "guid": "b79b198d-ab81-4932-a9fc-9d1bb78036f5", + "service": "AVS", "services": [ - "SAP", - "AppGW", "WAF" ], - "severity": "Medium", - "text": "Application Gateway and Web Application Firewall have limitations when Application Gateway serves as a reverse proxy for SAP web apps, as shown in the comparison between Application Gateway, SAP Web Dispatcher, and other third-party services.", - "training": "https://help.sap.com/docs/SUPPORT_CONTENT/si/3362959506.html", - "waf": "Security" + "severity": "Low", + "text": "For automated deployments, deploy a minimal private cloud and scale as needed", + "waf": "Operations" }, { + "arm-service": "Microsoft.AVS/privateClouds", "checklist": "WAF checklist", - "guid": "5e39e530-9ccc-4d97-a366-bcda2750ab1a", - "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/ag-overview", - "service": "SAP", + "guid": "e6bfbb9e-d503-4547-ac44-7e826128a71f", + "service": "AVS", "services": [ - "FrontDoor", - "ACR", - "AzurePolicy", "WAF" ], - "severity": "Medium", - "text": "Use Azure Front Door and WAF policies to provide global protection across Azure regions for inbound HTTP/S connections to a landing zone.", - "training": "https://learn.microsoft.com/training/paths/secure-application-delivery/", - "waf": "Security" + "severity": "Low", + "text": "For automated deployments, request or reserve quota prior to starting the deployment", + "waf": "Operations" }, { + "arm-service": "Microsoft.AVS/privateClouds", "checklist": "WAF checklist", - "guid": "b039d95d-54c7-4c89-89cb-107d5325ae52", - "link": "https://learn.microsoft.com/azure/web-application-firewall/afds/afds-overview", - "service": "SAP", + "guid": "0f1cac6d-9ef1-4d5e-a32e-42e3611c818b", + "service": "AVS", "services": [ - "FrontDoor", - "AppGW", - "AzurePolicy", - "WAF" + "WAF", + "AzurePolicy" ], - "severity": "Medium", - "text": "Take advantage of Web Application Firewall policies in Azure Front Door when you're using Azure Front Door and Application Gateway to protect HTTP/S applications. Lock down Application Gateway to receive traffic only from Azure Front Door.", - "training": "https://learn.microsoft.com/training/modules/introduction-azure-web-application-firewall/?source=recommendations", - "waf": "Security" + "severity": "Low", + "text": "For automated deployment, ensure that relevant resource locks are created through the automation or through Azure Policy for proper governance", + "waf": "Operations" }, { + "arm-service": "Microsoft.AVS/privateClouds", "checklist": "WAF checklist", - "guid": "5ada4332-4e13-4811-9231-81aa41742694", - "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/ag-overview", - "service": "SAP", + "guid": "e2cc95d4-8c6b-4791-bca0-f6c56589e558", + "service": "AVS", "services": [ - "LoadBalancer", - "AppGW", - "WAF" + "WAF", + "AKV" ], - "severity": "Medium", - "text": "Use a web application firewall to scan your traffic when it's exposed to the internet. Another option is to use it with your load balancer or with resources that have built-in firewall capabilities like Application Gateway or third-party solutions.", - "training": "https://learn.microsoft.com/training/modules/introduction-azure-web-application-firewall/?source=recommendations", - "waf": "Security" + "severity": "Low", + "text": "Implement human understandable names for ExR authorization keys to allow for easy identification of the keys purpose/use", + "waf": "Operations" }, { + "arm-service": "Microsoft.AVS/privateClouds", "checklist": "WAF checklist", - "guid": "e73de7d5-6f36-4217-a526-e1a621ecddde", - "link": "https://learn.microsoft.com/azure/frontdoor/front-door-overview", - "service": "SAP", + "guid": "255461e2-aee3-4553-afc8-339248b262d6", + "service": "AVS", "services": [ - "VWAN", - "ACR", - "SAP", - "WAF" + "WAF", + "AVS", + "ExpressRoute", + "AKV" ], - "severity": "Medium", - "text": "Use Virtual WAN for Azure deployments in new, large, or global networks where you need global transit connectivity across Azure regions and on-premises locations. With this approach, you won't need to manually set up transitive routing for Azure networking, and you can follow a standard for SAP on Azure deployments.", - "training": "https://learn.microsoft.com/training/modules/explore-azure-networking/10-explore-azure-front-door", - "waf": "Performance" + "severity": "Low", + "text": "Use Key vault to store secrets and authorization keys when separate Service Principles are used for deploying Azure VMware Solution and ExpressRoute", + "waf": "Operations" }, { + "arm-service": "Microsoft.AVS/privateClouds", "checklist": "WAF checklist", - "guid": "3c536a3e-1b6b-4e87-95ca-15edb47251c0", - "link": "https://learn.microsoft.com/azure/virtual-network/vnet-integration-for-azure-services", - "service": "SAP", + "guid": "cc5f5129-2539-48e6-bb9d-37dac43bc6cd", + "service": "AVS", "services": [ - "PrivateLink", - "Backup", - "Storage", - "ACR", - "VNet", - "WAF" + "WAF", + "AVS" ], - "severity": "Medium", - "text": "To prevent data leakage, use Azure Private Link to securely access platform as a service resources like Azure Blob Storage, Azure Files, Azure Data Lake Storage Gen2, Azure Data Factory, and more. Azure Private Endpoint can also help to secure traffic between VNets and services like Azure Storage, Azure Backup, and more. Traffic between your VNet and the Private Endpoint enabled service travels across the Microsoft global network, which prevents its exposure to the public internet.", - "training": "https://learn.microsoft.com/training/modules/design-implement-private-access-to-azure-services/?source=recommendations", - "waf": "Security" + "severity": "Low", + "text": "Define resource dependencies for serializing actions in IaC when many resources need to be deployed in/on Azure VMware Solution as Azure VMware Solution only supports a limited number of parallel operations.", + "waf": "Operations" }, { + "arm-service": "Microsoft.AVS/privateClouds", "checklist": "WAF checklist", - "guid": "85e2213a-ce7b-4b12-8f7c-95f06e154e3a", - "link": "https://learn.microsoft.com/azure/virtual-network/accelerated-networking-overview?tabs=redhat", - "service": "SAP", + "guid": "1d79a9b2-4604-4489-a8f4-2d78e78cb7a3", + "service": "AVS", "services": [ - "SAP", - "VM", "WAF" ], - "severity": "High", - "text": "Make sure that Azure accelerated networking is enabled on the VMs used in the SAP application and DBMS layers.", - "training": "https://learn.microsoft.com/training/paths/azure-fundamentals-describe-azure-architecture-services/?source=recommendations", - "waf": "Performance" + "severity": "Low", + "text": "When performing automated configuration of NSX-T segments with a single Tier-1 gateway, use Azure Portal APIs instead of NSX-Manager APIs", + "waf": "Operations" }, { + "arm-service": "Microsoft.AVS/privateClouds", "checklist": "WAF checklist", - "guid": "3ff8ae7d-7d47-4431-96c8-bcbf45bbe609", - "link": "https://learn.microsoft.com/azure/load-balancer/load-balancer-multivip-overview", - "service": "SAP", + "guid": "3bd2a0a1-7e7a-48d9-8ae0-e37cee29711b", + "service": "AVS", "services": [ - "LoadBalancer", - "WAF" + "WAF", + "Subscriptions", + "AVS" ], "severity": "Medium", - "text": "Make sure that internal deployments for Azure Load Balancer are set up to use Direct Server Return (DSR). This setting (Enabling Floating IP) will reduce latency when internal load balancer configurations are used for high-availability configurations on the DBMS layer.", - "training": "https://learn.microsoft.com/ja-jp/training/modules/load-balancing-non-https-traffic-azure/?source=recommendations", - "waf": "Security" + "text": "When intending to use automated scale-out, be sure to apply for sufficient Azure VMware Solution quota for the subscriptions running Azure VMware Solution", + "waf": "Performance" }, { + "arm-service": "Microsoft.AVS/privateClouds", "checklist": "WAF checklist", - "guid": "6791f893-5ada-4433-84e1-3811523181aa", - "link": "https://learn.microsoft.com/azure/virtual-network/network-security-group-how-it-works", - "service": "SAP", + "guid": "d352caaa-b79b-4198-bab8-1932c9fc9d1b", + "service": "AVS", "services": [ - "VM", - "SAP", - "VNet", - "WAF" + "Storage", + "WAF", + "AzurePolicy" ], "severity": "Medium", - "text": "You can use application security group (ASG) and NSG rules to define network security access-control lists between the SAP application and DBMS layers. ASGs group virtual machines to help manage their security.", - "training": "https://learn.microsoft.com/training/modules/configure-network-security-groups/?source=recommendations", - "waf": "Security" + "text": "When intending to use automated scale-in, be sure to take storage policy requirements into account before performing such action", + "waf": "Performance" }, { + "arm-service": "Microsoft.AVS/privateClouds", "checklist": "WAF checklist", - "guid": "45bbe609-d8a0-43e9-9778-424d616785d6", - "link": "https://me.sap.com/notes/2015553", - "service": "SAP", + "guid": "b78036f5-e6bf-4bb9-bd50-3547cc447e82", + "service": "AVS", "services": [ - "SAP", - "VNet", "WAF" - ], - "severity": "High", - "text": "Placing of the SAP application layer and SAP DBMS in different Azure VNets that aren't peered isn't supported.", - "training": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/eslz-network-topology-and-connectivity", + ], + "severity": "Medium", + "text": "Scaling operations always need to be serialized within a single SDDC as only one scale operation can be performed at a time (even when multiple clusters are used)", "waf": "Performance" }, { + "arm-service": "Microsoft.AVS/privateClouds", "checklist": "WAF checklist", - "guid": "fa96c96a-d885-418f-9827-34c886ba2802", - "link": "https://learn.microsoft.com/azure/sap/workloads/proximity-placement-scenarios", - "service": "SAP", + "guid": "bf15bce2-19e4-4a0e-a588-79424d226786", + "service": "AVS", "services": [ - "SAP", "WAF" ], "severity": "Medium", - "text": "For optimal network latency with SAP applications, consider using Azure proximity placement groups.", - "training": "https://learn.microsoft.com/azure/virtual-machines/co-location#planned-maintenance-and-proximity-placement-groups", + "text": "Consider and validate scaling operations on 3rd party solutions used in the architecture (supported or not)", "waf": "Performance" }, { + "arm-service": "Microsoft.AVS/privateClouds", "checklist": "WAF checklist", - "guid": "18c8b61c-855a-4405-b6ed-266455e4f4ce", - "link": "https://me.sap.com/notes/2015553", - "service": "SAP", + "guid": "d20b56c5-7be5-4851-a0f8-3835c586cb29", + "service": "AVS", "services": [ - "SAP", "WAF" ], - "severity": "High", - "text": "It is NOT supported at all to run an SAP Application Server layer and DBMS layer split between on-premise and Azure. Both layers need to completely reside either on-premise or in Azure.", - "training": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/eslz-network-topology-and-connectivity", + "severity": "Medium", + "text": "Define and enforce scale in/out maximum limits for your environment in the automations", "waf": "Performance" }, { + "arm-service": "Microsoft.AVS/privateClouds", "checklist": "WAF checklist", - "guid": "b65c878b-4b14-4f4e-92d8-d873936493f2", - "link": "https://me.sap.com/notes/2015553", - "service": "SAP", + "guid": "1dc15a1c-075e-4e9f-841a-cccd579376bc", + "service": "AVS", "services": [ - "SAP", - "VNet", - "Cost", + "Monitor", "WAF" ], - "severity": "High", - "text": "It isn't recommended to host the database management system (DBMS) and application layers of SAP systems in different VNets and connect them with VNet peering because of the substantial costs that excessive network traffic between the layers can produce. Recommend using subnets within the Azure virtual network to separate the SAP application layer and DBMS layer.", - "training": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/eslz-network-topology-and-connectivity", - "waf": "Cost" + "severity": "Medium", + "text": "Implement monitoring rules to monitor automated scaling operations and monitor success and failure to enable appropriate (automated) responses", + "waf": "Operations" }, { + "arm-service": "Microsoft.AVS/privateClouds", "checklist": "WAF checklist", - "guid": "402a9846-d515-4061-aff8-cd30088693fa", - "link": "https://learn.microsoft.com/azure/sap/workloads/high-availability-guide-rhel", - "service": "SAP", + "guid": "c5972cd4-cd21-4b07-9036-f5e6b4bfd3d5", + "link": "https://learn.microsoft.com/azure/active-directory/app-proxy/application-proxy#how-application-proxy-works", + "service": "AVS", "services": [ - "LoadBalancer", + "VM", "WAF" ], "severity": "High", - "text": "If using Load Balancer with Linux guest operating systems, check that the Linux network parameter net.ipv4.tcp_timestamps is set to 0.", - "training": "https://learn.microsoft.com/training/modules/implement-ha-sap-netweaver-anydb/?source=recommendations", - "waf": "Performance" + "text": "When using MON, be aware of the limits of simulataneously configured VMs (MON Limit for HCX [400 - standard, 1000 - Larger appliance])", + "training": "https://learn.microsoft.com/learn/modules/configure-azure-ad-application-proxy/", + "waf": "Reliability" }, { + "arm-service": "Microsoft.AVS/privateClouds", "checklist": "WAF checklist", - "guid": "87585797-5551-4d53-bb7d-a94ee415734d", - "link": "https://learn.microsoft.com/azure/sap/workloads/rise-integration", - "service": "SAP", + "guid": "be1f38cf-03a8-422b-b463-cbbbc8ac299e", + "link": "https://learn.microsoft.com/azure/active-directory/app-proxy/application-proxy#how-application-proxy-works", + "service": "AVS", "services": [ - "SAP", - "VNet", "WAF" ], - "severity": "Medium", - "text": "For SAP RISE/ECS deployments, virtual peering is the preferred way to establish connectivity with customer's existing Azure environment. Both the SAP vnet and customer vnet(s) are protected with network security groups (NSG), enabling communication on SAP and database ports through the vnet peering", - "waf": "Security" + "severity": "High", + "text": "When using MON, you cannot enable MON on more than 100 Network extensions", + "training": "https://learn.microsoft.com/learn/paths/implement-applications-external-access-azure-ad/", + "waf": "Reliability" }, { + "arm-service": "Microsoft.AVS/privateClouds", "checklist": "WAF checklist", - "guid": "ff5136bd-dcf1-4d2b-ae52-39333efdf45a", - "link": "https://learn.microsoft.com/azure/backup/sap-hana-database-about", - "service": "SAP", + "guid": "bc91a43d-90da-4e2c-a881-4706f7c1cbaf", + "service": "AVS", "services": [ - "SAP", - "Backup", - "VM", - "WAF" + "WAF", + "VPN" ], - "severity": "High", - "text": "Review SAP HANA database backups for Azure VMs.", - "waf": "Cost" + "severity": "Medium", + "text": "If using a VPN connection for migrations, adjust your MTU size accordingly.", + "waf": "Performance" }, { + "arm-service": "Microsoft.AVS/privateClouds", "checklist": "WAF checklist", - "guid": "cafde29d-a0af-4bcd-87c0-0f299d63f0e8", - "link": "https://learn.microsoft.com/azure/site-recovery/site-recovery-monitor-and-troubleshoot", - "service": "SAP", + "guid": "e614658d-d457-4e92-9139-b821102cad6e", + "service": "AVS", "services": [ - "SAP", - "Monitor", - "ASR", "WAF" ], "severity": "Medium", - "text": "Review Site Recovery built-in monitoring, where used for SAP.", - "waf": "Cost" + "text": "For low connectivity regions connecting into Azure (500Mbps or less), considering deploying the HCX WAN optimization appliance", + "waf": "Performance" }, { + "arm-service": "Microsoft.AVS/privateClouds", "checklist": "WAF checklist", - "guid": "82d7b8de-d3f1-44a0-830b-38e200e82acf", - "link": "https://help.sap.com/docs/SAP_HANA_PLATFORM/c4d7c773af4a4e5dbebb6548d6e2d4f4/e3111d2ebb5710149510cc120646bf3f.html?locale=en-US", - "service": "SAP", + "guid": "ae01e6e8-43e5-42f4-922d-928c1b1cd521", + "service": "AVS", "services": [ - "SAP", - "Monitor", "WAF" ], - "severity": "High", - "text": "Review the Monitoring the SAP HANA System Landscape guidance.", - "waf": "Operations" + "severity": "Medium", + "text": "Ensure that migrations are started from the on-premises appliance and NOT from the Cloud appliance (do NOT perform a reverse migration)", + "waf": "Reliability" }, { + "arm-service": "Microsoft.AVS/privateClouds", "checklist": "WAF checklist", - "guid": "c823873a-2bec-4c2a-b684-a1ce8ae80efd", - "link": "https://learn.microsoft.com/azure/virtual-machines/workloads/oracle/oracle-database-backup-strategies", - "service": "SAP", + "guid": "e54a29a9-de39-4ac0-b7c2-8dc935657202", + "link": "https://learn.microsoft.com/azure/web-application-firewall/afds/waf-front-door-policy-settings", + "service": "AVS", "services": [ - "Backup", "VM", - "WAF" + "Storage", + "WAF", + "AVS" ], "severity": "Medium", - "text": "Review Oracle Database in Azure Linux VM backup strategies.", - "waf": "Operations" + "text": "When Azure Netapp Files is used to extend storage for Azure VMware Solution,consider using this as a VMware datastore instead of attaching directly to a VM.", + "waf": "Reliability" }, { + "arm-service": "Microsoft.AVS/privateClouds", "checklist": "WAF checklist", - "guid": "2943b6d8-1d31-4e19-ade7-78e6b26d1962", - "link": "https://learn.microsoft.com/sql/relational-databases/tutorial-use-azure-blob-storage-service-with-sql-server-2016?view=sql-server-ver16", - "service": "SAP", + "guid": "bff4564b-0d93-44a3-98b2-63e7dd60513a", + "link": "https://learn.microsoft.com/azure/frontdoor/best-practices#avoid-combining-traffic-manager-and-front-door", + "service": "AVS", "services": [ "Storage", - "SQL", - "WAF" + "WAF", + "ExpressRoute" ], "severity": "Medium", - "text": "Review the use of Azure Blob Storage with SQL Server 2016.", - "waf": "Operations" + "text": "Ensure that a dedicated ExpressRoute Gateway is being used for external data storage solutions", + "waf": "Reliability" }, { + "arm-service": "Microsoft.AVS/privateClouds", "checklist": "WAF checklist", - "guid": "b82e650f-676d-417d-994d-fc33ca54ec14", - "link": "https://learn.microsoft.com/azure/azure-sql/virtual-machines/windows/automated-backup?view=azuresql", - "service": "SAP", + "guid": "3649906e-bad3-48ea-b53c-c7de1d8aaab3", + "link": "https://learn.microsoft.com/azure/frontdoor/best-practices#use-the-same-domain-name-on-front-door-and-your-origin", + "service": "AVS", "services": [ - "Backup", - "VM", - "WAF" + "Storage", + "WAF", + "ExpressRoute" ], "severity": "Medium", - "text": "Review the use of Automated Backup v2 for Azure VMs.", - "waf": "Operations" + "text": "Ensure that FastPath is enabled on the ExpressRoute Gateway that is being used for external data storage solutions", + "waf": "Reliability" }, { + "arm-service": "Microsoft.AVS/privateClouds", "checklist": "WAF checklist", - "guid": "347c2dcc-e6eb-4b04-80c5-628b171aa62d", - "service": "SAP", + "guid": "571549ab-8153-4d89-b89d-c7b33be2b1a2", + "link": "https://learn.microsoft.com/azure/frontdoor/best-practices#disable-health-probes-when-theres-only-one-origin-in-an-origin-group", + "service": "AVS", "services": [ + "ASR", "WAF" ], "severity": "High", - "text": "Enabling Write accelerator for M series when using premium disks(V1)", - "waf": "Operations" + "text": "If using stretched cluster, ensure that your selected Disaster Recovery solution is supported by the vendor", + "waf": "Reliability" }, { + "arm-service": "Microsoft.AVS/privateClouds", "checklist": "WAF checklist", - "guid": "b96512cf-996f-4b17-b9b8-6b16db1a2a94", - "link": "https://github.com/Azure/SAP-on-Azure-Scripts-and-Utilities/tree/main/AvZone-Latency-Test", - "service": "SAP", + "guid": "4c486b6d-8bdc-4059-acf7-5ee8a1309888", + "link": "https://learn.microsoft.com/azure/frontdoor/best-practices#select-good-health-probe-endpoints", + "service": "AVS", "services": [ "WAF" ], - "severity": "Medium", - "text": "Test availability zone latency.", - "waf": "Performance" + "severity": "High", + "text": "If using stretched cluster, ensure that the SLA provided will meet your requirements", + "waf": "Reliability" }, { + "arm-service": "Microsoft.AVS/privateClouds", "checklist": "WAF checklist", - "guid": "9fd7ffd4-da11-49f6-a374-8d03e94c511d", - "link": "https://support.sap.com/en/offerings-programs/support-services/earlywatch-alert.html", - "service": "SAP", + "guid": "9579d66b-896d-471f-a6ca-7be9955d04c3", + "link": "https://learn.microsoft.com/azure/frontdoor/best-practices#use-head-health-probes", + "service": "AVS", "services": [ - "SAP", - "WAF" + "WAF", + "ExpressRoute" ], - "severity": "Medium", - "text": "Activate SAP EarlyWatch Alert for all SAP components.", - "training": "https://help.sap.com/docs/SUPPORT_CONTENT/techops/3362700736.html", - "waf": "Performance" + "severity": "High", + "text": "If using stretched cluster, ensure that both ExpressRoute circuits are connected to your connectivity hub.", + "waf": "Reliability" }, { + "arm-service": "Microsoft.AVS/privateClouds", "checklist": "WAF checklist", - "guid": "b9b140cf-413a-483d-aad2-8802c4e3c017", - "link": "https://techcommunity.microsoft.com/t5/running-sap-applications-on-the/sap-on-azure-general-update-march-2019/ba-p/377456", - "service": "SAP", + "guid": "c49d987c-b3d1-4325-aa12-4b6e4d0685ed", + "link": "https://learn.microsoft.com/azure/nat-gateway/nat-overview#outbound-connectivity", + "service": "AVS", "services": [ - "SAP", - "WAF" + "WAF", + "ExpressRoute" ], - "severity": "Medium", - "text": "Review SAP application server to database server latency using SAP ABAPMeter report /SSA/CAT.", - "training": "https://me.sap.com/notes/0002879613", - "waf": "Performance" + "severity": "High", + "text": "If using stretched cluster, ensure that both ExpressRoute circuits have GlobalReach enabled.", + "waf": "Reliability" }, { + "arm-service": "Microsoft.AVS/privateClouds", "checklist": "WAF checklist", - "guid": "62fbf0f8-51db-49e1-a961-bb5df7a35f80", - "service": "SAP", + "guid": "dce9793b-7bcd-4b3b-91eb-2ec14eea6e59", + "link": "https://learn.microsoft.com/azure/frontdoor/best-practices#use-managed-tls-certificates", + "service": "AVS", "services": [ - "Monitor", - "SQL", "WAF" ], - "severity": "Medium", - "text": "Review SQL Server performance monitoring using CCMS.", - "waf": "Performance" + "severity": "High", + "text": "Have site disaster tolerance settings been properly considered and changed for your business if needed.", + "waf": "Reliability" }, { + "arm-service": "microsoft.containerregistry/registries", "checklist": "WAF checklist", - "guid": "35709da7-fc7d-4efe-bb20-2e91547b7390", - "link": "https://me.sap.com/notes/500235", - "service": "SAP", + "description": "Disable image export to prevent data exfiltration. Note that this will prevent image import of images into another ACR instance.", + "guid": "ab91932c-9fc9-4d1b-a880-37f5e6bfcb9e", + "link": "https://learn.microsoft.com/azure/container-registry/data-loss-prevention", + "service": "ACR", "services": [ - "SAP", - "VM", + "ACR", "WAF" ], - "severity": "Medium", - "text": "Test network latency between SAP application layer VMs and DBMS VMs (NIPING).", - "training": "https://me.sap.com/notes/1100926/E", - "waf": "Performance" + "severity": "High", + "text": "Disable Azure Container Registry image export", + "waf": "Security" }, { + "arm-service": "microsoft.containerregistry/registries", "checklist": "WAF checklist", - "guid": "9e9bb4c8-e934-4e4b-a13c-6f7c7c38eb43", - "link": "https://learn.microsoft.com/en-us/azure/sap/large-instances/hana-monitor-troubleshoot", - "service": "SAP", + "description": "Enable audit compliance visibility by enabling Azure Policy for Azure Container Registry", + "guid": "d503547c-d447-4e82-9128-a7100f1cac6d", + "link": "https://learn.microsoft.com/azure/container-registry/container-registry-azure-policy", + "service": "ACR", "services": [ - "SAP", - "Monitor", - "WAF" + "ACR", + "WAF", + "AzurePolicy" ], - "severity": "Medium", - "text": "Review SAP HANA studio alerts.", - "waf": "Performance" + "severity": "High", + "text": "Enable Azure Policies for Azure Container Registry", + "waf": "Security" }, { + "arm-service": "microsoft.containerregistry/registries", "checklist": "WAF checklist", - "guid": "f1a92ab5-9509-4b57-86ff-b0ade361b694", - "link": "https://me.sap.com/notes/1969700", - "service": "SAP", + "description": "The Azure Key Vault (AKV) is used to store a signing key that can be utilized by?notation?with the notation AKV plugin (azure-kv) to sign and verify container images and other artifacts. The Azure Container Registry (ACR) allows you to attach these signatures using the?az?or?oras?CLI commands.", + "guid": "d345293c-7639-4637-a551-c5c04e401955", + "link": "https://learn.microsoft.com/azure/container-registry/container-registry-tutorial-sign-build-push", + "service": "ACR", "services": [ - "SAP", - "WAF" + "ACR", + "WAF", + "AKV" ], - "severity": "Medium", - "text": "Perform SAP HANA health checks using HANA_Configuration_Minichecks.", - "waf": "Performance" + "severity": "High", + "text": "Sign and Verify containers with notation (Notary v2)", + "waf": "Security" }, { + "arm-service": "microsoft.containerregistry/registries", "checklist": "WAF checklist", - "guid": "18dffcf3-248c-4039-a67c-dec8e3a5f804", - "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/sap-lza-security-operations", - "service": "SAP", + "description": "Azure Container Registry automatically encrypts images and other artifacts that you store. By default, Azure automatically encrypts the registry content at rest by using service-managed keys. By using a customer-managed key, you can supplement default encryption with an additional encryption layer.", + "guid": "0bd05dc2-efd5-4d76-8d41-d2500cc47b49", + "link": "https://learn.microsoft.com/azure/container-registry/tutorial-customer-managed-keys", + "service": "ACR", "services": [ - "VM", - "WAF" + "ACR", + "WAF", + "AKV" ], "severity": "Medium", - "text": "If you run Windows and Linux VMs in Azure, on-premises, or in other cloud environments, you can use the Update management center in Azure Automation to manage operating system updates, including security patches.", - "training": "https://learn.microsoft.com/azure/automation/update-management/overview", + "text": "Encrypt registry with a customer managed key", "waf": "Security" }, { + "arm-service": "microsoft.containerregistry/registries", "checklist": "WAF checklist", - "guid": "08951710-79a2-492a-adbc-06d7a401545b", - "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/sap-lza-security-operations", - "service": "SAP", + "description": "Use managed identities to secure ACRPull/Push RBAC access from client applications", + "guid": "8f42d78e-79dc-47b3-9bd2-a1a27e7a8e90", + "link": "https://learn.microsoft.com/azure/container-registry/container-registry-authentication-managed-identity", + "service": "ACR", "services": [ - "SAP", + "Entra", + "RBAC", + "ACR", "WAF" ], - "severity": "Medium", - "text": "Routinely review the SAP security OSS notes because SAP releases highly critical security patches, or hot fixes, that require immediate action to protect your SAP systems.", - "training": "https://support.sap.com/en/my-support/knowledge-base/security-notes-news.html", + "severity": "High", + "text": "Use Managed Identities to connect instead of Service Principals", "waf": "Security" }, { + "arm-service": "microsoft.containerregistry/registries", "checklist": "WAF checklist", - "guid": "1b8b394e-ae64-4a74-8933-357b523ea0a0", - "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/sap-lza-database-security", - "service": "SAP", + "description": "The local Administrator account is disabled by default and should not be enabled. Use either Token or RBAC-based access methods instead", + "guid": "be0e38ce-e297-411b-b363-caaab79b198d", + "link": "https://learn.microsoft.com/azure/container-registry/container-registry-authentication-managed-identity", + "service": "ACR", "services": [ - "SAP", - "SQL", + "RBAC", "WAF" ], - "severity": "Low", - "text": "For SAP on SQL Server, you can disable the SQL Server system administrator account because the SAP systems on SQL Server don't use the account. Ensure that another user with system administrator rights can access the server before disabling the original system administrator account.", + "severity": "High", + "text": "Disable local authentication for management plane access", "waf": "Security" }, { + "arm-service": "microsoft.containerregistry/registries", "checklist": "WAF checklist", - "guid": "5a76a033-ced9-4eef-9a43-5e4f96634c8e", - "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/sap-lza-database-security", - "service": "SAP", + "description": "Disable Administrator account and assign RBAC roles to principals for ACR Pull/Push operations", + "guid": "387e5ced-126c-4d13-8af5-b20c6998a646", + "link": "https://learn.microsoft.com/azure/container-registry/container-registry-roles?tabs=azure-cli", + "service": "ACR", "services": [ - "SQL", + "Entra", + "RBAC", + "ACR", "WAF" ], "severity": "High", - "text": "Disable xp_cmdshell. The SQL Server feature xp_cmdshell enables a SQL Server internal operating system command shell. It's a potential risk in security audits.", - "training": "https://me.sap.com/notes/3019299/E", + "text": "Assign AcrPull & AcrPush RBAC roles rather than granting Administrative access to identity principals", "waf": "Security" }, { + "arm-service": "microsoft.containerregistry/registries", "checklist": "WAF checklist", - "guid": "cf65de8e-1309-4ccc-b579-266bcca275fa", - "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/eslz-security-governance-and-compliance", - "service": "SAP", + "description": "Disable anonymous pull/push access", + "guid": "e338997e-41c7-47d7-acf6-a62a1194956d", + "link": "https://learn.microsoft.com/azure/container-registry/anonymous-pull-access#configure-anonymous-pull-access", + "service": "ACR", "services": [ - "Backup", - "SQL", - "Storage", - "SAP", "WAF" ], - "severity": "High", - "text": "Encrypting SAP HANA database servers on Azure uses SAP HANA native encryption technology. Additionally, if you are using SQL Server on Azure, use Transparent Data Encryption (TDE) to protect your data and log files and ensure that your backups are also encrypted.", - "training": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/sap-lza-database-security", + "severity": "Medium", + "text": "Disable Anonymous pull access", "waf": "Security" }, { + "arm-service": "microsoft.containerregistry/registries", "checklist": "WAF checklist", - "guid": "a1abfe9d-55d0-44c3-a491-9cb1b3d1325a", - "link": "https://learn.microsoft.com/azure/storage/common/storage-service-encryption", - "service": "SAP", + "description": "Token authentication doesn't support assignment to an AAD principal. Any tokens provided are able to be used by anyone who can access the token", + "guid": "698dc3a2-fd27-4b2e-8870-1a1252beedf6", + "link": "https://learn.microsoft.com/azure/container-registry/container-registry-authentication?tabs=azure-cli", + "service": "ACR", "services": [ - "Storage", + "Entra", "WAF" ], - "severity": "Medium", - "text": "Azure Storage encryption is enabled for all Azure Resource Manager and classic storage accounts, and can't be disabled. Because your data is encrypted by default, you don't need to modify your code or applications to use Azure Storage encryption.", - "training": "https://learn.microsoft.com/training/modules/encrypt-sector-data/?source=recommendations", + "severity": "High", + "text": "Disable repository-scoped access tokens", "waf": "Security" }, { + "arm-service": "microsoft.containerregistry/registries", "checklist": "WAF checklist", - "guid": "ce9bd3bb-0cdb-43b5-9eb2-ec14eeaa3592", - "link": "https://learn.microsoft.com/azure/key-vault/general/overview", - "service": "SAP", + "description": "Deploy container images to an ACR behind a Private endpoint within a trusted network", + "guid": "b3bec3d4-f343-47c1-936d-b55f27a71eee", + "service": "ACR", "services": [ - "AKV", - "WAF" + "EventHubs", + "ACR", + "WAF", + "PrivateLink" ], "severity": "High", - "text": "Use Azure Key Vault to store your secrets and credentials", - "training": "https://learn.microsoft.com/training/modules/manage-secrets-with-azure-key-vault/?source=recommendations", + "text": "Deploy images from a trusted environment", "waf": "Security" }, { + "arm-service": "microsoft.containerregistry/registries", "checklist": "WAF checklist", - "guid": "829e2edb-2173-4676-aff6-691b4935ada4", - "link": "https://learn.microsoft.com/azure/azure-resource-manager/management/lock-resources?tabs=json", - "service": "SAP", + "description": "Only tokens with an ACR audience can be used for authentication. Used when enabling Conditional access policies for ACR", + "guid": "3a041fd3-2947-498b-8288-b3c6a56ceb54", + "link": "https://learn.microsoft.com/azure/container-registry/container-registry-enable-conditional-access-policy", + "service": "ACR", "services": [ - "RBAC", - "Subscriptions", - "AzurePolicy", - "WAF" + "Entra", + "ACR", + "WAF", + "AzurePolicy" ], "severity": "Medium", - "text": "It is recommended to LOCK the Azure Resources post successful deployment to safeguard against unauthorized changes. You can also enforce LOCK constraints and rules on your per-subscription basis using customized Azure policies(Custome role).", - "training": "https://learn.microsoft.com/training/modules/use-azure-resource-manager/?source=recommendations", + "text": "Disable Azure ARM audience tokens for authentication", "waf": "Security" }, { + "arm-service": "microsoft.containerregistry/registries", "checklist": "WAF checklist", - "guid": "2223ece8-1b12-4318-8a54-17415833fb4a", - "link": "https://learn.microsoft.com/azure/key-vault/general/soft-delete-overview", - "service": "SAP", + "description": "Set up a diagnostic setting to send 'repositoryEvents' & 'LoginEvents' to Log Analytics as the central destination for logging and monitoring. This allows you to monitor control plane activity on the ACR resource itself.", + "guid": "8a488cde-c486-42bc-9bd2-1be77f26e5e6", + "link": "https://learn.microsoft.com/azure/container-registry/monitor-service", + "service": "ACR", "services": [ - "AKV", - "AzurePolicy", + "Entra", + "ACR", + "Monitor", "WAF" ], "severity": "Medium", - "text": "Provision Azure Key Vault with the soft delete and purge policies enabled to allow retention protection for deleted objects.", - "training": "https://learn.microsoft.com/training/modules/manage-secrets-with-azure-key-vault/?source=recommendations", + "text": "Enable diagnostics logging", "waf": "Security" }, { + "arm-service": "microsoft.containerregistry/registries", "checklist": "WAF checklist", - "guid": "e3c2df74-3165-4c3a-abe0-5bbe209d490d", - "link": "https://learn.microsoft.com/azure/role-based-access-control/security-controls-policy", - "service": "SAP", + "description": "Service supports disabling public network access either through using service-level IP ACL filtering rule (not NSG or Azure Firewall) or using a 'Disable Public Network Access' toggle switch", + "guid": "21d41d25-00b7-407a-b9ea-b40fd3290798", + "link": "https://learn.microsoft.com/azure/container-registry/container-registry-private-link", + "service": "ACR", "services": [ - "RBAC", - "AzurePolicy", - "WAF" + "VNet", + "WAF", + "Firewall", + "PrivateLink" ], - "severity": "High", - "text": "Based on existing requirements, regulatory and compliance controls (internal/external) - Determine what Azure Policies and Azure RBAC role are needed", - "training": "https://learn.microsoft.com/training/paths/describe-azure-management-governance/?source=recommendations", + "severity": "Medium", + "text": "Control inbound network access with Private Link", "waf": "Security" }, { + "arm-service": "microsoft.containerregistry/registries", "checklist": "WAF checklist", - "guid": "a4777842-4d11-4678-9d2f-a56c56ad4840", - "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/eslz-security-governance-and-compliance", - "service": "SAP", + "description": "Disable public network access if inbound network access is secured using Private Link", + "guid": "cd289ced-6b17-4db8-8554-62f2aee4553a", + "link": "https://learn.microsoft.com/azure/container-registry/container-registry-access-selected-networks#disable-public-network-access", + "service": "ACR", "services": [ - "SAP", - "Storage", - "Defender", - "WAF" + "WAF", + "PrivateLink" ], - "severity": "High", - "text": "When enabling Microsoft Defender for Endpoint on SAP environment, recommend excluding data and log files on DBMS servers instead of targeting all servers. Follow your DBMS vendor's recommendations when excluding target files.", - "training": "https://techcommunity.microsoft.com/t5/running-sap-applications-on-the/microsoft-defender-endpoint-mde-for-sap-applications-on-windows/ba-p/3912268", + "severity": "Medium", + "text": "Disable Public Network access", "waf": "Security" }, { + "arm-service": "microsoft.containerregistry/registries", "checklist": "WAF checklist", - "guid": "8fe72734-c486-4ba2-a0dc-0591cf65de8e", - "link": "https://learn.microsoft.com/azure/defender-for-cloud/just-in-time-access-overview?tabs=defender-for-container-arch-aks", - "service": "SAP", + "description": "Only the ACR Premium SKU supports Private Link access", + "guid": "fc833934-8b26-42d6-ac5f-512925498f6d", + "link": "https://learn.microsoft.com/azure/container-registry/container-registry-skus", + "service": "ACR", "services": [ - "SAP", - "RBAC", - "Defender", - "WAF" + "ACR", + "WAF", + "PrivateLink" ], - "severity": "High", - "text": "Delegate an SAP admin custom role with just-in-time access of Microsoft Defender for Cloud.", - "training": "https://learn.microsoft.com/training/modules/secure-vms-with-azure-security-center/?source=recommendations", + "severity": "Medium", + "text": "Use an Azure Container Registry SKU that supports Private Link (Premium SKU)", "waf": "Security" }, { + "arm-service": "microsoft.containerregistry/registries", "checklist": "WAF checklist", - "guid": "1309cccd-5792-466b-aca2-75faa1abfe9d", - "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/eslz-security-governance-and-compliance", - "service": "SAP", + "description": "Azure Defender for containers or equivalent service should be used to scan container images for vulnerabilities", + "guid": "bad37dac-43bc-46ce-8d7a-a9b24604489a", + "link": "https://learn.microsoft.com/azure/defender-for-cloud/defender-for-containers-introduction", + "service": "ACR", "services": [ - "SAP", + "Defender", + "ACR", "WAF" ], "severity": "Low", - "text": "encrypt data in transit by integrating the third-party security product with secure network communications (SNC) for DIAG (SAP GUI), RFC, and SPNEGO for HTTPS", - "training": "https://learn.microsoft.com/azure/security/fundamentals/encryption-overview#encryption-of-data-in-transit", + "text": "Enable Defender for Containers to scan Azure Container Registry for vulnerabilities", "waf": "Security" }, { + "arm-service": "microsoft.containerregistry/registries", "checklist": "WAF checklist", - "guid": "eeaa3592-829e-42ed-a217-3676aff6691b", - "link": "https://learn.microsoft.com/azure/storage/common/storage-encryption-key-model-get?tabs=portal", - "service": "SAP", + "description": "Deploy trusted code that was validated and scanned for vulnerabilities according to DevSecOps practices.", + "guid": "4451e1a2-d345-4293-a763-9637a551c5c0", + "service": "ACR", "services": [ - "AKV", "WAF" ], "severity": "Medium", - "text": "Default to Microsoft-managed keys for principal encryption functionality and use customer-managed keys when required.", - "training": "https://learn.microsoft.com/training/modules/manage-secrets-with-azure-key-vault/?source=recommendations", + "text": "Deploy validated container images", "waf": "Security" }, { + "arm-service": "microsoft.containerregistry/registries", "checklist": "WAF checklist", - "guid": "4935ada4-2223-4ece-a1b1-23181a541741", - "link": "https://learn.microsoft.com/ja-jp/azure/key-vault/general/best-practices", - "service": "SAP", + "description": "Use the latest versions of supported platforms, programming languages, protocols, and frameworks.", + "guid": "4e401955-387e-45ce-b126-cd132af5b20c", + "service": "ACR", "services": [ - "AKV", "WAF" ], "severity": "High", - "text": "Use an Azure Key Vault per application per environment per region.", - "training": "https://learn.microsoft.com/training/modules/manage-secrets-with-azure-key-vault/?source=recommendations", + "text": "Use up-to-date platforms, languages, protocols and frameworks", "waf": "Security" }, { + "arm-service": "Microsoft.BotService/botServices", "checklist": "WAF checklist", - "guid": "abc9634d-c44d-41e9-a530-e8444e16aa3c", - "link": "https://learn.microsoft.com/azure/key-vault/certificates/certificate-scenarios", - "service": "SAP", + "guid": "6ad48408-ee72-4734-a476-ba28fdcf590c", + "link": "https://learn.microsoft.com/en-us/azure/reliability/reliability-bot", + "service": "Bot service", "services": [ - "SAP", - "AKV", "WAF" ], - "severity": "High", - "text": "To control and manage disk encryption keys and secrets for non-HANA Windows and non-Windows operating systems, use Azure Key Vault. SAP HANA isn't supported with Azure Key Vault, so you must use alternate methods like SAP ABAP or SSH keys.", - "training": "https://learn.microsoft.com/training/modules/configure-and-manage-azure-key-vault/?source=recommendations", - "waf": "Security" + "severity": "Medium", + "text": "Follow reliability support recommendations in Azure Bot Service", + "waf": "Reliability" }, { + "arm-service": "Microsoft.BotService/botServices", "checklist": "WAF checklist", - "guid": "209d490d-a477-4784-84d1-16785d2fa56c", - "link": "https://learn.microsoft.com/azure/role-based-access-control/built-in-roles", - "service": "SAP", + "guid": "e65de8e1-3f9c-4cbd-9682-66abca264f9a", + "link": "https://learn.microsoft.com/en-us/azure/bot-service/bot-builder-concept-regionalization", + "service": "Bot service", "services": [ - "SAP", - "RBAC", - "Subscriptions", "WAF" ], - "severity": "High", - "text": "Customize role-based access control (RBAC) roles for SAP on Azure spoke subscriptions to avoid accidental network-related changes", - "training": "https://learn.microsoft.com/training/modules/secure-azure-resources-with-rbac/?source=recommendations", - "waf": "Security" + "severity": "Medium", + "text": "Deploying bots with local data residency and regional compliance", + "waf": "Reliability" }, { + "arm-service": "Microsoft.BotService/botServices", "checklist": "WAF checklist", - "guid": "56ad4840-8fe7-4273-9c48-6ba280dc0591", - "link": "https://blogs.sap.com/2019/07/21/sap-security-operations-on-azure/", - "service": "SAP", + "guid": "19bfe9d5-5d04-4c3c-9919-ca1b2d1215ae", + "link": "https://learn.microsoft.com/en-us/azure/reliability/reliability-bot#cross-region-disaster-recovery-in-multi-region-geography", + "service": "Bot service", "services": [ - "PrivateLink", - "SAP", - "NVA", "WAF" ], - "severity": "High", - "text": "Isolate DMZs and NVAs from the rest of the SAP estate, configure Azure Private Link, and securely manage and control the SAP on Azure resources", - "training": "https://learn.microsoft.com/azure/architecture/reference-architectures/dmz/secure-vnet-dmz?tabs=portal", - "waf": "Security" + "severity": "Medium", + "text": "Azure Bot Service runs in active-active mode for both global and regional services. When an outage occurs, you don't need to detect errors or manage the service. Azure Bot Service automatically performs auto failover and auto recovery in a multi-region geographical architecture. For the EU bot regional service, Azure Bot Service provides two full regions inside Europe with active/active replication to ensure redundancy. For the global bot service, all available regions/geographies can be served as the global footprint.", + "waf": "Reliability" }, { + "arm-service": "Microsoft.ServiceBus/namespaces", "checklist": "WAF checklist", - "guid": "e124ba34-df68-45ed-bce9-bd3bb0cdb3b5", - "link": "https://learn.microsoft.com/en-us/training/modules/secure-vms-with-azure-security-center/?source=recommendations", - "service": "SAP", + "description": "Azure Service Bus Premium provides encryption of data at rest. If you use your own key, the data is still encrypted using the Microsoft-managed key, but in addition the Microsoft-managed key will be encrypted using the customer-managed key. ", + "guid": "87af4a79-1f89-439b-ba47-768e14c11567", + "link": "https://learn.microsoft.com/azure/service-bus-messaging/configure-customer-managed-key", + "service": "Service Bus", "services": [ - "Storage", - "VM", + "ServiceBus", "WAF" ], "severity": "Low", - "text": "Consider using Microsoft anti-malware software on Azure to protect your virtual machines from malicious files, adware, and other threats.", - "training": "https://azure.microsoft.com/blog/deploying-antimalware-solutions-on-azure-virtual-machines/", + "text": "Use customer-managed key option in data at rest encryption when required", + "training": "https://learn.microsoft.com/learn/modules/plan-implement-administer-conditional-access/", "waf": "Security" }, { + "arm-service": "Microsoft.ServiceBus/namespaces", "checklist": "WAF checklist", - "guid": "5eb2ec14-eeaa-4359-8829-e2edb2173676", - "link": "https://learn.microsoft.com/microsoft-365/security/defender-endpoint/microsoft-defender-endpoint?view=o365-worldwide", - "service": "SAP", + "description": "Communication between a client application and an Azure Service Bus namespace is encrypted using Transport Layer Security (TLS). Azure Service Bus namespaces permit clients to send and receive data with TLS 1.0 and above. To enforce stricter security measures, you can configure your Service Bus namespace to require that clients send and receive data with a newer version of TLS.", + "guid": "5c1ea55b-46a9-448f-b8ae-7d7e4b475b6c", + "link": "https://learn.microsoft.com/azure/service-bus-messaging/transport-layer-security-enforce-minimum-version", + "service": "Service Bus", "services": [ - "Defender", + "ServiceBus", "WAF" ], - "severity": "Low", - "text": "For even more powerful protection, consider using Microsoft Defender for Endpoint.", - "training": "https://learn.microsoft.com/training/modules/implement-endpoint-protection-use-microsoft-defender/?source=recommendations", + "severity": "Medium", + "text": "Enforce a minimum required version of Transport Layer Security (TLS) for requests ", + "training": "https://learn.microsoft.com/learn/modules/secure-aad-users-with-mfa/", "waf": "Security" }, { + "arm-service": "Microsoft.ServiceBus/namespaces", "checklist": "WAF checklist", - "guid": "87a924c4-25c2-419f-a2f0-96c7c4fe4525", - "link": "https://learn.microsoft.com/azure/architecture/guide/sap/sap-whole-landscape", - "service": "SAP", + "description": "When you create a Service Bus namespace, a SAS rule named RootManageSharedAccessKey is automatically created for the namespace. This policy has Manage permissions for the entire namespace. It's recommended that you treat this rule like an administrative root account and don't use it in your application. Using AAD as an authentication provider with RBAC is recommended. ", + "guid": "8bcbf59b-ce65-4de8-a03f-97879468d66a", + "link": "https://learn.microsoft.com/azure/service-bus-messaging/service-bus-sas#shared-access-authorization-policies", + "service": "Service Bus", "services": [ - "SAP", - "VNet", - "WAF" + "AzurePolicy", + "Entra", + "WAF", + "ServiceBus", + "RBAC", + "TrafficManager" ], - "severity": "High", - "text": "Isolate the SAP application and database servers from the internet or from the on-premises network by passing all traffic through the hub virtual network, which is connected to the spoke network by virtual network peering. The peered virtual networks guarantee that the SAP on Azure solution is isolated from the public internet.", - "training": "https://learn.microsoft.com/training/modules/explore-azure-networking/?source=recommendations", + "severity": "Medium", + "text": "Avoid using root account when it is not necessary", + "training": "https://learn.microsoft.com/learn/paths/azure-administrator-manage-identities-governance/", "waf": "Security" }, { + "arm-service": "Microsoft.ServiceBus/namespaces", "checklist": "WAF checklist", - "guid": "491ca1c4-3d40-42c0-9d85-b8933999590b", - "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/eslz-security-governance-and-compliance", - "service": "SAP", + "description": "A Service Bus client app running inside an Azure App Service application or in a virtual machine with enabled managed entities for Azure resources support does not need to handle SAS rules and keys, or any other access tokens. The client app only needs the endpoint address of the Service Bus Messaging namespace. ", + "guid": "786d60f9-6c96-4ad8-a55d-04c2b39c986b", + "link": "https://learn.microsoft.com/azure/service-bus-messaging/service-bus-managed-service-identity", + "service": "Service Bus", "services": [ - "SAP", - "WAF" + "Storage", + "Entra", + "WAF", + "AKV", + "ServiceBus", + "VM", + "AppSvc" ], - "severity": "Low", - "text": "For internet-facing applications like SAP Fiori, make sure to distribute load per application requirements while maintaining security levels. For Layer 7 security, you can use a third-party Web Application Firewall (WAF) available in the Azure Marketplace.", - "training": "https://learn.microsoft.com/training/modules/simplify-cloud-procurement-governance-azure-marketplace/?source=recommendations", + "severity": "Medium", + "text": "When possible, your application should be using a managed identity to authenticate to Azure Service Bus. If not, consider having the storage credential (SAS, service principal credential) in Azure Key Vault or an equivalent service", + "training": "https://learn.microsoft.com/learn/modules/azure-ad-privileged-identity-management/", "waf": "Security" }, { + "arm-service": "Microsoft.ServiceBus/namespaces", "checklist": "WAF checklist", - "guid": "9fc945b9-0527-47af-8200-9d652fe02fcc", - "link": "https://learn.microsoft.com/azure/sap/monitor/enable-tls-azure-monitor-sap-solutions", - "service": "SAP", + "description": "When creating permissions, provide fine-grained control over a client's access to Azure Service Bus. Permissions in Azure Service Bus can and should be scoped to the individual resource level e.g. queue, topic or subscription. ", + "guid": "f615658d-e558-4f93-9249-b831112dbd7e", + "link": "https://learn.microsoft.com/azure/service-bus-messaging/authenticate-application#azure-built-in-roles-for-azure-service-bus", + "service": "Service Bus", + "services": [ + "Storage", + "WAF", + "Subscriptions", + "ServiceBus", + "RBAC" + ], + "severity": "High", + "text": "Use least privilege data plane RBAC", + "training": "https://learn.microsoft.com/learn/modules/explore-basic-services-identity-types/", + "waf": "Security" + }, + { + "arm-service": "Microsoft.ServiceBus/namespaces", + "checklist": "WAF checklist", + "description": "Azure Service Bus resource logs include operational logs, virtual network and IP filtering logs. Runtime audit logs capture aggregated diagnostic information for various data plane access operations (such as send or receive messages) in Service Bus.", + "guid": "af12e7f9-43f6-4304-922d-929c2b1cd622", + "link": "https://learn.microsoft.com/azure/service-bus-messaging/monitor-service-bus-reference", + "service": "Service Bus", "services": [ - "SAP", - "AKV", "Monitor", - "WAF" + "ServiceBus", + "WAF", + "VNet" ], "severity": "Medium", - "text": "To enable secure communication in Azure Monitor for SAP solutions, you can choose to use either a root certificate or a server certificate. We highly recommend that you use root certificates.", - "training": "https://learn.microsoft.com/training/modules/implement-azure-monitoring-sap-workloads-azure-virtual-machines/?source=recommendations", + "text": "Enable logging for security investigation. Use Azure Monitor to trace resource logs and runtime audit logs (currently available only in the premium tier)", + "training": "https://learn.microsoft.com/learn/paths/manage-identity-and-access/", "waf": "Security" }, { - "arm-service": "Microsoft.AppPlatform/Spring", + "arm-service": "Microsoft.ServiceBus/namespaces", "checklist": "WAF checklist", - "guid": "6d8e32a8-3892-479d-a40b-10f6b4f6f298", - "link": "https://learn.microsoft.com/azure/spring-apps/concepts-blue-green-deployment-strategies", - "service": "Spring Apps", + "description": "Azure Service Bus by default has a public IP address and is Internet-reachable. Private endpoints allow traffic between your virtual network and Azure Service Bus traverses over the Microsoft backbone network. In addition to that, you should disable public endpoints if those are not used. ", + "guid": "9ae669ca-48e4-4a85-b222-3ece8bb12307", + "link": "https://learn.microsoft.com/azure/service-bus-messaging/private-link-service", + "service": "Service Bus", "services": [ - "WAF" + "ServiceBus", + "VNet", + "WAF", + "PrivateLink" ], "severity": "Medium", - "text": "Azure Spring Apps permits two deployments for every app, only one of which receives production traffic. You can achieve zero downtime with blue green deployment strategies. Blue green deployment is only available in Standard and Enterprise tiers. You could automate deployment using CI/CD with ADO/GitHub actions", - "waf": "Reliability" + "text": "Consider using private endpoints to access Azure Service Bus and disable public network access when applicable.", + "training": "https://learn.microsoft.com/learn/modules/azure-ad-privileged-identity-management/", + "waf": "Security" }, { - "arm-service": "Microsoft.AppPlatform/Spring", + "arm-service": "Microsoft.ServiceBus/namespaces", "checklist": "WAF checklist", - "guid": "fbcb40ac-9480-4a6d-bcf4-8081252a6716", - "link": "https://learn.microsoft.com/azure/architecture/web-apps/spring-apps/architectures/spring-apps-multi-region", - "service": "Spring Apps", + "description": "With IP firewall, you can restrict the public endpoint further to only a set of IPv4 addresses or IPv4 address ranges in CIDR (Classless Inter-Domain Routing) notation. ", + "guid": "ca5f06f1-58e3-4ea3-a92c-2de7e2165c3a", + "link": "https://learn.microsoft.com/azure/service-bus-messaging/service-bus-ip-filtering", + "service": "Service Bus", "services": [ - "TrafficManager", - "FrontDoor", + "ServiceBus", "WAF" ], "severity": "Medium", - "text": "Azure Spring Apps instances could be created in multiple regions for your applications and traffic could be routed by Traffic Manager/Front Door.", - "waf": "Reliability" + "text": "Consider only allowing access to Azure Service Bus namespace from specific IP addresses or ranges", + "training": "https://learn.microsoft.com/learn/paths/implement-resource-mgmt-security/", + "waf": "Security" }, { - "arm-service": "Microsoft.AppPlatform/Spring", + "arm-service": "Microsoft.Web/sites", "checklist": "WAF checklist", - "guid": "ff1ae6a7-9301-4feb-9d11-56cd72f1d4ef", - "link": "https://learn.microsoft.com/azure/reliability/reliability-spring-apps", - "service": "Spring Apps", + "guid": "4238f409-2ea0-43be-a06b-2a993c98aa7b", + "link": "https://learn.microsoft.com/en-us/azure/azure-functions/functions-scale#overview-of-plans", + "service": "Azure Functions", "services": [ - "ACR", "WAF" ], - "severity": "Medium", - "text": "In supported region, Azure Spring Apps can be deployed as zone redundant, which means that instances are automatically distributed across availability zones. This feature is only available in Standard and Enterprise tiers.", + "severity": "High", + "text": "Select the right Function hosting plan based on your business & SLO requirements", "waf": "Reliability" }, { - "arm-service": "Microsoft.AppPlatform/Spring", + "arm-service": "Microsoft.Web/sites", "checklist": "WAF checklist", - "guid": "ffc735ad-fbb1-4802-b43f-ad6387c4c066", - "link": "https://learn.microsoft.com/azure/spring-apps/concept-understand-app-and-deployment", - "service": "Spring Apps", + "guid": "a9808100-d640-4f77-ac56-1ec0600f6752", + "link": "https://learn.microsoft.com/en-us/azure/azure-functions/functions-scale#overview-of-plans", + "service": "Azure Functions", "services": [ "WAF" ], - "severity": "Medium", - "text": "Use more than 1 app instance for your apps", + "severity": "High", + "text": "Leverage Availability Zones where regionally applicable (not available for Consumption tier)", "waf": "Reliability" }, { - "arm-service": "Microsoft.AppPlatform/Spring", + "arm-service": "Microsoft.Web/sites", "checklist": "WAF checklist", - "guid": "7504c230-6035-4183-95a5-85762acc6075", - "link": "https://learn.microsoft.com/azure/spring-apps/diagnostic-services", - "service": "Spring Apps", + "guid": "5969d03e-eacf-4042-b127-73c55e3575fa", + "link": "https://learn.microsoft.com/en-us/azure/reliability/reliability-functions?tabs=azure-portal#cross-region-disaster-recovery-and-business-continuity", + "service": "Azure Functions", "services": [ - "Monitor", "WAF" ], "severity": "Medium", - "text": "Monitor Azure Spring Apps with logs, metrics and tracing. Integrate ASA with application insights and track failures and create workbooks.", + "text": "Consider a Cross-Region DR strategy for critical workloads", "waf": "Reliability" }, { - "arm-service": "Microsoft.AppPlatform/Spring", + "arm-service": "Microsoft.Web/sites", "checklist": "WAF checklist", - "guid": "1eb48d58-3eec-4ef5-80b0-d2b0dde3f0c6", - "link": "https://learn.microsoft.com/azure/spring-apps/how-to-configure-enterprise-spring-cloud-gateway", - "service": "Spring Apps", + "guid": "47a0aae0-d8a0-43b1-9791-e934dee3754c", + "link": "https://learn.microsoft.com/en-us/azure/app-service/environment/intro", + "service": "Azure Functions", "services": [ - "WAF" + "WAF", + "AppSvc" ], - "severity": "Medium", - "text": "Set up autoscaling in Spring Cloud Gateway", + "severity": "High", + "text": "If deploying to an Isolated environment, use or migrate to App Service Environment (ASE) v3", "waf": "Reliability" }, { - "arm-service": "Microsoft.AppPlatform/Spring", + "arm-service": "Microsoft.Web/sites", "checklist": "WAF checklist", - "guid": "97411607-b6fd-4335-99d1-9885faf4e392", - "link": "https://learn.microsoft.com/azure/spring-apps/how-to-setup-autoscale", - "service": "Spring Apps", + "guid": "17232891-f89f-4eaa-90f1-3b34bf798ed5", + "link": "https://learn.microsoft.com/en-us/azure/azure-functions/dedicated-plan#always-on", + "service": "Azure Functions", "services": [ - "WAF" + "WAF", + "AppSvc" ], - "severity": "Low", - "text": "Enable autoscale for the apps with Standard consumption & dedicated plan.", + "severity": "High", + "text": "Ensure 'Always On' is enabled for all Function Apps running on App Service Plan", "waf": "Reliability" }, { - "arm-service": "Microsoft.AppPlatform/Spring", + "arm-service": "Microsoft.Web/sites", "checklist": "WAF checklist", - "guid": "dfcaffd1-d27c-4ef2-998d-64c1df3a7ac3", - "link": "https://learn.microsoft.com/azure/spring-apps/overview", - "service": "Spring Apps", + "guid": "40a325c2-7c0e-49e6-86d8-c273b4dc21ba", + "link": "https://learn.microsoft.com/en-us/azure/azure-functions/storage-considerations?tabs=azure-cli#shared-storage-accounts", + "service": "Azure Functions", "services": [ + "Storage", "WAF" ], "severity": "Medium", - "text": "Use Enterprise plan for commercial support of spring boot for mission critical apps. With other tiers you get OSS support.", + "text": "Pair a Function App to its own storage account. Try not to re-use storage accounts for Function Apps unless they are tightly coupled", "waf": "Reliability" }, { + "arm-service": "Microsoft.Web/sites", "checklist": "WAF checklist", - "guid": "bb235c70-5e17-496f-bedf-a8a4c8cdec4c", - "link": "https://learn.microsoft.com/entra/identity-platform/msal-acquire-cache-tokens", - "service": "Entra", + "guid": "bb42650c-257d-4cb0-822a-131138b8e6f0", + "link": "https://learn.microsoft.com/en-us/training/modules/deploy-azure-functions/", + "service": "Azure Functions", "services": [ - "Entra", "WAF" ], "severity": "Medium", - "text": "Use long-live revocable token, cache your token and acquire your silently using Microsoft Identity Library", - "waf": "Reliability" + "text": "Leverage Azure DevOps or GitHub to streamline CI/CD and safeguard your Function App code", + "waf": "Operations" }, { + "arm-service": "Microsoft.CognitiveServices/accounts", "checklist": "WAF checklist", - "guid": "503547c1-447e-4c66-828a-71f0f1ce16dd", - "link": "https://learn.microsoft.com/azure/active-directory-b2c/deploy-custom-policies-devops", - "service": "AAD B2C", + "guid": "21c30d25-ffb7-4f6a-b9ea-b3fec328f787", + "link": "https://github.com/Azure/fta-resiliencyplaybooks/blob/main/paas-foundations-playbooks-cog_svcs_v1.docx", + "service": "Cognitive Services", "services": [ "WAF" ], "severity": "Medium", - "text": "Make sure that your sign-in user flows are backed up and resilient. Make sure that the code that you use to sign-in your users are backed up and recoverable. Resilient interfaces with external processes", + "text": "Leverage FTA HandBook for Cognitive Services", "waf": "Reliability" }, { + "arm-service": "Microsoft.CognitiveServices/accounts", "checklist": "WAF checklist", - "guid": "3e3553a4-c873-4964-ab66-2d6c15f51296", - "link": "https://learn.microsoft.com/entra/architecture/resilient-end-user-experience#use-a-content-delivery-network", - "service": "AAD B2C", + "guid": "78c34698-16b2-4763-aefe-1b9b599de0d5", + "link": "https://learn.microsoft.com/azure/ai-services/openai/concepts/advanced-prompt-engineering?pivots=programming-language-chat-completions", + "service": "Cognitive Services", "services": [ - "WAF" + "WAF", + "Backup" ], "severity": "Medium", - "text": "Custom brand assets should be hosted on a CDN", - "waf": "Performance" + "text": "Backup Your Prompts", + "waf": "Reliability" }, { + "arm-service": "Microsoft.CognitiveServices/accounts", "checklist": "WAF checklist", - "guid": "5398e6df-d237-4de1-93b1-6c21d79a9b64", - "link": "https://learn.microsoft.com/entra/identity/monitoring-health/reference-sla-performance", - "service": "AAD B2C", + "guid": "750ab2ab-039d-4a6d-95d7-c892adb107d5", + "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/business-continuity-disaster-recovery", + "service": "Cognitive Services", "services": [ + "ASR", "WAF" ], - "severity": "Low", - "text": "Have multiple identiy providers (i.e., login with your microsoft, google, facebook accounts)", + "severity": "High", + "text": "Business Continuity and Disaster Recovery (BCDR) considerations with Azure OpenAI Service", "waf": "Reliability" }, { + "arm-service": "Microsoft.CognitiveServices/accounts", "checklist": "WAF checklist", - "guid": "604489a8-f42d-478e-98c0-7a73b22a4a57", - "link": "https://azure.microsoft.com/blog/setting-up-active-directory-for-a-disaster-recovery-environment-2/", - "service": "Windows AD", + "guid": "325af625-ca44-4e46-a5e2-223ace8bb123", + "link": "https://github.com/abacaj/chatgpt-backup#backup-your-chatgpt-conversations", + "service": "Cognitive Services", "services": [ - "VM", - "WAF" + "WAF", + "Backup" ], "severity": "Medium", - "text": "Follow VM rules for high availability on the VM level (premium disks, two or more in a region, in different availability zones)", + "text": "Backup Your ChatGPT conversations", "waf": "Reliability" }, { + "arm-service": "Microsoft.CognitiveServices/accounts", "checklist": "WAF checklist", - "guid": "e7a8dd4a-30e3-47c3-b297-11b2362ceee0", - "link": "https://azure.microsoft.com/blog/setting-up-active-directory-for-a-disaster-recovery-environment-2/", - "service": "Windows AD", + "guid": "07ca5f17-f154-4e3a-a369-2829e7e31618", + "link": "https://learn.microsoft.com/azure/ai-services/speech-service/how-to-custom-speech-continuous-integration-continuous-deployment", + "service": "Cognitive Services", "services": [ "WAF" ], "severity": "Medium", - "text": "Don't replicate! Replication can create issues with directory synchronization", + "text": "CI/CD for custom speech", "waf": "Reliability" }, { + "arm-service": "Microsoft.CognitiveServices/accounts", "checklist": "WAF checklist", - "guid": "79b598de-fc59-472c-b4cd-21b078036f5e", - "link": "https://azure.microsoft.com/blog/setting-up-active-directory-for-a-disaster-recovery-environment-2/", - "service": "Windows AD", + "guid": "3687a046-7a1f-4893-9bda-43324f248116", + "link": "https://learn.microsoft.com/azure/ai-services/qnamaker/tutorials/export-knowledge-base", + "service": "Cognitive Services", "services": [ "WAF" ], - "severity": "Medium", - "text": "Have active-active for multi-regions", + "severity": "Low", + "text": "Move a knowledge base using export-import", "waf": "Reliability" }, { + "arm-service": "microsoft.web/sites", "checklist": "WAF checklist", - "guid": "6b4bfd3d-5035-447c-8447-ec66128a71f0", - "link": "https://learn.microsoft.com/entra/identity/domain-services/tutorial-perform-disaster-recovery-drill", - "service": "Entra", + "guid": "b32e1aa1-4813-4602-88fe-27ca2891f421", + "link": "https://learn.microsoft.com/en-us/azure/architecture/reference-architectures/app-service-web-app/zone-redundant?source=recommendations", + "service": "App Services", "services": [ - "Entra", "WAF" ], - "severity": "Medium", - "text": "Add Azure AD Domain service stamps to additional regions and locations", + "severity": "Low", + "text": "Refer to baseline highly available zone-redundant web application architecture for best practices", "waf": "Reliability" }, { + "arm-service": "microsoft.web/sites", "checklist": "WAF checklist", - "guid": "f1ce16dd-3f1d-45e8-92e4-2e3611cc58b4", - "link": "https://learn.microsoft.com/entra/identity/domain-services/tutorial-perform-disaster-recovery-drill", - "service": "Entra", + "guid": "e4b31c6a-2e3f-4df1-8e8b-9c3aa5a27820", + "link": "https://learn.microsoft.com/en-us/azure/app-service/overview-hosting-plans", + "service": "App Services", "services": [ - "WAF" + "WAF", + "Backup" ], "severity": "Medium", - "text": "Use Replica Sets for DR", + "text": "Use Premium and Standard tiers. These tiers support staging slots and automated backups.", "waf": "Reliability" }, { - "arm-service": "Microsoft.ServiceBus/namespaces", + "arm-service": "microsoft.web/sites", "checklist": "WAF checklist", - "description": "Azure Service Bus Premium provides encryption of data at rest. If you use your own key, the data is still encrypted using the Microsoft-managed key, but in addition the Microsoft-managed key will be encrypted using the customer-managed key. ", - "guid": "87af4a79-1f89-439b-ba47-768e14c11567", - "link": "https://learn.microsoft.com/azure/service-bus-messaging/configure-customer-managed-key", - "service": "Service Bus", + "guid": "a7e2e6c2-491f-4fa4-a82b-521d0bc3b202", + "link": "https://learn.microsoft.com/en-us/azure/reliability/migrate-app-service", + "service": "App Services", "services": [ - "ServiceBus", "WAF" ], - "severity": "Low", - "text": "Use customer-managed key option in data at rest encryption when required", - "training": "https://learn.microsoft.com/learn/modules/plan-implement-administer-conditional-access/", - "waf": "Security" + "severity": "High", + "text": "Leverage Availability Zones where regionally applicable (requires Premium v2 or v3 tier)", + "waf": "Reliability" }, { - "arm-service": "Microsoft.ServiceBus/namespaces", + "arm-service": "microsoft.web/sites", "checklist": "WAF checklist", - "description": "Communication between a client application and an Azure Service Bus namespace is encrypted using Transport Layer Security (TLS). Azure Service Bus namespaces permit clients to send and receive data with TLS 1.0 and above. To enforce stricter security measures, you can configure your Service Bus namespace to require that clients send and receive data with a newer version of TLS.", - "guid": "5c1ea55b-46a9-448f-b8ae-7d7e4b475b6c", - "link": "https://learn.microsoft.com/azure/service-bus-messaging/transport-layer-security-enforce-minimum-version", - "service": "Service Bus", + "guid": "1275e4a9-7b6a-43c3-a9cd-5ee18d8995ad", + "link": "https://learn.microsoft.com/en-us/azure/app-service/monitor-instances-health-check", + "service": "App Services", "services": [ - "ServiceBus", "WAF" ], "severity": "Medium", - "text": "Enforce a minimum required version of Transport Layer Security (TLS) for requests ", - "training": "https://learn.microsoft.com/learn/modules/secure-aad-users-with-mfa/", - "waf": "Security" + "text": "Implement health checks", + "waf": "Reliability" }, { - "arm-service": "Microsoft.ServiceBus/namespaces", + "arm-service": "microsoft.web/sites", "checklist": "WAF checklist", - "description": "When you create a Service Bus namespace, a SAS rule named RootManageSharedAccessKey is automatically created for the namespace. This policy has Manage permissions for the entire namespace. It's recommended that you treat this rule like an administrative root account and don't use it in your application. Using AAD as an authentication provider with RBAC is recommended. ", - "guid": "8bcbf59b-ce65-4de8-a03f-97879468d66a", - "link": "https://learn.microsoft.com/azure/service-bus-messaging/service-bus-sas#shared-access-authorization-policies", - "service": "Service Bus", + "guid": "35a91c5d-4ad6-4d9b-8e0f-c47db9e6d1e7", + "link": "https://learn.microsoft.com/en-us/azure/app-service/manage-backup", + "service": "App Services", "services": [ - "Entra", - "AzurePolicy", - "TrafficManager", - "RBAC", - "ServiceBus", - "WAF" + "WAF", + "AppSvc", + "Backup" ], - "severity": "Medium", - "text": "Avoid using root account when it is not necessary", - "training": "https://learn.microsoft.com/learn/paths/azure-administrator-manage-identities-governance/", - "waf": "Security" + "severity": "High", + "text": "Refer to backup and restore best practices for Azure App Service", + "waf": "Reliability" }, { - "arm-service": "Microsoft.ServiceBus/namespaces", + "arm-service": "microsoft.web/sites", "checklist": "WAF checklist", - "description": "A Service Bus client app running inside an Azure App Service application or in a virtual machine with enabled managed entities for Azure resources support does not need to handle SAS rules and keys, or any other access tokens. The client app only needs the endpoint address of the Service Bus Messaging namespace. ", - "guid": "786d60f9-6c96-4ad8-a55d-04c2b39c986b", - "link": "https://learn.microsoft.com/azure/service-bus-messaging/service-bus-managed-service-identity", - "service": "Service Bus", + "guid": "e68cd0ec-afc6-4bd8-a27f-7860ad9a0db2", + "link": "https://learn.microsoft.com/en-us/azure/architecture/framework/services/compute/azure-app-service/reliability", + "service": "App Services", "services": [ - "Entra", - "AKV", - "Storage", - "VM", - "AppSvc", - "ServiceBus", - "WAF" + "WAF", + "AppSvc" ], - "severity": "Medium", - "text": "When possible, your application should be using a managed identity to authenticate to Azure Service Bus. If not, consider having the storage credential (SAS, service principal credential) in Azure Key Vault or an equivalent service", - "training": "https://learn.microsoft.com/learn/modules/azure-ad-privileged-identity-management/", - "waf": "Security" + "severity": "High", + "text": "Implement Azure App Service reliability best practices", + "waf": "Reliability" }, { - "arm-service": "Microsoft.ServiceBus/namespaces", + "arm-service": "microsoft.web/sites", "checklist": "WAF checklist", - "description": "When creating permissions, provide fine-grained control over a client's access to Azure Service Bus. Permissions in Azure Service Bus can and should be scoped to the individual resource level e.g. queue, topic or subscription. ", - "guid": "f615658d-e558-4f93-9249-b831112dbd7e", - "link": "https://learn.microsoft.com/azure/service-bus-messaging/authenticate-application#azure-built-in-roles-for-azure-service-bus", - "service": "Service Bus", + "guid": "bd2a865c-0835-4418-bb58-4df91a5a9b3f", + "link": "https://learn.microsoft.com/en-us/azure/app-service/manage-disaster-recovery#recover-app-content-only", + "service": "App Services", + "services": [ + "WAF", + "AppSvc" + ], + "severity": "Low", + "text": "Familiarize with how to move an App Service app to another region During a disaster", + "waf": "Reliability" + }, + { + "arm-service": "microsoft.web/sites", + "checklist": "WAF checklist", + "guid": "f3d2f1e4-e6d4-4b7a-a5a5-e2a9b2c6f293", + "link": "https://learn.microsoft.com/en-us/azure/reliability/reliability-app-service", + "service": "App Services", "services": [ - "Storage", - "RBAC", - "Subscriptions", - "ServiceBus", - "WAF" + "WAF", + "AppSvc" ], "severity": "High", - "text": "Use least privilege data plane RBAC", - "training": "https://learn.microsoft.com/learn/modules/explore-basic-services-identity-types/", - "waf": "Security" + "text": "Familiarize with reliability support in Azure App Service", + "waf": "Reliability" }, { - "arm-service": "Microsoft.ServiceBus/namespaces", + "arm-service": "microsoft.web/sites", "checklist": "WAF checklist", - "description": "Azure Service Bus resource logs include operational logs, virtual network and IP filtering logs. Runtime audit logs capture aggregated diagnostic information for various data plane access operations (such as send or receive messages) in Service Bus.", - "guid": "af12e7f9-43f6-4304-922d-929c2b1cd622", - "link": "https://learn.microsoft.com/azure/service-bus-messaging/monitor-service-bus-reference", - "service": "Service Bus", + "guid": "c7b5f3d1-0569-4fd2-9f32-c0b64e9c0c5e", + "link": "https://learn.microsoft.com/en-us/azure/azure-functions/dedicated-plan#always-on", + "service": "App Services", "services": [ - "Monitor", - "VNet", - "ServiceBus", - "WAF" + "WAF", + "AppSvc" ], "severity": "Medium", - "text": "Enable logging for security investigation. Use Azure Monitor to trace resource logs and runtime audit logs (currently available only in the premium tier)", - "training": "https://learn.microsoft.com/learn/paths/manage-identity-and-access/", - "waf": "Security" + "text": "Ensure \"Always On\" is enabled for Function Apps running on a app service plan", + "waf": "Reliability" }, { - "arm-service": "Microsoft.ServiceBus/namespaces", + "arm-service": "microsoft.web/sites", "checklist": "WAF checklist", - "description": "Azure Service Bus by default has a public IP address and is Internet-reachable. Private endpoints allow traffic between your virtual network and Azure Service Bus traverses over the Microsoft backbone network. In addition to that, you should disable public endpoints if those are not used. ", - "guid": "9ae669ca-48e4-4a85-b222-3ece8bb12307", - "link": "https://learn.microsoft.com/azure/service-bus-messaging/private-link-service", - "service": "Service Bus", + "guid": "a3b4d5f6-758c-4f9d-9e1a-d7c6b7e8f9ab", + "link": "https://learn.microsoft.com/en-us/azure/app-service/monitor-instances-health-check", + "service": "App Services", "services": [ - "PrivateLink", - "ServiceBus", - "VNet", - "WAF" + "Monitor", + "WAF", + "AppSvc" ], "severity": "Medium", - "text": "Consider using private endpoints to access Azure Service Bus and disable public network access when applicable.", - "training": "https://learn.microsoft.com/learn/modules/azure-ad-privileged-identity-management/", - "waf": "Security" + "text": "Monitor App Service instances using Health checks", + "waf": "Reliability" }, { - "arm-service": "Microsoft.ServiceBus/namespaces", + "arm-service": "microsoft.web/sites", "checklist": "WAF checklist", - "description": "With IP firewall, you can restrict the public endpoint further to only a set of IPv4 addresses or IPv4 address ranges in CIDR (Classless Inter-Domain Routing) notation. ", - "guid": "ca5f06f1-58e3-4ea3-a92c-2de7e2165c3a", - "link": "https://learn.microsoft.com/azure/service-bus-messaging/service-bus-ip-filtering", - "service": "Service Bus", + "guid": "c7d3e5f9-a19c-4833-8ca6-1dcb0128e129", + "link": "https://learn.microsoft.com/en-us/azure/azure-monitor/app/availability-overview", + "service": "App Services", "services": [ - "ServiceBus", + "Monitor", "WAF" ], "severity": "Medium", - "text": "Consider only allowing access to Azure Service Bus namespace from specific IP addresses or ranges", - "training": "https://learn.microsoft.com/learn/paths/implement-resource-mgmt-security/", - "waf": "Security" + "text": "Monitor availability and responsiveness of web app or website using Application Insights availability tests", + "waf": "Reliability" }, { - "arm-service": "Microsoft.ApiManagement/service", + "arm-service": "microsoft.web/sites", "checklist": "WAF checklist", - "guid": "d7941d4a-7b6f-458f-8714-2f8f8c059ad4", - "link": "https://learn.microsoft.com/azure/api-management/api-management-error-handling-policies", - "service": "APIM", + "guid": "b4e3f2d5-a5c6-4d7e-8b2f-c5d9e7a8f0ea", + "link": "https://learn.microsoft.com/en-us/azure/azure-monitor/app/availability-standard-tests", + "service": "App Services", "services": [ - "AzurePolicy", + "Monitor", "WAF" ], - "severity": "Medium", - "text": "Implement an error handling policy at the global level", - "waf": "Operations" + "severity": "Low", + "text": "Use Application Insights Standard test to monitor availability and responsiveness of web app or website", + "waf": "Reliability" }, { - "arm-service": "Microsoft.ApiManagement/service", + "arm-service": "microsoft.web/sites", "checklist": "WAF checklist", - "guid": "0b0c0765-ff37-4369-90bd-3eb23ce71b08", - "link": "https://learn.microsoft.com/azure/api-management/set-edit-policies?tabs=form#use-base-element-to-set-policy-evaluation-order", - "service": "APIM", + "description": "Use Azure Key Vault to store any secrets the application needs. Key Vault provides a safe and audited environment for storing secrets and is well-integrated with App Service through the Key Vault SDK or App Service Key Vault References.", + "guid": "834ac932-223e-4ce8-8b12-3071a5416415", + "link": "https://learn.microsoft.com/azure/app-service/app-service-key-vault-references", + "service": "App Services", "services": [ - "AzurePolicy", - "WAF" + "WAF", + "AKV", + "AppSvc" ], - "severity": "Medium", - "text": "Ensure all APIs policies include a element.", - "waf": "Operations" + "severity": "High", + "text": "Use Key Vault to store secrets", + "waf": "Security" }, { - "arm-service": "Microsoft.ApiManagement/service", + "arm-service": "microsoft.web/sites", "checklist": "WAF checklist", - "guid": "a5c45b03-93b6-42fe-b16b-8fccb6a79902", - "link": "https://learn.microsoft.com/azure/api-management/policy-fragments", - "service": "APIM", + "description": "Use a Managed Identity to connect to Key Vault either using the Key Vault SDK or through App Service Key Vault References.", + "guid": "833ea3ad-2c2d-4e73-8165-c3acbef4abe1", + "link": "https://learn.microsoft.com/azure/app-service/app-service-key-vault-references", + "service": "App Services", "services": [ - "ACR", - "AzurePolicy", - "WAF" + "Entra", + "WAF", + "AKV", + "AppSvc" ], - "severity": "Medium", - "text": "Use Policy Fragments to avoid repeating same policies definitions across multiple APIs", - "waf": "Operations" + "severity": "High", + "text": "Use Managed Identity to connect to Key Vault", + "waf": "Security" }, { - "arm-service": "Microsoft.ApiManagement/service", + "arm-service": "microsoft.web/sites", "checklist": "WAF checklist", - "guid": "c3818a95-6ff3-4474-88dc-e809b46dad6a", - "link": "https://learn.microsoft.com/azure/api-management/monetization-support", - "service": "APIM", + "description": "Store the App Service TLS certificate in Key Vault.", + "guid": "f8d39fda-4776-4831-9c11-5775c2ea55b4", + "link": "https://learn.microsoft.com/azure/app-service/configure-ssl-certificate", + "service": "App Services", "services": [ - "WAF" + "WAF", + "AKV", + "AppSvc" ], - "severity": "Medium", - "text": "If you are planning to monetize your APIs, review the 'monetization support' article for best practices", - "waf": "Operations" + "severity": "High", + "text": "Use Key Vault to store TLS certificate.", + "waf": "Security" }, { - "arm-service": "Microsoft.ApiManagement/service", + "arm-service": "microsoft.web/sites", "checklist": "WAF checklist", - "guid": "a7d0840a-c8c4-4e83-adec-5ca578eb4049", - "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-use-azure-monitor#resource-logs", - "service": "APIM", + "description": "Systems that process sensitive information should be isolated. To do so, use separate App Service Plans or App Service Environments and consider the use of different subscriptions or management groups.", + "guid": "6ad48408-ee72-4734-a475-ba18fdbf590c", + "link": "https://learn.microsoft.com/azure/app-service/overview-hosting-plans", + "service": "App Services", "services": [ - "Monitor", - "WAF" + "WAF", + "Subscriptions", + "AppSvc" ], - "severity": "High", - "text": "Enable Diagnostics Settings to export logs to Azure Monitor", - "waf": "Operations" + "severity": "Medium", + "text": "Isolate systems that process sensitive information", + "waf": "Security" }, { - "arm-service": "Microsoft.ApiManagement/service", + "arm-service": "microsoft.web/sites", "checklist": "WAF checklist", - "guid": "8691fa38-45ed-4299-a247-fecd98d35deb", - "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-app-insights", - "service": "APIM", + "description": "Local disks on App Service are not encrypted and sensitive data should not be stored on those. (For example: D:\\\\Local and %TMP%).", + "guid": "e65de8e0-3f9b-4cbd-9682-66abca264f9a", + "link": "https://learn.microsoft.com/azure/app-service/operating-system-functionality#file-access", + "service": "App Services", "services": [ - "WAF" + "TrafficManager", + "WAF", + "AppSvc" ], "severity": "Medium", - "text": "Enable Application Insights for more detailed telemetry", - "waf": "Operations" + "text": "Do not store sensitive data on local disk", + "waf": "Security" }, { - "arm-service": "Microsoft.ApiManagement/service", + "arm-service": "microsoft.web/sites", "checklist": "WAF checklist", - "guid": "55fd27bb-76ac-4a91-bc37-049e885be6b7", - "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-use-azure-monitor", - "service": "APIM", + "description": "For authenticated web application, use a well established Identity Provider like Azure AD or Azure AD B2C. Leverage the application framework of your choice to integrate with this provider or use the App Service Authentication / Authorization feature.", + "guid": "919ca0b2-c121-459e-814b-933df574eccc", + "link": "https://learn.microsoft.com/azure/app-service/overview-authentication-authorization", + "service": "App Services", "services": [ - "Monitor", - "WAF" + "Entra", + "WAF", + "AppSvc" ], - "severity": "High", - "text": "Configure alerts on the most critical metrics", - "waf": "Operations" + "severity": "Medium", + "text": "Use an established Identity Provider for authentication", + "waf": "Security" }, { - "arm-service": "Microsoft.ApiManagement/service", + "arm-service": "microsoft.web/sites", "checklist": "WAF checklist", - "guid": "39460bdb-156f-4dc2-a87f-1e8c11ab0998", - "link": "https://learn.microsoft.com/security/benchmark/azure/baselines/api-management-security-baseline?toc=%2Fazure%2Fapi-management%2F&bc=%2Fazure%2Fapi-management%2Fbreadcrumb%2Ftoc.json#certificate-management-in-azure-key-vault", - "service": "APIM", + "description": "Deploy code to App Service from a controlled and trusted environment, like a well-managed and secured DevOps deployment pipeline. This avoids code that was not version controlled and verified to be deployed from a malicious host.", + "guid": "3f9bcbd4-6826-46ab-aa26-4f9a19aed9c5", + "link": "https://learn.microsoft.com/azure/app-service/deploy-best-practices", + "service": "App Services", "services": [ - "AKV", - "WAF" + "WAF", + "AppSvc" ], "severity": "High", - "text": "Ensure that custom SSL certificates are stored an Azure Key Vault so they can be securely accessed and updated", + "text": "Deploy from a trusted environment", "waf": "Security" }, { - "arm-service": "Microsoft.ApiManagement/service", + "arm-service": "microsoft.web/sites", "checklist": "WAF checklist", - "guid": "e9217997-5f6c-479d-8576-8f2adf706ec8", - "link": "https://learn.microsoft.com/security/benchmark/azure/baselines/api-management-security-baseline?toc=%2Fazure%2Fapi-management%2F&bc=%2Fazure%2Fapi-management%2Fbreadcrumb%2Ftoc.json#azure-ad-authentication-required-for-data-plane-access", - "service": "APIM", + "description": "Disable basic authentication for both FTP/FTPS and for WebDeploy/SCM. This disables access to these services and enforces the use of Azure AD secured endpoints for deployment. Note that the SCM site can also be opened using Azure AD credentials.", + "guid": "5d04c2c3-919c-4a0b-8c12-159e114b933d", + "link": "https://learn.microsoft.com/azure/app-service/deploy-configure-credentials#disable-basic-authentication", + "service": "App Services", "services": [ "Entra", "WAF" ], "severity": "High", - "text": "Protect incoming requests to APIs (data plane) with Azure AD", + "text": "Disable basic authentication", "waf": "Security" }, { - "arm-service": "Microsoft.ApiManagement/service", + "arm-service": "microsoft.web/sites", "checklist": "WAF checklist", - "guid": "5e5f64ba-c90e-480e-8888-398d96cf0bfb", - "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-aad", - "service": "APIM", + "description": "Where possible use Managed Identity to connect to Azure AD secured resources. If this is not possible, store secrets in Key Vault and connect to Key Vault using a Managed Identity instead.", + "guid": "f574eccc-d9bd-43ba-bcda-3b54eb2eb03d", + "link": "https://learn.microsoft.com/azure/app-service/overview-managed-identity?tabs=portal%2Chttp", + "service": "App Services", "services": [ "Entra", - "WAF" + "WAF", + "AKV" ], - "severity": "Medium", - "text": "Use Microsoft Entra ID to authenticate users in the Developer Portal", + "severity": "High", + "text": "Use Managed Identity to connect to resources", "waf": "Security" }, { - "arm-service": "Microsoft.ApiManagement/service", + "arm-service": "microsoft.web/sites", "checklist": "WAF checklist", - "guid": "f8e574ce-280f-49c8-b2ef-68279b081cf3", - "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-create-groups", - "service": "APIM", + "description": "Where using images stored in Azure Container Registry, pull these using a Managed Identity.", + "guid": "d9a25827-18d2-4ddb-8072-5769ee6691a4", + "link": "https://learn.microsoft.com/azure/app-service/configure-custom-container#use-managed-identity-to-pull-image-from-azure-container-registry", + "service": "App Services", "services": [ + "Entra", + "ACR", "WAF" ], - "severity": "Medium", - "text": "Create appropriate groups to control the visibility of the products", + "severity": "High", + "text": "Pull containers using a Managed Identity", "waf": "Security" }, { - "arm-service": "Microsoft.ApiManagement/service", + "arm-service": "microsoft.web/sites", "checklist": "WAF checklist", - "guid": "06862505-2d9a-4874-9491-2837b00a3475", - "link": "https://learn.microsoft.com/azure/api-management/backends", - "service": "APIM", + "description": "By configuring the diagnostic settings of App Service, you can send all telemetry to Log Analytics as the central destination for logging and monitoring. This allows you to monitor runtime activity of App Service such as HTTP logs, application logs, platform logs, ...", + "guid": "47768314-c115-4775-a2ea-55b46ad48408", + "link": "https://learn.microsoft.com/azure/app-service/troubleshoot-diagnostic-logs", + "service": "App Services", "services": [ - "WAF" + "Monitor", + "WAF", + "AppSvc", + "Entra" ], "severity": "Medium", - "text": "Use Backends feature to eliminate redundant API backend configurations", - "waf": "Operations" + "text": "Send App Service runtime logs to Log Analytics", + "waf": "Security" }, { - "arm-service": "Microsoft.ApiManagement/service", + "arm-service": "microsoft.web/sites", "checklist": "WAF checklist", - "guid": "03b125d5-b69b-4739-b7fd-84b86da4933e", - "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-properties?tabs=azure-portal", - "service": "APIM", + "description": "Set up a diagnostic setting to send the activity log to Log Analytics as the central destination for logging and monitoring. This allows you to monitor control plane activity on the App Service resource itself.", + "guid": "ee72734b-475b-4a18-bdbf-590ce65de8e0", + "link": "https://learn.microsoft.com/azure/azure-monitor/essentials/activity-log", + "service": "App Services", "services": [ - "AzurePolicy", - "WAF" + "Monitor", + "WAF", + "AppSvc", + "Entra" ], "severity": "Medium", - "text": "Use Named Values to store common values that can be used in policies", - "waf": "Operations" + "text": "Send App Service activity logs to Log Analytics", + "waf": "Security" }, { - "arm-service": "Microsoft.ApiManagement/service", + "arm-service": "microsoft.web/sites", "checklist": "WAF checklist", - "guid": "beae759e-4ddb-4326-bf26-47f87d3454b6", - "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-deploy-multi-region", - "service": "APIM", + "description": "Control outbound network access using a combination of regional VNet integration, network security groups and UDR's. Traffic should be routed to an NVA such as Azure Firewall. Ensure to monitor the Firewall's logs.", + "guid": "c12159e1-14b9-433d-b574-ecccd9bd3baf", + "link": "https://learn.microsoft.com/azure/app-service/overview-vnet-integration", + "service": "App Services", "services": [ - "ACR", - "WAF" + "Monitor", + "NVA", + "VNet", + "WAF", + "Firewall" ], "severity": "Medium", - "text": "For DR, leverage the premium tier with deployments scaled across two or more regions for 99.99% SLA", - "waf": "Reliability" + "text": "Outbound network access should be controlled", + "waf": "Security" }, { - "arm-service": "Microsoft.ApiManagement/service", + "arm-service": "microsoft.web/sites", "checklist": "WAF checklist", - "guid": "9c8d1664-dd9a-49d4-bd83-950af0af4044", - "link": "https://learn.microsoft.com/azure/api-management/high-availability", - "service": "APIM", + "description": "You can provide a stable outbound IP by using VNet integration and using a VNet NAT Gateway or an NVA like Azure Firewall. This allows the receiving party to allow-list based on IP, should that be needed. Note that for communications towards Azure Services often there's no need to depend on the IP address and mechanics like Service Endpoints should be used instead. (Also the use of private endpoints on the receiving end avoids for SNAT to happen and provides a stable outbound IP range.)", + "guid": "cda3b54e-b2eb-403d-b9a2-582718d2ddb1", + "link": "https://learn.microsoft.com/azure/app-service/networking/nat-gateway-integration", + "service": "App Services", "services": [ - "WAF" + "Storage", + "NVA", + "VNet", + "WAF", + "PrivateLink", + "Firewall" ], - "severity": "Medium", - "text": "Deploy at least one unit in two or more availability zones for an increased SLA of 99.99%", - "waf": "Reliability" + "severity": "Low", + "text": "Ensure a stable IP for outbound communications towards internet addresses", + "waf": "Security" }, { - "arm-service": "Microsoft.ApiManagement/service", + "arm-service": "microsoft.web/sites", "checklist": "WAF checklist", - "guid": "8d2db6e8-85c6-4118-a52c-ae76a4f27934", - "link": "https://learn.microsoft.com/security/benchmark/azure/baselines/api-management-security-baseline?toc=%2Fazure%2Fapi-management%2F&bc=%2Fazure%2Fapi-management%2Fbreadcrumb%2Ftoc.json#service-native-backup-capability", - "service": "APIM", + "description": "Control inbound network access using a combination of App Service Access Restrictions, Service Endpoints or Private Endpoints. Different access restrictions can be required and configured for the web app itself and the SCM site.", + "guid": "0725769e-e669-41a4-a34a-c932223ece80", + "link": "https://learn.microsoft.com/azure/app-service/networking-features#access-restrictions", + "service": "App Services", "services": [ - "Backup", - "WAF" + "WAF", + "AppSvc", + "PrivateLink" ], "severity": "High", - "text": "Ensure there is an automated backup routine", - "waf": "Reliability" + "text": "Inbound network access should be controlled", + "waf": "Security" }, { - "arm-service": "Microsoft.ApiManagement/service", + "arm-service": "microsoft.web/sites", "checklist": "WAF checklist", - "guid": "43e60b94-7bca-43a2-aadf-efb04d63a485", - "link": "https://learn.microsoft.com/azure/api-management/retry-policy", - "service": "APIM", + "description": "Protect against malicious inbound traffic using a Web Application Firewall like Application Gateway or Azure Front Door. Make sure to monitor the WAF's logs.", + "guid": "b123071a-5416-4415-a33e-a3ad2c2de732", + "link": "https://learn.microsoft.com/azure/app-service/networking/app-gateway-with-service-endpoints", + "service": "App Services", "services": [ - "AzurePolicy", - "WAF" + "Monitor", + "AppGW", + "WAF", + "FrontDoor", + "AppSvc" ], - "severity": "Medium", - "text": "Use Policies to add a fail-over backend URL and caching to reduce failing calls.", - "waf": "Reliability" + "severity": "High", + "text": "Use a WAF in front of App Service", + "waf": "Security" }, { - "arm-service": "Microsoft.ApiManagement/service", + "arm-service": "microsoft.web/sites", "checklist": "WAF checklist", - "guid": "8210699f-8d43-45c2-8f19-57e54134bd8f", - "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-log-event-hubs", - "service": "APIM", + "description": "Make sure the WAF cannot be bypassed by locking down access to only the WAF. Use a combination of Access Restrictions, Service Endpoints and Private Endpoints.", + "guid": "165c3acb-ef4a-4be1-b8d3-9fda47768314", + "link": "https://learn.microsoft.com/azure/app-service/networking-features#access-restrictions", + "service": "App Services", "services": [ - "EventHubs", - "AzurePolicy", - "WAF" + "WAF", + "PrivateLink" ], - "severity": "Low", - "text": "If you need to log at high performance levels, consider Event Hubs policy", - "waf": "Operations" + "severity": "High", + "text": "Avoid for WAF to be bypassed", + "waf": "Security" }, { - "arm-service": "Microsoft.ApiManagement/service", + "arm-service": "microsoft.web/sites", "checklist": "WAF checklist", - "guid": "121bfc39-fa7b-4096-b93b-ab56c1bc0bed", - "link": "https://learn.microsoft.com/azure/api-management/api-management-sample-flexible-throttling", - "service": "APIM", + "description": "Set minimum TLS policy to 1.2 in App Service configuration.", + "graph": "appserviceresources | where type =~ 'microsoft.web/sites/config' | extend compliant = (properties.MinTlsVersion>=1.2) | distinct id,compliant", + "guid": "c115775c-2ea5-45b4-9ad4-8408ee72734b", + "link": "https://learn.microsoft.com/azure/app-service/configure-ssl-bindings#enforce-tls-versions", + "service": "App Services", "services": [ - "AzurePolicy", - "WAF" + "WAF", + "AppSvc", + "AzurePolicy" ], "severity": "Medium", - "text": "Apply throttling policies to control the number of requests per second", - "training": "https://learn.microsoft.com/training/modules/protect-apis-on-api-management/", - "waf": "Performance" + "text": "Set minimum TLS policy to 1.2", + "waf": "Security" }, { - "arm-service": "Microsoft.ApiManagement/service", + "arm-service": "microsoft.web/sites", "checklist": "WAF checklist", - "guid": "bb5f356b-3daf-47a2-a9ee-867a8100bbd5", - "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-autoscale", - "service": "APIM", + "description": "Configure App Service to use HTTPS only. This causes App Service to redirect from HTTP to HTTPS. Strongly consider the use of HTTP Strict Transport Security (HSTS) in your code or from your WAF, which informs browsers that the site should only be accessed using HTTPS.", + "graph": "where (type=='microsoft.web/sites' and (kind == 'app' or kind == 'app,linux' )) | extend compliant = (properties.httpsOnly==true) | distinct id,compliant", + "guid": "475ba18f-dbf5-490c-b65d-e8e03f9bcbd4", + "link": "https://learn.microsoft.com/azure/app-service/configure-ssl-bindings#enforce-https", + "service": "App Services", "services": [ - "WAF" + "WAF", + "AppSvc" ], - "severity": "Medium", - "text": "Configure autoscaling to scale out the number of instances when the load increases", - "waf": "Performance" + "severity": "High", + "text": "Use HTTPS only", + "waf": "Security" }, { - "arm-service": "Microsoft.ApiManagement/service", + "arm-service": "microsoft.web/sites", "checklist": "WAF checklist", - "guid": "84b94abb-59b6-4b9d-8587-3413669468e8", - "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-provision-self-hosted-gateway", - "service": "APIM", + "description": "Do not use wildcards in your CORS configuration, as this allows all origins to access the service (thereby defeating the purpose of CORS). Specifically only allow the origins that you expect to be able to access the service.", + "guid": "68266abc-a264-4f9a-89ae-d9c55d04c2c3", + "link": "https://learn.microsoft.com/azure/app-service/app-service-web-tutorial-rest-api", + "service": "App Services", "services": [ + "Storage", "WAF" ], - "severity": "Medium", - "text": "Deploy self-hosted gateways where Azure doesn't have a region close to the backend APIs.", - "waf": "Performance" + "severity": "High", + "text": "Wildcards must not be used for CORS", + "waf": "Security" }, { - "arm-service": "Microsoft.ApiManagement/service", + "arm-service": "microsoft.web/sites", "checklist": "WAF checklist", - "guid": "1fe8db45-a017-4888-8c4d-4422583cfae0", - "link": "https://learn.microsoft.com/azure/api-management/upgrade-and-scale#upgrade-and-scale", - "service": "APIM", + "description": "Remote debugging must not be turned on in production as this opens additional ports on the service which increases the attack surface. Note that the service does turn of remote debugging automatically after 48 hours.", + "graph": "appserviceresources | where type =~ 'microsoft.web/sites/config' | extend compliant = (properties.RemoteDebuggingEnabled == false) | distinct id,compliant", + "guid": "d9bd3baf-cda3-4b54-bb2e-b03dd9a25827", + "link": "https://learn.microsoft.com/azure/app-service/configure-common#configure-general-settings", + "service": "App Services", "services": [ "WAF" ], - "severity": "Medium", - "text": "Use the premium tier for production workloads.", - "waf": "Reliability" + "severity": "High", + "text": "Turn off remote debugging", + "waf": "Security" }, { - "arm-service": "Microsoft.ApiManagement/service", + "arm-service": "microsoft.web/sites", "checklist": "WAF checklist", - "guid": "1b8d68a4-66cd-44d5-ba94-3ee94440e8d6", - "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-deploy-multi-region#-route-api-calls-to-regional-backend-services", - "service": "APIM", + "description": "Enable Defender for App Service. This (amongst other threats) detects communications to known malicious IP addresses. Review the recommendations from Defender for App Service as part of your operations.", + "guid": "18d2ddb1-0725-4769-be66-91a4834ac932", + "link": "https://learn.microsoft.com/azure/defender-for-cloud/defender-for-app-service-introduction", + "service": "App Services", "services": [ - "AzurePolicy", - "WAF" + "Defender", + "WAF", + "AppSvc" ], "severity": "Medium", - "text": "In multi-region model, use Policies to route the requests to regional backends based on availability or latency.", - "waf": "Reliability" + "text": "Enable Defender for Cloud - Defender for App Service", + "waf": "Security" }, { - "arm-service": "Microsoft.ApiManagement/service", + "arm-service": "microsoft.web/sites", "checklist": "WAF checklist", - "guid": "46f07d33-ef9a-44e8-8f98-67c097c5d8cd", - "link": "https://learn.microsoft.com/azure/azure-resource-manager/management/azure-subscription-service-limits#api-management-limits", - "service": "APIM", + "description": "Azure provides DDoS Basic protection on its network, which can be improved with intelligent DDoS Standard capabilities which learns about normal traffic patterns and can detect unusual behavior. DDoS Standard applies to a Virtual Network so it must be configured for the network resource in front of the app, such as Application Gateway or an NVA.", + "guid": "223ece80-b123-4071-a541-6415833ea3ad", + "link": "https://learn.microsoft.com/azure/ddos-protection/ddos-protection-overview", + "service": "App Services", "services": [ - "Entra", - "APIM", - "WAF" + "EventHubs", + "AppGW", + "VNet", + "WAF", + "NVA", + "DDoS" ], - "severity": "High", - "text": "Be aware of APIM's limits", - "waf": "Reliability" + "severity": "Medium", + "text": "Enable DDOS Protection Standard on the WAF VNet", + "waf": "Security" }, { - "arm-service": "Microsoft.ApiManagement/service", + "arm-service": "microsoft.web/sites", "checklist": "WAF checklist", - "guid": "10f58602-f0f9-4d77-972a-956f6e0f2600", - "link": "https://learn.microsoft.com/en-us/azure/api-management/self-hosted-gateway-overview", - "service": "APIM", + "description": "Where using images stored in Azure Container Registry, pull these over a virtual network from Azure Container Registry using its private endpoint and the app setting 'WEBSITE_PULL_IMAGE_OVER_VNET'.", + "guid": "2c2de732-165c-43ac-aef4-abe1f8d39fda", + "link": "https://learn.microsoft.com/azure/app-service/configure-custom-container#use-an-image-from-a-network-protected-registry", + "service": "App Services", "services": [ - "WAF" + "VNet", + "ACR", + "WAF", + "PrivateLink" ], - "severity": "High", - "text": "Ensure that the self-hosted gateway deployments are resilient.", - "waf": "Reliability" + "severity": "Medium", + "text": "Pull containers over a Virtual Network", + "waf": "Security" }, { - "arm-service": "Microsoft.ApiManagement/service", + "arm-service": "microsoft.web/sites", "checklist": "WAF checklist", - "guid": "7519e385-a88b-4d34-966b-6269d686e890", - "link": "https://learn.microsoft.com/azure/api-management/front-door-api-management", - "service": "APIM", + "description": "Conduct a penetration test on the web application following the penetration testing rules of engagement.", + "guid": "eb2eb03d-d9a2-4582-918d-2ddb10725769", + "link": "https://learn.microsoft.com/azure/security/fundamentals/pen-testing", + "service": "App Services", "services": [ - "Entra", - "APIM", - "FrontDoor", "WAF" ], "severity": "Medium", - "text": "Use Azure Front Door in front of APIM for multi-region deployment", - "waf": "Performance" + "text": "Conduct a penetration test", + "waf": "Security" }, { - "arm-service": "Microsoft.ApiManagement/service", + "arm-service": "microsoft.web/sites", "checklist": "WAF checklist", - "guid": "cd45c90e-7690-4753-930b-bf290c69c074", - "link": "https://learn.microsoft.com/security/benchmark/azure/baselines/api-management-security-baseline?toc=%2Fazure%2Fapi-management%2F&bc=%2Fazure%2Fapi-management%2Fbreadcrumb%2Ftoc.json#virtual-network-integration", - "service": "APIM", + "description": "Deploy trusted code that was validated and scanned for vulnerabilities according to DevSecOps practices.", + "guid": "19aed9c5-5d04-4c2c-9919-ca0b2c12159e", + "link": "https://learn.microsoft.com/azure/architecture/solution-ideas/articles/devsecops-in-azure", + "service": "App Services", "services": [ - "VNet", "WAF" ], "severity": "Medium", - "text": "Deploy the service within a Virtual Network (VNet)", + "text": "Deploy validated code", "waf": "Security" }, { - "arm-service": "Microsoft.ApiManagement/service", + "arm-service": "microsoft.web/sites", "checklist": "WAF checklist", - "guid": "02661582-b3d1-48d1-9d7b-c6a918a0ca33", - "link": "https://learn.microsoft.com/security/benchmark/azure/baselines/api-management-security-baseline?toc=%2Fazure%2Fapi-management%2F&bc=%2Fazure%2Fapi-management%2Fbreadcrumb%2Ftoc.json#network-security-group-support", - "service": "APIM", + "description": "Use the latest versions of supported platforms, programming languages, protocols, and frameworks.", + "guid": "114b933d-f574-4ecc-ad9b-d3bafcda3b54", + "link": "https://learn.microsoft.com/azure/app-service/overview-patch-os-runtime", + "service": "App Services", "services": [ - "Entra", - "APIM", - "Monitor", - "VNet", "WAF" ], - "severity": "Medium", - "text": "Deploy network security groups (NSG) to your subnets to restrict or monitor traffic to/from APIM.", + "severity": "High", + "text": "Use up-to-date platforms, languages, protocols and frameworks", "waf": "Security" }, { - "arm-service": "Microsoft.ApiManagement/service", + "arm-service": "Microsoft.Storage/storageAccounts", "checklist": "WAF checklist", - "guid": "67437a28-2721-4a2c-becd-caa54c8237a5", - "link": "https://learn.microsoft.com/security/benchmark/azure/baselines/api-management-security-baseline?toc=%2Fazure%2Fapi-management%2F&bc=%2Fazure%2Fapi-management%2Fbreadcrumb%2Ftoc.json#azure-private-link", - "service": "APIM", + "description": "Apply guidance from the Microsoft cloud security benchmark related to Storage", + "guid": "d237de14-3b16-4c21-b7aa-9b64604489a8", + "link": "https://learn.microsoft.com/security/benchmark/azure/baselines/storage-security-baseline", + "service": "Azure Storage", "services": [ - "Entra", - "PrivateLink", - "APIM", - "VNet", + "Storage", "WAF" ], "severity": "Medium", - "text": "Deploy Private Endpoints to filter incoming traffic when APIM is not deployed to a VNet.", + "text": "Consider the 'Azure security baseline for storage'", "waf": "Security" }, { - "arm-service": "Microsoft.ApiManagement/service", + "arm-service": "Microsoft.Storage/storageAccounts", "checklist": "WAF checklist", - "guid": "d698adbd-3288-44cb-b10a-9b572da395ae", - "link": "https://learn.microsoft.com/security/benchmark/azure/baselines/api-management-security-baseline?toc=%2Fazure%2Fapi-management%2F&bc=%2Fazure%2Fapi-management%2Fbreadcrumb%2Ftoc.json#disable-public-network-access", - "service": "APIM", + "description": "Azure Storage by default has a public IP address and is Internet-reachable. Private endpoints allow to securely expose Azure Storage only to those Azure Compute resources that need access, thus eliminating exposure to the public Internet", + "guid": "f42d78e7-9d17-4a73-a22a-5a67e7a8ed4b", + "link": "https://learn.microsoft.com/azure/storage/common/storage-private-endpoints", + "service": "Azure Storage", "services": [ - "WAF" + "Storage", + "WAF", + "PrivateLink" ], "severity": "High", - "text": "Disable Public Network Access", + "text": "Consider using private endpoints for Azure Storage", "waf": "Security" }, { - "arm-service": "Microsoft.ApiManagement/service", + "arm-service": "Microsoft.Storage/storageAccounts", "checklist": "WAF checklist", - "guid": "0674d750-0c6f-4ac0-8717-ceec04d0bdbd", - "link": "https://learn.microsoft.com/azure/api-management/automation-manage-api-management", - "service": "APIM", + "description": "Newly created storage accounts are created using the ARM deployment model, so that RBAC, auditing etc. are all enabled. Ensure that there are no old storage accounts with classic deployment model in a subscription", + "guid": "30e37c3e-2971-41b2-963c-eee079b598de", + "link": "https://learn.microsoft.com/azure/virtual-machines/migration-classic-resource-manager-overview#migration-of-storage-accounts", + "service": "Azure Storage", "services": [ - "WAF" + "RBAC", + "Storage", + "WAF", + "Subscriptions" ], "severity": "Medium", - "text": "Simplify management with PowerShell automation scripts", - "waf": "Operations" + "text": "Ensure older storage accounts are not using 'classic deployment model'", + "waf": "Security" }, { - "arm-service": "Microsoft.ApiManagement/service", + "arm-service": "Microsoft.Storage/storageAccounts", "checklist": "WAF checklist", - "guid": "c385bfcd-49fd-4786-81ba-cedbb4c57345", - "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/app-platform/api-management/platform-automation-and-devops#design-recommendations", - "service": "APIM", + "description": "Leverage Microsoft Defender to learn about suspicious activity and misconfigurations.", + "guid": "fc5972cd-4cd2-41b0-a803-7f5e6b4bfd3d", + "link": "https://learn.microsoft.com/azure/storage/common/azure-defender-storage-configure", + "service": "Azure Storage", "services": [ - "Entra", - "APIM", + "Defender", + "Storage", "WAF" ], - "severity": "Medium", - "text": "Configure APIM via Infrastructure-as-code. Review DevOps best practices from the Cloud Adaption Framework APIM Landing Zone Accelerator", - "waf": "Operations" + "severity": "High", + "text": "Enable Microsoft Defender for all of your storage accounts", + "waf": "Security" }, { - "arm-service": "Microsoft.ApiManagement/service", + "arm-service": "Microsoft.Storage/storageAccounts", "checklist": "WAF checklist", - "guid": "6c3a27c0-197f-426c-9ffa-86fed51d9ab6", - "link": "https://learn.microsoft.com/azure/api-management/visual-studio-code-tutorial", - "service": "APIM", + "description": "The soft-delete mechanism allows to recover accidentally deleted blobs.", + "guid": "503547c1-447e-4c66-828a-7100f1ce16dd", + "link": "https://learn.microsoft.com/azure/storage/blobs/soft-delete-blob-overview", + "service": "Azure Storage", "services": [ - "Entra", - "APIM", + "Storage", "WAF" ], "severity": "Medium", - "text": "Promote usage of Visual Studio Code APIM extension for faster API development", - "waf": "Operations" + "text": "Enable 'soft delete' for blobs", + "waf": "Security" }, { - "arm-service": "Microsoft.ApiManagement/service", + "arm-service": "Microsoft.Storage/storageAccounts", "checklist": "WAF checklist", - "guid": "354f1c03-8112-4965-85ad-c0074bddf231", - "link": "https://learn.microsoft.com/azure/api-management/devops-api-development-templates", - "service": "APIM", + "description": "Consider selectively disabling 'soft delete' for certain blob containers, for example if the application must ensure that deleted information is immediately deleted, e.g. for confidentiality, privacy or compliance reasons. ", + "guid": "3f1d5e87-2e52-4e36-81cc-58b4a4b1510e", + "link": "https://learn.microsoft.com/azure/storage/blobs/soft-delete-blob-enable", + "service": "Azure Storage", "services": [ + "Storage", "WAF" ], "severity": "Medium", - "text": "Implement DevOps and CI/CD in your workflow", - "waf": "Operations" + "text": "Disable 'soft delete' for blobs", + "waf": "Security" }, { - "arm-service": "Microsoft.ApiManagement/service", + "arm-service": "Microsoft.Storage/storageAccounts", "checklist": "WAF checklist", - "guid": "b6439493-426a-45f3-9697-cf65baee208d", - "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-mutual-certificates-for-clients", - "service": "APIM", + "description": "Soft delete for containers enables you to recover a container after it has been deleted, for example recover from an accidental delete operation.", + "guid": "43a58a9c-2289-4c3d-9b57-d0c655462f2a", + "link": "https://learn.microsoft.com/azure/storage/blobs/soft-delete-container-overview", + "service": "Azure Storage", "services": [ "WAF" ], - "severity": "Medium", - "text": "Secure APIs using client certificate authentication", + "severity": "High", + "text": "Enable 'soft delete' for containers", "waf": "Security" }, { - "arm-service": "Microsoft.ApiManagement/service", + "arm-service": "Microsoft.Storage/storageAccounts", "checklist": "WAF checklist", - "guid": "2a67d143-1033-4c0a-8732-680896478f08", - "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-mutual-certificates", - "service": "APIM", + "description": "Consider selectively disabling 'soft delete' for certain blob containers, for example if the application must ensure that deleted information is immediately deleted, e.g. for confidentiality, privacy or compliance reasons. ", + "guid": "3e3453a3-c863-4964-ab65-2d6c15f51296", + "link": "https://learn.microsoft.com/azure/storage/blobs/soft-delete-container-enable", + "service": "Azure Storage", "services": [ + "Storage", "WAF" ], "severity": "Medium", - "text": "Secure backend services using client certificate authentication", + "text": "Disable 'soft delete' for containers", "waf": "Security" }, { - "arm-service": "Microsoft.ApiManagement/service", + "arm-service": "Microsoft.Storage/storageAccounts", "checklist": "WAF checklist", - "guid": "074435f5-4a46-41ac-b521-d6114cb5d845", - "link": "https://learn.microsoft.com/azure/api-management/mitigate-owasp-api-threats", - "service": "APIM", + "description": "Prevents accidental deletion of a storage account, by forcing the user to first remove the deletion lock, prior to deletion", + "guid": "5398e6de-d227-4dd1-92b0-6c21d7999a64", + "link": "https://learn.microsoft.com/azure/storage/common/lock-account-resource", + "service": "Azure Storage", "services": [ + "Storage", "WAF" ], - "severity": "Medium", - "text": "Review 'Recommendations to mitigate OWASP API Security Top 10 threats' article and check what is applicable to your APIs", + "severity": "High", + "text": "Enable resource locks on storage accounts", "waf": "Security" }, { - "arm-service": "Microsoft.ApiManagement/service", + "arm-service": "Microsoft.Storage/storageAccounts", "checklist": "WAF checklist", - "guid": "5507c4b8-a7f8-41d6-9661-418c987100c9", - "link": "https://learn.microsoft.com/azure/api-management/authorizations-overview", - "service": "APIM", + "description": "Consider 'legal hold' or 'time-based retention' policies for blobs, so that is is impossible to delete the blob, the container, or the storage account. Please note that 'impossible' actually means 'impossible'; once a storage account contains an immutable blob, the only way to 'get rid' of that storage account is by cancelling the Azure subscription.", + "guid": "6f4389a8-f42c-478e-98c0-6a73a22a4956", + "link": "https://learn.microsoft.com/azure/storage/blobs/immutable-storage-overview", + "service": "Azure Storage", "services": [ - "WAF" + "Storage", + "WAF", + "Subscriptions", + "AzurePolicy" ], - "severity": "Medium", - "text": "Use Authorizations feature to simplify management of OAuth 2.0 token for your backend APIs", + "severity": "High", + "text": "Consider immutable blobs", "waf": "Security" }, { - "arm-service": "Microsoft.ApiManagement/service", + "arm-service": "Microsoft.Storage/storageAccounts", "checklist": "WAF checklist", - "guid": "2deee033-b906-4bc2-9f26-c8d3699fe091", - "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-manage-protocols-ciphers", - "service": "APIM", + "description": "Consider disabling unprotected HTTP/80 access to the storage account, so that all data transfers are encrypted, integrity protected, and the server is authenticated. ", + "guid": "e7a8dc4a-20e2-47c3-b297-11b1352beee0", + "link": "https://learn.microsoft.com/azure/storage/common/storage-require-secure-transfer", + "service": "Azure Storage", "services": [ + "Storage", "WAF" ], "severity": "High", - "text": "Use the latest TLS version when encrypting information in transit. Disable outdated and unnecessary protocols and ciphers when possible.", + "text": "Require HTTPS, i.e. disable port 80 on the storage account", "waf": "Security" }, { - "arm-service": "Microsoft.ApiManagement/service", + "arm-service": "Microsoft.Storage/storageAccounts", "checklist": "WAF checklist", - "guid": "f8af3d94-1d2b-4070-846f-849197524258", - "link": "https://learn.microsoft.com/security/benchmark/azure/baselines/api-management-security-baseline?toc=%2Fazure%2Fapi-management%2F&bc=%2Fazure%2Fapi-management%2Fbreadcrumb%2Ftoc.json#im-8-restrict-the-exposure-of-credential-and-secrets", - "service": "APIM", + "description": "When configuring a custom domain (hostname) on a storage account, check whether you need TLS/HTTPS; if so, you might have to put Azure CDN in front of your storage account.", + "guid": "79b588de-fc49-472c-b3cd-21bf77036e5e", + "link": "https://learn.microsoft.com/azure/storage/blobs/storage-custom-domain-name", + "service": "Azure Storage", "services": [ - "AKV", + "Storage", "WAF" ], "severity": "High", - "text": "Ensure that secrets (Named values) are stored an Azure Key Vault so they can be securely accessed and updated", + "text": "When enforcing HTTPS (disabling HTTP), check that you do not use custom domains (CNAME) for the storage account.", "waf": "Security" }, { - "arm-service": "Microsoft.ApiManagement/service", + "arm-service": "Microsoft.Storage/storageAccounts", "checklist": "WAF checklist", - "guid": "791abd8b-7706-4e31-9569-afefde724be3", - "link": "https://learn.microsoft.com/security/benchmark/azure/baselines/api-management-security-baseline?toc=%2Fazure%2Fapi-management%2F&bc=%2Fazure%2Fapi-management%2Fbreadcrumb%2Ftoc.json#managed-identities", - "service": "APIM", + "description": "Requiring HTTPS when a client uses a SAS token to access blob data helps to minimize the risk of credential loss.", + "guid": "6b4bed3d-5035-447c-8347-dc56028a71ff", + "link": "https://learn.microsoft.com/azure/storage/common/storage-sas-overview", + "service": "Azure Storage", "services": [ - "Entra", + "Storage", "WAF" ], "severity": "Medium", - "text": "Use managed identities to authenticate to other Azure resources whenever possible", + "text": "Limit shared access signature (SAS) tokens to HTTPS connections only", "waf": "Security" }, { - "arm-service": "Microsoft.ApiManagement/service", + "arm-service": "Microsoft.Storage/storageAccounts", "checklist": "WAF checklist", - "guid": "220c4ca6-6688-476b-b2b5-425a78e6fb87", - "link": "https://learn.microsoft.com/security/benchmark/azure/baselines/api-management-security-baseline?toc=%2Fazure%2Fapi-management%2F&bc=%2Fazure%2Fapi-management%2Fbreadcrumb%2Ftoc.json#ns-6-deploy-web-application-firewall", - "service": "APIM", + "description": "AAD tokens should be favored over shared access signatures, wherever possible", + "guid": "e1ce15dd-3f0d-45e7-92d4-1e3611cc57b4", + "link": "https://learn.microsoft.com/azure/storage/common/authorize-data-access", + "service": "Azure Storage", "services": [ "Entra", - "APIM", - "AppGW", + "Storage", "WAF" ], "severity": "High", - "text": "Use web application firewall (WAF) by deploying Application Gateway in front of APIM", + "text": "Use Azure Active Directory (Azure AD) tokens for blob access", "waf": "Security" }, { - "arm-service": "microsoft.web/sites", + "arm-service": "Microsoft.Storage/storageAccounts", "checklist": "WAF checklist", - "guid": "b32e1aa1-4813-4602-88fe-27ca2891f421", - "link": "https://learn.microsoft.com/en-us/azure/architecture/reference-architectures/app-service-web-app/zone-redundant?source=recommendations", - "service": "App Services", + "description": "When assigning a role to a user, group, or application, grant that security principal only those permissions that are necessary for them to perform their tasks. Limiting access to resources helps prevent both unintentional and malicious misuse of your data.", + "guid": "a4b1410d-4395-48a8-a228-9b3d6b57cfc6", + "service": "Azure Storage", "services": [ + "RBAC", "WAF" ], - "severity": "Low", - "text": "Refer to baseline highly available zone-redundant web application architecture for best practices", - "waf": "Reliability" + "severity": "Medium", + "text": "Least privilege in IaM permissions", + "waf": "Security" }, { - "arm-service": "microsoft.web/sites", + "arm-service": "Microsoft.Storage/storageAccounts", "checklist": "WAF checklist", - "guid": "e4b31c6a-2e3f-4df1-8e8b-9c3aa5a27820", - "link": "https://learn.microsoft.com/en-us/azure/app-service/overview-hosting-plans", - "service": "App Services", + "description": "A user delegation SAS is secured with Azure Active Directory (Azure AD) credentials and also by the permissions specified for the SAS. A user delegation SAS is analogous to a service SAS in terms of its scope and function, but offers security benefits over the service SAS. ", + "guid": "55461e1a-3e34-453a-9c86-39648b652d6c", + "link": "https://learn.microsoft.com/azure/storage/common/storage-sas-overview?toc=%2Fazure%2Fstorage%2Fblobs%2Ftoc.json#best-practices-when-using-sas", + "service": "Azure Storage", "services": [ - "Backup", + "Entra", + "Storage", "WAF" ], - "severity": "Medium", - "text": "Use Premium and Standard tiers. These tiers support staging slots and automated backups.", - "waf": "Reliability" + "severity": "High", + "text": "When using SAS, prefer 'user delegation SAS' over storage-account-key based SAS.", + "waf": "Security" }, { - "arm-service": "microsoft.web/sites", + "arm-service": "Microsoft.Storage/storageAccounts", "checklist": "WAF checklist", - "guid": "a7e2e6c2-491f-4fa4-a82b-521d0bc3b202", - "link": "https://learn.microsoft.com/en-us/azure/reliability/migrate-app-service", - "service": "App Services", + "description": "Storage account keys ('shared keys') have very little audit capabilities. While it can be monitored on who/when fetched a copy of the keys, once the keys are in the hands of multiple people, it is impossible to attribute usage to a specific user. Solely relying on AAD authentication makes it easier to tie storage access to a user. ", + "guid": "15f51296-5398-4e6d-bd22-7dd142b06c21", + "link": "https://learn.microsoft.com/rest/api/storageservices/authorize-with-shared-key", + "service": "Azure Storage", "services": [ - "WAF" + "Monitor", + "Storage", + "Entra", + "WAF", + "AKV" ], "severity": "High", - "text": "Leverage Availability Zones where regionally applicable (requires Premium v2 or v3 tier)", - "waf": "Reliability" + "text": "Consider disabling storage account keys, so that only AAD access (and user delegation SAS) is supported.", + "waf": "Security" }, { - "arm-service": "microsoft.web/sites", + "arm-service": "Microsoft.Storage/storageAccounts", "checklist": "WAF checklist", - "guid": "1275e4a9-7b6a-43c3-a9cd-5ee18d8995ad", - "link": "https://learn.microsoft.com/en-us/azure/app-service/monitor-instances-health-check", - "service": "App Services", + "description": "Use Activity Log data to identify 'when', 'who', 'what' and 'how' the security of your storage account is being viewed or changed (i.e. storage account keys, access policies, etc.).", + "guid": "d7999a64-6f43-489a-af42-c78e78c06a73", + "link": "https://learn.microsoft.com/azure/storage/blobs/blob-storage-monitoring-scenarios#audit-account-activity", + "service": "Azure Storage", "services": [ - "WAF" + "Monitor", + "Storage", + "AzurePolicy", + "WAF", + "AKV" + ], + "severity": "High", + "text": "Consider using Azure Monitor to audit control plane operations on the storage account", + "waf": "Security" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "WAF checklist", + "description": "A key expiration policy enables you to set a reminder for the rotation of the account access keys. The reminder is displayed if the specified interval has elapsed and the keys have not yet been rotated.", + "guid": "a22a4956-e7a8-4dc4-a20e-27c3e29711b1", + "link": "https://learn.microsoft.com/azure/storage/common/storage-account-keys-manage?tabs=azure-portal#create-a-key-expiration-policy", + "service": "Azure Storage", + "services": [ + "Storage", + "WAF", + "AKV", + "AzurePolicy" ], "severity": "Medium", - "text": "Implement health checks", - "waf": "Reliability" + "text": "When using storage account keys, consider enabling a 'key expiration policy'", + "waf": "Security" }, { - "arm-service": "microsoft.web/sites", + "arm-service": "Microsoft.Storage/storageAccounts", "checklist": "WAF checklist", - "guid": "35a91c5d-4ad6-4d9b-8e0f-c47db9e6d1e7", - "link": "https://learn.microsoft.com/en-us/azure/app-service/manage-backup", - "service": "App Services", + "description": "A SAS expiration policy specifies a recommended interval over which the SAS is valid. SAS expiration policies apply to a service SAS or an account SAS. When a user generates service SAS or an account SAS with a validity interval that is larger than the recommended interval, they'll see a warning.", + "guid": "352beee0-79b5-488d-bfc4-972cd3cd21bf", + "link": "https://learn.microsoft.com/azure/storage/common/sas-expiration-policy", + "service": "Azure Storage", "services": [ - "AppSvc", - "Backup", - "WAF" + "WAF", + "AzurePolicy" ], - "severity": "High", - "text": "Refer to backup and restore best practices for Azure App Service", - "waf": "Reliability" + "severity": "Medium", + "text": "Consider configuring an SAS expiration policy", + "waf": "Security" }, { - "arm-service": "microsoft.web/sites", + "arm-service": "Microsoft.Storage/storageAccounts", "checklist": "WAF checklist", - "guid": "e68cd0ec-afc6-4bd8-a27f-7860ad9a0db2", - "link": "https://learn.microsoft.com/en-us/azure/architecture/framework/services/compute/azure-app-service/reliability", - "service": "App Services", + "description": "Stored access policies give you the option to revoke permissions for a service SAS without having to regenerate the storage account keys. ", + "guid": "77036e5e-6b4b-4ed3-b503-547c1347dc56", + "link": "https://learn.microsoft.com/rest/api/storageservices/define-stored-access-policy", + "service": "Azure Storage", "services": [ - "AppSvc", - "WAF" + "Storage", + "WAF", + "AKV", + "AzurePolicy" ], - "severity": "High", - "text": "Implement Azure App Service reliability best practices", - "waf": "Reliability" + "severity": "Medium", + "text": "Consider linking SAS to a stored access policy", + "waf": "Security" }, { - "arm-service": "microsoft.web/sites", + "arm-service": "Microsoft.Storage/storageAccounts", "checklist": "WAF checklist", - "guid": "bd2a865c-0835-4418-bb58-4df91a5a9b3f", - "link": "https://learn.microsoft.com/en-us/azure/app-service/manage-disaster-recovery#recover-app-content-only", - "service": "App Services", + "guid": "028a71ff-e1ce-415d-b3f0-d5e772d41e36", + "link": "https://microsoft.github.io/code-with-engineering-playbook/continuous-integration/dev-sec-ops/secret-management/recipes/detect-secrets-ado/", + "service": "Azure Storage", "services": [ - "AppSvc", - "WAF" + "Storage", + "WAF", + "AKV" ], - "severity": "Low", - "text": "Familiarize with how to move an App Service app to another region During a disaster", - "waf": "Reliability" + "severity": "Medium", + "text": "Consider configuring your application's source code repository to detect checked-in connection strings and storage account keys.", + "waf": "Security" }, { - "arm-service": "microsoft.web/sites", + "arm-service": "Microsoft.Storage/storageAccounts", "checklist": "WAF checklist", - "guid": "f3d2f1e4-e6d4-4b7a-a5a5-e2a9b2c6f293", - "link": "https://learn.microsoft.com/en-us/azure/reliability/reliability-app-service", - "service": "App Services", + "description": "Ideally, your application should be using a managed identity to authenticate to Azure Storage. If that is not possible, consider having the storage credential (connection string, storage account key, SAS, service principal credential) in Azure KeyVault or an equivalent service.", + "guid": "11cc57b4-a4b1-4410-b439-58a8c2289b3d", + "link": "https://learn.microsoft.com/azure/architecture/framework/security/design-storage-keys", + "service": "Azure Storage", "services": [ - "AppSvc", + "Entra", + "Storage", "WAF" ], "severity": "High", - "text": "Familiarize with reliability support in Azure App Service", - "waf": "Reliability" + "text": "Consider storing connection strings in Azure KeyVault (in scenarios where managed identities are not possible)", + "waf": "Security" }, { - "arm-service": "microsoft.web/sites", + "arm-service": "Microsoft.Storage/storageAccounts", "checklist": "WAF checklist", - "guid": "c7b5f3d1-0569-4fd2-9f32-c0b64e9c0c5e", - "link": "https://learn.microsoft.com/en-us/azure/azure-functions/dedicated-plan#always-on", - "service": "App Services", + "description": "Use near-term expiration times on an ad hoc SAS service SAS or account SAS. In this way, even if a SAS is compromised, it's valid only for a short time. This practice is especially important if you cannot reference a stored access policy. Near-term expiration times also limit the amount of data that can be written to a blob by limiting the time available to upload to it.", + "guid": "27138b82-1102-4cac-9eae-01e6e842e52f", + "link": "https://learn.microsoft.com/rest/api/storageservices/delegate-access-with-shared-access-signature", + "service": "Azure Storage", "services": [ - "AppSvc", - "WAF" + "Storage", + "WAF", + "AzurePolicy" ], - "severity": "Medium", - "text": "Ensure \"Always On\" is enabled for Function Apps running on a app service plan", - "waf": "Reliability" + "severity": "High", + "text": "Strive for short validity periods for ad-hoc SAS", + "waf": "Security" }, { - "arm-service": "microsoft.web/sites", + "arm-service": "Microsoft.Storage/storageAccounts", "checklist": "WAF checklist", - "guid": "a3b4d5f6-758c-4f9d-9e1a-d7c6b7e8f9ab", - "link": "https://learn.microsoft.com/en-us/azure/app-service/monitor-instances-health-check", - "service": "App Services", + "description": "When creating a SAS, be as specific and restrictive as possible. Prefer a SAS for a single resource and operation over a SAS which gives much broader access.", + "guid": "4721d928-c1b1-4cd5-81e5-4a29a9de399c", + "link": "https://learn.microsoft.com/rest/api/storageservices/delegate-access-with-shared-access-signature", + "service": "Azure Storage", "services": [ - "AppSvc", - "Monitor", "WAF" ], "severity": "Medium", - "text": "Monitor App Service instances using Health checks", - "waf": "Reliability" + "text": "Apply a narrow scope to a SAS", + "waf": "Security" }, { - "arm-service": "microsoft.web/sites", + "arm-service": "Microsoft.Storage/storageAccounts", "checklist": "WAF checklist", - "guid": "c7d3e5f9-a19c-4833-8ca6-1dcb0128e129", - "link": "https://learn.microsoft.com/en-us/azure/azure-monitor/app/availability-overview", - "service": "App Services", + "description": "A SAS can include parameters on which client IP addresses or address ranges are authorized to request a resource using the SAS. ", + "guid": "fd7b28dc-9355-4562-82bf-e4564b0d834a", + "link": "https://learn.microsoft.com/rest/api/storageservices/create-account-sas", + "service": "Azure Storage", "services": [ - "Monitor", "WAF" ], "severity": "Medium", - "text": "Monitor availability and responsiveness of web app or website using Application Insights availability tests", - "waf": "Reliability" + "text": "Consider scoping SAS to a specific client IP address, wherever possible", + "waf": "Security" }, { - "arm-service": "microsoft.web/sites", + "arm-service": "Microsoft.Storage/storageAccounts", "checklist": "WAF checklist", - "guid": "b4e3f2d5-a5c6-4d7e-8b2f-c5d9e7a8f0ea", - "link": "https://learn.microsoft.com/en-us/azure/azure-monitor/app/availability-standard-tests", - "service": "App Services", + "description": "A SAS cannot constrain how much data a client uploads; given the pricing model of amount of storage over time, it might make sense to validate whether clients uploaded maliciously large contents.", + "guid": "348b263e-6dd6-4051-8a36-498f6dbad38e", + "service": "Azure Storage", "services": [ - "Monitor", + "Storage", "WAF" ], "severity": "Low", - "text": "Use Application Insights Standard test to monitor availability and responsiveness of web app or website", - "waf": "Reliability" + "text": "Consider checking uploaded data, after clients used a SAS to upload a file. ", + "waf": "Security" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "WAF checklist", + "description": "When accessing blob storage via SFTP using a 'local user account', the 'usual' RBAC controls do not apply. Blob access via NFS or REST might be more restrictive than SFTP access. Unfortunately, as of early 2023, local users are the only form of identity management that is currently supported for the SFTP endpoint", + "guid": "ad53cc7c-e1d7-4aaa-a357-1449ab8053d8", + "link": "https://learn.microsoft.com/azure/storage/blobs/secure-file-transfer-protocol-support#sftp-permission-model", + "service": "Azure Storage", + "services": [ + "Entra", + "RBAC", + "Storage", + "WAF" + ], + "severity": "High", + "text": "SFTP: Limit the amount of 'local users' for SFTP access, and audit whether access is needed over time.", + "waf": "Security" }, { - "arm-service": "microsoft.web/sites", + "arm-service": "Microsoft.Storage/storageAccounts", "checklist": "WAF checklist", - "description": "Use Azure Key Vault to store any secrets the application needs. Key Vault provides a safe and audited environment for storing secrets and is well-integrated with App Service through the Key Vault SDK or App Service Key Vault References.", - "guid": "834ac932-223e-4ce8-8b12-3071a5416415", - "link": "https://learn.microsoft.com/azure/app-service/app-service-key-vault-references", - "service": "App Services", + "guid": "9f89dc7b-33be-42a1-a27f-7b9e91be1f38", + "link": "https://learn.microsoft.com/azure/storage/blobs/secure-file-transfer-protocol-known-issues#authentication-and-authorization", + "service": "Azure Storage", "services": [ - "AKV", - "AppSvc", "WAF" ], - "severity": "High", - "text": "Use Key Vault to store secrets", + "severity": "Medium", + "text": "SFTP: The SFTP endpoint does not support POSIX-like ACLs.", "waf": "Security" }, { - "arm-service": "microsoft.web/sites", + "arm-service": "Microsoft.Storage/storageAccounts", "checklist": "WAF checklist", - "description": "Use a Managed Identity to connect to Key Vault either using the Key Vault SDK or through App Service Key Vault References.", - "guid": "833ea3ad-2c2d-4e73-8165-c3acbef4abe1", - "link": "https://learn.microsoft.com/azure/app-service/app-service-key-vault-references", - "service": "App Services", + "description": "Storage supports CORS (Cross-Origin Resource Sharing), i.e. an HTTP feature that enables web apps from a different domain to loosen the same-origin policy. When enabling CORS, keep the CorsRules to the least privilege.", + "guid": "cef39812-bd46-43cb-aac8-ac199ebb91a3", + "link": "https://learn.microsoft.com/rest/api/storageservices/cross-origin-resource-sharing--cors--support-for-the-azure-storage-services", + "service": "Azure Storage", "services": [ - "Entra", - "AKV", - "AppSvc", - "WAF" + "Storage", + "WAF", + "AzurePolicy" ], "severity": "High", - "text": "Use Managed Identity to connect to Key Vault", + "text": "Avoid overly broad CORS policies", "waf": "Security" }, { - "arm-service": "microsoft.web/sites", + "arm-service": "Microsoft.Storage/storageAccounts", "checklist": "WAF checklist", - "description": "Store the App Service TLS certificate in Key Vault.", - "guid": "f8d39fda-4776-4831-9c11-5775c2ea55b4", - "link": "https://learn.microsoft.com/azure/app-service/configure-ssl-certificate", - "service": "App Services", + "description": "Data at rest is always encrypted server-side, and in addition might be encrypted client-side as well. Server-side encryption might happen using a platform-managed key (default) or customer-managed key. Client-side encryption might happen by either having the client supply an encryption/decryption key on a per-blob basis to Azure storage, or by completely handling encryption on the client-side. thus not relying on Azure Storage at all for confidentiality guarantees.", + "guid": "3d90cae2-cc88-4137-86f7-c0cbafe61464", + "link": "https://learn.microsoft.com/azure/storage/common/storage-service-encryption", + "service": "Azure Storage", "services": [ - "AKV", - "AppSvc", + "Storage", "WAF" ], "severity": "High", - "text": "Use Key Vault to store TLS certificate.", + "text": "Determine how data at rest should be encrypted. Understand the thread model for data.", "waf": "Security" }, { - "arm-service": "microsoft.web/sites", + "arm-service": "Microsoft.Storage/storageAccounts", "checklist": "WAF checklist", - "description": "Systems that process sensitive information should be isolated. To do so, use separate App Service Plans or App Service Environments and consider the use of different subscriptions or management groups.", - "guid": "6ad48408-ee72-4734-a475-ba18fdbf590c", - "link": "https://learn.microsoft.com/azure/app-service/overview-hosting-plans", - "service": "App Services", + "guid": "8dd457e9-2713-48b8-8110-2cac6eae01e6", + "link": "https://learn.microsoft.com/azure/storage/common/customer-managed-keys-overview?toc=%2Fazure%2Fstorage%2Fblobs%2Ftoc.json&bc=%2Fazure%2Fstorage%2Fblobs%2Fbreadcrumb%2Ftoc.json", + "service": "Azure Storage", "services": [ - "AppSvc", - "Subscriptions", "WAF" ], "severity": "Medium", - "text": "Isolate systems that process sensitive information", + "text": "Determine which/if platform encryption should be used.", "waf": "Security" }, { - "arm-service": "microsoft.web/sites", + "arm-service": "Microsoft.Storage/storageAccounts", "checklist": "WAF checklist", - "description": "Local disks on App Service are not encrypted and sensitive data should not be stored on those. (For example: D:\\\\Local and %TMP%).", - "guid": "e65de8e0-3f9b-4cbd-9682-66abca264f9a", - "link": "https://learn.microsoft.com/azure/app-service/operating-system-functionality#file-access", - "service": "App Services", + "guid": "e842e52f-4721-4d92-ac1b-1cd521e54a29", + "link": "https://learn.microsoft.com/azure/storage/blobs/encryption-customer-provided-keys", + "service": "Azure Storage", "services": [ - "AppSvc", - "TrafficManager", "WAF" ], "severity": "Medium", - "text": "Do not store sensitive data on local disk", + "text": "Determine which/if client-side encryption should be used.", "waf": "Security" }, { - "arm-service": "microsoft.web/sites", + "arm-service": "Microsoft.Storage/storageAccounts", "checklist": "WAF checklist", - "description": "For authenticated web application, use a well established Identity Provider like Azure AD or Azure AD B2C. Leverage the application framework of your choice to integrate with this provider or use the App Service Authentication / Authorization feature.", - "guid": "919ca0b2-c121-459e-814b-933df574eccc", - "link": "https://learn.microsoft.com/azure/app-service/overview-authentication-authorization", - "service": "App Services", + "description": "Leverage Resource Graph Explorer (resources | where type == 'microsoft.storage/storageaccounts' | where properties['allowBlobPublicAccess'] == true) to find storage accounts which allow anonymous blob access.", + "guid": "659ae558-b937-4d49-a5e1-112dbd7ba012", + "link": "https://learn.microsoft.com/azure/storage/blobs/anonymous-read-access-configure?tabs=portal#allow-or-disallow-public-read-access-for-a-storage-account", + "service": "Azure Storage", "services": [ - "Entra", - "AppSvc", + "Storage", "WAF" ], - "severity": "Medium", - "text": "Use an established Identity Provider for authentication", + "severity": "High", + "text": "Consider whether public blob access is needed, or whether it can be disabled for certain storage accounts. ", "waf": "Security" }, { - "arm-service": "microsoft.web/sites", + "arm-service": "Microsoft.Storage/storageAccounts", "checklist": "WAF checklist", - "description": "Deploy code to App Service from a controlled and trusted environment, like a well-managed and secured DevOps deployment pipeline. This avoids code that was not version controlled and verified to be deployed from a malicious host.", - "guid": "3f9bcbd4-6826-46ab-aa26-4f9a19aed9c5", - "link": "https://learn.microsoft.com/azure/app-service/deploy-best-practices", - "service": "App Services", + "guid": "cb8eb8c0-aa62-4a25-a495-6eaa8dc4a243", + "link": "https://learn.microsoft.com/azure/storage/common/storage-account-upgrade?tabs=azure-portal", + "service": "Azure Storage", "services": [ - "AppSvc", + "Storage", "WAF" ], "severity": "High", - "text": "Deploy from a trusted environment", - "waf": "Security" + "text": "Leverage a storagev2 account type for better performance and reliability", + "waf": "Reliability" }, { - "arm-service": "microsoft.web/sites", + "arm-service": "Microsoft.Storage/storageAccounts", "checklist": "WAF checklist", - "description": "Disable basic authentication for both FTP/FTPS and for WebDeploy/SCM. This disables access to these services and enforces the use of Azure AD secured endpoints for deployment. Note that the SCM site can also be opened using Azure AD credentials.", - "guid": "5d04c2c3-919c-4a0b-8c12-159e114b933d", - "link": "https://learn.microsoft.com/azure/app-service/deploy-configure-credentials#disable-basic-authentication", - "service": "App Services", + "guid": "e05bbe20-9d49-4fda-9777-8424d116785c", + "link": "https://learn.microsoft.com/azure/storage/common/storage-redundancy", + "service": "Azure Storage", "services": [ - "Entra", + "Storage", "WAF" ], "severity": "High", - "text": "Disable basic authentication", - "waf": "Security" + "text": "Leverage GRS, ZRS or GZRS storage for the highest availability", + "waf": "Reliability" }, { - "arm-service": "microsoft.web/sites", + "arm-service": "Microsoft.Storage/storageAccounts", "checklist": "WAF checklist", - "description": "Where possible use Managed Identity to connect to Azure AD secured resources. If this is not possible, store secrets in Key Vault and connect to Key Vault using a Managed Identity instead.", - "guid": "f574eccc-d9bd-43ba-bcda-3b54eb2eb03d", - "link": "https://learn.microsoft.com/azure/app-service/overview-managed-identity?tabs=portal%2Chttp", - "service": "App Services", + "guid": "2fa56c56-ad48-4408-be72-734c486ba280", + "link": "https://learn.microsoft.com/azure/storage/common/storage-disaster-recovery-guidance", + "service": "Azure Storage", "services": [ - "Entra", - "AKV", "WAF" ], - "severity": "High", - "text": "Use Managed Identity to connect to resources", - "waf": "Security" + "severity": "Medium", + "text": "For write operation after failover, use customer-Managed Failover ", + "waf": "Reliability" }, { - "arm-service": "microsoft.web/sites", + "arm-service": "Microsoft.Storage/storageAccounts", "checklist": "WAF checklist", - "description": "Where using images stored in Azure Container Registry, pull these using a Managed Identity.", - "guid": "d9a25827-18d2-4ddb-8072-5769ee6691a4", - "link": "https://learn.microsoft.com/azure/app-service/configure-custom-container#use-managed-identity-to-pull-image-from-azure-container-registry", - "service": "App Services", + "guid": "dc0590cf-65de-48e1-909c-cbd579266bcc", + "link": "https://learn.microsoft.com/azure/storage/common/storage-disaster-recovery-guidance#microsoft-managed-failover", + "service": "Azure Storage", "services": [ - "Entra", - "ACR", "WAF" ], - "severity": "High", - "text": "Pull containers using a Managed Identity", - "waf": "Security" + "severity": "Medium", + "text": "Understand Microsoft-Managed Failover details", + "waf": "Reliability" }, { - "arm-service": "microsoft.web/sites", + "arm-service": "Microsoft.Storage/storageAccounts", "checklist": "WAF checklist", - "description": "By configuring the diagnostic settings of App Service, you can send all telemetry to Log Analytics as the central destination for logging and monitoring. This allows you to monitor runtime activity of App Service such as HTTP logs, application logs, platform logs, ...", - "guid": "47768314-c115-4775-a2ea-55b46ad48408", - "link": "https://learn.microsoft.com/azure/app-service/troubleshoot-diagnostic-logs", - "service": "App Services", + "guid": "a274faa1-abfe-49d5-9d04-c3c4919cb1b3", + "link": "https://learn.microsoft.com/azure/storage/blobs/soft-delete-blob-enable?tabs=azure-portal", + "service": "Azure Storage", "services": [ - "Entra", - "AppSvc", - "Monitor", "WAF" ], "severity": "Medium", - "text": "Send App Service runtime logs to Log Analytics", + "text": "Enable Soft Delete", + "waf": "Reliability" + }, + { + "arm-service": "microsoft.eventhub/namespaces", + "checklist": "WAF checklist", + "description": "Azure Event Hub provides encryption of data at rest. If you use your own key, the data is still encrypted using the Microsoft-managed key, but in addition the Microsoft-managed key will be encrypted using the customer-managed key. ", + "guid": "7aaf12e7-b94e-4f6e-847d-2d92981b1cd6", + "link": "https://learn.microsoft.com/azure/event-hubs/configure-customer-managed-key", + "service": "Event Hubs", + "services": [ + "EventHubs", + "WAF" + ], + "severity": "Low", + "text": "Use customer-managed key option in data at rest encryption when required", + "training": "https://learn.microsoft.com/learn/modules/plan-implement-administer-conditional-access/", "waf": "Security" }, { - "arm-service": "microsoft.web/sites", + "arm-service": "microsoft.eventhub/namespaces", "checklist": "WAF checklist", - "description": "Set up a diagnostic setting to send the activity log to Log Analytics as the central destination for logging and monitoring. This allows you to monitor control plane activity on the App Service resource itself.", - "guid": "ee72734b-475b-4a18-bdbf-590ce65de8e0", - "link": "https://learn.microsoft.com/azure/azure-monitor/essentials/activity-log", - "service": "App Services", + "description": "Azure Event Hubs namespaces permit clients to send and receive data with TLS 1.0 and above. To enforce stricter security measures, you can configure your Event Hubs namespace to require that clients send and receive data with a newer version of TLS. If an Event Hubs namespace requires a minimum version of TLS, then any requests made with an older version will fail. ", + "guid": "d2f54b29-769e-43a6-a0e7-828ac936657e", + "link": "https://learn.microsoft.com/azure/event-hubs/transport-layer-security-configure-minimum-version", + "service": "Event Hubs", "services": [ - "Entra", - "AppSvc", - "Monitor", + "EventHubs", "WAF" ], "severity": "Medium", - "text": "Send App Service activity logs to Log Analytics", + "text": "Enforce a minimum required version of Transport Layer Security (TLS) for requests ", + "training": "https://learn.microsoft.com/learn/modules/secure-aad-users-with-mfa/", "waf": "Security" }, { - "arm-service": "microsoft.web/sites", + "arm-service": "microsoft.eventhub/namespaces", "checklist": "WAF checklist", - "description": "Control outbound network access using a combination of regional VNet integration, network security groups and UDR's. Traffic should be routed to an NVA such as Azure Firewall. Ensure to monitor the Firewall's logs.", - "guid": "c12159e1-14b9-433d-b574-ecccd9bd3baf", - "link": "https://learn.microsoft.com/azure/app-service/overview-vnet-integration", - "service": "App Services", + "description": "When you create an Event Hubs namespace, a policy rule named RootManageSharedAccessKey is automatically created for the namespace. This policy has manage permissions for the entire namespace. It�s recommended that you treat this rule like an administrative root account and don�t use it in your application. Using AAD as an authentication provider with RBAC is recommended. ", + "guid": "13b0f566-4b1e-4944-a459-837ee79d6c6d", + "link": "https://learn.microsoft.com/azure/event-hubs/authorize-access-shared-access-signature#shared-access-authorization-policies", + "service": "Event Hubs", "services": [ - "NVA", - "Monitor", - "VNet", - "Firewall", - "WAF" + "EventHubs", + "AzurePolicy", + "Entra", + "WAF", + "RBAC", + "TrafficManager" ], "severity": "Medium", - "text": "Outbound network access should be controlled", + "text": "Avoid using root account when it is not necessary", + "training": "https://learn.microsoft.com/learn/paths/azure-administrator-manage-identities-governance/", "waf": "Security" }, { - "arm-service": "microsoft.web/sites", + "arm-service": "microsoft.eventhub/namespaces", "checklist": "WAF checklist", - "description": "You can provide a stable outbound IP by using VNet integration and using a VNet NAT Gateway or an NVA like Azure Firewall. This allows the receiving party to allow-list based on IP, should that be needed. Note that for communications towards Azure Services often there's no need to depend on the IP address and mechanics like Service Endpoints should be used instead. (Also the use of private endpoints on the receiving end avoids for SNAT to happen and provides a stable outbound IP range.)", - "guid": "cda3b54e-b2eb-403d-b9a2-582718d2ddb1", - "link": "https://learn.microsoft.com/azure/app-service/networking/nat-gateway-integration", - "service": "App Services", + "description": "Managed identities for Azure resources can authorize access to Event Hubs resources using Azure AD credentials from applications running in Azure Virtual Machines (VMs), Function apps, Virtual Machine Scale Sets, and other services. By using managed identities for Azure resources together with Azure AD authentication, you can avoid storing credentials with your applications that run in the cloud. ", + "guid": "3a365a5c-7acb-4e48-abd5-4cd79f2e8776", + "link": "https://learn.microsoft.com/azure/event-hubs/authenticate-managed-identity?tabs=latest", + "service": "Event Hubs", "services": [ - "PrivateLink", + "EventHubs", "Storage", - "NVA", - "VNet", - "Firewall", - "WAF" + "Entra", + "WAF", + "AKV", + "VM" ], - "severity": "Low", - "text": "Ensure a stable IP for outbound communications towards internet addresses", + "severity": "Medium", + "text": "When possible, your application should be using a managed identity to authenticate to Azure Event Hub. If not, consider having the storage credential (SAS, service principal credential) in Azure Key Vault or an equivalent service", + "training": "https://learn.microsoft.com/learn/modules/azure-ad-privileged-identity-management/", "waf": "Security" }, { - "arm-service": "microsoft.web/sites", + "arm-service": "microsoft.eventhub/namespaces", "checklist": "WAF checklist", - "description": "Control inbound network access using a combination of App Service Access Restrictions, Service Endpoints or Private Endpoints. Different access restrictions can be required and configured for the web app itself and the SCM site.", - "guid": "0725769e-e669-41a4-a34a-c932223ece80", - "link": "https://learn.microsoft.com/azure/app-service/networking-features#access-restrictions", - "service": "App Services", + "description": "When creating permissions, provide fine-grained control over a client's access to Azure Event Hub. Permissions in Azure Event Hub can and should be scoped to the individual resource level e.g. consumer group, event hub entity, event hub namespaces, etc.", + "guid": "8357c559-675c-45ee-a5b8-6ad8844ce3b2", + "link": "https://learn.microsoft.com/azure/event-hubs/authorize-access-azure-active-directory#azure-built-in-roles-for-azure-event-hubs", + "service": "Event Hubs", "services": [ - "PrivateLink", - "AppSvc", + "EventHubs", + "RBAC", "WAF" ], "severity": "High", - "text": "Inbound network access should be controlled", + "text": "Use least privilege data plane RBAC", + "training": "https://learn.microsoft.com/learn/modules/explore-basic-services-identity-types/", "waf": "Security" }, { - "arm-service": "microsoft.web/sites", + "arm-service": "microsoft.eventhub/namespaces", "checklist": "WAF checklist", - "description": "Protect against malicious inbound traffic using a Web Application Firewall like Application Gateway or Azure Front Door. Make sure to monitor the WAF's logs.", - "guid": "b123071a-5416-4415-a33e-a3ad2c2de732", - "link": "https://learn.microsoft.com/azure/app-service/networking/app-gateway-with-service-endpoints", - "service": "App Services", + "description": "Azure Event Hub resource logs include operational logs, virtual network and Kafka logs. Runtime audit logs capture aggregated diagnostic information for all data plane access operations (such as send or receive events) in Event Hubs.", + "guid": "b38b875b-a1cf-4104-a900-3a4d3ce474db", + "link": "https://learn.microsoft.com/azure/event-hubs/monitor-event-hubs-reference", + "service": "Event Hubs", "services": [ - "AppGW", - "FrontDoor", "Monitor", - "AppSvc", - "WAF" + "EventHubs", + "WAF", + "VNet" ], - "severity": "High", - "text": "Use a WAF in front of App Service", + "severity": "Medium", + "text": "Enable logging for security investigation. Use Azure Monitor to captured metrics and logs such as resource logs, runtime audit logs and Kafka logs", + "training": "https://learn.microsoft.com/learn/paths/manage-identity-and-access/", "waf": "Security" }, { - "arm-service": "microsoft.web/sites", + "arm-service": "microsoft.eventhub/namespaces", "checklist": "WAF checklist", - "description": "Make sure the WAF cannot be bypassed by locking down access to only the WAF. Use a combination of Access Restrictions, Service Endpoints and Private Endpoints.", - "guid": "165c3acb-ef4a-4be1-b8d3-9fda47768314", - "link": "https://learn.microsoft.com/azure/app-service/networking-features#access-restrictions", - "service": "App Services", + "description": "Azure Event Hub by default has a public IP address and is Internet-reachable. Private endpoints allow traffic between your virtual network and Azure Event Hub traverses over the Microsoft backbone network. In addition to that, you should disable public endpoints if those are not used. ", + "guid": "5abca2a4-eda1-4dae-8cc9-5d48c6b791dc", + "link": "https://learn.microsoft.com/azure/event-hubs/private-link-service", + "service": "Event Hubs", "services": [ - "PrivateLink", - "WAF" + "VNet", + "EventHubs", + "WAF", + "PrivateLink" ], - "severity": "High", - "text": "Avoid for WAF to be bypassed", + "severity": "Medium", + "text": "Consider using private endpoints to access Azure Event Hub and disable public network access when applicable.", + "training": "https://learn.microsoft.com/learn/modules/azure-ad-privileged-identity-management/", "waf": "Security" }, { - "arm-service": "microsoft.web/sites", + "arm-service": "microsoft.eventhub/namespaces", "checklist": "WAF checklist", - "description": "Set minimum TLS policy to 1.2 in App Service configuration.", - "graph": "appserviceresources | where type =~ 'microsoft.web/sites/config' | extend compliant = (properties.MinTlsVersion>=1.2) | distinct id,compliant", - "guid": "c115775c-2ea5-45b4-9ad4-8408ee72734b", - "link": "https://learn.microsoft.com/azure/app-service/configure-ssl-bindings#enforce-tls-versions", - "service": "App Services", + "description": "With IP firewall, you can restrict public endpoint further to only a set of IPv4 addresses or IPv4 address ranges in CIDR (Classless Inter-Domain Routing) notation. ", + "guid": "a0e6c465-89e5-458b-a37d-3974d1112dbd", + "link": "https://learn.microsoft.com/azure/event-hubs/event-hubs-ip-filtering", + "service": "Event Hubs", "services": [ - "AppSvc", - "AzurePolicy", + "EventHubs", "WAF" ], "severity": "Medium", - "text": "Set minimum TLS policy to 1.2", + "text": "Consider only allowing access to Azure Event Hub namespace from specific IP addresses or ranges", + "training": "https://learn.microsoft.com/learn/paths/implement-resource-mgmt-security/", "waf": "Security" }, { - "arm-service": "microsoft.web/sites", + "arm-service": "microsoft.eventhub/namespaces", "checklist": "WAF checklist", - "description": "Configure App Service to use HTTPS only. This causes App Service to redirect from HTTP to HTTPS. Strongly consider the use of HTTP Strict Transport Security (HSTS) in your code or from your WAF, which informs browsers that the site should only be accessed using HTTPS.", - "graph": "where (type=='microsoft.web/sites' and (kind == 'app' or kind == 'app,linux' )) | extend compliant = (properties.httpsOnly==true) | distinct id,compliant", - "guid": "475ba18f-dbf5-490c-b65d-e8e03f9bcbd4", - "link": "https://learn.microsoft.com/azure/app-service/configure-ssl-bindings#enforce-https", - "service": "App Services", + "guid": "31d41e36-11c8-417b-8afb-c410d4391898", + "link": "https://github.com/Azure/fta-resiliencyplaybooks/blob/main/paas-foundations-playbooks-AEH_v1.docx", + "service": "Event Hubs", "services": [ - "AppSvc", "WAF" ], - "severity": "High", - "text": "Use HTTPS only", - "waf": "Security" + "severity": "Medium", + "text": "Leverage FTA Resillency HandBook", + "waf": "Reliability" }, { - "arm-service": "microsoft.web/sites", + "arm-service": "microsoft.eventhub/namespaces", "checklist": "WAF checklist", - "description": "Do not use wildcards in your CORS configuration, as this allows all origins to access the service (thereby defeating the purpose of CORS). Specifically only allow the origins that you expect to be able to access the service.", - "guid": "68266abc-a264-4f9a-89ae-d9c55d04c2c3", - "link": "https://learn.microsoft.com/azure/app-service/app-service-web-tutorial-rest-api", - "service": "App Services", + "description": " This will be turned on automatically for a new EH namespace created from the portal with Premium, Dedicated, or Standard SKUs in a zone-enabled region. Both the EH metadata and the event data itself are replicated across zones", + "guid": "f15bce21-9e4a-40eb-9787-9424d226786d", + "link": "https://learn.microsoft.com/azure/event-hubs/event-hubs-premium-overview#high-availability-with-availability-zones", + "service": "Event Hubs", "services": [ - "Storage", + "EventHubs", + "ACR", "WAF" ], "severity": "High", - "text": "Wildcards must not be used for CORS", - "waf": "Security" + "text": "Leverage Availability Zones if regionally applicable", + "waf": "Reliability" }, { - "arm-service": "microsoft.web/sites", + "arm-service": "microsoft.eventhub/namespaces", "checklist": "WAF checklist", - "description": "Remote debugging must not be turned on in production as this opens additional ports on the service which increases the attack surface. Note that the service does turn of remote debugging automatically after 48 hours.", - "graph": "appserviceresources | where type =~ 'microsoft.web/sites/config' | extend compliant = (properties.RemoteDebuggingEnabled == false) | distinct id,compliant", - "guid": "d9bd3baf-cda3-4b54-bb2e-b03dd9a25827", - "link": "https://learn.microsoft.com/azure/app-service/configure-common#configure-general-settings", - "service": "App Services", + "guid": "20b56c56-ad58-4519-8f82-735c586bb281", + "link": "https://learn.microsoft.com/azure/event-hubs/compare-tiers", + "service": "Event Hubs", + "services": [ + "WAF" + ], + "severity": "Medium", + "text": "Use the Premium or Dedicated SKUs for predicable performance", + "waf": "Reliability" + }, + { + "arm-service": "microsoft.eventhub/namespaces", + "checklist": "WAF checklist", + "description": "The built-in geo-disaster recovery feature, when enabled, ensures that the entire configuration of anamespace (Event Hubs, Consumer Groups and settings) is continuously replicated from a primary namespace to a secondary namespace, and it allows a once-only failover move from the primary to the secondary at any time. Active/Passive feature is designed to make it easier to recover from and abandon a failed Azure region without having to change application configurations", + "guid": "dc15a1c0-75ee-49f1-90ac-ccd579376bcd", + "link": "https://learn.microsoft.com/azure/event-hubs/event-hubs-geo-dr?tabs=portal", + "service": "Event Hubs", "services": [ + "EventHubs", + "ASR", "WAF" ], "severity": "High", - "text": "Turn off remote debugging", - "waf": "Security" + "text": "Plan for Geo Disaster Recovery using Active Passive configuration", + "waf": "Reliability" }, { - "arm-service": "microsoft.web/sites", + "arm-service": "microsoft.eventhub/namespaces", "checklist": "WAF checklist", - "description": "Enable Defender for App Service. This (amongst other threats) detects communications to known malicious IP addresses. Review the recommendations from Defender for App Service as part of your operations.", - "guid": "18d2ddb1-0725-4769-be66-91a4834ac932", - "link": "https://learn.microsoft.com/azure/defender-for-cloud/defender-for-app-service-introduction", - "service": "App Services", + "description": "Should be used for DR configurations where an outage or loss of event data in the downed region cannot be tolerated. For these cases, follow the replication guidance and do not use the built-in geo-disaster recovery capability (active/passive). With Active/Active, Maintain multiple Event Hubs in different regions and namespaces, and events will be replicated between the hubs", + "guid": "6e31b67d-67ba-4591-89c0-9e805d597c7e", + "link": "https://learn.microsoft.com/azure/event-hubs/event-hubs-federation-overview", + "service": "Event Hubs", "services": [ - "AppSvc", - "Defender", + "EventHubs", + "ASR", "WAF" ], "severity": "Medium", - "text": "Enable Defender for Cloud - Defender for App Service", - "waf": "Security" + "text": "For Business Critical Applications, use Active Active configuration", + "waf": "Reliability" }, { - "arm-service": "microsoft.web/sites", + "arm-service": "microsoft.eventhub/namespaces", "checklist": "WAF checklist", - "description": "Azure provides DDoS Basic protection on its network, which can be improved with intelligent DDoS Standard capabilities which learns about normal traffic patterns and can detect unusual behavior. DDoS Standard applies to a Virtual Network so it must be configured for the network resource in front of the app, such as Application Gateway or an NVA.", - "guid": "223ece80-b123-4071-a541-6415833ea3ad", - "link": "https://learn.microsoft.com/azure/ddos-protection/ddos-protection-overview", - "service": "App Services", + "guid": "9ced16ad-d186-4f0a-a241-a999a68af77c", + "link": "https://learn.microsoft.com/azure/architecture/serverless/event-hubs-functions/resilient-design", + "service": "Event Hubs", "services": [ - "AppGW", - "DDoS", - "NVA", "EventHubs", - "VNet", "WAF" ], "severity": "Medium", - "text": "Enable DDOS Protection Standard on the WAF VNet", - "waf": "Security" + "text": "Design Resilient Event Hubs", + "waf": "Reliability" }, { - "arm-service": "microsoft.web/sites", + "arm-service": "microsoft.network/frontdoors", "checklist": "WAF checklist", - "description": "Where using images stored in Azure Container Registry, pull these over a virtual network from Azure Container Registry using its private endpoint and the app setting 'WEBSITE_PULL_IMAGE_OVER_VNET'.", - "guid": "2c2de732-165c-43ac-aef4-abe1f8d39fda", - "link": "https://learn.microsoft.com/azure/app-service/configure-custom-container#use-an-image-from-a-network-protected-registry", - "service": "App Services", + "guid": "f00a69de-7076-4734-a734-6e4552cad9e1", + "link": "https://learn.microsoft.com/azure/frontdoor/best-practices#use-latest-version-for-customer-managed-certificates", + "service": "Front Door", "services": [ - "PrivateLink", - "ACR", - "VNet", + "WAF", + "FrontDoor", + "AKV" + ], + "severity": "Medium", + "text": "If you use customer-managed TLS certificates with Azure Front Door, use the 'Latest' certificate version. Reduce the risk of outages caused by manual certificate renewal", + "waf": "Operations" + }, + { + "arm-service": "microsoft.network/applicationGateways", + "checklist": "WAF checklist", + "graph": "resources | where type == 'microsoft.network/applicationgateways' | project id, compliant = properties.sku.name in ('Standard_v2', 'WAF_v2') | project id,compliant", + "guid": "553585a6-abe0-11ed-afa1-0242ac120002", + "link": "https://learn.microsoft.com/azure/application-gateway/overview-v2", + "service": "App Gateway", + "services": [ + "AppGW", "WAF" ], "severity": "Medium", - "text": "Pull containers over a Virtual Network", + "text": "Ensure you are using Application Gateway v2 SKU", + "training": "https://learn.microsoft.com/learn/paths/secure-application-delivery/", "waf": "Security" }, { - "arm-service": "microsoft.web/sites", + "arm-service": "Microsoft.Network/loadBalancers", "checklist": "WAF checklist", - "description": "Conduct a penetration test on the web application following the penetration testing rules of engagement.", - "guid": "eb2eb03d-d9a2-4582-918d-2ddb10725769", - "link": "https://learn.microsoft.com/azure/security/fundamentals/pen-testing", - "service": "App Services", + "graph": "resources | where type == 'microsoft.network/loadbalancers' | project id, compliant=(tolower(sku.name) == 'standard')", + "guid": "4e35fbf5-0ae2-48b2-97ce-753353edbd1a", + "link": "https://learn.microsoft.com/azure/load-balancer/load-balancer-overview", + "service": "Load Balancer", "services": [ - "WAF" + "WAF", + "LoadBalancer" ], "severity": "Medium", - "text": "Conduct a penetration test", + "text": "Ensure you are using the Standard SKU for your Azure Load Balancers", "waf": "Security" }, { - "arm-service": "microsoft.web/sites", + "arm-service": "Microsoft.Network/loadBalancers", "checklist": "WAF checklist", - "description": "Deploy trusted code that was validated and scanned for vulnerabilities according to DevSecOps practices.", - "guid": "19aed9c5-5d04-4c2c-9919-ca0b2c12159e", - "link": "https://learn.microsoft.com/azure/architecture/solution-ideas/articles/devsecops-in-azure", - "service": "App Services", + "guid": "9432621a-8397-4654-a882-5bc856b7ef83", + "link": "https://learn.microsoft.com/azure/load-balancer/load-balancer-standard-availability-zones", + "service": "Load Balancer", "services": [ - "WAF" + "WAF", + "LoadBalancer" ], "severity": "Medium", - "text": "Deploy validated code", + "text": "Ensure your Load Balancers frontend IP addresses are zone-redundant (unless you require zonal frontends).", "waf": "Security" }, { - "arm-service": "microsoft.web/sites", + "arm-service": "microsoft.network/applicationGateways", "checklist": "WAF checklist", - "description": "Use the latest versions of supported platforms, programming languages, protocols, and frameworks.", - "guid": "114b933d-f574-4ecc-ad9b-d3bafcda3b54", - "link": "https://learn.microsoft.com/azure/app-service/overview-patch-os-runtime", - "service": "App Services", + "graph": "resources | where type=='microsoft.network/applicationgateways' | extend subnetId = tostring(properties.gatewayIPConfigurations[0].properties.subnet.id) | project id, subnetId | join (resources | where type=='microsoft.network/virtualnetworks' | project id,subnets=properties.subnets | mv-expand subnets | mv-expand subnets.properties.addressPrefixes | project id, subnetId = tostring(subnets.id), prefix1 = subnets.properties.addressPrefix, prefix2 = subnets.properties.addressPrefixes | mv-expand prefix2 | extend prefix = iff(isnotnull(prefix1), prefix1, prefix2) | extend subnetPrefixLength = split(prefix, '/')[1])on subnetId | extend compliant = (subnetPrefixLength <= 24 or subnetPrefixLength == 64) | distinct id,compliant", + "guid": "dfc50f87-3800-424c-937b-ed5f186e7c15", + "link": "https://learn.microsoft.com/azure/application-gateway/configuration-infrastructure#size-of-the-subnet", + "service": "App Gateway", "services": [ + "VNet", + "AppGW", "WAF" ], - "severity": "High", - "text": "Use up-to-date platforms, languages, protocols and frameworks", + "severity": "Medium", + "text": "Your Application Gateways v2 should be deployed in subnets with IP prefixes equal or larger than /24", + "training": "https://learn.microsoft.com/learn/paths/secure-application-delivery/", "waf": "Security" }, { - "arm-service": "Microsoft.DBforMySQL/servers", + "arm-service": "microsoft.network/applicationGateways", "checklist": "WAF checklist", - "guid": "388c3e25-e800-4ad2-9df3-f3d6ae1050b7", - "link": "https://learn.microsoft.com/azure/mysql/flexible-server/overview", - "service": "Azure MySQL", + "description": "Administration of reverse proxies in general and WAF in particular is closer to the application than to networking, so they belong in the same subscription as the app. Centralizing the Application Gateway and WAF in the connectivity subscription might be OK if it is managed by one single team.", + "guid": "48b662d6-d15f-4512-a654-98f6dfe237de", + "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/ag-overview", + "service": "App Gateway", "services": [ - "WAF" + "Entra", + "AppGW", + "VNet", + "WAF", + "NVA", + "Subscriptions" ], "severity": "Medium", - "text": "Leverage Flexible Server", - "waf": "Reliability" + "text": "Deploy Azure Application Gateway v2 or partner NVAs used for proxying inbound HTTP(S) connections within the landing-zone virtual network and with the apps that they're securing.", + "training": "https://learn.microsoft.com/learn/paths/secure-application-delivery/", + "waf": "Security" }, { - "arm-service": "Microsoft.DBforMySQL/servers", + "arm-service": "microsoft.network/applicationGateways", "checklist": "WAF checklist", - "guid": "de3aad1e-8c38-4ec9-9666-7313c005674b", - "link": "https://learn.microsoft.com/azure/mysql/flexible-server/overview#high-availability-within-and-across-availability-zones", - "service": "Azure MySQL", + "guid": "f109e1f3-c79b-4f14-82de-6b5c22314d08", + "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/ag-overview", + "service": "App Gateway", "services": [ - "WAF" + "WAF", + "DDoS" ], - "severity": "High", - "text": "Leverage Availability Zones where regionally applicable", - "waf": "Reliability" + "severity": "Medium", + "text": "Use a DDoS Network or IP protection plans for all Public IP addresses in application landing zones.", + "training": "https://learn.microsoft.com/learn/paths/secure-networking-infrastructure/", + "waf": "Security" }, { - "arm-service": "Microsoft.DBforMySQL/servers", + "arm-service": "microsoft.network/applicationGateways", "checklist": "WAF checklist", - "guid": "1e944a45-9c37-43e7-bd61-623b365a917e", - "link": "https://learn.microsoft.com/azure/mysql/flexible-server/overview#setup-hybrid-or-multi-cloud-data-synchronization-with-data-in-replication", - "service": "Azure MySQL", + "graph": "resources | where type =~ 'microsoft.network/applicationGateways' | extend compliant = (isnotnull(properties.autoscaleConfiguration) and properties.autoscaleConfiguration.minCapacity >= 2) | distinct id,compliant", + "guid": "135bf4ac-f9db-461f-b76b-2ee9e30b12c0", + "link": "https://learn.microsoft.com/azure/application-gateway/application-gateway-autoscaling-zone-redundant", + "service": "App Gateway", "services": [ "WAF" ], "severity": "Medium", - "text": "Leverage Data-in replication for cross-region DR scenarios", + "text": "Configure autoscaling with a minimum amount of instances of two.", + "training": "https://learn.microsoft.com/learn/paths/secure-application-delivery/", "waf": "Reliability" }, { - "arm-service": "Microsoft.Kusto/clusters", + "arm-service": "microsoft.network/applicationGateways", "checklist": "WAF checklist", - "description": "Using the correct approach to feed a datalake with cold data and having the Kusto query engine at your disposal at the same time, as in the short-term storage", - "guid": "ba7da7be-9951-4914-a384-5d997cb39132", - "link": "https://learn.microsoft.com/azure/data-explorer/kusto/management/data-export/continuous-data-export", - "service": "Azure Data Explorer", + "graph": "resources | where type =~ 'microsoft.network/applicationGateways' | extend compliant = (isnotnull(zones) and array_length(zones) > 1) | distinct id,compliant", + "guid": "060c6964-52b5-48db-af8b-83e4b2d85349", + "link": "https://learn.microsoft.com/azure/reliability/migrate-app-gateway-v2", + "service": "App Gateway", "services": [ - "Storage", - "Cost", + "ACR", + "AppGW", "WAF" ], - "text": "Leverage External Tables and Continuous data export overview to reduce costs", + "severity": "Medium", + "text": "Deploy Application Gateway across Availability Zones", + "training": "https://learn.microsoft.com/learn/paths/secure-application-delivery/", "waf": "Reliability" }, { - "arm-service": "Microsoft.Kusto/clusters", + "arm-service": "microsoft.network/frontdoors", "checklist": "WAF checklist", - "description": "Azure Data Explorer provides an optional follower capability for a leader cluster to be followed by other follower clusters for read-only access to the leader's data and metadata. Changes in the leader, such as create, append, and drop are automatically synchronized to the follower. While the leaders could span Azure regions, the follower clusters should be hosted in the same region(s) as the leader. If the leader cluster is down or databases or tables are accidentally dropped, the follower clusters will lose access until access is recovered in the leader.", - "guid": "56a22586-f490-4641-addd-ea8a377cdeb3", - "link": "https://learn.microsoft.com/azure/data-explorer/follower?tabs=csharp", - "service": "Azure Data Explorer", + "guid": "e79d17b7-3b22-4a5a-97e7-a8ed4b30e38c", + "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/ag-overview", + "service": "Front Door", "services": [ - "Storage", - "WAF" + "WAF", + "FrontDoor", + "AzurePolicy" ], - "text": "To share data, explore Leader-follower cluster configuration", - "waf": "Reliability" + "severity": "Medium", + "text": "Use Azure Front Door with WAF policies to deliver and help protect global HTTP/S apps that span multiple Azure regions.", + "training": "https://learn.microsoft.com/learn/paths/secure-networking-infrastructure/", + "waf": "Security" }, { - "arm-service": "Microsoft.Kusto/clusters", + "arm-service": "microsoft.network/frontdoors", "checklist": "WAF checklist", - "description": "Azure Data Explorer doesn't support automatic protection against the outage of an entire Azure region. This disruption can happen during a natural disaster, like an earthquake. If you require a solution for a disaster recovery situation, do the following steps to ensure business continuity. In these steps, you'll replicate your clusters, management, and data ingestion in two Azure paired regions.", - "guid": "861bb2bc-14ae-4a6e-95d8-d9a3adc218e6", - "link": "https://learn.microsoft.com/azure/data-explorer/business-continuity-create-solution#create-multiple-independent-clusters", - "service": "Azure Data Explorer", + "guid": "3f29812b-2363-4cef-b179-b599de0d5973", + "link": "https://learn.microsoft.com/azure/ddos-protection/ddos-protection-overview", + "service": "Front Door", "services": [ - "ASR", - "WAF" + "AppGW", + "WAF", + "FrontDoor", + "AzurePolicy" ], - "text": "To protect against regional failure, create Multiple independent clusters, preferably in two Azure Paired regions", - "waf": "Reliability" + "severity": "Medium", + "text": "When using Front Door and Application Gateway to help protect HTTP/S apps, use WAF policies in Front Door. Lock down Application Gateway to receive traffic only from Front Door.", + "training": "https://learn.microsoft.com/learn/paths/secure-networking-infrastructure/", + "waf": "Security" }, { - "arm-service": "Microsoft.Kusto/clusters", + "ammp": true, + "arm-service": "microsoft.network/trafficManagerProfiles", "checklist": "WAF checklist", - "guid": "436b0635-cb45-4e57-a603-324ace8cc123", - "link": "https://learn.microsoft.com/azure/data-explorer/business-continuity-create-solution#replicate-management-activities", - "service": "Azure Data Explorer", + "guid": "cd4cd21b-0881-437f-9e6c-4cfd3e504547", + "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/ag-overview", + "service": "Traffic Manager", "services": [ - "RBAC", - "Storage", + "TrafficManager", "WAF" ], - "text": "Replicate all management activities such as creating new tables or managing user roles on each cluster.", + "severity": "High", + "text": "Use Traffic Manager to deliver global apps that span protocols other than HTTP/S.", + "training": "https://learn.microsoft.com/learn/paths/secure-networking-infrastructure/", "waf": "Reliability" }, { - "arm-service": "Microsoft.Kusto/clusters", "checklist": "WAF checklist", - "guid": "18ca6017-0265-4f4b-a46a-393af7f31728", - "link": "https://learn.microsoft.com/azure/data-explorer/business-continuity-create-solution", - "service": "Azure Data Explorer", + "guid": "3b4b3e88-a459-4ed5-a22f-644dfbc58204", + "link": "https://learn.microsoft.com/azure/active-directory/app-proxy/application-proxy#how-application-proxy-works", + "service": "Entra", "services": [ - "WAF" + "AVD", + "WAF", + "Entra" ], - "text": "Ingest data into each cluster in parallel", - "waf": "Reliability" + "severity": "Low", + "text": "If users only need access to internal applications, has Microsoft Entra ID Application Proxy been considered as an alternative to Azure Virtual Desktop (AVD)?", + "training": "https://learn.microsoft.com/learn/modules/configure-azure-ad-application-proxy/", + "waf": "Security" }, { - "arm-service": "Microsoft.Kusto/clusters", "checklist": "WAF checklist", - "description": "This configuration is also called 'always-on'. For critical application deployments with no tolerance for outages, you should use multiple Azure Data Explorer clusters across Azure paired regions.", - "guid": "58a9c279-9c42-4bb6-9d0c-65556246b338", - "link": "https://learn.microsoft.com/azure/data-explorer/business-continuity-overview#active-active-active-configuration", - "service": "Azure Data Explorer", + "guid": "01ca7cf1-5754-442d-babb-8ba6772e5c30", + "link": "https://learn.microsoft.com/azure/active-directory/app-proxy/application-proxy#how-application-proxy-works", + "service": "Entra", "services": [ - "ACR", + "Entra", "WAF" ], - "text": "For critical application with no tolerance for outages, create Active-Active-Active (always-on) configuration", - "waf": "Reliability" + "severity": "Medium", + "text": "To reduce the number of firewall ports open for incoming connections in your network, consider using Microsoft Entra ID Application Proxy to give remote users secure and authenticated access to internal applications.", + "training": "https://learn.microsoft.com/learn/paths/implement-applications-external-access-azure-ad/", + "waf": "Security" }, { - "arm-service": "Microsoft.Kusto/clusters", + "ammp": true, + "arm-service": "microsoft.network/frontdoors", "checklist": "WAF checklist", - "description": "This configuration is identical to the active-active-active configuration, but only involves two Azure paired regions. Configure dual ingestion, processing, and curation. Users are routed to the nearest region. The cluster SKU must be the same across regions.", - "guid": "563a4dc7-4a74-48b6-922a-d190916a6649", - "link": "https://learn.microsoft.com/azure/data-explorer/business-continuity-overview#active-active-configuration", - "service": "Azure Data Explorer", + "graph": "resources | where type == 'microsoft.network/frontdoorwebapplicationfirewallpolicies' | project policyName=name, policyId=id,policySku=sku.name, links=properties.securityPolicyLinks, enabledState=properties.policySettings.enabledState, mode=properties.policySettings.mode | mvexpand links | extend securityPolicy=links.id | extend securityPolicyParts=split(securityPolicy, '/') | extend profileId=strcat_array(array_slice(securityPolicyParts, 0, -3), '/') | project id=profileId, compliant=((enabledState=='Enabled') and (mode=='Prevention')), enabledState, mode", + "guid": "ae248989-b306-4591-9186-de482e3f0f0e", + "link": "https://learn.microsoft.com/azure/web-application-firewall/afds/waf-front-door-policy-settings", + "service": "Front Door", "services": [ - "ACR", - "WAF" + "WAF", + "FrontDoor", + "AzurePolicy" ], - "text": "For critical applications, create Active-Active configuration in two paired regions", - "waf": "Reliability" + "severity": "High", + "text": "Deploy your WAF policy for Front Door in 'Prevention' mode' so that Web Application Firewall takes appropriate action to allow or deny traffic.", + "waf": "Security" }, { - "arm-service": "Microsoft.Kusto/clusters", + "ammp": true, + "arm-service": "microsoft.network/frontdoors", "checklist": "WAF checklist", - "description": "The Active-Hot configuration is similar to the Active-Active configuration in dual ingest, processing, and curation. While the standby cluster is online for ingestion, process, and curation, it isn't available to query. The standby cluster doesn't need to be in the same SKU as the primary cluster. It can be of a smaller SKU and scale, which may result in it being less performant. In a disaster scenario, users are redirected to the standby cluster, which can optionally be scaled up to increase performance.", - "guid": "8fadfe27-7de2-483b-8ac3-52baa9b75708", - "link": "https://learn.microsoft.com/azure/data-explorer/business-continuity-overview#active-hot-standby-configuration", - "service": "Azure Data Explorer", + "guid": "062d5839-4d36-402f-bfa4-02811eb936e9", + "link": "https://learn.microsoft.com/azure/frontdoor/best-practices#avoid-combining-traffic-manager-and-front-door", + "service": "Front Door", "services": [ - "WAF" + "TrafficManager", + "WAF", + "FrontDoor" ], - "text": "For applications, which required only read during failure, create Active-Hot standby configuration", - "waf": "Reliability" + "severity": "High", + "text": "Avoid combining Azure Traffic Manager and Azure Front Door.", + "waf": "Security" }, { - "arm-service": "Microsoft.Kusto/clusters", + "ammp": true, + "arm-service": "microsoft.network/frontdoors", "checklist": "WAF checklist", - "description": "This solution offers the least resiliency (highest RPO and RTO), is the lowest in cost and highest in effort. In this configuration, there's no data recovery cluster. Configure continuous export of curated data (unless raw and intermediate data is also required) to a storage account that is configured GRS (Geo Redundant Storage). A data recovery cluster is spun up if there is a disaster recovery scenario. At that time, DDLs, configuration, policies, and processes are applied. Data is ingested from storage with the ingestion property kustoCreationTime to over-ride the ingestion time that defaults to system time.", - "guid": "49aa8092-dc8e-4b9d-8bb7-3b26a5a67eba", - "link": "https://learn.microsoft.com/azure/data-explorer/business-continuity-overview#on-demand-data-recovery-configuration", - "service": "Azure Data Explorer", + "guid": "5efeb96a-003f-4b18-8fcd-b4d84459c2b2", + "link": "https://learn.microsoft.com/azure/frontdoor/best-practices#use-the-same-domain-name-on-front-door-and-your-origin", + "service": "Front Door", "services": [ - "Storage", - "ASR", - "AzurePolicy", - "Cost", - "WAF" + "WAF", + "FrontDoor" ], - "text": "For applications, where cost is a concern and can withstand some downtime during failure, create on-demand data recovery cluster configuration", - "waf": "Reliability" + "severity": "High", + "text": "Use the same domain name on Azure Front Door and your origin. Mismatched host names can cause subtle bugs.", + "waf": "Security" }, { - "arm-service": "Microsoft.Kusto/clusters", + "arm-service": "microsoft.network/frontdoors", "checklist": "WAF checklist", - "description": "All database objects, policies, and configurations should be persisted in source control so they can be released to the cluster from your release automation tool.", - "guid": "5a907e1e-348e-4f25-9c27-d32e8bbac757", - "link": "https://learn.microsoft.com/azure/data-explorer/devops", - "service": "Azure Data Explorer", + "graph": "cdnresources | where type =~ 'microsoft.cdn/profiles/origingroups/origins' | extend frontDoorId = substring(id, 0, indexof(id, '/origingroups')) | extend originGroupId = substring(id, 0, indexof(id, '/origins')) | join kind=inner (cdnresources | where type =~ 'microsoft.cdn/profiles/origingroups' | extend originGroupName = name | extend hasHealthProbe = isnotnull(properties.healthProbeSettings)) on $left.originGroupId == $right.id | summarize numberOrigins = count() by originGroupId, subscriptionId, frontDoorId, hasHealthProbe, originGroupName | extend compliant = not(numberOrigins == 1 and hasHealthProbe) | project id = frontDoorId, compliant", + "guid": "0b5a380c-4bfb-47bc-b1d7-dcfef363a61b", + "link": "https://learn.microsoft.com/azure/frontdoor/best-practices#disable-health-probes-when-theres-only-one-origin-in-an-origin-group", + "service": "Front Door", "services": [ - "AzurePolicy", - "WAF" + "WAF", + "FrontDoor" ], - "text": "Wrap DevOps and source control around all your code", - "training": "https://learn.microsoft.com/learn/paths/secure-your-cloud-data/", - "waf": "Reliability" + "severity": "Low", + "text": "Disable health probes when there is only one origin in an Azure Front Door origin group.", + "waf": "Performance" }, { - "arm-service": "Microsoft.Kusto/clusters", + "arm-service": "microsoft.network/frontdoors", "checklist": "WAF checklist", - "guid": "1559ab91-53e8-4908-ae28-b84c33b6b780", - "link": "https://learn.microsoft.com/azure/data-explorer/devops", - "service": "Azure Data Explorer", + "guid": "5567048e-e5d7-4206-9c55-b5ed45d2cc0c", + "link": "https://learn.microsoft.com/azure/frontdoor/best-practices#select-good-health-probe-endpoints", + "service": "Front Door", "services": [ - "WAF" + "WAF", + "FrontDoor" ], - "text": "Design, develop, and implement validation routines to ensure all clusters are in-sync from a data perspective.", - "training": "https://learn.microsoft.com/learn/modules/azure-active-directory/", + "severity": "Medium", + "text": "Select good health probe endpoints for Azure Front Door. Consider building health endpoints that check all of your application's dependencies.", "waf": "Reliability" }, { - "arm-service": "Microsoft.Kusto/clusters", + "arm-service": "microsoft.network/frontdoors", "checklist": "WAF checklist", - "guid": "8b9fe5c4-1049-4d40-9a82-2c3474d00f18", - "link": "https://learn.microsoft.com/azure/data-explorer/devops", - "service": "Azure Data Explorer", + "graph": "cdnresources | where type =~ 'microsoft.cdn/profiles/origingroups' | extend frontDoorId = substring(id, 0, indexof(id, '/origingroups/')) | extend compliant = (isnull(properties['healthProbeSettings']['probeRequestType']) or toupper(properties['healthProbeSettings']['probeRequestType']) == 'HEAD') | project compliant, id=frontDoorId", + "guid": "a13f72f3-8f5c-4864-95e5-75bf37fbbeb1", + "link": "https://learn.microsoft.com/azure/frontdoor/best-practices#use-head-health-probes", + "service": "Front Door", "services": [ - "WAF" + "WAF", + "FrontDoor" ], - "text": "Be fully cognizant of what it takes to build a cluster from scratch. Leverage Infrastructure as a Code for your deployments", - "training": "https://learn.microsoft.com/learn/modules/implement-hybrid-identity-windows-server/", - "waf": "Reliability" + "severity": "Low", + "text": "Use HEAD health probes with Azure Front Door, to reduce the traffic that Front Door sends to your application.", + "waf": "Performance" }, { - "arm-service": "microsoft.cache/redis", + "ammp": true, + "arm-service": "Microsoft.Network/loadBalancers", "checklist": "WAF checklist", - "guid": "65285269-440b-44be-9d3e-0844276d4bdc", - "link": "https://learn.microsoft.com/azure/azure-cache-for-redis/cache-how-to-zone-redundancy", - "service": "Redis", + "graph": "resources | where type=='microsoft.network/loadbalancers' | extend countOutRules=array_length(properties.outboundRules) | extend compliant = (countOutRules == 0) | distinct id,compliant", + "guid": "97a2fd46-64b0-1dfa-b72d-9c8869496d75", + "link": "https://learn.microsoft.com/azure/nat-gateway/nat-overview#outbound-connectivity", + "service": "Load Balancer", "services": [ - "ACR", - "WAF" + "WAF", + "LoadBalancer" ], "severity": "High", - "text": "Enable zone redundancy for Azure Cache for Redis. Azure Cache for Redis supports zone redundant configurations in the Premium and Enterprise tiers. A zone redundant cache can place its nodes across different Azure Availability Zones in the same region. It eliminates data center or AZ outage as a single point of failure and increases the overall availability of your cache.", + "text": "Use Azure NAT Gateway instead of Load Balancer outbound rules for better SNAT scalability", "waf": "Reliability" }, { - "arm-service": "microsoft.cache/redis", + "ammp": true, + "arm-service": "microsoft.network/frontdoors", "checklist": "WAF checklist", - "guid": "bc178bdc-5a06-4ca7-8443-51e19dd34429", - "link": "https://learn.microsoft.com/en-us/azure/azure-cache-for-redis/cache-high-availability#persistence", - "service": "Redis", + "graph": "cdnresources | where type =~ 'microsoft.cdn/profiles/customdomains' | extend frontDoorId = substring(id, 0, indexof(id, '/customdomains')) | extend compliant = (isnull(properties['tlsSettings']['certificateType']) or tolower(properties['tlsSettings']['certificateType']) =~ 'customercertificate') | project compliant, id = frontDoorId", + "guid": "af95c92d-d723-4f4a-98d7-8722324efd4d", + "link": "https://learn.microsoft.com/azure/frontdoor/best-practices#use-managed-tls-certificates", + "service": "Front Door", "services": [ - "Storage", - "WAF" + "Cost", + "WAF", + "FrontDoor", + "AKV" ], - "severity": "Medium", - "text": "Configure data persistence for an Azure Cache for Redis instance. Because your cache data is stored in memory, a rare and unplanned failure of multiple nodes can cause all the data to be dropped. To avoid losing data completely, Redis persistence allows you to take periodic snapshots of in-memory data, and store it to your storage account.", - "waf": "Reliability" + "severity": "High", + "text": "Use managed TLS certificates with Azure Front Door. Reduce operational cost and risk of outages due to certificate renewals.", + "waf": "Operations" }, { - "arm-service": "microsoft.cache/redis", + "arm-service": "microsoft.network/frontdoors", "checklist": "WAF checklist", - "guid": "eb722823-7a15-41c5-ab4e-4f1814387e5c", - "link": "https://learn.microsoft.com/en-us/azure/azure-cache-for-redis/cache-high-availability#storage-account-for-persistence", - "service": "Redis", + "guid": "189ea962-3969-4863-8f5a-5ad808c2cf4b", + "link": "https://learn.microsoft.com/azure/web-application-firewall/afds/waf-front-door-best-practices#define-your-waf-configuration-as-code", + "service": "Front Door", "services": [ - "Storage", - "WAF" + "WAF", + "FrontDoor" ], "severity": "Medium", - "text": "Use Geo-redundant storage account to persist Azure Cache for Redis data, or zonally redundant where geo-redundancy is not available", - "waf": "Reliability" + "text": "Define your Azure Front Door WAF configuration as code. By using code, you can more easily adopt new rule set version and gain additional protection.", + "waf": "Operations" }, { - "arm-service": "microsoft.cache/redis", + "ammp": true, + "arm-service": "microsoft.network/frontdoors", "checklist": "WAF checklist", - "guid": "a8c26c9b-32ab-45bd-bc69-98a135e33789", - "link": "https://learn.microsoft.com/azure/azure-cache-for-redis/cache-how-to-geo-replication", - "service": "Redis", + "guid": "2e30abab-5478-417c-81bf-bf1ad4ed1ed4", + "link": "https://learn.microsoft.com/azure/frontdoor/best-practices#use-end-to-end-tls", + "service": "Front Door", "services": [ - "ASR", - "WAF" + "WAF", + "FrontDoor" ], - "severity": "Medium", - "text": "Configure passive geo-replication for Premium Azure Cache for Redis instances. Geo-replication is a mechanism for linking two or more Azure Cache for Redis instances, typically spanning two Azure regions. Geo-replication is designed mainly for cross-region disaster recovery. Two Premium tier cache instances are connected through geo-replication in a way that provides reads and writes to your primary cache, and that data is replicated to the secondary cache.", - "waf": "Reliability" + "severity": "High", + "text": "Use end-to-end TLS with Azure Front Door. Use TLS for connections from your clients to Front Door, and from Front Door to your origin.", + "waf": "Security" }, { - "arm-service": "microsoft.eventhub/namespaces", + "arm-service": "microsoft.network/frontdoors", "checklist": "WAF checklist", - "description": "Azure Event Hub provides encryption of data at rest. If you use your own key, the data is still encrypted using the Microsoft-managed key, but in addition the Microsoft-managed key will be encrypted using the customer-managed key. ", - "guid": "7aaf12e7-b94e-4f6e-847d-2d92981b1cd6", - "link": "https://learn.microsoft.com/azure/event-hubs/configure-customer-managed-key", - "service": "Event Hubs", + "guid": "10aa45af-166f-44c4-9f36-b6d592dac2ca", + "link": "https://learn.microsoft.com/azure/frontdoor/best-practices#use-http-to-https-redirection", + "service": "Front Door", "services": [ - "EventHubs", - "WAF" + "WAF", + "FrontDoor" ], - "severity": "Low", - "text": "Use customer-managed key option in data at rest encryption when required", - "training": "https://learn.microsoft.com/learn/modules/plan-implement-administer-conditional-access/", + "severity": "Medium", + "text": "Use HTTP to HTTPS redirection with Azure Front Door. Support older clients by redirecting them to an HTTPS request automatically.", "waf": "Security" }, { - "arm-service": "microsoft.eventhub/namespaces", + "ammp": true, + "arm-service": "microsoft.network/frontdoors", "checklist": "WAF checklist", - "description": "Azure Event Hubs namespaces permit clients to send and receive data with TLS 1.0 and above. To enforce stricter security measures, you can configure your Event Hubs namespace to require that clients send and receive data with a newer version of TLS. If an Event Hubs namespace requires a minimum version of TLS, then any requests made with an older version will fail. ", - "guid": "d2f54b29-769e-43a6-a0e7-828ac936657e", - "link": "https://learn.microsoft.com/azure/event-hubs/transport-layer-security-configure-minimum-version", - "service": "Event Hubs", + "guid": "28b9ee82-b2c7-45aa-bc98-6de6f59a095d", + "link": "https://learn.microsoft.com/azure/frontdoor/best-practices#enable-the-waf", + "service": "Front Door", "services": [ - "EventHubs", - "WAF" + "WAF", + "FrontDoor" ], - "severity": "Medium", - "text": "Enforce a minimum required version of Transport Layer Security (TLS) for requests ", - "training": "https://learn.microsoft.com/learn/modules/secure-aad-users-with-mfa/", + "severity": "High", + "text": "Enable the Azure Front Door WAF. Protect your application from a range of attacks.", "waf": "Security" }, { - "arm-service": "microsoft.eventhub/namespaces", + "ammp": true, + "arm-service": "microsoft.network/frontdoors", "checklist": "WAF checklist", - "description": "When you create an Event Hubs namespace, a policy rule named RootManageSharedAccessKey is automatically created for the namespace. This policy has manage permissions for the entire namespace. It�s recommended that you treat this rule like an administrative root account and don�t use it in your application. Using AAD as an authentication provider with RBAC is recommended. ", - "guid": "13b0f566-4b1e-4944-a459-837ee79d6c6d", - "link": "https://learn.microsoft.com/azure/event-hubs/authorize-access-shared-access-signature#shared-access-authorization-policies", - "service": "Event Hubs", + "guid": "2902d8cc-1b0c-4495-afad-624ab70f7bd6", + "link": "https://learn.microsoft.com/azure/web-application-firewall/afds/waf-front-door-best-practices#tune-your-waf", + "service": "Front Door", "services": [ - "Entra", - "AzurePolicy", - "RBAC", - "TrafficManager", - "EventHubs", - "WAF" + "WAF", + "FrontDoor" ], - "severity": "Medium", - "text": "Avoid using root account when it is not necessary", - "training": "https://learn.microsoft.com/learn/paths/azure-administrator-manage-identities-governance/", + "severity": "High", + "text": "Tune the Azure Front Door WAF for your workload by configuring the WAF in Detection mode to reduce and fix false positive detections.", "waf": "Security" }, { - "arm-service": "microsoft.eventhub/namespaces", + "ammp": true, + "arm-service": "microsoft.network/frontdoors", "checklist": "WAF checklist", - "description": "Managed identities for Azure resources can authorize access to Event Hubs resources using Azure AD credentials from applications running in Azure Virtual Machines (VMs), Function apps, Virtual Machine Scale Sets, and other services. By using managed identities for Azure resources together with Azure AD authentication, you can avoid storing credentials with your applications that run in the cloud. ", - "guid": "3a365a5c-7acb-4e48-abd5-4cd79f2e8776", - "link": "https://learn.microsoft.com/azure/event-hubs/authenticate-managed-identity?tabs=latest", - "service": "Event Hubs", + "guid": "17ba124b-127d-42b6-9322-388d5b2bbcfc", + "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/application-gateway-waf-request-size-limits#request-body-inspection", + "service": "Front Door", "services": [ - "Entra", - "AKV", - "Storage", - "VM", - "EventHubs", - "WAF" + "WAF", + "FrontDoor", + "AzurePolicy" ], - "severity": "Medium", - "text": "When possible, your application should be using a managed identity to authenticate to Azure Event Hub. If not, consider having the storage credential (SAS, service principal credential) in Azure Key Vault or an equivalent service", - "training": "https://learn.microsoft.com/learn/modules/azure-ad-privileged-identity-management/", + "severity": "High", + "text": "Enable request body inspection feature enabled in Azure Front Door WAF policy.", "waf": "Security" }, { - "arm-service": "microsoft.eventhub/namespaces", + "ammp": true, + "arm-service": "microsoft.network/frontdoors", "checklist": "WAF checklist", - "description": "When creating permissions, provide fine-grained control over a client's access to Azure Event Hub. Permissions in Azure Event Hub can and should be scoped to the individual resource level e.g. consumer group, event hub entity, event hub namespaces, etc.", - "guid": "8357c559-675c-45ee-a5b8-6ad8844ce3b2", - "link": "https://learn.microsoft.com/azure/event-hubs/authorize-access-azure-active-directory#azure-built-in-roles-for-azure-event-hubs", - "service": "Event Hubs", + "guid": "49a98f2b-ec22-4a87-9415-6a10b00d6555", + "link": "https://learn.microsoft.com/azure/web-application-firewall/afds/waf-front-door-best-practices#enable-default-rule-sets", + "service": "Front Door", "services": [ - "RBAC", - "EventHubs", - "WAF" + "WAF", + "FrontDoor" ], "severity": "High", - "text": "Use least privilege data plane RBAC", - "training": "https://learn.microsoft.com/learn/modules/explore-basic-services-identity-types/", + "text": "Enable the Azure Front Door WAF default rule sets. The default rule sets detect and block common attacks.", "waf": "Security" }, { - "arm-service": "microsoft.eventhub/namespaces", + "ammp": true, + "arm-service": "microsoft.network/frontdoors", "checklist": "WAF checklist", - "description": "Azure Event Hub resource logs include operational logs, virtual network and Kafka logs. Runtime audit logs capture aggregated diagnostic information for all data plane access operations (such as send or receive events) in Event Hubs.", - "guid": "b38b875b-a1cf-4104-a900-3a4d3ce474db", - "link": "https://learn.microsoft.com/azure/event-hubs/monitor-event-hubs-reference", - "service": "Event Hubs", + "guid": "147a13d4-2a2f-4824-a524-f5855b52b946", + "link": "https://learn.microsoft.com/azure/web-application-firewall/afds/waf-front-door-best-practices#enable-bot-management-rules", + "service": "Front Door", "services": [ - "EventHubs", - "Monitor", - "VNet", - "WAF" + "WAF", + "FrontDoor" ], - "severity": "Medium", - "text": "Enable logging for security investigation. Use Azure Monitor to captured metrics and logs such as resource logs, runtime audit logs and Kafka logs", - "training": "https://learn.microsoft.com/learn/paths/manage-identity-and-access/", + "severity": "High", + "text": "Enable the Azure Front Door WAF bot protection rule set. The bot rules detect good and bad bots.", "waf": "Security" }, { - "arm-service": "microsoft.eventhub/namespaces", + "arm-service": "microsoft.network/frontdoors", "checklist": "WAF checklist", - "description": "Azure Event Hub by default has a public IP address and is Internet-reachable. Private endpoints allow traffic between your virtual network and Azure Event Hub traverses over the Microsoft backbone network. In addition to that, you should disable public endpoints if those are not used. ", - "guid": "5abca2a4-eda1-4dae-8cc9-5d48c6b791dc", - "link": "https://learn.microsoft.com/azure/event-hubs/private-link-service", - "service": "Event Hubs", + "guid": "d7dcdcb9-0d99-44b9-baab-ac7570ede79a", + "link": "https://learn.microsoft.com/azure/web-application-firewall/afds/waf-front-door-best-practices#use-the-latest-ruleset-versions", + "service": "Front Door", "services": [ - "PrivateLink", - "EventHubs", - "VNet", - "WAF" + "WAF", + "FrontDoor" ], "severity": "Medium", - "text": "Consider using private endpoints to access Azure Event Hub and disable public network access when applicable.", - "training": "https://learn.microsoft.com/learn/modules/azure-ad-privileged-identity-management/", + "text": "Use the latest Azure Front Door WAF rule set version. Rule set updates are regularly updated to take account of the current threat landscape.", "waf": "Security" }, { - "arm-service": "microsoft.eventhub/namespaces", + "arm-service": "microsoft.network/frontdoors", "checklist": "WAF checklist", - "description": "With IP firewall, you can restrict public endpoint further to only a set of IPv4 addresses or IPv4 address ranges in CIDR (Classless Inter-Domain Routing) notation. ", - "guid": "a0e6c465-89e5-458b-a37d-3974d1112dbd", - "link": "https://learn.microsoft.com/azure/event-hubs/event-hubs-ip-filtering", - "service": "Event Hubs", + "guid": "b9620385-1cde-418f-914b-a84a06982ffc", + "link": "https://learn.microsoft.com/azure/web-application-firewall/afds/waf-front-door-best-practices#add-rate-limiting", + "service": "Front Door", "services": [ - "EventHubs", - "WAF" + "WAF", + "FrontDoor" ], "severity": "Medium", - "text": "Consider only allowing access to Azure Event Hub namespace from specific IP addresses or ranges", - "training": "https://learn.microsoft.com/learn/paths/implement-resource-mgmt-security/", + "text": "Add rate limiting to the Azure Front Door WAF. Rate limiting blocks clients accidentally or intentionally sending large amounts of traffic in a short period of time.", "waf": "Security" }, { - "arm-service": "microsoft.eventhub/namespaces", + "arm-service": "microsoft.network/frontdoors", "checklist": "WAF checklist", - "guid": "31d41e36-11c8-417b-8afb-c410d4391898", - "link": "https://github.com/Azure/fta-resiliencyplaybooks/blob/main/paas-foundations-playbooks-AEH_v1.docx", - "service": "Event Hubs", + "guid": "6dc36c52-0124-4ffe-9eaf-23ec1282dedb", + "link": "https://learn.microsoft.com/azure/web-application-firewall/afds/waf-front-door-best-practices#use-a-high-threshold-for-rate-limits", + "service": "Front Door", "services": [ - "WAF" + "WAF", + "FrontDoor" ], "severity": "Medium", - "text": "Leverage FTA Resillency HandBook", - "waf": "Reliability" + "text": "Use a high threshold for Azure Front Door WAF rate limits. High rate limit thresholds avoid blocking legitimate traffic, while still providing protection against extremely high numbers of requests that might overwhelm your infrastructure. ", + "waf": "Security" }, { - "arm-service": "microsoft.eventhub/namespaces", + "arm-service": "microsoft.network/frontdoors", "checklist": "WAF checklist", - "description": " This will be turned on automatically for a new EH namespace created from the portal with Premium, Dedicated, or Standard SKUs in a zone-enabled region. Both the EH metadata and the event data itself are replicated across zones", - "guid": "f15bce21-9e4a-40eb-9787-9424d226786d", - "link": "https://learn.microsoft.com/azure/event-hubs/event-hubs-premium-overview#high-availability-with-availability-zones", - "service": "Event Hubs", + "guid": "388a3d0e-0a43-4367-90b2-3dd2aeece5ee", + "link": "https://learn.microsoft.com/azure/web-application-firewall/afds/waf-front-door-best-practices#geo-filter-traffic", + "service": "Front Door", "services": [ - "EventHubs", - "ACR", "WAF" ], - "severity": "High", - "text": "Leverage Availability Zones if regionally applicable", - "waf": "Reliability" + "severity": "Low", + "text": "If you are not expecting traffic from all geographical regions, use geo-filters to block traffic from non-expected countries.", + "waf": "Security" }, { - "arm-service": "microsoft.eventhub/namespaces", + "arm-service": "microsoft.network/frontdoors", "checklist": "WAF checklist", - "guid": "20b56c56-ad58-4519-8f82-735c586bb281", - "link": "https://learn.microsoft.com/azure/event-hubs/compare-tiers", - "service": "Event Hubs", + "guid": "00acd8a9-6975-414f-8491-2be6309893b8", + "link": "https://learn.microsoft.com/azure/web-application-firewall/afds/waf-front-door-best-practices#specify-the-unknown-zz-location", + "service": "Front Door", "services": [ - "WAF" + "WAF", + "FrontDoor" ], "severity": "Medium", - "text": "Use the Premium or Dedicated SKUs for predicable performance", - "waf": "Reliability" + "text": "Specify the unknown (ZZ) location when geo-filtering traffic with the Azure Front Door WAF. Avoid accidentally blocking legitimate requests when IP addresses can't be geo-matched.", + "waf": "Security" }, { - "arm-service": "microsoft.eventhub/namespaces", + "ammp": true, + "arm-service": "microsoft.network/applicationGateways", "checklist": "WAF checklist", - "description": "The built-in geo-disaster recovery feature, when enabled, ensures that the entire configuration of anamespace (Event Hubs, Consumer Groups and settings) is continuously replicated from a primary namespace to a secondary namespace, and it allows a once-only failover move from the primary to the secondary at any time. Active/Passive feature is designed to make it easier to recover from and abandon a failed Azure region without having to change application configurations", - "guid": "dc15a1c0-75ee-49f1-90ac-ccd579376bcd", - "link": "https://learn.microsoft.com/azure/event-hubs/event-hubs-geo-dr?tabs=portal", - "service": "Event Hubs", + "graph": "resources | where type == 'microsoft.network/applicationgatewaywebapplicationfirewallpolicies' | mv-expand properties.managedRules.managedRuleSets | project id, rulesettype = properties_managedRules_managedRuleSets.ruleSetType | extend compliant1 = (rulesettype == 'Microsoft_BotManagerRuleSet') | project id, compliant1 | summarize compliant = max(compliant1) by id", + "guid": "2f8e81eb-8e68-4026-8b1f-70f9b05f7cf9", + "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/bot-protection", + "service": "App Gateway", "services": [ - "EventHubs", - "ASR", + "AppGW", "WAF" ], "severity": "High", - "text": "Plan for Geo Disaster Recovery using Active Passive configuration", - "waf": "Reliability" + "text": "Enable the Azure Application Gateway WAF bot protection rule set. The bot rules detect good and bad bots.", + "waf": "Security" }, { - "arm-service": "microsoft.eventhub/namespaces", + "ammp": true, + "arm-service": "microsoft.network/applicationGateways", "checklist": "WAF checklist", - "description": "Should be used for DR configurations where an outage or loss of event data in the downed region cannot be tolerated. For these cases, follow the replication guidance and do not use the built-in geo-disaster recovery capability (active/passive). With Active/Active, Maintain multiple Event Hubs in different regions and namespaces, and events will be replicated between the hubs", - "guid": "6e31b67d-67ba-4591-89c0-9e805d597c7e", - "link": "https://learn.microsoft.com/azure/event-hubs/event-hubs-federation-overview", - "service": "Event Hubs", + "guid": "8ea8e0d4-84e8-4b33-aeab-493f6391b4d6", + "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/application-gateway-waf-request-size-limits#request-body-inspection", + "service": "App Gateway", "services": [ - "EventHubs", - "ASR", - "WAF" + "AppGW", + "WAF", + "AzurePolicy" ], - "severity": "Medium", - "text": "For Business Critical Applications, use Active Active configuration", - "waf": "Reliability" + "severity": "High", + "text": "Enable request body inspection feature enabled in Azure Application Gateway WAF policy.", + "waf": "Security" }, { - "arm-service": "microsoft.eventhub/namespaces", + "ammp": true, + "arm-service": "microsoft.network/applicationGateways", "checklist": "WAF checklist", - "guid": "9ced16ad-d186-4f0a-a241-a999a68af77c", - "link": "https://learn.microsoft.com/azure/architecture/serverless/event-hubs-functions/resilient-design", - "service": "Event Hubs", + "guid": "a4dd86d3-5ffa-408c-b660-cce073d085b8", + "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/best-practices#tune-your-waf", + "service": "App Gateway", "services": [ - "EventHubs", + "AppGW", "WAF" ], - "severity": "Medium", - "text": "Design Resilient Event Hubs", - "waf": "Reliability" + "severity": "High", + "text": "Tune the Azure Application Gateway WAF in detection mode for your workload. Reduce false positive detections.", + "waf": "Security" }, { - "arm-service": "Microsoft.AVS/privateClouds", + "ammp": true, + "arm-service": "microsoft.network/applicationGateways", "checklist": "WAF checklist", - "guid": "32e42e36-11c8-418b-8a0b-c510e43a18a9", - "service": "AVS", + "graph": "resources | where type == 'microsoft.network/frontdoorwebapplicationfirewallpolicies' | project policyName=name, policyId=id,policySku=sku.name, links=properties.securityPolicyLinks, enabledState=properties.policySettings.enabledState, mode=properties.policySettings.mode | mvexpand links | extend securityPolicy=links.id | extend securityPolicyParts=split(securityPolicy, '/') | extend profileId=strcat_array(array_slice(securityPolicyParts, 0, -3), '/') | project id=profileId, compliant=((enabledState=='Enabled') and (mode=='Prevention')), enabledState, mode", + "guid": "baf8e317-2397-4d49-b3d1-0dcc16d8778d", + "link": "https://learn.microsoft.com/azure/web-application-firewall/afds/waf-front-door-policy-settings", + "service": "App Gateway", "services": [ - "Entra", - "Subscriptions", - "WAF" + "AppGW", + "WAF", + "AzurePolicy" ], "severity": "High", - "text": "Ensure ADDS domain controller(s) are deployed in the identity subscription in native Azure", + "text": "Deploy your WAF policy for Application Gateway in 'Prevention' mode.", "waf": "Security" }, { - "arm-service": "Microsoft.AVS/privateClouds", + "arm-service": "microsoft.network/applicationGateways", "checklist": "WAF checklist", - "guid": "75089c20-990d-4927-b105-885576f76fc2", - "service": "AVS", + "guid": "43fae595-8a32-4299-a69e-0f32c454dcc9", + "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/rate-limiting-overview", + "service": "App Gateway", "services": [ - "AVS", + "AppGW", "WAF" ], "severity": "Medium", - "text": "Ensure ADDS sites and services is configured to keep authentication requests from Azure-based resources (including Azure VMware Solution) local to Azure", + "text": "Add rate limiting to the Azure Application Gateway WAF. Rate limiting blocks clients accidentally or intentionally sending large amounts of traffic in a short period of time.", "waf": "Security" }, { - "arm-service": "Microsoft.AVS/privateClouds", + "arm-service": "microsoft.network/applicationGateways", "checklist": "WAF checklist", - "guid": "de3aad1e-7c28-4ec9-9666-b7570449aa80", - "service": "AVS", + "guid": "041e0ad8-7b12-4694-a0b7-a0e25ee2470f", + "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/rate-limiting-overview#rate-limiting-details", + "service": "App Gateway", "services": [ + "AppGW", "WAF" ], - "severity": "High", - "text": "Ensure that vCenter is connected to ADDS to enable authentication based on 'named user accounts'", + "severity": "Medium", + "text": "Use a high threshold for Azure Application Gateway WAF rate limits. High rate limit thresholds avoid blocking legitimate traffic, while still providing protection against extremely high numbers of requests that might overwhelm your infrastructure. ", "waf": "Security" }, { - "arm-service": "Microsoft.AVS/privateClouds", + "arm-service": "microsoft.network/applicationGateways", "checklist": "WAF checklist", - "guid": "cd289ced-6b17-4db8-8554-61e2aee3553a", - "service": "AVS", + "guid": "99937189-ff78-492a-b9ca-18d828d82b37", + "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/best-practices#geo-filtering-best-practices", + "service": "App Gateway", "services": [ "WAF" ], - "severity": "Medium", - "text": "Ensure that the connection from vCenter to ADDS is using a secure protocol (LDAPS)", + "severity": "Low", + "text": "If you are not expecting traffic from all geographical regions, use geo-filters to block traffic from non-expected countries.", "waf": "Security" }, { - "arm-service": "Microsoft.AVS/privateClouds", + "arm-service": "microsoft.network/applicationGateways", "checklist": "WAF checklist", - "guid": "b9d37dac-43bc-46cd-8d79-a9b24604489a", - "service": "AVS", + "guid": "349a15c1-52f4-4319-9078-3895d95ecafd", + "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/geomatch-custom-rules", + "service": "App Gateway", "services": [ + "AppGW", "WAF" ], "severity": "Medium", - "text": "CloudAdmin account in vCenter IdP is used only as an emergency account (break-glass)", + "text": "Specify the unknown (ZZ) location when geo-filtering traffic with the Azure Application Gateway WAF. Avoid accidentally blocking legitimate requests when IP addresses can't be geo-matched.", "waf": "Security" }, { - "arm-service": "Microsoft.AVS/privateClouds", + "arm-service": "microsoft.network/applicationGateways", "checklist": "WAF checklist", - "guid": "53d88e89-d17b-473b-82a5-a67e7a9ed5b3", - "service": "AVS", + "guid": "6c19dfd5-a61c-436c-9001-491b9b3d0228", + "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/best-practices#use-the-latest-ruleset-versions", + "service": "App Gateway", "services": [ - "Entra", + "AppGW", "WAF" ], - "severity": "High", - "text": "Ensure that NSX-Manager is integrated with an external Identity provider (LDAPS)", + "severity": "Medium", + "text": "Use the latest Azure Application Gateway WAF rule set version. Rule set updates are regularly updated to take account of the current threat landscape.", "waf": "Security" }, { - "arm-service": "Microsoft.AVS/privateClouds", + "arm-service": "microsoft.network/applicationGateways", "checklist": "WAF checklist", - "guid": "ae0e37ce-e297-411b-b352-caaab79b198d", - "service": "AVS", + "guid": "f84106a2-2e9e-42ac-add6-d3416ecfed53", + "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/best-practices#add-diagnostic-settings-to-save-your-wafs-logs", + "service": "App Gateway", "services": [ - "RBAC", - "AVS", + "AppGW", "WAF" ], "severity": "Medium", - "text": "Has an RBAC model been created for use within VMware vSphere", - "waf": "Security" + "text": "Add diagnostic settings to save your Azure Application Gateway WAF logs.", + "waf": "Operations" }, { - "arm-service": "Microsoft.AVS/privateClouds", + "arm-service": "microsoft.network/frontdoors", "checklist": "WAF checklist", - "guid": "ab81932c-9fc9-4d1b-a780-36f5e6bfbb9e", - "service": "AVS", + "guid": "4cea4050-7946-4a7c-89e6-b021b73c352d", + "link": "https://learn.microsoft.com/azure/web-application-firewall/afds/waf-front-door-best-practices#add-diagnostic-settings-to-save-your-wafs-logs", + "service": "Front Door", "services": [ - "RBAC", - "WAF" + "WAF", + "FrontDoor" ], "severity": "Medium", - "text": "RBAC permissions should be granted on ADDS groups and not on specific users", - "waf": "Security" + "text": "Add diagnostic settings to save your Azure Front Door WAF logs.", + "waf": "Operations" }, { - "arm-service": "Microsoft.AVS/privateClouds", + "arm-service": "microsoft.network/applicationGateways", "checklist": "WAF checklist", - "guid": "d503547c-c447-4e82-9128-a71f0f1cac6d", - "service": "AVS", + "guid": "92664c60-47e3-4591-8b1b-8d557656e686", + "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/best-practices#send-logs-to-microsoft-sentinel", + "service": "App Gateway", "services": [ - "RBAC", - "AVS", + "Sentinel", + "AppGW", "WAF" ], - "severity": "High", - "text": "RBAC permissions on the Azure VMware Solution resource in Azure are 'locked down' to a limited set of owners only", - "waf": "Security" + "severity": "Medium", + "text": "Send Azure Application Gateway WAF logs to Microsoft Sentinel.", + "waf": "Operations" }, { - "arm-service": "Microsoft.AVS/privateClouds", + "arm-service": "microsoft.network/frontdoors", "checklist": "WAF checklist", - "guid": "fd9f0df4-68dc-4976-b9a9-e6a79f7682c5", - "service": "AVS", + "guid": "845f5f91-9c21-4674-a725-5ce890850e20", + "link": "https://learn.microsoft.com/azure/web-application-firewall/afds/waf-front-door-best-practices#send-logs-to-microsoft-sentinel", + "service": "Front Door", "services": [ - "RBAC", - "WAF" + "Sentinel", + "WAF", + "FrontDoor" ], - "severity": "High", - "text": "Ensure all custom roles are scoped with CloudAdmin permitted authorizations", - "waf": "Security" + "severity": "Medium", + "text": "Send Azure Front Door WAF logs to Microsoft Sentinel.", + "waf": "Operations" }, { - "arm-service": "Microsoft.AVS/privateClouds", + "arm-service": "microsoft.network/applicationGateways", "checklist": "WAF checklist", - "guid": "9ef1d5e8-32e4-42e3-911c-818b0a0bc510", - "link": "https://github.com/Azure/AzureCAT-AVS/tree/main/networking", - "service": "AVS", + "guid": "ba0e9b26-6e0d-4ec8-8541-023c00afd5b7", + "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/best-practices#define-your-waf-configuration-as-code", + "service": "App Gateway", "services": [ - "AVS", + "AppGW", "WAF" ], - "severity": "High", - "text": "Is the correct Azure VMware Solution connectivity model selected for the customer use case at hand", - "waf": "Performance" + "severity": "Medium", + "text": "Define your Azure Application Gateway WAF configuration as code. By using code, you can more easily adopt new rule set version and gain additional protection.", + "waf": "Operations" }, { - "arm-service": "Microsoft.AVS/privateClouds", + "arm-service": "microsoft.network/applicationGateways", "checklist": "WAF checklist", - "guid": "eb710a37-cbc1-4055-8dd5-a936a8bb7cf5", - "service": "AVS", + "guid": "f17ec301-8470-4afd-aabc-c1fdfe47dcc0", + "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/policy-overview", + "service": "App Gateway", "services": [ - "NetworkWatcher", - "VPN", - "Monitor", - "ExpressRoute", - "WAF" + "WAF", + "AzurePolicy" ], - "severity": "High", - "text": "Ensure ExpressRoute or VPN connections from on-premises to Azure are monitored using 'connection monitor'", + "severity": "Medium", + "text": "Use WAF Policies instead of the legacy WAF configuration.", "waf": "Operations" }, { - "arm-service": "Microsoft.AVS/privateClouds", + "arm-service": "microsoft.network/applicationGateways", "checklist": "WAF checklist", - "guid": "976e24f2-a7f8-426c-9253-2a92a2a7ed99", - "service": "AVS", + "guid": "d4eb8667-f8cb-4cdd-94e6-2f967ba98f88", + "link": "https://learn.microsoft.com/azure/virtual-wan/scenario-secured-hub-app-gateway", + "service": "App Gateway", "services": [ - "NetworkWatcher", - "AVS", - "VM", - "Monitor", + "AppGW", + "VNet", + "WAF", "ExpressRoute", - "WAF" + "VPN" ], "severity": "Medium", - "text": "Ensure a connection monitor is created from an Azure native resource to an Azure VMware Solution virtual machine to monitor the Azure VMware Solution back-end ExpressRoute connection", - "waf": "Operations" + "text": "Filter inbound traffic in the backends so that they only accept connections from the Application Gateway subnet, for example with NSGs.", + "waf": "Security" }, { - "arm-service": "Microsoft.AVS/privateClouds", + "arm-service": "microsoft.network/frontdoors", "checklist": "WAF checklist", - "guid": "f41ce6a0-64f3-4805-bc65-3ab50df01265", - "service": "AVS", + "guid": "7d3df025-59a3-447d-ac25-3f5750d35de1", + "link": "https://learn.microsoft.com/azure/frontdoor/origin-security?tabs=app-service-functions", + "service": "Front Door", "services": [ - "NetworkWatcher", - "AVS", - "VM", - "Monitor", - "WAF" + "WAF", + "FrontDoor" ], "severity": "Medium", - "text": "Ensure a connection monitor is created from an on-premises resource to an Azure VMware Solution virtual machine to monitor end-2-end connectivity", - "waf": "Operations" + "text": "Make sure your origins only take traffic from your Azure Front Door instance.", + "waf": "Security" }, { - "arm-service": "Microsoft.AVS/privateClouds", + "arm-service": "microsoft.network/applicationGateways", "checklist": "WAF checklist", - "guid": "563b4dc7-4a74-48b6-933a-d1a0916a6649", - "service": "AVS", + "guid": "a66f0fd8-2ca4-422e-8df3-235148127ca2", + "link": "https://learn.microsoft.com/azure/application-gateway/ssl-overview", + "service": "App Gateway", "services": [ - "ARS", "WAF" ], "severity": "High", - "text": "When route server is used, ensure no more then 1000 routes are propagated from route server to ExR gateway to on-premises (ARS limit).", - "waf": "Operations" + "text": "You should encrypt traffic to the backend servers.", + "waf": "Security" }, { - "arm-service": "Microsoft.AVS/privateClouds", + "arm-service": "microsoft.network/applicationGateways", "checklist": "WAF checklist", - "guid": "6128a71f-0f1c-4ac6-b9ef-1d5e832e42e3", - "service": "AVS", + "guid": "3dba65cb-834d-44d8-a3ca-a6aa2f1587be", + "link": "https://learn.microsoft.com/azure/web-application-firewall/overview", + "service": "App Gateway", "services": [ - "Entra", - "RBAC", - "AVS", "WAF" ], "severity": "High", - "text": "Is Privileged Identity Management implemented for roles managing the Azure VMware Solution resource in the Azure Portal (no standing permissions allowed)", + "text": "You should use a Web Application Firewall.", "waf": "Security" }, { - "arm-service": "Microsoft.AVS/privateClouds", + "arm-service": "microsoft.network/applicationGateways", "checklist": "WAF checklist", - "guid": "c4e2436b-b336-4d71-9f17-960eee0b9b5c", - "service": "AVS", + "guid": "0158fcb6-0bc1-4687-832f-cc7c359c22d2", + "link": "https://learn.microsoft.com/azure/application-gateway/redirect-overview", + "service": "App Gateway", "services": [ - "Entra", - "RBAC", - "AVS", "WAF" ], - "severity": "High", - "text": "Privileged Identity Management audit reporting should be implemented for the Azure VMware Solution PIM roles", + "severity": "Medium", + "text": "Redirect HTTP to HTTPS", "waf": "Security" }, { - "arm-service": "Microsoft.AVS/privateClouds", + "arm-service": "microsoft.network/applicationGateways", "checklist": "WAF checklist", - "guid": "78c447a8-26b2-4863-af0f-1cac599ef1d5", - "service": "AVS", + "guid": "bb697864-1b4c-43af-8667-90cc69aaed5f", + "link": "https://learn.microsoft.com/azure/application-gateway/how-application-gateway-works#modifications-to-the-request", + "service": "App Gateway", "services": [ - "Entra", - "AVS", "WAF" ], "severity": "Medium", - "text": "If using Privileged Identity Management is being used, ensure that a valid Entra ID enabled account is created with a valid SMTP record for Azure VMware Solution Automatic Host replacement notifications. (standing permissions required)", - "waf": "Security" + "text": "Use gateway-managed cookies to direct traffic from a user session to the same server for processing", + "waf": "Operations" }, { - "arm-service": "Microsoft.AVS/privateClouds", + "arm-service": "microsoft.network/applicationGateways", "checklist": "WAF checklist", - "guid": "8defc4d7-21d3-41d2-90fb-707ae9eab40e", - "service": "AVS", + "guid": "ff353ad8-15fb-4ae8-9fc5-a85a36d36a35", + "link": "https://learn.microsoft.com/azure/application-gateway/configuration-http-settings", + "service": "App Gateway", "services": [ "WAF" ], "severity": "High", - "text": "Limit use of CloudAdmin account to emergency access only", + "text": "Enable connection draining during planned service updates to prevent connection loss to existing members of the backend pool", "waf": "Security" }, { - "arm-service": "Microsoft.AVS/privateClouds", + "arm-service": "microsoft.network/applicationGateways", "checklist": "WAF checklist", - "guid": "d329f798-bc17-48bd-a5a0-6ca7144351d1", - "service": "AVS", + "guid": "c8741f03-45a4-4183-a6b8-139e0773b8b5", + "link": "https://learn.microsoft.com/azure/application-gateway/custom-error", + "service": "App Gateway", + "services": [ + "WAF" + ], + "severity": "Low", + "text": "Create custom error pages to display a personalized user experience", + "waf": "Operations" + }, + { + "arm-service": "microsoft.network/applicationGateways", + "checklist": "WAF checklist", + "guid": "f850d46f-f5d7-4b17-b48c-a780741402e1", + "link": "https://learn.microsoft.com/azure/application-gateway/rewrite-http-headers-url", + "service": "App Gateway", "services": [ - "RBAC", "WAF" ], "severity": "Medium", - "text": "Create custom RBAC roles in vCenter to implement a least-privilege model inside vCenter", + "text": "Edit HTTP requests and response headers for easier routing and information exchange between the client and server", "waf": "Security" }, { - "arm-service": "Microsoft.AVS/privateClouds", + "arm-service": "microsoft.network/applicationGateways", "checklist": "WAF checklist", - "guid": "9dd24429-eb72-4281-97a1-51c5bb4e4f18", - "service": "AVS", + "guid": "eadc3164-4a0f-461c-85f1-1a372c04dfd1", + "link": "https://learn.microsoft.com/azure/frontdoor/front-door-overview", + "service": "App Gateway", + "services": [ + "WAF", + "FrontDoor" + ], + "severity": "Medium", + "text": "Configure Front Door to optimize global web traffic routing and top-tier end-user performance, and reliability through quick global failover", + "waf": "Performance" + }, + { + "arm-service": "microsoft.network/applicationGateways", + "checklist": "WAF checklist", + "guid": "29dcc19f-a8fa-4c35-8281-290577538793", + "link": "https://learn.microsoft.com/azure/load-balancer/load-balancer-overview", + "service": "App Gateway", "services": [ "WAF" ], "severity": "Medium", - "text": "Is a process defined to regularly rotate cloudadmin (vCenter) and admin (NSX) credentials", - "waf": "Security" + "text": "Use transport layer load balancing", + "waf": "Performance" }, { - "arm-service": "Microsoft.AVS/privateClouds", + "arm-service": "microsoft.network/applicationGateways", "checklist": "WAF checklist", - "guid": "586cb291-ec16-4a1d-876e-f9f141acdce5", - "service": "AVS", + "guid": "276898c1-af5e-4819-9e8e-049c7801ab9d", + "link": "https://learn.microsoft.com/azure/application-gateway/multiple-site-overview", + "service": "App Gateway", "services": [ - "Entra", - "AVS", - "VM", "WAF" ], - "severity": "High", - "text": "Use a centralized identity provider to be used for workloads (VM's) running on Azure VMware Solution", + "severity": "Medium", + "text": "Configure routing based on host or domain name for multiple web applications on a single gateway", "waf": "Security" }, { - "arm-service": "Microsoft.AVS/privateClouds", + "arm-service": "microsoft.network/applicationGateways", "checklist": "WAF checklist", - "guid": "79377bcd-b375-41ab-8ab0-ead66e15d3d4", - "service": "AVS", + "guid": "5fe365b6-58e8-47ed-a8cf-5163850380a2", + "link": "https://learn.microsoft.com/azure/application-gateway/create-ssl-portal", + "service": "App Gateway", "services": [ + "Entra", "WAF" ], "severity": "Medium", - "text": "Is East-West traffic filtering implemented within NSX-T", + "text": "Centralize SSL certificate management to reduce encryption and decryption overhead from a backend server farm", "waf": "Security" }, { - "arm-service": "Microsoft.AVS/privateClouds", + "arm-service": "microsoft.network/applicationGateways", "checklist": "WAF checklist", - "guid": "a2adb1c3-d232-46af-825c-a44e1695fddd", - "service": "AVS", + "guid": "fa64b4dd-35c2-4047-ac5c-45dfbf8b0db9", + "link": "https://learn.microsoft.com/azure/application-gateway/application-gateway-websocket", + "service": "App Gateway", "services": [ - "AVS", "AppGW", - "Firewall", "WAF" ], - "severity": "High", - "text": "Workloads on Azure VMware Solution are not directly exposed to the internet. Traffic is filtered and inspected by Azure Application Gateway, Azure Firewall or 3rd party solutions", + "severity": "Low", + "text": "Use Application Gateway for native support for WebSocket and HTTP/2 protocols", "waf": "Security" }, { - "arm-service": "Microsoft.AVS/privateClouds", + "arm-service": "Microsoft.Web/sites", "checklist": "WAF checklist", - "guid": "eace4cb1-deb4-4c65-8c3f-c14eeab36938", - "service": "AVS", + "guid": "3b7a56de-5020-4642-b3cb-c976e80b6d6d", + "link": "https://learn.microsoft.com/azure/logic-apps/single-tenant-overview-compare", + "service": "Logic Apps", "services": [ - "AVS", "WAF" ], "severity": "High", - "text": "Auditing and logging is implemented for inbound internet requests to Azure VMware Solution and Azure VMware Solution based workloads", - "waf": "Security" + "text": "Select the right Logic App hosting plan based on your business & SLO requirements", + "waf": "Reliability" }, { - "arm-service": "Microsoft.AVS/privateClouds", + "arm-service": "Microsoft.Web/sites", "checklist": "WAF checklist", - "guid": "29e3eec2-1836-487a-8077-a2b5945bda43", - "service": "AVS", + "guid": "3d7008bd-6bc1-4b03-8aa8-ec2a3b55786a", + "link": "https://learn.microsoft.com/azure/logic-apps/set-up-zone-redundancy-availability-zones?tabs=standard#next-steps", + "service": "Logic Apps", "services": [ - "Monitor", - "AVS", "WAF" ], - "severity": "Medium", - "text": "Session monitoring is implemented for outbound internet connections from Azure VMware Solution or Azure VMware Solution based workloads to identify suspicious/malicious activity", - "waf": "Security" + "severity": "High", + "text": "Protect logic apps from region failures with zone redundancy and availability zones", + "waf": "Reliability" }, { - "arm-service": "Microsoft.AVS/privateClouds", + "arm-service": "Microsoft.Web/sites", "checklist": "WAF checklist", - "guid": "334fdf91-c234-4182-a652-75269440b4be", - "service": "AVS", + "guid": "1cda768f-a206-445d-8234-56f6a6e7286e", + "link": "https://learn.microsoft.com/azure/logic-apps/business-continuity-disaster-recovery-guidance?toc=%2Fazure%2Freliability%2Ftoc.json&bc=%2Fazure%2Freliability%2Fbreadcrumb%2Ftoc.json", + "service": "Logic Apps", "services": [ - "DDoS", - "VPN", - "ExpressRoute", - "VNet", "WAF" ], - "severity": "Medium", - "text": "Is DDoS standard protection enabled on ExR/VPN Gateway subnet in Azure", - "waf": "Security" + "severity": "High", + "text": "Consider a Cross-Region DR strategy for critical workloads", + "waf": "Reliability" }, { - "arm-service": "Microsoft.AVS/privateClouds", + "arm-service": "Microsoft.Web/sites", "checklist": "WAF checklist", - "guid": "3d3e0843-276d-44bd-a015-bcf219e4a1eb", - "service": "AVS", + "guid": "82118ec5-ed6f-4c68-9471-eb0da98a1b34", + "link": "https://learn.microsoft.com/azure/app-service/environment/intro", + "service": "Logic Apps", "services": [ - "AVS", - "WAF" + "WAF", + "AppSvc" ], - "severity": "Medium", - "text": "Use a dedicated privileged access workstation (PAW) to manage Azure VMware Solution, vCenter, NSX manager and HCX manager", - "waf": "Security" + "severity": "High", + "text": "If deploying to an Isolated environment, use or migrate to App Service Environment (ASE) v3", + "waf": "Reliability" }, { - "arm-service": "Microsoft.AVS/privateClouds", + "arm-service": "Microsoft.Web/sites", "checklist": "WAF checklist", - "guid": "9ccbd869-266a-4cca-874f-aa19bf39d95d", - "service": "AVS", + "guid": "74275fa5-9e08-4c7e-b096-13b538fe1501", + "link": "https://learn.microsoft.com/training/modules/deploy-azure-functions/", + "service": "Logic Apps", "services": [ - "AVS", - "Defender", "WAF" ], "severity": "Medium", - "text": "Enable Advanced Threat Detection (Microsoft Defender for Cloud aka ASC) for workloads running on Azure VMware Solution", - "waf": "Security" + "text": "Leverage Azure DevOps or GitHub to streamline CI/CD and safeguard your Logic App code", + "waf": "Operations" }, { - "arm-service": "Microsoft.AVS/privateClouds", + "arm-service": "Microsoft.CognitiveServices/accounts", "checklist": "WAF checklist", - "guid": "44c7c891-9ca1-4f6d-9315-ae524ba34d45", - "service": "AVS", + "guid": "a85b86ad-884f-48e3-9273-4b875ba18f10", + "link": "https://learn.microsoft.com/azure/ai-services/openai/concepts/system-message#define-additional-safety-and-behavioral-guardrails", + "service": "Azure OpenAI", "services": [ - "AVS", - "Arc", "WAF" ], - "severity": "Medium", - "text": "Use Azure ARC for Servers to properly govern workloads running on Azure VMware Solution using Azure native technologies (Azure ARC for Azure VMware Solution is not yet available)", - "waf": "Security" + "severity": "High", + "text": "Follow Metaprompting guardrails for resonsible AI", + "waf": "Operational Excellence" }, { - "arm-service": "Microsoft.AVS/privateClouds", + "arm-service": "Microsoft.CognitiveServices/accounts", "checklist": "WAF checklist", - "guid": "85e12139-bd7b-4b01-8f7b-95ef6e043e2a", - "service": "AVS", + "guid": "d4391898-cd28-48be-b6b1-7cb8245451e1", + "link": "https://github.com/Azure-Samples/AI-Gateway", + "service": "Azure OpenAI", "services": [ - "AVS", - "SQL", - "WAF" + "Entra", + "WAF", + "APIM" ], - "severity": "Low", - "text": "Ensure workloads on Azure VMware Solution use sufficient data encryption during run-time (like in-guest disk encryption and SQL TDE). (vSAN encryption at rest is default)", - "waf": "Security" + "severity": "High", + "text": "Consider Gateway patterns with APIM or solutions like AI central for better rate limiting, load balancing, authentication and logging", + "waf": "Operational Excellence" }, { - "arm-service": "Microsoft.AVS/privateClouds", + "arm-service": "Microsoft.CognitiveServices/accounts", "checklist": "WAF checklist", - "guid": "a3592718-e6e2-4051-9267-6ae46691e883", - "service": "AVS", + "guid": "aed3453a-ec72-4392-97a1-52d6cc5e4029", + "link": "https://techcommunity.microsoft.com/t5/fasttrack-for-azure/azure-openai-insights-monitoring-ai-with-confidence/ba-p/4026850", + "service": "Azure OpenAI", "services": [ - "AKV", + "Monitor", "WAF" ], - "severity": "Low", - "text": "When in-guest encryption is used, store encryption keys in Azure Key vault when possible", - "waf": "Security" + "severity": "High", + "text": "Enable monitoring for your AOAI instances", + "waf": "Operational Excellence" }, { - "arm-service": "Microsoft.AVS/privateClouds", + "arm-service": "Microsoft.CognitiveServices/accounts", "checklist": "WAF checklist", - "guid": "5ac94222-3e13-4810-9230-81a941741583", - "service": "AVS", + "guid": "697cb391-ed16-4b2d-886f-0a0241addde6", + "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/monitoring#set-up-alerts", + "service": "Azure OpenAI", "services": [ - "AVS", - "WAF" + "Monitor", + "WAF", + "Subscriptions", + "AKV" ], - "severity": "Medium", - "text": "Consider using extended security update support for workloads running on Azure VMware Solution (Azure VMware Solution is eligible for ESU)", - "waf": "Security" + "severity": "High", + "text": "Create alerts to notify teams of events such as an entry in the activity log created by an action performed on the resource, such as regenerating its subscription keys or a metric threshold such as the number of errors exceeding 10 in an hour", + "waf": "Operational Excellence" }, { - "arm-service": "Microsoft.AVS/privateClouds", + "arm-service": "Microsoft.CognitiveServices/accounts", "checklist": "WAF checklist", - "guid": "3ef7ad7c-6d37-4331-95c7-acbe44bbe609", - "service": "AVS", + "guid": "8a477cde-b486-41bc-9bc1-0ae66e25d4d5", + "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/monitoring", + "service": "Azure OpenAI", "services": [ + "Monitor", "WAF" ], "severity": "High", - "text": "Ensure that the appropriate vSAN Data redundancy method is used (RAID specification)", - "waf": "Reliability" + "text": "Monitor token usage to prevent service disruptions due to capacity", + "waf": "Operational Excellence" }, { - "arm-service": "Microsoft.AVS/privateClouds", + "arm-service": "Microsoft.CognitiveServices/accounts", "checklist": "WAF checklist", - "guid": "d88408f3-7273-44c8-96ba-280214590146", - "service": "AVS", + "guid": "a3aec2c4-e243-46b0-936c-b45e17960eee", + "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/monitoring", + "service": "Azure OpenAI", "services": [ - "Storage", - "AzurePolicy", + "Monitor", "WAF" ], - "severity": "High", - "text": "Ensure that the Failure-to-tolerate policy is in place to meet your vSAN storage needs", - "waf": "Reliability" + "severity": "Medium", + "text": "observe metrics like processed inference tokens, generated completion tokens monitor for rate limit", + "waf": "Operational Excellence" }, { - "arm-service": "Microsoft.AVS/privateClouds", + "arm-service": "Microsoft.CognitiveServices/accounts", "checklist": "WAF checklist", - "guid": "d89f2e87-7784-424d-9167-85c6fa95b96a", - "service": "AVS", + "guid": "fbdf4cc2-eec4-4d76-8c31-d25ffbb46a39", + "link": "https://techcommunity.microsoft.com/t5/apps-on-azure-blog/build-an-enterprise-ready-azure-openai-solution-with-azure-api/ba-p/3907562", + "service": "Azure OpenAI", "services": [ - "ASR", - "WAF" + "WAF", + "APIM" ], - "severity": "High", - "text": "Ensure that you have requested enough quota, ensuring you have considered growth and Disaster Recovery requirement", - "waf": "Reliability" + "severity": "Low", + "text": "If the diagnostics are not sufficient for you, consider using a gateway such as Azure API Managements in front of Azure OpenAI to log both incoming prompts and outgoing responses, where permitted", + "waf": "Operational Excellence" }, { - "arm-service": "Microsoft.AVS/privateClouds", + "arm-service": "Microsoft.CognitiveServices/accounts", "checklist": "WAF checklist", - "guid": "5d38e53f-9ccb-4d86-a266-acca274faa19", - "service": "AVS", + "guid": "3af30ed3-2947-498b-8178-a2c5a46ceb54", + "link": "https://github.com/Azure-Samples/openai-enterprise-iac", + "service": "Azure OpenAI", "services": [ "WAF" ], - "severity": "Medium", - "text": "Ensure that access constraints to ESXi are understood, there are access limits which might affect 3rd party solutions.", - "waf": "Operations" + "severity": "High", + "text": "Use Infrastructure as code to deploy the Azure OpenAI Service, model deployments, and all related resources", + "waf": "Operational Excellence" }, { - "arm-service": "Microsoft.AVS/privateClouds", + "arm-service": "Microsoft.CognitiveServices/accounts", "checklist": "WAF checklist", - "guid": "bf39d95d-44c7-4c89-89ca-1f6d5315ae52", - "service": "AVS", + "guid": "4350d092-d234-4292-a752-8537a551c5bf", + "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/managed-identity", + "service": "Azure OpenAI", "services": [ - "AzurePolicy", + "Entra", "WAF" ], - "severity": "Medium", - "text": "Ensure that you have a policy around ESXi host density and efficiency, keeping in mind the lead time for requesting new nodes", - "waf": "Operations" + "severity": "High", + "text": "Use Microsoft Entra Authentication with Managed Identity instead of API Key", + "waf": "Security" }, { - "arm-service": "Microsoft.AVS/privateClouds", + "arm-service": "Microsoft.CognitiveServices/accounts", "checklist": "WAF checklist", - "guid": "4ba34d45-85e1-4213-abd7-bb012f7b95ef", - "service": "AVS", + "guid": "4e4f1854-287d-45cd-a126-cc031af5b1fc", + "link": "https://learn.microsoft.com/azure/machine-learning/prompt-flow/how-to-bulk-test-evaluate-flow?view=azureml-api-2", + "service": "Azure OpenAI", "services": [ - "AVS", - "Cost", "WAF" ], - "severity": "Medium", - "text": "Ensure a good cost management process is in place for Azure VMware Solution - Azure Cost Management can be used", - "waf": "Cost" + "severity": "High", + "text": "Evaluate the performance/accuracy of the system with a known golden dataset which has the inputs and the correct answers. Leverage capabilities in PromptFlow for Evaluation.", + "waf": "Operational Excellence" }, { - "arm-service": "Microsoft.AVS/privateClouds", + "arm-service": "Microsoft.CognitiveServices/accounts", "checklist": "WAF checklist", - "guid": "6e043e2a-a359-4271-ae6e-205172676ae4", - "service": "AVS", + "guid": "68889535-e327-4897-b31b-67d67be5962a", + "link": "https://learn.microsoft.com/azure/architecture/ai-ml/architecture/baseline-openai-e2e-chat#azure-openai---performance-efficiency", + "service": "Azure OpenAI", "services": [ - "AVS", - "Cost", "WAF" ], - "severity": "Low", - "text": "Are Azure reserved instances used to optimize cost for using Azure VMware Solution", - "waf": "Cost" + "severity": "High", + "text": "Evaluate usage of Provisioned throughput model ", + "waf": "Performance" }, { - "arm-service": "Microsoft.AVS/privateClouds", + "arm-service": "Microsoft.CognitiveServices/accounts", "checklist": "WAF checklist", - "guid": "6691e883-5ac9-4422-83e1-3810523081a9", - "service": "AVS", + "guid": "cd288bed-6b17-4cb8-8454-51e1aed3453a", + "link": "https://learn.microsoft.com/azure/ai-services/content-safety/overview", + "service": "Azure OpenAI", "services": [ "WAF" ], - "severity": "Medium", - "text": "Consider the use of Azure Private-Link when using other Azure Native Services", - "waf": "Security" + "severity": "High", + "text": "Review and implement Azure AI content safety", + "waf": "Operational Excellence" }, { - "arm-service": "Microsoft.AVS/privateClouds", + "arm-service": "Microsoft.CognitiveServices/accounts", "checklist": "WAF checklist", - "guid": "db611712-6904-40b4-aa3d-3e0803276d4b", - "service": "AVS", + "guid": "1193846d-697c-4b39-8ed1-6b2d186f0a02", + "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/latency#system-level-throughput", + "service": "Azure OpenAI", "services": [ "WAF" ], "severity": "High", - "text": "Ensure all required resource reside within the same Azure availability zone(s)", + "text": "Define and evaluate the throughput of the system based on tokens & response per minute and align with requirements", "waf": "Performance" }, { - "arm-service": "Microsoft.AVS/privateClouds", + "arm-service": "Microsoft.CognitiveServices/accounts", "checklist": "WAF checklist", - "guid": "48b262d6-cc5f-4512-a253-98e6db9d37da", - "service": "AVS", + "guid": "41addde6-8a47-47cd-bb48-61bc3bc10ae6", + "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/latency#improve-performance", + "service": "Azure OpenAI", "services": [ - "AVS", - "VM", - "Defender", "WAF" ], "severity": "Medium", - "text": "Enable Microsoft Defender for Cloud for Azure VMware Solution guest VM workloads", - "waf": "Security" + "text": "Improve latency of the system by limiting token sizes, streaming options", + "waf": "Performance" }, { - "arm-service": "Microsoft.AVS/privateClouds", + "arm-service": "Microsoft.CognitiveServices/accounts", "checklist": "WAF checklist", - "guid": "41741583-3ef7-4ad7-a6d3-733165c7acbe", - "service": "AVS", + "guid": "6e25d4d5-a3ae-4c2c-9e24-36b0336cb45e", + "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/latency#batching", + "service": "Azure OpenAI", "services": [ - "AVS", - "VM", - "Arc", + "ServiceBus", + "Storage", "WAF" ], "severity": "Medium", - "text": "Use Azure Arc enabled servers to manage your Azure VMware Solution guest VM workloads", - "waf": "Security" + "text": "Estimate elasticity demands to determine synchronous and batch request segregation based on priority. For high priority, use synchronous approach and for low priority, asynchronous batch processing with queue is preferred", + "waf": "Performance" }, { - "arm-service": "Microsoft.AVS/privateClouds", + "arm-service": "Microsoft.CognitiveServices/accounts", "checklist": "WAF checklist", - "guid": "88f03a4d-2cd4-463c-abbc-868295abc91a", - "service": "AVS", + "guid": "5bda4332-4f24-4811-9331-82ba51752694", + "link": "https://github.com/Azure/azure-openai-benchmark/", + "service": "Azure OpenAI", "services": [ - "AVS", "WAF" ], "severity": "High", - "text": "Enable Diagnostic and metric logging on Azure VMware Solution", - "waf": "Operations" + "text": "Benchmark token consumption requirements based on estimated demands from consumers. Consider using the Azure OpenAI benchmarking tool to help you validate the throughput if you are using Provisioned Throughput Unit deployments", + "waf": "Performance" }, { - "arm-service": "Microsoft.AVS/privateClouds", + "arm-service": "Microsoft.CognitiveServices/accounts", "checklist": "WAF checklist", - "guid": "4ed90dae-2cc8-44c4-9b6b-781cbafe6c46", - "service": "AVS", + "guid": "4008ae7d-7e47-4432-96d8-bdcf55bce619", + "link": "https://techcommunity.microsoft.com/t5/fasttrack-for-azure/optimizing-azure-openai-a-guide-to-limits-quotas-and-best/ba-p/4076268", + "service": "Azure OpenAI", "services": [ - "Monitor", - "AVS", - "VM", "WAF" ], "severity": "Medium", - "text": "Deploy the Log Analytics Agents to Azure VMware Solution guest VM workloads", - "waf": "Operations" + "text": "If you are using Provisioned Throughput Units (PTUs), consider deploying a token-per-minute (TPM) deployment for overflow requests. Use a gateway to route requests to the TPM deployment when the PTU limits are reached.", + "waf": "Performance" }, { - "arm-service": "Microsoft.AVS/privateClouds", + "arm-service": "Microsoft.CognitiveServices/accounts", "checklist": "WAF checklist", - "guid": "589d457a-927c-4397-9d11-02cad6aae11e", - "service": "AVS", + "guid": "e8a13f98-8794-424d-9267-86d60b96c97b", + "link": "https://learn.microsoft.com/azure/ai-services/openai/concepts/models", + "service": "Azure OpenAI", "services": [ - "Backup", - "AVS", - "VM", - "AzurePolicy", "WAF" ], - "severity": "Medium", - "text": "Ensure you have a documented and implemented backup policy and solution for Azure VMware Solution VM workloads", - "waf": "Operations" + "severity": "High", + "text": "Choose the right model for the right task. Pick models with right tradeoff between speed, quality of response and output complexity", + "waf": "Performance" }, { - "arm-service": "Microsoft.AVS/privateClouds", + "arm-service": "Microsoft.CognitiveServices/accounts", "checklist": "WAF checklist", - "guid": "ee29711b-d352-4caa-ab79-b198dab81932", - "service": "AVS", + "guid": "e9951904-8384-45c9-a6cb-2912156a1147", + "link": "https://github.com/Azure/azure-openai-benchmark/", + "service": "Azure OpenAI", "services": [ - "Monitor", - "AVS", - "Defender", "WAF" ], "severity": "Medium", - "text": "Use Microsoft Defender for Cloud for compliance monitoring of workloads running on Azure VMware Solution", - "waf": "Security" + "text": "Have a baseline for performance without fine-tuning for knowing whether or not fine-tuning has improved model performance", + "waf": "Performance" }, { - "arm-service": "Microsoft.AVS/privateClouds", + "arm-service": "Microsoft.CognitiveServices/accounts", "checklist": "WAF checklist", - "guid": "c9fc9d1b-b780-436f-9e6b-fbb9ed503547", - "service": "AVS", + "guid": "5e39f541-accc-4d97-a376-bcdb3750ab2a", + "link": "https://learn.microsoft.com/azure/architecture/ai-ml/architecture/baseline-openai-e2e-chat#azure-openai---reliability", + "service": "Azure OpenAI", "services": [ - "Defender", + "ACR", "WAF" ], - "severity": "Medium", - "text": "Are the applicable compliance baselines added to Microsoft Defender for Cloud", - "waf": "Security" + "severity": "Low", + "text": "Deploy multiple OAI instances across regions", + "waf": "Reliability" }, { - "arm-service": "Microsoft.AVS/privateClouds", + "arm-service": "Microsoft.CognitiveServices/accounts", "checklist": "WAF checklist", - "guid": "cc447e82-6128-4a71-b0f1-cac6d9ef1d5e", - "service": "AVS", + "guid": "b039da6d-55d7-4c89-8adb-107d5325af62", + "link": "https://learn.microsoft.com/azure/architecture/ai-ml/architecture/baseline-openai-e2e-chat#azure-openai---reliability", + "service": "Azure OpenAI", "services": [ - "AVS", - "WAF" + "Entra", + "WAF", + "APIM" ], "severity": "High", - "text": "Was data residency evaluated when selecting Azure regions to use for Azure VMware Solution deployment", - "waf": "Security" + "text": "Implement retry & healthchecks with Gateway pattern like APIM", + "waf": "Reliability" }, { - "arm-service": "Microsoft.AVS/privateClouds", + "arm-service": "Microsoft.CognitiveServices/accounts", "checklist": "WAF checklist", - "guid": "832e42e3-611c-4818-a0a0-bc510e43a18a", - "service": "AVS", + "guid": "5ca44e46-85e2-4223-ace8-bb12308ca5f1", + "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/quota?tabs=rest#introduction-to-quota", + "service": "Azure OpenAI", "services": [ "WAF" ], - "severity": "High", - "text": "Are data processing implications (service provider / service consumer model) clear and documented", - "waf": "Security" + "severity": "Medium", + "text": "Ensure having adequate quotas of TPM & RPM for the workload", + "waf": "Reliability" }, { - "arm-service": "Microsoft.AVS/privateClouds", + "arm-service": "Microsoft.CognitiveServices/accounts", "checklist": "WAF checklist", - "guid": "547c1747-dc56-4068-a714-435cd19dd244", - "service": "AVS", + "guid": "ec723923-7a15-42d6-ac5e-402925387e5c", + "link": "https://www.microsoft.com/research/project/guidelines-for-human-ai-interaction/", + "service": "Azure OpenAI", "services": [ "WAF" ], "severity": "Medium", - "text": "Consider using CMK (Customer Managed Key) for vSAN only if needed for compliance reason(s).", - "waf": "Security" + "text": "Review the considerations in HAI toolkit guidance and apply those interaction practices for the slution", + "waf": "Operational Excellence" }, { - "arm-service": "Microsoft.AVS/privateClouds", + "arm-service": "Microsoft.CognitiveServices/accounts", "checklist": "WAF checklist", - "guid": "e43a18a9-cd28-49ce-b6b1-7db8255461e2", - "service": "AVS", + "guid": "7f154e3a-a369-4282-ae7e-316183687a04", + "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/business-continuity-disaster-recovery", + "service": "Azure OpenAI", "services": [ - "Monitor", - "AVS", + "ACR", "WAF" ], - "severity": "High", - "text": "Create dashboards to enable core Azure VMware Solution monitoring insights", - "waf": "Operations" + "severity": "Medium", + "text": "Deploy separate fine tuned models across regions if finetuning is employed", + "waf": "Reliability" }, { - "arm-service": "Microsoft.AVS/privateClouds", + "arm-service": "Microsoft.CognitiveServices/accounts", "checklist": "WAF checklist", - "guid": "6b84ee5d-f47d-42d9-8881-b1cd5d1e54a2", - "service": "AVS", + "guid": "77a1f893-5bda-4433-84f2-4811633182ba", + "link": "https://learn.microsoft.com/azure/backup/backup-overview", + "service": "Azure OpenAI", "services": [ - "Monitor", - "AVS", - "WAF" + "ASR", + "WAF", + "Backup" ], - "severity": "High", - "text": "Create warning alerts for critical thresholds for automatic alerting on Azure VMware Solution performance (CPU >80%, Avg Memory >80%, vSAN >70%)", - "waf": "Operations" + "severity": "Medium", + "text": "Regularly backup and replicate critical data to ensure data availability and recoverability in case of data loss or system failures. Leverage Azure's backup and disaster recovery services to protect your data.", + "waf": "Reliability" }, { - "arm-service": "Microsoft.AVS/privateClouds", + "arm-service": "Microsoft.CognitiveServices/accounts", "checklist": "WAF checklist", - "guid": "9659e396-80e7-4828-ac93-5657d02bff45", - "service": "AVS", + "guid": "95b96ad8-844c-4e3b-8b38-b876ba2cf204", + "link": "https://www.microsoft.com/licensing/docs/view/Service-Level-Agreements-SLA-for-Online-Services?lang=1", + "service": "Azure OpenAI", "services": [ - "Monitor", - "AVS", "WAF" ], "severity": "High", - "text": "Ensure critical alert is created to monitor if vSAN consumption is below 75% as this is a support threshold from VMware", - "waf": "Operations" + "text": "Azure AI search service tiers should be choosen to have a SLA ", + "waf": "Reliability" }, { - "arm-service": "Microsoft.AVS/privateClouds", + "arm-service": "Microsoft.CognitiveServices/accounts", "checklist": "WAF checklist", - "guid": "64b0d934-a348-4726-be79-d6b5c3a36495", - "service": "AVS", + "guid": "99013a5d-3ce4-474d-acbd-8682a6abca2a", + "link": "https://learn.microsoft.com/purview/purview", + "service": "Azure OpenAI", "services": [ - "Monitor", "WAF" ], - "severity": "High", - "text": "Ensure alerts are configured for Azure Service Health alerts and notifications", - "waf": "Operations" + "severity": "Low", + "text": "Classify data and sensitivity, labeling with Microsoft Purview before generating the embeddings and make sure to treat the embeddings generated with same sensitivity and classification", + "waf": "Security" }, { - "arm-service": "Microsoft.AVS/privateClouds", + "arm-service": "Microsoft.CognitiveServices/accounts", "checklist": "WAF checklist", - "guid": "b6abad38-aad5-43cc-99e1-d86667357c54", - "service": "AVS", + "guid": "4fda1dbf-3dd9-45d4-ac7c-891dca1f6d56", + "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/use-your-data-securely", + "service": "Azure OpenAI", "services": [ - "AVS", - "Storage", "WAF" ], - "severity": "Medium", - "text": "Configure Azure VMware Solution logging to be send to an Azure Storage account or Azure EventHub for processing", - "waf": "Operations" + "severity": "High", + "text": "Encrypt data used for RAG with SSE/Disk encryption with optional BYOK", + "waf": "Security" }, { - "arm-service": "Microsoft.AVS/privateClouds", + "arm-service": "Microsoft.CognitiveServices/accounts", "checklist": "WAF checklist", - "guid": "9674c5ed-85b8-459c-9733-be2b1a27b775", - "service": "AVS", + "guid": "59ae558b-937d-4498-9e11-12dbd7ba012f", + "link": "https://learn.microsoft.com/azure/search/search-security-overview", + "service": "Azure OpenAI", "services": [ - "AVS", + "ACR", "WAF" ], - "severity": "Low", - "text": "If deep insight in VMware vSphere is required: Is vRealize Operations and/or vRealize Network Insights used in the solution?", - "waf": "Operations" + "severity": "High", + "text": "Ensure TLS is enforced for data in transit across data sources, AI search used for Retrieval-Augmented Generation (RAG) and LLM communication", + "waf": "Security" }, { - "arm-service": "Microsoft.AVS/privateClouds", + "arm-service": "Microsoft.CognitiveServices/accounts", "checklist": "WAF checklist", - "guid": "a91be1f3-88f0-43a4-b2cd-463cbbbc8682", - "service": "AVS", + "guid": "7b94ef6e-047d-42ea-8992-b1cd6e2054b2", + "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/role-based-access-control", + "service": "Azure OpenAI", "services": [ - "Storage", - "VM", - "AzurePolicy", + "RBAC", "WAF" ], "severity": "High", - "text": "Ensure the vSAN storage policy for VM's is NOT the default storage policy as this policy applies thick provisioning", - "waf": "Operations" + "text": "Use RBAC to manage access to Azure OpenAI services. Assign appropriate permissions to users and restrict access based on their roles and responsibilities", + "waf": "Security" }, { - "arm-service": "Microsoft.AVS/privateClouds", + "arm-service": "Microsoft.CognitiveServices/accounts", "checklist": "WAF checklist", - "guid": "d9ef1d5e-832d-442e-9611-c818b0afbc51", - "service": "AVS", + "guid": "9769e4a6-91e8-4838-ac93-6667e13c0056", + "link": "https://learn.microsoft.com/azure/security/fundamentals/data-encryption-best-practices", + "service": "Azure OpenAI", "services": [ "WAF" ], "severity": "Medium", - "text": "Ensure vSphere content libraries are not placed on vSAN as vSAN is a finite resource", - "waf": "Operations" + "text": "Implement data encryption, masking or redaction techniques to hide sensitive data or replace it with obfuscated values in non-production environments or when sharing data for testing or troubleshooting purposes", + "waf": "Security" }, { - "arm-service": "Microsoft.AVS/privateClouds", + "arm-service": "Microsoft.CognitiveServices/accounts", "checklist": "WAF checklist", - "guid": "0e43a18a-9cd2-489b-bd6b-17db8255461e", - "service": "AVS", + "guid": "74b1e945-b459-4837-be7a-d6c6d3b375a5", + "link": "https://learn.microsoft.com/azure/defender-for-cloud/defender-for-cloud-introduction", + "service": "Azure OpenAI", "services": [ - "Storage", - "Backup", + "Defender", + "Sentinel", + "Monitor", "WAF" ], - "severity": "Medium", - "text": "Ensure data repositories for the backup solution are stored outside of vSAN storage. Either in Azure native or on a disk pool-backed datastore", - "waf": "Operations" + "severity": "High", + "text": "Utilize Azure Defender to detect and respond to security threats and set up monitoring and alerting mechanisms to identify suspicious activities or breaches. Leverage Azure Sentinel for advanced threat detection and response", + "waf": "Security" }, { - "arm-service": "Microsoft.AVS/privateClouds", + "arm-service": "Microsoft.CognitiveServices/accounts", "checklist": "WAF checklist", - "guid": "2aee3453-aec8-4339-848b-262d6cc5f512", - "service": "AVS", + "guid": "c7acbe48-abe5-44cd-99f2-e87768468c55", + "link": "https://techcommunity.microsoft.com/t5/azure-storage-blog/managing-long-term-log-retention-or-any-business-data/ba-p/2494791", + "service": "Azure OpenAI", "services": [ - "AVS", - "Arc", - "WAF" + "WAF", + "AzurePolicy" ], "severity": "Medium", - "text": "Ensure workloads running on Azure VMware Solution are hybrid managed using Azure Arc for Servers (Arc for Azure VMware Solution is in preview)", - "waf": "Operations" + "text": "Establish data retention and disposal policies to adhere to compliance regulations. Implement secure deletion methods for data that is no longer required and maintain an audit trail of data retention and disposal activities", + "waf": "Security" }, { - "arm-service": "Microsoft.AVS/privateClouds", + "arm-service": "Microsoft.CognitiveServices/accounts", "checklist": "WAF checklist", - "guid": "925398e6-da9d-437d-ac43-bc6cd1d79a9b", - "service": "AVS", + "guid": "a9c27d9c-42bb-46bd-8c69-99a246f3389a", + "link": "https://learn.microsoft.com/azure/ai-services/content-safety/concepts/jailbreak-detection", + "service": "Azure OpenAI", "services": [ - "Monitor", - "AVS", - "WAF" - ], - "severity": "Medium", - "text": "Ensure workloads running on Azure VMware Solution are monitored using Azure Log Analytics and Azure Monitor", - "waf": "Operations" + "WAF" + ], + "severity": "High", + "text": "Implement Prompt shields and groundedness detection using Content Safety ", + "waf": "Operational Excellence" }, { - "arm-service": "Microsoft.AVS/privateClouds", + "arm-service": "Microsoft.CognitiveServices/accounts", "checklist": "WAF checklist", - "guid": "24604489-a8f4-42d7-ae78-cb6a33bd2a09", - "service": "AVS", + "guid": "a775c6ee-95b9-46ad-a844-ce3b2b38b876", + "link": "https://learn.microsoft.com/azure/compliance/", + "service": "Azure OpenAI", "services": [ - "AVS", "WAF" ], - "severity": "Medium", - "text": "Include workloads running on Azure VMware Solution in existing update management tooling or in Azure Update Management", - "waf": "Operations" + "severity": "High", + "text": "Ensure compliance with relevant data protection regulations, such as GDPR or HIPAA, by implementing privacy controls and obtaining necessary consents or permissions for data processing activities.", + "waf": "Security" }, { - "arm-service": "Microsoft.AVS/privateClouds", + "arm-service": "Microsoft.CognitiveServices/accounts", "checklist": "WAF checklist", - "guid": "17e7a8d9-0ae0-4e27-aee2-9711bd352caa", - "service": "AVS", + "guid": "ba2cf204-9901-43a5-b3ce-474dccbd8682", + "service": "Azure OpenAI", "services": [ - "Monitor", - "AVS", - "AzurePolicy", "WAF" ], "severity": "Medium", - "text": "Use Azure Policy to onboard Azure VMware Solution workloads in the Azure Management, Monitoring and Security solutions", - "waf": "Operations" + "text": "Educate your employees about data security best practices, the importance of handling data securely, and potential risks associated with data breaches. Encourage them to follow data security protocols diligently.", + "waf": "Security" }, { - "arm-service": "Microsoft.AVS/privateClouds", + "arm-service": "Microsoft.CognitiveServices/accounts", "checklist": "WAF checklist", - "guid": "aee3553a-fc83-4392-98b2-62d6cc5f5129", - "service": "AVS", + "guid": "eae01e6e-842e-452f-9721-d928c1b1cd52", + "service": "Azure OpenAI", "services": [ - "AVS", - "Defender", "WAF" ], - "severity": "Medium", - "text": "Ensure workloads running on Azure VMware Solution are onboarded to Microsoft Defender for Cloud", + "severity": "High", + "text": "Keep production data separate from development and testing data. Only use real sensitive data in production and utilize anonymized or synthetic data in development and test environments.", "waf": "Security" }, { - "arm-service": "Microsoft.AVS/privateClouds", + "arm-service": "Microsoft.CognitiveServices/accounts", "checklist": "WAF checklist", - "guid": "25398e6d-b9d3-47da-a43b-c6cd1d79a9b2", - "service": "AVS", + "guid": "1e54a29a-9de3-499c-bd7b-28dc93555620", + "service": "Azure OpenAI", "services": [ - "Backup", "WAF" ], "severity": "Medium", - "text": "Ensure backups are not stored on vSAN as vSAN is a finite resource", - "waf": "Reliability" + "text": "If you have varying levels of data sensitivity, consider creating separate indexes for each level. For instance, you could have one index for general data and another for sensitive data, each governed by different access protocols", + "waf": "Security" }, { - "arm-service": "Microsoft.AVS/privateClouds", + "arm-service": "Microsoft.CognitiveServices/accounts", "checklist": "WAF checklist", - "guid": "5e6bfbb9-ed50-4354-9cc4-47e826028a71", - "service": "AVS", + "guid": "2bfe4564-b0d8-434a-948b-263e6dd60512", + "service": "Azure OpenAI", "services": [ - "WAF" + "RBAC", + "WAF", + "AzurePolicy" ], "severity": "Medium", - "text": "Have all DR solutions been considered and a solution that is best for your business been decided upon? [SRM/JetStream/Zerto/Veeam/...]", - "waf": "Reliability" + "text": "Take segregation a step further by placing sensitive datasets in different instances of the service. Each instance can be controlled with its own specific set of RBAC policies", + "waf": "Security" }, { - "arm-service": "Microsoft.AVS/privateClouds", + "arm-service": "Microsoft.CognitiveServices/accounts", "checklist": "WAF checklist", - "guid": "f0f1cac6-d9ef-41d5-b832-d42e3611c818", - "service": "AVS", + "guid": "a36498f6-dbad-438e-ad53-cc7ce1d7aaab", + "service": "Azure OpenAI", "services": [ - "ASR", "WAF" ], - "severity": "Medium", - "text": "Use Azure Site Recovery when the Disaster Recovery technology is native Azure IaaS", - "waf": "Reliability" + "severity": "High", + "text": "Recognize that embeddings and vectors generated from sensitive information are themselves sensitive. This data should be afforded the same protective measures as the source material", + "waf": "Security" }, { - "arm-service": "Microsoft.AVS/privateClouds", + "arm-service": "Microsoft.CognitiveServices/accounts", "checklist": "WAF checklist", - "guid": "b0afbc51-0e43-4a18-a9cd-289bed6b17db", - "service": "AVS", + "guid": "3571449a-b805-43d8-af89-dc7b33be2a1a", + "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/role-based-access-control", + "service": "Azure OpenAI", "services": [ + "RBAC", "WAF" ], "severity": "High", - "text": "Use Automated recovery plans with either of the Disaster solutions, avoid manual tasks as much as possible", - "waf": "Reliability" + "text": "Apply RBAC to th data stores having embeddings and vectors and scope access based on role's access requirements", + "waf": "Security" }, { - "arm-service": "Microsoft.AVS/privateClouds", + "arm-service": "Microsoft.CognitiveServices/accounts", "checklist": "WAF checklist", - "guid": "8255461e-2aee-4345-9aec-8339248b262d", - "service": "AVS", + "guid": "27f7b9e9-1be1-4f38-aef3-9812bd463cbb", + "link": "https://techcommunity.microsoft.com/t5/azure-architecture-blog/azure-openai-private-endpoints-connecting-across-vnet-s/ba-p/3913325", + "service": "Azure OpenAI", "services": [ - "ASR", - "WAF" + "WAF", + "PrivateLink" ], - "severity": "Medium", - "text": "Use the geopolitical region pair as the secondary disaster recovery environment", - "waf": "Reliability" + "severity": "High", + "text": "Configure private endpoint for AI services to restrict service access within your network", + "waf": "Security" }, { - "arm-service": "Microsoft.AVS/privateClouds", + "arm-service": "Microsoft.CognitiveServices/accounts", "checklist": "WAF checklist", - "guid": "6cc5f512-9253-498e-9da9-d37dac43bc6c", - "service": "AVS", + "guid": "ac8ac199-ebb9-41a3-9d90-cae2cc881370", + "service": "Azure OpenAI", "services": [ - "WAF" + "VNet", + "WAF", + "Firewall" ], "severity": "High", - "text": "Use 2 different address spaces between the regions, for example: 10.0.0.0/16 and 192.168.0.0/16 for the different regions", - "waf": "Reliability" + "text": "Enforce strict inbound and outbound traffic control with Azure Firewall and UDRs and limit the external integration points", + "waf": "Security" }, { - "arm-service": "Microsoft.AVS/privateClouds", + "arm-service": "Microsoft.CognitiveServices/accounts", "checklist": "WAF checklist", - "guid": "d1d79a9b-2460-4448-aa8f-42d78e78cb6a", - "service": "AVS", + "guid": "6f7c0cba-fe51-4464-add4-57e927138b82", + "service": "Azure OpenAI", "services": [ - "AVS", - "ExpressRoute", - "NVA", "WAF" ], - "severity": "Medium", - "text": "Will ExpressRoute Global Reach be used for connectivity between the primary and secondary Azure VMware Solution Private Clouds or is routing done through network virtual appliances?", - "waf": "Reliability" + "severity": "High", + "text": "Implement network segmentation and access controls to restrict access to the LLM application only to authorized users and systems and prevent lateral movement", + "waf": "Security" }, { - "arm-service": "Microsoft.AVS/privateClouds", + "arm-service": "Microsoft.CognitiveServices/accounts", "checklist": "WAF checklist", - "guid": "33bd2a09-17e7-4a8d-a0ae-0e27cee29711", - "service": "AVS", + "guid": "7f42c78e-78cb-46a2-8ad1-90916e6a8d8f", + "link": "https://www.microsoft.com/research/blog/llmlingua-innovating-llm-efficiency-with-prompt-compression/", + "service": "Azure OpenAI", "services": [ - "Backup", "WAF" ], "severity": "Medium", - "text": "Have all Backup solutions been considered and a solution that is best for your business been decided upon? [ MABS/CommVault/Metallic.io/Veeam/�. ]", - "waf": "Reliability" + "text": "Use prompt compression tools like LLMLingua or gprtrim", + "waf": "Cost Optimization" }, { - "arm-service": "Microsoft.AVS/privateClouds", + "arm-service": "Microsoft.CognitiveServices/accounts", "checklist": "WAF checklist", - "guid": "bd352caa-ab79-4b18-adab-81932c9fc9d1", - "service": "AVS", + "guid": "1102cac6-eae0-41e6-b842-e52f4721d928", + "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/managed-identity", + "service": "Azure OpenAI", "services": [ - "AVS", - "Backup", - "WAF" + "Entra", + "WAF", + "AKV" ], - "severity": "Medium", - "text": "Deploy your backup solution in the same region as your Azure VMware Solution private cloud", - "waf": "Reliability" + "severity": "High", + "text": "Ensure that APIs and endpoints used by the LLM application are properly secured with authentication and authorization mechanisms, such as Managed identities, API keys or OAuth, to prevent unauthorized access.", + "waf": "Security" }, { - "arm-service": "Microsoft.AVS/privateClouds", + "arm-service": "Microsoft.CognitiveServices/accounts", "checklist": "WAF checklist", - "guid": "bb77036f-5e6b-4fbb-aed5-03547cc447e8", - "service": "AVS", + "guid": "c1b1cd52-1e54-4a29-a9de-399cfd7b28dc", + "link": "https://techcommunity.microsoft.com/t5/azure-architecture-blog/security-best-practices-for-genai-applications-openai-in-azure/ba-p/4027885", + "service": "Azure OpenAI", "services": [ - "Backup", "WAF" ], "severity": "Medium", - "text": "Deploy your backup solution outside of vSan, on Azure native components", - "waf": "Reliability" + "text": "Enforce strong end user authentication mechanisms, such as multi-factor authentication, to prevent unauthorized access to the LLM application and associated network resources", + "waf": "Security" }, { - "arm-service": "Microsoft.AVS/privateClouds", + "arm-service": "Microsoft.CognitiveServices/accounts", "checklist": "WAF checklist", - "guid": "26028a71-f0f1-4cac-9d9e-f1d5e832d42e", - "service": "AVS", + "guid": "93555620-2bfe-4456-9b0d-834a348b263e", + "service": "Azure OpenAI", "services": [ - "AVS", + "Monitor", "WAF" ], - "severity": "Low", - "text": "Is a process in place to request a restore of the VMware components managed by the Azure Platform?", - "waf": "Reliability" + "severity": "Medium", + "text": "Implement network monitoring tools to detect and analyze network traffic for any suspicious or malicious activities. Enable logging to capture network events and facilitate forensic analysis in case of security incidents", + "waf": "Security" }, { - "arm-service": "Microsoft.AVS/privateClouds", + "arm-service": "Microsoft.CognitiveServices/accounts", "checklist": "WAF checklist", - "guid": "4604489a-8f42-4d78-b78c-b7a33bd2a0a1", - "service": "AVS", + "guid": "6dd60512-a364-498f-9dba-d38ead53cc7c", + "service": "Azure OpenAI", "services": [ "WAF" ], - "severity": "Low", - "text": "For manual deployments, all configuration and deployments must be documented", - "waf": "Operations" + "severity": "Medium", + "text": "Conduct security audits and penetration testing to identify and address any network security weaknesses or vulnerabilities in the LLM application's network infrastructure", + "waf": "Security" }, { - "arm-service": "Microsoft.AVS/privateClouds", + "arm-service": "Microsoft.CognitiveServices/accounts", "checklist": "WAF checklist", - "guid": "7e7a8d90-ae0e-437c-be29-711bd352caaa", - "service": "AVS", + "guid": "e1d7aaab-3571-4449-ab80-53d89f89dc7b", + "link": "https://learn.microsoft.com/azure/azure-resource-manager/management/tag-resources?tabs=json", + "service": "Azure OpenAI", "services": [ - "AVS", "WAF" ], "severity": "Low", - "text": "For manual deployments, consider implementing resource locks to prevent accidental actions on your Azure VMware Solution Private Cloud", - "waf": "Operations" + "text": "Azure AI Services are properly tagged for better management", + "waf": "Operational Excellence" }, { - "arm-service": "Microsoft.AVS/privateClouds", + "arm-service": "Microsoft.CognitiveServices/accounts", "checklist": "WAF checklist", - "guid": "b79b198d-ab81-4932-a9fc-9d1bb78036f5", - "service": "AVS", + "guid": "77036e5e-6b4b-4ed3-b503-547c1347dc56", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/ready/azure-best-practices/resource-abbreviations", + "service": "Azure OpenAI", "services": [ "WAF" ], "severity": "Low", - "text": "For automated deployments, deploy a minimal private cloud and scale as needed", - "waf": "Operations" + "text": "Azure AI Service accounts follows organizational naming conventions", + "waf": "Operational Excellence" }, { - "arm-service": "Microsoft.AVS/privateClouds", + "arm-service": "Microsoft.CognitiveServices/accounts", "checklist": "WAF checklist", - "guid": "e6bfbb9e-d503-4547-ac44-7e826128a71f", - "service": "AVS", + "guid": "028a71ff-e1ce-415d-b3f0-d5e772d41e36", + "link": "https://learn.microsoft.com/azure/ai-services/diagnostic-logging", + "service": "Azure OpenAI", "services": [ "WAF" ], - "severity": "Low", - "text": "For automated deployments, request or reserve quota prior to starting the deployment", - "waf": "Operations" + "severity": "High", + "text": "Diagnostic logs in Azure AI services resources should be enabled", + "waf": "Operational Excellence" }, { - "arm-service": "Microsoft.AVS/privateClouds", + "arm-service": "Microsoft.CognitiveServices/accounts", "checklist": "WAF checklist", - "guid": "0f1cac6d-9ef1-4d5e-a32e-42e3611c818b", - "service": "AVS", + "guid": "11cc57b4-a4b1-4410-b439-58a8c2289b3d", + "link": "https://learn.microsoft.com/azure/ai-services/authentication", + "service": "Azure OpenAI", "services": [ - "AzurePolicy", + "Entra", "WAF" ], - "severity": "Low", - "text": "For automated deployment, ensure that relevant resource locks are created through the automation or through Azure Policy for proper governance", - "waf": "Operations" + "severity": "High", + "text": "Key access (local authentication) is recommended to be disabled for security. After disabling key based access, Microsoft Entra ID becomes the only access method, which allows maintaining minimum privilege principle and granular control. ", + "waf": "Security" }, { - "arm-service": "Microsoft.AVS/privateClouds", + "arm-service": "Microsoft.CognitiveServices/accounts", "checklist": "WAF checklist", - "guid": "e2cc95d4-8c6b-4791-bca0-f6c56589e558", - "service": "AVS", + "guid": "6b57cfc6-5546-41e1-a3e3-453a3c863964", + "link": "https://learn.microsoft.com/azure/key-vault/general/best-practices", + "service": "Azure OpenAI", "services": [ - "AKV", - "WAF" + "Entra", + "WAF", + "AKV" ], - "severity": "Low", - "text": "Implement human understandable names for ExR authorization keys to allow for easy identification of the keys purpose/use", - "waf": "Operations" + "severity": "High", + "text": "Store and manage keys securely using Azure Key Vault. Avoid hard-coding or embedding sensitive keys within your LLM application's code and retrieve them securely from Azure Key Vault using managed identities", + "waf": "Security" }, { - "arm-service": "Microsoft.AVS/privateClouds", + "arm-service": "Microsoft.CognitiveServices/accounts", "checklist": "WAF checklist", - "guid": "255461e2-aee3-4553-afc8-339248b262d6", - "service": "AVS", + "guid": "8b652d6c-15f5-4129-9539-8e6ded227dd1", + "link": "https://learn.microsoft.com/azure/key-vault/general/best-practices", + "service": "Azure OpenAI", "services": [ - "AKV", - "AVS", - "ExpressRoute", - "WAF" + "WAF", + "AKV" ], - "severity": "Low", - "text": "Use Key vault to store secrets and authorization keys when separate Service Principles are used for deploying Azure VMware Solution and ExpressRoute", - "waf": "Operations" + "severity": "High", + "text": "Regularly rotate and expire keys stored in Azure Key Vault to minimize the risk of unauthorized access.", + "waf": "Security" }, { - "arm-service": "Microsoft.AVS/privateClouds", + "arm-service": "Microsoft.CognitiveServices/accounts", "checklist": "WAF checklist", - "guid": "cc5f5129-2539-48e6-bb9d-37dac43bc6cd", - "service": "AVS", + "guid": "adfe27be-e297-401a-a352-baaab79b088d", + "link": "https://github.com/openai/tiktoken", + "service": "Azure OpenAI", "services": [ - "AVS", "WAF" ], - "severity": "Low", - "text": "Define resource dependencies for serializing actions in IaC when many resources need to be deployed in/on Azure VMware Solution as Azure VMware Solution only supports a limited number of parallel operations.", - "waf": "Operations" + "severity": "High", + "text": "Use tiktoken to understand token sizes for token optimizations in conversational mode", + "waf": "Cost Optimization" }, { - "arm-service": "Microsoft.AVS/privateClouds", + "arm-service": "Microsoft.CognitiveServices/accounts", "checklist": "WAF checklist", - "guid": "1d79a9b2-4604-4489-a8f4-2d78e78cb7a3", - "service": "AVS", + "guid": "42b06c21-d799-49a6-96f4-389a7f42c78e", + "link": "https://learn.microsoft.com/azure/security/develop/secure-dev-overview", + "service": "Azure OpenAI", "services": [ "WAF" ], - "severity": "Low", - "text": "When performing automated configuration of NSX-T segments with a single Tier-1 gateway, use Azure Portal APIs instead of NSX-Manager APIs", - "waf": "Operations" + "severity": "High", + "text": "Follow secure coding practices to prevent common vulnerabilities such as injection attacks, cross-site scripting (XSS), or security misconfigurations", + "waf": "Security" }, { - "arm-service": "Microsoft.AVS/privateClouds", + "arm-service": "Microsoft.CognitiveServices/accounts", "checklist": "WAF checklist", - "guid": "3bd2a0a1-7e7a-48d9-8ae0-e37cee29711b", - "service": "AVS", + "guid": "78c06a73-a22a-4495-9e6a-8dc4a20e27c3", + "link": "https://learn.microsoft.com/azure/devops/repos/security/github-advanced-security-dependency-scanning?view=azure-devops", + "service": "Azure OpenAI", "services": [ - "AVS", - "Subscriptions", "WAF" ], - "severity": "Medium", - "text": "When intending to use automated scale-out, be sure to apply for sufficient Azure VMware Solution quota for the subscriptions running Azure VMware Solution", - "waf": "Performance" + "severity": "High", + "text": "Setup a process to regularly update and patch the LLM libraries and other system components", + "waf": "Security" }, { - "arm-service": "Microsoft.AVS/privateClouds", + "arm-service": "Microsoft.CognitiveServices/accounts", "checklist": "WAF checklist", - "guid": "d352caaa-b79b-4198-bab8-1932c9fc9d1b", - "service": "AVS", + "guid": "e29711b1-352b-4eee-879b-588defc4972c", + "link": "https://learn.microsoft.com/legal/cognitive-services/openai/code-of-conduct", + "service": "Azure OpenAI", "services": [ - "Storage", - "AzurePolicy", - "WAF" + "WAF", + "AzurePolicy" ], - "severity": "Medium", - "text": "When intending to use automated scale-in, be sure to take storage policy requirements into account before performing such action", - "waf": "Performance" + "severity": "High", + "text": "Adhere to Azure OpenAI or other LLMs terms of use, policies and guidance and allowed use cases", + "waf": "Operational Excellence" }, { - "arm-service": "Microsoft.AVS/privateClouds", + "arm-service": "Microsoft.CognitiveServices/accounts", "checklist": "WAF checklist", - "guid": "b78036f5-e6bf-4bb9-bd50-3547cc447e82", - "service": "AVS", + "guid": "d3cd21bf-7703-46e5-b6b4-bed3d503547c", + "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/manage-costs#base-series-and-codex-series-fine-tuned-models", + "service": "Azure OpenAI", "services": [ + "Cost", "WAF" ], "severity": "Medium", - "text": "Scaling operations always need to be serialized within a single SDDC as only one scale operation can be performed at a time (even when multiple clusters are used)", - "waf": "Performance" + "text": "Understand difference in cost of base models and fine tuned models and token step sizes", + "waf": "Cost Optimization" }, { - "arm-service": "Microsoft.AVS/privateClouds", + "arm-service": "Microsoft.CognitiveServices/accounts", "checklist": "WAF checklist", - "guid": "bf15bce2-19e4-4a0e-a588-79424d226786", - "service": "AVS", + "guid": "1347dc56-028a-471f-be1c-e15dd3f0d5e7", + "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/latency#batching", + "service": "Azure OpenAI", "services": [ + "Cost", "WAF" ], - "severity": "Medium", - "text": "Consider and validate scaling operations on 3rd party solutions used in the architecture (supported or not)", - "waf": "Performance" + "severity": "High", + "text": "Batch requests, where possible, to minimize the per-call overhead which can reduce overall costs. Ensure you optimize batch size", + "waf": "Cost Optimization" }, { - "arm-service": "Microsoft.AVS/privateClouds", + "arm-service": "Microsoft.CognitiveServices/accounts", "checklist": "WAF checklist", - "guid": "d20b56c5-7be5-4851-a0f8-3835c586cb29", - "service": "AVS", + "guid": "72d41e36-11cc-457b-9a4b-1410d43958a8", + "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/manage-costs", + "service": "Azure OpenAI", "services": [ + "Monitor", + "Cost", "WAF" ], "severity": "Medium", - "text": "Define and enforce scale in/out maximum limits for your environment in the automations", - "waf": "Performance" + "text": "Set up a cost tracking system that monitors model usage and use that information to help inform model choices and prompt sizes", + "waf": "Cost Optimization" }, { - "arm-service": "Microsoft.AVS/privateClouds", + "arm-service": "Microsoft.CognitiveServices/accounts", "checklist": "WAF checklist", - "guid": "1dc15a1c-075e-4e9f-841a-cccd579376bc", - "service": "AVS", + "guid": "166cd072-af9b-4141-a898-a535e737897e", + "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/quota?tabs=rest#understanding-rate-limits", + "service": "Azure OpenAI", "services": [ - "Monitor", "WAF" ], "severity": "Medium", - "text": "Implement monitoring rules to monitor automated scaling operations and monitor success and failure to enable appropriate (automated) responses", - "waf": "Operations" + "text": "Set a maximum limit on the number of tokens per model response. Optimize the size to ensure it is large enough for a valid response", + "waf": "Cost Optimization" }, { - "arm-service": "Microsoft.AVS/privateClouds", + "arm-service": "Microsoft.CognitiveServices/accounts", "checklist": "WAF checklist", - "guid": "c5972cd4-cd21-4b07-9036-f5e6b4bfd3d5", - "link": "https://learn.microsoft.com/azure/active-directory/app-proxy/application-proxy#how-application-proxy-works", - "service": "AVS", + "guid": "71ca7da8-cfa9-462a-8594-946da97dc3a2", + "link": "https://learn.microsoft.com/azure/search/search-reliability", + "service": "Azure OpenAI", "services": [ - "VM", "WAF" ], - "severity": "High", - "text": "When using MON, be aware of the limits of simulataneously configured VMs (MON Limit for HCX [400 - standard, 1000 - Larger appliance])", - "training": "https://learn.microsoft.com/learn/modules/configure-azure-ad-application-proxy/", - "waf": "Reliability" + "severity": "Medium", + "text": "Review the guidance provided on setting up AI search for Reliability", + "waf": "Operational Excellence" }, { - "arm-service": "Microsoft.AVS/privateClouds", + "arm-service": "Microsoft.CognitiveServices/accounts", "checklist": "WAF checklist", - "guid": "be1f38cf-03a8-422b-b463-cbbbc8ac299e", - "link": "https://learn.microsoft.com/azure/active-directory/app-proxy/application-proxy#how-application-proxy-works", - "service": "AVS", + "guid": "3266b225-86f4-4a16-92bd-ddea8a487cde", + "link": "https://learn.microsoft.com/azure/search/vector-search-index-size?tabs=portal-vector-quota", + "service": "Azure OpenAI", "services": [ + "Storage", "WAF" ], - "severity": "High", - "text": "When using MON, you cannot enable MON on more than 100 Network extensions", - "training": "https://learn.microsoft.com/learn/paths/implement-applications-external-access-azure-ad/", - "waf": "Reliability" + "severity": "Medium", + "text": "Plan and manage AI Search Vector storage", + "waf": "Operational Excellence" }, { - "arm-service": "Microsoft.AVS/privateClouds", + "arm-service": "Microsoft.CognitiveServices/accounts", "checklist": "WAF checklist", - "guid": "bc91a43d-90da-4e2c-a881-4706f7c1cbaf", - "service": "AVS", + "guid": "b4861bc3-bc14-4aeb-9e66-e8d9a3aec218", + "link": "https://learn.microsoft.com/azure/machine-learning/prompt-flow/how-to-end-to-end-llmops-with-prompt-flow?view=azureml-api-2", + "service": "Azure OpenAI", "services": [ - "VPN", "WAF" ], "severity": "Medium", - "text": "If using a VPN connection for migrations, adjust your MTU size accordingly.", - "waf": "Performance" + "text": "Apply LLMOps practices to automate the lifecycle management of your GenAI applications", + "waf": "Operational Excellence" }, { - "arm-service": "Microsoft.AVS/privateClouds", + "arm-service": "Microsoft.CognitiveServices/accounts", "checklist": "WAF checklist", - "guid": "e614658d-d457-4e92-9139-b821102cad6e", - "service": "AVS", + "guid": "aa80932c-8ec9-4d1b-a770-26e5e6beba9e", + "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/provisioned-throughput-onboarding#understanding-the-provisioned-throughput-purchase-model", + "service": "Azure OpenAI", "services": [ "WAF" ], - "severity": "Medium", - "text": "For low connectivity regions connecting into Azure (500Mbps or less), considering deploying the HCX WAN optimization appliance", - "waf": "Performance" + "severity": "High", + "text": "Evaluate usage of billing models - PAYG vs PTU", + "waf": "Cost Optimization" }, { - "arm-service": "Microsoft.AVS/privateClouds", + "arm-service": "Microsoft.CognitiveServices/accounts", "checklist": "WAF checklist", - "guid": "ae01e6e8-43e5-42f4-922d-928c1b1cd521", - "service": "AVS", + "guid": "e6436b07-36db-455f-9796-03334bdf9cc2", + "link": "https://techcommunity.microsoft.com/t5/ai-azure-ai-services-blog/how-to-control-azure-openai-models/ba-p/4146793", + "service": "Azure OpenAI", "services": [ "WAF" ], "severity": "Medium", - "text": "Ensure that migrations are started from the on-premises appliance and NOT from the Cloud appliance (do NOT perform a reverse migration)", - "waf": "Reliability" + "text": "Evaluate the quality of prompts and applications when switching between model versions", + "waf": "Operational Excellence" }, { - "arm-service": "Microsoft.AVS/privateClouds", + "arm-service": "Microsoft.CognitiveServices/accounts", "checklist": "WAF checklist", - "guid": "e54a29a9-de39-4ac0-b7c2-8dc935657202", - "link": "https://learn.microsoft.com/azure/web-application-firewall/afds/waf-front-door-policy-settings", - "service": "AVS", + "guid": "3418db61-2712-4650-9bb4-7a393a080327", + "link": "https://learn.microsoft.com/azure/machine-learning/prompt-flow/concept-model-monitoring-generative-ai-evaluation-metrics?view=azureml-api-2", + "service": "Azure OpenAI", "services": [ - "AVS", - "VM", - "Storage", + "Monitor", "WAF" ], "severity": "Medium", - "text": "When Azure Netapp Files is used to extend storage for Azure VMware Solution,consider using this as a VMware datastore instead of attaching directly to a VM.", - "waf": "Reliability" + "text": "Evaluate, monitor and refine your GenAI apps for features like groundedness, relevance, accuracy, coherence, fluency, �", + "waf": "Operational Excellence" }, { - "arm-service": "Microsoft.AVS/privateClouds", + "arm-service": "Microsoft.CognitiveServices/accounts", "checklist": "WAF checklist", - "guid": "bff4564b-0d93-44a3-98b2-63e7dd60513a", - "link": "https://learn.microsoft.com/azure/frontdoor/best-practices#avoid-combining-traffic-manager-and-front-door", - "service": "AVS", + "guid": "294798b1-578b-4219-a46c-eb5443513592", + "service": "Azure OpenAI", "services": [ - "Storage", - "ExpressRoute", "WAF" ], "severity": "Medium", - "text": "Ensure that a dedicated ExpressRoute Gateway is being used for external data storage solutions", - "waf": "Reliability" + "text": "Evaluate your Azure AI Search results based on different search parameters", + "waf": "Operational Excellence" }, { - "arm-service": "Microsoft.AVS/privateClouds", + "arm-service": "Microsoft.CognitiveServices/accounts", "checklist": "WAF checklist", - "guid": "3649906e-bad3-48ea-b53c-c7de1d8aaab3", - "link": "https://learn.microsoft.com/azure/frontdoor/best-practices#use-the-same-domain-name-on-front-door-and-your-origin", - "service": "AVS", + "guid": "2744293b-b628-4537-a551-19b08e8f5854", + "link": "https://learn.microsoft.com/azure/ai-services/openai/concepts/fine-tuning-considerations", + "service": "Azure OpenAI", "services": [ - "Storage", - "ExpressRoute", "WAF" ], "severity": "Medium", - "text": "Ensure that FastPath is enabled on the ExpressRoute Gateway that is being used for external data storage solutions", - "waf": "Reliability" + "text": "Look at fine tuning models as way of increasing accuracy only when you have tried other basic approaches like prompt engineering and RAG with your data", + "waf": "Operational Excellence" }, { - "arm-service": "Microsoft.AVS/privateClouds", + "arm-service": "Microsoft.CognitiveServices/accounts", "checklist": "WAF checklist", - "guid": "571549ab-8153-4d89-b89d-c7b33be2b1a2", - "link": "https://learn.microsoft.com/azure/frontdoor/best-practices#disable-health-probes-when-theres-only-one-origin-in-an-origin-group", - "service": "AVS", + "guid": "287d9cec-166c-4d07-8af9-b141a898a535", + "link": "https://learn.microsoft.com/azure/ai-services/openai/concepts/advanced-prompt-engineering?pivots=programming-language-chat-completions", + "service": "Azure OpenAI", "services": [ - "ASR", "WAF" ], - "severity": "High", - "text": "If using stretched cluster, ensure that your selected Disaster Recovery solution is supported by the vendor", - "waf": "Reliability" + "severity": "Medium", + "text": "Use prompt engineering techniques to improve the accuracy of LLM responses", + "waf": "Operational Excellence" }, { - "arm-service": "Microsoft.AVS/privateClouds", + "arm-service": "Microsoft.CognitiveServices/accounts", "checklist": "WAF checklist", - "guid": "4c486b6d-8bdc-4059-acf7-5ee8a1309888", - "link": "https://learn.microsoft.com/azure/frontdoor/best-practices#select-good-health-probe-endpoints", - "service": "AVS", + "guid": "e737897e-71ca-47da-acfa-962a1594946d", + "link": "https://learn.microsoft.com/azure/ai-services/openai/concepts/red-teaming", + "service": "Azure OpenAI", "services": [ "WAF" ], - "severity": "High", - "text": "If using stretched cluster, ensure that the SLA provided will meet your requirements", - "waf": "Reliability" + "severity": "Medium", + "text": "Red team your GenAI applications", + "waf": "Security" }, { - "arm-service": "Microsoft.AVS/privateClouds", + "arm-service": "Microsoft.CognitiveServices/accounts", "checklist": "WAF checklist", - "guid": "9579d66b-896d-471f-a6ca-7be9955d04c3", - "link": "https://learn.microsoft.com/azure/frontdoor/best-practices#use-head-health-probes", - "service": "AVS", + "guid": "edb117e6-76aa-4f66-aca4-8e5a95f2223e", + "link": "https://www.microsoft.com/haxtoolkit/guideline/encourage-granular-feedback/", + "service": "Azure OpenAI", "services": [ - "ExpressRoute", "WAF" ], - "severity": "High", - "text": "If using stretched cluster, ensure that both ExpressRoute circuits are connected to your connectivity hub.", - "waf": "Reliability" + "severity": "Medium", + "text": "Provide end users with scoring options for LLM responses and track these scores. ", + "waf": "Operational Excellence" }, { - "arm-service": "Microsoft.AVS/privateClouds", + "arm-service": "Microsoft.CognitiveServices/accounts", "checklist": "WAF checklist", - "guid": "c49d987c-b3d1-4325-aa12-4b6e4d0685ed", - "link": "https://learn.microsoft.com/azure/nat-gateway/nat-overview#outbound-connectivity", - "service": "AVS", + "guid": "d5f3547c-c346-4d81-9028-a71ffe1b9b5d", + "link": "https://techcommunity.microsoft.com/t5/fasttrack-for-azure/optimizing-azure-openai-a-guide-to-limits-quotas-and-best/ba-p/4076268", + "service": "Azure OpenAI", "services": [ - "ExpressRoute", "WAF" ], "severity": "High", - "text": "If using stretched cluster, ensure that both ExpressRoute circuits have GlobalReach enabled.", - "waf": "Reliability" + "text": "Consider Quota management practices", + "waf": "Cost Optimization" }, { - "arm-service": "Microsoft.AVS/privateClouds", + "arm-service": "Microsoft.CognitiveServices/accounts", "checklist": "WAF checklist", - "guid": "dce9793b-7bcd-4b3b-91eb-2ec14eea6e59", - "link": "https://learn.microsoft.com/azure/frontdoor/best-practices#use-managed-tls-certificates", - "service": "AVS", + "guid": "9de0d5d7-31d4-41e3-911c-817bfafbc410", + "link": "https://github.com/Azure/aoai-apim/blob/main/README.md", + "service": "Azure OpenAI", "services": [ - "WAF" + "Entra", + "WAF", + "APIM", + "ACR", + "LoadBalancer" ], - "severity": "High", - "text": "Have site disaster tolerance settings been properly considered and changed for your business if needed.", - "waf": "Reliability" + "severity": "Medium", + "text": "Use Load balancer solutions like APIM based gateway for balancing load and capacity across services and regions", + "waf": "Operational Excellence" }, { "arm-service": "Microsoft.Devices/IotHubs", @@ -29161,4881 +32581,4980 @@ "waf": "Reliability" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "WAF checklist", - "guid": "a85b86ad-884f-48e3-9273-4b875ba18f10", - "link": "https://learn.microsoft.com/azure/ai-services/openai/concepts/system-message#define-additional-safety-and-behavioral-guardrails", - "service": "Azure OpenAI", - "services": [ - "WAF" - ], - "severity": "High", - "text": "Follow Metaprompting guardrails for resonsible AI", - "waf": "Operational Excellence" - }, - { - "arm-service": "Microsoft.CognitiveServices/accounts", + "arm-service": "Microsoft.App/containerApps", "checklist": "WAF checklist", - "guid": "d4391898-cd28-48be-b6b1-7cb8245451e1", - "link": "https://github.com/Azure-Samples/AI-Gateway", - "service": "Azure OpenAI", + "guid": "af416482-663c-4ed6-b195-b44c7068e09c", + "link": "https://learn.microsoft.com/azure/reliability/reliability-azure-container-apps?tabs=azure-cli#availability-zone-support", + "service": "Container Apps", "services": [ - "Entra", - "APIM", "WAF" ], "severity": "High", - "text": "Consider Gateway patterns with APIM or solutions like AI central for better rate limiting, load balancing, authentication and logging", - "waf": "Operational Excellence" + "text": "Leverage Availability Zones if regionally applicable", + "waf": "Reliability" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", + "arm-service": "Microsoft.App/containerApps", "checklist": "WAF checklist", - "guid": "aed3453a-ec72-4392-97a1-52d6cc5e4029", - "link": "https://techcommunity.microsoft.com/t5/fasttrack-for-azure/azure-openai-insights-monitoring-ai-with-confidence/ba-p/4026850", - "service": "Azure OpenAI", + "guid": "95bc80ec-6499-4d14-a7d2-7d296b1d8abc", + "link": "https://learn.microsoft.com/azure/reliability/reliability-azure-container-apps?tabs=azure-cli#set-up-zone-redundancy-in-your-container-apps-environment", + "service": "Container Apps", "services": [ - "Monitor", "WAF" ], "severity": "High", - "text": "Enable monitoring for your AOAI instances", - "waf": "Operational Excellence" + "text": "Use more than one replica and enable Zone Redundancy.", + "waf": "Reliability" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", + "arm-service": "Microsoft.App/containerApps", "checklist": "WAF checklist", - "guid": "697cb391-ed16-4b2d-886f-0a0241addde6", - "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/monitoring#set-up-alerts", - "service": "Azure OpenAI", + "guid": "ccaa4fc2-fdbc-4432-8bb7-f7e6469e4dc3", + "link": "https://learn.microsoft.com/azure/reliability/reliability-azure-container-apps?tabs=azure-cli#cross-region-disaster-recovery-and-business-continuity", + "service": "Container Apps", "services": [ - "AKV", - "Monitor", - "Subscriptions", "WAF" ], "severity": "High", - "text": "Create alerts to notify teams of events such as an entry in the activity log created by an action performed on the resource, such as regenerating its subscription keys or a metric threshold such as the number of errors exceeding 10 in an hour", - "waf": "Operational Excellence" + "text": "For cross-region DR, deploy container apps in multiple regions and follow active/active or active/passive application guidance.", + "waf": "Reliability" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", + "arm-service": "Microsoft.App/containerApps", "checklist": "WAF checklist", - "guid": "8a477cde-b486-41bc-9bc1-0ae66e25d4d5", - "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/monitoring", - "service": "Azure OpenAI", + "guid": "2ffada86-c031-4933-bf7d-0c45bc4e5919", + "link": "https://learn.microsoft.com/azure/reliability/reliability-azure-container-apps?tabs=azure-cli#cross-region-disaster-recovery-and-business-continuity", + "service": "Container Apps", "services": [ - "Monitor", - "WAF" + "TrafficManager", + "WAF", + "FrontDoor" ], "severity": "High", - "text": "Monitor token usage to prevent service disruptions due to capacity", - "waf": "Operational Excellence" + "text": "Use Front Door or Traffic Manager to route traffic to the closest region", + "waf": "Reliability" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", + "arm-service": "Microsoft.DBforPostgreSQL/servers", "checklist": "WAF checklist", - "guid": "a3aec2c4-e243-46b0-936c-b45e17960eee", - "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/monitoring", - "service": "Azure OpenAI", + "guid": "65285269-441c-44bf-9d3e-0844276d4bdc", + "link": "https://learn.microsoft.com/azure/postgresql/flexible-server/overview", + "service": "PostgreSQL", "services": [ - "Monitor", "WAF" ], "severity": "Medium", - "text": "observe metrics like processed inference tokens, generated completion tokens monitor for rate limit", - "waf": "Operational Excellence" + "text": "Leverage Flexible Server", + "waf": "Reliability" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", + "arm-service": "Microsoft.DBforPostgreSQL/servers", "checklist": "WAF checklist", - "guid": "fbdf4cc2-eec4-4d76-8c31-d25ffbb46a39", - "link": "https://techcommunity.microsoft.com/t5/apps-on-azure-blog/build-an-enterprise-ready-azure-openai-solution-with-azure-api/ba-p/3907562", - "service": "Azure OpenAI", + "guid": "016ccf31-ae5a-41eb-9888-9535e227896d", + "link": "https://learn.microsoft.com/azure/postgresql/flexible-server/overview#architecture-and-high-availability", + "service": "PostgreSQL", "services": [ - "APIM", "WAF" ], - "severity": "Low", - "text": "If the diagnostics are not sufficient for you, consider using a gateway such as Azure API Managements in front of Azure OpenAI to log both incoming prompts and outgoing responses, where permitted", - "waf": "Operational Excellence" + "severity": "High", + "text": "Leverage Availability Zones where regionally applicable", + "waf": "Reliability" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", + "arm-service": "Microsoft.DBforPostgreSQL/servers", "checklist": "WAF checklist", - "guid": "3af30ed3-2947-498b-8178-a2c5a46ceb54", - "link": "https://github.com/Azure-Samples/openai-enterprise-iac", - "service": "Azure OpenAI", + "guid": "31b67c67-be59-4519-8083-845d587cb391", + "link": "https://learn.microsoft.com/azure/postgresql/single-server/concepts-business-continuity#cross-region-read-replicas", + "service": "PostgreSQL", "services": [ "WAF" ], - "severity": "High", - "text": "Use Infrastructure as code to deploy the Azure OpenAI Service, model deployments, and all related resources", - "waf": "Operational Excellence" + "severity": "Medium", + "text": "Leverage cross-region read replicas for BCDR", + "waf": "Reliability" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", + "arm-service": "microsoft.containerservice/managedClusters", "checklist": "WAF checklist", - "guid": "4350d092-d234-4292-a752-8537a551c5bf", - "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/managed-identity", - "service": "Azure OpenAI", + "guid": "ab5351f6-383a-45ed-9c5e-b143b16db40a", + "link": "https://learn.microsoft.com/azure/aks/use-windows-hpc", + "service": "AKS", "services": [ - "Entra", + "AKS", "WAF" ], - "severity": "High", - "text": "Use Microsoft Entra Authentication with Managed Identity instead of API Key", - "waf": "Security" + "severity": "Low", + "text": "If required for AKS Windows workloads HostProcess containers can be used", + "waf": "Reliability" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", + "arm-service": "microsoft.containerservice/managedClusters", "checklist": "WAF checklist", - "guid": "4e4f1854-287d-45cd-a126-cc031af5b1fc", - "link": "https://learn.microsoft.com/azure/machine-learning/prompt-flow/how-to-bulk-test-evaluate-flow?view=azureml-api-2", - "service": "Azure OpenAI", + "guid": "a280dcf5-90ce-465d-b8e1-3f9ccbd46926", + "link": "https://learn.microsoft.com/azure/azure-functions/functions-kubernetes-keda", + "service": "AKS", "services": [ "WAF" ], - "severity": "High", - "text": "Evaluate the performance/accuracy of the system with a known golden dataset which has the inputs and the correct answers. Leverage capabilities in PromptFlow for Evaluation.", - "waf": "Operational Excellence" + "severity": "Low", + "text": "Use KEDA if running event-driven workloads", + "waf": "Performance" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", + "arm-service": "microsoft.containerservice/managedClusters", "checklist": "WAF checklist", - "guid": "68889535-e327-4897-b31b-67d67be5962a", - "link": "https://learn.microsoft.com/azure/architecture/ai-ml/architecture/baseline-openai-e2e-chat#azure-openai---performance-efficiency", - "service": "Azure OpenAI", + "guid": "26886d20-b66c-457b-a591-19bf8e8f5c58", + "link": "https://dapr.io/", + "service": "AKS", "services": [ "WAF" ], - "severity": "High", - "text": "Evaluate usage of Provisioned throughput model ", - "waf": "Performance" + "severity": "Low", + "text": "Use Dapr to ease microservice development", + "waf": "Operations" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", + "arm-service": "microsoft.containerservice/managedClusters", "checklist": "WAF checklist", - "guid": "cd288bed-6b17-4cb8-8454-51e1aed3453a", - "link": "https://learn.microsoft.com/azure/ai-services/content-safety/overview", - "service": "Azure OpenAI", + "graph": "where type=='microsoft.containerservice/managedclusters' | extend compliant = (sku.tier=='Paid') | distinct id,compliant", + "guid": "71d41e36-10cc-457b-9a4b-1410d4395898", + "link": "https://learn.microsoft.com/azure/aks/uptime-sla", + "service": "AKS", "services": [ + "AKS", "WAF" ], "severity": "High", - "text": "Review and implement Azure AI content safety", - "waf": "Operational Excellence" + "text": "Use the SLA-backed AKS offering", + "waf": "Reliability" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", + "arm-service": "microsoft.containerservice/managedClusters", "checklist": "WAF checklist", - "guid": "1193846d-697c-4b39-8ed1-6b2d186f0a02", - "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/latency#system-level-throughput", - "service": "Azure OpenAI", + "guid": "c1288b3c-6a57-4cfc-9444-51e1a3d3453a", + "link": "https://learn.microsoft.com/azure/aks/operator-best-practices-scheduler", + "service": "AKS", "services": [ + "Cost", "WAF" ], - "severity": "High", - "text": "Define and evaluate the throughput of the system based on tokens & response per minute and align with requirements", - "waf": "Performance" + "severity": "Low", + "text": "Use Disruption Budgets in your pod and deployment definitions", + "waf": "Reliability" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", + "arm-service": "microsoft.containerregistry/registries", "checklist": "WAF checklist", - "guid": "41addde6-8a47-47cd-bb48-61bc3bc10ae6", - "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/latency#improve-performance", - "service": "Azure OpenAI", + "guid": "3c763963-7a55-42d5-a15e-401955387e5c", + "link": "https://learn.microsoft.com/azure/container-registry/container-registry-geo-replication", + "service": "ACR", "services": [ + "ACR", "WAF" ], - "severity": "Medium", - "text": "Improve latency of the system by limiting token sizes, streaming options", - "waf": "Performance" + "severity": "High", + "text": "If using a private registry, configure region replication to store images in multiple regions", + "waf": "Reliability" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", + "arm-service": "microsoft.containerservice/managedClusters", "checklist": "WAF checklist", - "guid": "6e25d4d5-a3ae-4c2c-9e24-36b0336cb45e", - "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/latency#batching", - "service": "Azure OpenAI", + "guid": "f82cb8eb-8c0a-4a63-a25a-4956eaa8dc4a", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/aks/eslz-cost-governance-with-kubecost", + "service": "AKS", "services": [ - "Storage", - "ServiceBus", + "Cost", "WAF" ], - "severity": "Medium", - "text": "Estimate elasticity demands to determine synchronous and batch request segregation based on priority. For high priority, use synchronous approach and for low priority, asynchronous batch processing with queue is preferred", - "waf": "Performance" + "severity": "Low", + "text": "Use an external application such as kubecost to allocate costs to different users", + "waf": "Cost" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", + "arm-service": "microsoft.containerservice/managedClusters", "checklist": "WAF checklist", - "guid": "5bda4332-4f24-4811-9331-82ba51752694", - "link": "https://github.com/Azure/azure-openai-benchmark/", - "service": "Azure OpenAI", + "guid": "4d3dfbab-9924-4831-a68d-fdf0d72f462c", + "link": "https://learn.microsoft.com/azure/aks/scale-down-mode", + "service": "AKS", "services": [ "WAF" ], - "severity": "High", - "text": "Benchmark token consumption requirements based on estimated demands from consumers. Consider using the Azure OpenAI benchmarking tool to help you validate the throughput if you are using Provisioned Throughput Unit deployments", - "waf": "Performance" + "severity": "Low", + "text": "Use scale down mode to delete/deallocate nodes", + "waf": "Cost" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", + "arm-service": "microsoft.containerservice/managedClusters", "checklist": "WAF checklist", - "guid": "4008ae7d-7e47-4432-96d8-bdcf55bce619", - "link": "https://techcommunity.microsoft.com/t5/fasttrack-for-azure/optimizing-azure-openai-a-guide-to-limits-quotas-and-best/ba-p/4076268", - "service": "Azure OpenAI", + "guid": "87e651ea-bc4a-4a87-a6df-c06a4b570ebc", + "link": "https://learn.microsoft.com/azure/aks/gpu-multi-instance", + "service": "AKS", "services": [ + "AKS", "WAF" ], "severity": "Medium", - "text": "If you are using Provisioned Throughput Units (PTUs), consider deploying a token-per-minute (TPM) deployment for overflow requests. Use a gateway to route requests to the TPM deployment when the PTU limits are reached.", - "waf": "Performance" + "text": "When required use multi-instance partitioning GPU on AKS Clusters", + "waf": "Cost" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", + "arm-service": "microsoft.containerservice/managedClusters", "checklist": "WAF checklist", - "guid": "e8a13f98-8794-424d-9267-86d60b96c97b", - "link": "https://learn.microsoft.com/azure/ai-services/openai/concepts/models", - "service": "Azure OpenAI", + "guid": "2b72a08b-0410-4cd6-9093-e068a5cf27e8", + "link": "https://learn.microsoft.com/azure/aks/start-stop-nodepools", + "service": "AKS", "services": [ "WAF" ], - "severity": "High", - "text": "Choose the right model for the right task. Pick models with right tradeoff between speed, quality of response and output complexity", - "waf": "Performance" + "severity": "Low", + "text": "If running a Dev/Test cluster use NodePool Start/Stop", + "waf": "Cost" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", + "arm-service": "microsoft.containerservice/managedClusters", "checklist": "WAF checklist", - "guid": "e9951904-8384-45c9-a6cb-2912156a1147", - "link": "https://github.com/Azure/azure-openai-benchmark/", - "service": "Azure OpenAI", + "graph": "where type=='microsoft.containerservice/managedclusters' | extend compliant = (isnotnull(properties.addonProfiles.azurepolicy) and properties.addonProfiles.azurepolicy.enabled==true) | distinct id,compliant", + "guid": "9ca48e4a-85e2-4223-bce8-bb12307ca5f1", + "link": "https://learn.microsoft.com/azure/governance/policy/concepts/policy-for-kubernetes", + "service": "AKS", "services": [ - "WAF" + "AKS", + "WAF", + "AzurePolicy" ], "severity": "Medium", - "text": "Have a baseline for performance without fine-tuning for knowing whether or not fine-tuning has improved model performance", - "waf": "Performance" + "text": "Use Azure Policy for Kubernetes to ensure cluster compliance", + "waf": "Security" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", + "arm-service": "microsoft.containerservice/managedClusters", "checklist": "WAF checklist", - "guid": "5e39f541-accc-4d97-a376-bcdb3750ab2a", - "link": "https://learn.microsoft.com/azure/architecture/ai-ml/architecture/baseline-openai-e2e-chat#azure-openai---reliability", - "service": "Azure OpenAI", + "graph": "where type=='microsoft.containerservice/managedclusters' | project id,resourceGroup,name,pools=properties.agentPoolProfiles | project id,name,resourceGroup,poolcount=array_length(pools) | extend compliant = (poolcount > 1)", + "guid": "6f158e3e-a3a9-42c2-be7e-2165c3a87af4", + "link": "https://learn.microsoft.com/azure/aks/use-system-pools", + "service": "AKS", "services": [ - "ACR", "WAF" ], - "severity": "Low", - "text": "Deploy multiple OAI instances across regions", - "waf": "Reliability" + "severity": "Medium", + "text": "Separate applications from the control plane with user/system node pools", + "waf": "Security" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", + "arm-service": "microsoft.containerservice/managedClusters", "checklist": "WAF checklist", - "guid": "b039da6d-55d7-4c89-8adb-107d5325af62", - "link": "https://learn.microsoft.com/azure/architecture/ai-ml/architecture/baseline-openai-e2e-chat#azure-openai---reliability", - "service": "Azure OpenAI", + "guid": "a7a1f893-9bda-4477-98f2-4c116775c2ea", + "link": "https://learn.microsoft.com/azure/aks/use-system-pools", + "service": "AKS", "services": [ - "Entra", - "APIM", "WAF" ], - "severity": "High", - "text": "Implement retry & healthchecks with Gateway pattern like APIM", - "waf": "Reliability" + "severity": "Low", + "text": "Add taint to your system nodepool to make it dedicated", + "waf": "Security" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", + "arm-service": "microsoft.containerservice/managedClusters", "checklist": "WAF checklist", - "guid": "5ca44e46-85e2-4223-ace8-bb12308ca5f1", - "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/quota?tabs=rest#introduction-to-quota", - "service": "Azure OpenAI", + "guid": "55b46a94-8008-4ae7-b7e4-b475b6c8bdbf", + "link": "https://learn.microsoft.com/azure/container-registry/", + "service": "AKS", "services": [ + "ACR", "WAF" ], "severity": "Medium", - "text": "Ensure having adequate quotas of TPM & RPM for the workload", - "waf": "Reliability" + "text": "Use a private registry for your images, such as ACR", + "waf": "Security" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", + "arm-service": "microsoft.containerregistry/registries", "checklist": "WAF checklist", - "guid": "ec723923-7a15-42d6-ac5e-402925387e5c", - "link": "https://www.microsoft.com/research/project/guidelines-for-human-ai-interaction/", - "service": "Azure OpenAI", + "guid": "59bce65d-e8a0-43f9-9879-468d66a786d6", + "link": "https://learn.microsoft.com/azure/security-center/container-security", + "service": "ACR", "services": [ "WAF" ], "severity": "Medium", - "text": "Review the considerations in HAI toolkit guidance and apply those interaction practices for the slution", - "waf": "Operational Excellence" + "text": "Scan your images for vulnerabilities", + "waf": "Security" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", + "arm-service": "microsoft.containerservice/managedClusters", "checklist": "WAF checklist", - "guid": "7f154e3a-a369-4282-ae7e-316183687a04", - "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/business-continuity-disaster-recovery", - "service": "Azure OpenAI", + "guid": "d167dd18-2b0a-4c24-8b99-9a646f8389a7", + "link": "https://learn.microsoft.com/azure/aks/operator-best-practices-cluster-isolation", + "service": "AKS", "services": [ - "ACR", "WAF" ], - "severity": "Medium", - "text": "Deploy separate fine tuned models across regions if finetuning is employed", - "waf": "Reliability" + "severity": "High", + "text": "Define app separation requirements (namespace/nodepool/cluster)", + "waf": "Security" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", + "arm-service": "microsoft.containerservice/managedClusters", "checklist": "WAF checklist", - "guid": "77a1f893-5bda-4433-84f2-4811633182ba", - "link": "https://learn.microsoft.com/azure/backup/backup-overview", - "service": "Azure OpenAI", + "guid": "5e3df584-eccc-4d97-a3b6-bcda3b50eb2e", + "link": "https://github.com/Azure/secrets-store-csi-driver-provider-azure", + "service": "AKS", "services": [ - "Backup", - "ASR", - "WAF" + "WAF", + "AKV" ], "severity": "Medium", - "text": "Regularly backup and replicate critical data to ensure data availability and recoverability in case of data loss or system failures. Leverage Azure's backup and disaster recovery services to protect your data.", - "waf": "Reliability" + "text": "Store your secrets in Azure Key Vault with the CSI Secrets Store driver", + "waf": "Security" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", + "arm-service": "microsoft.containerservice/managedClusters", "checklist": "WAF checklist", - "guid": "95b96ad8-844c-4e3b-8b38-b876ba2cf204", - "link": "https://www.microsoft.com/licensing/docs/view/Service-Level-Agreements-SLA-for-Online-Services?lang=1", - "service": "Azure OpenAI", + "guid": "b03dda6d-58d7-4c89-8ddb-107d5769ae66", + "link": "https://learn.microsoft.com/azure/aks/update-credentials", + "service": "AKS", "services": [ "WAF" ], "severity": "High", - "text": "Azure AI search service tiers should be choosen to have a SLA ", - "waf": "Reliability" + "text": "If using Service Principals for the cluster, refresh credentials periodically (like quarterly)", + "waf": "Security" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", + "arm-service": "microsoft.containerservice/managedClusters", "checklist": "WAF checklist", - "guid": "99013a5d-3ce4-474d-acbd-8682a6abca2a", - "link": "https://learn.microsoft.com/purview/purview", - "service": "Azure OpenAI", + "guid": "e7ba73a3-0508-4f80-806f-527db30cee96", + "link": "https://learn.microsoft.com/azure/aks/use-kms-etcd-encryption", + "service": "AKS", "services": [ "WAF" ], - "severity": "Low", - "text": "Classify data and sensitivity, labeling with Microsoft Purview before generating the embeddings and make sure to treat the embeddings generated with same sensitivity and classification", + "severity": "Medium", + "text": "If required add Key Management Service etcd encryption", "waf": "Security" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", + "arm-service": "microsoft.containerservice/managedClusters", "checklist": "WAF checklist", - "guid": "4fda1dbf-3dd9-45d4-ac7c-891dca1f6d56", - "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/use-your-data-securely", - "service": "Azure OpenAI", + "guid": "ec8e4e42-0344-41b0-b865-9123e8956d31", + "link": "https://learn.microsoft.com/azure/confidential-computing/confidential-nodes-aks-overview", + "service": "AKS", "services": [ + "AKS", "WAF" ], - "severity": "High", - "text": "Encrypt data used for RAG with SSE/Disk encryption with optional BYOK", + "severity": "Low", + "text": "If required consider using Confidential Compute for AKS", "waf": "Security" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", + "arm-service": "microsoft.containerservice/managedClusters", "checklist": "WAF checklist", - "guid": "59ae558b-937d-4498-9e11-12dbd7ba012f", - "link": "https://learn.microsoft.com/azure/search/search-security-overview", - "service": "Azure OpenAI", + "guid": "c9e95ffe-6dd1-4a17-8c5f-110389ca9b21", + "link": "https://learn.microsoft.com/azure/defender-for-cloud/defender-for-containers-enable", + "service": "AKS", "services": [ - "ACR", + "Defender", "WAF" ], - "severity": "High", - "text": "Ensure TLS is enforced for data in transit across data sources, AI search used for Retrieval-Augmented Generation (RAG) and LLM communication", + "severity": "Medium", + "text": "Consider using Defender for Containers", "waf": "Security" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", + "arm-service": "microsoft.containerservice/managedClusters", "checklist": "WAF checklist", - "guid": "7b94ef6e-047d-42ea-8992-b1cd6e2054b2", - "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/role-based-access-control", - "service": "Azure OpenAI", + "graph": "where type=='microsoft.containerservice/managedclusters' | extend compliant = (properties.servicePrincipalProfile.clientId=='msi') | distinct id,compliant", + "guid": "ed127dd1-42b0-46b2-8c69-99a646f3389a", + "link": "https://learn.microsoft.com/azure/aks/use-managed-identity", + "service": "AKS", "services": [ - "RBAC", + "Entra", "WAF" ], "severity": "High", - "text": "Use RBAC to manage access to Azure OpenAI services. Assign appropriate permissions to users and restrict access based on their roles and responsibilities", + "text": "Use managed identities instead of Service Principals", "waf": "Security" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", + "arm-service": "microsoft.containerservice/managedClusters", "checklist": "WAF checklist", - "guid": "9769e4a6-91e8-4838-ac93-6667e13c0056", - "link": "https://learn.microsoft.com/azure/security/fundamentals/data-encryption-best-practices", - "service": "Azure OpenAI", + "graph": "where type=='microsoft.containerservice/managedclusters' | extend compliant = isnotnull(properties.aadProfile) | distinct id,compliant", + "guid": "7e42c78e-78c0-46a6-8a21-94956e698dc4", + "link": "https://learn.microsoft.com/azure/aks/managed-aad", + "service": "AKS", "services": [ + "Entra", "WAF" ], "severity": "Medium", - "text": "Implement data encryption, masking or redaction techniques to hide sensitive data or replace it with obfuscated values in non-production environments or when sharing data for testing or troubleshooting purposes", + "text": "Integrate authentication with AAD (using the managed integration)", "waf": "Security" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", + "arm-service": "microsoft.containerservice/managedClusters", "checklist": "WAF checklist", - "guid": "74b1e945-b459-4837-be7a-d6c6d3b375a5", - "link": "https://learn.microsoft.com/azure/defender-for-cloud/defender-for-cloud-introduction", - "service": "Azure OpenAI", + "guid": "a2fe27b2-e287-401a-8352-beedf79b488d", + "link": "https://learn.microsoft.com/azure/aks/control-kubeconfig-access", + "service": "AKS", "services": [ - "Sentinel", - "Monitor", - "Defender", "WAF" ], - "severity": "High", - "text": "Utilize Azure Defender to detect and respond to security threats and set up monitoring and alerting mechanisms to identify suspicious activities or breaches. Leverage Azure Sentinel for advanced threat detection and response", + "severity": "Medium", + "text": "Limit access to admin kubeconfig (get-credentials --admin)", "waf": "Security" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", + "arm-service": "microsoft.containerservice/managedClusters", "checklist": "WAF checklist", - "guid": "c7acbe48-abe5-44cd-99f2-e87768468c55", - "link": "https://techcommunity.microsoft.com/t5/azure-storage-blog/managing-long-term-log-retention-or-any-business-data/ba-p/2494791", - "service": "Azure OpenAI", + "guid": "eec4962c-c3bd-421b-b77f-26e5e6b3bec3", + "link": "https://learn.microsoft.com/azure/aks/manage-azure-rbac", + "service": "AKS", "services": [ - "AzurePolicy", + "Entra", + "RBAC", "WAF" ], "severity": "Medium", - "text": "Establish data retention and disposal policies to adhere to compliance regulations. Implement secure deletion methods for data that is no longer required and maintain an audit trail of data retention and disposal activities", + "text": "Integrate authorization with AAD RBAC", "waf": "Security" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "WAF checklist", - "guid": "a9c27d9c-42bb-46bd-8c69-99a246f3389a", - "link": "https://learn.microsoft.com/azure/ai-services/content-safety/concepts/jailbreak-detection", - "service": "Azure OpenAI", - "services": [ - "WAF" - ], - "severity": "High", - "text": "Implement Prompt shields and groundedness detection using Content Safety ", - "waf": "Operational Excellence" - }, - { - "arm-service": "Microsoft.CognitiveServices/accounts", + "arm-service": "microsoft.containerservice/managedClusters", "checklist": "WAF checklist", - "guid": "a775c6ee-95b9-46ad-a844-ce3b2b38b876", - "link": "https://learn.microsoft.com/azure/compliance/", - "service": "Azure OpenAI", + "guid": "d4f3537c-1346-4dc5-9027-a71ffe1bd05d", + "link": "https://learn.microsoft.com/azure/aks/operator-best-practices-identity", + "service": "AKS", "services": [ + "RBAC", + "AKS", "WAF" ], "severity": "High", - "text": "Ensure compliance with relevant data protection regulations, such as GDPR or HIPAA, by implementing privacy controls and obtaining necessary consents or permissions for data processing activities.", + "text": "Use namespaces for restricting RBAC privilege in Kubernetes", "waf": "Security" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", + "arm-service": "microsoft.containerservice/managedClusters", "checklist": "WAF checklist", - "guid": "ba2cf204-9901-43a5-b3ce-474dccbd8682", - "service": "Azure OpenAI", + "guid": "d2e0d5d7-71d4-41e3-910c-c57b4a4b1410", + "link": "https://learn.microsoft.com/azure/aks/workload-identity-migration-sidecar", + "service": "AKS", "services": [ + "Entra", "WAF" ], "severity": "Medium", - "text": "Educate your employees about data security best practices, the importance of handling data securely, and potential risks associated with data breaches. Encourage them to follow data security protocols diligently.", + "text": "For Pod Identity Access Management use Azure AD Workload Identity (preview)", "waf": "Security" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", + "arm-service": "microsoft.containerservice/managedClusters", "checklist": "WAF checklist", - "guid": "eae01e6e-842e-452f-9721-d928c1b1cd52", - "service": "Azure OpenAI", + "guid": "f4dcf690-1b30-407d-abab-6f8aa780d3a3", + "link": "https://learn.microsoft.com/azure/aks/managed-aad#non-interactive-sign-in-with-kubelogin", + "service": "AKS", "services": [ + "AKS", "WAF" ], - "severity": "High", - "text": "Keep production data separate from development and testing data. Only use real sensitive data in production and utilize anonymized or synthetic data in development and test environments.", + "severity": "Medium", + "text": "For AKS non-interactive logins use kubelogin (preview)", "waf": "Security" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", + "arm-service": "microsoft.containerservice/managedClusters", "checklist": "WAF checklist", - "guid": "1e54a29a-9de3-499c-bd7b-28dc93555620", - "service": "Azure OpenAI", + "graph": "where type=='microsoft.containerservice/managedclusters' | extend compliant = (properties.disableLocalAccounts==true) | distinct id,compliant", + "guid": "b085b1f2-3119-4771-8c9a-bbf4411810ec", + "link": "https://learn.microsoft.com/azure/aks/managed-aad#disable-local-accounts", + "service": "AKS", "services": [ + "AKS", "WAF" ], "severity": "Medium", - "text": "If you have varying levels of data sensitivity, consider creating separate indexes for each level. For instance, you could have one index for general data and another for sensitive data, each governed by different access protocols", + "text": "Disable AKS local accounts", "waf": "Security" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", + "arm-service": "microsoft.containerservice/managedClusters", "checklist": "WAF checklist", - "guid": "2bfe4564-b0d8-434a-948b-263e6dd60512", - "service": "Azure OpenAI", + "guid": "36abb0db-c118-4f4c-9880-3f30f9a2deb6", + "link": "https://learn.microsoft.com/azure/aks/managed-aad#configure-just-in-time-cluster-access-with-azure-ad-and-aks", + "service": "AKS", "services": [ - "RBAC", - "AzurePolicy", "WAF" ], - "severity": "Medium", - "text": "Take segregation a step further by placing sensitive datasets in different instances of the service. Each instance can be controlled with its own specific set of RBAC policies", + "severity": "Low", + "text": "Configure if required Just-in-time cluster access", "waf": "Security" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", + "arm-service": "microsoft.containerservice/managedClusters", "checklist": "WAF checklist", - "guid": "a36498f6-dbad-438e-ad53-cc7ce1d7aaab", - "service": "Azure OpenAI", + "guid": "c4d7f4c6-79bf-45d0-aa05-ce8fc717e150", + "link": "https://learn.microsoft.com/azure/aks/managed-aad#use-conditional-access-with-azure-ad-and-aks", + "service": "AKS", "services": [ + "Entra", + "AKS", "WAF" ], - "severity": "High", - "text": "Recognize that embeddings and vectors generated from sensitive information are themselves sensitive. This data should be afforded the same protective measures as the source material", + "severity": "Low", + "text": "Configure if required AAD conditional access for AKS", "waf": "Security" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", + "arm-service": "microsoft.containerservice/managedClusters", "checklist": "WAF checklist", - "guid": "3571449a-b805-43d8-af89-dc7b33be2a1a", - "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/role-based-access-control", - "service": "Azure OpenAI", + "guid": "e1123a7c-a333-4eb4-a120-4ee3f293c9f3", + "link": "https://learn.microsoft.com/azure/aks/use-group-managed-service-accounts", + "service": "AKS", "services": [ - "RBAC", + "AKS", "WAF" ], - "severity": "High", - "text": "Apply RBAC to th data stores having embeddings and vectors and scope access based on role's access requirements", + "severity": "Low", + "text": "If required for Windows AKS workloads configure gMSA ", "waf": "Security" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", + "arm-service": "microsoft.containerservice/managedClusters", "checklist": "WAF checklist", - "guid": "27f7b9e9-1be1-4f38-aef3-9812bd463cbb", - "link": "https://techcommunity.microsoft.com/t5/azure-architecture-blog/azure-openai-private-endpoints-connecting-across-vnet-s/ba-p/3913325", - "service": "Azure OpenAI", + "guid": "1f711a74-3672-470b-b8b8-a2148d640d79", + "link": "https://learn.microsoft.com/azure/aks/use-managed-identity#use-a-pre-created-kubelet-managed-identity", + "service": "AKS", "services": [ - "PrivateLink", + "Entra", "WAF" ], - "severity": "High", - "text": "Configure private endpoint for AI services to restrict service access within your network", + "severity": "Medium", + "text": "For finer control consider using a managed Kubelet Identity", "waf": "Security" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", + "arm-service": "microsoft.containerservice/managedClusters", "checklist": "WAF checklist", - "guid": "ac8ac199-ebb9-41a3-9d90-cae2cc881370", - "service": "Azure OpenAI", + "guid": "cbd8ac2a-aebc-4a2a-94da-1dbf3dc99248", + "link": "https://azure.github.io/application-gateway-kubernetes-ingress/setup/install-existing/", + "service": "AKS", "services": [ - "VNet", - "Firewall", + "ACR", + "AppGW", "WAF" ], - "severity": "High", - "text": "Enforce strict inbound and outbound traffic control with Azure Firewall and UDRs and limit the external integration points", - "waf": "Security" + "severity": "Medium", + "text": "If using AGIC, do not share an AppGW across clusters", + "waf": "Reliability" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", + "arm-service": "microsoft.containerservice/managedClusters", "checklist": "WAF checklist", - "guid": "6f7c0cba-fe51-4464-add4-57e927138b82", - "service": "Azure OpenAI", + "graph": "where type=='microsoft.containerservice/managedclusters' | extend compliant = (isnull(properties.addonProfiles.httpApplicationRouting) or properties.addonProfiles.httpApplicationRouting.enabled==false) | distinct id,compliant", + "guid": "8008ae7d-7e4b-4475-a6c8-bdbf59bce65d", + "link": "https://learn.microsoft.com/azure/aks/http-application-routing", + "service": "AKS", "services": [ + "AKS", "WAF" ], "severity": "High", - "text": "Implement network segmentation and access controls to restrict access to the LLM application only to authorized users and systems and prevent lateral movement", - "waf": "Security" + "text": "Do not use AKS HTTP Routing Add-On, use instead the managed NGINX ingress with the application routing add-on.", + "waf": "Reliability" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", + "arm-service": "microsoft.containerservice/managedClusters", "checklist": "WAF checklist", - "guid": "7f42c78e-78cb-46a2-8ad1-90916e6a8d8f", - "link": "https://www.microsoft.com/research/blog/llmlingua-innovating-llm-efficiency-with-prompt-compression/", - "service": "Azure OpenAI", + "guid": "7bacd7b9-c025-4a9d-a5d2-25d6bc5439d9", + "link": "https://learn.microsoft.com/azure/virtual-network/accelerated-networking-overview", + "service": "AKS", "services": [ "WAF" ], "severity": "Medium", - "text": "Use prompt compression tools like LLMLingua or gprtrim", - "waf": "Cost Optimization" + "text": "For Windows workloads use Accelerated Networking", + "waf": "Performance" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", + "arm-service": "microsoft.containerservice/managedClusters", "checklist": "WAF checklist", - "guid": "1102cac6-eae0-41e6-b842-e52f4721d928", - "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/managed-identity", - "service": "Azure OpenAI", + "graph": "where type=='microsoft.containerservice/managedclusters' | extend compliant = (tolower(properties.networkProfile.loadBalancerSku)=='standard') | distinct id,compliant", + "guid": "ba7da7be-9952-4914-a384-5d997cb39132", + "link": "https://learn.microsoft.com/azure/aks/load-balancer-standard", + "service": "AKS", "services": [ - "Entra", - "AKV", - "WAF" + "WAF", + "LoadBalancer" ], "severity": "High", - "text": "Ensure that APIs and endpoints used by the LLM application are properly secured with authentication and authorization mechanisms, such as Managed identities, API keys or OAuth, to prevent unauthorized access.", - "waf": "Security" + "text": "Use the standard ALB (as opposed to the basic one)", + "waf": "Reliability" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", + "arm-service": "microsoft.containerservice/managedClusters", "checklist": "WAF checklist", - "guid": "c1b1cd52-1e54-4a29-a9de-399cfd7b28dc", - "link": "https://techcommunity.microsoft.com/t5/azure-architecture-blog/security-best-practices-for-genai-applications-openai-in-azure/ba-p/4027885", - "service": "Azure OpenAI", + "guid": "22fbe8d6-9b40-47ef-9011-25bb1a555a6b", + "link": "https://learn.microsoft.com/azure/aks/use-multiple-node-pools#add-a-node-pool-with-a-unique-subnet", + "service": "AKS", "services": [ + "VNet", "WAF" ], "severity": "Medium", - "text": "Enforce strong end user authentication mechanisms, such as multi-factor authentication, to prevent unauthorized access to the LLM application and associated network resources", + "text": "If using Azure CNI, consider using different Subnets for NodePools", "waf": "Security" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", + "arm-service": "microsoft.containerservice/managedClusters", "checklist": "WAF checklist", - "guid": "93555620-2bfe-4456-9b0d-834a348b263e", - "service": "Azure OpenAI", + "guid": "c3c39c98-6bb2-4c12-859a-114b5e3df584", + "link": "https://learn.microsoft.com/azure/private-link/private-link-overview", + "service": "AKS", "services": [ - "Monitor", - "WAF" + "VNet", + "WAF", + "PrivateLink" ], "severity": "Medium", - "text": "Implement network monitoring tools to detect and analyze network traffic for any suspicious or malicious activities. Enable logging to capture network events and facilitate forensic analysis in case of security incidents", + "text": "Use Private Endpoints (preferred) or Virtual Network Service Endpoints to access PaaS services from the cluster", "waf": "Security" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", + "arm-service": "microsoft.containerservice/managedClusters", "checklist": "WAF checklist", - "guid": "6dd60512-a364-498f-9dba-d38ead53cc7c", - "service": "Azure OpenAI", + "graph": "where type=='microsoft.containerservice/managedclusters' | extend compliant = (properties.networkProfile.networkPlugin=='azure') | distinct id,compliant", + "guid": "a0f61565-9de5-458f-a372-49c831112dbd", + "link": "https://learn.microsoft.com/azure/aks/operator-best-practices-network", + "service": "AKS", "services": [ "WAF" ], - "severity": "Medium", - "text": "Conduct security audits and penetration testing to identify and address any network security weaknesses or vulnerabilities in the LLM application's network infrastructure", - "waf": "Security" + "severity": "High", + "text": "Choose the best CNI network plugin for your requirements (Azure CNI recommended)", + "waf": "Reliability" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", + "arm-service": "microsoft.containerservice/managedClusters", "checklist": "WAF checklist", - "guid": "e1d7aaab-3571-4449-ab80-53d89f89dc7b", - "link": "https://learn.microsoft.com/azure/azure-resource-manager/management/tag-resources?tabs=json", - "service": "Azure OpenAI", + "guid": "7faf12e7-0943-4f63-8472-2da29c2b1cd6", + "link": "https://learn.microsoft.com/azure/aks/configure-azure-cni", + "service": "AKS", "services": [ + "VNet", "WAF" ], - "severity": "Low", - "text": "Azure AI Services are properly tagged for better management", - "waf": "Operational Excellence" + "severity": "High", + "text": "If using Azure CNI, size your subnet accordingly considering the maximum number of pods per node", + "waf": "Performance" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", + "arm-service": "microsoft.containerservice/managedClusters", "checklist": "WAF checklist", - "guid": "77036e5e-6b4b-4ed3-b503-547c1347dc56", - "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/ready/azure-best-practices/resource-abbreviations", - "service": "Azure OpenAI", + "guid": "22f54b29-bade-43aa-b1e8-c38ec9366673", + "link": "https://learn.microsoft.com/azure/aks/configure-azure-cni", + "service": "AKS", "services": [ "WAF" ], - "severity": "Low", - "text": "Azure AI Service accounts follows organizational naming conventions", - "waf": "Operational Excellence" + "severity": "High", + "text": "If using Azure CNI, check the maximum pods/node (default 30)", + "waf": "Performance" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", + "arm-service": "microsoft.containerservice/managedClusters", "checklist": "WAF checklist", - "guid": "028a71ff-e1ce-415d-b3f0-d5e772d41e36", - "link": "https://learn.microsoft.com/azure/ai-services/diagnostic-logging", - "service": "Azure OpenAI", + "description": "For internal apps organizations often open the whole AKS subnet in their firewalls. This opens network access to the nodes too, and potentially to the pods as well (if using Azure CNI). If LoadBalancer IPs are in a different subnet, only this one needs to be available to the app clients. Another reason is that if the IP addresses in the AKS subnet are a scarce resource, consuming its IP addresses for services will reduce the maximum scalability of the cluster .", + "guid": "13c00567-4b1e-4945-a459-c373e7ed6162", + "link": "https://learn.microsoft.com/azure/aks/internal-lb", + "service": "AKS", "services": [ + "VNet", + "AKS", "WAF" ], - "severity": "High", - "text": "Diagnostic logs in Azure AI services resources should be enabled", - "waf": "Operational Excellence" + "severity": "Low", + "text": "If using private-IP LoadBalancer services, use a dedicated subnet (not the AKS subnet)", + "waf": "Security" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", + "arm-service": "microsoft.containerservice/managedClusters", "checklist": "WAF checklist", - "guid": "11cc57b4-a4b1-4410-b439-58a8c2289b3d", - "link": "https://learn.microsoft.com/azure/ai-services/authentication", - "service": "Azure OpenAI", + "guid": "43f63047-22d9-429c-8b1c-d622f54b29ba", + "link": "https://learn.microsoft.com/azure/aks/configure-azure-cni", + "service": "AKS", "services": [ - "Entra", "WAF" ], "severity": "High", - "text": "Key access (local authentication) is recommended to be disabled for security. After disabling key based access, Microsoft Entra ID becomes the only access method, which allows maintaining minimum privilege principle and granular control. ", - "waf": "Security" + "text": "Size the service IP address range accordingly (it is going to limit the cluster scalability)", + "waf": "Reliability" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", + "arm-service": "microsoft.containerservice/managedClusters", "checklist": "WAF checklist", - "guid": "6b57cfc6-5546-41e1-a3e3-453a3c863964", - "link": "https://learn.microsoft.com/azure/key-vault/general/best-practices", - "service": "Azure OpenAI", + "guid": "57bf217f-6dc8-481c-81e2-785773e9c00f", + "link": "https://learn.microsoft.com/azure/aks/use-byo-cni", + "service": "AKS", "services": [ - "Entra", - "AKV", "WAF" ], - "severity": "High", - "text": "Store and manage keys securely using Azure Key Vault. Avoid hard-coding or embedding sensitive keys within your LLM application's code and retrieve them securely from Azure Key Vault using managed identities", + "severity": "Low", + "text": "If required add your own CNI plugin", "waf": "Security" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", + "arm-service": "microsoft.containerservice/managedClusters", "checklist": "WAF checklist", - "guid": "8b652d6c-15f5-4129-9539-8e6ded227dd1", - "link": "https://learn.microsoft.com/azure/key-vault/general/best-practices", - "service": "Azure OpenAI", + "guid": "4b3bb365-9458-44d9-9ed1-5c8f52890364", + "link": "https://learn.microsoft.com/azure/aks/use-multiple-node-pools#assign-a-public-ip-per-node-for-your-node-pools", + "service": "AKS", "services": [ - "AKV", + "AKS", "WAF" ], - "severity": "High", - "text": "Regularly rotate and expire keys stored in Azure Key Vault to minimize the risk of unauthorized access.", - "waf": "Security" + "severity": "Low", + "text": "If required configure Public IP per node in AKS", + "waf": "Performance" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", + "arm-service": "microsoft.containerservice/managedClusters", "checklist": "WAF checklist", - "guid": "adfe27be-e297-401a-a352-baaab79b088d", - "link": "https://github.com/openai/tiktoken", - "service": "Azure OpenAI", + "guid": "b3808b9f-a1cf-4204-ad01-3a923ce474db", + "link": "https://learn.microsoft.com/azure/aks/concepts-network", + "service": "AKS", "services": [ "WAF" ], - "severity": "High", - "text": "Use tiktoken to understand token sizes for token optimizations in conversational mode", - "waf": "Cost Optimization" + "severity": "Medium", + "text": "Use an ingress controller to expose web-based apps instead of exposing them with LoadBalancer-type services", + "waf": "Reliability" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", + "arm-service": "microsoft.containerservice/managedClusters", "checklist": "WAF checklist", - "guid": "42b06c21-d799-49a6-96f4-389a7f42c78e", - "link": "https://learn.microsoft.com/azure/security/develop/secure-dev-overview", - "service": "Azure OpenAI", + "guid": "ccb534e7-416e-4a1d-8e93-533b53199085", + "link": "https://learn.microsoft.com/azure/aks/nat-gateway", + "service": "AKS", "services": [ "WAF" ], - "severity": "High", - "text": "Follow secure coding practices to prevent common vulnerabilities such as injection attacks, cross-site scripting (XSS), or security misconfigurations", - "waf": "Security" + "severity": "Low", + "text": "Use Azure NAT Gateway as outboundType for scaling egress traffic", + "waf": "Reliability" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", + "arm-service": "microsoft.containerservice/managedClusters", "checklist": "WAF checklist", - "guid": "78c06a73-a22a-4495-9e6a-8dc4a20e27c3", - "link": "https://learn.microsoft.com/azure/devops/repos/security/github-advanced-security-dependency-scanning?view=azure-devops", - "service": "Azure OpenAI", + "guid": "8ee9a69a-1b58-4b1e-9c61-476e110a160b", + "link": "https://learn.microsoft.com/azure/aks/configure-azure-cni#dynamic-allocation-of-ips-and-enhanced-subnet-support", + "service": "AKS", "services": [ "WAF" ], - "severity": "High", - "text": "Setup a process to regularly update and patch the LLM libraries and other system components", - "waf": "Security" + "severity": "Medium", + "text": "Use Dynamic allocations of IPs in order to avoid Azure CNI IP exhaustion", + "waf": "Reliability" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", + "arm-service": "microsoft.containerservice/managedClusters", "checklist": "WAF checklist", - "guid": "e29711b1-352b-4eee-879b-588defc4972c", - "link": "https://learn.microsoft.com/legal/cognitive-services/openai/code-of-conduct", - "service": "Azure OpenAI", + "graph": "where type=='microsoft.containerservice/managedclusters' | extend compliant = (properties.networkProfile.outboundType=='userDefinedRouting') | distinct id,compliant", + "guid": "3b365a91-7ecb-4e48-bbe5-4cd7df2e8bba", + "link": "https://learn.microsoft.com/azure/aks/limit-egress-traffic", + "service": "AKS", "services": [ - "AzurePolicy", + "NVA", "WAF" ], "severity": "High", - "text": "Adhere to Azure OpenAI or other LLMs terms of use, policies and guidance and allowed use cases", - "waf": "Operational Excellence" + "text": "Filter egress traffic with AzFW/NVA if your security requirements mandate it", + "waf": "Security" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", + "arm-service": "microsoft.containerservice/managedClusters", "checklist": "WAF checklist", - "guid": "d3cd21bf-7703-46e5-b6b4-bed3d503547c", - "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/manage-costs#base-series-and-codex-series-fine-tuned-models", - "service": "Azure OpenAI", + "graph": "where type=='microsoft.containerservice/managedclusters' | extend compliant = ((isnull(properties.apiServerAccessProfile.enablePrivateCluster) or properties.apiServerAccessProfile.enablePrivateCluster==false) and isnotnull(properties.apiServerAccessProfile.authorizedIPRanges)) | distinct id,compliant", + "guid": "c4581559-bb91-463e-a908-aed8c44ce3b2", + "link": "https://learn.microsoft.com/azure/aks/api-server-authorized-ip-ranges", + "service": "AKS", "services": [ - "Cost", "WAF" ], "severity": "Medium", - "text": "Understand difference in cost of base models and fine tuned models and token step sizes", - "waf": "Cost Optimization" + "text": "If using a public API endpoint, restrict the IP addresses that can access it", + "waf": "Security" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", + "arm-service": "microsoft.containerservice/managedClusters", "checklist": "WAF checklist", - "guid": "1347dc56-028a-471f-be1c-e15dd3f0d5e7", - "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/latency#batching", - "service": "Azure OpenAI", + "graph": "where type=='microsoft.containerservice/managedclusters' | where isnotnull(properties.apiServerAccessProfile.enablePrivateCluster) | extend compliant = (properties.apiServerAccessProfile.enablePrivateCluster==true) | distinct id, compliant", + "guid": "ecccd979-3b6b-4cda-9b50-eb2eb03dda6d", + "link": "https://learn.microsoft.com/azure/aks/private-clusters", + "service": "AKS", "services": [ - "Cost", "WAF" ], "severity": "High", - "text": "Batch requests, where possible, to minimize the per-call overhead which can reduce overall costs. Ensure you optimize batch size", - "waf": "Cost Optimization" + "text": "Use private clusters if your requirements mandate it", + "waf": "Security" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", + "arm-service": "microsoft.containerservice/managedClusters", "checklist": "WAF checklist", - "guid": "72d41e36-11cc-457b-9a4b-1410d43958a8", - "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/manage-costs", - "service": "Azure OpenAI", + "graph": "where type=='microsoft.containerservice/managedclusters' | where isnotnull(properties.apiServerAccessProfile.enablePrivateCluster) | extend compliant = (properties.apiServerAccessProfile.enablePrivateCluster==true) | distinct id, compliant", + "guid": "ce7f2a7c-297c-47c6-adea-a6ff838db665", + "link": "https://learn.microsoft.com/azure/aks/use-network-policies", + "service": "AKS", "services": [ - "Monitor", - "Cost", - "WAF" + "AKS", + "WAF", + "AzurePolicy" ], "severity": "Medium", - "text": "Set up a cost tracking system that monitors model usage and use that information to help inform model choices and prompt sizes", - "waf": "Cost Optimization" + "text": "For Windows 2019 and 2022 AKS nodes Calico Network Policies can be used ", + "waf": "Security" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", + "arm-service": "microsoft.containerservice/managedClusters", "checklist": "WAF checklist", - "guid": "166cd072-af9b-4141-a898-a535e737897e", - "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/quota?tabs=rest#understanding-rate-limits", - "service": "Azure OpenAI", + "graph": "where type=='microsoft.containerservice/managedclusters' | extend compliant = isnotnull(properties.networkProfile.networkPolicy) | distinct id,compliant", + "guid": "58d7c892-ddb1-407d-9769-ae669ca48e4a", + "link": "https://learn.microsoft.com/azure/aks/use-network-policies", + "service": "AKS", "services": [ - "WAF" + "AKS", + "WAF", + "AzurePolicy" ], - "severity": "Medium", - "text": "Set a maximum limit on the number of tokens per model response. Optimize the size to ensure it is large enough for a valid response", - "waf": "Cost Optimization" + "severity": "High", + "text": "Enable a Kubernetes Network Policy option (Calico/Azure)", + "waf": "Security" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", + "arm-service": "microsoft.containerservice/managedClusters", "checklist": "WAF checklist", - "guid": "71ca7da8-cfa9-462a-8594-946da97dc3a2", - "link": "https://learn.microsoft.com/azure/search/search-reliability", - "service": "Azure OpenAI", + "guid": "85e2223e-ce8b-4b12-907c-a5f16f158e3e", + "link": "https://learn.microsoft.com/azure/aks/operator-best-practices-network", + "service": "AKS", "services": [ - "WAF" + "AKS", + "WAF", + "AzurePolicy" ], - "severity": "Medium", - "text": "Review the guidance provided on setting up AI search for Reliability", - "waf": "Operational Excellence" + "severity": "High", + "text": "Use Kubernetes network policies to increase intra-cluster security", + "waf": "Security" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", + "arm-service": "microsoft.containerservice/managedClusters", "checklist": "WAF checklist", - "guid": "3266b225-86f4-4a16-92bd-ddea8a487cde", - "link": "https://learn.microsoft.com/azure/search/vector-search-index-size?tabs=portal-vector-quota", - "service": "Azure OpenAI", + "guid": "a3a92c2d-e7e2-4165-a3a8-7af4a7a1f893", + "link": "https://learn.microsoft.com/azure/aks/operator-best-practices-network", + "service": "AKS", "services": [ - "Storage", "WAF" ], - "severity": "Medium", - "text": "Plan and manage AI Search Vector storage", - "waf": "Operational Excellence" + "severity": "High", + "text": "Use a WAF for web workloads (UIs or APIs)", + "waf": "Security" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", + "arm-service": "microsoft.containerservice/managedClusters", "checklist": "WAF checklist", - "guid": "b4861bc3-bc14-4aeb-9e66-e8d9a3aec218", - "link": "https://learn.microsoft.com/azure/machine-learning/prompt-flow/how-to-end-to-end-llmops-with-prompt-flow?view=azureml-api-2", - "service": "Azure OpenAI", + "graph": "Resources | where type=~'microsoft.containerservice/managedclusters' | project resourceGroup,name,pools=properties.agentPoolProfiles | mv-expand pools | project subnetId=tostring(pools.vnetSubnetID) | where isnotempty(subnetId) | join (Resources | where type=='microsoft.network/virtualnetworks' | project id,resourceGroup,name,enableDdosProtection=tostring(properties.enableDdosProtection),subnets=properties.subnets | mv-expand subnets | project id,resourceGroup,name,enableDdosProtection,subnetId=tostring(subnets.id)) on subnetId | distinct id,resourceGroup,name,enableDdosProtection | extend compliant = (enableDdosProtection == 'true')", + "guid": "9bda4776-8f24-4c11-9775-c2ea55b46a94", + "link": "https://learn.microsoft.com/azure/virtual-network/ddos-protection-overview", + "service": "AKS", "services": [ - "WAF" + "VNet", + "AKS", + "WAF", + "DDoS" ], "severity": "Medium", - "text": "Apply LLMOps practices to automate the lifecycle management of your GenAI applications", - "waf": "Operational Excellence" + "text": "Use DDoS Standard in the AKS Virtual Network", + "waf": "Security" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", + "arm-service": "microsoft.containerservice/managedClusters", "checklist": "WAF checklist", - "guid": "aa80932c-8ec9-4d1b-a770-26e5e6beba9e", - "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/provisioned-throughput-onboarding#understanding-the-provisioned-throughput-purchase-model", - "service": "Azure OpenAI", + "graph": "Resources | where type=~'microsoft.containerservice/managedclusters' | project resourceGroup,name,pools=properties.agentPoolProfiles | mv-expand pools | project subnetId=tostring(pools.vnetSubnetID) | where isnotempty(subnetId) | join (Resources | where type=='microsoft.network/virtualnetworks' | project id,resourceGroup,name,enableDdosProtection=tostring(properties.enableDdosProtection),subnets=properties.subnets | mv-expand subnets | project id,resourceGroup,name,enableDdosProtection,subnetId=tostring(subnets.id)) on subnetId | distinct id,resourceGroup,name,enableDdosProtection | extend compliant = (enableDdosProtection == 'true')", + "guid": "6c46b91a-1107-4485-ad66-3183e2a8c266", + "link": "https://learn.microsoft.com/azure/aks/http-proxy", + "service": "AKS", "services": [ "WAF" ], - "severity": "High", - "text": "Evaluate usage of billing models - PAYG vs PTU", - "waf": "Cost Optimization" + "severity": "Low", + "text": "If required add company HTTP Proxy", + "waf": "Security" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", + "arm-service": "microsoft.containerservice/managedClusters", "checklist": "WAF checklist", - "guid": "e6436b07-36db-455f-9796-03334bdf9cc2", - "link": "https://techcommunity.microsoft.com/t5/ai-azure-ai-services-blog/how-to-control-azure-openai-models/ba-p/4146793", - "service": "Azure OpenAI", + "guid": "e9855d04-c3c3-49c9-a6bb-2c12159a114b", + "link": "https://learn.microsoft.com/azure/aks/servicemesh-about", + "service": "AKS", "services": [ "WAF" ], "severity": "Medium", - "text": "Evaluate the quality of prompts and applications when switching between model versions", - "waf": "Operational Excellence" + "text": "Consider using a service mesh for advanced microservice communication management", + "waf": "Security" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", + "arm-service": "microsoft.containerservice/managedClusters", "checklist": "WAF checklist", - "guid": "3418db61-2712-4650-9bb4-7a393a080327", - "link": "https://learn.microsoft.com/azure/machine-learning/prompt-flow/concept-model-monitoring-generative-ai-evaluation-metrics?view=azureml-api-2", - "service": "Azure OpenAI", + "guid": "67f7a9ed-5b31-4f38-a3f3-9812b2463cff", + "link": "https://learn.microsoft.com/azure/azure-monitor/insights/container-insights-metric-alerts", + "service": "AKS", "services": [ "Monitor", "WAF" ], - "severity": "Medium", - "text": "Evaluate, monitor and refine your GenAI apps for features like groundedness, relevance, accuracy, coherence, fluency, �", - "waf": "Operational Excellence" + "severity": "High", + "text": "Configure alerts on the most critical metrics (see Container Insights for recommendations)", + "waf": "Operations" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", + "arm-service": "microsoft.containerservice/managedClusters", "checklist": "WAF checklist", - "guid": "294798b1-578b-4219-a46c-eb5443513592", - "service": "Azure OpenAI", + "guid": "337453a3-cc63-4963-9a65-22ac19e80696", + "link": "https://learn.microsoft.com/azure/advisor/advisor-get-started", + "service": "AKS", "services": [ + "Entra", "WAF" ], - "severity": "Medium", - "text": "Evaluate your Azure AI Search results based on different search parameters", - "waf": "Operational Excellence" + "severity": "Low", + "text": "Check regularly Azure Advisor for recommendations on your cluster", + "waf": "Operations" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", + "arm-service": "microsoft.containerservice/managedClusters", "checklist": "WAF checklist", - "guid": "2744293b-b628-4537-a551-19b08e8f5854", - "link": "https://learn.microsoft.com/azure/ai-services/openai/concepts/fine-tuning-considerations", - "service": "Azure OpenAI", + "guid": "3aa70560-e7e7-4968-be3d-628af35b2ced", + "link": "https://learn.microsoft.com/azure/aks/certificate-rotation", + "service": "AKS", "services": [ + "AKS", "WAF" ], - "severity": "Medium", - "text": "Look at fine tuning models as way of increasing accuracy only when you have tried other basic approaches like prompt engineering and RAG with your data", - "waf": "Operational Excellence" + "severity": "Low", + "text": "Enable AKS auto-certificate rotation", + "waf": "Operations" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", + "arm-service": "microsoft.containerservice/managedClusters", "checklist": "WAF checklist", - "guid": "287d9cec-166c-4d07-8af9-b141a898a535", - "link": "https://learn.microsoft.com/azure/ai-services/openai/concepts/advanced-prompt-engineering?pivots=programming-language-chat-completions", - "service": "Azure OpenAI", + "guid": "e189c599-df0d-45a7-9dd4-ce32c1881370", + "link": "https://learn.microsoft.com/azure/aks/supported-kubernetes-versions", + "service": "AKS", "services": [ + "AKS", "WAF" ], - "severity": "Medium", - "text": "Use prompt engineering techniques to improve the accuracy of LLM responses", - "waf": "Operational Excellence" + "severity": "High", + "text": "Have a regular process to upgrade your kubernetes version periodically (quarterly, for example), or use the AKS autoupgrade feature", + "waf": "Operations" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", + "arm-service": "microsoft.containerservice/managedClusters", "checklist": "WAF checklist", - "guid": "e737897e-71ca-47da-acfa-962a1594946d", - "link": "https://learn.microsoft.com/azure/ai-services/openai/concepts/red-teaming", - "service": "Azure OpenAI", + "guid": "6f7c4c0d-4e51-4464-ad24-57ed67138b82", + "link": "https://learn.microsoft.com/azure/aks/node-updates-kured", + "service": "AKS", "services": [ "WAF" ], - "severity": "Medium", - "text": "Red team your GenAI applications", - "waf": "Security" + "severity": "High", + "text": "Use kured for Linux node upgrades in case you are not using node-image upgrade", + "waf": "Operations" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", + "arm-service": "microsoft.containerservice/managedClusters", "checklist": "WAF checklist", - "guid": "edb117e6-76aa-4f66-aca4-8e5a95f2223e", - "link": "https://www.microsoft.com/haxtoolkit/guideline/encourage-granular-feedback/", - "service": "Azure OpenAI", + "guid": "139c9580-ade3-426a-ba09-cf157d9f6477", + "link": "https://learn.microsoft.com/azure/aks/node-image-upgrade", + "service": "AKS", "services": [ "WAF" ], - "severity": "Medium", - "text": "Provide end users with scoring options for LLM responses and track these scores. ", - "waf": "Operational Excellence" + "severity": "High", + "text": "Have a regular process to upgrade the cluster node images periodically (weekly, for example)", + "waf": "Operations" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", + "arm-service": "microsoft.containerservice/managedClusters", "checklist": "WAF checklist", - "guid": "d5f3547c-c346-4d81-9028-a71ffe1b9b5d", - "link": "https://techcommunity.microsoft.com/t5/fasttrack-for-azure/optimizing-azure-openai-a-guide-to-limits-quotas-and-best/ba-p/4076268", - "service": "Azure OpenAI", + "guid": "0102ce16-ee30-41e6-b882-e52e4621dd68", + "link": "https://learn.microsoft.com/azure/architecture/example-scenario/bedrock/bedrock-automated-deployments", + "service": "AKS", "services": [ "WAF" ], - "severity": "High", - "text": "Consider Quota management practices", - "waf": "Cost Optimization" + "severity": "Low", + "text": "Consider gitops to deploy applications or cluster configuration to multiple clusters", + "waf": "Operations" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", + "arm-service": "microsoft.containerservice/managedClusters", "checklist": "WAF checklist", - "guid": "9de0d5d7-31d4-41e3-911c-817bfafbc410", - "link": "https://github.com/Azure/aoai-apim/blob/main/README.md", - "service": "Azure OpenAI", + "guid": "d7672c26-7602-4482-85a4-14527fbe855c", + "link": "https://learn.microsoft.com/azure/aks/command-invoke", + "service": "AKS", "services": [ - "Entra", - "APIM", - "LoadBalancer", - "ACR", + "AKS", "WAF" ], - "severity": "Medium", - "text": "Use Load balancer solutions like APIM based gateway for balancing load and capacity across services and regions", - "waf": "Operational Excellence" + "severity": "Low", + "text": "Consider using AKS command invoke on private clusters", + "waf": "Operations" }, { - "arm-service": "Microsoft.Purview/accounts", + "arm-service": "microsoft.containerservice/managedClusters", "checklist": "WAF checklist", - "guid": "1fc2fc14-eea6-4e69-b8d9-a3edc218e687", - "link": "https://polite-sea-0995b240f.2.azurestaticapps.net/technical-delivery-playbook/azure-services/analytics/purview/", - "service": "Purview", + "guid": "31d7aaab-7571-4449-ab80-53d89e89d17b", + "link": "https://learn.microsoft.com/azure/aks/node-auto-repair#node-autodrain", + "service": "AKS", "services": [ "WAF" ], - "severity": "Medium", - "text": "Leverage FTA Resillency Handbook", - "waf": "Reliability" + "severity": "Low", + "text": "For planned events consider using Node Auto Drain", + "waf": "Operations" }, { - "arm-service": "Microsoft.Purview/accounts", + "arm-service": "microsoft.containerservice/managedClusters", "checklist": "WAF checklist", - "guid": "ab067acb-49e5-4b96-8332-4ecf8cc13318", - "link": "https://learn.microsoft.com/purview/disaster-recovery", - "service": "Purview", + "guid": "ed0fda7f-211b-47c7-8b6e-c18873fb473c", + "link": "https://learn.microsoft.com/azure/aks/faq", + "service": "AKS", "services": [ "WAF" ], "severity": "High", - "text": "Plan for Data Center level outage", - "waf": "Reliability" + "text": "Develop own governance practices to make sure no changes are performed by operators in the node RG (aka 'infra RG')", + "waf": "Operations" }, { - "arm-service": "Microsoft.Purview/accounts", + "arm-service": "microsoft.containerservice/managedClusters", "checklist": "WAF checklist", - "description": "1. Create the new account 2. Migrate configuration items 3. Run scans 4. Migrate custom typedefs and custom assets 5. Migrate relationships 6. Migrate glossary terms 7. Assign classifications to assets 8. Assign contacts to assets", - "guid": "da611702-69f4-4fb4-aa3d-3ef7f3176c4b", - "link": "https://learn.microsoft.com/purview/disaster-recovery", - "service": "Purview", + "graph": "where type=='microsoft.containerservice/managedclusters' | extend compliant = (properties.nodeResourceGroup !startswith 'MC_') | distinct id,compliant", + "guid": "73b32a5a-67f7-4a9e-b5b3-1f38c3f39812", + "link": "https://learn.microsoft.com/azure/aks/cluster-configuration", + "service": "AKS", "services": [ "WAF" ], - "severity": "Medium", - "text": "Practice Failover for BCDR", - "waf": "Reliability" + "severity": "Low", + "text": "Use custom Node RG (aka 'Infra RG') name", + "waf": "Operations" }, { - "arm-service": "Microsoft.Purview/accounts", + "arm-service": "microsoft.containerservice/managedClusters", "checklist": "WAF checklist", - "guid": "97b15b8a-219a-44ab-bb57-879024d22678", - "link": "https://learn.microsoft.com/purview/disaster-recovery", - "service": "Purview", + "guid": "b2463cff-e189-4c59-adf0-d5a73dd4ce32", + "link": "https://kubernetes.io/docs/setup/release/notes/", + "service": "AKS", "services": [ - "Backup", + "AKS", "WAF" ], - "severity": "High", - "text": "Plan a backup strategy and take regular backups", - "waf": "Reliability" + "severity": "Medium", + "text": "Do not use deprecated Kubernetes APIs in your YAML manifests", + "waf": "Operations" }, { - "arm-service": "Microsoft.Purview/accounts", + "arm-service": "microsoft.containerservice/managedClusters", "checklist": "WAF checklist", - "guid": "6d20b56c-56a9-4581-89bf-8d8e5c586b7d", - "link": "https://learn.microsoft.com/purview/manage-kafka-dotnet", - "service": "Purview", + "guid": "c1881370-6f7c-44c0-b4e5-14648d2457ed", + "link": "https://learn.microsoft.com/azure-stack/aks-hci/adapt-apps-mixed-os-clusters", + "service": "AKS", "services": [ - "EventHubs", "WAF" ], "severity": "Low", - "text": "Use Microsoft Purview's Event Hubs to subscribe and create entities to another account", - "waf": "Reliability" + "text": "Taint Windows nodes", + "waf": "Operations" }, { - "arm-service": "Microsoft.Purview/accounts", + "arm-service": "microsoft.containerservice/managedClusters", "checklist": "WAF checklist", - "guid": "8cdc15ac-c075-4ee9-a130-a8889579e76b", - "link": "https://learn.microsoft.com/purview/deployment-best-practices", - "service": "Purview", + "guid": "67138b82-0102-4ce1-9ee3-01e6e882e52e", + "link": "https://learn.microsoft.com/virtualization/windowscontainers/deploy-containers/version-compatibility?tabs=windows-server-20H2%2Cwindows-10-20H2", + "service": "AKS", "services": [ "WAF" ], - "severity": "Medium", - "text": "Follow Purview accounts architectures and deployment best practices", - "waf": "Reliability" + "severity": "Low", + "text": "Keep windows containers patch level in sync with host patch level", + "waf": "Operations" }, { - "arm-service": "Microsoft.Purview/accounts", + "arm-service": "microsoft.containerservice/managedClusters", "checklist": "WAF checklist", - "guid": "896e710a-7da7-4be9-a56d-14d3c49d997c", - "link": "https://learn.microsoft.com/purview/concept-best-practices-collections", - "service": "Purview", + "description": "Via Diagnostic Settings at the cluster level", + "guid": "5b56ad48-408f-4e72-934c-476ba280dcf5", + "link": "https://learn.microsoft.com/azure/aks/monitor-aks", + "service": "AKS", "services": [ + "Monitor", "WAF" ], - "severity": "Medium", - "text": "Follow Collection Architectures and best practices", - "waf": "Reliability" + "severity": "Low", + "text": "Send master logs (aka API logs) to Azure Monitor or your preferred log management solution", + "waf": "Operations" }, { - "arm-service": "Microsoft.Purview/accounts", + "arm-service": "microsoft.containerservice/managedClusters", "checklist": "WAF checklist", - "guid": "b3d1325a-a225-4c6f-9e06-85edddea8a4b", - "link": "https://learn.microsoft.com/purview/concept-best-practices-asset-lifecycle", - "service": "Purview", + "guid": "64d1a846-e28a-4b6b-9a33-22a635c15a21", + "link": "https://learn.microsoft.com/azure/aks/node-pool-snapshot", + "service": "AKS", "services": [ "WAF" ], - "severity": "Medium", - "text": "Follow Assest lifecycle best practices", - "waf": "Reliability" + "severity": "Low", + "text": "If required use nodePool snapshots", + "waf": "Cost" }, { - "arm-service": "Microsoft.Purview/accounts", + "arm-service": "microsoft.containerservice/managedClusters", "checklist": "WAF checklist", - "guid": "7cdeb3c6-1fc2-4fc1-9eea-6e69d8d9a3ed", - "link": "https://learn.microsoft.com/purview/concept-best-practices-automation", - "service": "Purview", + "guid": "c5a5b252-1e44-4a59-a9d2-399c4d7b68d0", + "link": "https://learn.microsoft.com/azure/aks/spot-node-pool", + "service": "AKS", "services": [ "WAF" ], - "severity": "Medium", - "text": "Follow automation best practices", - "waf": "Reliability" + "severity": "Low", + "text": "Consider spot node pools for non time-sensitive workloads", + "waf": "Operations" }, { - "arm-service": "Microsoft.Purview/accounts", + "arm-service": "microsoft.containerservice/managedClusters", "checklist": "WAF checklist", - "guid": "c218e687-ab06-47ac-a49e-5b9603324ecf", - "link": "https://learn.microsoft.com/purview/disaster-recovery", - "service": "Purview", + "graph": "where type=='microsoft.containerservice/managedclusters' | extend compliant = (isnotnull(properties.addonProfiles.aciConnectorLinux) and properties.addonProfiles.aciConnectorLinux.enabled==true) | distinct id,compliant", + "guid": "c755562f-2b4e-4456-9b4d-874a748b662e", + "link": "https://learn.microsoft.com/azure/aks/concepts-scale", + "service": "AKS", "services": [ - "Backup", + "AKS", "WAF" ], - "severity": "Medium", - "text": "Follow Backup and Migration Best practices", - "waf": "Reliability" + "severity": "Low", + "text": "Consider AKS virtual node for quick bursting", + "waf": "Operations" }, { - "arm-service": "Microsoft.Purview/accounts", + "arm-service": "microsoft.containerservice/managedClusters", "checklist": "WAF checklist", - "guid": "8cc13318-da61-4170-869f-4fb4aa3d3ef7", - "link": "https://learn.microsoft.com/purview/concept-best-practices-glossary", - "service": "Purview", + "guid": "6f8389a7-f82c-4b8e-a8c0-aa63a25a4956", + "link": "https://learn.microsoft.com/azure/azure-monitor/insights/container-insights-overview", + "service": "AKS", "services": [ + "Monitor", "WAF" ], - "severity": "Medium", - "text": "Follow Purview Glossary Best Practices", - "waf": "Reliability" + "severity": "High", + "text": "Monitor your cluster metrics with Container Insights (or other tools like Prometheus)", + "waf": "Operations" }, { - "arm-service": "Microsoft.Purview/accounts", + "arm-service": "microsoft.containerservice/managedClusters", "checklist": "WAF checklist", - "guid": "f3176c4b-97b1-45b8-a219-a4abeb578790", - "link": "https://learn.microsoft.com/purview/concept-workflow", - "service": "Purview", + "graph": "where type=='microsoft.containerservice/managedclusters' | extend compliant = (isnotnull(properties.addonProfiles.omsagent) and properties.addonProfiles.omsagent.enabled==true) | distinct id,compliant", + "guid": "eaa8dc4a-2436-47b3-9697-15b1752beee0", + "link": "https://learn.microsoft.com/azure/azure-monitor/insights/container-insights-overview", + "service": "AKS", "services": [ "WAF" ], - "severity": "Low", - "text": "Leverage Workflows ", - "waf": "Reliability" + "severity": "High", + "text": "Store and analyze your cluster logs with Container Insights (or other tools like Telegraf/ElasticSearch)", + "waf": "Operations" }, { - "arm-service": "Microsoft.Purview/accounts", + "arm-service": "microsoft.containerservice/managedClusters", "checklist": "WAF checklist", - "guid": "24d22678-6d20-4b56-a56a-958119bf8d8e", - "link": "https://learn.microsoft.com/purview/concept-best-practices-security", - "service": "Purview", + "guid": "4621dd68-c5a5-4be2-bdb1-1726769ef669", + "link": "https://learn.microsoft.com/azure/azure-monitor/containers/container-insights-analyze", + "service": "AKS", "services": [ + "Monitor", "WAF" ], "severity": "Medium", - "text": "Follow Purview Security Best Practices", - "waf": "Reliability" + "text": "Monitor CPU and memory utilization of the nodes", + "waf": "Operations" }, { - "arm-service": "Microsoft.Purview/accounts", + "arm-service": "microsoft.containerservice/managedClusters", "checklist": "WAF checklist", - "guid": "5c586b7d-8cdc-415a-ac07-5ee9b130a888", - "link": "https://learn.microsoft.com/purview/concept-best-practices-lineage-azure-data-factory", - "service": "Purview", + "guid": "1a4835ac-9422-423e-ae80-b123081a5417", + "link": "https://learn.microsoft.com/azure/aks/configure-azure-cni", + "service": "AKS", "services": [ + "Monitor", "WAF" ], "severity": "Medium", - "text": "Follow Purview Data Lineage Best Practices", - "waf": "Reliability" + "text": "If using Azure CNI, monitor % of pod IPs consumed per node", + "waf": "Operations" }, { - "arm-service": "Microsoft.Purview/accounts", + "arm-service": "microsoft.containerservice/managedClusters", "checklist": "WAF checklist", - "guid": "9579e76b-896e-4710-a7da-7be9956d14d3", - "link": "https://learn.microsoft.com/purview/concept-best-practices-scanning", - "service": "Purview", + "description": "I/O in the OS disk is a critical resource. If the OS in the nodes gets throttled on I/O, this could lead to unpredictable behavior, typically ending up in node being declared NotReady", + "guid": "415833ea-3ad3-4c2d-b733-165c3acbe04b", + "link": "https://learn.microsoft.com/azure/virtual-machines/premium-storage-performance", + "service": "AKS", "services": [ - "WAF" + "Monitor", + "EventHubs", + "Storage", + "WAF", + "ServiceBus" ], "severity": "Medium", - "text": "Follow Best Practices for Scanning Registered Sources", - "waf": "Reliability" + "text": "Monitor OS disk queue depth in nodes", + "waf": "Operations" }, { - "arm-service": "Microsoft.Purview/accounts", + "arm-service": "microsoft.containerservice/managedClusters", "checklist": "WAF checklist", - "guid": "c49d997c-b3d1-4325-aa22-5c6f4e0685ed", - "link": "https://learn.microsoft.com/purview/concept-best-practices-classification", - "service": "Purview", + "guid": "be209d39-fda4-4777-a424-d116785c2fa5", + "link": "https://learn.microsoft.com/azure/aks/load-balancer-standard", + "service": "AKS", "services": [ - "WAF" + "Monitor", + "NVA", + "WAF", + "LoadBalancer" ], "severity": "Medium", - "text": "Follow Classification Best Practices in Governance Portal", - "waf": "Reliability" + "text": "If not using egress filtering with AzFW/NVA, monitor standard ALB allocated SNAT ports", + "waf": "Operations" }, { - "arm-service": "Microsoft.Purview/accounts", + "arm-service": "microsoft.containerservice/managedClusters", "checklist": "WAF checklist", - "guid": "ddea8a4b-7cde-4b3c-91fc-2fc14eea6e69", - "link": "https://learn.microsoft.com/purview/sensitivity-labels-frequently-asked-questions", - "service": "Purview", + "guid": "74c2ee76-569b-4a79-a57e-dedf91b022c9", + "link": "https://learn.microsoft.com/azure/aks/aks-resource-health", + "service": "AKS", "services": [ + "AKS", "WAF" ], "severity": "Medium", - "text": "Perform Sensitivity Labelling in the Purview Data Map", - "waf": "Reliability" + "text": "Subscribe to resource health notifications for your AKS cluster", + "waf": "Operations" }, { - "arm-service": "Microsoft.Purview/accounts", + "arm-service": "microsoft.containerservice/managedClusters", "checklist": "WAF checklist", - "guid": "d8d9a3ed-c218-4e68-9ab0-67acb49e5b96", - "link": "https://learn.microsoft.com/purview/concept-data-share", - "service": "Purview", + "guid": "b54eb2eb-03dd-4aa3-9927-18e2edb11726", + "link": "https://learn.microsoft.com/azure/aks/operator-best-practices-scheduler", + "service": "AKS", "services": [ - "Storage", "WAF" ], - "severity": "Low", - "text": "Leverage Azure Storage in-place data sharing with Microsoft Purview", - "waf": "Reliability" + "severity": "High", + "text": "Configure requests and limits in your pod specs", + "waf": "Operations" }, { - "arm-service": "Microsoft.Purview/accounts", + "arm-service": "microsoft.containerservice/managedClusters", "checklist": "WAF checklist", - "guid": "03324ecf-8cc1-4331-ada6-1170269f4fb4", - "link": "https://learn.microsoft.com/purview/concept-insights", - "service": "Purview", + "guid": "769ef669-1a48-435a-a942-223ece80b123", + "link": "https://learn.microsoft.com/azure/aks/operator-best-practices-scheduler", + "service": "AKS", "services": [ "WAF" ], - "severity": "Low", - "text": "Leverage Data Estate Insights", - "waf": "Reliability" + "severity": "Medium", + "text": "Enforce resource quotas for namespaces", + "waf": "Operations" }, { - "arm-service": "Microsoft.Purview/accounts", + "arm-service": "microsoft.containerservice/managedClusters", "checklist": "WAF checklist", - "guid": "aa3d3ef7-f317-46c4-a97b-15b8a219a4ab", - "link": "https://learn.microsoft.com/purview/catalog-adoption-insights", - "service": "Purview", + "guid": "081a5417-4158-433e-a3ad-3c2de733165c", + "link": "https://learn.microsoft.com/azure/azure-resource-manager/management/azure-subscription-service-limits", + "service": "AKS", "services": [ - "WAF" + "WAF", + "Subscriptions" ], - "severity": "Low", - "text": "Use Data stewardship and Catalog adoption", - "waf": "Reliability" + "severity": "High", + "text": "Ensure your subscription has enough quota to scale out your nodepools", + "waf": "Operations" }, { - "arm-service": "Microsoft.Purview/accounts", + "arm-service": "microsoft.containerservice/managedClusters", "checklist": "WAF checklist", - "guid": "eb578790-24d2-4267-a6d2-0b56c56a9581", - "link": "https://learn.microsoft.com/purview/concept-insights", - "service": "Purview", + "guid": "f4fd0602-7ab5-46f1-b66a-e9dea9654a65", + "link": "https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/", + "service": "AKS", "services": [ "WAF" ], - "severity": "Low", - "text": "Use Inventory and Ownership", - "waf": "Reliability" + "severity": "High", + "text": "Configure Liveness and Readiness probes for all deployments", + "waf": "Operations" }, { - "arm-service": "Microsoft.Purview/accounts", + "arm-service": "microsoft.containerservice/managedClusters", "checklist": "WAF checklist", - "guid": "19bf8d8e-5c58-46b7-b8cd-c15acc075ee9", - "link": "https://learn.microsoft.com/purview/glossary-insights", - "service": "Purview", + "graph": "where type=='microsoft.containerservice/managedclusters' | extend compliant = (isnotnull(properties.autoScalerProfile)) | distinct id,compliant", + "guid": "90ce65de-8e13-4f9c-abd4-69266abca264", + "link": "https://learn.microsoft.com/azure/aks/concepts-scale", + "service": "AKS", "services": [ "WAF" ], - "severity": "Low", - "text": "Leverage Insights for Glossary, Classifications, Sensitivity Labels", - "waf": "Reliability" + "severity": "Medium", + "text": "Use the Cluster Autoscaler", + "waf": "Performance" }, { - "arm-service": "Microsoft.Purview/accounts", + "arm-service": "microsoft.containerservice/managedClusters", "checklist": "WAF checklist", - "guid": "b130a888-9579-4e76-a896-e710a7da7be9", - "link": "https://learn.microsoft.com/purview/compliance-manager", - "service": "Purview", + "graph": "where type=='microsoft.containerservice/managedclusters' | extend compliant = (isnotnull(properties.austoscalerProfile)) | distinct id,compliant", + "guid": "831c2872-c693-4b39-a887-a561bada49bc", + "link": "https://learn.microsoft.com/azure/aks/custom-node-configuration", + "service": "AKS", "services": [ + "AKS", "WAF" ], - "severity": "Medium", - "text": "Generate assessment scores", - "waf": "Reliability" + "severity": "Low", + "text": "Customize node configuration for AKS node pools", + "waf": "Performance" }, { - "arm-service": "Microsoft.Purview/accounts", + "arm-service": "microsoft.containerservice/managedClusters", "checklist": "WAF checklist", - "guid": "956d14d3-c49d-4997-ab3d-1325aa225c6f", - "link": "https://learn.microsoft.com/purview/compliance-manager-scoring", - "service": "Purview", + "guid": "faa19bfe-9d55-4d04-a3c4-919ca1b2d121", + "link": "https://learn.microsoft.com/azure/aks/concepts-scale", + "service": "AKS", "services": [ "WAF" ], "severity": "Medium", - "text": "Profiling- get summaries of data content", - "waf": "Reliability" + "text": "Use the Horizontal Pod Autoscaler when required", + "waf": "Performance" }, { - "arm-service": "Microsoft.Purview/accounts", + "arm-service": "microsoft.containerservice/managedClusters", "checklist": "WAF checklist", - "guid": "4e0685ed-ddea-48a4-a7cd-eb3c61fc2fc1", - "link": "https://learn.microsoft.com/purview/concept-policies-data-owner#microsoft-purview-policy-concepts", - "service": "Purview", + "description": "Larger nodes will bring higher performance and features such as ephemeral disks and accelerated networking, but they will increase the blast radius and decrease the scaling granularity", + "guid": "5ae124ba-34df-4585-bcdc-e9bd3bb0cdb3", + "link": "https://blog.cloudtrooper.net/2020/10/23/which-vm-size-should-i-choose-as-aks-node/", + "service": "AKS", "services": [ - "AzurePolicy", "WAF" ], - "severity": "Low", - "text": "Follow Microsoft Purview Data Owner access policies", - "waf": "Reliability" + "severity": "High", + "text": "Consider an appropriate node size, not too large or too small", + "waf": "Performance" }, { - "arm-service": "Microsoft.Purview/accounts", + "arm-service": "microsoft.containerservice/managedClusters", "checklist": "WAF checklist", - "guid": "4eea6e69-d8d9-4a3e-bc21-8e687ab067ac", - "link": "https://learn.microsoft.com/purview/concept-self-service-data-access-policy", - "service": "Purview", + "guid": "38800e6a-ae01-40a2-9fbc-ae5a06e5462d", + "link": "https://learn.microsoft.com/azure/aks/quotas-skus-regions#service-quotas-and-limits", + "service": "AKS", "services": [ - "AzurePolicy", + "AKS", "WAF" ], "severity": "Low", - "text": "Follow Self-service access policies", - "waf": "Reliability" + "text": "If more than 5000 nodes are required for scalability then consider using an additional AKS cluster", + "waf": "Performance" }, { - "arm-service": "Microsoft.Purview/accounts", + "arm-service": "microsoft.containerservice/managedClusters", "checklist": "WAF checklist", - "guid": "b49e5b96-0332-44ec-b8cc-13318da61170", - "link": "https://learn.microsoft.com/purview/concept-policies-devops", - "service": "Purview", + "guid": "9583c0f6-6083-43f6-aa6b-df7102c901bb", + "link": "https://learn.microsoft.com/azure/event-grid/event-schema-aks", + "service": "AKS", "services": [ - "AzurePolicy", + "AKS", "WAF" ], "severity": "Low", - "text": "Follow DevOps policies", - "waf": "Reliability" + "text": "Consider subscribing to EventGrid Events for AKS automation", + "waf": "Performance" }, { "arm-service": "microsoft.containerservice/managedClusters", "checklist": "WAF checklist", - "guid": "ab5351f6-383a-45ed-9c5e-b143b16db40a", - "link": "https://learn.microsoft.com/azure/aks/use-windows-hpc", + "guid": "c5016d8c-c6c9-4165-89ae-673ef0fff19d", + "link": "https://learn.microsoft.com/azure/aks/manage-abort-operations", "service": "AKS", "services": [ "AKS", "WAF" ], "severity": "Low", - "text": "If required for AKS Windows workloads HostProcess containers can be used", - "waf": "Reliability" + "text": "For long running operation on an AKS cluster consider event termination", + "waf": "Performance" }, { "arm-service": "microsoft.containerservice/managedClusters", "checklist": "WAF checklist", - "guid": "a280dcf5-90ce-465d-b8e1-3f9ccbd46926", - "link": "https://learn.microsoft.com/azure/azure-functions/functions-kubernetes-keda", + "guid": "c4e37133-f186-4ce1-aed9-9f1b32f6e021", + "link": "https://learn.microsoft.com/azure/aks/use-azure-dedicated-hosts", "service": "AKS", "services": [ + "AKS", "WAF" ], "severity": "Low", - "text": "Use KEDA if running event-driven workloads", + "text": "If required consider using Azure Dedicated Hosts for AKS nodes", "waf": "Performance" }, { "arm-service": "microsoft.containerservice/managedClusters", "checklist": "WAF checklist", - "guid": "26886d20-b66c-457b-a591-19bf8e8f5c58", - "link": "https://dapr.io/", + "graph": "where type=='microsoft.containerservice/managedclusters' | project id,resourceGroup,name,pools=properties.agentPoolProfiles | mvexpand pools | extend compliant = (pools.osDiskType=='Ephemeral') | project id,name=strcat(name,'-',pools.name), resourceGroup, compliant", + "guid": "24367b33-6971-45b1-952b-eee0b9b588de", + "link": "https://learn.microsoft.com/azure/aks/cluster-configuration", "service": "AKS", "services": [ "WAF" ], - "severity": "Low", - "text": "Use Dapr to ease microservice development", - "waf": "Operations" + "severity": "High", + "text": "Use ephemeral OS disks", + "waf": "Performance" }, { "arm-service": "microsoft.containerservice/managedClusters", "checklist": "WAF checklist", - "graph": "where type=='microsoft.containerservice/managedclusters' | extend compliant = (sku.tier=='Paid') | distinct id,compliant", - "guid": "71d41e36-10cc-457b-9a4b-1410d4395898", - "link": "https://learn.microsoft.com/azure/aks/uptime-sla", + "guid": "f0ce315f-1120-4166-8206-94f2cf3a4d07", + "link": "https://learn.microsoft.com/azure/virtual-machines/disks-types", "service": "AKS", "services": [ "AKS", "WAF" ], "severity": "High", - "text": "Use the SLA-backed AKS offering", - "waf": "Reliability" + "text": "For non-ephemeral disks, use high IOPS and larger OS disks for the nodes when running many pods/node since it requires high performance for running multiple pods and will generate huge logs with default AKS log rotation thresholds", + "waf": "Performance" }, { "arm-service": "microsoft.containerservice/managedClusters", "checklist": "WAF checklist", - "guid": "c1288b3c-6a57-4cfc-9444-51e1a3d3453a", - "link": "https://learn.microsoft.com/azure/aks/operator-best-practices-scheduler", + "guid": "39c486ce-d5af-4062-89d5-18bb5fd795db", + "link": "https://learn.microsoft.com/azure/aks/use-ultra-disks", "service": "AKS", "services": [ - "Cost", + "Storage", + "AKS", "WAF" ], "severity": "Low", - "text": "Use Disruption Budgets in your pod and deployment definitions", - "waf": "Reliability" + "text": "For hyper performance storage option use Ultra Disks on AKS", + "waf": "Performance" }, { - "arm-service": "microsoft.containerregistry/registries", + "arm-service": "microsoft.containerservice/managedClusters", "checklist": "WAF checklist", - "guid": "3c763963-7a55-42d5-a15e-401955387e5c", - "link": "https://learn.microsoft.com/azure/container-registry/container-registry-geo-replication", - "service": "ACR", + "guid": "9f7547c1-747d-4c56-868a-714435bd19dd", + "link": "https://learn.microsoft.com/azure/aks/operator-best-practices-multi-region", + "service": "AKS", "services": [ - "ACR", + "Storage", + "SQL", "WAF" ], - "severity": "High", - "text": "If using a private registry, configure region replication to store images in multiple regions", - "waf": "Reliability" + "severity": "Medium", + "text": "Avoid keeping state in the cluster, and store data outside (AzStorage, AzSQL, Cosmos, etc)", + "waf": "Performance" }, { "arm-service": "microsoft.containerservice/managedClusters", "checklist": "WAF checklist", - "guid": "f82cb8eb-8c0a-4a63-a25a-4956eaa8dc4a", - "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/aks/eslz-cost-governance-with-kubecost", + "guid": "24429eb7-2281-4376-85cc-57b4a4b18142", + "link": "https://learn.microsoft.com/azure/aks/operator-best-practices-storage", "service": "AKS", "services": [ - "Cost", + "Storage", "WAF" ], - "severity": "Low", - "text": "Use an external application such as kubecost to allocate costs to different users", - "waf": "Cost" + "severity": "Medium", + "text": "If using AzFiles Standard, consider AzFiles Premium and/or ANF for performance reasons", + "waf": "Performance" }, { "arm-service": "microsoft.containerservice/managedClusters", "checklist": "WAF checklist", - "guid": "4d3dfbab-9924-4831-a68d-fdf0d72f462c", - "link": "https://learn.microsoft.com/azure/aks/scale-down-mode", + "guid": "83958a8c-2689-4b32-ab57-cfc64546135a", + "link": "https://learn.microsoft.com/azure/aks/availability-zones#azure-disk-availability-zone-support", "service": "AKS", "services": [ + "Storage", "WAF" ], - "severity": "Low", - "text": "Use scale down mode to delete/deallocate nodes", - "waf": "Cost" + "severity": "Medium", + "text": "If using Azure Disks and AZs, consider having nodepools within a zone for LRS disk with VolumeBindingMode:WaitForFirstConsumer for provisioning storage in right zone or use ZRS disk for nodepools spanning multiple zones", + "waf": "Performance" }, { - "arm-service": "microsoft.containerservice/managedClusters", + "arm-service": "Microsoft.Insights/components", "checklist": "WAF checklist", - "guid": "87e651ea-bc4a-4a87-a6df-c06a4b570ebc", - "link": "https://learn.microsoft.com/azure/aks/gpu-multi-instance", - "service": "AKS", + "guid": "a95b86ad-8840-48e3-9273-4b875ba18f20", + "link": "https://learn.microsoft.com/azure/architecture/guide/multitenant/considerations/tenancy-models", + "service": "Azure Monitor", "services": [ - "AKS", + "Monitor", "WAF" ], "severity": "Medium", - "text": "When required use multi-instance partitioning GPU on AKS Clusters", + "text": "Data collection rules in Azure Monitor -https://learn.microsoft.com/azure/azure-monitor/essentials/data-collection-rule-overview", + "training": "https://azure.microsoft.com/pricing/reservations/", "waf": "Cost" }, { - "arm-service": "microsoft.containerservice/managedClusters", + "arm-service": "Microsoft.RecoveryServices/vaults", "checklist": "WAF checklist", - "guid": "2b72a08b-0410-4cd6-9093-e068a5cf27e8", - "link": "https://learn.microsoft.com/azure/aks/start-stop-nodepools", - "service": "AKS", + "guid": "45901365-d38e-443f-abcb-d868266abca2", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/ready/landing-zone/design-area/multi-tenant/automation", + "service": "Azure Backup", "services": [ - "WAF" + "WAF", + "Backup" ], - "severity": "Low", - "text": "If running a Dev/Test cluster use NodePool Start/Stop", + "severity": "Medium", + "text": "check backup instances with the underlying datasource not found", "waf": "Cost" }, { - "arm-service": "microsoft.containerservice/managedClusters", + "arm-service": "Microsoft.Compute/virtualMachines", "checklist": "WAF checklist", - "graph": "where type=='microsoft.containerservice/managedclusters' | extend compliant = (isnotnull(properties.addonProfiles.azurepolicy) and properties.addonProfiles.azurepolicy.enabled==true) | distinct id,compliant", - "guid": "9ca48e4a-85e2-4223-bce8-bb12307ca5f1", - "link": "https://learn.microsoft.com/azure/governance/policy/concepts/policy-for-kubernetes", - "service": "AKS", + "guid": "64f9a19a-f29c-495d-94c6-c7919ca0f6c5", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/ready/landing-zone/design-area/multi-tenant/lighthouse", + "service": "VM", "services": [ - "AKS", - "AzurePolicy", "WAF" ], "severity": "Medium", - "text": "Use Azure Policy for Kubernetes to ensure cluster compliance", - "waf": "Security" + "text": "Delete or archive unassociated services (disks, nics, ip addresses etc)", + "waf": "Cost" }, { - "arm-service": "microsoft.containerservice/managedClusters", + "arm-service": "Microsoft.RecoveryServices/vaults", "checklist": "WAF checklist", - "graph": "where type=='microsoft.containerservice/managedclusters' | project id,resourceGroup,name,pools=properties.agentPoolProfiles | project id,name,resourceGroup,poolcount=array_length(pools) | extend compliant = (poolcount > 1)", - "guid": "6f158e3e-a3a9-42c2-be7e-2165c3a87af4", - "link": "https://learn.microsoft.com/azure/aks/use-system-pools", - "service": "AKS", + "guid": "69bad37a-ad53-4cc7-ae1d-76667357c449", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/ready/landing-zone/design-area/azure-billing-microsoft-customer-agreement#design-recommendations", + "service": "Azure Backup", "services": [ - "WAF" + "Storage", + "WAF", + "Backup", + "ASR" ], "severity": "Medium", - "text": "Separate applications from the control plane with user/system node pools", - "waf": "Security" + "text": "Consider a good balance between site recovery storage and backup for non mission critical applications", + "waf": "Cost" }, { - "arm-service": "microsoft.containerservice/managedClusters", + "arm-service": "Microsoft.Insights/components", "checklist": "WAF checklist", - "guid": "a7a1f893-9bda-4477-98f2-4c116775c2ea", - "link": "https://learn.microsoft.com/azure/aks/use-system-pools", - "service": "AKS", + "guid": "674b5ed8-5a85-49c7-933b-e2a1a27b765a", + "link": "https://learn.microsoft.com/azure/cost-management-billing/manage/direct-ea-administration#manage-notification-contacts", + "service": "Azure Monitor", "services": [ + "Monitor", "WAF" ], - "severity": "Low", - "text": "Add taint to your system nodepool to make it dedicated", - "waf": "Security" + "severity": "Medium", + "text": "Check spending and savings opportunities among the 40 different log analytics workspaces- use different retention and data collection for nonprod workspaces-create daily cap for awareness and tier sizing - If you do set a daily cap, in addition to creating an alert when the cap is reached,ensure that you also create an alert rule to be notified when some percentage has been reached (90% for example). - consider workspace transformation if possible - https://learn.microsoft.com/azure/azure-monitor/essentials/data-collection-transformations#workspace-transformation-dcr ", + "training": "https://learn.microsoft.com/azure/cost-management-billing/costs/understand-work-scopes", + "waf": "Cost" }, { - "arm-service": "microsoft.containerservice/managedClusters", + "arm-service": "Microsoft.Insights/components", "checklist": "WAF checklist", - "guid": "55b46a94-8008-4ae7-b7e4-b475b6c8bdbf", - "link": "https://learn.microsoft.com/azure/container-registry/", - "service": "AKS", + "guid": "91be1f38-8ef3-494c-8bd4-63cbbac75819", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/ready/landing-zone/design-area/azure-billing-enterprise-agreement#design-considerations", + "service": "Azure Monitor", "services": [ - "ACR", - "WAF" + "Storage", + "WAF", + "AzurePolicy" ], "severity": "Medium", - "text": "Use a private registry for your images, such as ACR", - "waf": "Security" + "text": "Enforce a purging log policy and automation (if needed, logs can be moved to cold storage)", + "training": "https://www.youtube.com/watch?v=nHQYcYGKuyw", + "waf": "Cost" }, { - "arm-service": "microsoft.containerregistry/registries", + "arm-service": "Microsoft.Compute/virtualMachines", "checklist": "WAF checklist", - "guid": "59bce65d-e8a0-43f9-9879-468d66a786d6", - "link": "https://learn.microsoft.com/azure/security-center/container-security", - "service": "ACR", + "guid": "6aae01e6-a84d-4e5d-b36d-1d92881a1bd5", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/ready/landing-zone/design-area/azure-billing-enterprise-agreement#design-considerations", + "service": "VM", "services": [ - "WAF" + "Storage", + "WAF", + "Backup" ], "severity": "Medium", - "text": "Scan your images for vulnerabilities", - "waf": "Security" + "text": "Check that the disks are really needed, if not: delete. If they are needed, find lower storage tiers or use backup -", + "training": "https://learn.microsoft.com/azure/cost-management-billing/costs/manage-automation", + "waf": "Cost" }, { - "arm-service": "microsoft.containerservice/managedClusters", + "arm-service": "Microsoft.Storage/storageAccounts", "checklist": "WAF checklist", - "guid": "d167dd18-2b0a-4c24-8b99-9a646f8389a7", - "link": "https://learn.microsoft.com/azure/aks/operator-best-practices-cluster-isolation", - "service": "AKS", + "guid": "d1e44a19-659d-4395-afd7-7289b835556d", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/ready/landing-zone/design-area/azure-billing-enterprise-agreement#design-considerations", + "service": "Storage", "services": [ - "WAF" + "Storage", + "WAF", + "AzurePolicy" ], - "severity": "High", - "text": "Define app separation requirements (namespace/nodepool/cluster)", - "waf": "Security" + "severity": "Medium", + "text": "Consider moving unused storage to lower tier, with customized rule - https://learn.microsoft.com/azure/storage/blobs/lifecycle-management-policy-configure ", + "training": "https://learn.microsoft.com/azure/cost-management-billing/costs/enable-tag-inheritance", + "waf": "Cost" }, { - "arm-service": "microsoft.containerservice/managedClusters", + "arm-service": "Microsoft.Compute/virtualMachines", "checklist": "WAF checklist", - "guid": "5e3df584-eccc-4d97-a3b6-bcda3b50eb2e", - "link": "https://github.com/Azure/secrets-store-csi-driver-provider-azure", - "service": "AKS", + "guid": "d0102cac-6aae-401e-9a84-de5de36d1d92", + "link": "https://learn.microsoft.com/azure/governance/policy/overview", + "service": "VM", "services": [ - "AKV", + "VM", "WAF" ], "severity": "Medium", - "text": "Store your secrets in Azure Key Vault with the CSI Secrets Store driver", - "waf": "Security" + "text": "Make sure advisor is configured for VM right sizing ", + "waf": "Cost" }, { - "arm-service": "microsoft.containerservice/managedClusters", + "arm-service": "Microsoft.Compute/virtualMachines", "checklist": "WAF checklist", - "guid": "b03dda6d-58d7-4c89-8ddb-107d5769ae66", - "link": "https://learn.microsoft.com/azure/aks/update-credentials", - "service": "AKS", + "description": "check by searching the Meter Category Licenses in the Cost analysys", + "guid": "59ae568b-a38d-4498-9e22-13dbd7bb012f", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/manage/centralize-operations", + "service": "VM", "services": [ - "WAF" + "VM", + "Cost", + "WAF", + "AzurePolicy" ], - "severity": "High", - "text": "If using Service Principals for the cluster, refresh credentials periodically (like quarterly)", - "waf": "Security" + "severity": "Medium", + "text": "run the script on all windows VMs https://learn.microsoft.com/azure/virtual-machines/windows/hybrid-use-benefit-licensing?ref=andrewmatveychuk.com#convert-an-existing-vm-using-azure-hybrid-benefit-for-windows-server- consider implementing a policy if windows VMs are created frequently", + "waf": "Cost" }, { - "arm-service": "microsoft.containerservice/managedClusters", + "arm-service": "Microsoft.Compute/virtualMachines", "checklist": "WAF checklist", - "guid": "e7ba73a3-0508-4f80-806f-527db30cee96", - "link": "https://learn.microsoft.com/azure/aks/use-kms-etcd-encryption", - "service": "AKS", + "guid": "7b95e06e-158e-42ea-9992-c2de6e2065b3", + "link": "https://learn.microsoft.com/azure/active-directory/privileged-identity-management/pim-configure", + "service": "VM", "services": [ - "WAF" + "WAF", + "LoadBalancer" ], "severity": "Medium", - "text": "If required add Key Management Service etcd encryption", - "waf": "Security" + "text": " this can be also put under AHUB if you already have licenses https://learn.microsoft.com/azure/virtual-machines/linux/azure-hybrid-benefit-linux?tabs=rhelpayg%2Crhelbyos%2CrhelEnablebyos%2Crhelcompliance", + "waf": "Cost" }, { - "arm-service": "microsoft.containerservice/managedClusters", + "arm-service": "Microsoft.Compute/virtualMachines", "checklist": "WAF checklist", - "guid": "ec8e4e42-0344-41b0-b865-9123e8956d31", - "link": "https://learn.microsoft.com/azure/confidential-computing/confidential-nodes-aks-overview", - "service": "AKS", + "guid": "75c1e945-b459-4837-bf7a-e7c6d3b475a5", + "link": "https://learn.microsoft.com/azure/active-directory/fundamentals/active-directory-groups-create-azure-portal", + "service": "VM", "services": [ - "AKS", + "VM", "WAF" ], - "severity": "Low", - "text": "If required consider using Confidential Compute for AKS", - "waf": "Security" + "severity": "Medium", + "text": "Consolidate reserved VM families with flexibility option (no more than 4-5 families)", + "training": "https://learn.microsoft.com/azure/automation/automation-solution-vm-management", + "waf": "Cost" }, { - "arm-service": "microsoft.containerservice/managedClusters", + "arm-service": "Microsoft.Compute/virtualMachines", "checklist": "WAF checklist", - "guid": "c9e95ffe-6dd1-4a17-8c5f-110389ca9b21", - "link": "https://learn.microsoft.com/azure/defender-for-cloud/defender-for-containers-enable", - "service": "AKS", + "guid": "c7acbe49-bbe6-44dd-a9f2-e87778468d55", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/ready/landing-zone/design-area/identity-access#prerequisites-for-a-landing-zone---design-recommendations", + "service": "VM", "services": [ - "Defender", - "WAF" + "VM", + "Cost", + "WAF", + "ARS" ], "severity": "Medium", - "text": "Consider using Defender for Containers", - "waf": "Security" + "text": "Utilize Azure Reserved Instances: This feature allows you to reserve VMs for a period of 1 or 3 years, providing significant cost savings compared to PAYG prices.", + "waf": "Cost" }, { - "arm-service": "microsoft.containerservice/managedClusters", + "arm-service": "Microsoft.Compute/virtualMachines", "checklist": "WAF checklist", - "graph": "where type=='microsoft.containerservice/managedclusters' | extend compliant = (properties.servicePrincipalProfile.clientId=='msi') | distinct id,compliant", - "guid": "ed127dd1-42b0-46b2-8c69-99a646f3389a", - "link": "https://learn.microsoft.com/azure/aks/use-managed-identity", - "service": "AKS", + "guid": "a6bcca2b-4fea-41db-b3dd-95d48c7c891d", + "link": "https://learn.microsoft.com/azure/active-directory-domain-services/overview", + "service": "VM", "services": [ - "Entra", "WAF" ], - "severity": "High", - "text": "Use managed identities instead of Service Principals", - "waf": "Security" + "severity": "Medium", + "text": "Only larger disks can be reserved => 1 TiB -", + "waf": "Cost" }, { - "arm-service": "microsoft.containerservice/managedClusters", + "arm-service": "Microsoft.Compute/virtualMachines", "checklist": "WAF checklist", - "graph": "where type=='microsoft.containerservice/managedclusters' | extend compliant = isnotnull(properties.aadProfile) | distinct id,compliant", - "guid": "7e42c78e-78c0-46a6-8a21-94956e698dc4", - "link": "https://learn.microsoft.com/azure/aks/managed-aad", - "service": "AKS", + "guid": "cb1f7d57-59ae-4568-aa38-d4985e2213db", + "link": "https://learn.microsoft.com/azure/architecture/reference-architectures/identity/adds-extend-domain", + "service": "VM", "services": [ - "Entra", "WAF" ], "severity": "Medium", - "text": "Integrate authentication with AAD (using the managed integration)", - "waf": "Security" + "text": "After the right-sizing optimization", + "waf": "Cost" }, { - "arm-service": "microsoft.containerservice/managedClusters", + "arm-service": "Microsoft.Sql/servers", "checklist": "WAF checklist", - "guid": "a2fe27b2-e287-401a-8352-beedf79b488d", - "link": "https://learn.microsoft.com/azure/aks/control-kubeconfig-access", - "service": "AKS", + "guid": "d7bb012f-7b95-4e06-b158-e2ea3992c2de", + "link": "https://learn.microsoft.com/azure/active-directory/app-proxy/application-proxy", + "service": "Azure SQL", + "services": [ + "Cost", + "SQL", + "WAF", + "AzurePolicy" + ], + "severity": "Medium", + "text": "Check if applicable and enforce policy/change https://learn.microsoft.com/azure/azure-sql/azure-hybrid-benefit?view=azuresql&tabs=azure-portalhttps://learn.microsoft.com/azure/cost-management-billing/scope-level/create-sql-license-assignments?source=recommendations", + "waf": "Cost" + }, + { + "arm-service": "Microsoft.Compute/virtualMachines", + "checklist": "WAF checklist", + "guid": "6e2065b3-a76a-4f4a-991e-8839ada46667", + "link": "https://learn.microsoft.com/azure/active-directory/roles/best-practices", + "service": "VM", "services": [ + "VM", "WAF" ], "severity": "Medium", - "text": "Limit access to admin kubeconfig (get-credentials --admin)", - "waf": "Security" + "text": "The VM + license part discount (ahub + 3YRI) is around 70% discount", + "waf": "Cost" }, { - "arm-service": "microsoft.containerservice/managedClusters", + "arm-service": "Microsoft.Compute/virtualMachines", "checklist": "WAF checklist", - "guid": "eec4962c-c3bd-421b-b77f-26e5e6b3bec3", - "link": "https://learn.microsoft.com/azure/aks/manage-azure-rbac", - "service": "AKS", + "guid": "ccbd9792-a6bc-4ca2-a4fe-a1dbf3dd95d4", + "link": "https://learn.microsoft.com/azure/web-application-firewall/afds/waf-front-door-best-practices#send-logs-to-microsoft-sentinel", + "service": "VM", "services": [ - "Entra", - "RBAC", + "VM", "WAF" ], "severity": "Medium", - "text": "Integrate authorization with AAD RBAC", - "waf": "Security" + "text": "Consider using a VMSS to match demand rather than flat sizing", + "waf": "Cost" }, { "arm-service": "microsoft.containerservice/managedClusters", "checklist": "WAF checklist", - "guid": "d4f3537c-1346-4dc5-9027-a71ffe1bd05d", - "link": "https://learn.microsoft.com/azure/aks/operator-best-practices-identity", + "guid": "c1b1cd52-1e54-4a29-a9de-39ac0e7c28dc", + "link": "https://learn.microsoft.com/azure/reliability/cross-region-replication-azure", "service": "AKS", "services": [ - "RBAC", "AKS", "WAF" ], - "severity": "High", - "text": "Use namespaces for restricting RBAC privilege in Kubernetes", - "waf": "Security" + "severity": "Medium", + "text": "Use AKS autoscaler to match your clusters usage (make sure the pods requirements match the scaler)", + "waf": "Cost" }, { - "arm-service": "microsoft.containerservice/managedClusters", + "arm-service": "Microsoft.RecoveryServices/vaults", "checklist": "WAF checklist", - "guid": "d2e0d5d7-71d4-41e3-910c-c57b4a4b1410", - "link": "https://learn.microsoft.com/azure/aks/workload-identity-migration-sidecar", - "service": "AKS", + "guid": "44be3b1a-27f8-4b9e-a1be-1f38df03a822", + "link": "https://learn.microsoft.com/azure/azure-monitor/logs/data-retention-archive?tabs=portal-1%2Cportal-2#how-retention-and-archiving-work", + "service": "Azure Backup", "services": [ - "Entra", "WAF" ], "severity": "Medium", - "text": "For Pod Identity Access Management use Azure AD Workload Identity (preview)", - "waf": "Security" + "text": "Move recovery points to vault-archive where applicable (Validate)", + "training": "https://azure.microsoft.com/pricing/reservations/", + "waf": "Cost" }, { - "arm-service": "microsoft.containerservice/managedClusters", + "arm-service": "Microsoft.Databricks/workspaces", "checklist": "WAF checklist", - "guid": "f4dcf690-1b30-407d-abab-6f8aa780d3a3", - "link": "https://learn.microsoft.com/azure/aks/managed-aad#non-interactive-sign-in-with-kubelogin", - "service": "AKS", + "guid": "cd463cbb-bc8a-4c29-aebc-91a43da1dae2", + "link": "https://learn.microsoft.com/azure/databricks/clusters/cluster-config-best-practices#automatic-termination", + "service": "Databricks", + "services": [ + "VM", + "WAF", + "LoadBalancer" + ], + "severity": "Medium", + "text": "Consider using Spot VMs with fallback where possible. Consider autotermination of clusters.", + "waf": "Cost" + }, + { + "arm-service": "Microsoft.Web/sites", + "checklist": "WAF checklist", + "guid": "cc881470-607c-41cc-a0e6-14658dd458e9", + "link": "https://learn.microsoft.com/azure/governance/policy/how-to/guest-configuration-create", + "service": "Azure Functions", "services": [ - "AKS", "WAF" ], "severity": "Medium", - "text": "For AKS non-interactive logins use kubelogin (preview)", - "waf": "Security" + "text": "Functions - Reuse connections", + "training": "https://learn.microsoft.com/azure/cost-management-billing/reservations/reservation-apis?toc=%2Fazure%2Fcost-management-billing%2Ftoc.json", + "waf": "Cost" }, { - "arm-service": "microsoft.containerservice/managedClusters", + "arm-service": "Microsoft.Web/sites", "checklist": "WAF checklist", - "graph": "where type=='microsoft.containerservice/managedclusters' | extend compliant = (properties.disableLocalAccounts==true) | distinct id,compliant", - "guid": "b085b1f2-3119-4771-8c9a-bbf4411810ec", - "link": "https://learn.microsoft.com/azure/aks/managed-aad#disable-local-accounts", - "service": "AKS", + "guid": "27139b82-1102-4dbd-9eaf-11e6f843e52f", + "link": "https://learn.microsoft.com/azure/automation/update-management/overview", + "service": "Azure Functions", "services": [ - "AKS", "WAF" ], "severity": "Medium", - "text": "Disable AKS local accounts", - "waf": "Security" + "text": "Functions - Cache data locally", + "training": "https://learn.microsoft.com/learn/paths/azure-administrator-manage-compute-resources/", + "waf": "Cost" }, { - "arm-service": "microsoft.containerservice/managedClusters", + "arm-service": "Microsoft.Web/sites", "checklist": "WAF checklist", - "guid": "36abb0db-c118-4f4c-9880-3f30f9a2deb6", - "link": "https://learn.microsoft.com/azure/aks/managed-aad#configure-just-in-time-cluster-access-with-azure-ad-and-aks", - "service": "AKS", + "guid": "4722d928-c1b1-4cd5-81e5-4a29b9de39ac", + "link": "https://learn.microsoft.com/azure/network-watcher/network-watcher-monitoring-overview", + "service": "Azure Functions", "services": [ + "Storage", "WAF" ], - "severity": "Low", - "text": "Configure if required Just-in-time cluster access", - "waf": "Security" + "severity": "Medium", + "text": "Functions - Cold starts-Use the 'Run from package' functionality. This way, the code is downloaded as a single zip file. This can, for example, result in significant improvements with Javascript functions, which have a lot of node modules.Use language specific tools to reduce the package size, for example, tree shaking Javascript applications.", + "training": "https://learn.microsoft.com/learn/modules/configure-network-watcher/", + "waf": "Cost" }, { - "arm-service": "microsoft.containerservice/managedClusters", + "arm-service": "Microsoft.Web/sites", "checklist": "WAF checklist", - "guid": "c4d7f4c6-79bf-45d0-aa05-ce8fc717e150", - "link": "https://learn.microsoft.com/azure/aks/managed-aad#use-conditional-access-with-azure-ad-and-aks", - "service": "AKS", + "guid": "0e7c28dc-9366-4572-82bf-f4564b0d934a", + "link": "https://learn.microsoft.com/azure/azure-resource-manager/management/lock-resources?tabs=json", + "service": "Azure Functions", + "services": [ + "WAF" + ], + "severity": "Medium", + "text": "Functions - Keep your functions warm", + "training": "https://learn.microsoft.com/learn/paths/implement-resource-mgmt-security/", + "waf": "Cost" + }, + { + "arm-service": "Microsoft.Web/sites", + "checklist": "WAF checklist", + "guid": "359c363e-7dd6-4162-9a36-4a907ebae38e", + "link": "https://learn.microsoft.com/azure/governance/policy/overview", + "service": "Azure Functions", "services": [ - "Entra", - "AKS", "WAF" ], - "severity": "Low", - "text": "Configure if required AAD conditional access for AKS", - "waf": "Security" + "severity": "Medium", + "text": "When using autoscale with different functions, there might be one driving all the autoscale for all the resources - consider moving it to a separate consumption plan (and consider higher plan for CPU)", + "waf": "Cost" }, { - "arm-service": "microsoft.containerservice/managedClusters", + "arm-service": "Microsoft.Web/sites", "checklist": "WAF checklist", - "guid": "e1123a7c-a333-4eb4-a120-4ee3f293c9f3", - "link": "https://learn.microsoft.com/azure/aks/use-group-managed-service-accounts", - "service": "AKS", + "guid": "ad53cc7d-e2e8-4aaa-a357-1549ab9153d8", + "link": "https://learn.microsoft.com/azure/service-health/alerts-activity-log-service-notifications-portal", + "service": "Azure Functions", "services": [ - "AKS", "WAF" ], - "severity": "Low", - "text": "If required for Windows AKS workloads configure gMSA ", - "waf": "Security" + "severity": "Medium", + "text": "Function apps in a given plan are all scaled together, so any issues with scaling can affect all apps in the plan.", + "waf": "Cost" }, { - "arm-service": "microsoft.containerservice/managedClusters", + "arm-service": "Microsoft.Web/sites", "checklist": "WAF checklist", - "guid": "1f711a74-3672-470b-b8b8-a2148d640d79", - "link": "https://learn.microsoft.com/azure/aks/use-managed-identity#use-a-pre-created-kubelet-managed-identity", - "service": "AKS", + "guid": "9f89dc7b-44be-43b1-a27f-8b9e91be1f38", + "link": "https://learn.microsoft.com/azure/azure-monitor/alerts/action-groups", + "service": "Azure Functions", "services": [ - "Entra", "WAF" ], "severity": "Medium", - "text": "For finer control consider using a managed Kubelet Identity", - "waf": "Security" + "text": "Am I billed for 'await time'? This question is typically asked in the context of a C# function that does an async operation and waits for the result, e.g. await Task.Delay(1000) or await client.GetAsync('http://google.com'). The answer is yes - the GB second calculation is based on the start and end time of the function and the memory usage over that period. What actually happens over that time in terms of CPU activity is not factored into the calculation.One exception to this rule is if you are using durable functions. You are not billed for time spent at awaits in orchestrator functions.apply demand shaping techinques where possible (dev environments?) https://github.com/Azure-Samples/functions-csharp-premium-scaler", + "waf": "Cost" }, { - "arm-service": "microsoft.containerservice/managedClusters", + "arm-service": "microsoft.network/frontdoors", "checklist": "WAF checklist", - "guid": "cbd8ac2a-aebc-4a2a-94da-1dbf3dc99248", - "link": "https://azure.github.io/application-gateway-kubernetes-ingress/setup/install-existing/", - "service": "AKS", + "guid": "3da1dae2-cc88-4147-8607-c1cca0e61465", + "link": "https://learn.microsoft.com/azure/azure-monitor/logs/design-logs-deployment", + "service": "Front Door", "services": [ - "ACR", - "AppGW", - "WAF" + "EventHubs", + "WAF", + "FrontDoor" ], "severity": "Medium", - "text": "If using AGIC, do not share an AppGW across clusters", - "waf": "Reliability" + "text": "Frontdoor - Turn off the default homepageIn the application settings of your App, set AzureWebJobsDisableHomepage to true. This will return a 204 (No Content) to the PoP so only header data is returned.", + "waf": "Cost" }, { - "arm-service": "microsoft.containerservice/managedClusters", + "arm-service": "microsoft.network/frontdoors", "checklist": "WAF checklist", - "graph": "where type=='microsoft.containerservice/managedclusters' | extend compliant = (isnull(properties.addonProfiles.httpApplicationRouting) or properties.addonProfiles.httpApplicationRouting.enabled==false) | distinct id,compliant", - "guid": "8008ae7d-7e4b-4475-a6c8-bdbf59bce65d", - "link": "https://learn.microsoft.com/azure/aks/http-application-routing", - "service": "AKS", + "guid": "8dd458e9-2713-49b8-8110-2dbd6eaf11e6", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/ready/azure-setup-guide/monitoring-reporting?tabs=AzureMonitor", + "service": "Front Door", "services": [ - "AKS", - "WAF" + "WAF", + "FrontDoor", + "AppSvc" ], - "severity": "High", - "text": "Do not use AKS HTTP Routing Add-On, use instead the managed NGINX ingress with the application routing add-on.", - "waf": "Reliability" + "severity": "Medium", + "text": "Frontdoor - Route to something that returns nothing. Either set up a Function, Function Proxy, or add a route in your WebApp that returns 200 (OK) and sends no or minimal content. The advantage of this is you will be able to log out when it is called.", + "waf": "Cost" }, { - "arm-service": "microsoft.containerservice/managedClusters", + "arm-service": "Microsoft.Storage/storageAccounts", "checklist": "WAF checklist", - "guid": "7bacd7b9-c025-4a9d-a5d2-25d6bc5439d9", - "link": "https://learn.microsoft.com/azure/virtual-network/accelerated-networking-overview", - "service": "AKS", + "guid": "7e31c67d-68cf-46a6-8a11-94956d697dc3", + "link": "https://learn.microsoft.com/azure/architecture/best-practices/monitoring", + "service": "Storage", "services": [ "WAF" ], "severity": "Medium", - "text": "For Windows workloads use Accelerated Networking", - "waf": "Performance" + "text": "Consider archiving tiers for less used data", + "waf": "Cost" }, { - "arm-service": "microsoft.containerservice/managedClusters", + "arm-service": "Microsoft.Compute/virtualMachines", "checklist": "WAF checklist", - "graph": "where type=='microsoft.containerservice/managedclusters' | extend compliant = (tolower(properties.networkProfile.loadBalancerSku)=='standard') | distinct id,compliant", - "guid": "ba7da7be-9952-4914-a384-5d997cb39132", - "link": "https://learn.microsoft.com/azure/aks/load-balancer-standard", - "service": "AKS", + "guid": "a2ed27b2-d186-4f1a-8252-bddde68a487c", + "link": "https://learn.microsoft.com/azure/automation/how-to/region-mappings", + "service": "VM", "services": [ - "LoadBalancer", "WAF" ], - "severity": "High", - "text": "Use the standard ALB (as opposed to the basic one)", - "waf": "Reliability" + "severity": "Medium", + "text": "Check disk sizes where the size does not match the tier (i.e. A 513 GiB disk will pay a P30 (1TiB) and consider resizing", + "waf": "Cost" }, { - "arm-service": "microsoft.containerservice/managedClusters", + "arm-service": "Microsoft.Storage/storageAccounts", "checklist": "WAF checklist", - "guid": "22fbe8d6-9b40-47ef-9011-25bb1a555a6b", - "link": "https://learn.microsoft.com/azure/aks/use-multiple-node-pools#add-a-node-pool-with-a-unique-subnet", - "service": "AKS", + "guid": "dec4861b-c3bc-410a-b77e-26e4d5a3bec2", + "link": "https://learn.microsoft.com/azure/governance/policy/concepts/guest-configuration", + "service": "Storage", "services": [ - "VNet", "WAF" ], "severity": "Medium", - "text": "If using Azure CNI, consider using different Subnets for NodePools", - "waf": "Security" + "text": "Consider using standard SSD rather than Premium or Ultra where possible", + "waf": "Cost" }, { - "arm-service": "microsoft.containerservice/managedClusters", + "arm-service": "Microsoft.Storage/storageAccounts", "checklist": "WAF checklist", - "guid": "c3c39c98-6bb2-4c12-859a-114b5e3df584", - "link": "https://learn.microsoft.com/azure/private-link/private-link-overview", - "service": "AKS", + "guid": "c4e2436b-1336-4db5-9f17-960eee0bdf5c", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/ready/landing-zone/design-area/management-operational-compliance#monitoring-for-configuration-drift", + "service": "Storage", "services": [ - "PrivateLink", - "VNet", + "Storage", "WAF" ], "severity": "Medium", - "text": "Use Private Endpoints (preferred) or Virtual Network Service Endpoints to access PaaS services from the cluster", - "waf": "Security" + "text": "For storage accounts, make sure that the chosen tier is not adding up transaction charges (it might be cheaper to move to the next tier)", + "waf": "Cost" }, { - "arm-service": "microsoft.containerservice/managedClusters", + "arm-service": "Microsoft.RecoveryServices/vaults", "checklist": "WAF checklist", - "graph": "where type=='microsoft.containerservice/managedclusters' | extend compliant = (properties.networkProfile.networkPlugin=='azure') | distinct id,compliant", - "guid": "a0f61565-9de5-458f-a372-49c831112dbd", - "link": "https://learn.microsoft.com/azure/aks/operator-best-practices-network", - "service": "AKS", + "guid": "c2efc5d7-61d4-41d2-900b-b47a393a040f", + "link": "https://learn.microsoft.com/azure/site-recovery/site-recovery-overview", + "service": "Site Recovery", "services": [ + "ASR", "WAF" ], - "severity": "High", - "text": "Choose the best CNI network plugin for your requirements (Azure CNI recommended)", - "waf": "Reliability" + "severity": "Medium", + "text": "For ASR, consider using Standard SSD disks if the RPO/RTO and replication throughput allow it", + "waf": "Cost" }, { - "arm-service": "microsoft.containerservice/managedClusters", + "arm-service": "Microsoft.Storage/storageAccounts", "checklist": "WAF checklist", - "guid": "7faf12e7-0943-4f63-8472-2da29c2b1cd6", - "link": "https://learn.microsoft.com/azure/aks/configure-azure-cni", - "service": "AKS", + "guid": "d3294798-b118-48b2-a5a4-6ceb544451e1", + "link": "https://learn.microsoft.com/azure/architecture/framework/resiliency/backup-and-recovery", + "service": "Storage", "services": [ - "VNet", + "Storage", "WAF" ], - "severity": "High", - "text": "If using Azure CNI, size your subnet accordingly considering the maximum number of pods per node", - "waf": "Performance" + "severity": "Medium", + "text": "Storage accounts: check hot tier and/or GRS necessary", + "waf": "Cost" }, { - "arm-service": "microsoft.containerservice/managedClusters", + "arm-service": "Microsoft.Compute/virtualMachines", "checklist": "WAF checklist", - "guid": "22f54b29-bade-43aa-b1e8-c38ec9366673", - "link": "https://learn.microsoft.com/azure/aks/configure-azure-cni", - "service": "AKS", + "guid": "92d34429-3c76-4286-97a5-51c5b04e4f18", + "link": "https://learn.microsoft.com/azure/backup/backup-center-overview", + "service": "VM", "services": [ "WAF" ], - "severity": "High", - "text": "If using Azure CNI, check the maximum pods/node (default 30)", - "waf": "Performance" + "severity": "Medium", + "text": "Disks - validate use of Premium SSD disks everywhere: for example, non-prod could swap to Standard SSD or on-demand Premium SSD ", + "waf": "Cost" }, { - "arm-service": "microsoft.containerservice/managedClusters", + "arm-service": "Microsoft.Synapse/workspaces", "checklist": "WAF checklist", - "description": "For internal apps organizations often open the whole AKS subnet in their firewalls. This opens network access to the nodes too, and potentially to the pods as well (if using Azure CNI). If LoadBalancer IPs are in a different subnet, only this one needs to be available to the app clients. Another reason is that if the IP addresses in the AKS subnet are a scarce resource, consuming its IP addresses for services will reduce the maximum scalability of the cluster .", - "guid": "13c00567-4b1e-4945-a459-c373e7ed6162", - "link": "https://learn.microsoft.com/azure/aks/internal-lb", - "service": "AKS", + "guid": "54387e5c-ed12-46cd-832a-f5b2fc6998a5", + "link": "https://learn.microsoft.com/azure/reliability/availability-zones-overview", + "service": "Synapse", "services": [ - "VNet", - "AKS", + "Monitor", + "EventHubs", + "Cost", "WAF" ], - "severity": "Low", - "text": "If using private-IP LoadBalancer services, use a dedicated subnet (not the AKS subnet)", - "waf": "Security" + "severity": "Medium", + "text": "Create budgets to manage costs and create alerts that automatically notify stakeholders of spending anomalies and overspending risks.", + "waf": "Cost" }, { - "arm-service": "microsoft.containerservice/managedClusters", + "arm-service": "Microsoft.Synapse/workspaces", "checklist": "WAF checklist", - "guid": "43f63047-22d9-429c-8b1c-d622f54b29ba", - "link": "https://learn.microsoft.com/azure/aks/configure-azure-cni", - "service": "AKS", + "guid": "35e33789-7e31-4c67-b68c-f6a62a119495", + "link": "https://learn.microsoft.com/azure/virtual-machines/availability", + "service": "Synapse", "services": [ - "WAF" + "Storage", + "WAF", + "Cost" ], - "severity": "High", - "text": "Size the service IP address range accordingly (it is going to limit the cluster scalability)", - "waf": "Reliability" + "severity": "Medium", + "text": "Export cost data to a storage account for additional data analysis.", + "waf": "Cost" }, { - "arm-service": "microsoft.containerservice/managedClusters", + "arm-service": "Microsoft.Synapse/workspaces", "checklist": "WAF checklist", - "guid": "57bf217f-6dc8-481c-81e2-785773e9c00f", - "link": "https://learn.microsoft.com/azure/aks/use-byo-cni", - "service": "AKS", + "guid": "6d697dc3-a2ed-427b-8d18-6f1a1252bddd", + "link": "https://learn.microsoft.com/azure/load-balancer/load-balancer-overview", + "service": "Synapse", "services": [ + "Cost", + "SQL", "WAF" ], - "severity": "Low", - "text": "If required add your own CNI plugin", - "waf": "Security" + "severity": "Medium", + "text": "Control costs for a dedicated SQL pool by pausing the resource when it is not in use.", + "waf": "Cost" }, { - "arm-service": "microsoft.containerservice/managedClusters", + "arm-service": "Microsoft.Synapse/workspaces", "checklist": "WAF checklist", - "guid": "4b3bb365-9458-44d9-9ed1-5c8f52890364", - "link": "https://learn.microsoft.com/azure/aks/use-multiple-node-pools#assign-a-public-ip-per-node-for-your-node-pools", - "service": "AKS", + "guid": "e68a487c-dec4-4861-ac3b-c10ae77e26e4", + "link": "https://learn.microsoft.com/azure/virtual-machine-scale-sets/overview", + "service": "Synapse", "services": [ - "AKS", "WAF" ], - "severity": "Low", - "text": "If required configure Public IP per node in AKS", - "waf": "Performance" + "severity": "Medium", + "text": "Enable the serverless Apache Spark automatic pause feature and set your timeout value accordingly.", + "waf": "Cost" }, { - "arm-service": "microsoft.containerservice/managedClusters", + "arm-service": "Microsoft.Synapse/workspaces", "checklist": "WAF checklist", - "guid": "b3808b9f-a1cf-4204-ad01-3a923ce474db", - "link": "https://learn.microsoft.com/azure/aks/concepts-network", - "service": "AKS", + "guid": "d5a3bec2-c4e2-4436-a133-6db55f17960e", + "link": "https://learn.microsoft.com/azure/frontdoor/best-practices#use-latest-version-for-customer-managed-certificates", + "service": "Synapse", "services": [ "WAF" ], "severity": "Medium", - "text": "Use an ingress controller to expose web-based apps instead of exposing them with LoadBalancer-type services", - "waf": "Reliability" + "text": "Create multiple Apache Spark pool definitions of various sizes.", + "waf": "Cost" }, { - "arm-service": "microsoft.containerservice/managedClusters", + "arm-service": "Microsoft.Synapse/workspaces", "checklist": "WAF checklist", - "guid": "ccb534e7-416e-4a1d-8e93-533b53199085", - "link": "https://learn.microsoft.com/azure/aks/nat-gateway", - "service": "AKS", + "guid": "ee0bdf5c-c2ef-4c5d-961d-41d2500bb47a", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/ready/landing-zone/design-area/resource-org-management-groups#management-groups-in-the-azure-landing-zone-accelerator", + "service": "Synapse", "services": [ + "Cost", "WAF" ], - "severity": "Low", - "text": "Use Azure NAT Gateway as outboundType for scaling egress traffic", - "waf": "Reliability" + "severity": "Medium", + "text": "Purchase Azure Synapse commit units (SCU) for one year with a pre-purchase plan to save on your Azure Synapse Analytics costs.", + "training": "https://learn.microsoft.com/learn/paths/secure-application-delivery/", + "waf": "Cost" }, { - "arm-service": "microsoft.containerservice/managedClusters", + "arm-service": "Microsoft.Compute/virtualMachines", "checklist": "WAF checklist", - "guid": "8ee9a69a-1b58-4b1e-9c61-476e110a160b", - "link": "https://learn.microsoft.com/azure/aks/configure-azure-cni#dynamic-allocation-of-ips-and-enhanced-subnet-support", - "service": "AKS", + "guid": "393a040f-d329-4479-ab11-88b2c5a46ceb", + "link": "https://learn.microsoft.com/azure/application-gateway/overview-v2", + "service": "VM", "services": [ + "VM", + "Cost", "WAF" ], "severity": "Medium", - "text": "Use Dynamic allocations of IPs in order to avoid Azure CNI IP exhaustion", - "waf": "Reliability" + "text": "Use Spot VMs for interruptible jobs: These are VMs that can be bid on and purchased at a discounted price, providing a cost-effective solution for non-critical workloads.", + "training": "https://learn.microsoft.com/learn/paths/secure-application-delivery/", + "waf": "Cost" }, { - "arm-service": "microsoft.containerservice/managedClusters", + "arm-service": "Microsoft.Compute/virtualMachines", "checklist": "WAF checklist", - "graph": "where type=='microsoft.containerservice/managedclusters' | extend compliant = (properties.networkProfile.outboundType=='userDefinedRouting') | distinct id,compliant", - "guid": "3b365a91-7ecb-4e48-bbe5-4cd7df2e8bba", - "link": "https://learn.microsoft.com/azure/aks/limit-egress-traffic", - "service": "AKS", + "guid": "544451e1-92d3-4442-a3c7-628637a551c5", + "link": "https://learn.microsoft.com/azure/load-balancer/load-balancer-overview", + "service": "VM", "services": [ - "NVA", + "VM", "WAF" ], - "severity": "High", - "text": "Filter egress traffic with AzFW/NVA if your security requirements mandate it", - "waf": "Security" + "severity": "Medium", + "text": "Right-sizing all VMs", + "waf": "Cost" }, { - "arm-service": "microsoft.containerservice/managedClusters", + "arm-service": "Microsoft.Compute/virtualMachines", "checklist": "WAF checklist", - "graph": "where type=='microsoft.containerservice/managedclusters' | extend compliant = ((isnull(properties.apiServerAccessProfile.enablePrivateCluster) or properties.apiServerAccessProfile.enablePrivateCluster==false) and isnotnull(properties.apiServerAccessProfile.authorizedIPRanges)) | distinct id,compliant", - "guid": "c4581559-bb91-463e-a908-aed8c44ce3b2", - "link": "https://learn.microsoft.com/azure/aks/api-server-authorized-ip-ranges", - "service": "AKS", + "guid": "b04e4f18-5438-47e5-aed1-26cd032af5b2", + "link": "https://learn.microsoft.com/azure/application-gateway/configuration-infrastructure#size-of-the-subnet", + "service": "VM", "services": [ + "VM", "WAF" ], "severity": "Medium", - "text": "If using a public API endpoint, restrict the IP addresses that can access it", - "waf": "Security" + "text": "Swap VM sized with normalized and most recent sizes", + "training": "https://learn.microsoft.com/learn/paths/secure-application-delivery/", + "waf": "Cost" }, { - "arm-service": "microsoft.containerservice/managedClusters", + "arm-service": "Microsoft.Compute/virtualMachines", "checklist": "WAF checklist", - "graph": "where type=='microsoft.containerservice/managedclusters' | where isnotnull(properties.apiServerAccessProfile.enablePrivateCluster) | extend compliant = (properties.apiServerAccessProfile.enablePrivateCluster==true) | distinct id, compliant", - "guid": "ecccd979-3b6b-4cda-9b50-eb2eb03dda6d", - "link": "https://learn.microsoft.com/azure/aks/private-clusters", - "service": "AKS", + "guid": "fc6998a5-35e3-4378-a7e3-1c67d68cf6a6", + "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/ag-overview", + "service": "VM", "services": [ + "VM", + "Monitor", "WAF" ], - "severity": "High", - "text": "Use private clusters if your requirements mandate it", - "waf": "Security" + "severity": "Medium", + "text": "right-sizing VMs - start with monitoring usage below 5% and then work up to 40%", + "training": "https://learn.microsoft.com/learn/paths/secure-application-delivery/", + "waf": "Cost" }, { - "arm-service": "microsoft.containerservice/managedClusters", + "arm-service": "Microsoft.Compute/virtualMachines", "checklist": "WAF checklist", - "graph": "where type=='microsoft.containerservice/managedclusters' | where isnotnull(properties.apiServerAccessProfile.enablePrivateCluster) | extend compliant = (properties.apiServerAccessProfile.enablePrivateCluster==true) | distinct id, compliant", - "guid": "ce7f2a7c-297c-47c6-adea-a6ff838db665", - "link": "https://learn.microsoft.com/azure/aks/use-network-policies", - "service": "AKS", + "guid": "2a119495-6d69-47dc-9a2e-d27b2d186f1a", + "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/ag-overview", + "service": "VM", "services": [ - "AKS", - "AzurePolicy", + "VM", "WAF" ], "severity": "Medium", - "text": "For Windows 2019 and 2022 AKS nodes Calico Network Policies can be used ", - "waf": "Security" + "text": "Containerizing an application can improve VM density and save money on scaling it", + "training": "https://learn.microsoft.com/learn/paths/secure-networking-infrastructure/", + "waf": "Cost" }, { - "arm-service": "microsoft.containerservice/managedClusters", + "arm-service": "Microsoft.Search/searchServices", "checklist": "WAF checklist", - "graph": "where type=='microsoft.containerservice/managedclusters' | extend compliant = isnotnull(properties.networkProfile.networkPolicy) | distinct id,compliant", - "guid": "58d7c892-ddb1-407d-9769-ae669ca48e4a", - "link": "https://learn.microsoft.com/azure/aks/use-network-policies", - "service": "AKS", + "guid": "41faa1ed-b7f0-447d-8cba-4a4905e5bb83", + "link": "https://learn.microsoft.com/azure/search/search-reliability#high-availability", + "service": "Cognitive Search", "services": [ - "AKS", - "AzurePolicy", "WAF" ], "severity": "High", - "text": "Enable a Kubernetes Network Policy option (Calico/Azure)", - "waf": "Security" + "text": "Enable 2 replicas to have 99.9% availability for read operations", + "waf": "Reliability" }, { - "arm-service": "microsoft.containerservice/managedClusters", + "arm-service": "Microsoft.Search/searchServices", "checklist": "WAF checklist", - "guid": "85e2223e-ce8b-4b12-907c-a5f16f158e3e", - "link": "https://learn.microsoft.com/azure/aks/operator-best-practices-network", - "service": "AKS", + "guid": "7d956fd9-788a-4845-9b9f-c0340972d810", + "link": "https://learn.microsoft.com/azure/search/search-reliability#high-availability", + "service": "Cognitive Search", "services": [ - "AKS", - "AzurePolicy", "WAF" ], - "severity": "High", - "text": "Use Kubernetes network policies to increase intra-cluster security", - "waf": "Security" + "severity": "Medium", + "text": "Enable 3 replicas to have 99.9% availability for read/write operations", + "waf": "Reliability" }, { - "arm-service": "microsoft.containerservice/managedClusters", + "arm-service": "Microsoft.Search/searchServices", "checklist": "WAF checklist", - "guid": "a3a92c2d-e7e2-4165-a3a8-7af4a7a1f893", - "link": "https://learn.microsoft.com/azure/aks/operator-best-practices-network", - "service": "AKS", + "guid": "44dc5f2b-a032-4d03-aae8-90c3f2c0a4c3", + "link": "https://learn.microsoft.com/azure/search/search-reliability#availability-zone-support", + "service": "Cognitive Search", "services": [ "WAF" ], "severity": "High", - "text": "Use a WAF for web workloads (UIs or APIs)", - "waf": "Security" + "text": "Leverage Availability Zones by enabling read and/or write replicas", + "waf": "Reliability" }, { - "arm-service": "microsoft.containerservice/managedClusters", + "arm-service": "Microsoft.Search/searchServices", "checklist": "WAF checklist", - "graph": "Resources | where type=~'microsoft.containerservice/managedclusters' | project resourceGroup,name,pools=properties.agentPoolProfiles | mv-expand pools | project subnetId=tostring(pools.vnetSubnetID) | where isnotempty(subnetId) | join (Resources | where type=='microsoft.network/virtualnetworks' | project id,resourceGroup,name,enableDdosProtection=tostring(properties.enableDdosProtection),subnets=properties.subnets | mv-expand subnets | project id,resourceGroup,name,enableDdosProtection,subnetId=tostring(subnets.id)) on subnetId | distinct id,resourceGroup,name,enableDdosProtection | extend compliant = (enableDdosProtection == 'true')", - "guid": "9bda4776-8f24-4c11-9775-c2ea55b46a94", - "link": "https://learn.microsoft.com/azure/virtual-network/ddos-protection-overview", - "service": "AKS", + "guid": "cd0730f0-0ff1-4b77-9a2b-2a1f7dd5e291", + "link": "https://learn.microsoft.com/azure/search/search-reliability#multiple-services-in-separate-geographic-regions", + "service": "Cognitive Search", "services": [ - "AKS", - "VNet", - "DDoS", + "ACR", "WAF" ], "severity": "Medium", - "text": "Use DDoS Standard in the AKS Virtual Network", - "waf": "Security" + "text": "For regional redudancy, Manually create services in 2 or more regions for Search as it doesn't provide an automated method of replicating search indexes across geographic regions", + "waf": "Reliability" }, { - "arm-service": "microsoft.containerservice/managedClusters", + "arm-service": "Microsoft.Search/searchServices", "checklist": "WAF checklist", - "graph": "Resources | where type=~'microsoft.containerservice/managedclusters' | project resourceGroup,name,pools=properties.agentPoolProfiles | mv-expand pools | project subnetId=tostring(pools.vnetSubnetID) | where isnotempty(subnetId) | join (Resources | where type=='microsoft.network/virtualnetworks' | project id,resourceGroup,name,enableDdosProtection=tostring(properties.enableDdosProtection),subnets=properties.subnets | mv-expand subnets | project id,resourceGroup,name,enableDdosProtection,subnetId=tostring(subnets.id)) on subnetId | distinct id,resourceGroup,name,enableDdosProtection | extend compliant = (enableDdosProtection == 'true')", - "guid": "6c46b91a-1107-4485-ad66-3183e2a8c266", - "link": "https://learn.microsoft.com/azure/aks/http-proxy", - "service": "AKS", + "guid": "3c964882-aec9-4d44-9f68-4b5f2efbbdb6", + "link": "https://learn.microsoft.com/azure/search/search-reliability#synchronize-data-across-multiple-services", + "service": "Cognitive Search", "services": [ + "ACR", "WAF" ], - "severity": "Low", - "text": "If required add company HTTP Proxy", - "waf": "Security" + "severity": "Medium", + "text": "To synchronize data across multiple services either Use indexers for updating content on multiple services or Use REST APIs for pushing content updates on multiple services", + "waf": "Reliability" }, { - "arm-service": "microsoft.containerservice/managedClusters", + "arm-service": "Microsoft.Search/searchServices", "checklist": "WAF checklist", - "guid": "e9855d04-c3c3-49c9-a6bb-2c12159a114b", - "link": "https://learn.microsoft.com/azure/aks/servicemesh-about", - "service": "AKS", + "guid": "85ee93c9-f53c-4803-be51-e6e4aa37ff4e", + "link": "https://learn.microsoft.com/azure/search/search-reliability#use-azure-traffic-manager-to-coordinate-requests", + "service": "Cognitive Search", "services": [ + "TrafficManager", "WAF" ], "severity": "Medium", - "text": "Consider using a service mesh for advanced microservice communication management", - "waf": "Security" + "text": "Use Azure Traffic Manager to coordinate requests", + "waf": "Reliability" }, { - "arm-service": "microsoft.containerservice/managedClusters", + "arm-service": "Microsoft.Search/searchServices", "checklist": "WAF checklist", - "guid": "67f7a9ed-5b31-4f38-a3f3-9812b2463cff", - "link": "https://learn.microsoft.com/azure/azure-monitor/insights/container-insights-metric-alerts", - "service": "AKS", + "guid": "7be10278-57c1-4a61-8ee3-895aebfec5aa", + "link": "https://learn.microsoft.com/azure/search/search-reliability#back-up-and-restore-alternatives", + "service": "Cognitive Search", "services": [ - "Monitor", - "WAF" + "Storage", + "WAF", + "Backup" ], "severity": "High", - "text": "Configure alerts on the most critical metrics (see Container Insights for recommendations)", - "waf": "Operations" + "text": "Backup and Restore an Azure Cognitive Search Index. Use this sample code to back up index definition and snapshot to a series of Json files", + "waf": "Reliability" }, { - "arm-service": "microsoft.containerservice/managedClusters", + "arm-service": "Microsoft.Kusto/clusters", "checklist": "WAF checklist", - "guid": "337453a3-cc63-4963-9a65-22ac19e80696", - "link": "https://learn.microsoft.com/azure/advisor/advisor-get-started", - "service": "AKS", + "description": "Using the correct approach to feed a datalake with cold data and having the Kusto query engine at your disposal at the same time, as in the short-term storage", + "guid": "ba7da7be-9951-4914-a384-5d997cb39132", + "link": "https://learn.microsoft.com/azure/data-explorer/kusto/management/data-export/continuous-data-export", + "service": "Azure Data Explorer", "services": [ - "Entra", - "WAF" + "Storage", + "WAF", + "Cost" ], - "severity": "Low", - "text": "Check regularly Azure Advisor for recommendations on your cluster", - "waf": "Operations" + "text": "Leverage External Tables and Continuous data export overview to reduce costs", + "waf": "Reliability" }, { - "arm-service": "microsoft.containerservice/managedClusters", + "arm-service": "Microsoft.Kusto/clusters", "checklist": "WAF checklist", - "guid": "3aa70560-e7e7-4968-be3d-628af35b2ced", - "link": "https://learn.microsoft.com/azure/aks/certificate-rotation", - "service": "AKS", + "description": "Azure Data Explorer provides an optional follower capability for a leader cluster to be followed by other follower clusters for read-only access to the leader's data and metadata. Changes in the leader, such as create, append, and drop are automatically synchronized to the follower. While the leaders could span Azure regions, the follower clusters should be hosted in the same region(s) as the leader. If the leader cluster is down or databases or tables are accidentally dropped, the follower clusters will lose access until access is recovered in the leader.", + "guid": "56a22586-f490-4641-addd-ea8a377cdeb3", + "link": "https://learn.microsoft.com/azure/data-explorer/follower?tabs=csharp", + "service": "Azure Data Explorer", "services": [ - "AKS", + "Storage", "WAF" ], - "severity": "Low", - "text": "Enable AKS auto-certificate rotation", - "waf": "Operations" + "text": "To share data, explore Leader-follower cluster configuration", + "waf": "Reliability" }, { - "arm-service": "microsoft.containerservice/managedClusters", + "arm-service": "Microsoft.Kusto/clusters", "checklist": "WAF checklist", - "guid": "e189c599-df0d-45a7-9dd4-ce32c1881370", - "link": "https://learn.microsoft.com/azure/aks/supported-kubernetes-versions", - "service": "AKS", + "description": "Azure Data Explorer doesn't support automatic protection against the outage of an entire Azure region. This disruption can happen during a natural disaster, like an earthquake. If you require a solution for a disaster recovery situation, do the following steps to ensure business continuity. In these steps, you'll replicate your clusters, management, and data ingestion in two Azure paired regions.", + "guid": "861bb2bc-14ae-4a6e-95d8-d9a3adc218e6", + "link": "https://learn.microsoft.com/azure/data-explorer/business-continuity-create-solution#create-multiple-independent-clusters", + "service": "Azure Data Explorer", "services": [ - "AKS", + "ASR", "WAF" ], - "severity": "High", - "text": "Have a regular process to upgrade your kubernetes version periodically (quarterly, for example), or use the AKS autoupgrade feature", - "waf": "Operations" + "text": "To protect against regional failure, create Multiple independent clusters, preferably in two Azure Paired regions", + "waf": "Reliability" }, { - "arm-service": "microsoft.containerservice/managedClusters", + "arm-service": "Microsoft.Kusto/clusters", "checklist": "WAF checklist", - "guid": "6f7c4c0d-4e51-4464-ad24-57ed67138b82", - "link": "https://learn.microsoft.com/azure/aks/node-updates-kured", - "service": "AKS", + "guid": "436b0635-cb45-4e57-a603-324ace8cc123", + "link": "https://learn.microsoft.com/azure/data-explorer/business-continuity-create-solution#replicate-management-activities", + "service": "Azure Data Explorer", "services": [ + "RBAC", + "Storage", "WAF" ], - "severity": "High", - "text": "Use kured for Linux node upgrades in case you are not using node-image upgrade", - "waf": "Operations" + "text": "Replicate all management activities such as creating new tables or managing user roles on each cluster.", + "waf": "Reliability" }, { - "arm-service": "microsoft.containerservice/managedClusters", + "arm-service": "Microsoft.Kusto/clusters", "checklist": "WAF checklist", - "guid": "139c9580-ade3-426a-ba09-cf157d9f6477", - "link": "https://learn.microsoft.com/azure/aks/node-image-upgrade", - "service": "AKS", + "guid": "18ca6017-0265-4f4b-a46a-393af7f31728", + "link": "https://learn.microsoft.com/azure/data-explorer/business-continuity-create-solution", + "service": "Azure Data Explorer", "services": [ "WAF" ], - "severity": "High", - "text": "Have a regular process to upgrade the cluster node images periodically (weekly, for example)", - "waf": "Operations" + "text": "Ingest data into each cluster in parallel", + "waf": "Reliability" }, { - "arm-service": "microsoft.containerservice/managedClusters", + "arm-service": "Microsoft.Kusto/clusters", "checklist": "WAF checklist", - "guid": "0102ce16-ee30-41e6-b882-e52e4621dd68", - "link": "https://learn.microsoft.com/azure/architecture/example-scenario/bedrock/bedrock-automated-deployments", - "service": "AKS", + "description": "This configuration is also called 'always-on'. For critical application deployments with no tolerance for outages, you should use multiple Azure Data Explorer clusters across Azure paired regions.", + "guid": "58a9c279-9c42-4bb6-9d0c-65556246b338", + "link": "https://learn.microsoft.com/azure/data-explorer/business-continuity-overview#active-active-active-configuration", + "service": "Azure Data Explorer", "services": [ + "ACR", "WAF" ], - "severity": "Low", - "text": "Consider gitops to deploy applications or cluster configuration to multiple clusters", - "waf": "Operations" + "text": "For critical application with no tolerance for outages, create Active-Active-Active (always-on) configuration", + "waf": "Reliability" }, { - "arm-service": "microsoft.containerservice/managedClusters", + "arm-service": "Microsoft.Kusto/clusters", "checklist": "WAF checklist", - "guid": "d7672c26-7602-4482-85a4-14527fbe855c", - "link": "https://learn.microsoft.com/azure/aks/command-invoke", - "service": "AKS", + "description": "This configuration is identical to the active-active-active configuration, but only involves two Azure paired regions. Configure dual ingestion, processing, and curation. Users are routed to the nearest region. The cluster SKU must be the same across regions.", + "guid": "563a4dc7-4a74-48b6-922a-d190916a6649", + "link": "https://learn.microsoft.com/azure/data-explorer/business-continuity-overview#active-active-configuration", + "service": "Azure Data Explorer", "services": [ - "AKS", + "ACR", "WAF" ], - "severity": "Low", - "text": "Consider using AKS command invoke on private clusters", - "waf": "Operations" + "text": "For critical applications, create Active-Active configuration in two paired regions", + "waf": "Reliability" }, { - "arm-service": "microsoft.containerservice/managedClusters", + "arm-service": "Microsoft.Kusto/clusters", "checklist": "WAF checklist", - "guid": "31d7aaab-7571-4449-ab80-53d89e89d17b", - "link": "https://learn.microsoft.com/azure/aks/node-auto-repair#node-autodrain", - "service": "AKS", + "description": "The Active-Hot configuration is similar to the Active-Active configuration in dual ingest, processing, and curation. While the standby cluster is online for ingestion, process, and curation, it isn't available to query. The standby cluster doesn't need to be in the same SKU as the primary cluster. It can be of a smaller SKU and scale, which may result in it being less performant. In a disaster scenario, users are redirected to the standby cluster, which can optionally be scaled up to increase performance.", + "guid": "8fadfe27-7de2-483b-8ac3-52baa9b75708", + "link": "https://learn.microsoft.com/azure/data-explorer/business-continuity-overview#active-hot-standby-configuration", + "service": "Azure Data Explorer", "services": [ "WAF" ], - "severity": "Low", - "text": "For planned events consider using Node Auto Drain", - "waf": "Operations" + "text": "For applications, which required only read during failure, create Active-Hot standby configuration", + "waf": "Reliability" }, { - "arm-service": "microsoft.containerservice/managedClusters", + "arm-service": "Microsoft.Kusto/clusters", "checklist": "WAF checklist", - "guid": "ed0fda7f-211b-47c7-8b6e-c18873fb473c", - "link": "https://learn.microsoft.com/azure/aks/faq", - "service": "AKS", + "description": "This solution offers the least resiliency (highest RPO and RTO), is the lowest in cost and highest in effort. In this configuration, there's no data recovery cluster. Configure continuous export of curated data (unless raw and intermediate data is also required) to a storage account that is configured GRS (Geo Redundant Storage). A data recovery cluster is spun up if there is a disaster recovery scenario. At that time, DDLs, configuration, policies, and processes are applied. Data is ingested from storage with the ingestion property kustoCreationTime to over-ride the ingestion time that defaults to system time.", + "guid": "49aa8092-dc8e-4b9d-8bb7-3b26a5a67eba", + "link": "https://learn.microsoft.com/azure/data-explorer/business-continuity-overview#on-demand-data-recovery-configuration", + "service": "Azure Data Explorer", "services": [ - "WAF" + "Storage", + "AzurePolicy", + "WAF", + "ASR", + "Cost" ], - "severity": "High", - "text": "Develop own governance practices to make sure no changes are performed by operators in the node RG (aka 'infra RG')", - "waf": "Operations" + "text": "For applications, where cost is a concern and can withstand some downtime during failure, create on-demand data recovery cluster configuration", + "waf": "Reliability" }, { - "arm-service": "microsoft.containerservice/managedClusters", + "arm-service": "Microsoft.Kusto/clusters", "checklist": "WAF checklist", - "graph": "where type=='microsoft.containerservice/managedclusters' | extend compliant = (properties.nodeResourceGroup !startswith 'MC_') | distinct id,compliant", - "guid": "73b32a5a-67f7-4a9e-b5b3-1f38c3f39812", - "link": "https://learn.microsoft.com/azure/aks/cluster-configuration", - "service": "AKS", + "description": "All database objects, policies, and configurations should be persisted in source control so they can be released to the cluster from your release automation tool.", + "guid": "5a907e1e-348e-4f25-9c27-d32e8bbac757", + "link": "https://learn.microsoft.com/azure/data-explorer/devops", + "service": "Azure Data Explorer", "services": [ - "WAF" + "WAF", + "AzurePolicy" ], - "severity": "Low", - "text": "Use custom Node RG (aka 'Infra RG') name", - "waf": "Operations" + "text": "Wrap DevOps and source control around all your code", + "training": "https://learn.microsoft.com/learn/paths/secure-your-cloud-data/", + "waf": "Reliability" }, { - "arm-service": "microsoft.containerservice/managedClusters", + "arm-service": "Microsoft.Kusto/clusters", "checklist": "WAF checklist", - "guid": "b2463cff-e189-4c59-adf0-d5a73dd4ce32", - "link": "https://kubernetes.io/docs/setup/release/notes/", - "service": "AKS", + "guid": "1559ab91-53e8-4908-ae28-b84c33b6b780", + "link": "https://learn.microsoft.com/azure/data-explorer/devops", + "service": "Azure Data Explorer", "services": [ - "AKS", "WAF" ], - "severity": "Medium", - "text": "Do not use deprecated Kubernetes APIs in your YAML manifests", - "waf": "Operations" + "text": "Design, develop, and implement validation routines to ensure all clusters are in-sync from a data perspective.", + "training": "https://learn.microsoft.com/learn/modules/azure-active-directory/", + "waf": "Reliability" }, { - "arm-service": "microsoft.containerservice/managedClusters", + "arm-service": "Microsoft.Kusto/clusters", "checklist": "WAF checklist", - "guid": "c1881370-6f7c-44c0-b4e5-14648d2457ed", - "link": "https://learn.microsoft.com/azure-stack/aks-hci/adapt-apps-mixed-os-clusters", - "service": "AKS", + "guid": "8b9fe5c4-1049-4d40-9a82-2c3474d00f18", + "link": "https://learn.microsoft.com/azure/data-explorer/devops", + "service": "Azure Data Explorer", "services": [ "WAF" ], - "severity": "Low", - "text": "Taint Windows nodes", - "waf": "Operations" + "text": "Be fully cognizant of what it takes to build a cluster from scratch. Leverage Infrastructure as a Code for your deployments", + "training": "https://learn.microsoft.com/learn/modules/implement-hybrid-identity-windows-server/", + "waf": "Reliability" }, { - "arm-service": "microsoft.containerservice/managedClusters", "checklist": "WAF checklist", - "guid": "67138b82-0102-4ce1-9ee3-01e6e882e52e", - "link": "https://learn.microsoft.com/virtualization/windowscontainers/deploy-containers/version-compatibility?tabs=windows-server-20H2%2Cwindows-10-20H2", - "service": "AKS", + "guid": "bb235c70-5e17-496f-bedf-a8a4c8cdec4c", + "link": "https://learn.microsoft.com/entra/identity-platform/msal-acquire-cache-tokens", + "service": "Entra", "services": [ + "Entra", "WAF" ], - "severity": "Low", - "text": "Keep windows containers patch level in sync with host patch level", - "waf": "Operations" + "severity": "Medium", + "text": "Use long-live revocable token, cache your token and acquire your silently using Microsoft Identity Library", + "waf": "Reliability" }, { - "arm-service": "microsoft.containerservice/managedClusters", "checklist": "WAF checklist", - "description": "Via Diagnostic Settings at the cluster level", - "guid": "5b56ad48-408f-4e72-934c-476ba280dcf5", - "link": "https://learn.microsoft.com/azure/aks/monitor-aks", - "service": "AKS", + "guid": "503547c1-447e-4c66-828a-71f0f1ce16dd", + "link": "https://learn.microsoft.com/azure/active-directory-b2c/deploy-custom-policies-devops", + "service": "AAD B2C", "services": [ - "Monitor", "WAF" ], - "severity": "Low", - "text": "Send master logs (aka API logs) to Azure Monitor or your preferred log management solution", - "waf": "Operations" + "severity": "Medium", + "text": "Make sure that your sign-in user flows are backed up and resilient. Make sure that the code that you use to sign-in your users are backed up and recoverable. Resilient interfaces with external processes", + "waf": "Reliability" }, { - "arm-service": "microsoft.containerservice/managedClusters", "checklist": "WAF checklist", - "guid": "64d1a846-e28a-4b6b-9a33-22a635c15a21", - "link": "https://learn.microsoft.com/azure/aks/node-pool-snapshot", - "service": "AKS", + "guid": "3e3553a4-c873-4964-ab66-2d6c15f51296", + "link": "https://learn.microsoft.com/entra/architecture/resilient-end-user-experience#use-a-content-delivery-network", + "service": "AAD B2C", "services": [ "WAF" ], - "severity": "Low", - "text": "If required use nodePool snapshots", - "waf": "Cost" + "severity": "Medium", + "text": "Custom brand assets should be hosted on a CDN", + "waf": "Performance" }, { - "arm-service": "microsoft.containerservice/managedClusters", "checklist": "WAF checklist", - "guid": "c5a5b252-1e44-4a59-a9d2-399c4d7b68d0", - "link": "https://learn.microsoft.com/azure/aks/spot-node-pool", - "service": "AKS", + "guid": "5398e6df-d237-4de1-93b1-6c21d79a9b64", + "link": "https://learn.microsoft.com/entra/identity/monitoring-health/reference-sla-performance", + "service": "AAD B2C", "services": [ "WAF" ], "severity": "Low", - "text": "Consider spot node pools for non time-sensitive workloads", - "waf": "Operations" + "text": "Have multiple identiy providers (i.e., login with your microsoft, google, facebook accounts)", + "waf": "Reliability" }, { - "arm-service": "microsoft.containerservice/managedClusters", "checklist": "WAF checklist", - "graph": "where type=='microsoft.containerservice/managedclusters' | extend compliant = (isnotnull(properties.addonProfiles.aciConnectorLinux) and properties.addonProfiles.aciConnectorLinux.enabled==true) | distinct id,compliant", - "guid": "c755562f-2b4e-4456-9b4d-874a748b662e", - "link": "https://learn.microsoft.com/azure/aks/concepts-scale", - "service": "AKS", + "guid": "604489a8-f42d-478e-98c0-7a73b22a4a57", + "link": "https://azure.microsoft.com/blog/setting-up-active-directory-for-a-disaster-recovery-environment-2/", + "service": "Windows AD", "services": [ - "AKS", + "VM", "WAF" ], - "severity": "Low", - "text": "Consider AKS virtual node for quick bursting", - "waf": "Operations" + "severity": "Medium", + "text": "Follow VM rules for high availability on the VM level (premium disks, two or more in a region, in different availability zones)", + "waf": "Reliability" }, { - "arm-service": "microsoft.containerservice/managedClusters", "checklist": "WAF checklist", - "guid": "6f8389a7-f82c-4b8e-a8c0-aa63a25a4956", - "link": "https://learn.microsoft.com/azure/azure-monitor/insights/container-insights-overview", - "service": "AKS", + "guid": "e7a8dd4a-30e3-47c3-b297-11b2362ceee0", + "link": "https://azure.microsoft.com/blog/setting-up-active-directory-for-a-disaster-recovery-environment-2/", + "service": "Windows AD", "services": [ - "Monitor", "WAF" ], - "severity": "High", - "text": "Monitor your cluster metrics with Container Insights (or other tools like Prometheus)", - "waf": "Operations" + "severity": "Medium", + "text": "Don't replicate! Replication can create issues with directory synchronization", + "waf": "Reliability" }, { - "arm-service": "microsoft.containerservice/managedClusters", "checklist": "WAF checklist", - "graph": "where type=='microsoft.containerservice/managedclusters' | extend compliant = (isnotnull(properties.addonProfiles.omsagent) and properties.addonProfiles.omsagent.enabled==true) | distinct id,compliant", - "guid": "eaa8dc4a-2436-47b3-9697-15b1752beee0", - "link": "https://learn.microsoft.com/azure/azure-monitor/insights/container-insights-overview", - "service": "AKS", + "guid": "79b598de-fc59-472c-b4cd-21b078036f5e", + "link": "https://azure.microsoft.com/blog/setting-up-active-directory-for-a-disaster-recovery-environment-2/", + "service": "Windows AD", "services": [ "WAF" ], - "severity": "High", - "text": "Store and analyze your cluster logs with Container Insights (or other tools like Telegraf/ElasticSearch)", - "waf": "Operations" + "severity": "Medium", + "text": "Have active-active for multi-regions", + "waf": "Reliability" }, { - "arm-service": "microsoft.containerservice/managedClusters", "checklist": "WAF checklist", - "guid": "4621dd68-c5a5-4be2-bdb1-1726769ef669", - "link": "https://learn.microsoft.com/azure/azure-monitor/containers/container-insights-analyze", - "service": "AKS", + "guid": "6b4bfd3d-5035-447c-8447-ec66128a71f0", + "link": "https://learn.microsoft.com/entra/identity/domain-services/tutorial-perform-disaster-recovery-drill", + "service": "Entra", "services": [ - "Monitor", + "Entra", "WAF" ], "severity": "Medium", - "text": "Monitor CPU and memory utilization of the nodes", - "waf": "Operations" + "text": "Add Azure AD Domain service stamps to additional regions and locations", + "waf": "Reliability" }, { - "arm-service": "microsoft.containerservice/managedClusters", "checklist": "WAF checklist", - "guid": "1a4835ac-9422-423e-ae80-b123081a5417", - "link": "https://learn.microsoft.com/azure/aks/configure-azure-cni", - "service": "AKS", + "guid": "f1ce16dd-3f1d-45e8-92e4-2e3611cc58b4", + "link": "https://learn.microsoft.com/entra/identity/domain-services/tutorial-perform-disaster-recovery-drill", + "service": "Entra", "services": [ - "Monitor", "WAF" ], "severity": "Medium", - "text": "If using Azure CNI, monitor % of pod IPs consumed per node", - "waf": "Operations" + "text": "Use Replica Sets for DR", + "waf": "Reliability" }, { - "arm-service": "microsoft.containerservice/managedClusters", + "arm-service": "microsoft.documentdb/databaseAccounts", "checklist": "WAF checklist", - "description": "I/O in the OS disk is a critical resource. If the OS in the nodes gets throttled on I/O, this could lead to unpredictable behavior, typically ending up in node being declared NotReady", - "guid": "415833ea-3ad3-4c2d-b733-165c3acbe04b", - "link": "https://learn.microsoft.com/azure/virtual-machines/premium-storage-performance", - "service": "AKS", + "guid": "43e52f47-22d9-428c-8b1c-d521e54a29a9", + "link": "https://github.com/Azure/fta-resiliencyplaybooks/blob/main/pass-foundations-playbooks-CosmosDB_v1.docx", + "service": "CosmosDB", "services": [ - "Storage", - "Monitor", - "EventHubs", - "ServiceBus", "WAF" ], "severity": "Medium", - "text": "Monitor OS disk queue depth in nodes", - "waf": "Operations" + "text": "FTA Resiliency Playbook", + "waf": "Reliability" }, { - "arm-service": "microsoft.containerservice/managedClusters", + "arm-service": "microsoft.documentdb/databaseAccounts", "checklist": "WAF checklist", - "guid": "be209d39-fda4-4777-a424-d116785c2fa5", - "link": "https://learn.microsoft.com/azure/aks/load-balancer-standard", - "service": "AKS", + "guid": "de39ac0e-7c28-4dc9-9565-7202bff4564b", + "link": "https://learn.microsoft.com/azure/cosmos-db/high-availability#slas", + "service": "CosmosDB", "services": [ - "LoadBalancer", - "Monitor", - "NVA", "WAF" ], - "severity": "Medium", - "text": "If not using egress filtering with AzFW/NVA, monitor standard ALB allocated SNAT ports", - "waf": "Operations" + "severity": "High", + "text": "Leverage Availablity Zones where regionally applicable and ofcourse if the service offers it", + "waf": "Reliability" }, { - "arm-service": "microsoft.containerservice/managedClusters", + "arm-service": "microsoft.documentdb/databaseAccounts", "checklist": "WAF checklist", - "guid": "74c2ee76-569b-4a79-a57e-dedf91b022c9", - "link": "https://learn.microsoft.com/azure/aks/aks-resource-health", - "service": "AKS", + "guid": "0d934a34-8b26-43e7-bd60-513a3649906e", + "link": "https://learn.microsoft.com/azure/cosmos-db/high-availability#replica-outages", + "service": "CosmosDB", "services": [ - "AKS", "WAF" ], "severity": "Medium", - "text": "Subscribe to resource health notifications for your AKS cluster", - "waf": "Operations" + "text": "Run multiple replicas of the database (>1 ) in Prod", + "waf": "Reliability" }, { - "arm-service": "microsoft.containerservice/managedClusters", + "arm-service": "microsoft.documentdb/databaseAccounts", "checklist": "WAF checklist", - "guid": "b54eb2eb-03dd-4aa3-9927-18e2edb11726", - "link": "https://learn.microsoft.com/azure/aks/operator-best-practices-scheduler", - "service": "AKS", + "description": "Multi-region writes capability allows you to take advantage of the provisioned throughput for your databases and containers across the globe", + "guid": "bad38ead-53cc-47de-8d8a-aab3571449ab", + "link": "https://learn.microsoft.com/azure/cosmos-db/high-availability#multiple-write-regions", + "service": "CosmosDB", "services": [ + "ACR", "WAF" ], - "severity": "High", - "text": "Configure requests and limits in your pod specs", - "waf": "Operations" + "severity": "Medium", + "text": "Leverage Multi-Region Writes", + "waf": "Reliability" }, { - "arm-service": "microsoft.containerservice/managedClusters", + "arm-service": "microsoft.documentdb/databaseAccounts", "checklist": "WAF checklist", - "guid": "769ef669-1a48-435a-a942-223ece80b123", - "link": "https://learn.microsoft.com/azure/aks/operator-best-practices-scheduler", - "service": "AKS", + "description": "Span Cosmos account across two or more regions with multi-region writes", + "guid": "8153d89f-89dc-47b3-9be2-b1a27f7b9e91", + "link": "https://learn.microsoft.com/azure/cosmos-db/high-availability#slas", + "service": "CosmosDB", "services": [ + "ACR", "WAF" ], "severity": "Medium", - "text": "Enforce resource quotas for namespaces", - "waf": "Operations" + "text": "Distribute your data globally", + "waf": "Reliability" }, { - "arm-service": "microsoft.containerservice/managedClusters", + "arm-service": "microsoft.documentdb/databaseAccounts", "checklist": "WAF checklist", - "guid": "081a5417-4158-433e-a3ad-3c2de733165c", - "link": "https://learn.microsoft.com/azure/azure-resource-manager/management/azure-subscription-service-limits", - "service": "AKS", + "description": "Choose from various consistency levels such as Eventual, Consistent Prefix, Session, Bounded Staleness and strong", + "guid": "9f8ea848-25ec-4140-bc32-2758e6ee9ac0", + "link": "https://learn.microsoft.com/azure/cosmos-db/consistency-levels", + "service": "CosmosDB", "services": [ - "Subscriptions", "WAF" ], "severity": "High", - "text": "Ensure your subscription has enough quota to scale out your nodepools", - "waf": "Operations" + "text": "Choose from several well-defined consistency models", + "waf": "Reliability" }, { - "arm-service": "microsoft.containerservice/managedClusters", + "arm-service": "microsoft.documentdb/databaseAccounts", "checklist": "WAF checklist", - "guid": "f4fd0602-7ab5-46f1-b66a-e9dea9654a65", - "link": "https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/", - "service": "AKS", + "description": "Maintain business continuity during regional outages. Azure Cosmos DB supports service-managed failover during a regional outage. During a regional outage, Azure Cosmos DB continues to maintain its latency, availability, consistency, and throughput SLAs. To help make sure that your entire application is highly available, Azure Cosmos DB offers a manual failover API to simulate a regional outage. By using this API, you can carry out regular business continuity drills.", + "guid": "a47e4d1e-bb79-43f9-bf87-69e1032b72fe", + "link": "https://learn.microsoft.com/azure/cosmos-db/how-to-manage-database-account#automatic-failover", + "service": "CosmosDB", "services": [ - "WAF" + "WAF", + "CosmosDB" ], - "severity": "High", - "text": "Configure Liveness and Readiness probes for all deployments", - "waf": "Operations" + "severity": "Medium", + "text": "Enable Service managed failover", + "waf": "Reliability" }, { - "arm-service": "microsoft.containerservice/managedClusters", + "arm-service": "microsoft.documentdb/databaseAccounts", "checklist": "WAF checklist", - "graph": "where type=='microsoft.containerservice/managedclusters' | extend compliant = (isnotnull(properties.autoScalerProfile)) | distinct id,compliant", - "guid": "90ce65de-8e13-4f9c-abd4-69266abca264", - "link": "https://learn.microsoft.com/azure/aks/concepts-scale", - "service": "AKS", + "description": "Azure Cosmos DB automatically takes backups of your data at regular intervals. The automatic backups are taken without affecting the performance or availability of the database operations. All the backups are stored separately in a storage service.", + "guid": "3499c9c1-133d-42f7-a4b1-a5bd06ff1a90", + "link": "https://learn.microsoft.com/azure/cosmos-db/online-backup-and-restore", + "service": "CosmosDB", "services": [ - "WAF" + "Storage", + "WAF", + "CosmosDB", + "Backup" ], "severity": "Medium", - "text": "Use the Cluster Autoscaler", - "waf": "Performance" + "text": "Enable Automatic Backups", + "training": "https://learn.microsoft.com/learn/modules/explore-basic-services-identity-types/", + "waf": "Reliability" }, { - "arm-service": "microsoft.containerservice/managedClusters", + "arm-service": "microsoft.documentdb/databaseAccounts", "checklist": "WAF checklist", - "graph": "where type=='microsoft.containerservice/managedclusters' | extend compliant = (isnotnull(properties.austoscalerProfile)) | distinct id,compliant", - "guid": "831c2872-c693-4b39-a887-a561bada49bc", - "link": "https://learn.microsoft.com/azure/aks/custom-node-configuration", - "service": "AKS", + "description": "This mode is the default backup mode for all existing accounts. In this mode, backup is taken at a periodic interval and the data is restored by creating a request with the support team. In this mode, you configure a backup interval and retention for your account. The maximum retention period extends to a month. The minimum backup interval can be one hour.", + "guid": "a6eb33f6-005c-4d92-9286-7655672d6121", + "link": "https://learn.microsoft.com/azure/cosmos-db/periodic-backup-restore-introduction", + "service": "CosmosDB", "services": [ - "AKS", - "WAF" + "WAF", + "Backup" ], - "severity": "Low", - "text": "Customize node configuration for AKS node pools", - "waf": "Performance" + "severity": "Medium", + "text": "Perform Periodic Backups", + "training": "https://learn.microsoft.com/learn/paths/manage-identity-and-access/", + "waf": "Reliability" }, { - "arm-service": "microsoft.containerservice/managedClusters", + "arm-service": "microsoft.documentdb/databaseAccounts", "checklist": "WAF checklist", - "guid": "faa19bfe-9d55-4d04-a3c4-919ca1b2d121", - "link": "https://learn.microsoft.com/azure/aks/concepts-scale", - "service": "AKS", + "description": "Continous 7 day retention and 30 day retention backups. Azure Cosmos DB performs data backup in the background without consuming any extra provisioned throughput (RUs) or affecting the performance and availability of your database. Continuous backups are taken in every region where the account exists.", + "guid": "d43918a8-cd28-49be-b6b1-7cb8245461e1", + "link": "https://learn.microsoft.com/azure/cosmos-db/continuous-backup-restore-introduction", + "service": "CosmosDB", "services": [ - "WAF" + "WAF", + "CosmosDB", + "Backup" ], "severity": "Medium", - "text": "Use the Horizontal Pod Autoscaler when required", - "waf": "Performance" + "text": "Continous Backup with point-in-time restore in Azure Cosmos DB", + "training": "https://learn.microsoft.com/learn/modules/create-custom-azure-roles-with-rbac/", + "waf": "Reliability" }, { - "arm-service": "microsoft.containerservice/managedClusters", "checklist": "WAF checklist", - "description": "Larger nodes will bring higher performance and features such as ephemeral disks and accelerated networking, but they will increase the blast radius and decrease the scaling granularity", - "guid": "5ae124ba-34df-4585-bcdc-e9bd3bb0cdb3", - "link": "https://blog.cloudtrooper.net/2020/10/23/which-vm-size-should-i-choose-as-aks-node/", - "service": "AKS", + "guid": "4620dc87-e948-4ce8-8426-f3e6e5d7bd85", + "link": "https://learn.microsoft.com/azure/sap/center-sap-solutions/overview", + "service": "SAP", "services": [ + "SAP", "WAF" ], - "severity": "High", - "text": "Consider an appropriate node size, not too large or too small", - "waf": "Performance" + "severity": "Medium", + "text": "Azure Center for SAP solutions (ACSS) is an Azure offering that makes SAP a top-level workload on Azure. ACSS is an end-to-end solution that enables you to create and run SAP systems as a unified workload on Azure and provides a more seamless foundation for innovation. You can take advantage of the management capabilities for both new and existing Azure-based SAP systems.", + "training": "https://learn.microsoft.com/training/modules/explore-azure-center-sap-solutions/?source=recommendations", + "waf": "Operations" }, { - "arm-service": "microsoft.containerservice/managedClusters", "checklist": "WAF checklist", - "guid": "38800e6a-ae01-40a2-9fbc-ae5a06e5462d", - "link": "https://learn.microsoft.com/azure/aks/quotas-skus-regions#service-quotas-and-limits", - "service": "AKS", + "guid": "5d75e99d-624d-4afe-91d9-e17adc580790", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/eslz-platform-automation-and-devops", + "service": "SAP", "services": [ - "AKS", + "SAP", "WAF" ], - "severity": "Low", - "text": "If more than 5000 nodes are required for scalability then consider using an additional AKS cluster", - "waf": "Performance" + "severity": "Medium", + "text": "Azure supports automating SAP deployments in Linux and Windows. SAP Deployment Automation Framework is an open-source orchestration tool that can deploy, install, and maintain SAP environments.", + "training": "https://github.com/Azure/sap-automation", + "waf": "Operations" }, { - "arm-service": "microsoft.containerservice/managedClusters", "checklist": "WAF checklist", - "guid": "9583c0f6-6083-43f6-aa6b-df7102c901bb", - "link": "https://learn.microsoft.com/azure/event-grid/event-schema-aks", - "service": "AKS", + "guid": "d17f6f39-a377-48a2-931f-5ead3ebe33a8", + "link": "https://learn.microsoft.com/azure/well-architected/sap/design-areas/data-platform", + "service": "SAP", "services": [ - "AKS", + "SAP", "WAF" ], - "severity": "Low", - "text": "Consider subscribing to EventGrid Events for AKS automation", - "waf": "Performance" + "severity": "Medium", + "text": "Perform a point-in-time recovery for your production databases at any point and in a time frame that meets your RTO; point-in-time recovery typically includes operator errors deleting data either on the DBMS layer or through SAP, incidentally", + "waf": "Reliability" }, { - "arm-service": "microsoft.containerservice/managedClusters", "checklist": "WAF checklist", - "guid": "c5016d8c-c6c9-4165-89ae-673ef0fff19d", - "link": "https://learn.microsoft.com/azure/aks/manage-abort-operations", - "service": "AKS", + "guid": "c4b8e117-930b-4dbd-ae50-7bc5faf6f91a", + "service": "SAP", "services": [ - "AKS", - "WAF" + "WAF", + "Backup" ], - "severity": "Low", - "text": "For long running operation on an AKS cluster consider event termination", - "waf": "Performance" + "severity": "Medium", + "text": "Test the backup and recovery times to verify that they meet your RTO requirements for restoring all systems simultaneously after a disaster.", + "waf": "Reliability" }, { - "arm-service": "microsoft.containerservice/managedClusters", "checklist": "WAF checklist", - "guid": "c4e37133-f186-4ce1-aed9-9f1b32f6e021", - "link": "https://learn.microsoft.com/azure/aks/use-azure-dedicated-hosts", - "service": "AKS", + "guid": "b651423c-8552-42db-a545-5cb50c05527a", + "link": "https://learn.microsoft.com/azure/reliability/cross-region-replication-azure", + "service": "SAP", "services": [ - "AKS", - "WAF" + "Storage", + "WAF", + "ASR", + "Backup", + "SAP", + "SQL" ], - "severity": "Low", - "text": "If required consider using Azure Dedicated Hosts for AKS nodes", - "waf": "Performance" + "severity": "High", + "text": "You can replicate standard storage between paired regions, but you can't use standard storage to store your databases or virtual hard disks. You can replicate backups only between paired regions that you use. For all your other data, run your replication by using native DBMS features like SQL Server Always On or SAP HANA System Replication. Use a combination of Site Recovery, rsync or robocopy, and other third-party software for the SAP application layer.", + "training": "https://learn.microsoft.com/training/paths/ensure-business-continuity-implement-disaster-recovery/", + "waf": "Reliability" }, { - "arm-service": "microsoft.containerservice/managedClusters", "checklist": "WAF checklist", - "graph": "where type=='microsoft.containerservice/managedclusters' | project id,resourceGroup,name,pools=properties.agentPoolProfiles | mvexpand pools | extend compliant = (pools.osDiskType=='Ephemeral') | project id,name=strcat(name,'-',pools.name), resourceGroup, compliant", - "guid": "24367b33-6971-45b1-952b-eee0b9b588de", - "link": "https://learn.microsoft.com/azure/aks/cluster-configuration", - "service": "AKS", + "guid": "aa208dca-784f-46c6-9014-cc919c542dc9", + "link": "https://learn.microsoft.com/azure/sap/workloads/high-availability-zones", + "service": "SAP", "services": [ + "SAP", "WAF" ], - "severity": "High", - "text": "Use ephemeral OS disks", - "waf": "Performance" + "severity": "Medium", + "text": "When using Azure Availability Zones to achieve high availability, you must consider latency between SAP application servers and database servers. For zones with high latencies, operational procedures need to be in place to ensure that SAP application servers and database servers are running in the same zone at all times.", + "training": "https://learn.microsoft.com/training/modules/implement-high-availability-for-sap-workloads-azure/?source=recommendations", + "waf": "Reliability" }, { - "arm-service": "microsoft.containerservice/managedClusters", "checklist": "WAF checklist", - "guid": "f0ce315f-1120-4166-8206-94f2cf3a4d07", - "link": "https://learn.microsoft.com/azure/virtual-machines/disks-types", - "service": "AKS", + "guid": "ba07c007-1f90-43e9-aa4f-601346b80352", + "link": "https://learn.microsoft.com/azure/expressroute/designing-for-disaster-recovery-with-expressroute-privatepeering", + "service": "SAP", "services": [ - "AKS", - "WAF" + "ASR", + "ExpressRoute", + "WAF", + "VPN" ], "severity": "High", - "text": "For non-ephemeral disks, use high IOPS and larger OS disks for the nodes when running many pods/node since it requires high performance for running multiple pods and will generate huge logs with default AKS log rotation thresholds", - "waf": "Performance" + "text": "Set up ExpressRoute connections from on-premises to the primary and secondary Azure disaster recovery regions. Also, as an alternative to using ExpressRoute, consider setting up VPN connections from on-premises to the primary and secondary Azure disaster recovery regions.", + "training": "https://learn.microsoft.com/azure/expressroute/use-s2s-vpn-as-backup-for-expressroute-privatepeering", + "waf": "Reliability" }, { - "arm-service": "microsoft.containerservice/managedClusters", "checklist": "WAF checklist", - "guid": "39c486ce-d5af-4062-89d5-18bb5fd795db", - "link": "https://learn.microsoft.com/azure/aks/use-ultra-disks", - "service": "AKS", + "guid": "d2b30195-b11d-4a8f-a672-28b2b4169a7c", + "link": "https://learn.microsoft.com/azure/key-vault/general/disaster-recovery-guidance", + "service": "SAP", "services": [ - "Storage", - "AKS", - "WAF" + "ACR", + "WAF", + "AKV" ], "severity": "Low", - "text": "For hyper performance storage option use Ultra Disks on AKS", - "waf": "Performance" + "text": "Replicate key vault contents like certificates, secrets, or keys across regions so you can decrypt data in the DR region.", + "waf": "Reliability" }, { - "arm-service": "microsoft.containerservice/managedClusters", "checklist": "WAF checklist", - "guid": "9f7547c1-747d-4c56-868a-714435bd19dd", - "link": "https://learn.microsoft.com/azure/aks/operator-best-practices-multi-region", - "service": "AKS", + "guid": "05f1101d-250f-40e7-b2a1-b674ab50edbd", + "link": "https://learn.microsoft.com/azure/architecture/guide/sap/sap-s4hana", + "service": "SAP", "services": [ - "Storage", - "SQL", - "WAF" + "VNet", + "SAP", + "WAF", + "ASR" ], "severity": "Medium", - "text": "Avoid keeping state in the cluster, and store data outside (AzStorage, AzSQL, Cosmos, etc)", - "waf": "Performance" + "text": "Peer the primary and disaster recovery virtual networks. For example, for HANA System Replication, an SAP HANA DB virtual network needs to be peered to the disaster recovery site's SAP HANA DB virtual network.", + "waf": "Reliability" }, { - "arm-service": "microsoft.containerservice/managedClusters", "checklist": "WAF checklist", - "guid": "24429eb7-2281-4376-85cc-57b4a4b18142", - "link": "https://learn.microsoft.com/azure/aks/operator-best-practices-storage", - "service": "AKS", + "guid": "d3351bf7-628a-46de-917d-dfc11d3b6b40", + "link": "https://learn.microsoft.com/azure/azure-netapp-files/azure-netapp-files-service-levels", + "service": "SAP", "services": [ "Storage", - "WAF" + "WAF", + "SAP" ], - "severity": "Medium", - "text": "If using AzFiles Standard, consider AzFiles Premium and/or ANF for performance reasons", - "waf": "Performance" + "severity": "Low", + "text": "If you use Azure NetApp Files storage for your SAP deployments, at a minimum, create two Azure NetApp Files accounts in the Premium tier, in two regions.", + "training": "https://learn.microsoft.com/training/modules/choose-service-level-azure-netapp-files-hpc-applications/2-identify-decision-criteria", + "waf": "Reliability" }, { - "arm-service": "microsoft.containerservice/managedClusters", "checklist": "WAF checklist", - "guid": "83958a8c-2689-4b32-ab57-cfc64546135a", - "link": "https://learn.microsoft.com/azure/aks/availability-zones#azure-disk-availability-zone-support", - "service": "AKS", + "guid": "726a1d3e-5508-4a06-9d54-93f4b50040c1", + "link": "https://learn.microsoft.com/azure/sap/workloads/disaster-recovery-sap-guide?tabs=windows", + "service": "SAP", "services": [ - "Storage", "WAF" ], - "severity": "Medium", - "text": "If using Azure Disks and AZs, consider having nodepools within a zone for LRS disk with VolumeBindingMode:WaitForFirstConsumer for provisioning storage in right zone or use ZRS disk for nodepools spanning multiple zones", - "waf": "Performance" + "severity": "High", + "text": "Native database replication technology should be used to synchronize the database in a HA pair.", + "training": "https://learn.microsoft.com/training/modules/implement-disaster-recovery-for-sap-workloads-azure/?source=recommendations", + "waf": "Reliability" }, { - "arm-service": "Microsoft.KeyVault/vaults", "checklist": "WAF checklist", - "guid": "6d37a33b-531c-4a91-871a-b69d8044f04e", - "link": "https://learn.microsoft.com/azure/key-vault/general/best-practices", - "service": "Key Vault", + "guid": "6561f847-3db5-4ff8-9200-5ad3c3b436ad", + "link": "https://learn.microsoft.com/ja-jp/azure/virtual-network/virtual-networks-faq", + "service": "SAP", "services": [ - "AKV", - "Backup", + "VNet", "WAF" ], "severity": "High", - "text": "Familiarize yourself with the Key Vault's best practices such as isolation recommendations, access control, data protection, backup, and logging.", + "text": "The CIDR for the primary virtual network (VNet) shouldn't conflict or overlap with the CIDR of the DR site's VNet", + "training": "https://learn.microsoft.com/training/paths/azure-fundamentals-describe-azure-architecture-services/?source=recommendations", "waf": "Reliability" }, { - "arm-service": "Microsoft.KeyVault/vaults", "checklist": "WAF checklist", - "guid": "7ba4d380-7b9e-4a8b-a0c3-2d8e49c11872", - "link": "https://learn.microsoft.com/azure/key-vault/general/disaster-recovery-guidance", - "service": "Key Vault", + "guid": "0258ed30-fe42-434f-87b9-58f91f908e0a", + "service": "SAP", "services": [ - "AKV", - "ACR", - "WAF" + "VM", + "ASR", + "WAF", + "Entra" ], - "severity": "Medium", - "text": "Key Vault is a managed service and Microsoft will handle the failover within and across region. Familiarize yourself with the Key Vault's availability and redundancy.", + "severity": "High", + "text": "Use Site Recovery to replicate an application server to a DR site. Site Recovery can also help with replicating central-services cluster VMs to the DR site. When you invoke DR, you'll need to reconfigure the Linux Pacemaker cluster on the DR site (for example, replace the VIP or SBD, run corosync.conf, and more).", + "training": "https://learn.microsoft.com/training/paths/ensure-business-continuity-implement-disaster-recovery/", "waf": "Reliability" }, { - "arm-service": "Microsoft.KeyVault/vaults", "checklist": "WAF checklist", - "guid": "17fb86a2-eb45-42a4-9c34-52b92a2a1842", - "link": "https://learn.microsoft.com/azure/key-vault/general/disaster-recovery-guidance#data-replication", - "service": "Key Vault", + "guid": "8300cb30-766b-4084-b126-0dd8fb1269a1", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/eslz-business-continuity-and-disaster-recovery", + "service": "SAP", "services": [ - "AKV", + "SAP", "WAF" ], - "severity": "Medium", - "text": "The contents of your key vault are replicated within the region and to a secondary region at least 150 miles away, but within the same geography to maintain high durability of your keys and secrets. Familiarize yourself with the Key Vault's data replication.", + "severity": "High", + "text": "Consider the availability of SAP software against single points of failure. This includes single points of failure within applications such as DBMSs utilized in SAP NetWeaver and SAP S/4HANA architectures, SAP ABAP and ASCS + SCS. Also, other tools such as SAP Web Dispatcher.", + "training": "https://learn.microsoft.com/training/modules/implement-high-availability-for-sap-workloads-azure/2-explore-high-availability-disaster-recovery-support-azure-for-sap-workloads?source=recommendations", "waf": "Reliability" }, { - "arm-service": "Microsoft.KeyVault/vaults", "checklist": "WAF checklist", - "guid": "614682ca-6e0c-4f34-9f03-c6d3f2b99a32", - "link": "https://learn.microsoft.com/azure/key-vault/general/disaster-recovery-guidance#failover-across-regions", - "service": "Key Vault", + "guid": "56402f11-ccbe-42c3-a2f6-c6f6f38ab579", + "link": "https://learn.microsoft.com/azure/sap/workloads/planning-supported-configurations", + "service": "SAP", "services": [ - "AKV", - "AzurePolicy", + "SAP", "WAF" ], - "severity": "Medium", - "text": "During failover, access policy or firewall configurations and settings can't be changed. The key vault will be in read-only mode during failover. Familiarize yourself with the Key Vault's failover guidance.", + "severity": "High", + "text": "For SAP and SAP databases, consider implementing automatic failover clusters. In Windows, Windows Server Failover Clustering supports failover. In Linux, Linux Pacemaker or third-party tools like SIOS Protection Suite and Veritas InfoScale support failover.", + "training": "https://learn.microsoft.com/training/modules/implement-ha-sap-netweaver-anydb/?source=recommendations", "waf": "Reliability" }, { - "arm-service": "Microsoft.KeyVault/vaults", "checklist": "WAF checklist", - "guid": "9ef2b0d2-3206-4c94-b47a-4f07e6a1c509", - "link": "https://learn.microsoft.com/azure/key-vault/general/backup?tabs=azure-cli#design-considerations", - "service": "Key Vault", + "guid": "afae6bec-2671-49ae-bc69-140b8ec8d320", + "link": "https://learn.microsoft.com/azure/sap/workloads/disaster-recovery-sap-guide?tabs=windows", + "service": "SAP", "services": [ - "AKV", + "VM", "Storage", - "Backup", - "Subscriptions", "WAF" ], - "severity": "Medium", - "text": "When you back up a key vault object, such as a secret, key, or certificate, the backup operation will download the object as an encrypted blob. This blob can't be decrypted outside of Azure. To get usable data from this blob, you must restore the blob into a key vault within the same Azure subscription and Azure geography. Familiarize yourself with the Key Vault's backup and restore guidance.", + "severity": "High", + "text": "Azure doesn't support architectures in which the primary and secondary VMs share storage for DBMS data. For the DBMS layer, the common architecture pattern is to replicate databases at the same time and with different storage stacks than the ones that the primary and secondary VMs use.", + "training": "https://learn.microsoft.com/training/paths/ensure-business-continuity-implement-disaster-recovery/?source=recommendationshttps%3A%2F%2Flearn.microsoft.com%2Fja-jp%2Ftraining%2Fpaths%2Fensure-business-continuity-implement-disaster-recovery%2F%3Fsource%3Drecommendations", "waf": "Reliability" }, { - "arm-service": "Microsoft.KeyVault/vaults", "checklist": "WAF checklist", - "guid": "2df045b1-c0f6-47d3-9a9b-99cf6999684e", - "link": "https://learn.microsoft.com/azure/key-vault/general/soft-delete-overview", - "service": "Key Vault", + "guid": "ac614e95-6767-4bc3-b8a4-9953533da6ba", + "link": "https://learn.microsoft.com/azure/sap/workloads/dbms-guide-general", + "service": "SAP", "services": [ - "AKV", - "WAF" + "Storage", + "WAF", + "SAP" ], "severity": "High", - "text": "If you want protection against accidental or malicious deletion of your secrets, configure soft-delete and purge protection features on your key vault.", + "text": "The DBMS data and transaction/redo log files are stored in Azure supported block storage or Azure NetApp Files. Azure Files or Azure Premium Files isn't supported as storage for DBMS data and/or redo log files with SAP workload.", + "training": "https://learn.microsoft.com/training/modules/explore-azure-databases/2-explore-database-support-azure-for-sap-workloads", "waf": "Reliability" }, { - "arm-service": "Microsoft.KeyVault/vaults", "checklist": "WAF checklist", - "guid": "cbfa96b0-5249-4e6f-947c-d0e79509708c", - "link": "https://learn.microsoft.com/azure/key-vault/general/soft-delete-overview", - "service": "Key Vault", + "guid": "1f737179-8e7f-4e1a-a30c-e5a649a3092b", + "link": "https://learn.microsoft.com/azure/sap/workloads/sap-high-availability-guide-wsfc-shared-disk", + "service": "SAP", "services": [ - "AKV", + "SAP", "WAF" ], - "severity": "Low", - "text": "Key Vault's soft-deleted resources are retained for a set period of 90 calendar days. Familiarize yourself with the Key Vault's soft-delete guidance.", + "severity": "High", + "text": "You can use Azure shared disks in Windows for ASCS + SCS components and specific high-availability scenarios. Set up your failover clusters separately for SAP application layer components and the DBMS layer. Azure doesn't currently support high-availability architectures that combine SAP application layer components and the DBMS layer into one failover cluster.", + "training": "https://learn.microsoft.com/training/modules/implement-ha-sap-netweaver-anydb/?source=recommendations", "waf": "Reliability" }, { - "arm-service": "Microsoft.KeyVault/vaults", "checklist": "WAF checklist", - "guid": "e8659d11-7e02-4db0-848c-c6541dbab68c", - "link": "https://learn.microsoft.com/azure/key-vault/general/backup?tabs=azure-cli#limitations", - "service": "Key Vault", + "guid": "a78b3d31-3170-44f2-b5d7-651a29f4ccf5", + "link": "https://learn.microsoft.com/azure/sap/workloads/high-availability-guide-standard-load-balancer-outbound-connections", + "service": "SAP", "services": [ - "AKV", - "Backup", - "WAF" + "SAP", + "WAF", + "LoadBalancer" ], - "severity": "Low", - "text": "Understand Key Vault's backup limitations. Key Vault does not support the ability to backup more than 500 past versions of a key, secret, or certificate object. Attempting to backup a key, secret, or certificate object may result in an error. It is not possible to delete previous versions of a key, secret, or certificate.", + "severity": "High", + "text": "Most failover clusters for SAP application layer components (ASCS) and the DBMS layer require a virtual IP address for a failover cluster. Azure Load Balancer should handle the virtual IP address for all other cases. One design principle is to use one load balancer per cluster configuration. We recommend that you use the standard version of the load balancer (Standard Load Balancer SKU).", + "training": "https://learn.microsoft.com/training/modules/implement-high-availability-for-sap-workloads-azure/?source=recommendations", "waf": "Reliability" }, { - "arm-service": "Microsoft.KeyVault/vaults", "checklist": "WAF checklist", - "guid": "45c25e29-d0ef-4f07-aa04-0f8c64cbcc04", - "link": "https://learn.microsoft.com/azure/key-vault/general/backup?tabs=azure-cli#limitations", - "service": "Key Vault", + "guid": "1a541741-5833-4fb4-ae3c-2df743165c3a", + "link": "https://learn.microsoft.com/azure/load-balancer/load-balancer-ha-ports-overview?source=recommendations", + "service": "SAP", "services": [ - "AKV", - "Backup", - "WAF" + "WAF", + "LoadBalancer" ], - "severity": "Low", - "text": "Key Vault doesn't currently provide a way to back up an entire key vault in a single operation and keys, secrets and certitificates must be backup indvidually. Familiarize yourself with the Key Vault's backup and restore guidance.", + "severity": "High", + "text": "Make sure the Floating IP is enabled on the Load balancer", + "training": "https://learn.microsoft.com/training/modules/load-balancing-non-https-traffic-azure/?source=recommendations", "waf": "Reliability" }, { - "arm-service": "Microsoft.KeyVault/vaults", "checklist": "WAF checklist", - "guid": "0f15640b-31e5-4de6-85a7-d2c652fa09d3", - "link": "https://learn.microsoft.com/azure/key-vault/general/soft-delete-overview#purge-protection", - "service": "Key Vault", + "guid": "c47cc4f3-f105-452c-845e-9b307b3856c1", + "link": "https://learn.microsoft.com/azure/virtual-machines/availability", + "service": "SAP", "services": [ - "AKV", - "EventHubs", "WAF" ], - "severity": "Medium", - "text": "Purge protection is recommended when using keys for encryption to prevent data loss. Purge protection is an optional Key Vault behavior and is not enabled by default. Purge protection can only be enabled once soft-delete is enabled. It can be turned on via CLI, PowerShell or Portal.", + "severity": "High", + "text": "Before you deploy your high-availability infrastructure, and depending on the region you choose, determine whether to deploy with an Azure availability set or an availability zone.", + "training": "https://learn.microsoft.com/training/modules/configure-virtual-machine-availability/?source=recommendations", "waf": "Reliability" }, { - "arm-service": "Microsoft.Storage/storageAccounts", "checklist": "WAF checklist", - "description": "Apply guidance from the Microsoft cloud security benchmark related to Storage", - "guid": "d237de14-3b16-4c21-b7aa-9b64604489a8", - "link": "https://learn.microsoft.com/security/benchmark/azure/baselines/storage-security-baseline", - "service": "Azure Storage", + "guid": "844f69c3-07e5-4ec1-bff7-4be27bcf5fea", + "link": "https://www.microsoft.com/licensing/docs/view/Service-Level-Agreements-SLA-for-Online-Services?lang=1", + "service": "SAP", "services": [ - "Storage", - "WAF" + "VM", + "SAP", + "WAF", + "Entra" ], - "severity": "Medium", - "text": "Consider the 'Azure security baseline for storage'", - "waf": "Security" + "severity": "High", + "text": "If you want to meet the infrastructure SLAs for your applications for SAP components (central services, application servers, and databases), you must choose the same high availability options (VMs, availability sets, availability zones) for all components.", + "waf": "Reliability" }, { - "arm-service": "Microsoft.Storage/storageAccounts", "checklist": "WAF checklist", - "description": "Azure Storage by default has a public IP address and is Internet-reachable. Private endpoints allow to securely expose Azure Storage only to those Azure Compute resources that need access, thus eliminating exposure to the public Internet", - "guid": "f42d78e7-9d17-4a73-a22a-5a67e7a8ed4b", - "link": "https://learn.microsoft.com/azure/storage/common/storage-private-endpoints", - "service": "Azure Storage", + "guid": "cbe05bbe-209d-4490-ba47-778424d11678", + "link": "https://learn.microsoft.com/azure/virtual-machines/availability-set-overview", + "service": "SAP", "services": [ - "PrivateLink", - "Storage", - "WAF" + "VM", + "RBAC", + "WAF", + "Entra" ], "severity": "High", - "text": "Consider using private endpoints for Azure Storage", - "waf": "Security" + "text": "Do not mix servers of different roles in the same availability set. Keep central services VMs, database VMs, application VMs in their own availability sets", + "training": "https://learn.microsoft.com/training/modules/configure-virtual-machine-availability/?source=recommendations", + "waf": "Reliability" }, { - "arm-service": "Microsoft.Storage/storageAccounts", "checklist": "WAF checklist", - "description": "Newly created storage accounts are created using the ARM deployment model, so that RBAC, auditing etc. are all enabled. Ensure that there are no old storage accounts with classic deployment model in a subscription", - "guid": "30e37c3e-2971-41b2-963c-eee079b598de", - "link": "https://learn.microsoft.com/azure/virtual-machines/migration-classic-resource-manager-overview#migration-of-storage-accounts", - "service": "Azure Storage", + "guid": "f2201000-d045-40a6-a79a-d7cdc01b4d86", + "link": "https://learn.microsoft.com/azure/virtual-machines/co-location", + "service": "SAP", "services": [ - "RBAC", - "Storage", - "Subscriptions", "WAF" ], "severity": "Medium", - "text": "Ensure older storage accounts are not using 'classic deployment model'", - "waf": "Security" + "text": "You can't deploy Azure availability sets within an Azure availability zone unless you use proximity placement groups.", + "training": "https://learn.microsoft.com/azure/sap/workloads/proximity-placement-scenarios", + "waf": "Reliability" }, { - "arm-service": "Microsoft.Storage/storageAccounts", "checklist": "WAF checklist", - "description": "Leverage Microsoft Defender to learn about suspicious activity and misconfigurations.", - "guid": "fc5972cd-4cd2-41b0-a803-7f5e6b4bfd3d", - "link": "https://learn.microsoft.com/azure/storage/common/azure-defender-storage-configure", - "service": "Azure Storage", + "guid": "9674e7c7-7796-4181-8920-09f4429543ba", + "link": "https://learn.microsoft.com/azure/virtual-machines/availability-set-overview", + "service": "SAP", "services": [ - "Storage", - "Defender", + "VM", "WAF" ], "severity": "High", - "text": "Enable Microsoft Defender for all of your storage accounts", - "waf": "Security" + "text": "When you create availability sets, use the maximum number of fault domains and update domains available. For example, if you deploy more than two VMs in one availability set, use the maximum number of fault domains (three) and enough update domains to limit the effect of potential physical hardware failures, network outages, or power interruptions, in addition to Azure planned maintenance. The default number of fault domains is two, and you can't change it online later.", + "training": "https://learn.microsoft.com/training/modules/configure-virtual-machine-availability/?source=recommendations", + "waf": "Reliability" }, { - "arm-service": "Microsoft.Storage/storageAccounts", "checklist": "WAF checklist", - "description": "The soft-delete mechanism allows to recover accidentally deleted blobs.", - "guid": "503547c1-447e-4c66-828a-7100f1ce16dd", - "link": "https://learn.microsoft.com/azure/storage/blobs/soft-delete-blob-overview", - "service": "Azure Storage", + "guid": "ae4ecb95-b70f-428f-8b9a-4c5b7e3478a2", + "link": "https://learn.microsoft.com/azure/sap/workloads/proximity-placement-scenarios", + "service": "SAP", "services": [ - "Storage", + "Entra", + "SAP", "WAF" ], - "severity": "Medium", - "text": "Enable 'soft delete' for blobs", - "waf": "Security" + "severity": "High", + "text": "When you use Azure proximity placement groups in an availability set deployment, all three SAP components (central services, application server, and database) should be in the same proximity placement group.", + "waf": "Reliability" }, { - "arm-service": "Microsoft.Storage/storageAccounts", "checklist": "WAF checklist", - "description": "Consider selectively disabling 'soft delete' for certain blob containers, for example if the application must ensure that deleted information is immediately deleted, e.g. for confidentiality, privacy or compliance reasons. ", - "guid": "3f1d5e87-2e52-4e36-81cc-58b4a4b1510e", - "link": "https://learn.microsoft.com/azure/storage/blobs/soft-delete-blob-enable", - "service": "Azure Storage", + "guid": "5d2fa56c-56ad-4484-88fe-72734c486ba2", + "link": "https://learn.microsoft.com/azure/sap/workloads/proximity-placement-scenarios", + "service": "SAP", "services": [ - "Storage", + "ACR", + "SAP", "WAF" ], - "severity": "Medium", - "text": "Disable 'soft delete' for blobs", - "waf": "Security" + "severity": "High", + "text": "Use one proximity placement group per SAP SID. Groups don't span across Availability Zones or Azure regions", + "waf": "Reliability" }, { - "arm-service": "Microsoft.Storage/storageAccounts", "checklist": "WAF checklist", - "description": "Soft delete for containers enables you to recover a container after it has been deleted, for example recover from an accidental delete operation.", - "guid": "43a58a9c-2289-4c3d-9b57-d0c655462f2a", - "link": "https://learn.microsoft.com/azure/storage/blobs/soft-delete-container-overview", - "service": "Azure Storage", + "guid": "bca3b10e-0ff5-4aec-ac16-4c4bd1a1c13f", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/eslz-business-continuity-and-disaster-recovery", + "service": "SAP", "services": [ + "Entra", + "SAP", "WAF" ], "severity": "High", - "text": "Enable 'soft delete' for containers", - "waf": "Security" + "text": "Use one of the following services to run SAP central services clusters, depending on the operating system.", + "training": "https://learn.microsoft.com/training/modules/implement-ha-sap-netweaver-anydb/?source=recommendations", + "waf": "Reliability" }, { - "arm-service": "Microsoft.Storage/storageAccounts", "checklist": "WAF checklist", - "description": "Consider selectively disabling 'soft delete' for certain blob containers, for example if the application must ensure that deleted information is immediately deleted, e.g. for confidentiality, privacy or compliance reasons. ", - "guid": "3e3453a3-c863-4964-ab65-2d6c15f51296", - "link": "https://learn.microsoft.com/azure/storage/blobs/soft-delete-container-enable", - "service": "Azure Storage", + "guid": "ed46b937-913e-4018-9c62-8393ab037e53", + "link": "https://learn.microsoft.com/azure/sap/workloads/high-availability-guide-suse-multi-sid", + "service": "SAP", "services": [ - "Storage", - "WAF" + "VM", + "WAF", + "Entra" ], "severity": "Medium", - "text": "Disable 'soft delete' for containers", - "waf": "Security" + "text": "Azure doesn't currently support combining ASCS and DB HA in the same Linux Pacemaker cluster; separate them into individual clusters. However, you can combine up to five multiple central-services clusters into a pair of VMs.", + "training": "https://learn.microsoft.com/training/modules/implement-ha-sap-netweaver-anydb/?source=recommendations", + "waf": "Reliability" }, { - "arm-service": "Microsoft.Storage/storageAccounts", "checklist": "WAF checklist", - "description": "Prevents accidental deletion of a storage account, by forcing the user to first remove the deletion lock, prior to deletion", - "guid": "5398e6de-d227-4dd1-92b0-6c21d7999a64", - "link": "https://learn.microsoft.com/azure/storage/common/lock-account-resource", - "service": "Azure Storage", + "guid": "f656e745-0cfb-453e-8008-0528fa21c933", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/eslz-business-continuity-and-disaster-recovery", + "service": "SAP", "services": [ + "VM", "Storage", "WAF" ], - "severity": "High", - "text": "Enable resource locks on storage accounts", - "waf": "Security" + "severity": "Medium", + "text": "Deploy both VMs in the high-availability pair in an availability set or in availability zones. These VMs should be the same size and have the same storage configuration.", + "waf": "Reliability" }, { - "arm-service": "Microsoft.Storage/storageAccounts", "checklist": "WAF checklist", - "description": "Consider 'legal hold' or 'time-based retention' policies for blobs, so that is is impossible to delete the blob, the container, or the storage account. Please note that 'impossible' actually means 'impossible'; once a storage account contains an immutable blob, the only way to 'get rid' of that storage account is by cancelling the Azure subscription.", - "guid": "6f4389a8-f42c-478e-98c0-6a73a22a4956", - "link": "https://learn.microsoft.com/azure/storage/blobs/immutable-storage-overview", - "service": "Azure Storage", + "guid": "7f684ebc-95da-425e-b329-e782dbed050f", + "link": "https://learn.microsoft.com/azure/sap/workloads/high-availability-guide-rhel-with-hana-ascs-ers-dialog-instance", + "service": "SAP", "services": [ - "Storage", - "Subscriptions", - "AzurePolicy", + "SAP", "WAF" ], - "severity": "High", - "text": "Consider immutable blobs", - "waf": "Security" + "severity": "Medium", + "text": "Azure supports installing and configuring SAP HANA and ASCS/SCS and ERS instances on the same high availability cluster running on Red Hat Enterprise Linux (RHEL).", + "training": "https://learn.microsoft.com/training/modules/implement-ha-sap-netweaver-anydb/?source=recommendations", + "waf": "Reliability" }, { - "arm-service": "Microsoft.Storage/storageAccounts", "checklist": "WAF checklist", - "description": "Consider disabling unprotected HTTP/80 access to the storage account, so that all data transfers are encrypted, integrity protected, and the server is authenticated. ", - "guid": "e7a8dc4a-20e2-47c3-b297-11b1352beee0", - "link": "https://learn.microsoft.com/azure/storage/common/storage-require-secure-transfer", - "service": "Azure Storage", + "guid": "07991f7d-6598-4d90-9431-45c62605d3a5", + "link": "https://learn.microsoft.com/azure/sap/workloads/planning-guide-storage", + "service": "SAP", "services": [ "Storage", "WAF" ], "severity": "High", - "text": "Require HTTPS, i.e. disable port 80 on the storage account", - "waf": "Security" + "text": "Run all production systems on Premium managed SSDs and use Azure NetApp Files or Ultra Disk Storage. At least the OS disk should be on the Premium tier so you can achieve better performance and the best SLA.", + "training": "https://learn.microsoft.com/training/modules/explore-azure-storage/?source=recommendations", + "waf": "Reliability" }, { - "arm-service": "Microsoft.Storage/storageAccounts", "checklist": "WAF checklist", - "description": "When configuring a custom domain (hostname) on a storage account, check whether you need TLS/HTTPS; if so, you might have to put Azure CDN in front of your storage account.", - "guid": "79b588de-fc49-472c-b3cd-21bf77036e5e", - "link": "https://learn.microsoft.com/azure/storage/blobs/storage-custom-domain-name", - "service": "Azure Storage", + "guid": "73cdaecc-7d74-48d8-a040-88416eebc98c", + "link": "https://learn.microsoft.com/azure/sap/workloads/hana-vm-operations-storage", + "service": "SAP", "services": [ "Storage", - "WAF" + "WAF", + "SAP" ], "severity": "High", - "text": "When enforcing HTTPS (disabling HTTP), check that you do not use custom domains (CNAME) for the storage account.", - "waf": "Security" + "text": "You should run SAP HANA on Azure only on the types of storage that are certified by SAP. Note that certain volumes must be run on certain disk configurations, where applicable. These configurations include enabling Write Accelerator and using Premium storage. You also need to ensure that the file system that runs on storage is compatible with the DBMS that runs on the machine.", + "training": "https://learn.microsoft.com/azure/sap/workloads/hana-vm-premium-ssd-v1?source=recommendations", + "waf": "Reliability" }, { - "arm-service": "Microsoft.Storage/storageAccounts", "checklist": "WAF checklist", - "description": "Requiring HTTPS when a client uses a SAS token to access blob data helps to minimize the risk of credential loss.", - "guid": "6b4bed3d-5035-447c-8347-dc56028a71ff", - "link": "https://learn.microsoft.com/azure/storage/common/storage-sas-overview", - "service": "Azure Storage", + "guid": "51904867-a70e-4fa0-b4ff-3e6292846d7c", + "link": "https://learn.microsoft.com/azure/sap/workloads/disaster-recovery-overview-guide#storage", + "service": "SAP", "services": [ "Storage", - "WAF" + "WAF", + "SAP", + "ASR" ], - "severity": "Medium", - "text": "Limit shared access signature (SAS) tokens to HTTPS connections only", - "waf": "Security" + "severity": "High", + "text": "Consider configuring high availability depending on the type of storage you use for your SAP workloads. Some storage services available in Azure are not supported by Azure Site Recovery, so your high availability configuration may differ.", + "training": "https://learn.microsoft.com/training/modules/implement-disaster-recovery-for-sap-workloads-azure/2-explore-disaster-recovery-sap-workloads", + "waf": "Reliability" }, { - "arm-service": "Microsoft.Storage/storageAccounts", "checklist": "WAF checklist", - "description": "AAD tokens should be favored over shared access signatures, wherever possible", - "guid": "e1ce15dd-3f0d-45e7-92d4-1e3611cc57b4", - "link": "https://learn.microsoft.com/azure/storage/common/authorize-data-access", - "service": "Azure Storage", + "guid": "1ac2d928-c9b7-42c6-ba18-23b1aea78693", + "link": "https://azure.microsoft.com/ja-jp/explore/global-infrastructure/products-by-region/", + "service": "SAP", "services": [ - "Entra", "Storage", - "WAF" + "WAF", + "SAP" ], "severity": "High", - "text": "Use Azure Active Directory (Azure AD) tokens for blob access", - "waf": "Security" + "text": "Different native Azure storage services (like Azure Files, Azure NetApp Files, Azure Shared Disk) may not be available in all regions. So to have similar SAP setup on the DR region after failover, ensure the respective storage service is offered in DR site.", + "waf": "Reliability" }, { - "arm-service": "Microsoft.Storage/storageAccounts", "checklist": "WAF checklist", - "description": "When assigning a role to a user, group, or application, grant that security principal only those permissions that are necessary for them to perform their tasks. Limiting access to resources helps prevent both unintentional and malicious misuse of your data.", - "guid": "a4b1410d-4395-48a8-a228-9b3d6b57cfc6", - "service": "Azure Storage", + "guid": "925d1f8c-01f3-4a67-948e-aabf0a1fad60", + "link": "https://techcommunity.microsoft.com/t5/running-sap-applications-on-the/optimize-your-azure-costs-by-automating-sap-system-start-stop/ba-p/2120675", + "service": "SAP", "services": [ - "RBAC", - "WAF" + "SAP", + "WAF", + "Cost" ], "severity": "Medium", - "text": "Least privilege in IaM permissions", - "waf": "Security" + "text": "Automate SAP System Start-Stop to manage costs.", + "waf": "Cost" }, { - "arm-service": "Microsoft.Storage/storageAccounts", "checklist": "WAF checklist", - "description": "A user delegation SAS is secured with Azure Active Directory (Azure AD) credentials and also by the permissions specified for the SAS. A user delegation SAS is analogous to a service SAS in terms of its scope and function, but offers security benefits over the service SAS. ", - "guid": "55461e1a-3e34-453a-9c86-39648b652d6c", - "link": "https://learn.microsoft.com/azure/storage/common/storage-sas-overview?toc=%2Fazure%2Fstorage%2Fblobs%2Ftoc.json#best-practices-when-using-sas", - "service": "Azure Storage", + "guid": "71dc00cd-4392-4262-8949-20c05e6c0333", + "link": "https://learn.microsoft.com/azure/sap/workloads/hana-vm-premium-ssd-v1", + "service": "SAP", "services": [ - "Entra", "Storage", - "WAF" + "Cost", + "WAF", + "VM", + "SAP" ], - "severity": "High", - "text": "When using SAS, prefer 'user delegation SAS' over storage-account-key based SAS.", - "waf": "Security" + "severity": "Low", + "text": "In the case of using Azure Premium Storage with SAP HANA, Azure Standard SSD storage can be used to select a cost-conscious storage solution. However, please note that choosing Standard SSD or Standard HDD Azure storage will affect the SLA of the individual VMs. Also, for systems with lower I/O throughput and low latency, such as non-production environments, lower series VMs can be used.", + "waf": "Cost" }, { - "arm-service": "Microsoft.Storage/storageAccounts", "checklist": "WAF checklist", - "description": "Storage account keys ('shared keys') have very little audit capabilities. While it can be monitored on who/when fetched a copy of the keys, once the keys are in the hands of multiple people, it is impossible to attribute usage to a specific user. Solely relying on AAD authentication makes it easier to tie storage access to a user. ", - "guid": "15f51296-5398-4e6d-bd22-7dd142b06c21", - "link": "https://learn.microsoft.com/rest/api/storageservices/authorize-with-shared-key", - "service": "Azure Storage", + "guid": "9877f353-2591-4e8b-8381-e9043fed1010", + "link": "https://learn.microsoft.com/azure/sap/workloads/hana-vm-premium-ssd-v1", + "service": "SAP", "services": [ - "Entra", - "AKV", "Storage", - "Monitor", - "WAF" + "Cost", + "WAF", + "VM", + "SAP" ], - "severity": "High", - "text": "Consider disabling storage account keys, so that only AAD access (and user delegation SAS) is supported.", - "waf": "Security" + "severity": "Low", + "text": "As a lower-cost alternative configuration (multipurpose), you can choose a low-performance SKU for your non-production HANA database server VMs. However, it is important to note that some VM types, such as E-series, are not HANA certified (SAP HANA Hardware Directory) or cannot achieve storage latency of less than 1ms.", + "waf": "Cost" }, { - "arm-service": "Microsoft.Storage/storageAccounts", "checklist": "WAF checklist", - "description": "Use Activity Log data to identify 'when', 'who', 'what' and 'how' the security of your storage account is being viewed or changed (i.e. storage account keys, access policies, etc.).", - "guid": "d7999a64-6f43-489a-af42-c78e78c06a73", - "link": "https://learn.microsoft.com/azure/storage/blobs/blob-storage-monitoring-scenarios#audit-account-activity", - "service": "Azure Storage", + "guid": "fda1dbf3-dc95-4d48-a7c7-91dca0f6c565", + "link": "https://learn.microsoft.com/azure/well-architected/sap/design-areas/security", + "service": "SAP", "services": [ - "AKV", - "Storage", - "AzurePolicy", - "Monitor", - "WAF" + "RBAC", + "WAF", + "Subscriptions" ], "severity": "High", - "text": "Consider using Azure Monitor to audit control plane operations on the storage account", + "text": "Enforce a RBAC model for management groups, subscriptions, resource groups and resources", + "training": "https://learn.microsoft.com/training/paths/implement-resource-mgmt-security/", "waf": "Security" }, { - "arm-service": "Microsoft.Storage/storageAccounts", "checklist": "WAF checklist", - "description": "A key expiration policy enables you to set a reminder for the rotation of the account access keys. The reminder is displayed if the specified interval has elapsed and the keys have not yet been rotated.", - "guid": "a22a4956-e7a8-4dc4-a20e-27c3e29711b1", - "link": "https://learn.microsoft.com/azure/storage/common/storage-account-keys-manage?tabs=azure-portal#create-a-key-expiration-policy", - "service": "Azure Storage", + "guid": "45911475-e39e-4530-accc-d979366bcda2", + "link": "https://learn.microsoft.com/azure/active-directory/fundamentals/scenario-azure-first-sap-identity-integration", + "service": "SAP", "services": [ - "AKV", - "Storage", - "AzurePolicy", + "Entra", + "SAP", "WAF" ], "severity": "Medium", - "text": "When using storage account keys, consider enabling a 'key expiration policy'", + "text": "Enforce Principal propagation for forwarding the identity from SAP cloud application to SAP on-premises (Including IaaS) through cloud connector", + "training": "https://learn.microsoft.com/training/modules/explore-identity-services/2-explore-azure-virtual-machine-auth-access-control", "waf": "Security" }, { - "arm-service": "Microsoft.Storage/storageAccounts", "checklist": "WAF checklist", - "description": "A SAS expiration policy specifies a recommended interval over which the SAS is valid. SAS expiration policies apply to a service SAS or an account SAS. When a user generates service SAS or an account SAS with a validity interval that is larger than the recommended interval, they'll see a warning.", - "guid": "352beee0-79b5-488d-bfc4-972cd3cd21bf", - "link": "https://learn.microsoft.com/azure/storage/common/sas-expiration-policy", - "service": "Azure Storage", + "guid": "750ab1ab-039d-495d-94c7-c8929cb107d5", + "link": "https://learn.microsoft.com/azure/active-directory/fundamentals/scenario-azure-first-sap-identity-integration", + "service": "SAP", "services": [ - "AzurePolicy", + "Entra", + "SAP", "WAF" ], "severity": "Medium", - "text": "Consider configuring an SAS expiration policy", + "text": "Implement SSO to SAP SaaS applications like SAP Analytics Cloud, SAP Cloud Platform, Business by design, SAP Qualtrics and SAP C4C with Azure AD using SAML.", "waf": "Security" }, { - "arm-service": "Microsoft.Storage/storageAccounts", "checklist": "WAF checklist", - "description": "Stored access policies give you the option to revoke permissions for a service SAS without having to regenerate the storage account keys. ", - "guid": "77036e5e-6b4b-4ed3-b503-547c1347dc56", - "link": "https://learn.microsoft.com/rest/api/storageservices/define-stored-access-policy", - "service": "Azure Storage", + "guid": "325ae525-ba34-4d46-a5e2-213ace7bb122", + "link": "https://learn.microsoft.com/azure/active-directory/saas-apps/sap-netweaver-tutorial", + "service": "SAP", "services": [ - "AKV", - "Storage", - "AzurePolicy", + "SAP", "WAF" ], "severity": "Medium", - "text": "Consider linking SAS to a stored access policy", + "text": "Implement SSO to SAP NetWeaver-based web applications like SAP Fiori and SAP Web GUI by using SAML.", + "training": "https://learn.microsoft.com/training/modules/explore-identity-services/8-exercise-integrate-azure-active-directory-sap-netweaver", "waf": "Security" }, { - "arm-service": "Microsoft.Storage/storageAccounts", "checklist": "WAF checklist", - "guid": "028a71ff-e1ce-415d-b3f0-d5e772d41e36", - "link": "https://microsoft.github.io/code-with-engineering-playbook/continuous-integration/dev-sec-ops/secret-management/recipes/detect-secrets-ado/", - "service": "Azure Storage", + "guid": "9eb54dad-7861-4e1c-973a-f3bb003fc9c1", + "service": "SAP", "services": [ - "AKV", - "Storage", + "SAP", "WAF" ], "severity": "Medium", - "text": "Consider configuring your application's source code repository to detect checked-in connection strings and storage account keys.", + "text": "Implement SSO to SAP NetWeaver-based web applications like SAP Fiori and SAP Web GUI by using SAML.", + "training": "https://learn.microsoft.com/training/modules/explore-identity-services/6-exercise-integrate-azure-active-directory-sap-fiori", "waf": "Security" }, { - "arm-service": "Microsoft.Storage/storageAccounts", "checklist": "WAF checklist", - "description": "Ideally, your application should be using a managed identity to authenticate to Azure Storage. If that is not possible, consider having the storage credential (connection string, storage account key, SAS, service principal credential) in Azure KeyVault or an equivalent service.", - "guid": "11cc57b4-a4b1-4410-b439-58a8c2289b3d", - "link": "https://learn.microsoft.com/azure/architecture/framework/security/design-storage-keys", - "service": "Azure Storage", + "guid": "f29676ef-0c9c-4c4d-ab21-a55504c0c829", + "link": "https://learn.microsoft.com/azure/active-directory/saas-apps/sap-netweaver-tutorial", + "service": "SAP", "services": [ - "Entra", - "Storage", + "SAP", "WAF" ], - "severity": "High", - "text": "Consider storing connection strings in Azure KeyVault (in scenarios where managed identities are not possible)", + "severity": "Medium", + "text": "You can implement SSO to SAP GUI by using SAP NetWeaver SSO or a partner solution.", + "training": "https://learn.microsoft.com/training/modules/explore-identity-services/8-exercise-integrate-azure-active-directory-sap-netweaver", "waf": "Security" }, { - "arm-service": "Microsoft.Storage/storageAccounts", "checklist": "WAF checklist", - "description": "Use near-term expiration times on an ad hoc SAS service SAS or account SAS. In this way, even if a SAS is compromised, it's valid only for a short time. This practice is especially important if you cannot reference a stored access policy. Near-term expiration times also limit the amount of data that can be written to a blob by limiting the time available to upload to it.", - "guid": "27138b82-1102-4cac-9eae-01e6e842e52f", - "link": "https://learn.microsoft.com/rest/api/storageservices/delegate-access-with-shared-access-signature", - "service": "Azure Storage", + "guid": "23181aa4-1742-4694-9ff8-ae7d7d474317", + "service": "SAP", "services": [ - "Storage", - "AzurePolicy", - "WAF" + "SAP", + "WAF", + "AKV" ], - "severity": "High", - "text": "Strive for short validity periods for ad-hoc SAS", + "severity": "Medium", + "text": "For SSO for SAP GUI and web browser access, implement SNC / Kerberos/SPNEGO (simple and protected GSSAPI negotiation mechanism) due to its ease of configuration and maintenance. For SSO with X.509 client certificates, consider the SAP Secure Login Server, which is a component of the SAP SSO solution.", + "training": "https://learn.microsoft.com/training/modules/explore-identity-services/9-exercise-integrate-active-directory-sap-single-sign-on", "waf": "Security" }, { - "arm-service": "Microsoft.Storage/storageAccounts", "checklist": "WAF checklist", - "description": "When creating a SAS, be as specific and restrictive as possible. Prefer a SAS for a single resource and operation over a SAS which gives much broader access.", - "guid": "4721d928-c1b1-4cd5-81e5-4a29a9de399c", - "link": "https://learn.microsoft.com/rest/api/storageservices/delegate-access-with-shared-access-signature", - "service": "Azure Storage", + "guid": "6c8bcbf4-5bbe-4609-b8a0-3e97778424d6", + "link": "https://blogs.sap.com/2017/07/12/sap-single-sign-on-protect-your-sap-landscape-with-x.509-certificates/", + "service": "SAP", "services": [ - "WAF" + "SAP", + "WAF", + "AKV" ], "severity": "Medium", - "text": "Apply a narrow scope to a SAS", + "text": "For SSO for SAP GUI and web browser access, implement SNC / Kerberos/SPNEGO (simple and protected GSSAPI negotiation mechanism) due to its ease of configuration and maintenance. For SSO with X.509 client certificates, consider the SAP Secure Login Server, which is a component of the SAP SSO solution.", "waf": "Security" }, { - "arm-service": "Microsoft.Storage/storageAccounts", "checklist": "WAF checklist", - "description": "A SAS can include parameters on which client IP addresses or address ranges are authorized to request a resource using the SAS. ", - "guid": "fd7b28dc-9355-4562-82bf-e4564b0d834a", - "link": "https://learn.microsoft.com/rest/api/storageservices/create-account-sas", - "service": "Azure Storage", + "guid": "16785d6f-a96c-496a-b885-18f482734c88", + "link": "https://learn.microsoft.com/azure/active-directory/saas-apps/sap-netweaver-tutorial#configure-sap-netweaver-for-oauth", + "service": "SAP", "services": [ + "SAP", "WAF" ], "severity": "Medium", - "text": "Consider scoping SAS to a specific client IP address, wherever possible", + "text": "Implement SSO by using OAuth for SAP NetWeaver to allow third-party or custom applications to access SAP NetWeaver OData services.", "waf": "Security" }, { - "arm-service": "Microsoft.Storage/storageAccounts", "checklist": "WAF checklist", - "description": "A SAS cannot constrain how much data a client uploads; given the pricing model of amount of storage over time, it might make sense to validate whether clients uploaded maliciously large contents.", - "guid": "348b263e-6dd6-4051-8a36-498f6dbad38e", - "service": "Azure Storage", + "guid": "a747c350-8d4c-449c-93af-393dbca77c48", + "link": "https://learn.microsoft.com/azure/active-directory/saas-apps/saphana-tutorial", + "service": "SAP", "services": [ - "Storage", + "SAP", "WAF" ], - "severity": "Low", - "text": "Consider checking uploaded data, after clients used a SAS to upload a file. ", + "severity": "Medium", + "text": "Implement SSO to SAP HANA", "waf": "Security" }, { - "arm-service": "Microsoft.Storage/storageAccounts", "checklist": "WAF checklist", - "description": "When accessing blob storage via SFTP using a 'local user account', the 'usual' RBAC controls do not apply. Blob access via NFS or REST might be more restrictive than SFTP access. Unfortunately, as of early 2023, local users are the only form of identity management that is currently supported for the SFTP endpoint", - "guid": "ad53cc7c-e1d7-4aaa-a357-1449ab8053d8", - "link": "https://learn.microsoft.com/azure/storage/blobs/secure-file-transfer-protocol-support#sftp-permission-model", - "service": "Azure Storage", + "guid": "c7bae5bf-daf9-4761-9c56-f92891890aa4", + "link": "https://learn.microsoft.com/azure/sap/workloads/rise-integration#connectivity-with-sap-rise", + "service": "SAP", "services": [ "Entra", - "RBAC", - "Storage", + "SAP", "WAF" ], - "severity": "High", - "text": "SFTP: Limit the amount of 'local users' for SFTP access, and audit whether access is needed over time.", + "severity": "Medium", + "text": "Consider Azure AD an identity provider for SAP systems hosted on RISE. For more information, see Integrating the Service with Azure AD.", "waf": "Security" }, { - "arm-service": "Microsoft.Storage/storageAccounts", "checklist": "WAF checklist", - "guid": "9f89dc7b-33be-42a1-a27f-7b9e91be1f38", - "link": "https://learn.microsoft.com/azure/storage/blobs/secure-file-transfer-protocol-known-issues#authentication-and-authorization", - "service": "Azure Storage", + "guid": "e4e48226-ce54-44b6-bb6b-bfa15bd8f753", + "link": "https://github.com/azuredevcollege/SAP/blob/master/sap-oauth-saml-flow/README.md", + "service": "SAP", "services": [ + "SAP", "WAF" ], "severity": "Medium", - "text": "SFTP: The SFTP endpoint does not support POSIX-like ACLs.", + "text": "For applications that access SAP, you might want to use principal propagation to establish SSO.", "waf": "Security" }, { - "arm-service": "Microsoft.Storage/storageAccounts", "checklist": "WAF checklist", - "description": "Storage supports CORS (Cross-Origin Resource Sharing), i.e. an HTTP feature that enables web apps from a different domain to loosen the same-origin policy. When enabling CORS, keep the CorsRules to the least privilege.", - "guid": "cef39812-bd46-43cb-aac8-ac199ebb91a3", - "link": "https://learn.microsoft.com/rest/api/storageservices/cross-origin-resource-sharing--cors--support-for-the-azure-storage-services", - "service": "Azure Storage", + "guid": "59921095-4980-4fc1-a5b6-524a5a560c79", + "link": "https://learn.microsoft.com/azure/active-directory/saas-apps/sap-hana-cloud-platform-identity-authentication-tutorial", + "service": "SAP", "services": [ - "Storage", - "AzurePolicy", + "Entra", + "SAP", "WAF" ], - "severity": "High", - "text": "Avoid overly broad CORS policies", + "severity": "Medium", + "text": "If you're using SAP BTP services or SaaS solutions that require SAP Identity Authentication Service (IAS), consider implementing SSO between SAP Cloud Identity Authentication Services and Azure AD to access those SAP services. This integration lets SAP IAS act as a proxy identity provider and forwards authentication requests to Azure AD as the central user store and identity provider.", "waf": "Security" }, { - "arm-service": "Microsoft.Storage/storageAccounts", "checklist": "WAF checklist", - "description": "Data at rest is always encrypted server-side, and in addition might be encrypted client-side as well. Server-side encryption might happen using a platform-managed key (default) or customer-managed key. Client-side encryption might happen by either having the client supply an encryption/decryption key on a per-blob basis to Azure storage, or by completely handling encryption on the client-side. thus not relying on Azure Storage at all for confidentiality guarantees.", - "guid": "3d90cae2-cc88-4137-86f7-c0cbafe61464", - "link": "https://learn.microsoft.com/azure/storage/common/storage-service-encryption", - "service": "Azure Storage", + "guid": "a709c664-317e-41e4-9e34-67d9016a86f4", + "link": "https://learn.microsoft.com/azure/active-directory/saas-apps/sap-hana-cloud-platform-tutorial", + "service": "SAP", "services": [ - "Storage", + "SAP", "WAF" ], - "severity": "High", - "text": "Determine how data at rest should be encrypted. Understand the thread model for data.", + "severity": "Medium", + "text": "Implement SSO to SAP BTP", "waf": "Security" }, { - "arm-service": "Microsoft.Storage/storageAccounts", "checklist": "WAF checklist", - "guid": "8dd457e9-2713-48b8-8110-2cac6eae01e6", - "link": "https://learn.microsoft.com/azure/storage/common/customer-managed-keys-overview?toc=%2Fazure%2Fstorage%2Fblobs%2Ftoc.json&bc=%2Fazure%2Fstorage%2Fblobs%2Fbreadcrumb%2Ftoc.json", - "service": "Azure Storage", + "guid": "01f11b7f-38df-4251-9c76-4dec19abd3e8", + "link": "https://learn.microsoft.com/azure/active-directory/saas-apps/sap-successfactors-inbound-provisioning-cloud-only-tutorial", + "service": "SAP", "services": [ + "Entra", + "SAP", "WAF" ], "severity": "Medium", - "text": "Determine which/if platform encryption should be used.", + "text": "If you're using SAP SuccessFactors, consider using the Azure AD automated user provisioning. With this integration, as you add new employees to SAP SuccessFactors, you can automatically create their user accounts in Azure AD. Optionally, you can create user accounts in Microsoft 365 or other SaaS applications that are supported by Azure AD. Use write-back of the email address to SAP SuccessFactors.", "waf": "Security" }, { - "arm-service": "Microsoft.Storage/storageAccounts", "checklist": "WAF checklist", - "guid": "e842e52f-4721-4d92-ac1b-1cd521e54a29", - "link": "https://learn.microsoft.com/azure/storage/blobs/encryption-customer-provided-keys", - "service": "Azure Storage", + "guid": "6ba28021-4591-4147-9e39-e5309cccd979", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/ready/landing-zone/design-area/resource-org-management-groups", + "service": "SAP", "services": [ - "WAF" + "SAP", + "WAF", + "Subscriptions", + "AzurePolicy" ], "severity": "Medium", - "text": "Determine which/if client-side encryption should be used.", - "waf": "Security" + "text": "enforce existing Management Group policies to SAP Subscriptions", + "training": "https://learn.microsoft.com/training/modules/enterprise-scale-organization/4-management-group-subscription-organization", + "waf": "Operations" }, { - "arm-service": "Microsoft.Storage/storageAccounts", "checklist": "WAF checklist", - "description": "Leverage Resource Graph Explorer (resources | where type == 'microsoft.storage/storageaccounts' | where properties['allowBlobPublicAccess'] == true) to find storage accounts which allow anonymous blob access.", - "guid": "659ae558-b937-4d49-a5e1-112dbd7ba012", - "link": "https://learn.microsoft.com/azure/storage/blobs/anonymous-read-access-configure?tabs=portal#allow-or-disallow-public-read-access-for-a-storage-account", - "service": "Azure Storage", + "guid": "366bcda2-750a-4b1a-a039-d95d54c7c892", + "link": "https://learn.microsoft.com/azure/architecture/guide/sap/sap-whole-landscape", + "service": "SAP", "services": [ - "Storage", - "WAF" + "SAP", + "WAF", + "Subscriptions" ], "severity": "High", - "text": "Consider whether public blob access is needed, or whether it can be disabled for certain storage accounts. ", - "waf": "Security" + "text": "Integrate tightly coupled applications into the same SAP subscription to avoid additional routing and management complexity", + "training": "https://learn.microsoft.com/azure/cloud-adoption-framework/ready/landing-zone/design-area/resource-org-subscriptions", + "waf": "Operations" }, { - "arm-service": "Microsoft.Storage/storageAccounts", "checklist": "WAF checklist", - "guid": "cb8eb8c0-aa62-4a25-a495-6eaa8dc4a243", - "link": "https://learn.microsoft.com/azure/storage/common/storage-account-upgrade?tabs=azure-portal", - "service": "Azure Storage", + "guid": "9cb107d5-325a-4e52-9ba3-4d4685e2213a", + "link": "https://learn.microsoft.com/azure/architecture/guide/sap/sap-whole-landscape", + "service": "SAP", "services": [ - "Storage", - "WAF" + "WAF", + "Subscriptions" ], "severity": "High", - "text": "Leverage a storagev2 account type for better performance and reliability", - "waf": "Reliability" + "text": "Leverage Subscription as scale unit and scaling our resources, consider deploying subscription per environment eg. Sandbox, non-prod, prod ", + "training": "https://learn.microsoft.com/training/modules/configure-subscriptions/?source=recommendations", + "waf": "Operations" }, { - "arm-service": "Microsoft.Storage/storageAccounts", "checklist": "WAF checklist", - "guid": "e05bbe20-9d49-4fda-9777-8424d116785c", - "link": "https://learn.microsoft.com/azure/storage/common/storage-redundancy", - "service": "Azure Storage", + "guid": "ce7bb122-f7c9-45f0-9e15-4e3aa3592829", + "link": "https://learn.microsoft.com/azure/quotas/quotas-overview", + "service": "SAP", "services": [ - "Storage", - "WAF" + "VM", + "WAF", + "Subscriptions" ], "severity": "High", - "text": "Leverage GRS, ZRS or GZRS storage for the highest availability", - "waf": "Reliability" + "text": "Ensure quota increase as a part of subscription provisioning (e.g. total available VM cores within a subscription)", + "training": "https://learn.microsoft.com/azure/azure-resource-manager/management/azure-subscription-service-limits", + "waf": "Operations" }, { - "arm-service": "Microsoft.Storage/storageAccounts", "checklist": "WAF checklist", - "guid": "2fa56c56-ad48-4408-be72-734c486ba280", - "link": "https://learn.microsoft.com/azure/storage/common/storage-disaster-recovery-guidance", - "service": "Azure Storage", + "guid": "ce4fab2f-433a-4d59-a5a9-3d1032e03ebc", + "link": "https://learn.microsoft.com/rest/api/reserved-vm-instances/quotaapi?branch=capacity", + "service": "SAP", "services": [ "WAF" ], - "severity": "Medium", - "text": "For write operation after failover, use customer-Managed Failover ", - "waf": "Reliability" + "severity": "Low", + "text": "The Quota API is a REST API that you can use to view and manage quotas for Azure services. Consider using it if necessary.", + "waf": "Operations" }, { - "arm-service": "Microsoft.Storage/storageAccounts", "checklist": "WAF checklist", - "guid": "dc0590cf-65de-48e1-909c-cbd579266bcc", - "link": "https://learn.microsoft.com/azure/storage/common/storage-disaster-recovery-guidance#microsoft-managed-failover", - "service": "Azure Storage", + "guid": "cbfad17b-f240-42bf-a1d8-f4f4cee661c8", + "link": "https://learn.microsoft.com/azure/quotas/quickstart-increase-quota-portal", + "service": "SAP", + "services": [ + "VM", + "WAF", + "Subscriptions" + ], + "severity": "High", + "text": "If deploying to an availability zone, ensure that the VM's zone deployment is available once the quota has been approved. Submit a support request with the subscription, VM series, number of CPUs and availability zone required.", + "waf": "Operations" + }, + { + "checklist": "WAF checklist", + "guid": "e6e20617-3686-4af4-9791-f8935ada4332", + "link": "https://azure.microsoft.com/explore/global-infrastructure/products-by-region/", + "service": "SAP", "services": [ "WAF" ], - "severity": "Medium", - "text": "Understand Microsoft-Managed Failover details", - "waf": "Reliability" + "severity": "High", + "text": "Ensure required services and features are available within the chosen deployment regions eg. ANF , Zone etc.", + "training": "https://learn.microsoft.com/azure/cloud-adoption-framework/migrate/azure-best-practices/multiple-regions?source=recommendations", + "waf": "Operations" }, { - "arm-service": "Microsoft.Storage/storageAccounts", "checklist": "WAF checklist", - "guid": "a274faa1-abfe-49d5-9d04-c3c4919cb1b3", - "link": "https://learn.microsoft.com/azure/storage/blobs/soft-delete-blob-enable?tabs=azure-portal", - "service": "Azure Storage", + "guid": "4e138115-2318-41aa-9174-26943ff8ae7d", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/eslz-resource-organization", + "service": "SAP", "services": [ + "Cost", + "TrafficManager", "WAF" ], "severity": "Medium", - "text": "Enable Soft Delete", + "text": "Leverage Azure resource tag for cost categorization and resource grouping (: BillTo, Department (or Business Unit), Environment (Production, Stage, Development), Tier (Web Tier, Application Tier), Application Owner, ProjectName)", + "training": "https://learn.microsoft.com/training/paths/implement-resource-mgmt-security/", + "waf": "Operations" + }, + { + "checklist": "WAF checklist", + "guid": "2f7c95f0-6e15-44e3-aa35-92829e6e2061", + "link": "https://learn.microsoft.com/azure/backup/sap-hana-database-about", + "service": "SAP", + "services": [ + "WAF", + "Backup" + ], + "severity": "High", + "text": "Help protect your HANA database by using the Azure Backup service.", + "training": "https://learn.microsoft.com/training/modules/implement-azure-backup-sap-workloads-azure-virtual-machines/?source=recommendations", "waf": "Reliability" }, { - "arm-service": "Microsoft.Compute/virtualMachineScaleSets", "checklist": "WAF checklist", - "description": "Automatic instance repairs ensure that unhealthy instances are promptly identified and replaced, maintaining a set of healthy instances within your scale set.", - "guid": "7e13c105-675c-41e9-95b4-59837ff7ae7c", - "link": "https://learn.microsoft.com/azure/virtual-machine-scale-sets/virtual-machine-scale-sets-automatic-instance-repairs", - "service": "VMSS", + "guid": "302a2fbf-3745-4a5f-a365-c9d1a16ca22c", + "link": "https://learn.microsoft.com/azure/azure-netapp-files/azacsnap-introduction", + "service": "SAP", "services": [ "VM", - "WAF" + "Storage", + "WAF", + "Entra" ], - "severity": "Low", - "text": "Enable automatic instance repairs for enhanced VM Scale Sets resiliency", + "severity": "Medium", + "text": "If you deploy Azure NetApp Files for your HANA, Oracle, or DB2 database, use the Azure Application Consistent Snapshot tool (AzAcSnap) to take application-consistent snapshots. AzAcSnap also supports Oracle databases. Consider using AzAcSnap on a central VM rather than on individual VMs.", "waf": "Reliability" }, { - "arm-service": "Microsoft.Compute/virtualMachines", "checklist": "WAF checklist", - "description": "Ensure that Azure Backup is utilized appropriately to meet your organization's resiliency requirements for Azure virtual machines (VMs).", - "guid": "4d874a74-8b66-42d6-b150-512a66498f6d", - "link": "https://learn.microsoft.com/azure/backup/backup-azure-vms-introduction", - "service": "VM", + "guid": "42d37218-a3a7-45df-bff6-1173e7f249ea", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/eslz-management-and-monitoring", + "service": "SAP", "services": [ - "Backup", - "VM", + "SAP", "WAF" ], "severity": "High", - "text": "Consider Azure Backup to meet your resiliency requirements for Azure VMs", - "waf": "Reliability" + "text": "Ensure time-zone matches between the operating system and the SAP system.", + "waf": "Operations" }, { - "arm-service": "Microsoft.Compute/virtualMachines", "checklist": "WAF checklist", - "description": "Single Instance VMs using Premium SSD or Ultra Disk for all Operating System Disks and Data Disks are guaranteed to have Virtual Machine Connectivity of at least 99.9%", - "guid": "8052d88e-79d1-47b7-9b22-a5a67e7a8ed4", - "link": "https://learn.microsoft.com/azure/virtual-machines/disks-types", - "service": "VM", + "guid": "c3c7abc0-716c-4486-893c-40e181d65539", + "link": "https://learn.microsoft.com/azure/sap/workloads/high-availability-guide-rhel-multi-sid", + "service": "SAP", "services": [ - "VM", + "Entra", "WAF" ], - "severity": "High", - "text": "Use Premium or Ultra disks for production VMs", + "severity": "Medium", + "text": "Don't group different application services in the same cluster. For example, don't combine DRBD and central services clusters on the same cluster. However, you can use the same Pacemaker cluster to manage approximately five different central services (multi-SID cluster).", + "training": "https://learn.microsoft.com/training/modules/implement-ha-sap-netweaver-anydb/?source=recommendations", "waf": "Reliability" }, { - "arm-service": "Microsoft.Compute/virtualMachines", "checklist": "WAF checklist", - "description": "Azure automatically replicates managed disks within a region to ensure data durability and protect against single-point failures.", - "guid": "b31e38c3-f298-412b-8363-cffe179b599d", - "link": "https://learn.microsoft.com/azure/virtual-machines/managed-disks-overview", - "service": "VM", + "guid": "a491dfc4-9353-4213-9217-eef0949f9467", + "link": "https://azure.microsoft.com/pricing/offers/dev-test/", + "service": "SAP", "services": [ - "VM", + "Cost", "WAF" ], - "severity": "High", - "text": "Ensure Managed Disks are used for all VMs", - "waf": "Reliability" + "severity": "Low", + "text": "Consider running dev/test systems in a snooze model to save and optimize Azure run costs.", + "waf": "Cost" }, { - "arm-service": "Microsoft.Compute/virtualMachines", "checklist": "WAF checklist", - "description": "Temporary disks are intended for short-term storage of non-persistent data such as page files, swap files, or SQL Server tempdb. Storing persistent data on temporary disks can lead to data loss during maintenance events or VM redeployment.", - "guid": "e0d5973c-d4ce-432c-8881-37f6f7c4c0d4", - "link": "https://learn.microsoft.com/azure/virtual-machines/managed-disks-overview#temporary-disk", - "service": "VM", + "guid": "b7056168-6199-4732-a514-cdbb2d5c9c54", + "link": "https://learn.microsoft.com/azure/lighthouse/overview", + "service": "SAP", "services": [ - "SQL", - "Storage", - "VM", + "Entra", + "SAP", "WAF" ], "severity": "Medium", - "text": "Do not use the Temp disk for anything that is not acceptable to be lost", - "waf": "Reliability" + "text": "If you partner with customers by managing their SAP estates, consider Azure Lighthouse. Azure Lighthouse allows managed service providers to use Azure native identity services to authenticate to the customers' environment. It puts the control in the hands of customers, because they can revoke access at any time and audit service providers' actions.", + "waf": "Operations" }, { - "arm-service": "Microsoft.Compute/virtualMachines", "checklist": "WAF checklist", - "description": "Co-locate your compute, storage, networking, and data resources across an availability zone, and replicate this arrangement in other availability zones.", - "guid": "e514548d-2447-4ec6-9138-b8200f1ce16e", - "link": "https://learn.microsoft.com/azure/reliability/availability-zones-overview", - "service": "VM", + "guid": "4d116785-d2fa-456c-96ad-48408fe72734", + "link": "https://learn.microsoft.com/azure/update-manager/scheduled-patching?tabs=schedule-updates-single-machine%2Cschedule-updates-scale-overview", + "service": "SAP", "services": [ - "ACR", - "Storage", "VM", "WAF" ], "severity": "Medium", - "text": "Leverage Availability Zones for your VMs in regions where they are supported", - "waf": "Reliability" + "text": "Use Azure Update Manager to check the status of available updates for a single VM or multiple VMs and consider scheduling regular patching.", + "training": "https://learn.microsoft.com/training/modules/keep-your-virtual-machines-updated/?source=recommendations", + "waf": "Operations" }, { - "arm-service": "Microsoft.Compute/virtualMachines", "checklist": "WAF checklist", - "description": "Use at least two VMs in Availability Sets to isolate VMs on different fault and update domains.", - "guid": "5a785d6f-e96c-496a-b884-4cf3b2b38c88", - "link": "https://learn.microsoft.com/azure/virtual-machines/availability-set-overview", - "service": "VM", + "guid": "76c8bcbf-45bb-4e60-ad8a-03e97778424d", + "link": "https://learn.microsoft.com/azure/sap/workloads/lama-installation", + "service": "SAP", "services": [ - "VM", + "SAP", "WAF" ], - "severity": "Medium", - "text": "For regions that do not support Availability Zones deploy VMs into Availability Sets", - "waf": "Reliability" + "severity": "Low", + "text": "Optimize and manage SAP Basis operations by using SAP Landscape Management (LaMa). Use the SAP LaMa connector for Azure to relocate, copy, clone, and refresh SAP systems.", + "training": "https://learn.microsoft.com/training/modules/explore-azure-remote-management/?source=recommendations", + "waf": "Operations" }, { - "arm-service": "Microsoft.Compute/virtualMachines", "checklist": "WAF checklist", - "description": "Azure provides multiple options for VM redundancy to meet different requirements (Availability Zones, Virtual Machine Scale Sets, Availability Sets, Azure Site Recovery)", - "guid": "6ba2c021-4991-414a-9d3c-e574dccbd979", - "link": "https://learn.microsoft.com/azure/virtual-machines/availability", - "service": "VM", + "guid": "14591147-5e39-4e53-89cc-cd979366bcda", + "link": "https://learn.microsoft.com/azure/sap/monitor/about-azure-monitor-sap-solutions", + "service": "SAP", "services": [ - "VM", - "ASR", + "Monitor", + "SAP", + "SQL", "WAF" ], - "severity": "High", - "text": "Avoid running a production workload on a single VM", - "waf": "Reliability" + "severity": "Medium", + "text": "Use Azure Monitor for SAP solutions to monitor your SAP workloads(SAP HANA, high-availability SUSE clusters, and SQL systems) on Azure. Consider supplementing Azure Monitor for SAP solutions with SAP Solution Manager.", + "training": "https://learn.microsoft.com/training/modules/implement-azure-monitoring-sap-workloads-azure-virtual-machines/?source=recommendations", + "waf": "Operations" }, { - "arm-service": "Microsoft.Compute/virtualMachines", "checklist": "WAF checklist", - "description": "Azure Site Recovery enables you to achieve low RTO (Recovery Time Objective) for your Azure and hybrid VMs by providing continuous replication and failover capabilities.", - "guid": "2a6bcca2-b5fe-4a1e-af3d-d95d48c7c891", - "link": "https://learn.microsoft.com/azure/site-recovery/site-recovery-overview", - "service": "VM", + "guid": "2750ab1a-b039-4d95-b54c-7c8929cb107d", + "link": "https://learn.microsoft.com/azure/sap/workloads/vm-extension-for-sap", + "service": "SAP", "services": [ - "AVS", + "Monitor", + "Entra", + "WAF", "VM", - "ASR", - "WAF" + "SAP" ], "severity": "High", - "text": "For Azure and on-premises VMs (Hyper-V/Phyiscal/VMware) with low RTO requirements use Azure Site Recovery", - "waf": "Reliability" + "text": "Run a VM Extension for SAP check. VM Extension for SAP uses the assigned managed identity of a virtual machine (VM) to access VM monitoring and configuration data. The check ensures that all performance metrics in your SAP application come from the underlying Azure Extension for SAP.", + "training": "https://learn.microsoft.com/training/modules/configure-azure-enhanced-monitoring-extension-for-sap/?source=recommendations", + "waf": "Operations" }, { - "arm-service": "Microsoft.Compute/virtualMachines", "checklist": "WAF checklist", - "description": "By using Capacity Reservations, you can effectively manage capacity for critical workloads, ensuring resource availability in specified regions.", - "guid": "bd7bb012-f7b9-45e0-9e15-8e3ea3992c2d", - "link": "https://learn.microsoft.com/azure/virtual-machines/capacity-reservation-overview", - "service": "VM", + "guid": "5325ae52-5ba3-44d4-985e-2213ace7bb12", + "link": "https://learn.microsoft.com/azure/azure-monitor/logs/design-logs-deployment", + "service": "SAP", "services": [ - "WAF" + "WAF", + "AzurePolicy" ], - "severity": "Low", - "text": "Use Capacity Reservations for critical workloads that require guaranteed capacity", - "waf": "Reliability" + "severity": "Medium", + "text": "Use Azure Policy for access control and compliance reporting. Azure Policy provides the ability to enforce organization-wide settings to ensure consistent policy adherence and fast violation detection. ", + "training": "https://learn.microsoft.com/learn/paths/architect-infrastructure-operations/", + "waf": "Operations" }, { - "arm-service": "Microsoft.Compute/virtualMachines", "checklist": "WAF checklist", - "description": "By ensuring that the necessary quotas are increased in your DR region before testing failover with ASR, you can avoid any potential resource constraints during the recovery process for failed over VMs.", - "guid": "e6e2065b-3a76-4af4-a691-e8939ada4666", - "link": "https://learn.microsoft.com/azure/quotas/per-vm-quota-requests", - "service": "VM", + "guid": "523181aa-4174-4269-93ff-8ae7d7d47431", + "link": "https://learn.microsoft.com/azure/network-watcher/connection-monitor-overview", + "service": "SAP", "services": [ - "VM", - "ASR", - "WAF" + "Monitor", + "SAP", + "WAF", + "NetworkWatcher" ], "severity": "Medium", - "text": "Increase quotas in DR region before testing failover with ASR", - "waf": "Reliability" + "text": "Use Connection Monitor in Azure Network Watcher to monitor latency metrics for SAP databases and application servers. Or collect and display network latency measurements by using Azure Monitor.", + "training": "https://techcommunity.microsoft.com/t5/running-sap-applications-on-the/collecting-and-displaying-niping-network-latency-measurements/ba-p/1833979", + "waf": "Operations" }, { - "arm-service": "Microsoft.Compute/virtualMachines", "checklist": "WAF checklist", - "description": "Scheduled Events is an Azure Metadata Service that provides information about upcoming maintenance events for virtual machines (VMs). By leveraging Scheduled Events, you can proactively prepare your applications for VM maintenance, minimizing disruption and improving the availability of your VMs.", - "guid": "6d3b475a-5c7a-4cbe-99bb-e64dd8902e87", - "link": "https://learn.microsoft.com/azure/virtual-machines/windows/scheduled-events", - "service": "VM", + "guid": "73686af4-6791-4f89-95ad-a43324e13811", + "link": "https://github.com/Azure/SAP-on-Azure-Scripts-and-Utilities/tree/main/QualityCheck", + "service": "SAP", "services": [ "VM", + "SAP", "WAF" ], - "severity": "Low", - "text": "Utilize Scheduled Events to prepare for VM maintenance", - "waf": "Reliability" + "severity": "Medium", + "text": "Perform a quality check for SAP HANA on the provisioned Azure infrastructure to verify that provisioned VMs comply with SAP HANA on Azure best practices.", + "waf": "Operations" }, { - "arm-service": "Microsoft.Storage/storageAccounts", "checklist": "WAF checklist", - "description": "Use Zone-redundant Storage (ZRS) in the primary region for scenarios that require high availability and for restricting replication to a particular country or region. For protection against regional disasters, use Geo-zone-redundant Storage (GZRS), which combines ZRS in the primary region with geo-replication to a secondary region?.", - "guid": "48c7c891-dcb1-4f7d-9769-ae568ba38d4a", - "link": "https://learn.microsoft.com/azure/storage/common/storage-redundancy", - "service": "Azure Storage", + "guid": "616785d6-fa96-4c96-ad88-518f482734c8", + "link": "https://learn.microsoft.com/azure/sap/workloads/high-availability-zones", + "service": "SAP", "services": [ - "Storage", - "WAF" + "SAP", + "WAF", + "Subscriptions" ], - "severity": "Medium", - "text": "Choose the most appropriate data redundancy option for Azure Storage based on your requirements", - "waf": "Reliability" + "severity": "High", + "text": "For each Azure subscription, run a latency test on Azure availability zones before zonal deployment to choose low-latency zones for deployment of SAP on Azure.", + "training": "https://github.com/Azure/SAP-on-Azure-Scripts-and-Utilities/tree/main/AvZone-Latency-Test", + "waf": "Performance" }, { - "arm-service": "Microsoft.Storage/storageAccounts", "checklist": "WAF checklist", - "description": "Assigning a Delete lock to your storage account helps protect the availability of your data, minimizing the risk of disruptions to your business operations.", - "guid": "85e2213d-bd7b-4b01-8f7b-95e06e158e3e", - "link": "https://learn.microsoft.com/azure/storage/common/lock-account-resource", - "service": "Azure Storage", + "guid": "410adcba-db46-424f-a6c4-05ecde75c52e", + "link": "https://learn.microsoft.com/azure/advisor/advisor-how-to-improve-reliability", + "service": "SAP", "services": [ "Storage", - "WAF" + "WAF", + "ASR" ], - "severity": "Low", - "text": "Apply a Delete lock to prevent accidental or malicious deletion of storage accounts", + "severity": "Medium", + "text": "Run the Resiliency Report to ensure that the configuration of the entire provisioned Azure infrastructure (Compute, Database, Networking, Storage, Site Recovery) complies with the configuration defined by Cloud Adaption Framework for Azure.", + "training": "https://learn.microsoft.com/training/paths/azure-well-architected-framework/", "waf": "Reliability" }, { - "arm-service": "Microsoft.Storage/storageAccounts", "checklist": "WAF checklist", - "description": "Container soft delete protects your data from being accidentally deleted by maintaining the deleted data in the system for a specified period of time.", - "guid": "a3992c2d-e6e2-4065-a3a7-6af4a691e893", - "link": "https://learn.microsoft.com/azure/storage/blobs/soft-delete-container-enable", - "service": "Azure Storage", + "guid": "86ba2802-1459-4114-95e3-9e5309cccd97", + "link": "https://learn.microsoft.com/azure/sentinel/sap/deployment-overview", + "service": "SAP", "services": [ - "Storage", + "Monitor", + "Sentinel", + "SAP", "WAF" ], - "severity": "Low", - "text": "Enable soft delete for Storage Account Containers", - "waf": "Reliability" + "severity": "Medium", + "text": "Implement threat protection by using the Microsoft Sentinel solution for SAP. Use this solution to monitor your SAP systems and detect sophisticated threats throughout the business logic and application layers.", + "training": "https://learn.microsoft.com/training/modules/plan-microsoft-sentinel-deployment-sap/?source=recommendations", + "waf": "Security" }, { - "arm-service": "Microsoft.Storage/storageAccounts", "checklist": "WAF checklist", - "description": "Blob soft delete protects an individual blob and its versions, snapshots, and metadata from accidental deletes or overwrites by maintaining the deleted data in the system for a specified period of time.", - "guid": "9ada4666-7e13-4c10-96b9-153d89f89dc7", - "link": "https://learn.microsoft.com/azure/storage/blobs/soft-delete-blob-enable", - "service": "Azure Storage", + "guid": "579266bc-ca27-45fa-a1ab-fe9d55d04c3c", + "link": "https://learn.microsoft.com/azure/cost-management-billing/costs/enable-tag-inheritance", + "service": "SAP", "services": [ - "Storage", + "Cost", "WAF" ], - "severity": "Low", - "text": "Enable soft delete for blobs", - "waf": "Reliability" + "severity": "Medium", + "text": "Azure tagging can be leveraged to logically group and track resources, automate their deployments, and most importantly, provide visibility on the incurred costs.", + "training": "https://learn.microsoft.com/training/modules/analyze-costs-create-budgets-azure-cost-management/?source=recommendations", + "waf": "Operations" }, { - "arm-service": "Microsoft.RecoveryServices/vaults", "checklist": "WAF checklist", - "description": "Azure Backup enhanced soft delete provides critical protection against ransomware attacks by retaining deleted backups, enabling recovery from potential ransomware encryption or deletion.", - "guid": "b44be3b1-a27f-48b9-b91b-e1038df03a82", - "link": "https://learn.microsoft.com/azure/backup/backup-azure-enhanced-soft-delete-about", - "service": "Azure Backup", + "guid": "04b8e5e5-13cb-4b22-af62-5a8ecfcf0337", + "link": "https://learn.microsoft.com/azure/virtual-network/virtual-network-test-latency?tabs=windows", + "service": "SAP", "services": [ - "Backup", + "VM", + "Monitor", "WAF" ], - "severity": "Medium", - "text": "Enable Azure Backup enhanced soft delete for improved data protection and recovery", - "waf": "Reliability" + "severity": "Low", + "text": "Use inter-VM latency monitoring for latency-sensitive applications.", + "waf": "Performance" }, { - "arm-service": "Microsoft.RecoveryServices/vaults", "checklist": "WAF checklist", - "description": "Azure Backup's multi-user authorization enables fine-grained control over user access to backup resources, allowing you to restrict privileges and ensure proper authentication and authorization for backup operations.", - "guid": "2cd463cb-bbc8-4ac2-a9eb-c92a43da1dae", - "link": "https://learn.microsoft.com/azure/backup/multi-user-authorization-concept", - "service": "Azure Backup", + "guid": "07e5ed53-3d96-43d8-87ea-631b77da5aba", + "link": "https://learn.microsoft.com/azure/sap/workloads/planning-guide-storage", + "service": "SAP", "services": [ - "Backup", - "WAF" + "Monitor", + "SAP", + "WAF", + "ASR" ], - "severity": "Low", - "text": "Implement multi-user authorization for Azure Backup to ensure secure and controlled access to backup resources", + "severity": "Medium", + "text": "Use Azure Site Recovery monitoring to maintain the health of the disaster recovery service for SAP application servers.", + "training": "https://learn.microsoft.com/training/modules/explore-azure-storage/?source=recommendations", "waf": "Reliability" }, { - "arm-service": "Microsoft.RecoveryServices/vaults", "checklist": "WAF checklist", - "description": "Azure Immutable Storage provides an additional layer of security by ensuring that backup data stored in the vault cannot be modified or deleted for a specified retention period. This helps safeguard your backups from ransomware attacks that may attempt to compromise or manipulate your backup data.", - "guid": "2cc88147-0607-4c1c-aa0e-614658dd458e", - "link": "https://learn.microsoft.com/azure/backup/backup-azure-immutable-vault-concept?source=recommendations&tabs=recovery-services-vault", - "service": "Azure Backup", + "guid": "abb6af9c-982c-4cf1-83fb-329fafd1ee56", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/eslz-management-and-monitoring", + "service": "SAP", "services": [ "Storage", - "Backup", - "WAF" + "WAF", + "SAP" ], - "severity": "Low", - "text": "Implement Immutable Storage for your vaults to protect against ransomware and prevent unauthorized modifications to backups", - "waf": "Reliability" + "severity": "Medium", + "text": "Exclude all the database file systems and executable programs from antivirus scans. Including them could lead to performance problems. Check with the database vendors for prescriptive details on the exclusion list. For example, Oracle recommends excluding /oracle//sapdata from antivirus scans.", + "waf": "Performance" }, { - "arm-service": "Microsoft.Network/dnsZones", "checklist": "WAF checklist", - "description": "To eliminate a single point of failure in your on-premises DNS services and ensure reliable DNS resolution during business continuity and disaster recovery scenarios, it is recommended to utilize Azure DNS Private Resolvers in multiple regions. By deploying two or more Azure DNS private resolvers across different regions, you can enable DNS failover and achieve resiliency in your DNS infrastructure.", - "guid": "43da1dae-2cc8-4814-9060-7c1cca0e6146", - "link": "https://learn.microsoft.com/azure/dns/tutorial-dns-private-resolver-failover", - "service": "DNS", + "guid": "c027f893-f404-41a9-b33d-39d625a14964", + "link": "https://sapit-forme-prod.authentication.eu11.hana.ondemand.com/login", + "service": "SAP", "services": [ - "DNS", - "ACR", - "ASR", + "SAP", "WAF" ], "severity": "Low", - "text": "Implement DNS Failover using Azure DNS Private Resolvers", - "waf": "Reliability" + "text": "Consider collecting full database statistics for non-HANA databases after migration. For example, implement SAP note 1020260 - Delivery of Oracle statistics.", + "waf": "Performance" }, { - "arm-service": "Microsoft.PowerBI/gateways", "checklist": "WAF checklist", - "description": "Use an on-premises data gateway cluster to avoid single points of failure and to load balance traffic across gateways.", - "guid": "89f89dc7-b44b-4e3b-8a27-f8b9e91be103", - "link": "https://learn.microsoft.com/data-integration/gateway/service-gateway-high-availability-clusters", - "service": "Data Gateways", + "guid": "fdafb1f5-3eee-4354-a8c9-deb8127ebc2e", + "link": "https://learn.microsoft.com/azure/virtual-machines/workloads/oracle/configure-oracle-asm", + "service": "SAP", "services": [ - "ACR", - "WAF" + "Storage", + "WAF", + "SAP" ], "severity": "Medium", - "text": "Use on-premises data gateway clusters to ensure high availability for business-critical data", - "waf": "Reliability" + "text": "Consider using Oracle Automatic Storage Management (ASM) for all Oracle deployments that use SAP on Azure.", + "training": "https://learn.microsoft.com/training/paths/administer-infrastructure-resources-in-azure/?source=recommendations", + "waf": "Performance" }, { - "arm-service": "Microsoft.Compute/virtualMachines", "checklist": "WAF checklist", - "description": "When choosing the best option for deploying NVAs in Azure, it is crucial to consider the vendor's recommendations and validate that the specific design has been vetted and validated by the NVA vendor. The vendor should also provide the necessary NVA configuration for seamless integration in Azure.", - "guid": "8b1188b3-c6a4-46ce-a544-451e192d3442", - "link": "https://learn.microsoft.com/azure/architecture/reference-architectures/dmz/nva-ha", - "service": "NVA", + "guid": "33c5d5bf-daf3-4f0d-bd50-6010fdcec22e", + "link": "https://techcommunity.microsoft.com/t5/running-sap-applications-on-the/announcement-sap-on-azure-oracle-performance-efficiency-scripts/ba-p/3725178", + "service": "SAP", "services": [ - "NVA", + "SAP", + "SQL", "WAF" ], - "severity": "High", - "text": "Deploy Network Virtual Appliances (NVAs) in a vendor supported configuration for High Availability", - "waf": "Reliability" + "severity": "Medium", + "text": "For SAP on Azure running Oracle, a collection of SQL scripts can help you diagnose performance problems. Automatic Workload Repository (AWR) reports contain valuable information for diagnosing problems in the Oracle system. We recommend that you run an AWR report during several sessions and choose peak times for it, to ensure broad coverage for the analysis.", + "training": "https://learn.microsoft.com/ja-jp/azure/well-architected/oracle-iaas/performance-efficiency", + "waf": "Performance" }, { - "arm-service": "microsoft.network/frontdoors", "checklist": "WAF checklist", - "guid": "f00a69de-7076-4734-a734-6e4552cad9e1", - "link": "https://learn.microsoft.com/azure/frontdoor/best-practices#use-latest-version-for-customer-managed-certificates", - "service": "Front Door", + "guid": "d89fd98d-23e4-4b40-a92e-32db9365522c", + "link": "https://learn.microsoft.com/azure/site-recovery/site-recovery-monitor-and-troubleshoot", + "service": "SAP", "services": [ - "AKV", - "FrontDoor", - "WAF" + "Monitor", + "SAP", + "WAF", + "ASR" ], - "severity": "Medium", - "text": "If you use customer-managed TLS certificates with Azure Front Door, use the 'Latest' certificate version. Reduce the risk of outages caused by manual certificate renewal", + "severity": "High", + "text": "Use Azure Site Recovery monitoring to maintain the health of the disaster recovery service for SAP application servers.", + "training": "https://learn.microsoft.com/training/modules/protect-on-premises-infrastructure-with-azure-site-recovery/?source=recommendations", "waf": "Operations" }, { - "arm-service": "microsoft.network/applicationGateways", "checklist": "WAF checklist", - "graph": "resources | where type == 'microsoft.network/applicationgateways' | project id, compliant = properties.sku.name in ('Standard_v2', 'WAF_v2') | project id,compliant", - "guid": "553585a6-abe0-11ed-afa1-0242ac120002", - "link": "https://learn.microsoft.com/azure/application-gateway/overview-v2", - "service": "App Gateway", + "guid": "5ba34d46-85e2-4213-ace7-bb122f7c95f0", + "link": "https://learn.microsoft.com/azure/ddos-protection/ddos-protection-overview", + "service": "SAP", "services": [ "AppGW", - "WAF" + "WAF", + "AzurePolicy" ], "severity": "Medium", - "text": "Ensure you are using Application Gateway v2 SKU", - "training": "https://learn.microsoft.com/learn/paths/secure-application-delivery/", + "text": "For secure delivery of HTTP/S apps, use Application Gateway v2 and ensure that WAF protection and policies are enabled.", + "training": "https://learn.microsoft.com/training/modules/introduction-azure-web-application-firewall/", "waf": "Security" }, { - "arm-service": "Microsoft.Network/loadBalancers", "checklist": "WAF checklist", - "graph": "resources | where type == 'microsoft.network/loadbalancers' | project id, compliant=(tolower(sku.name) == 'standard')", - "guid": "4e35fbf5-0ae2-48b2-97ce-753353edbd1a", - "link": "https://learn.microsoft.com/azure/load-balancer/load-balancer-overview", - "service": "Load Balancer", + "guid": "fa9d30bc-1b82-4e4b-bfdf-6b017938b9e6", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/eslz-network-topology-and-connectivity", + "service": "SAP", "services": [ - "LoadBalancer", + "VM", + "DNS", + "SAP", "WAF" ], "severity": "Medium", - "text": "Ensure you are using the Standard SKU for your Azure Load Balancers", - "waf": "Security" + "text": "If the virtual machine's DNS or virtual name is not changed during migration to Azure, Background DNS and virtual names connect many system interfaces in the SAP landscape, and customers are only sometimes aware of the interfaces that developers define over time. Connection challenges arise between various systems when virtual or DNS names change after migrations, and it's recommended to retain DNS aliases to prevent these types of difficulties.", + "training": "https://learn.microsoft.com/training/modules/explore-azure-networking/4-explore-name-resolution", + "waf": "Operations" }, { - "arm-service": "Microsoft.Network/loadBalancers", "checklist": "WAF checklist", - "guid": "9432621a-8397-4654-a882-5bc856b7ef83", - "link": "https://learn.microsoft.com/azure/load-balancer/load-balancer-standard-availability-zones", - "service": "Load Balancer", + "guid": "a2858f78-105b-4f52-b7a9-5b0f4439743b", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/eslz-network-topology-and-connectivity", + "service": "SAP", "services": [ - "LoadBalancer", + "VNet", + "DNS", + "SAP", "WAF" ], "severity": "Medium", - "text": "Ensure your Load Balancers frontend IP addresses are zone-redundant (unless you require zonal frontends).", - "waf": "Security" + "text": "Use different DNS zones to distinguish each environment (sandbox, development, preproduction, and production) from each other. The exception is for SAP deployments with their own VNet; here, private DNS zones might not be necessary.", + "training": "https://learn.microsoft.com/training/modules/explore-azure-networking/4-explore-name-resolution", + "waf": "Operations" }, { - "arm-service": "microsoft.network/applicationGateways", "checklist": "WAF checklist", - "graph": "resources | where type=='microsoft.network/applicationgateways' | extend subnetId = tostring(properties.gatewayIPConfigurations[0].properties.subnet.id) | project id, subnetId | join (resources | where type=='microsoft.network/virtualnetworks' | project id,subnets=properties.subnets | mv-expand subnets | mv-expand subnets.properties.addressPrefixes | project id, subnetId = tostring(subnets.id), prefix1 = subnets.properties.addressPrefix, prefix2 = subnets.properties.addressPrefixes | mv-expand prefix2 | extend prefix = iff(isnotnull(prefix1), prefix1, prefix2) | extend subnetPrefixLength = split(prefix, '/')[1])on subnetId | extend compliant = (subnetPrefixLength <= 24 or subnetPrefixLength == 64) | distinct id,compliant", - "guid": "dfc50f87-3800-424c-937b-ed5f186e7c15", - "link": "https://learn.microsoft.com/azure/application-gateway/configuration-infrastructure#size-of-the-subnet", - "service": "App Gateway", + "guid": "a3592829-e6e2-4061-9368-6af46791f893", + "link": "https://learn.microsoft.com/azure/virtual-network/virtual-network-peering-overview", + "service": "SAP", "services": [ "VNet", - "AppGW", + "ACR", + "SAP", "WAF" ], "severity": "Medium", - "text": "Your Application Gateways v2 should be deployed in subnets with IP prefixes equal or larger than /24", - "training": "https://learn.microsoft.com/learn/paths/secure-application-delivery/", - "waf": "Security" + "text": "Local and global VNet peering provide connectivity and are the preferred approaches to ensure connectivity between landing zones for SAP deployments across multiple Azure regions", + "training": "https://learn.microsoft.com/training/modules/configure-vnet-peering/?source=recommendations", + "waf": "Reliability" }, { - "arm-service": "microsoft.network/applicationGateways", "checklist": "WAF checklist", - "description": "Administration of reverse proxies in general and WAF in particular is closer to the application than to networking, so they belong in the same subscription as the app. Centralizing the Application Gateway and WAF in the connectivity subscription might be OK if it is managed by one single team.", - "guid": "48b662d6-d15f-4512-a654-98f6dfe237de", - "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/ag-overview", - "service": "App Gateway", + "guid": "41742694-3ff8-4ae7-b7d4-743176c8bcbf", + "link": "https://learn.microsoft.com/azure/sap/workloads/planning-guide", + "service": "SAP", "services": [ - "Entra", - "AppGW", + "SAP", "NVA", - "Subscriptions", - "VNet", "WAF" ], - "severity": "Medium", - "text": "Deploy Azure Application Gateway v2 or partner NVAs used for proxying inbound HTTP(S) connections within the landing-zone virtual network and with the apps that they're securing.", - "training": "https://learn.microsoft.com/learn/paths/secure-application-delivery/", - "waf": "Security" + "severity": "High", + "text": "It is not supported to deploy any NVA between SAP application and SAP Database server", + "training": "https://me.sap.com/notes/2731110", + "waf": "Performance" }, { - "arm-service": "microsoft.network/applicationGateways", "checklist": "WAF checklist", - "guid": "f109e1f3-c79b-4f14-82de-6b5c22314d08", - "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/ag-overview", - "service": "App Gateway", + "guid": "7d4bc7d2-c34a-452e-8f1d-6ae3c8eafcc3", + "link": "https://learn.microsoft.com/training/modules/introduction-azure-virtual-wan/?source=recommendations", + "service": "SAP", "services": [ - "DDoS", - "WAF" + "ACR", + "SAP", + "WAF", + "VWAN" ], "severity": "Medium", - "text": "Use a DDoS Network or IP protection plans for all Public IP addresses in application landing zones.", - "training": "https://learn.microsoft.com/learn/paths/secure-networking-infrastructure/", - "waf": "Security" + "text": "Use Virtual WAN for Azure deployments in new, large, or global networks where you need global transit connectivity across Azure regions and on-premises locations. With this approach, you won't need to manually set up transitive routing for Azure networking, and you can follow a standard for SAP on Azure deployments.", + "training": "https://learn.microsoft.com/azure/virtual-wan/virtual-wan-about", + "waf": "Operations" }, { - "arm-service": "microsoft.network/applicationGateways", "checklist": "WAF checklist", - "graph": "resources | where type =~ 'microsoft.network/applicationGateways' | extend compliant = (isnotnull(properties.autoscaleConfiguration) and properties.autoscaleConfiguration.minCapacity >= 2) | distinct id,compliant", - "guid": "135bf4ac-f9db-461f-b76b-2ee9e30b12c0", - "link": "https://learn.microsoft.com/azure/application-gateway/application-gateway-autoscaling-zone-redundant", - "service": "App Gateway", + "guid": "0cedb1f6-ae6c-492b-8b17-8061f50b16d3", + "link": "https://learn.microsoft.com/azure/well-architected/services/networking/network-virtual-appliances/reliability", + "service": "SAP", "services": [ + "VNet", + "NVA", "WAF" ], "severity": "Medium", - "text": "Configure autoscaling with a minimum amount of instances of two.", - "training": "https://learn.microsoft.com/learn/paths/secure-application-delivery/", - "waf": "Reliability" + "text": "Consider deploying network virtual appliances (NVAs) between regions only if partner NVAs are used. NVAs between regions or VNets aren't required if native NVAs are present. When you're deploying partner networking technologies and NVAs, follow the vendor's guidance to verify conflicting configurations with Azure networking.", + "training": "https://learn.microsoft.com/training/modules/control-network-traffic-flow-with-routes/?source=recommendations", + "waf": "Operations" }, { - "arm-service": "microsoft.network/applicationGateways", "checklist": "WAF checklist", - "graph": "resources | where type =~ 'microsoft.network/applicationGateways' | extend compliant = (isnotnull(zones) and array_length(zones) > 1) | distinct id,compliant", - "guid": "060c6964-52b5-48db-af8b-83e4b2d85349", - "link": "https://learn.microsoft.com/azure/reliability/migrate-app-gateway-v2", - "service": "App Gateway", + "guid": "facc08c6-ea95-4641-91cd-fa09e573adbd", + "link": "https://learn.microsoft.com/azure/architecture/networking/hub-spoke-vwan-architecture", + "service": "SAP", "services": [ - "ACR", - "AppGW", - "WAF" + "NVA", + "VNet", + "WAF", + "SAP", + "VWAN" ], "severity": "Medium", - "text": "Deploy Application Gateway across Availability Zones", - "training": "https://learn.microsoft.com/learn/paths/secure-application-delivery/", - "waf": "Reliability" + "text": "Virtual WAN manages connectivity between spoke VNets for virtual-WAN-based topologies (no need to set up user-defined routing [UDR] or NVAs), and maximum network throughput for VNet-to-VNet traffic in the same virtual hub is 50 gigabits per second. If necessary, SAP landing zones can use VNet peering to connect to other landing zones and overcome this bandwidth limitation.", + "training": "https://learn.microsoft.com/training/modules/hub-and-spoke-network-architecture/?source=recommendations", + "waf": "Operations" }, { - "arm-service": "microsoft.network/frontdoors", "checklist": "WAF checklist", - "guid": "e79d17b7-3b22-4a5a-97e7-a8ed4b30e38c", - "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/ag-overview", - "service": "Front Door", + "guid": "82734c88-6ba2-4802-8459-11475e39e530", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/ready/azure-best-practices/plan-for-ip-addressing", + "service": "SAP", "services": [ - "FrontDoor", - "AzurePolicy", + "VM", + "SAP", "WAF" ], - "severity": "Medium", - "text": "Use Azure Front Door with WAF policies to deliver and help protect global HTTP/S apps that span multiple Azure regions.", - "training": "https://learn.microsoft.com/learn/paths/secure-networking-infrastructure/", + "severity": "High", + "text": "Public IP assignment to VM running SAP Workload is not recommended.", + "training": "https://learn.microsoft.com/training/modules/design-ip-addressing-for-azure/?source=recommendations", "waf": "Security" }, { - "arm-service": "microsoft.network/frontdoors", "checklist": "WAF checklist", - "guid": "3f29812b-2363-4cef-b179-b599de0d5973", - "link": "https://learn.microsoft.com/azure/ddos-protection/ddos-protection-overview", - "service": "Front Door", + "guid": "9cccd979-366b-4cda-8750-ab1ab039d95d", + "link": "https://learn.microsoft.com/training/modules/protect-on-premises-infrastructure-with-azure-site-recovery/?source=recommendations", + "service": "SAP", "services": [ - "FrontDoor", - "AppGW", - "AzurePolicy", + "ASR", "WAF" ], - "severity": "Medium", - "text": "When using Front Door and Application Gateway to help protect HTTP/S apps, use WAF policies in Front Door. Lock down Application Gateway to receive traffic only from Front Door.", - "training": "https://learn.microsoft.com/learn/paths/secure-networking-infrastructure/", - "waf": "Security" + "severity": "High", + "text": "Consider reserving IP address on DR side when configuring ASR", + "training": "https://learn.microsoft.com/learn/paths/architect-network-infrastructure/", + "waf": "Operations" }, { - "ammp": true, - "arm-service": "microsoft.network/trafficManagerProfiles", "checklist": "WAF checklist", - "guid": "cd4cd21b-0881-437f-9e6c-4cfd3e504547", - "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/ag-overview", - "service": "Traffic Manager", + "guid": "54c7c892-9cb1-407d-9325-ae525ba34d46", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/ready/azure-best-practices/plan-for-ip-addressing", + "service": "SAP", "services": [ - "TrafficManager", "WAF" ], "severity": "High", - "text": "Use Traffic Manager to deliver global apps that span protocols other than HTTP/S.", - "training": "https://learn.microsoft.com/learn/paths/secure-networking-infrastructure/", - "waf": "Reliability" + "text": "Avoid using overlapping IP address ranges for production and DR sites.", + "training": "https://learn.microsoft.com/training/modules/design-ip-addressing-for-azure/?source=recommendations", + "waf": "Operations" }, { "checklist": "WAF checklist", - "guid": "3b4b3e88-a459-4ed5-a22f-644dfbc58204", - "link": "https://learn.microsoft.com/azure/active-directory/app-proxy/application-proxy#how-application-proxy-works", - "service": "Entra", + "guid": "6e154e3a-a359-4282-ae6e-206173686af4", + "link": "https://learn.microsoft.com/azure/azure-netapp-files/azure-netapp-files-delegate-subnet", + "service": "SAP", "services": [ - "Entra", - "AVD", + "VNet", + "Storage", "WAF" ], - "severity": "Low", - "text": "If users only need access to internal applications, has Microsoft Entra ID Application Proxy been considered as an alternative to Azure Virtual Desktop (AVD)?", - "training": "https://learn.microsoft.com/learn/modules/configure-azure-ad-application-proxy/", - "waf": "Security" + "severity": "Medium", + "text": "While Azure does help you to create multiple delegated subnets in a VNet, only one delegated subnet can exist in a VNet for Azure NetApp Files. Attempts to create a new volume will fail if you use more than one delegated subnet for Azure NetApp Files.", + "training": "https://learn.microsoft.com/azure/azure-netapp-files/azure-netapp-files-network-topologies?source=recommendations", + "waf": "Operations" }, { "checklist": "WAF checklist", - "guid": "01ca7cf1-5754-442d-babb-8ba6772e5c30", - "link": "https://learn.microsoft.com/azure/active-directory/app-proxy/application-proxy#how-application-proxy-works", - "service": "Entra", + "guid": "d8a03e97-7784-424d-9167-85d6fa96c96a", + "link": "https://learn.microsoft.com/azure/well-architected/services/networking/azure-firewall?toc=%2Fazure%2Ffirewall%2Ftoc.json&bc=%2Fazure%2Ffirewall%2Fbreadcrumb%2Ftoc.json", + "service": "SAP", + "services": [ + "WAF", + "Firewall" + ], + "severity": "Medium", + "text": "Use Azure Firewall to govern Azure outbound traffic to the internet, non-HTTP/S inbound connections, and East/West traffic filtering (if the organization requires it)", + "training": "https://learn.microsoft.com/training/paths/secure-networking-infrastructure/", + "waf": "Security" + }, + { + "checklist": "WAF checklist", + "guid": "91a65e40-be90-45b3-9f73-f3edbf8dc324", + "link": "https://learn.microsoft.com/azure/sap/workloads/expose-sap-process-orchestration-on-azure", + "service": "SAP", "services": [ - "Entra", + "SAP", + "AppGW", "WAF" ], "severity": "Medium", - "text": "To reduce the number of firewall ports open for incoming connections in your network, consider using Microsoft Entra ID Application Proxy to give remote users secure and authenticated access to internal applications.", - "training": "https://learn.microsoft.com/learn/paths/implement-applications-external-access-azure-ad/", + "text": "Application Gateway and Web Application Firewall have limitations when Application Gateway serves as a reverse proxy for SAP web apps, as shown in the comparison between Application Gateway, SAP Web Dispatcher, and other third-party services.", + "training": "https://help.sap.com/docs/SUPPORT_CONTENT/si/3362959506.html", "waf": "Security" }, { - "ammp": true, - "arm-service": "microsoft.network/frontdoors", "checklist": "WAF checklist", - "graph": "resources | where type == 'microsoft.network/frontdoorwebapplicationfirewallpolicies' | project policyName=name, policyId=id,policySku=sku.name, links=properties.securityPolicyLinks, enabledState=properties.policySettings.enabledState, mode=properties.policySettings.mode | mvexpand links | extend securityPolicy=links.id | extend securityPolicyParts=split(securityPolicy, '/') | extend profileId=strcat_array(array_slice(securityPolicyParts, 0, -3), '/') | project id=profileId, compliant=((enabledState=='Enabled') and (mode=='Prevention')), enabledState, mode", - "guid": "ae248989-b306-4591-9186-de482e3f0f0e", - "link": "https://learn.microsoft.com/azure/web-application-firewall/afds/waf-front-door-policy-settings", - "service": "Front Door", + "guid": "5e39e530-9ccc-4d97-a366-bcda2750ab1a", + "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/ag-overview", + "service": "SAP", "services": [ + "ACR", + "WAF", "FrontDoor", - "AzurePolicy", - "WAF" + "AzurePolicy" ], - "severity": "High", - "text": "Deploy your WAF policy for Front Door in 'Prevention' mode.", + "severity": "Medium", + "text": "Use Azure Front Door and WAF policies to provide global protection across Azure regions for inbound HTTP/S connections to a landing zone.", + "training": "https://learn.microsoft.com/training/paths/secure-application-delivery/", "waf": "Security" }, { - "ammp": true, - "arm-service": "microsoft.network/frontdoors", "checklist": "WAF checklist", - "guid": "062d5839-4d36-402f-bfa4-02811eb936e9", - "link": "https://learn.microsoft.com/azure/frontdoor/best-practices#avoid-combining-traffic-manager-and-front-door", - "service": "Front Door", + "guid": "b039d95d-54c7-4c89-89cb-107d5325ae52", + "link": "https://learn.microsoft.com/azure/web-application-firewall/afds/afds-overview", + "service": "SAP", "services": [ - "TrafficManager", + "AppGW", + "WAF", "FrontDoor", - "WAF" + "AzurePolicy" ], - "severity": "High", - "text": "Avoid combining Azure Traffic Manager and Azure Front Door.", + "severity": "Medium", + "text": "Take advantage of Web Application Firewall policies in Azure Front Door when you're using Azure Front Door and Application Gateway to protect HTTP/S applications. Lock down Application Gateway to receive traffic only from Azure Front Door.", + "training": "https://learn.microsoft.com/training/modules/introduction-azure-web-application-firewall/?source=recommendations", "waf": "Security" }, { - "ammp": true, - "arm-service": "microsoft.network/frontdoors", "checklist": "WAF checklist", - "guid": "5efeb96a-003f-4b18-8fcd-b4d84459c2b2", - "link": "https://learn.microsoft.com/azure/frontdoor/best-practices#use-the-same-domain-name-on-front-door-and-your-origin", - "service": "Front Door", + "guid": "5ada4332-4e13-4811-9231-81aa41742694", + "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/ag-overview", + "service": "SAP", "services": [ - "FrontDoor", - "WAF" + "AppGW", + "WAF", + "LoadBalancer" ], - "severity": "High", - "text": "Use the same domain name on Azure Front Door and your origin. Mismatched host names can cause subtle bugs.", + "severity": "Medium", + "text": "Use a web application firewall to scan your traffic when it's exposed to the internet. Another option is to use it with your load balancer or with resources that have built-in firewall capabilities like Application Gateway or third-party solutions.", + "training": "https://learn.microsoft.com/training/modules/introduction-azure-web-application-firewall/?source=recommendations", "waf": "Security" }, { - "arm-service": "microsoft.network/frontdoors", "checklist": "WAF checklist", - "graph": "cdnresources | where type =~ 'microsoft.cdn/profiles/origingroups/origins' | extend frontDoorId = substring(id, 0, indexof(id, '/origingroups')) | extend originGroupId = substring(id, 0, indexof(id, '/origins')) | join kind=inner (cdnresources | where type =~ 'microsoft.cdn/profiles/origingroups' | extend originGroupName = name | extend hasHealthProbe = isnotnull(properties.healthProbeSettings)) on $left.originGroupId == $right.id | summarize numberOrigins = count() by originGroupId, subscriptionId, frontDoorId, hasHealthProbe, originGroupName | extend compliant = not(numberOrigins == 1 and hasHealthProbe) | project id = frontDoorId, compliant", - "guid": "0b5a380c-4bfb-47bc-b1d7-dcfef363a61b", - "link": "https://learn.microsoft.com/azure/frontdoor/best-practices#disable-health-probes-when-theres-only-one-origin-in-an-origin-group", - "service": "Front Door", + "guid": "e73de7d5-6f36-4217-a526-e1a621ecddde", + "link": "https://learn.microsoft.com/azure/frontdoor/front-door-overview", + "service": "SAP", "services": [ - "FrontDoor", - "WAF" + "ACR", + "SAP", + "WAF", + "VWAN" ], - "severity": "Low", - "text": "Disable health probes when there is only one origin in an Azure Front Door origin group.", + "severity": "Medium", + "text": "Use Virtual WAN for Azure deployments in new, large, or global networks where you need global transit connectivity across Azure regions and on-premises locations. With this approach, you won't need to manually set up transitive routing for Azure networking, and you can follow a standard for SAP on Azure deployments.", + "training": "https://learn.microsoft.com/training/modules/explore-azure-networking/10-explore-azure-front-door", "waf": "Performance" }, { - "arm-service": "microsoft.network/frontdoors", "checklist": "WAF checklist", - "guid": "5567048e-e5d7-4206-9c55-b5ed45d2cc0c", - "link": "https://learn.microsoft.com/azure/frontdoor/best-practices#select-good-health-probe-endpoints", - "service": "Front Door", + "guid": "3c536a3e-1b6b-4e87-95ca-15edb47251c0", + "link": "https://learn.microsoft.com/azure/virtual-network/vnet-integration-for-azure-services", + "service": "SAP", "services": [ - "FrontDoor", - "WAF" + "Storage", + "VNet", + "WAF", + "PrivateLink", + "ACR", + "Backup" ], "severity": "Medium", - "text": "Select good health probe endpoints for Azure Front Door. Consider building health endpoints that check all of your application's dependencies.", - "waf": "Reliability" + "text": "To prevent data leakage, use Azure Private Link to securely access platform as a service resources like Azure Blob Storage, Azure Files, Azure Data Lake Storage Gen2, Azure Data Factory, and more. Azure Private Endpoint can also help to secure traffic between VNets and services like Azure Storage, Azure Backup, and more. Traffic between your VNet and the Private Endpoint enabled service travels across the Microsoft global network, which prevents its exposure to the public internet.", + "training": "https://learn.microsoft.com/training/modules/design-implement-private-access-to-azure-services/?source=recommendations", + "waf": "Security" }, { - "arm-service": "microsoft.network/frontdoors", "checklist": "WAF checklist", - "graph": "cdnresources | where type =~ 'microsoft.cdn/profiles/origingroups' | extend frontDoorId = substring(id, 0, indexof(id, '/origingroups/')) | extend compliant = (isnull(properties['healthProbeSettings']['probeRequestType']) or toupper(properties['healthProbeSettings']['probeRequestType']) == 'HEAD') | project compliant, id=frontDoorId", - "guid": "a13f72f3-8f5c-4864-95e5-75bf37fbbeb1", - "link": "https://learn.microsoft.com/azure/frontdoor/best-practices#use-head-health-probes", - "service": "Front Door", + "guid": "85e2213a-ce7b-4b12-8f7c-95f06e154e3a", + "link": "https://learn.microsoft.com/azure/virtual-network/accelerated-networking-overview?tabs=redhat", + "service": "SAP", "services": [ - "FrontDoor", + "VM", + "SAP", "WAF" ], - "severity": "Low", - "text": "Use HEAD health probes with Azure Front Door, to reduce the traffic that Front Door sends to your application.", + "severity": "High", + "text": "Make sure that Azure accelerated networking is enabled on the VMs used in the SAP application and DBMS layers.", + "training": "https://learn.microsoft.com/training/paths/azure-fundamentals-describe-azure-architecture-services/?source=recommendations", "waf": "Performance" }, { - "ammp": true, - "arm-service": "Microsoft.Network/loadBalancers", "checklist": "WAF checklist", - "graph": "resources | where type=='microsoft.network/loadbalancers' | extend countOutRules=array_length(properties.outboundRules) | extend compliant = (countOutRules == 0) | distinct id,compliant", - "guid": "97a2fd46-64b0-1dfa-b72d-9c8869496d75", - "link": "https://learn.microsoft.com/azure/nat-gateway/nat-overview#outbound-connectivity", - "service": "Load Balancer", + "guid": "3ff8ae7d-7d47-4431-96c8-bcbf45bbe609", + "link": "https://learn.microsoft.com/azure/load-balancer/load-balancer-multivip-overview", + "service": "SAP", "services": [ - "LoadBalancer", + "WAF", + "LoadBalancer" + ], + "severity": "Medium", + "text": "Make sure that internal deployments for Azure Load Balancer are set up to use Direct Server Return (DSR). This setting (Enabling Floating IP) will reduce latency when internal load balancer configurations are used for high-availability configurations on the DBMS layer.", + "training": "https://learn.microsoft.com/ja-jp/training/modules/load-balancing-non-https-traffic-azure/?source=recommendations", + "waf": "Security" + }, + { + "checklist": "WAF checklist", + "guid": "6791f893-5ada-4433-84e1-3811523181aa", + "link": "https://learn.microsoft.com/azure/virtual-network/network-security-group-how-it-works", + "service": "SAP", + "services": [ + "VM", + "VNet", + "SAP", "WAF" ], - "severity": "High", - "text": "Use Azure NAT Gateway instead of Load Balancer outbound rules for better SNAT scalability", - "waf": "Reliability" + "severity": "Medium", + "text": "You can use application security group (ASG) and NSG rules to define network security access-control lists between the SAP application and DBMS layers. ASGs group virtual machines to help manage their security.", + "training": "https://learn.microsoft.com/training/modules/configure-network-security-groups/?source=recommendations", + "waf": "Security" }, { - "ammp": true, - "arm-service": "microsoft.network/frontdoors", "checklist": "WAF checklist", - "graph": "cdnresources | where type =~ 'microsoft.cdn/profiles/customdomains' | extend frontDoorId = substring(id, 0, indexof(id, '/customdomains')) | extend compliant = (isnull(properties['tlsSettings']['certificateType']) or tolower(properties['tlsSettings']['certificateType']) =~ 'customercertificate') | project compliant, id = frontDoorId", - "guid": "af95c92d-d723-4f4a-98d7-8722324efd4d", - "link": "https://learn.microsoft.com/azure/frontdoor/best-practices#use-managed-tls-certificates", - "service": "Front Door", + "guid": "45bbe609-d8a0-43e9-9778-424d616785d6", + "link": "https://me.sap.com/notes/2015553", + "service": "SAP", "services": [ - "AKV", - "Cost", - "FrontDoor", + "VNet", + "SAP", "WAF" ], "severity": "High", - "text": "Use managed TLS certificates with Azure Front Door. Reduce operational cost and risk of outages due to certificate renewals.", - "waf": "Operations" + "text": "Placing of the SAP application layer and SAP DBMS in different Azure VNets that aren't peered isn't supported.", + "training": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/eslz-network-topology-and-connectivity", + "waf": "Performance" }, { - "arm-service": "microsoft.network/frontdoors", "checklist": "WAF checklist", - "guid": "189ea962-3969-4863-8f5a-5ad808c2cf4b", - "link": "https://learn.microsoft.com/azure/web-application-firewall/afds/waf-front-door-best-practices#define-your-waf-configuration-as-code", - "service": "Front Door", + "guid": "fa96c96a-d885-418f-9827-34c886ba2802", + "link": "https://learn.microsoft.com/azure/sap/workloads/proximity-placement-scenarios", + "service": "SAP", "services": [ - "FrontDoor", + "SAP", "WAF" ], "severity": "Medium", - "text": "Define your Azure Front Door WAF configuration as code. By using code, you can more easily adopt new rule set version and gain additional protection.", - "waf": "Operations" + "text": "For optimal network latency with SAP applications, consider using Azure proximity placement groups.", + "training": "https://learn.microsoft.com/azure/virtual-machines/co-location#planned-maintenance-and-proximity-placement-groups", + "waf": "Performance" }, { - "ammp": true, - "arm-service": "microsoft.network/frontdoors", "checklist": "WAF checklist", - "guid": "2e30abab-5478-417c-81bf-bf1ad4ed1ed4", - "link": "https://learn.microsoft.com/azure/frontdoor/best-practices#use-end-to-end-tls", - "service": "Front Door", + "guid": "18c8b61c-855a-4405-b6ed-266455e4f4ce", + "link": "https://me.sap.com/notes/2015553", + "service": "SAP", "services": [ - "FrontDoor", + "SAP", "WAF" ], "severity": "High", - "text": "Use end-to-end TLS with Azure Front Door. Use TLS for connections from your clients to Front Door, and from Front Door to your origin.", - "waf": "Security" + "text": "It is NOT supported at all to run an SAP Application Server layer and DBMS layer split between on-premise and Azure. Both layers need to completely reside either on-premise or in Azure.", + "training": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/eslz-network-topology-and-connectivity", + "waf": "Performance" }, { - "arm-service": "microsoft.network/frontdoors", "checklist": "WAF checklist", - "guid": "10aa45af-166f-44c4-9f36-b6d592dac2ca", - "link": "https://learn.microsoft.com/azure/frontdoor/best-practices#use-http-to-https-redirection", - "service": "Front Door", + "guid": "b65c878b-4b14-4f4e-92d8-d873936493f2", + "link": "https://me.sap.com/notes/2015553", + "service": "SAP", "services": [ - "FrontDoor", - "WAF" + "VNet", + "SAP", + "WAF", + "Cost" ], - "severity": "Medium", - "text": "Use HTTP to HTTPS redirection with Azure Front Door. Support older clients by redirecting them to an HTTPS request automatically.", - "waf": "Security" + "severity": "High", + "text": "It isn't recommended to host the database management system (DBMS) and application layers of SAP systems in different VNets and connect them with VNet peering because of the substantial costs that excessive network traffic between the layers can produce. Recommend using subnets within the Azure virtual network to separate the SAP application layer and DBMS layer.", + "training": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/eslz-network-topology-and-connectivity", + "waf": "Cost" }, { - "ammp": true, - "arm-service": "microsoft.network/frontdoors", "checklist": "WAF checklist", - "guid": "28b9ee82-b2c7-45aa-bc98-6de6f59a095d", - "link": "https://learn.microsoft.com/azure/frontdoor/best-practices#enable-the-waf", - "service": "Front Door", + "guid": "402a9846-d515-4061-aff8-cd30088693fa", + "link": "https://learn.microsoft.com/azure/sap/workloads/high-availability-guide-rhel", + "service": "SAP", "services": [ - "FrontDoor", - "WAF" + "WAF", + "LoadBalancer" ], "severity": "High", - "text": "Enable the Azure Front Door WAF. Protect your application from a range of attacks.", - "waf": "Security" + "text": "If using Load Balancer with Linux guest operating systems, check that the Linux network parameter net.ipv4.tcp_timestamps is set to 0.", + "training": "https://learn.microsoft.com/training/modules/implement-ha-sap-netweaver-anydb/?source=recommendations", + "waf": "Performance" }, { - "ammp": true, - "arm-service": "microsoft.network/frontdoors", "checklist": "WAF checklist", - "guid": "2902d8cc-1b0c-4495-afad-624ab70f7bd6", - "link": "https://learn.microsoft.com/azure/web-application-firewall/afds/waf-front-door-best-practices#tune-your-waf", - "service": "Front Door", + "guid": "87585797-5551-4d53-bb7d-a94ee415734d", + "link": "https://learn.microsoft.com/azure/sap/workloads/rise-integration", + "service": "SAP", "services": [ - "FrontDoor", + "VNet", + "SAP", "WAF" ], - "severity": "High", - "text": "Tune the Azure Front Door WAF for your workload. Reduce false positive detections.", + "severity": "Medium", + "text": "For SAP RISE/ECS deployments, virtual peering is the preferred way to establish connectivity with customer's existing Azure environment. Both the SAP vnet and customer vnet(s) are protected with network security groups (NSG), enabling communication on SAP and database ports through the vnet peering", "waf": "Security" }, { - "ammp": true, - "arm-service": "microsoft.network/frontdoors", "checklist": "WAF checklist", - "guid": "17ba124b-127d-42b6-9322-388d5b2bbcfc", - "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/application-gateway-waf-request-size-limits#request-body-inspection", - "service": "Front Door", + "guid": "ff5136bd-dcf1-4d2b-ae52-39333efdf45a", + "link": "https://learn.microsoft.com/azure/backup/sap-hana-database-about", + "service": "SAP", "services": [ - "FrontDoor", - "AzurePolicy", - "WAF" + "VM", + "SAP", + "WAF", + "Backup" ], "severity": "High", - "text": "Enable request body inspection feature enabled in Azure Front Door WAF policy.", - "waf": "Security" + "text": "Review SAP HANA database backups for Azure VMs.", + "waf": "Cost" }, { - "ammp": true, - "arm-service": "microsoft.network/frontdoors", "checklist": "WAF checklist", - "guid": "49a98f2b-ec22-4a87-9415-6a10b00d6555", - "link": "https://learn.microsoft.com/azure/web-application-firewall/afds/waf-front-door-best-practices#enable-default-rule-sets", - "service": "Front Door", + "guid": "cafde29d-a0af-4bcd-87c0-0f299d63f0e8", + "link": "https://learn.microsoft.com/azure/site-recovery/site-recovery-monitor-and-troubleshoot", + "service": "SAP", "services": [ - "FrontDoor", - "WAF" + "Monitor", + "SAP", + "WAF", + "ASR" ], - "severity": "High", - "text": "Enable the Azure Front Door WAF default rule sets. The default rule sets detect and block common attacks.", - "waf": "Security" + "severity": "Medium", + "text": "Review Site Recovery built-in monitoring, where used for SAP.", + "waf": "Cost" }, { - "ammp": true, - "arm-service": "microsoft.network/frontdoors", "checklist": "WAF checklist", - "guid": "147a13d4-2a2f-4824-a524-f5855b52b946", - "link": "https://learn.microsoft.com/azure/web-application-firewall/afds/waf-front-door-best-practices#enable-bot-management-rules", - "service": "Front Door", + "guid": "82d7b8de-d3f1-44a0-830b-38e200e82acf", + "link": "https://help.sap.com/docs/SAP_HANA_PLATFORM/c4d7c773af4a4e5dbebb6548d6e2d4f4/e3111d2ebb5710149510cc120646bf3f.html?locale=en-US", + "service": "SAP", "services": [ - "FrontDoor", + "Monitor", + "SAP", "WAF" ], "severity": "High", - "text": "Enable the Azure Front Door WAF bot protection rule set. The bot rules detect good and bad bots.", - "waf": "Security" + "text": "Review the Monitoring the SAP HANA System Landscape guidance.", + "waf": "Operations" }, { - "arm-service": "microsoft.network/frontdoors", "checklist": "WAF checklist", - "guid": "d7dcdcb9-0d99-44b9-baab-ac7570ede79a", - "link": "https://learn.microsoft.com/azure/web-application-firewall/afds/waf-front-door-best-practices#use-the-latest-ruleset-versions", - "service": "Front Door", + "guid": "c823873a-2bec-4c2a-b684-a1ce8ae80efd", + "link": "https://learn.microsoft.com/azure/virtual-machines/workloads/oracle/oracle-database-backup-strategies", + "service": "SAP", "services": [ - "FrontDoor", - "WAF" + "VM", + "WAF", + "Backup" ], "severity": "Medium", - "text": "Use the latest Azure Front Door WAF rule set version. Rule set updates are regularly updated to take account of the current threat landscape.", - "waf": "Security" + "text": "Review Oracle Database in Azure Linux VM backup strategies.", + "waf": "Operations" }, { - "arm-service": "microsoft.network/frontdoors", "checklist": "WAF checklist", - "guid": "b9620385-1cde-418f-914b-a84a06982ffc", - "link": "https://learn.microsoft.com/azure/web-application-firewall/afds/waf-front-door-best-practices#add-rate-limiting", - "service": "Front Door", + "guid": "2943b6d8-1d31-4e19-ade7-78e6b26d1962", + "link": "https://learn.microsoft.com/sql/relational-databases/tutorial-use-azure-blob-storage-service-with-sql-server-2016?view=sql-server-ver16", + "service": "SAP", "services": [ - "FrontDoor", + "Storage", + "SQL", "WAF" ], "severity": "Medium", - "text": "Add rate limiting to the Azure Front Door WAF. Rate limiting blocks clients accidentally or intentionally sending large amounts of traffic in a short period of time.", - "waf": "Security" + "text": "Review the use of Azure Blob Storage with SQL Server 2016.", + "waf": "Operations" }, { - "arm-service": "microsoft.network/frontdoors", "checklist": "WAF checklist", - "guid": "6dc36c52-0124-4ffe-9eaf-23ec1282dedb", - "link": "https://learn.microsoft.com/azure/web-application-firewall/afds/waf-front-door-best-practices#use-a-high-threshold-for-rate-limits", - "service": "Front Door", + "guid": "b82e650f-676d-417d-994d-fc33ca54ec14", + "link": "https://learn.microsoft.com/azure/azure-sql/virtual-machines/windows/automated-backup?view=azuresql", + "service": "SAP", "services": [ - "FrontDoor", - "WAF" + "VM", + "WAF", + "Backup" ], "severity": "Medium", - "text": "Use a high threshold for Azure Front Door WAF rate limits. High rate limit thresholds avoid blocking legitimate traffic, while still providing protection against extremely high numbers of requests that might overwhelm your infrastructure. ", - "waf": "Security" + "text": "Review the use of Automated Backup v2 for Azure VMs.", + "waf": "Operations" }, { - "arm-service": "microsoft.network/frontdoors", "checklist": "WAF checklist", - "guid": "388a3d0e-0a43-4367-90b2-3dd2aeece5ee", - "link": "https://learn.microsoft.com/azure/web-application-firewall/afds/waf-front-door-best-practices#geo-filter-traffic", - "service": "Front Door", + "guid": "347c2dcc-e6eb-4b04-80c5-628b171aa62d", + "service": "SAP", "services": [ "WAF" ], - "severity": "Low", - "text": "If you are not expecting traffic from all geographical regions, use geo-filters to block traffic from non-expected countries.", - "waf": "Security" + "severity": "High", + "text": "Enabling Write accelerator for M series when using premium disks(V1)", + "waf": "Operations" }, { - "arm-service": "microsoft.network/frontdoors", "checklist": "WAF checklist", - "guid": "00acd8a9-6975-414f-8491-2be6309893b8", - "link": "https://learn.microsoft.com/azure/web-application-firewall/afds/waf-front-door-best-practices#specify-the-unknown-zz-location", - "service": "Front Door", + "guid": "b96512cf-996f-4b17-b9b8-6b16db1a2a94", + "link": "https://github.com/Azure/SAP-on-Azure-Scripts-and-Utilities/tree/main/AvZone-Latency-Test", + "service": "SAP", "services": [ - "FrontDoor", "WAF" ], "severity": "Medium", - "text": "Specify the unknown (ZZ) location when geo-filtering traffic with the Azure Front Door WAF. Avoid accidentally blocking legitimate requests when IP addresses can't be geo-matched.", - "waf": "Security" + "text": "Test availability zone latency.", + "waf": "Performance" }, { - "ammp": true, - "arm-service": "microsoft.network/applicationGateways", "checklist": "WAF checklist", - "graph": "resources | where type == 'microsoft.network/applicationgatewaywebapplicationfirewallpolicies' | mv-expand properties.managedRules.managedRuleSets | project id, rulesettype = properties_managedRules_managedRuleSets.ruleSetType | extend compliant1 = (rulesettype == 'Microsoft_BotManagerRuleSet') | project id, compliant1 | summarize compliant = max(compliant1) by id", - "guid": "2f8e81eb-8e68-4026-8b1f-70f9b05f7cf9", - "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/bot-protection", - "service": "App Gateway", + "guid": "9fd7ffd4-da11-49f6-a374-8d03e94c511d", + "link": "https://support.sap.com/en/offerings-programs/support-services/earlywatch-alert.html", + "service": "SAP", "services": [ - "AppGW", + "SAP", "WAF" ], - "severity": "High", - "text": "Enable the Azure Application Gateway WAF bot protection rule set The bot rules detect good and bad bots.", - "waf": "Security" + "severity": "Medium", + "text": "Activate SAP EarlyWatch Alert for all SAP components.", + "training": "https://help.sap.com/docs/SUPPORT_CONTENT/techops/3362700736.html", + "waf": "Performance" }, { - "ammp": true, - "arm-service": "microsoft.network/applicationGateways", "checklist": "WAF checklist", - "guid": "8ea8e0d4-84e8-4b33-aeab-493f6391b4d6", - "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/application-gateway-waf-request-size-limits#request-body-inspection", - "service": "App Gateway", + "guid": "b9b140cf-413a-483d-aad2-8802c4e3c017", + "link": "https://techcommunity.microsoft.com/t5/running-sap-applications-on-the/sap-on-azure-general-update-march-2019/ba-p/377456", + "service": "SAP", "services": [ - "AppGW", - "AzurePolicy", + "SAP", "WAF" ], - "severity": "High", - "text": "Enable request body inspection feature enabled in Azure Application Gateway WAF policy.", - "waf": "Security" + "severity": "Medium", + "text": "Review SAP application server to database server latency using SAP ABAPMeter report /SSA/CAT.", + "training": "https://me.sap.com/notes/0002879613", + "waf": "Performance" }, { - "ammp": true, - "arm-service": "microsoft.network/applicationGateways", "checklist": "WAF checklist", - "guid": "a4dd86d3-5ffa-408c-b660-cce073d085b8", - "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/best-practices#tune-your-waf", - "service": "App Gateway", + "guid": "62fbf0f8-51db-49e1-a961-bb5df7a35f80", + "service": "SAP", "services": [ - "AppGW", + "Monitor", + "SQL", "WAF" ], - "severity": "High", - "text": "Tune the Azure Application Gateway WAF for your workload. Reduce false positive detections.", - "waf": "Security" + "severity": "Medium", + "text": "Review SQL Server performance monitoring using CCMS.", + "waf": "Performance" }, { - "ammp": true, - "arm-service": "microsoft.network/applicationGateways", "checklist": "WAF checklist", - "graph": "resources | where type == 'microsoft.network/frontdoorwebapplicationfirewallpolicies' | project policyName=name, policyId=id,policySku=sku.name, links=properties.securityPolicyLinks, enabledState=properties.policySettings.enabledState, mode=properties.policySettings.mode | mvexpand links | extend securityPolicy=links.id | extend securityPolicyParts=split(securityPolicy, '/') | extend profileId=strcat_array(array_slice(securityPolicyParts, 0, -3), '/') | project id=profileId, compliant=((enabledState=='Enabled') and (mode=='Prevention')), enabledState, mode", - "guid": "baf8e317-2397-4d49-b3d1-0dcc16d8778d", - "link": "https://learn.microsoft.com/azure/web-application-firewall/afds/waf-front-door-policy-settings", - "service": "App Gateway", + "guid": "35709da7-fc7d-4efe-bb20-2e91547b7390", + "link": "https://me.sap.com/notes/500235", + "service": "SAP", "services": [ - "AppGW", - "AzurePolicy", + "VM", + "SAP", "WAF" ], - "severity": "High", - "text": "Deploy your WAF policy for Application Gateway in 'Prevention' mode.", - "waf": "Security" + "severity": "Medium", + "text": "Test network latency between SAP application layer VMs and DBMS VMs (NIPING).", + "training": "https://me.sap.com/notes/1100926/E", + "waf": "Performance" }, { - "arm-service": "microsoft.network/applicationGateways", "checklist": "WAF checklist", - "guid": "43fae595-8a32-4299-a69e-0f32c454dcc9", - "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/rate-limiting-overview", - "service": "App Gateway", + "guid": "9e9bb4c8-e934-4e4b-a13c-6f7c7c38eb43", + "link": "https://learn.microsoft.com/en-us/azure/sap/large-instances/hana-monitor-troubleshoot", + "service": "SAP", "services": [ - "AppGW", + "Monitor", + "SAP", "WAF" ], "severity": "Medium", - "text": "Add rate limiting to the Azure Application Gateway WAF. Rate limiting blocks clients accidentally or intentionally sending large amounts of traffic in a short period of time.", - "waf": "Security" + "text": "Review SAP HANA studio alerts.", + "waf": "Performance" }, { - "arm-service": "microsoft.network/applicationGateways", "checklist": "WAF checklist", - "guid": "041e0ad8-7b12-4694-a0b7-a0e25ee2470f", - "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/rate-limiting-overview#rate-limiting-details", - "service": "App Gateway", + "guid": "f1a92ab5-9509-4b57-86ff-b0ade361b694", + "link": "https://me.sap.com/notes/1969700", + "service": "SAP", "services": [ - "AppGW", + "SAP", "WAF" ], "severity": "Medium", - "text": "Use a high threshold for Azure Application Gateway WAF rate limits. High rate limit thresholds avoid blocking legitimate traffic, while still providing protection against extremely high numbers of requests that might overwhelm your infrastructure. ", - "waf": "Security" + "text": "Perform SAP HANA health checks using HANA_Configuration_Minichecks.", + "waf": "Performance" }, { - "arm-service": "microsoft.network/applicationGateways", "checklist": "WAF checklist", - "guid": "99937189-ff78-492a-b9ca-18d828d82b37", - "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/best-practices#geo-filtering-best-practices", - "service": "App Gateway", + "guid": "18dffcf3-248c-4039-a67c-dec8e3a5f804", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/sap-lza-security-operations", + "service": "SAP", "services": [ + "VM", "WAF" ], - "severity": "Low", - "text": "If you are not expecting traffic from all geographical regions, use geo-filters to block traffic from non-expected countries.", + "severity": "Medium", + "text": "If you run Windows and Linux VMs in Azure, on-premises, or in other cloud environments, you can use the Update management center in Azure Automation to manage operating system updates, including security patches.", + "training": "https://learn.microsoft.com/azure/automation/update-management/overview", "waf": "Security" }, { - "arm-service": "microsoft.network/applicationGateways", "checklist": "WAF checklist", - "guid": "349a15c1-52f4-4319-9078-3895d95ecafd", - "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/geomatch-custom-rules", - "service": "App Gateway", + "guid": "08951710-79a2-492a-adbc-06d7a401545b", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/sap-lza-security-operations", + "service": "SAP", "services": [ - "AppGW", + "SAP", "WAF" ], "severity": "Medium", - "text": "Specify the unknown (ZZ) location when geo-filtering traffic with the Azure Application Gateway WAF. Avoid accidentally blocking legitimate requests when IP addresses can't be geo-matched.", + "text": "Routinely review the SAP security OSS notes because SAP releases highly critical security patches, or hot fixes, that require immediate action to protect your SAP systems.", + "training": "https://support.sap.com/en/my-support/knowledge-base/security-notes-news.html", "waf": "Security" }, { - "arm-service": "microsoft.network/applicationGateways", "checklist": "WAF checklist", - "guid": "6c19dfd5-a61c-436c-9001-491b9b3d0228", - "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/best-practices#use-the-latest-ruleset-versions", - "service": "App Gateway", + "guid": "1b8b394e-ae64-4a74-8933-357b523ea0a0", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/sap-lza-database-security", + "service": "SAP", "services": [ - "AppGW", + "SAP", + "SQL", "WAF" - ], - "severity": "Medium", - "text": "Use the latest Azure Application Gateway WAF rule set version. Rule set updates are regularly updated to take account of the current threat landscape.", + ], + "severity": "Low", + "text": "For SAP on SQL Server, you can disable the SQL Server system administrator account because the SAP systems on SQL Server don't use the account. Ensure that another user with system administrator rights can access the server before disabling the original system administrator account.", "waf": "Security" }, { - "arm-service": "microsoft.network/applicationGateways", "checklist": "WAF checklist", - "guid": "f84106a2-2e9e-42ac-add6-d3416ecfed53", - "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/best-practices#add-diagnostic-settings-to-save-your-wafs-logs", - "service": "App Gateway", + "guid": "5a76a033-ced9-4eef-9a43-5e4f96634c8e", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/sap-lza-database-security", + "service": "SAP", "services": [ - "AppGW", + "SQL", "WAF" ], - "severity": "Medium", - "text": "Add diagnostic settings to save your Azure Application Gateway WAF logs.", - "waf": "Operations" + "severity": "High", + "text": "Disable xp_cmdshell. The SQL Server feature xp_cmdshell enables a SQL Server internal operating system command shell. It's a potential risk in security audits.", + "training": "https://me.sap.com/notes/3019299/E", + "waf": "Security" }, { - "arm-service": "microsoft.network/frontdoors", "checklist": "WAF checklist", - "guid": "4cea4050-7946-4a7c-89e6-b021b73c352d", - "link": "https://learn.microsoft.com/azure/web-application-firewall/afds/waf-front-door-best-practices#add-diagnostic-settings-to-save-your-wafs-logs", - "service": "Front Door", + "guid": "cf65de8e-1309-4ccc-b579-266bcca275fa", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/eslz-security-governance-and-compliance", + "service": "SAP", "services": [ - "FrontDoor", - "WAF" + "Storage", + "WAF", + "Backup", + "SAP", + "SQL" ], - "severity": "Medium", - "text": "Add diagnostic settings to save your Azure Front Door WAF logs.", - "waf": "Operations" + "severity": "High", + "text": "Encrypting SAP HANA database servers on Azure uses SAP HANA native encryption technology. Additionally, if you are using SQL Server on Azure, use Transparent Data Encryption (TDE) to protect your data and log files and ensure that your backups are also encrypted.", + "training": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/sap-lza-database-security", + "waf": "Security" }, { - "arm-service": "microsoft.network/applicationGateways", "checklist": "WAF checklist", - "guid": "92664c60-47e3-4591-8b1b-8d557656e686", - "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/best-practices#send-logs-to-microsoft-sentinel", - "service": "App Gateway", + "guid": "a1abfe9d-55d0-44c3-a491-9cb1b3d1325a", + "link": "https://learn.microsoft.com/azure/storage/common/storage-service-encryption", + "service": "SAP", "services": [ - "Sentinel", - "AppGW", + "Storage", "WAF" ], "severity": "Medium", - "text": "Send Azure Application Gateway WAF logs to Microsoft Sentinel.", - "waf": "Operations" + "text": "Azure Storage encryption is enabled for all Azure Resource Manager and classic storage accounts, and can't be disabled. Because your data is encrypted by default, you don't need to modify your code or applications to use Azure Storage encryption.", + "training": "https://learn.microsoft.com/training/modules/encrypt-sector-data/?source=recommendations", + "waf": "Security" }, { - "arm-service": "microsoft.network/frontdoors", "checklist": "WAF checklist", - "guid": "845f5f91-9c21-4674-a725-5ce890850e20", - "link": "https://learn.microsoft.com/azure/web-application-firewall/afds/waf-front-door-best-practices#send-logs-to-microsoft-sentinel", - "service": "Front Door", + "guid": "ce9bd3bb-0cdb-43b5-9eb2-ec14eeaa3592", + "link": "https://learn.microsoft.com/azure/key-vault/general/overview", + "service": "SAP", "services": [ - "Sentinel", - "FrontDoor", - "WAF" + "WAF", + "AKV" ], - "severity": "Medium", - "text": "Send Azure Front Door WAF logs to Microsoft Sentinel.", - "waf": "Operations" + "severity": "High", + "text": "Use Azure Key Vault to store your secrets and credentials", + "training": "https://learn.microsoft.com/training/modules/manage-secrets-with-azure-key-vault/?source=recommendations", + "waf": "Security" }, { - "arm-service": "microsoft.network/applicationGateways", "checklist": "WAF checklist", - "guid": "ba0e9b26-6e0d-4ec8-8541-023c00afd5b7", - "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/best-practices#define-your-waf-configuration-as-code", - "service": "App Gateway", + "guid": "829e2edb-2173-4676-aff6-691b4935ada4", + "link": "https://learn.microsoft.com/azure/azure-resource-manager/management/lock-resources?tabs=json", + "service": "SAP", "services": [ - "AppGW", - "WAF" + "RBAC", + "WAF", + "Subscriptions", + "AzurePolicy" ], "severity": "Medium", - "text": "Define your Azure Application Gateway WAF configuration as code. By using code, you can more easily adopt new rule set version and gain additional protection.", - "waf": "Operations" + "text": "It is recommended to LOCK the Azure Resources post successful deployment to safeguard against unauthorized changes. You can also enforce LOCK constraints and rules on your per-subscription basis using customized Azure policies(Custome role).", + "training": "https://learn.microsoft.com/training/modules/use-azure-resource-manager/?source=recommendations", + "waf": "Security" }, { - "arm-service": "microsoft.network/applicationGateways", "checklist": "WAF checklist", - "guid": "f17ec301-8470-4afd-aabc-c1fdfe47dcc0", - "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/policy-overview", - "service": "App Gateway", + "guid": "2223ece8-1b12-4318-8a54-17415833fb4a", + "link": "https://learn.microsoft.com/azure/key-vault/general/soft-delete-overview", + "service": "SAP", "services": [ - "AzurePolicy", - "WAF" + "WAF", + "AKV", + "AzurePolicy" ], "severity": "Medium", - "text": "Use WAF Policies instead of the legacy WAF configuration.", - "waf": "Operations" + "text": "Provision Azure Key Vault with the soft delete and purge policies enabled to allow retention protection for deleted objects.", + "training": "https://learn.microsoft.com/training/modules/manage-secrets-with-azure-key-vault/?source=recommendations", + "waf": "Security" }, { - "arm-service": "microsoft.network/applicationGateways", "checklist": "WAF checklist", - "guid": "d4eb8667-f8cb-4cdd-94e6-2f967ba98f88", - "link": "https://learn.microsoft.com/azure/virtual-wan/scenario-secured-hub-app-gateway", - "service": "App Gateway", + "guid": "e3c2df74-3165-4c3a-abe0-5bbe209d490d", + "link": "https://learn.microsoft.com/azure/role-based-access-control/security-controls-policy", + "service": "SAP", "services": [ - "AppGW", - "VPN", - "ExpressRoute", - "VNet", - "WAF" + "RBAC", + "WAF", + "AzurePolicy" ], - "severity": "Medium", - "text": "Filter inbound traffic in the backends so that they only accept connections from the Application Gateway subnet, for example with NSGs.", + "severity": "High", + "text": "Based on existing requirements, regulatory and compliance controls (internal/external) - Determine what Azure Policies and Azure RBAC role are needed", + "training": "https://learn.microsoft.com/training/paths/describe-azure-management-governance/?source=recommendations", "waf": "Security" }, { - "arm-service": "microsoft.network/frontdoors", "checklist": "WAF checklist", - "guid": "7d3df025-59a3-447d-ac25-3f5750d35de1", - "link": "https://learn.microsoft.com/azure/frontdoor/origin-security?tabs=app-service-functions", - "service": "Front Door", + "guid": "a4777842-4d11-4678-9d2f-a56c56ad4840", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/eslz-security-governance-and-compliance", + "service": "SAP", "services": [ - "FrontDoor", - "WAF" + "Defender", + "Storage", + "WAF", + "SAP" ], - "severity": "Medium", - "text": "Make sure your origins only take traffic from your Azure Front Door instance.", + "severity": "High", + "text": "When enabling Microsoft Defender for Endpoint on SAP environment, recommend excluding data and log files on DBMS servers instead of targeting all servers. Follow your DBMS vendor's recommendations when excluding target files.", + "training": "https://techcommunity.microsoft.com/t5/running-sap-applications-on-the/microsoft-defender-endpoint-mde-for-sap-applications-on-windows/ba-p/3912268", "waf": "Security" }, { - "arm-service": "microsoft.network/applicationGateways", "checklist": "WAF checklist", - "guid": "a66f0fd8-2ca4-422e-8df3-235148127ca2", - "link": "https://learn.microsoft.com/azure/application-gateway/ssl-overview", - "service": "App Gateway", + "guid": "8fe72734-c486-4ba2-a0dc-0591cf65de8e", + "link": "https://learn.microsoft.com/azure/defender-for-cloud/just-in-time-access-overview?tabs=defender-for-container-arch-aks", + "service": "SAP", "services": [ + "Defender", + "RBAC", + "SAP", "WAF" ], "severity": "High", - "text": "You should encrypt traffic to the backend servers.", + "text": "Delegate an SAP admin custom role with just-in-time access of Microsoft Defender for Cloud.", + "training": "https://learn.microsoft.com/training/modules/secure-vms-with-azure-security-center/?source=recommendations", "waf": "Security" }, { - "arm-service": "microsoft.network/applicationGateways", "checklist": "WAF checklist", - "guid": "3dba65cb-834d-44d8-a3ca-a6aa2f1587be", - "link": "https://learn.microsoft.com/azure/web-application-firewall/overview", - "service": "App Gateway", + "guid": "1309cccd-5792-466b-aca2-75faa1abfe9d", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/eslz-security-governance-and-compliance", + "service": "SAP", "services": [ + "SAP", "WAF" ], - "severity": "High", - "text": "You should use a Web Application Firewall.", + "severity": "Low", + "text": "encrypt data in transit by integrating the third-party security product with secure network communications (SNC) for DIAG (SAP GUI), RFC, and SPNEGO for HTTPS", + "training": "https://learn.microsoft.com/azure/security/fundamentals/encryption-overview#encryption-of-data-in-transit", "waf": "Security" }, { - "arm-service": "microsoft.network/applicationGateways", "checklist": "WAF checklist", - "guid": "0158fcb6-0bc1-4687-832f-cc7c359c22d2", - "link": "https://learn.microsoft.com/azure/application-gateway/redirect-overview", - "service": "App Gateway", + "guid": "eeaa3592-829e-42ed-a217-3676aff6691b", + "link": "https://learn.microsoft.com/azure/storage/common/storage-encryption-key-model-get?tabs=portal", + "service": "SAP", "services": [ - "WAF" + "WAF", + "AKV" ], "severity": "Medium", - "text": "Redirect HTTP to HTTPS", + "text": "Default to Microsoft-managed keys for principal encryption functionality and use customer-managed keys when required.", + "training": "https://learn.microsoft.com/training/modules/manage-secrets-with-azure-key-vault/?source=recommendations", "waf": "Security" }, { - "arm-service": "microsoft.network/applicationGateways", "checklist": "WAF checklist", - "guid": "bb697864-1b4c-43af-8667-90cc69aaed5f", - "link": "https://learn.microsoft.com/azure/application-gateway/how-application-gateway-works#modifications-to-the-request", - "service": "App Gateway", + "guid": "4935ada4-2223-4ece-a1b1-23181a541741", + "link": "https://learn.microsoft.com/ja-jp/azure/key-vault/general/best-practices", + "service": "SAP", "services": [ - "WAF" + "WAF", + "AKV" ], - "severity": "Medium", - "text": "Use gateway-managed cookies to direct traffic from a user session to the same server for processing", - "waf": "Operations" + "severity": "High", + "text": "Use an Azure Key Vault per application per environment per region.", + "training": "https://learn.microsoft.com/training/modules/manage-secrets-with-azure-key-vault/?source=recommendations", + "waf": "Security" }, { - "arm-service": "microsoft.network/applicationGateways", "checklist": "WAF checklist", - "guid": "ff353ad8-15fb-4ae8-9fc5-a85a36d36a35", - "link": "https://learn.microsoft.com/azure/application-gateway/configuration-http-settings", - "service": "App Gateway", + "guid": "abc9634d-c44d-41e9-a530-e8444e16aa3c", + "link": "https://learn.microsoft.com/azure/key-vault/certificates/certificate-scenarios", + "service": "SAP", "services": [ - "WAF" + "SAP", + "WAF", + "AKV" ], "severity": "High", - "text": "Enable connection draining during planned service updates to prevent connection loss to existing membrs of the backend pool", + "text": "To control and manage disk encryption keys and secrets for non-HANA Windows and non-Windows operating systems, use Azure Key Vault. SAP HANA isn't supported with Azure Key Vault, so you must use alternate methods like SAP ABAP or SSH keys.", + "training": "https://learn.microsoft.com/training/modules/configure-and-manage-azure-key-vault/?source=recommendations", "waf": "Security" }, { - "arm-service": "microsoft.network/applicationGateways", "checklist": "WAF checklist", - "guid": "c8741f03-45a4-4183-a6b8-139e0773b8b5", - "link": "https://learn.microsoft.com/azure/application-gateway/custom-error", - "service": "App Gateway", + "guid": "209d490d-a477-4784-84d1-16785d2fa56c", + "link": "https://learn.microsoft.com/azure/role-based-access-control/built-in-roles", + "service": "SAP", "services": [ - "WAF" + "RBAC", + "SAP", + "WAF", + "Subscriptions" ], - "severity": "Low", - "text": "Create custom error pages to display a personalized user experience", - "waf": "Operations" + "severity": "High", + "text": "Customize role-based access control (RBAC) roles for SAP on Azure spoke subscriptions to avoid accidental network-related changes", + "training": "https://learn.microsoft.com/training/modules/secure-azure-resources-with-rbac/?source=recommendations", + "waf": "Security" }, { - "arm-service": "microsoft.network/applicationGateways", "checklist": "WAF checklist", - "guid": "f850d46f-f5d7-4b17-b48c-a780741402e1", - "link": "https://learn.microsoft.com/azure/application-gateway/rewrite-http-headers-url", - "service": "App Gateway", + "guid": "56ad4840-8fe7-4273-9c48-6ba280dc0591", + "link": "https://blogs.sap.com/2019/07/21/sap-security-operations-on-azure/", + "service": "SAP", "services": [ - "WAF" + "SAP", + "NVA", + "WAF", + "PrivateLink" ], - "severity": "Medium", - "text": "Edit HTTP requests and response headers for easier routing and information exchange between the client and server", + "severity": "High", + "text": "Isolate DMZs and NVAs from the rest of the SAP estate, configure Azure Private Link, and securely manage and control the SAP on Azure resources", + "training": "https://learn.microsoft.com/azure/architecture/reference-architectures/dmz/secure-vnet-dmz?tabs=portal", "waf": "Security" }, { - "arm-service": "microsoft.network/applicationGateways", "checklist": "WAF checklist", - "guid": "eadc3164-4a0f-461c-85f1-1a372c04dfd1", - "link": "https://learn.microsoft.com/azure/frontdoor/front-door-overview", - "service": "App Gateway", + "guid": "e124ba34-df68-45ed-bce9-bd3bb0cdb3b5", + "link": "https://learn.microsoft.com/en-us/training/modules/secure-vms-with-azure-security-center/?source=recommendations", + "service": "SAP", "services": [ - "FrontDoor", + "VM", + "Storage", "WAF" ], - "severity": "Medium", - "text": "Configure Front Door to optimize global web traffic routing and top-tier end-user performance, and reliability through quick global failover", - "waf": "Performance" + "severity": "Low", + "text": "Consider using Microsoft anti-malware software on Azure to protect your virtual machines from malicious files, adware, and other threats.", + "training": "https://azure.microsoft.com/blog/deploying-antimalware-solutions-on-azure-virtual-machines/", + "waf": "Security" }, { - "arm-service": "microsoft.network/applicationGateways", "checklist": "WAF checklist", - "guid": "29dcc19f-a8fa-4c35-8281-290577538793", - "link": "https://learn.microsoft.com/azure/load-balancer/load-balancer-overview", - "service": "App Gateway", + "guid": "5eb2ec14-eeaa-4359-8829-e2edb2173676", + "link": "https://learn.microsoft.com/microsoft-365/security/defender-endpoint/microsoft-defender-endpoint?view=o365-worldwide", + "service": "SAP", "services": [ + "Defender", "WAF" ], - "severity": "Medium", - "text": "Use transport layer load balancing", - "waf": "Performance" + "severity": "Low", + "text": "For even more powerful protection, consider using Microsoft Defender for Endpoint.", + "training": "https://learn.microsoft.com/training/modules/implement-endpoint-protection-use-microsoft-defender/?source=recommendations", + "waf": "Security" }, { - "arm-service": "microsoft.network/applicationGateways", "checklist": "WAF checklist", - "guid": "276898c1-af5e-4819-9e8e-049c7801ab9d", - "link": "https://learn.microsoft.com/azure/application-gateway/multiple-site-overview", - "service": "App Gateway", + "guid": "87a924c4-25c2-419f-a2f0-96c7c4fe4525", + "link": "https://learn.microsoft.com/azure/architecture/guide/sap/sap-whole-landscape", + "service": "SAP", "services": [ + "VNet", + "SAP", "WAF" ], - "severity": "Medium", - "text": "Configure routing based on host or domain name for multiple web applications on a single gateway", + "severity": "High", + "text": "Isolate the SAP application and database servers from the internet or from the on-premises network by passing all traffic through the hub virtual network, which is connected to the spoke network by virtual network peering. The peered virtual networks guarantee that the SAP on Azure solution is isolated from the public internet.", + "training": "https://learn.microsoft.com/training/modules/explore-azure-networking/?source=recommendations", "waf": "Security" }, { - "arm-service": "microsoft.network/applicationGateways", "checklist": "WAF checklist", - "guid": "5fe365b6-58e8-47ed-a8cf-5163850380a2", - "link": "https://learn.microsoft.com/azure/application-gateway/create-ssl-portal", - "service": "App Gateway", + "guid": "491ca1c4-3d40-42c0-9d85-b8933999590b", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/eslz-security-governance-and-compliance", + "service": "SAP", "services": [ - "Entra", + "SAP", "WAF" ], + "severity": "Low", + "text": "For internet-facing applications like SAP Fiori, make sure to distribute load per application requirements while maintaining security levels. For Layer 7 security, you can use a third-party Web Application Firewall (WAF) available in the Azure Marketplace.", + "training": "https://learn.microsoft.com/training/modules/simplify-cloud-procurement-governance-azure-marketplace/?source=recommendations", + "waf": "Security" + }, + { + "checklist": "WAF checklist", + "guid": "9fc945b9-0527-47af-8200-9d652fe02fcc", + "link": "https://learn.microsoft.com/azure/sap/monitor/enable-tls-azure-monitor-sap-solutions", + "service": "SAP", + "services": [ + "Monitor", + "SAP", + "WAF", + "AKV" + ], "severity": "Medium", - "text": "Centralize SSL certificate management to reduce encryption and decryption overhead from a backend server farm", + "text": "To enable secure communication in Azure Monitor for SAP solutions, you can choose to use either a root certificate or a server certificate. We highly recommend that you use root certificates.", + "training": "https://learn.microsoft.com/training/modules/implement-azure-monitoring-sap-workloads-azure-virtual-machines/?source=recommendations", "waf": "Security" }, { - "arm-service": "microsoft.network/applicationGateways", + "arm-service": "microsoft.cache/redis", "checklist": "WAF checklist", - "guid": "fa64b4dd-35c2-4047-ac5c-45dfbf8b0db9", - "link": "https://learn.microsoft.com/azure/application-gateway/application-gateway-websocket", - "service": "App Gateway", + "guid": "65285269-440b-44be-9d3e-0844276d4bdc", + "link": "https://learn.microsoft.com/azure/azure-cache-for-redis/cache-how-to-zone-redundancy", + "service": "Redis", "services": [ - "AppGW", + "ACR", "WAF" ], - "severity": "Low", - "text": "Use Application Gateway for native support for WebSocket and HTTP/2 protocols", - "waf": "Security" + "severity": "High", + "text": "Enable zone redundancy for Azure Cache for Redis. Azure Cache for Redis supports zone redundant configurations in the Premium and Enterprise tiers. A zone redundant cache can place its nodes across different Azure Availability Zones in the same region. It eliminates data center or AZ outage as a single point of failure and increases the overall availability of your cache.", + "waf": "Reliability" }, { - "arm-service": "Microsoft.DBforPostgreSQL/servers", + "arm-service": "microsoft.cache/redis", "checklist": "WAF checklist", - "guid": "65285269-441c-44bf-9d3e-0844276d4bdc", - "link": "https://learn.microsoft.com/azure/postgresql/flexible-server/overview", - "service": "PostgreSQL", + "guid": "bc178bdc-5a06-4ca7-8443-51e19dd34429", + "link": "https://learn.microsoft.com/en-us/azure/azure-cache-for-redis/cache-high-availability#persistence", + "service": "Redis", "services": [ + "Storage", "WAF" ], "severity": "Medium", - "text": "Leverage Flexible Server", + "text": "Configure data persistence for an Azure Cache for Redis instance. Because your cache data is stored in memory, a rare and unplanned failure of multiple nodes can cause all the data to be dropped. To avoid losing data completely, Redis persistence allows you to take periodic snapshots of in-memory data, and store it to your storage account.", "waf": "Reliability" }, { - "arm-service": "Microsoft.DBforPostgreSQL/servers", + "arm-service": "microsoft.cache/redis", "checklist": "WAF checklist", - "guid": "016ccf31-ae5a-41eb-9888-9535e227896d", - "link": "https://learn.microsoft.com/azure/postgresql/flexible-server/overview#architecture-and-high-availability", - "service": "PostgreSQL", + "guid": "eb722823-7a15-41c5-ab4e-4f1814387e5c", + "link": "https://learn.microsoft.com/en-us/azure/azure-cache-for-redis/cache-high-availability#storage-account-for-persistence", + "service": "Redis", "services": [ + "Storage", "WAF" ], - "severity": "High", - "text": "Leverage Availability Zones where regionally applicable", + "severity": "Medium", + "text": "Use Geo-redundant storage account to persist Azure Cache for Redis data, or zonally redundant where geo-redundancy is not available", "waf": "Reliability" }, { - "arm-service": "Microsoft.DBforPostgreSQL/servers", + "arm-service": "microsoft.cache/redis", "checklist": "WAF checklist", - "guid": "31b67c67-be59-4519-8083-845d587cb391", - "link": "https://learn.microsoft.com/azure/postgresql/single-server/concepts-business-continuity#cross-region-read-replicas", - "service": "PostgreSQL", + "guid": "a8c26c9b-32ab-45bd-bc69-98a135e33789", + "link": "https://learn.microsoft.com/azure/azure-cache-for-redis/cache-how-to-geo-replication", + "service": "Redis", "services": [ + "ASR", "WAF" ], "severity": "Medium", - "text": "Leverage cross-region read replicas for BCDR", + "text": "Configure passive geo-replication for Premium Azure Cache for Redis instances. Geo-replication is a mechanism for linking two or more Azure Cache for Redis instances, typically spanning two Azure regions. Geo-replication is designed mainly for cross-region disaster recovery. Two Premium tier cache instances are connected through geo-replication in a way that provides reads and writes to your primary cache, and that data is replicated to the secondary cache.", "waf": "Reliability" }, { @@ -34071,8 +37590,8 @@ "link": "https://learn.microsoft.com/azure/data-factory/source-control", "service": "Azure Data Factory", "services": [ - "Backup", - "WAF" + "WAF", + "Backup" ], "severity": "Medium", "text": "Use DevOps to Backup the ARM templates with Github/Azure DevOps integration ", @@ -34114,986 +37633,1019 @@ "link": "https://learn.microsoft.com/azure/key-vault/general/disaster-recovery-guidance", "service": "Azure Data Factory", "services": [ - "AKV", - "WAF" + "WAF", + "AKV" ], "severity": "Low", "text": "If using Keyvault integration, use SLA of Keyvault to understand your availablity", "waf": "Reliability" }, { - "arm-service": "microsoft.containerregistry/registries", + "arm-service": "Microsoft.DBforMySQL/servers", "checklist": "WAF checklist", - "description": "Disable image export to prevent data exfiltration. Note that this will prevent image import of images into another ACR instance.", - "guid": "ab91932c-9fc9-4d1b-a880-37f5e6bfcb9e", - "link": "https://learn.microsoft.com/azure/container-registry/data-loss-prevention", - "service": "ACR", + "guid": "388c3e25-e800-4ad2-9df3-f3d6ae1050b7", + "link": "https://learn.microsoft.com/azure/mysql/flexible-server/overview", + "service": "Azure MySQL", "services": [ - "ACR", "WAF" ], - "severity": "High", - "text": "Disable Azure Container Registry image export", - "waf": "Security" + "severity": "Medium", + "text": "Leverage Flexible Server", + "waf": "Reliability" }, { - "arm-service": "microsoft.containerregistry/registries", + "arm-service": "Microsoft.DBforMySQL/servers", "checklist": "WAF checklist", - "description": "Enable audit compliance visibility by enabling Azure Policy for Azure Container Registry", - "guid": "d503547c-d447-4e82-9128-a7100f1cac6d", - "link": "https://learn.microsoft.com/azure/container-registry/container-registry-azure-policy", - "service": "ACR", + "guid": "de3aad1e-8c38-4ec9-9666-7313c005674b", + "link": "https://learn.microsoft.com/azure/mysql/flexible-server/overview#high-availability-within-and-across-availability-zones", + "service": "Azure MySQL", "services": [ - "ACR", - "AzurePolicy", "WAF" ], "severity": "High", - "text": "Enable Azure Policies for Azure Container Registry", - "waf": "Security" + "text": "Leverage Availability Zones where regionally applicable", + "waf": "Reliability" }, { - "arm-service": "microsoft.containerregistry/registries", + "arm-service": "Microsoft.DBforMySQL/servers", "checklist": "WAF checklist", - "description": "The Azure Key Vault (AKV) is used to store a signing key that can be utilized by?notation?with the notation AKV plugin (azure-kv) to sign and verify container images and other artifacts. The Azure Container Registry (ACR) allows you to attach these signatures using the?az?or?oras?CLI commands.", - "guid": "d345293c-7639-4637-a551-c5c04e401955", - "link": "https://learn.microsoft.com/azure/container-registry/container-registry-tutorial-sign-build-push", - "service": "ACR", + "guid": "1e944a45-9c37-43e7-bd61-623b365a917e", + "link": "https://learn.microsoft.com/azure/mysql/flexible-server/overview#setup-hybrid-or-multi-cloud-data-synchronization-with-data-in-replication", + "service": "Azure MySQL", "services": [ - "AKV", - "ACR", "WAF" ], + "severity": "Medium", + "text": "Leverage Data-in replication for cross-region DR scenarios", + "waf": "Reliability" + }, + { + "arm-service": "Microsoft.KeyVault/vaults", + "checklist": "WAF checklist", + "guid": "6d37a33b-531c-4a91-871a-b69d8044f04e", + "link": "https://learn.microsoft.com/azure/key-vault/general/best-practices", + "service": "Key Vault", + "services": [ + "WAF", + "AKV", + "Backup" + ], "severity": "High", - "text": "Sign and Verify containers with notation (Notary v2)", - "waf": "Security" + "text": "Familiarize yourself with the Key Vault's best practices such as isolation recommendations, access control, data protection, backup, and logging.", + "waf": "Reliability" }, { - "arm-service": "microsoft.containerregistry/registries", + "arm-service": "Microsoft.KeyVault/vaults", "checklist": "WAF checklist", - "description": "Azure Container Registry automatically encrypts images and other artifacts that you store. By default, Azure automatically encrypts the registry content at rest by using service-managed keys. By using a customer-managed key, you can supplement default encryption with an additional encryption layer.", - "guid": "0bd05dc2-efd5-4d76-8d41-d2500cc47b49", - "link": "https://learn.microsoft.com/azure/container-registry/tutorial-customer-managed-keys", - "service": "ACR", + "guid": "7ba4d380-7b9e-4a8b-a0c3-2d8e49c11872", + "link": "https://learn.microsoft.com/azure/key-vault/general/disaster-recovery-guidance", + "service": "Key Vault", "services": [ "ACR", - "AKV", - "WAF" + "WAF", + "AKV" ], "severity": "Medium", - "text": "Encrypt registry with a customer managed key", - "waf": "Security" + "text": "Key Vault is a managed service and Microsoft will handle the failover within and across region. Familiarize yourself with the Key Vault's availability and redundancy.", + "waf": "Reliability" }, { - "arm-service": "microsoft.containerregistry/registries", + "arm-service": "Microsoft.KeyVault/vaults", "checklist": "WAF checklist", - "description": "Use managed identities to secure ACRPull/Push RBAC access from client applications", - "guid": "8f42d78e-79dc-47b3-9bd2-a1a27e7a8e90", - "link": "https://learn.microsoft.com/azure/container-registry/container-registry-authentication-managed-identity", - "service": "ACR", + "guid": "17fb86a2-eb45-42a4-9c34-52b92a2a1842", + "link": "https://learn.microsoft.com/azure/key-vault/general/disaster-recovery-guidance#data-replication", + "service": "Key Vault", "services": [ - "Entra", - "RBAC", - "ACR", - "WAF" + "WAF", + "AKV" ], - "severity": "High", - "text": "Use Managed Identities to connect instead of Service Principals", - "waf": "Security" + "severity": "Medium", + "text": "The contents of your key vault are replicated within the region and to a secondary region at least 150 miles away, but within the same geography to maintain high durability of your keys and secrets. Familiarize yourself with the Key Vault's data replication.", + "waf": "Reliability" + }, + { + "arm-service": "Microsoft.KeyVault/vaults", + "checklist": "WAF checklist", + "guid": "614682ca-6e0c-4f34-9f03-c6d3f2b99a32", + "link": "https://learn.microsoft.com/azure/key-vault/general/disaster-recovery-guidance#failover-across-regions", + "service": "Key Vault", + "services": [ + "WAF", + "AKV", + "AzurePolicy" + ], + "severity": "Medium", + "text": "During failover, access policy or firewall configurations and settings can't be changed. The key vault will be in read-only mode during failover. Familiarize yourself with the Key Vault's failover guidance.", + "waf": "Reliability" + }, + { + "arm-service": "Microsoft.KeyVault/vaults", + "checklist": "WAF checklist", + "guid": "9ef2b0d2-3206-4c94-b47a-4f07e6a1c509", + "link": "https://learn.microsoft.com/azure/key-vault/general/backup?tabs=azure-cli#design-considerations", + "service": "Key Vault", + "services": [ + "Storage", + "WAF", + "Subscriptions", + "AKV", + "Backup" + ], + "severity": "Medium", + "text": "When you back up a key vault object, such as a secret, key, or certificate, the backup operation will download the object as an encrypted blob. This blob can't be decrypted outside of Azure. To get usable data from this blob, you must restore the blob into a key vault within the same Azure subscription and Azure geography. Familiarize yourself with the Key Vault's backup and restore guidance.", + "waf": "Reliability" }, { - "arm-service": "microsoft.containerregistry/registries", + "arm-service": "Microsoft.KeyVault/vaults", "checklist": "WAF checklist", - "description": "The local Administrator account is disabled by default and should not be enabled. Use either Token or RBAC-based access methods instead", - "guid": "be0e38ce-e297-411b-b363-caaab79b198d", - "link": "https://learn.microsoft.com/azure/container-registry/container-registry-authentication-managed-identity", - "service": "ACR", + "guid": "2df045b1-c0f6-47d3-9a9b-99cf6999684e", + "link": "https://learn.microsoft.com/azure/key-vault/general/soft-delete-overview", + "service": "Key Vault", "services": [ - "RBAC", - "WAF" + "WAF", + "AKV" ], "severity": "High", - "text": "Disable local authentication for management plane access", - "waf": "Security" + "text": "If you want protection against accidental or malicious deletion of your secrets, configure soft-delete and purge protection features on your key vault.", + "waf": "Reliability" }, { - "arm-service": "microsoft.containerregistry/registries", + "arm-service": "Microsoft.KeyVault/vaults", "checklist": "WAF checklist", - "description": "Disable Administrator account and assign RBAC roles to principals for ACR Pull/Push operations", - "guid": "387e5ced-126c-4d13-8af5-b20c6998a646", - "link": "https://learn.microsoft.com/azure/container-registry/container-registry-roles?tabs=azure-cli", - "service": "ACR", + "guid": "cbfa96b0-5249-4e6f-947c-d0e79509708c", + "link": "https://learn.microsoft.com/azure/key-vault/general/soft-delete-overview", + "service": "Key Vault", "services": [ - "Entra", - "RBAC", - "ACR", - "WAF" + "WAF", + "AKV" ], - "severity": "High", - "text": "Assign AcrPull & AcrPush RBAC roles rather than granting Administrative access to identity principals", - "waf": "Security" + "severity": "Low", + "text": "Key Vault's soft-deleted resources are retained for a set period of 90 calendar days. Familiarize yourself with the Key Vault's soft-delete guidance.", + "waf": "Reliability" }, { - "arm-service": "microsoft.containerregistry/registries", + "arm-service": "Microsoft.KeyVault/vaults", "checklist": "WAF checklist", - "description": "Disable anonymous pull/push access", - "guid": "e338997e-41c7-47d7-acf6-a62a1194956d", - "link": "https://learn.microsoft.com/azure/container-registry/anonymous-pull-access#configure-anonymous-pull-access", - "service": "ACR", + "guid": "e8659d11-7e02-4db0-848c-c6541dbab68c", + "link": "https://learn.microsoft.com/azure/key-vault/general/backup?tabs=azure-cli#limitations", + "service": "Key Vault", "services": [ - "WAF" + "WAF", + "AKV", + "Backup" ], - "severity": "Medium", - "text": "Disable Anonymous pull access", - "waf": "Security" + "severity": "Low", + "text": "Understand Key Vault's backup limitations. Key Vault does not support the ability to backup more than 500 past versions of a key, secret, or certificate object. Attempting to backup a key, secret, or certificate object may result in an error. It is not possible to delete previous versions of a key, secret, or certificate.", + "waf": "Reliability" }, { - "arm-service": "microsoft.containerregistry/registries", + "arm-service": "Microsoft.KeyVault/vaults", "checklist": "WAF checklist", - "description": "Token authentication doesn't support assignment to an AAD principal. Any tokens provided are able to be used by anyone who can access the token", - "guid": "698dc3a2-fd27-4b2e-8870-1a1252beedf6", - "link": "https://learn.microsoft.com/azure/container-registry/container-registry-authentication?tabs=azure-cli", - "service": "ACR", + "guid": "45c25e29-d0ef-4f07-aa04-0f8c64cbcc04", + "link": "https://learn.microsoft.com/azure/key-vault/general/backup?tabs=azure-cli#limitations", + "service": "Key Vault", "services": [ - "Entra", - "WAF" + "WAF", + "AKV", + "Backup" ], - "severity": "High", - "text": "Disable repository-scoped access tokens", - "waf": "Security" + "severity": "Low", + "text": "Key Vault doesn't currently provide a way to back up an entire key vault in a single operation and keys, secrets and certitificates must be backup indvidually. Familiarize yourself with the Key Vault's backup and restore guidance.", + "waf": "Reliability" }, { - "arm-service": "microsoft.containerregistry/registries", + "arm-service": "Microsoft.KeyVault/vaults", "checklist": "WAF checklist", - "description": "Deploy container images to an ACR behind a Private endpoint within a trusted network", - "guid": "b3bec3d4-f343-47c1-936d-b55f27a71eee", - "service": "ACR", + "guid": "0f15640b-31e5-4de6-85a7-d2c652fa09d3", + "link": "https://learn.microsoft.com/azure/key-vault/general/soft-delete-overview#purge-protection", + "service": "Key Vault", "services": [ - "PrivateLink", "EventHubs", - "ACR", - "WAF" + "WAF", + "AKV" ], - "severity": "High", - "text": "Deploy images from a trusted environment", - "waf": "Security" + "severity": "Medium", + "text": "Purge protection is recommended when using keys for encryption to prevent data loss. Purge protection is an optional Key Vault behavior and is not enabled by default. Purge protection can only be enabled once soft-delete is enabled. It can be turned on via CLI, PowerShell or Portal.", + "waf": "Reliability" }, { - "arm-service": "microsoft.containerregistry/registries", + "arm-service": "Microsoft.Compute/virtualMachineScaleSets", "checklist": "WAF checklist", - "description": "Only tokens with an ACR audience can be used for authentication. Used when enabling Conditional access policies for ACR", - "guid": "3a041fd3-2947-498b-8288-b3c6a56ceb54", - "link": "https://learn.microsoft.com/azure/container-registry/container-registry-enable-conditional-access-policy", - "service": "ACR", + "description": "Automatic instance repairs ensure that unhealthy instances are promptly identified and replaced, maintaining a set of healthy instances within your scale set.", + "guid": "7e13c105-675c-41e9-95b4-59837ff7ae7c", + "link": "https://learn.microsoft.com/azure/virtual-machine-scale-sets/virtual-machine-scale-sets-automatic-instance-repairs", + "service": "VMSS", "services": [ - "Entra", - "ACR", - "AzurePolicy", + "VM", "WAF" ], - "severity": "Medium", - "text": "Disable Azure ARM audience tokens for authentication", - "waf": "Security" + "severity": "Low", + "text": "Enable automatic instance repairs for enhanced VM Scale Sets resiliency", + "waf": "Reliability" }, { - "arm-service": "microsoft.containerregistry/registries", + "arm-service": "Microsoft.Compute/virtualMachines", "checklist": "WAF checklist", - "description": "Set up a diagnostic setting to send 'repositoryEvents' & 'LoginEvents' to Log Analytics as the central destination for logging and monitoring. This allows you to monitor control plane activity on the ACR resource itself.", - "guid": "8a488cde-c486-42bc-9bd2-1be77f26e5e6", - "link": "https://learn.microsoft.com/azure/container-registry/monitor-service", - "service": "ACR", + "description": "Ensure that Azure Backup is utilized appropriately to meet your organization's resiliency requirements for Azure virtual machines (VMs).", + "guid": "4d874a74-8b66-42d6-b150-512a66498f6d", + "link": "https://learn.microsoft.com/azure/backup/backup-azure-vms-introduction", + "service": "VM", "services": [ - "Entra", - "ACR", - "Monitor", - "WAF" + "VM", + "WAF", + "Backup" ], - "severity": "Medium", - "text": "Enable diagnostics logging", - "waf": "Security" + "severity": "High", + "text": "Consider Azure Backup to meet your resiliency requirements for Azure VMs", + "waf": "Reliability" }, { - "arm-service": "microsoft.containerregistry/registries", + "arm-service": "Microsoft.Compute/virtualMachines", "checklist": "WAF checklist", - "description": "Service supports disabling public network access either through using service-level IP ACL filtering rule (not NSG or Azure Firewall) or using a 'Disable Public Network Access' toggle switch", - "guid": "21d41d25-00b7-407a-b9ea-b40fd3290798", - "link": "https://learn.microsoft.com/azure/container-registry/container-registry-private-link", - "service": "ACR", + "description": "Single Instance VMs using Premium SSD or Ultra Disk for all Operating System Disks and Data Disks are guaranteed to have Virtual Machine Connectivity of at least 99.9%", + "guid": "8052d88e-79d1-47b7-9b22-a5a67e7a8ed4", + "link": "https://learn.microsoft.com/azure/virtual-machines/disks-types", + "service": "VM", "services": [ - "PrivateLink", - "VNet", - "Firewall", + "VM", "WAF" ], - "severity": "Medium", - "text": "Control inbound network access with Private Link", - "waf": "Security" + "severity": "High", + "text": "Use Premium or Ultra disks for production VMs", + "waf": "Reliability" }, { - "arm-service": "microsoft.containerregistry/registries", + "arm-service": "Microsoft.Compute/virtualMachines", "checklist": "WAF checklist", - "description": "Disable public network access if inbound network access is secured using Private Link", - "guid": "cd289ced-6b17-4db8-8554-62f2aee4553a", - "link": "https://learn.microsoft.com/azure/container-registry/container-registry-access-selected-networks#disable-public-network-access", - "service": "ACR", + "description": "Azure automatically replicates managed disks within a region to ensure data durability and protect against single-point failures.", + "guid": "b31e38c3-f298-412b-8363-cffe179b599d", + "link": "https://learn.microsoft.com/azure/virtual-machines/managed-disks-overview", + "service": "VM", "services": [ - "PrivateLink", + "VM", "WAF" ], - "severity": "Medium", - "text": "Disable Public Network access", - "waf": "Security" + "severity": "High", + "text": "Ensure Managed Disks are used for all VMs", + "waf": "Reliability" }, { - "arm-service": "microsoft.containerregistry/registries", + "arm-service": "Microsoft.Compute/virtualMachines", "checklist": "WAF checklist", - "description": "Only the ACR Premium SKU supports Private Link access", - "guid": "fc833934-8b26-42d6-ac5f-512925498f6d", - "link": "https://learn.microsoft.com/azure/container-registry/container-registry-skus", - "service": "ACR", + "description": "Temporary disks are intended for short-term storage of non-persistent data such as page files, swap files, or SQL Server tempdb. Storing persistent data on temporary disks can lead to data loss during maintenance events or VM redeployment.", + "guid": "e0d5973c-d4ce-432c-8881-37f6f7c4c0d4", + "link": "https://learn.microsoft.com/azure/virtual-machines/managed-disks-overview#temporary-disk", + "service": "VM", "services": [ - "PrivateLink", - "ACR", + "VM", + "Storage", + "SQL", "WAF" ], "severity": "Medium", - "text": "Use an Azure Container Registry SKU that supports Private Link (Premium SKU)", - "waf": "Security" + "text": "Do not use the Temp disk for anything that is not acceptable to be lost", + "waf": "Reliability" }, { - "arm-service": "microsoft.containerregistry/registries", + "arm-service": "Microsoft.Compute/virtualMachines", "checklist": "WAF checklist", - "description": "Azure Defender for containers or equivalent service should be used to scan container images for vulnerabilities", - "guid": "bad37dac-43bc-46ce-8d7a-a9b24604489a", - "link": "https://learn.microsoft.com/azure/defender-for-cloud/defender-for-containers-introduction", - "service": "ACR", + "description": "Co-locate your compute, storage, networking, and data resources across an availability zone, and replicate this arrangement in other availability zones.", + "guid": "e514548d-2447-4ec6-9138-b8200f1ce16e", + "link": "https://learn.microsoft.com/azure/reliability/availability-zones-overview", + "service": "VM", "services": [ + "VM", "ACR", - "Defender", + "Storage", "WAF" ], - "severity": "Low", - "text": "Enable Defender for Containers to scan Azure Container Registry for vulnerabilities", - "waf": "Security" + "severity": "Medium", + "text": "Leverage Availability Zones for your VMs in regions where they are supported", + "waf": "Reliability" }, { - "arm-service": "microsoft.containerregistry/registries", + "arm-service": "Microsoft.Compute/virtualMachines", "checklist": "WAF checklist", - "description": "Deploy trusted code that was validated and scanned for vulnerabilities according to DevSecOps practices.", - "guid": "4451e1a2-d345-4293-a763-9637a551c5c0", - "service": "ACR", + "description": "Use at least two VMs in Availability Sets to isolate VMs on different fault and update domains.", + "guid": "5a785d6f-e96c-496a-b884-4cf3b2b38c88", + "link": "https://learn.microsoft.com/azure/virtual-machines/availability-set-overview", + "service": "VM", "services": [ + "VM", "WAF" ], "severity": "Medium", - "text": "Deploy validated container images", - "waf": "Security" + "text": "For regions that do not support Availability Zones deploy VMs into Availability Sets", + "waf": "Reliability" }, { - "arm-service": "microsoft.containerregistry/registries", + "arm-service": "Microsoft.Compute/virtualMachines", "checklist": "WAF checklist", - "description": "Use the latest versions of supported platforms, programming languages, protocols, and frameworks.", - "guid": "4e401955-387e-45ce-b126-cd132af5b20c", - "service": "ACR", + "description": "Azure provides multiple options for VM redundancy to meet different requirements (Availability Zones, Virtual Machine Scale Sets, Availability Sets, Azure Site Recovery)", + "guid": "6ba2c021-4991-414a-9d3c-e574dccbd979", + "link": "https://learn.microsoft.com/azure/virtual-machines/availability", + "service": "VM", "services": [ + "VM", + "ASR", "WAF" ], "severity": "High", - "text": "Use up-to-date platforms, languages, protocols and frameworks", - "waf": "Security" + "text": "Avoid running a production workload on a single VM", + "waf": "Reliability" }, { - "arm-service": "Microsoft.Insights/components", + "arm-service": "Microsoft.Compute/virtualMachines", "checklist": "WAF checklist", - "guid": "a95b86ad-8840-48e3-9273-4b875ba18f20", - "link": "https://learn.microsoft.com/azure/architecture/guide/multitenant/considerations/tenancy-models", - "service": "Azure Monitor", + "description": "Azure Site Recovery enables you to achieve low RTO (Recovery Time Objective) for your Azure and hybrid VMs by providing continuous replication and failover capabilities.", + "guid": "2a6bcca2-b5fe-4a1e-af3d-d95d48c7c891", + "link": "https://learn.microsoft.com/azure/site-recovery/site-recovery-overview", + "service": "VM", "services": [ - "Monitor", - "WAF" + "VM", + "ASR", + "WAF", + "AVS" ], - "severity": "Medium", - "text": "Data collection rules in Azure Monitor -https://learn.microsoft.com/azure/azure-monitor/essentials/data-collection-rule-overview", - "training": "https://azure.microsoft.com/pricing/reservations/", - "waf": "Cost" + "severity": "High", + "text": "For Azure and on-premises VMs (Hyper-V/Phyiscal/VMware) with low RTO requirements use Azure Site Recovery", + "waf": "Reliability" }, { - "arm-service": "Microsoft.RecoveryServices/vaults", + "arm-service": "Microsoft.Compute/virtualMachines", "checklist": "WAF checklist", - "guid": "45901365-d38e-443f-abcb-d868266abca2", - "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/ready/landing-zone/design-area/multi-tenant/automation", - "service": "Azure Backup", + "description": "By using Capacity Reservations, you can effectively manage capacity for critical workloads, ensuring resource availability in specified regions.", + "guid": "bd7bb012-f7b9-45e0-9e15-8e3ea3992c2d", + "link": "https://learn.microsoft.com/azure/virtual-machines/capacity-reservation-overview", + "service": "VM", "services": [ - "Backup", "WAF" ], - "severity": "Medium", - "text": "check backup instances with the underlying datasource not found", - "waf": "Cost" + "severity": "Low", + "text": "Use Capacity Reservations for critical workloads that require guaranteed capacity", + "waf": "Reliability" }, { "arm-service": "Microsoft.Compute/virtualMachines", "checklist": "WAF checklist", - "guid": "64f9a19a-f29c-495d-94c6-c7919ca0f6c5", - "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/ready/landing-zone/design-area/multi-tenant/lighthouse", + "description": "By ensuring that the necessary quotas are increased in your DR region before testing failover with ASR, you can avoid any potential resource constraints during the recovery process for failed over VMs.", + "guid": "e6e2065b-3a76-4af4-a691-e8939ada4666", + "link": "https://learn.microsoft.com/azure/quotas/per-vm-quota-requests", "service": "VM", "services": [ + "VM", + "ASR", "WAF" ], "severity": "Medium", - "text": "Delete or archive unassociated services (disks, nics, ip addresses etc)", - "waf": "Cost" + "text": "Increase quotas in DR region before testing failover with ASR", + "waf": "Reliability" }, { - "arm-service": "Microsoft.RecoveryServices/vaults", + "arm-service": "Microsoft.Compute/virtualMachines", "checklist": "WAF checklist", - "guid": "69bad37a-ad53-4cc7-ae1d-76667357c449", - "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/ready/landing-zone/design-area/azure-billing-microsoft-customer-agreement#design-recommendations", - "service": "Azure Backup", + "description": "Scheduled Events is an Azure Metadata Service that provides information about upcoming maintenance events for virtual machines (VMs). By leveraging Scheduled Events, you can proactively prepare your applications for VM maintenance, minimizing disruption and improving the availability of your VMs.", + "guid": "6d3b475a-5c7a-4cbe-99bb-e64dd8902e87", + "link": "https://learn.microsoft.com/azure/virtual-machines/windows/scheduled-events", + "service": "VM", "services": [ - "Storage", - "Backup", - "ASR", + "VM", "WAF" ], - "severity": "Medium", - "text": "Consider a good balance between site recovery storage and backup for non mission critical applications", - "waf": "Cost" + "severity": "Low", + "text": "Utilize Scheduled Events to prepare for VM maintenance", + "waf": "Reliability" }, { - "arm-service": "Microsoft.Insights/components", + "arm-service": "Microsoft.Storage/storageAccounts", "checklist": "WAF checklist", - "guid": "674b5ed8-5a85-49c7-933b-e2a1a27b765a", - "link": "https://learn.microsoft.com/azure/cost-management-billing/manage/direct-ea-administration#manage-notification-contacts", - "service": "Azure Monitor", + "description": "Use Zone-redundant Storage (ZRS) in the primary region for scenarios that require high availability and for restricting replication to a particular country or region. For protection against regional disasters, use Geo-zone-redundant Storage (GZRS), which combines ZRS in the primary region with geo-replication to a secondary region?.", + "guid": "48c7c891-dcb1-4f7d-9769-ae568ba38d4a", + "link": "https://learn.microsoft.com/azure/storage/common/storage-redundancy", + "service": "Azure Storage", "services": [ - "Monitor", + "Storage", "WAF" ], "severity": "Medium", - "text": "Check spending and savings opportunities among the 40 different log analytics workspaces- use different retention and data collection for nonprod workspaces-create daily cap for awareness and tier sizing - If you do set a daily cap, in addition to creating an alert when the cap is reached,ensure that you also create an alert rule to be notified when some percentage has been reached (90% for example). - consider workspace transformation if possible - https://learn.microsoft.com/azure/azure-monitor/essentials/data-collection-transformations#workspace-transformation-dcr ", - "training": "https://learn.microsoft.com/azure/cost-management-billing/costs/understand-work-scopes", - "waf": "Cost" + "text": "Choose the most appropriate data redundancy option for Azure Storage based on your requirements", + "waf": "Reliability" }, { - "arm-service": "Microsoft.Insights/components", + "arm-service": "Microsoft.Storage/storageAccounts", "checklist": "WAF checklist", - "guid": "91be1f38-8ef3-494c-8bd4-63cbbac75819", - "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/ready/landing-zone/design-area/azure-billing-enterprise-agreement#design-considerations", - "service": "Azure Monitor", + "description": "Assigning a Delete lock to your storage account helps protect the availability of your data, minimizing the risk of disruptions to your business operations.", + "guid": "85e2213d-bd7b-4b01-8f7b-95e06e158e3e", + "link": "https://learn.microsoft.com/azure/storage/common/lock-account-resource", + "service": "Azure Storage", "services": [ "Storage", - "AzurePolicy", "WAF" ], - "severity": "Medium", - "text": "Enforce a purging log policy and automation (if needed, logs can be moved to cold storage)", - "training": "https://www.youtube.com/watch?v=nHQYcYGKuyw", - "waf": "Cost" + "severity": "Low", + "text": "Apply a Delete lock to prevent accidental or malicious deletion of storage accounts", + "waf": "Reliability" }, { - "arm-service": "Microsoft.Compute/virtualMachines", + "arm-service": "Microsoft.Storage/storageAccounts", "checklist": "WAF checklist", - "guid": "6aae01e6-a84d-4e5d-b36d-1d92881a1bd5", - "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/ready/landing-zone/design-area/azure-billing-enterprise-agreement#design-considerations", - "service": "VM", + "description": "Container soft delete protects your data from being accidentally deleted by maintaining the deleted data in the system for a specified period of time.", + "guid": "a3992c2d-e6e2-4065-a3a7-6af4a691e893", + "link": "https://learn.microsoft.com/azure/storage/blobs/soft-delete-container-enable", + "service": "Azure Storage", "services": [ "Storage", - "Backup", "WAF" ], - "severity": "Medium", - "text": "Check that the disks are really needed, if not: delete. If they are needed, find lower storage tiers or use backup -", - "training": "https://learn.microsoft.com/azure/cost-management-billing/costs/manage-automation", - "waf": "Cost" + "severity": "Low", + "text": "Enable soft delete for Storage Account Containers", + "waf": "Reliability" }, { "arm-service": "Microsoft.Storage/storageAccounts", "checklist": "WAF checklist", - "guid": "d1e44a19-659d-4395-afd7-7289b835556d", - "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/ready/landing-zone/design-area/azure-billing-enterprise-agreement#design-considerations", - "service": "Storage", + "description": "Blob soft delete protects an individual blob and its versions, snapshots, and metadata from accidental deletes or overwrites by maintaining the deleted data in the system for a specified period of time.", + "guid": "9ada4666-7e13-4c10-96b9-153d89f89dc7", + "link": "https://learn.microsoft.com/azure/storage/blobs/soft-delete-blob-enable", + "service": "Azure Storage", "services": [ "Storage", - "AzurePolicy", "WAF" ], - "severity": "Medium", - "text": "Consider moving unused storage to lower tier, with customized rule - https://learn.microsoft.com/azure/storage/blobs/lifecycle-management-policy-configure ", - "training": "https://learn.microsoft.com/azure/cost-management-billing/costs/enable-tag-inheritance", - "waf": "Cost" + "severity": "Low", + "text": "Enable soft delete for blobs", + "waf": "Reliability" }, { - "arm-service": "Microsoft.Compute/virtualMachines", + "arm-service": "Microsoft.RecoveryServices/vaults", "checklist": "WAF checklist", - "guid": "d0102cac-6aae-401e-9a84-de5de36d1d92", - "link": "https://learn.microsoft.com/azure/governance/policy/overview", - "service": "VM", + "description": "Azure Backup enhanced soft delete provides critical protection against ransomware attacks by retaining deleted backups, enabling recovery from potential ransomware encryption or deletion.", + "guid": "b44be3b1-a27f-48b9-b91b-e1038df03a82", + "link": "https://learn.microsoft.com/azure/backup/backup-azure-enhanced-soft-delete-about", + "service": "Azure Backup", "services": [ - "VM", - "WAF" + "WAF", + "Backup" ], "severity": "Medium", - "text": "Make sure advisor is configured for VM right sizing ", - "waf": "Cost" + "text": "Enable Azure Backup enhanced soft delete for improved data protection and recovery", + "waf": "Reliability" }, { - "arm-service": "Microsoft.Compute/virtualMachines", + "arm-service": "Microsoft.RecoveryServices/vaults", "checklist": "WAF checklist", - "description": "check by searching the Meter Category Licenses in the Cost analysys", - "guid": "59ae568b-a38d-4498-9e22-13dbd7bb012f", - "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/manage/centralize-operations", - "service": "VM", + "description": "Azure Backup's multi-user authorization enables fine-grained control over user access to backup resources, allowing you to restrict privileges and ensure proper authentication and authorization for backup operations.", + "guid": "2cd463cb-bbc8-4ac2-a9eb-c92a43da1dae", + "link": "https://learn.microsoft.com/azure/backup/multi-user-authorization-concept", + "service": "Azure Backup", "services": [ - "VM", - "Cost", - "AzurePolicy", - "WAF" + "WAF", + "Backup" ], - "severity": "Medium", - "text": "run the script on all windows VMs https://learn.microsoft.com/azure/virtual-machines/windows/hybrid-use-benefit-licensing?ref=andrewmatveychuk.com#convert-an-existing-vm-using-azure-hybrid-benefit-for-windows-server- consider implementing a policy if windows VMs are created frequently", - "waf": "Cost" + "severity": "Low", + "text": "Implement multi-user authorization for Azure Backup to ensure secure and controlled access to backup resources", + "waf": "Reliability" }, { - "arm-service": "Microsoft.Compute/virtualMachines", + "arm-service": "Microsoft.RecoveryServices/vaults", "checklist": "WAF checklist", - "guid": "7b95e06e-158e-42ea-9992-c2de6e2065b3", - "link": "https://learn.microsoft.com/azure/active-directory/privileged-identity-management/pim-configure", - "service": "VM", + "description": "Azure Immutable Storage provides an additional layer of security by ensuring that backup data stored in the vault cannot be modified or deleted for a specified retention period. This helps safeguard your backups from ransomware attacks that may attempt to compromise or manipulate your backup data.", + "guid": "2cc88147-0607-4c1c-aa0e-614658dd458e", + "link": "https://learn.microsoft.com/azure/backup/backup-azure-immutable-vault-concept?source=recommendations&tabs=recovery-services-vault", + "service": "Azure Backup", "services": [ - "LoadBalancer", + "Storage", + "WAF", + "Backup" + ], + "severity": "Low", + "text": "Implement Immutable Storage for your vaults to protect against ransomware and prevent unauthorized modifications to backups", + "waf": "Reliability" + }, + { + "arm-service": "Microsoft.Network/dnsZones", + "checklist": "WAF checklist", + "description": "To eliminate a single point of failure in your on-premises DNS services and ensure reliable DNS resolution during business continuity and disaster recovery scenarios, it is recommended to utilize Azure DNS Private Resolvers in multiple regions. By deploying two or more Azure DNS private resolvers across different regions, you can enable DNS failover and achieve resiliency in your DNS infrastructure.", + "guid": "43da1dae-2cc8-4814-9060-7c1cca0e6146", + "link": "https://learn.microsoft.com/azure/dns/tutorial-dns-private-resolver-failover", + "service": "DNS", + "services": [ + "DNS", + "ASR", + "WAF", + "ACR" + ], + "severity": "Low", + "text": "Implement DNS Failover using Azure DNS Private Resolvers", + "waf": "Reliability" + }, + { + "arm-service": "Microsoft.PowerBI/gateways", + "checklist": "WAF checklist", + "description": "Use an on-premises data gateway cluster to avoid single points of failure and to load balance traffic across gateways.", + "guid": "89f89dc7-b44b-4e3b-8a27-f8b9e91be103", + "link": "https://learn.microsoft.com/data-integration/gateway/service-gateway-high-availability-clusters", + "service": "Data Gateways", + "services": [ + "ACR", "WAF" ], "severity": "Medium", - "text": " this can be also put under AHUB if you already have licenses https://learn.microsoft.com/azure/virtual-machines/linux/azure-hybrid-benefit-linux?tabs=rhelpayg%2Crhelbyos%2CrhelEnablebyos%2Crhelcompliance", - "waf": "Cost" + "text": "Use on-premises data gateway clusters to ensure high availability for business-critical data", + "waf": "Reliability" }, { "arm-service": "Microsoft.Compute/virtualMachines", "checklist": "WAF checklist", - "guid": "75c1e945-b459-4837-bf7a-e7c6d3b475a5", - "link": "https://learn.microsoft.com/azure/active-directory/fundamentals/active-directory-groups-create-azure-portal", - "service": "VM", + "description": "When choosing the best option for deploying NVAs in Azure, it is crucial to consider the vendor's recommendations and validate that the specific design has been vetted and validated by the NVA vendor. The vendor should also provide the necessary NVA configuration for seamless integration in Azure.", + "guid": "8b1188b3-c6a4-46ce-a544-451e192d3442", + "link": "https://learn.microsoft.com/azure/architecture/reference-architectures/dmz/nva-ha", + "service": "NVA", "services": [ - "VM", + "NVA", "WAF" ], - "severity": "Medium", - "text": "Consolidate reserved VM families with flexibility option (no more than 4-5 families)", - "training": "https://learn.microsoft.com/azure/automation/automation-solution-vm-management", - "waf": "Cost" + "severity": "High", + "text": "Deploy Network Virtual Appliances (NVAs) in a vendor supported configuration for High Availability", + "waf": "Reliability" }, { - "arm-service": "Microsoft.Compute/virtualMachines", + "arm-service": "Microsoft.Purview/accounts", "checklist": "WAF checklist", - "guid": "c7acbe49-bbe6-44dd-a9f2-e87778468d55", - "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/ready/landing-zone/design-area/identity-access#prerequisites-for-a-landing-zone---design-recommendations", - "service": "VM", + "guid": "1fc2fc14-eea6-4e69-b8d9-a3edc218e687", + "link": "https://polite-sea-0995b240f.2.azurestaticapps.net/technical-delivery-playbook/azure-services/analytics/purview/", + "service": "Purview", "services": [ - "ARS", - "VM", - "Cost", "WAF" ], "severity": "Medium", - "text": "Utilize Azure Reserved Instances: This feature allows you to reserve VMs for a period of 1 or 3 years, providing significant cost savings compared to PAYG prices.", - "waf": "Cost" + "text": "Leverage FTA Resillency Handbook", + "waf": "Reliability" }, { - "arm-service": "Microsoft.Compute/virtualMachines", + "arm-service": "Microsoft.Purview/accounts", "checklist": "WAF checklist", - "guid": "a6bcca2b-4fea-41db-b3dd-95d48c7c891d", - "link": "https://learn.microsoft.com/azure/active-directory-domain-services/overview", - "service": "VM", + "guid": "ab067acb-49e5-4b96-8332-4ecf8cc13318", + "link": "https://learn.microsoft.com/purview/disaster-recovery", + "service": "Purview", "services": [ "WAF" ], - "severity": "Medium", - "text": "Only larger disks can be reserved => 1 TiB -", - "waf": "Cost" + "severity": "High", + "text": "Plan for Data Center level outage", + "waf": "Reliability" }, { - "arm-service": "Microsoft.Compute/virtualMachines", + "arm-service": "Microsoft.Purview/accounts", "checklist": "WAF checklist", - "guid": "cb1f7d57-59ae-4568-aa38-d4985e2213db", - "link": "https://learn.microsoft.com/azure/architecture/reference-architectures/identity/adds-extend-domain", - "service": "VM", + "description": "1. Create the new account 2. Migrate configuration items 3. Run scans 4. Migrate custom typedefs and custom assets 5. Migrate relationships 6. Migrate glossary terms 7. Assign classifications to assets 8. Assign contacts to assets", + "guid": "da611702-69f4-4fb4-aa3d-3ef7f3176c4b", + "link": "https://learn.microsoft.com/purview/disaster-recovery", + "service": "Purview", "services": [ "WAF" ], "severity": "Medium", - "text": "After the right-sizing optimization", - "waf": "Cost" + "text": "Practice Failover for BCDR", + "waf": "Reliability" }, { - "arm-service": "Microsoft.Sql/servers", + "arm-service": "Microsoft.Purview/accounts", "checklist": "WAF checklist", - "guid": "d7bb012f-7b95-4e06-b158-e2ea3992c2de", - "link": "https://learn.microsoft.com/azure/active-directory/app-proxy/application-proxy", - "service": "Azure SQL", + "guid": "97b15b8a-219a-44ab-bb57-879024d22678", + "link": "https://learn.microsoft.com/purview/disaster-recovery", + "service": "Purview", "services": [ - "AzurePolicy", - "SQL", - "Cost", - "WAF" + "WAF", + "Backup" ], - "severity": "Medium", - "text": "Check if applicable and enforce policy/change https://learn.microsoft.com/azure/azure-sql/azure-hybrid-benefit?view=azuresql&tabs=azure-portalhttps://learn.microsoft.com/azure/cost-management-billing/scope-level/create-sql-license-assignments?source=recommendations", - "waf": "Cost" + "severity": "High", + "text": "Plan a backup strategy and take regular backups", + "waf": "Reliability" }, { - "arm-service": "Microsoft.Compute/virtualMachines", + "arm-service": "Microsoft.Purview/accounts", "checklist": "WAF checklist", - "guid": "6e2065b3-a76a-4f4a-991e-8839ada46667", - "link": "https://learn.microsoft.com/azure/active-directory/roles/best-practices", - "service": "VM", + "guid": "6d20b56c-56a9-4581-89bf-8d8e5c586b7d", + "link": "https://learn.microsoft.com/purview/manage-kafka-dotnet", + "service": "Purview", "services": [ - "VM", + "EventHubs", "WAF" ], - "severity": "Medium", - "text": "The VM + license part discount (ahub + 3YRI) is around 70% discount", - "waf": "Cost" + "severity": "Low", + "text": "Use Microsoft Purview's Event Hubs to subscribe and create entities to another account", + "waf": "Reliability" }, { - "arm-service": "Microsoft.Compute/virtualMachines", + "arm-service": "Microsoft.Purview/accounts", "checklist": "WAF checklist", - "guid": "ccbd9792-a6bc-4ca2-a4fe-a1dbf3dd95d4", - "link": "https://learn.microsoft.com/azure/web-application-firewall/afds/waf-front-door-best-practices#send-logs-to-microsoft-sentinel", - "service": "VM", + "guid": "8cdc15ac-c075-4ee9-a130-a8889579e76b", + "link": "https://learn.microsoft.com/purview/deployment-best-practices", + "service": "Purview", "services": [ - "VM", "WAF" ], "severity": "Medium", - "text": "Consider using a VMSS to match demand rather than flat sizing", - "waf": "Cost" + "text": "Follow Purview accounts architectures and deployment best practices", + "waf": "Reliability" }, { - "arm-service": "microsoft.containerservice/managedClusters", + "arm-service": "Microsoft.Purview/accounts", "checklist": "WAF checklist", - "guid": "c1b1cd52-1e54-4a29-a9de-39ac0e7c28dc", - "link": "https://learn.microsoft.com/azure/reliability/cross-region-replication-azure", - "service": "AKS", + "guid": "896e710a-7da7-4be9-a56d-14d3c49d997c", + "link": "https://learn.microsoft.com/purview/concept-best-practices-collections", + "service": "Purview", "services": [ - "AKS", "WAF" ], "severity": "Medium", - "text": "Use AKS autoscaler to match your clusters usage (make sure the pods requirements match the scaler)", - "waf": "Cost" + "text": "Follow Collection Architectures and best practices", + "waf": "Reliability" }, { - "arm-service": "Microsoft.RecoveryServices/vaults", + "arm-service": "Microsoft.Purview/accounts", "checklist": "WAF checklist", - "guid": "44be3b1a-27f8-4b9e-a1be-1f38df03a822", - "link": "https://learn.microsoft.com/azure/azure-monitor/logs/data-retention-archive?tabs=portal-1%2Cportal-2#how-retention-and-archiving-work", - "service": "Azure Backup", + "guid": "b3d1325a-a225-4c6f-9e06-85edddea8a4b", + "link": "https://learn.microsoft.com/purview/concept-best-practices-asset-lifecycle", + "service": "Purview", "services": [ "WAF" ], "severity": "Medium", - "text": "Move recovery points to vault-archive where applicable (Validate)", - "training": "https://azure.microsoft.com/pricing/reservations/", - "waf": "Cost" + "text": "Follow Assest lifecycle best practices", + "waf": "Reliability" }, { - "arm-service": "Microsoft.Databricks/workspaces", + "arm-service": "Microsoft.Purview/accounts", "checklist": "WAF checklist", - "guid": "cd463cbb-bc8a-4c29-aebc-91a43da1dae2", - "link": "https://learn.microsoft.com/azure/databricks/clusters/cluster-config-best-practices#automatic-termination", - "service": "Databricks", + "guid": "7cdeb3c6-1fc2-4fc1-9eea-6e69d8d9a3ed", + "link": "https://learn.microsoft.com/purview/concept-best-practices-automation", + "service": "Purview", "services": [ - "LoadBalancer", - "VM", "WAF" ], "severity": "Medium", - "text": "Consider using Spot VMs with fallback where possible. Consider autotermination of clusters.", - "waf": "Cost" + "text": "Follow automation best practices", + "waf": "Reliability" }, { - "arm-service": "Microsoft.Web/sites", + "arm-service": "Microsoft.Purview/accounts", "checklist": "WAF checklist", - "guid": "cc881470-607c-41cc-a0e6-14658dd458e9", - "link": "https://learn.microsoft.com/azure/governance/policy/how-to/guest-configuration-create", - "service": "Azure Functions", + "guid": "c218e687-ab06-47ac-a49e-5b9603324ecf", + "link": "https://learn.microsoft.com/purview/disaster-recovery", + "service": "Purview", "services": [ - "WAF" + "WAF", + "Backup" ], "severity": "Medium", - "text": "Functions - Reuse connections", - "training": "https://learn.microsoft.com/azure/cost-management-billing/reservations/reservation-apis?toc=%2Fazure%2Fcost-management-billing%2Ftoc.json", - "waf": "Cost" + "text": "Follow Backup and Migration Best practices", + "waf": "Reliability" }, { - "arm-service": "Microsoft.Web/sites", + "arm-service": "Microsoft.Purview/accounts", "checklist": "WAF checklist", - "guid": "27139b82-1102-4dbd-9eaf-11e6f843e52f", - "link": "https://learn.microsoft.com/azure/automation/update-management/overview", - "service": "Azure Functions", + "guid": "8cc13318-da61-4170-869f-4fb4aa3d3ef7", + "link": "https://learn.microsoft.com/purview/concept-best-practices-glossary", + "service": "Purview", "services": [ "WAF" ], "severity": "Medium", - "text": "Functions - Cache data locally", - "training": "https://learn.microsoft.com/learn/paths/azure-administrator-manage-compute-resources/", - "waf": "Cost" + "text": "Follow Purview Glossary Best Practices", + "waf": "Reliability" }, { - "arm-service": "Microsoft.Web/sites", + "arm-service": "Microsoft.Purview/accounts", "checklist": "WAF checklist", - "guid": "4722d928-c1b1-4cd5-81e5-4a29b9de39ac", - "link": "https://learn.microsoft.com/azure/network-watcher/network-watcher-monitoring-overview", - "service": "Azure Functions", + "guid": "f3176c4b-97b1-45b8-a219-a4abeb578790", + "link": "https://learn.microsoft.com/purview/concept-workflow", + "service": "Purview", "services": [ - "Storage", "WAF" ], - "severity": "Medium", - "text": "Functions - Cold starts-Use the 'Run from package' functionality. This way, the code is downloaded as a single zip file. This can, for example, result in significant improvements with Javascript functions, which have a lot of node modules.Use language specific tools to reduce the package size, for example, tree shaking Javascript applications.", - "training": "https://learn.microsoft.com/learn/modules/configure-network-watcher/", - "waf": "Cost" + "severity": "Low", + "text": "Leverage Workflows ", + "waf": "Reliability" }, { - "arm-service": "Microsoft.Web/sites", + "arm-service": "Microsoft.Purview/accounts", "checklist": "WAF checklist", - "guid": "0e7c28dc-9366-4572-82bf-f4564b0d934a", - "link": "https://learn.microsoft.com/azure/azure-resource-manager/management/lock-resources?tabs=json", - "service": "Azure Functions", + "guid": "24d22678-6d20-4b56-a56a-958119bf8d8e", + "link": "https://learn.microsoft.com/purview/concept-best-practices-security", + "service": "Purview", "services": [ "WAF" ], "severity": "Medium", - "text": "Functions - Keep your functions warm", - "training": "https://learn.microsoft.com/learn/paths/implement-resource-mgmt-security/", - "waf": "Cost" + "text": "Follow Purview Security Best Practices", + "waf": "Reliability" }, { - "arm-service": "Microsoft.Web/sites", + "arm-service": "Microsoft.Purview/accounts", "checklist": "WAF checklist", - "guid": "359c363e-7dd6-4162-9a36-4a907ebae38e", - "link": "https://learn.microsoft.com/azure/governance/policy/overview", - "service": "Azure Functions", + "guid": "5c586b7d-8cdc-415a-ac07-5ee9b130a888", + "link": "https://learn.microsoft.com/purview/concept-best-practices-lineage-azure-data-factory", + "service": "Purview", "services": [ "WAF" ], "severity": "Medium", - "text": "When using autoscale with different functions, there might be one driving all the autoscale for all the resources - consider moving it to a separate consumption plan (and consider higher plan for CPU)", - "waf": "Cost" + "text": "Follow Purview Data Lineage Best Practices", + "waf": "Reliability" }, { - "arm-service": "Microsoft.Web/sites", + "arm-service": "Microsoft.Purview/accounts", "checklist": "WAF checklist", - "guid": "ad53cc7d-e2e8-4aaa-a357-1549ab9153d8", - "link": "https://learn.microsoft.com/azure/service-health/alerts-activity-log-service-notifications-portal", - "service": "Azure Functions", + "guid": "9579e76b-896e-4710-a7da-7be9956d14d3", + "link": "https://learn.microsoft.com/purview/concept-best-practices-scanning", + "service": "Purview", "services": [ "WAF" ], "severity": "Medium", - "text": "Function apps in a given plan are all scaled together, so any issues with scaling can affect all apps in the plan.", - "waf": "Cost" + "text": "Follow Best Practices for Scanning Registered Sources", + "waf": "Reliability" }, { - "arm-service": "Microsoft.Web/sites", + "arm-service": "Microsoft.Purview/accounts", "checklist": "WAF checklist", - "guid": "9f89dc7b-44be-43b1-a27f-8b9e91be1f38", - "link": "https://learn.microsoft.com/azure/azure-monitor/alerts/action-groups", - "service": "Azure Functions", + "guid": "c49d997c-b3d1-4325-aa22-5c6f4e0685ed", + "link": "https://learn.microsoft.com/purview/concept-best-practices-classification", + "service": "Purview", "services": [ "WAF" ], "severity": "Medium", - "text": "Am I billed for 'await time'? This question is typically asked in the context of a C# function that does an async operation and waits for the result, e.g. await Task.Delay(1000) or await client.GetAsync('http://google.com'). The answer is yes - the GB second calculation is based on the start and end time of the function and the memory usage over that period. What actually happens over that time in terms of CPU activity is not factored into the calculation.One exception to this rule is if you are using durable functions. You are not billed for time spent at awaits in orchestrator functions.apply demand shaping techinques where possible (dev environments?) https://github.com/Azure-Samples/functions-csharp-premium-scaler", - "waf": "Cost" + "text": "Follow Classification Best Practices in Governance Portal", + "waf": "Reliability" }, { - "arm-service": "microsoft.network/frontdoors", + "arm-service": "Microsoft.Purview/accounts", "checklist": "WAF checklist", - "guid": "3da1dae2-cc88-4147-8607-c1cca0e61465", - "link": "https://learn.microsoft.com/azure/azure-monitor/logs/design-logs-deployment", - "service": "Front Door", + "guid": "ddea8a4b-7cde-4b3c-91fc-2fc14eea6e69", + "link": "https://learn.microsoft.com/purview/sensitivity-labels-frequently-asked-questions", + "service": "Purview", "services": [ - "EventHubs", - "FrontDoor", "WAF" ], "severity": "Medium", - "text": "Frontdoor - Turn off the default homepageIn the application settings of your App, set AzureWebJobsDisableHomepage to true. This will return a 204 (No Content) to the PoP so only header data is returned.", - "waf": "Cost" + "text": "Perform Sensitivity Labelling in the Purview Data Map", + "waf": "Reliability" }, { - "arm-service": "microsoft.network/frontdoors", + "arm-service": "Microsoft.Purview/accounts", "checklist": "WAF checklist", - "guid": "8dd458e9-2713-49b8-8110-2dbd6eaf11e6", - "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/ready/azure-setup-guide/monitoring-reporting?tabs=AzureMonitor", - "service": "Front Door", + "guid": "d8d9a3ed-c218-4e68-9ab0-67acb49e5b96", + "link": "https://learn.microsoft.com/purview/concept-data-share", + "service": "Purview", "services": [ - "AppSvc", - "FrontDoor", + "Storage", "WAF" ], - "severity": "Medium", - "text": "Frontdoor - Route to something that returns nothing. Either set up a Function, Function Proxy, or add a route in your WebApp that returns 200 (OK) and sends no or minimal content. The advantage of this is you will be able to log out when it is called.", - "waf": "Cost" + "severity": "Low", + "text": "Leverage Azure Storage in-place data sharing with Microsoft Purview", + "waf": "Reliability" }, { - "arm-service": "Microsoft.Storage/storageAccounts", + "arm-service": "Microsoft.Purview/accounts", "checklist": "WAF checklist", - "guid": "7e31c67d-68cf-46a6-8a11-94956d697dc3", - "link": "https://learn.microsoft.com/azure/architecture/best-practices/monitoring", - "service": "Storage", + "guid": "03324ecf-8cc1-4331-ada6-1170269f4fb4", + "link": "https://learn.microsoft.com/purview/concept-insights", + "service": "Purview", "services": [ "WAF" ], - "severity": "Medium", - "text": "Consider archiving tiers for less used data", - "waf": "Cost" + "severity": "Low", + "text": "Leverage Data Estate Insights", + "waf": "Reliability" }, { - "arm-service": "Microsoft.Compute/virtualMachines", + "arm-service": "Microsoft.Purview/accounts", "checklist": "WAF checklist", - "guid": "a2ed27b2-d186-4f1a-8252-bddde68a487c", - "link": "https://learn.microsoft.com/azure/automation/how-to/region-mappings", - "service": "VM", + "guid": "aa3d3ef7-f317-46c4-a97b-15b8a219a4ab", + "link": "https://learn.microsoft.com/purview/catalog-adoption-insights", + "service": "Purview", "services": [ "WAF" ], - "severity": "Medium", - "text": "Check disk sizes where the size does not match the tier (i.e. A 513 GiB disk will pay a P30 (1TiB) and consider resizing", - "waf": "Cost" + "severity": "Low", + "text": "Use Data stewardship and Catalog adoption", + "waf": "Reliability" }, { - "arm-service": "Microsoft.Storage/storageAccounts", + "arm-service": "Microsoft.Purview/accounts", "checklist": "WAF checklist", - "guid": "dec4861b-c3bc-410a-b77e-26e4d5a3bec2", - "link": "https://learn.microsoft.com/azure/governance/policy/concepts/guest-configuration", - "service": "Storage", + "guid": "eb578790-24d2-4267-a6d2-0b56c56a9581", + "link": "https://learn.microsoft.com/purview/concept-insights", + "service": "Purview", "services": [ "WAF" ], - "severity": "Medium", - "text": "Consider using standard SSD rather than Premium or Ultra where possible", - "waf": "Cost" + "severity": "Low", + "text": "Use Inventory and Ownership", + "waf": "Reliability" }, { - "arm-service": "Microsoft.Storage/storageAccounts", + "arm-service": "Microsoft.Purview/accounts", "checklist": "WAF checklist", - "guid": "c4e2436b-1336-4db5-9f17-960eee0bdf5c", - "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/ready/landing-zone/design-area/management-operational-compliance#monitoring-for-configuration-drift", - "service": "Storage", + "guid": "19bf8d8e-5c58-46b7-b8cd-c15acc075ee9", + "link": "https://learn.microsoft.com/purview/glossary-insights", + "service": "Purview", "services": [ - "Storage", "WAF" ], - "severity": "Medium", - "text": "For storage accounts, make sure that the chosen tier is not adding up transaction charges (it might be cheaper to move to the next tier)", - "waf": "Cost" + "severity": "Low", + "text": "Leverage Insights for Glossary, Classifications, Sensitivity Labels", + "waf": "Reliability" }, { - "arm-service": "Microsoft.RecoveryServices/vaults", + "arm-service": "Microsoft.Purview/accounts", "checklist": "WAF checklist", - "guid": "c2efc5d7-61d4-41d2-900b-b47a393a040f", - "link": "https://learn.microsoft.com/azure/site-recovery/site-recovery-overview", - "service": "Site Recovery", + "guid": "b130a888-9579-4e76-a896-e710a7da7be9", + "link": "https://learn.microsoft.com/purview/compliance-manager", + "service": "Purview", "services": [ - "ASR", "WAF" ], "severity": "Medium", - "text": "For ASR, consider using Standard SSD disks if the RPO/RTO and replication throughput allow it", - "waf": "Cost" + "text": "Generate assessment scores", + "waf": "Reliability" }, { - "arm-service": "Microsoft.Storage/storageAccounts", + "arm-service": "Microsoft.Purview/accounts", "checklist": "WAF checklist", - "guid": "d3294798-b118-48b2-a5a4-6ceb544451e1", - "link": "https://learn.microsoft.com/azure/architecture/framework/resiliency/backup-and-recovery", - "service": "Storage", + "guid": "956d14d3-c49d-4997-ab3d-1325aa225c6f", + "link": "https://learn.microsoft.com/purview/compliance-manager-scoring", + "service": "Purview", "services": [ - "Storage", "WAF" ], "severity": "Medium", - "text": "Storage accounts: check hot tier and/or GRS necessary", - "waf": "Cost" + "text": "Profiling- get summaries of data content", + "waf": "Reliability" }, { - "arm-service": "Microsoft.Compute/virtualMachines", + "arm-service": "Microsoft.Purview/accounts", "checklist": "WAF checklist", - "guid": "92d34429-3c76-4286-97a5-51c5b04e4f18", - "link": "https://learn.microsoft.com/azure/backup/backup-center-overview", - "service": "VM", + "guid": "4e0685ed-ddea-48a4-a7cd-eb3c61fc2fc1", + "link": "https://learn.microsoft.com/purview/concept-policies-data-owner#microsoft-purview-policy-concepts", + "service": "Purview", "services": [ - "WAF" + "WAF", + "AzurePolicy" ], - "severity": "Medium", - "text": "Disks - validate use of Premium SSD disks everywhere: for example, non-prod could swap to Standard SSD or on-demand Premium SSD ", - "waf": "Cost" + "severity": "Low", + "text": "Follow Microsoft Purview Data Owner access policies", + "waf": "Reliability" }, { - "arm-service": "Microsoft.Synapse/workspaces", + "arm-service": "Microsoft.Purview/accounts", "checklist": "WAF checklist", - "guid": "54387e5c-ed12-46cd-832a-f5b2fc6998a5", - "link": "https://learn.microsoft.com/azure/reliability/availability-zones-overview", - "service": "Synapse", + "guid": "4eea6e69-d8d9-4a3e-bc21-8e687ab067ac", + "link": "https://learn.microsoft.com/purview/concept-self-service-data-access-policy", + "service": "Purview", "services": [ - "EventHubs", - "Monitor", - "Cost", - "WAF" + "WAF", + "AzurePolicy" ], - "severity": "Medium", - "text": "Create budgets to manage costs and create alerts that automatically notify stakeholders of spending anomalies and overspending risks.", - "waf": "Cost" + "severity": "Low", + "text": "Follow Self-service access policies", + "waf": "Reliability" }, { - "arm-service": "Microsoft.Synapse/workspaces", + "arm-service": "Microsoft.Purview/accounts", "checklist": "WAF checklist", - "guid": "35e33789-7e31-4c67-b68c-f6a62a119495", - "link": "https://learn.microsoft.com/azure/virtual-machines/availability", - "service": "Synapse", + "guid": "b49e5b96-0332-44ec-b8cc-13318da61170", + "link": "https://learn.microsoft.com/purview/concept-policies-devops", + "service": "Purview", "services": [ - "Storage", - "Cost", - "WAF" + "WAF", + "AzurePolicy" ], - "severity": "Medium", - "text": "Export cost data to a storage account for additional data analysis.", - "waf": "Cost" + "severity": "Low", + "text": "Follow DevOps policies", + "waf": "Reliability" }, { - "arm-service": "Microsoft.Synapse/workspaces", + "arm-service": "Microsoft.Devices/deviceUpdateServices", "checklist": "WAF checklist", - "guid": "6d697dc3-a2ed-427b-8d18-6f1a1252bddd", - "link": "https://learn.microsoft.com/azure/load-balancer/load-balancer-overview", - "service": "Synapse", + "guid": "0e03f5ee-4648-423c-bb86-7239480f9171", + "link": "https://learn.microsoft.com/en-us/azure/iot-dps/iot-dps-ha-dr#high-availability", + "service": "Device Update for IoT Hub", "services": [ - "SQL", - "Cost", "WAF" ], - "severity": "Medium", - "text": "Control costs for a dedicated SQL pool by pausing the resource when it is not in use.", - "waf": "Cost" + "severity": "High", + "text": "Leverage Availability Zones if regionally applicable (this is automatically enabled).", + "waf": "Reliability" }, { - "arm-service": "Microsoft.Synapse/workspaces", + "arm-service": "Microsoft.Devices/deviceUpdateServices", "checklist": "WAF checklist", - "guid": "e68a487c-dec4-4861-ac3b-c10ae77e26e4", - "link": "https://learn.microsoft.com/azure/virtual-machine-scale-sets/overview", - "service": "Synapse", + "guid": "c0c273bd-00ad-419a-9f2f-fc72fb181e55", + "link": "https://learn.microsoft.com/en-us/azure/iot-dps/iot-dps-ha-dr#high-availability", + "service": "Device Update for IoT Hub", "services": [ "WAF" ], - "severity": "Medium", - "text": "Enable the serverless Apache Spark automatic pause feature and set your timeout value accordingly.", - "waf": "Cost" + "severity": "High", + "text": "Be aware of Microsoft-initiated failovers. These are exercised by Microsoft in rare situations to fail over all the DPS instances from an affected region to the corresponding geo-paired region.", + "waf": "Reliability" }, { - "arm-service": "Microsoft.Synapse/workspaces", + "arm-service": "Microsoft.Devices/deviceUpdateServices", "checklist": "WAF checklist", - "guid": "d5a3bec2-c4e2-4436-a133-6db55f17960e", - "link": "https://learn.microsoft.com/azure/frontdoor/best-practices#use-latest-version-for-customer-managed-certificates", - "service": "Synapse", + "guid": "3af8abe6-07eb-4287-b393-6c4abe3702eb", + "link": "https://learn.microsoft.com/en-us/azure/logic-apps/business-continuity-disaster-recovery-guidance?toc=%2Fazure%2Freliability%2Ftoc.json&bc=%2Fazure%2Freliability%2Fbreadcrumb%2Ftoc.json", + "service": "Device Update for IoT Hub", "services": [ "WAF" ], - "severity": "Medium", - "text": "Create multiple Apache Spark pool definitions of various sizes.", - "waf": "Cost" + "severity": "High", + "text": "Consider a Cross-Region DR strategy for critical workloads", + "waf": "Reliability" }, { - "arm-service": "Microsoft.Synapse/workspaces", + "arm-service": "Microsoft.Devices/deviceUpdateServices", "checklist": "WAF checklist", - "guid": "ee0bdf5c-c2ef-4c5d-961d-41d2500bb47a", - "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/ready/landing-zone/design-area/resource-org-management-groups#management-groups-in-the-azure-landing-zone-accelerator", - "service": "Synapse", + "guid": "bd91245c-fe32-4e98-a085-794a40f4bfe1", + "link": "https://learn.microsoft.com/en-us/azure/app-service/environment/intro", + "service": "Device Update for IoT Hub", "services": [ - "Cost", - "WAF" + "WAF", + "AppSvc" ], - "severity": "Medium", - "text": "Purchase Azure Synapse commit units (SCU) for one year with a pre-purchase plan to save on your Azure Synapse Analytics costs.", - "training": "https://learn.microsoft.com/learn/paths/secure-application-delivery/", - "waf": "Cost" + "severity": "High", + "text": "If deploying to an Isolated environment, use or migrate to App Service Environment (ASE) v3", + "waf": "Reliability" }, { - "arm-service": "Microsoft.Compute/virtualMachines", + "arm-service": "Microsoft.Devices/provisioningServices", "checklist": "WAF checklist", - "guid": "393a040f-d329-4479-ab11-88b2c5a46ceb", - "link": "https://learn.microsoft.com/azure/application-gateway/overview-v2", - "service": "VM", + "guid": "cb26b2ba-a9db-45d1-8260-d9c6ec1447d9", + "link": "https://learn.microsoft.com/en-us/azure/logic-apps/single-tenant-overview-compare", + "service": "IoT Hub DPS", "services": [ - "VM", - "Cost", "WAF" ], - "severity": "Medium", - "text": "Use Spot VMs for interruptible jobs: These are VMs that can be bid on and purchased at a discounted price, providing a cost-effective solution for non-critical workloads.", - "training": "https://learn.microsoft.com/learn/paths/secure-application-delivery/", - "waf": "Cost" + "severity": "High", + "text": "Select the right Logic App hosting plan based on your business & SLO requirements", + "waf": "Reliability" }, { - "arm-service": "Microsoft.Compute/virtualMachines", + "arm-service": "Microsoft.Devices/provisioningServices", "checklist": "WAF checklist", - "guid": "544451e1-92d3-4442-a3c7-628637a551c5", - "link": "https://learn.microsoft.com/azure/load-balancer/load-balancer-overview", - "service": "VM", + "guid": "f6dd7977-1123-4f39-b488-f91415a8430a", + "link": "https://learn.microsoft.com/en-us/azure/logic-apps/set-up-zone-redundancy-availability-zones?tabs=standard#next-steps", + "service": "IoT Hub DPS", "services": [ - "VM", "WAF" ], - "severity": "Medium", - "text": "Right-sizing all VMs", - "waf": "Cost" + "severity": "High", + "text": "Protect logic apps from region failures with zone redundancy and availability zones", + "waf": "Reliability" }, { - "arm-service": "Microsoft.Compute/virtualMachines", + "arm-service": "Microsoft.Devices/provisioningServices", "checklist": "WAF checklist", - "guid": "b04e4f18-5438-47e5-aed1-26cd032af5b2", - "link": "https://learn.microsoft.com/azure/application-gateway/configuration-infrastructure#size-of-the-subnet", - "service": "VM", + "guid": "8aed4fbf-0830-4883-899d-222a154af478", + "link": "https://learn.microsoft.com/en-us/azure/logic-apps/business-continuity-disaster-recovery-guidance?toc=%2Fazure%2Freliability%2Ftoc.json&bc=%2Fazure%2Freliability%2Fbreadcrumb%2Ftoc.json", + "service": "IoT Hub DPS", "services": [ - "VM", "WAF" ], - "severity": "Medium", - "text": "Swap VM sized with normalized and most recent sizes", - "training": "https://learn.microsoft.com/learn/paths/secure-application-delivery/", - "waf": "Cost" + "severity": "High", + "text": "Consider a Cross-Region DR strategy for critical workloads", + "waf": "Reliability" }, { - "arm-service": "Microsoft.Compute/virtualMachines", + "arm-service": "Microsoft.Devices/provisioningServices", "checklist": "WAF checklist", - "guid": "fc6998a5-35e3-4378-a7e3-1c67d68cf6a6", - "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/ag-overview", - "service": "VM", + "guid": "da0f033e-d180-4f36-9aa4-c468dba14203", + "link": "https://learn.microsoft.com/en-us/azure/app-service/environment/intro", + "service": "IoT Hub DPS", "services": [ - "Monitor", - "VM", - "WAF" + "WAF", + "AppSvc" ], - "severity": "Medium", - "text": "right-sizing VMs - start with monitoring usage below 5% and then work up to 40%", - "training": "https://learn.microsoft.com/learn/paths/secure-application-delivery/", - "waf": "Cost" + "severity": "High", + "text": "If deploying to an Isolated environment, use or migrate to App Service Environment (ASE) v3", + "waf": "Reliability" }, { - "arm-service": "Microsoft.Compute/virtualMachines", + "arm-service": "Microsoft.Devices/provisioningServices", "checklist": "WAF checklist", - "guid": "2a119495-6d69-47dc-9a2e-d27b2d186f1a", - "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/ag-overview", - "service": "VM", + "guid": "62711604-c9d1-4b0a-bdb7-5fda54a4f6c1", + "link": "https://learn.microsoft.com/en-us/training/modules/deploy-azure-functions/", + "service": "IoT Hub DPS", "services": [ - "VM", "WAF" ], "severity": "Medium", - "text": "Containerizing an application can improve VM density and save money on scaling it", - "training": "https://learn.microsoft.com/learn/paths/secure-networking-infrastructure/", - "waf": "Cost" + "text": "Leverage Azure DevOps or GitHub to streamline CI/CD and safeguard your Logic App code", + "waf": "Operations" }, { "category": "Operations management", @@ -35553,7 +39105,7 @@ ], "metadata": { "name": "Master checklist", - "timestamp": "August 08, 2024" + "timestamp": "August 12, 2024" }, "severities": [ { diff --git a/checklists/waf_checklist.en.json b/checklists/waf_checklist.en.json index acb339bc5..c52f1b082 100644 --- a/checklists/waf_checklist.en.json +++ b/checklists/waf_checklist.en.json @@ -1,5 +1,1759 @@ { "items": [ + { + "checklist": "Azure Landing Zone Review", + "guid": "70c15989-c726-42c7-b0d3-24b7375b9201", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/ready/landing-zone/design-area/multi-tenant/considerations-recommendations", + "service": "Entra", + "severity": "Medium", + "text": "Use one Entra tenant for managing your Azure resources, unless you have a clear regulatory or business requirement for multi-tenants.", + "training": "https://learn.microsoft.com/training/modules/deploy-resources-scopes-bicep/2-understand-deployment-scopes", + "waf": "Operations" + }, + { + "checklist": "Azure Landing Zone Review", + "guid": "6309957b-821a-43d1-b9d9-7fcf1802b747", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/ready/landing-zone/design-area/multi-tenant/automation", + "service": "Entra", + "severity": "Low", + "text": "Use Multi-Tenant Automation approach to managing your Microsoft Entra ID Tenants.", + "training": "https://learn.microsoft.com/entra/architecture/multi-tenant-user-management-introduction/", + "waf": "Operations" + }, + { + "checklist": "Azure Landing Zone Review", + "guid": "78e11934-499a-45ed-8ef7-aae5578f0ecf", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/ready/landing-zone/design-area/multi-tenant/lighthouse", + "service": "Entra", + "severity": "High", + "text": "Use Azure Lighthouse for Multi-Tenant Management with the same IDs.", + "training": "https://learn.microsoft.com/azure/lighthouse/concepts/cross-tenant-management-experience", + "waf": "Operations" + }, + { + "checklist": "Azure Landing Zone Review", + "guid": "5d82e6df-6f61-42f2-82e2-3132d293be3d", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/ready/landing-zone/design-area/azure-billing-microsoft-customer-agreement#design-recommendations", + "service": "Entra", + "severity": "High", + "text": "If you give a partner access to administer your tenant, use Azure Lighthouse.", + "training": "https://learn.microsoft.com/azure/lighthouse/how-to/onboard-customer", + "waf": "Cost" + }, + { + "checklist": "Azure Landing Zone Review", + "guid": "348ef254-c27d-442e-abba-c7571559ab91", + "link": "https://learn.microsoft.com/azure/role-based-access-control/overview", + "service": "Entra", + "severity": "High", + "text": "Enforce a RBAC model that aligns to your cloud operating model. Scope and Assign across Management Groups and Subscriptions.", + "training": "https://learn.microsoft.com/learn/paths/implement-resource-mgmt-security/", + "waf": "Security" + }, + { + "checklist": "Azure Landing Zone Review", + "guid": "12e7f983-f630-4472-8dd6-9c5b5c2622f5", + "link": "https://learn.microsoft.com/azure/active-directory/roles/security-planning#identify-microsoft-accounts-in-administrative-roles-that-need-to-be-switched-to-work-or-school-accounts", + "service": "Entra", + "severity": "High", + "text": "Only use the authentication type Work or school account for all account types. Avoid using the Microsoft account", + "training": "https://learn.microsoft.com/learn/modules/explore-basic-services-identity-types/", + "waf": "Security" + }, + { + "checklist": "Azure Landing Zone Review", + "guid": "4b69bad3-3aad-45e8-a68e-1d76667313b4", + "link": "https://learn.microsoft.com/azure/active-directory/fundamentals/active-directory-groups-create-azure-portal", + "service": "Entra", + "severity": "Medium", + "text": "Only use groups to assign permissions. Add on-premises groups to the Entra ID only group if a group management system is already in place.", + "training": "https://learn.microsoft.com/learn/paths/manage-identity-and-access/", + "waf": "Security" + }, + { + "checklist": "Azure Landing Zone Review", + "guid": "53e8908a-e28c-484c-93b6-b7808b9fe5c4", + "link": "https://learn.microsoft.com/azure/active-directory/conditional-access/overview", + "service": "Entra", + "severity": "High", + "text": "Enforce Microsoft Entra ID Conditional Access policies for any user with rights to Azure environments.", + "training": "https://learn.microsoft.com/learn/modules/plan-implement-administer-conditional-access/", + "waf": "Security" + }, + { + "checklist": "Azure Landing Zone Review", + "guid": "1049d403-a923-4c34-94d0-0018ac6a9e01", + "link": "https://learn.microsoft.com/azure/active-directory/authentication/concept-mfa-howitworks", + "service": "Entra", + "severity": "High", + "text": "Enforce multi-factor authentication for any user with rights to the Azure environments.", + "training": "https://learn.microsoft.com/learn/modules/secure-aad-users-with-mfa/", + "waf": "Security" + }, + { + "checklist": "Azure Landing Zone Review", + "guid": "14658d35-58fd-4772-99b8-21112df27ee4", + "link": "https://learn.microsoft.com/azure/active-directory/privileged-identity-management/pim-configure", + "service": "Entra", + "severity": "Medium", + "text": "Enforce Microsoft Entra ID Privileged Identity Management (PIM) to establish zero standing access and least privilege.", + "training": "https://learn.microsoft.com/learn/modules/azure-ad-privileged-identity-management/", + "waf": "Security" + }, + { + "checklist": "Azure Landing Zone Review", + "guid": "8b9fe5c4-1049-4d40-9a92-3c3474d00018", + "link": "https://learn.microsoft.com/entra/identity/domain-services/overview", + "service": "Entra", + "severity": "Medium", + "text": "If planning to switch from Active Directory Domain Services to Entra domain services, evaluate the compatibility of all workloads.", + "training": "https://learn.microsoft.com/learn/modules/implement-hybrid-identity-windows-server/", + "waf": "Security" + }, + { + "checklist": "Azure Landing Zone Review", + "guid": "1cf0b8da-70bd-44d0-94af-8d99cfc89ae1", + "link": "https://learn.microsoft.com/azure/active-directory/reports-monitoring/concept-activity-logs-azure-monitor", + "service": "Entra", + "severity": "Medium", + "text": "Integrate Microsoft Entra ID logs with the platform-central Azure Monitor. Azure Monitor allows for a single source of truth around log and monitoring data in Azure, giving organizations a cloud native options to meet requirements around log collection and retention.", + "training": "https://learn.microsoft.com/entra/identity/monitoring-health/howto-integrate-activity-logs-with-azure-monitor-logs", + "waf": "Security" + }, + { + "ammp": true, + "checklist": "Azure Landing Zone Review", + "guid": "984a859c-773e-47d2-9162-3a765a917e1f", + "link": "https://learn.microsoft.com/azure/active-directory/roles/security-emergency-access", + "service": "Entra", + "severity": "High", + "text": "Implement an emergency access or break-glass accounts to prevent tenant-wide account lockout.", + "training": "https://learn.microsoft.com/learn/modules/azure-ad-privileged-identity-management/", + "waf": "Security" + }, + { + "checklist": "Azure Landing Zone Review", + "guid": "35037e68-9349-4c15-b371-228514f4cdff", + "link": "https://learn.microsoft.com/azure/active-directory/roles/best-practices", + "service": "Entra", + "severity": "Medium", + "text": "Do not use on-premises synced accounts for Microsoft Entra ID role assignments, unless you have a scenario that specifically requires it.", + "training": "https://learn.microsoft.com/learn/modules/design-identity-security-strategy/", + "waf": "Security" + }, + { + "checklist": "Azure Landing Zone Review", + "guid": "d5d1e4e6-1465-48d3-958f-d77249b82111", + "link": "https://learn.microsoft.com/azure/active-directory/app-proxy/application-proxy", + "service": "Entra", + "severity": "Medium", + "text": "When using Microsoft Entra ID Application Proxy to give remote users access to applications, manage it as a Platform resource as you can only have one instance per tenant.", + "training": "https://learn.microsoft.com/learn/paths/implement-applications-external-access-azure-ad/", + "waf": "Security" + }, + { + "arm-service": "Microsoft.Network/virtualNetworks", + "checklist": "Azure Landing Zone Review", + "guid": "e8bbac75-7155-49ab-a153-e8908ae28c84", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/ready/enterprise-scale/network-topology-and-connectivity", + "service": "VNet", + "severity": "Medium", + "text": "Use a hub-and-spoke network topology for network scenarios that require maximum flexibility.", + "training": "https://learn.microsoft.com/learn/paths/architect-network-infrastructure/", + "waf": "Security" + }, + { + "arm-service": "Microsoft.Network/virtualNetworks", + "checklist": "Azure Landing Zone Review", + "guid": "7dd61623-a364-4a90-9eca-e48ebd54cd7d", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/ready/azure-best-practices/traditional-azure-networking-topology", + "service": "VNet", + "severity": "High", + "text": "Deploy shared networking services, including ExpressRoute gateways, VPN gateways, and Azure Firewall or partner NVAs in the central-hub virtual network. If necessary, also deploy DNS services.", + "training": "https://learn.microsoft.com/training/modules/hub-and-spoke-network-architecture/", + "waf": "Cost" + }, + { + "arm-service": "Microsoft.Network/virtualNetworks", + "checklist": "Azure Landing Zone Review", + "guid": "143b16c3-1d7a-4a9b-9470-4489a8042d88", + "link": "https://learn.microsoft.com/azure/ddos-protection/ddos-protection-overview", + "service": "VNet", + "severity": "High", + "text": "Use a DDoS Network or IP protection plan for all public IP addresses in application landing zones.", + "training": "https://learn.microsoft.com/learn/paths/secure-networking-infrastructure/", + "waf": "Security" + }, + { + "arm-service": "Microsoft.Compute/virtualMachines", + "checklist": "Azure Landing Zone Review", + "guid": "e2e8abac-3571-4559-ab91-53e89f89dc7b", + "link": "https://learn.microsoft.com/azure/architecture/reference-architectures/dmz/nva-ha", + "service": "NVA", + "severity": "Medium", + "text": "When deploying partner networking technologies or NVAs, follow the partner vendor's guidance.", + "waf": "Reliability" + }, + { + "arm-service": "microsoft.network/expressRouteCircuits", + "checklist": "Azure Landing Zone Review", + "guid": "ce463dbb-bc8a-4c2a-aebc-92a43da1dae2", + "link": "https://learn.microsoft.com/azure/expressroute/expressroute-howto-coexist-resource-manager#to-enable-transit-routing-between-expressroute-and-azure-vpn", + "service": "ExpressRoute", + "severity": "Low", + "text": "If you need transit between ExpressRoute and VPN gateways in hub and spoke scenarios, use Azure Route Server.", + "training": "https://learn.microsoft.com/training/modules/intro-to-azure-route-server/", + "waf": "Security" + }, + { + "arm-service": "Microsoft.Network/virtualHubs", + "checklist": "Azure Landing Zone Review", + "graph": "resources | where type=='microsoft.network/virtualnetworks' | project id,subnets=properties.subnets | mv-expand subnets | project id, subnetName = subnets.name, subnetPrefix = subnets.properties.addressPrefix | extend subnetPrefixLength = split(subnetPrefix, '/')[1] | where subnetName == 'RouteServerSubnet' | extend compliant = (subnetPrefixLength <= 27) | distinct id, compliant", + "guid": "91b9d7d5-91e1-4dcb-8f1f-fa7e465646cc", + "link": "https://learn.microsoft.com/azure/route-server/quickstart-configure-route-server-portal#create-a-route-server-1", + "service": "ARS", + "severity": "Low", + "text": "If using Route Server, use a /27 prefix for the Route Server subnet.", + "training": "https://learn.microsoft.com/training/modules/intro-to-azure-route-server/", + "waf": "Security" + }, + { + "arm-service": "Microsoft.Network/virtualNetworks", + "checklist": "Azure Landing Zone Review", + "guid": "cc881471-607c-41cc-a0e6-14658dd558f9", + "link": "https://learn.microsoft.com/azure/virtual-network/virtual-networks-faq#can-i-create-a-peering-connection-to-a-vnet-in-a-different-region", + "service": "VNet", + "severity": "Medium", + "text": "For network architectures with multiple hub-and-spoke topologies across Azure regions, use global virtual network peerings between the hub VNets to connect the regions to each other.", + "training": "https://learn.microsoft.com/learn/paths/azure-administrator-manage-virtual-networks/", + "waf": "Performance" + }, + { + "arm-service": "Microsoft.Network/virtualNetworks", + "checklist": "Azure Landing Zone Review", + "guid": "4722d929-c1b1-4cd6-81f5-4b29bade39ad", + "link": "https://learn.microsoft.com/azure/azure-monitor/insights/network-insights-overview", + "service": "VNet", + "severity": "Medium", + "text": "Use Azure Monitor for Networks to monitor the end-to-end state of the networks on Azure.", + "training": "https://learn.microsoft.com/learn/modules/design-implement-network-monitoring/", + "waf": "Operations" + }, + { + "arm-service": "Microsoft.Network/virtualNetworks", + "checklist": "Azure Landing Zone Review", + "graph": "resources | where type == 'microsoft.network/virtualnetworks' | mvexpand properties.virtualNetworkPeerings | summarize peeringcount = count() by id | extend compliant = (peeringcount < 450) | distinct id,compliant", + "guid": "0e7c28ec-9366-4572-83b0-f4664b1d944a", + "link": "https://learn.microsoft.com/azure/azure-resource-manager/management/azure-subscription-service-limits?toc=/azure/virtual-network/toc.json#azure-resource-manager-virtual-networking-limits", + "service": "VNet", + "severity": "Medium", + "text": "If you have more than 400 spoke networks in a region, deploy an additional hub to bypass VNet peering limits (500) and the maximum number of prefixes that can be advertised via ExpressRoute (1000).", + "training": "https://learn.microsoft.com/training/modules/hub-and-spoke-network-architecture/", + "waf": "Reliability" + }, + { + "arm-service": "Microsoft.Network/virtualNetworks", + "checklist": "Azure Landing Zone Review", + "graph": "resources | where type=='microsoft.network/routetables' | mvexpand properties.routes | summarize routeCount = count() by id | extend compliant = (routeCount < 360) | distinct id,compliant", + "guid": "3d457936-e9b7-41eb-bdff-314b26450b12", + "link": "https://learn.microsoft.com/azure/azure-resource-manager/management/azure-subscription-service-limits?toc=/azure/virtual-network/toc.json#azure-resource-manager-virtual-networking-limits", + "service": "VNet", + "severity": "Medium", + "text": "Limit the number of routes per route table to 400.", + "training": "https://learn.microsoft.com/training/modules/hub-and-spoke-network-architecture/", + "waf": "Reliability" + }, + { + "arm-service": "Microsoft.Network/virtualNetworks", + "checklist": "Azure Landing Zone Review", + "graph": "resources | where type == 'microsoft.network/virtualnetworks' | mvexpand properties.virtualNetworkPeerings | project id, peeringName=properties_virtualNetworkPeerings.name, compliant = (properties_virtualNetworkPeerings.properties.allowVirtualNetworkAccess == True)", + "guid": "c76cb5a2-abe2-11ed-afa1-0242ac120002", + "link": "https://learn.microsoft.com/azure/virtual-network/virtual-network-manage-peering", + "service": "VNet", + "severity": "High", + "text": "Use the setting 'Allow traffic to remote virtual network' when configuring VNet peerings.", + "training": "https://learn.microsoft.com/training/modules/hub-and-spoke-network-architecture/", + "waf": "Reliability" + }, + { + "arm-service": "microsoft.network/expressRouteCircuits", + "checklist": "Azure Landing Zone Review", + "guid": "de0d5973-cd4c-4d21-a088-137f5e6c4cfd", + "link": "https://learn.microsoft.com/azure/expressroute/expressroute-howto-macsec", + "service": "ExpressRoute", + "severity": "Medium", + "text": "When you're using ExpressRoute Direct, configure MACsec in order to encrypt traffic at the layer-two level between the organization's routers and MSEE. The diagram shows this encryption in flow.", + "training": "https://learn.microsoft.com/training/modules/design-implement-azure-expressroute/", + "waf": "Security" + }, + { + "arm-service": "microsoft.network/expressRouteCircuits", + "checklist": "Azure Landing Zone Review", + "guid": "ed301d6e-872e-452e-9611-cc58b5a4b151", + "link": "https://learn.microsoft.com/azure/vpn-gateway/site-to-site-vpn-private-peering", + "service": "ExpressRoute", + "severity": "Medium", + "text": "For scenarios where MACsec isn't an option (for example, not using ExpressRoute Direct), use a VPN gateway to establish IPsec tunnels over ExpressRoute private peering.", + "training": "https://learn.microsoft.com/learn/paths/implement-network-security/", + "waf": "Security" + }, + { + "arm-service": "microsoft.network/expressRouteCircuits", + "checklist": "Azure Landing Zone Review", + "guid": "558fd772-49b8-4211-82df-27ee412e7f98", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/ready/azure-best-practices/plan-for-ip-addressing", + "service": "ExpressRoute", + "severity": "High", + "text": "Ensure no overlapping IP address spaces across Azure regions and on-premises locations are used.", + "training": "https://learn.microsoft.com/learn/paths/architect-network-infrastructure/", + "waf": "Security" + }, + { + "arm-service": "Microsoft.Network/virtualNetworks", + "checklist": "Azure Landing Zone Review", + "graph": "resources | where type == 'microsoft.network/virtualnetworks' | extend addressSpace = todynamic(properties.addressSpace) | extend addressPrefix = todynamic(properties.addressSpace.addressPrefixes) | mvexpand addressSpace | mvexpand addressPrefix | project name, id, location, resourceGroup, subscriptionId, cidr = addressPrefix | extend compliant = (cidr matches regex @'^(10\\\\.|172\\\\.(1[6-9]|2[0-9]|3[01])\\\\.|192\\\\.168\\\\.)') | project id, compliant, cidr", + "guid": "3f630472-2dd6-49c5-a5c2-622f54b69bad", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/ready/azure-best-practices/plan-for-ip-addressing", + "service": "VNet", + "severity": "Medium", + "text": "Use IP addresses from the address allocation ranges for private internets (RFC 1918).", + "training": "https://learn.microsoft.com/learn/paths/architect-network-infrastructure/", + "waf": "Security" + }, + { + "arm-service": "Microsoft.Network/virtualNetworks", + "checklist": "Azure Landing Zone Review", + "graph": "resources | where type == 'microsoft.network/virtualnetworks' | extend addressSpace = todynamic(properties.addressSpace) | extend addressPrefix = todynamic(properties.addressSpace.addressPrefixes) | mvexpand addressSpace | mvexpand addressPrefix | extend addressMask = split(addressPrefix,'/')[1] | extend compliant = addressMask > 16 | project name, id, subscriptionId, resourceGroup, addressPrefix, compliant", + "guid": "33aad5e8-c68e-41d7-9667-313b4f5664b5", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/ready/azure-best-practices/plan-for-ip-addressing", + "service": "VNet", + "severity": "High", + "text": "Ensure that IP address space isn't wasted, don't create unnecessarily large virtual networks (for example /16).", + "training": "https://learn.microsoft.com/learn/paths/architect-network-infrastructure/", + "waf": "Performance" + }, + { + "arm-service": "Microsoft.Network/virtualNetworks", + "checklist": "Azure Landing Zone Review", + "guid": "f348ef25-4c27-4d42-b8bb-ac7571559ab9", + "link": "https://learn.microsoft.com/azure/site-recovery/concepts-on-premises-to-azure-networking#retain-ip-addresses", + "service": "VNet", + "severity": "High", + "text": "Do not use overlapping IP address ranges for production and disaster recovery sites.", + "training": "https://learn.microsoft.com/learn/paths/az-104-manage-virtual-networks/", + "waf": "Reliability" + }, + { + "arm-service": "Microsoft.Network/dnsZones", + "checklist": "Azure Landing Zone Review", + "guid": "153e8908-ae28-4c84-a33b-6b7808b9fe5c", + "link": "https://learn.microsoft.com/azure/dns/private-dns-getstarted-portal", + "service": "DNS", + "severity": "Medium", + "text": "For environments where name resolution in Azure is all that's required, use Azure Private DNS for resolution with a delegated zone for name resolution (such as 'azure.contoso.com').", + "training": "https://learn.microsoft.com/learn/paths/az-104-manage-virtual-networks/", + "waf": "Operations" + }, + { + "arm-service": "Microsoft.Network/dnsZones", + "checklist": "Azure Landing Zone Review", + "guid": "41049d40-3a92-43c3-974d-00018ac6a9e0", + "link": "https://learn.microsoft.com/azure/dns/dns-private-resolver-overview", + "service": "DNS", + "severity": "Medium", + "text": "For environments where name resolution across Azure and on-premises is required and there is no existing enterprise DNS service like Active Directory, use Azure DNS Private Resolver to route DNS requests to Azure or to on-premises DNS servers.", + "training": "https://learn.microsoft.com/training/modules/intro-to-azure-dns-private-resolver/", + "waf": "Security" + }, + { + "arm-service": "Microsoft.Network/dnsZones", + "checklist": "Azure Landing Zone Review", + "guid": "1e6a83de-5de3-42c1-a924-81607d5d1e4e", + "link": "https://learn.microsoft.com/azure/virtual-network/virtual-networks-name-resolution-for-vms-and-role-instances", + "service": "DNS", + "severity": "Low", + "text": "Special workloads that require and deploy their own DNS (such as Red Hat OpenShift) should use their preferred DNS solution.", + "training": "https://learn.microsoft.com/training/courses/az-700t00", + "waf": "Operations" + }, + { + "arm-service": "Microsoft.Network/dnsZones", + "checklist": "Azure Landing Zone Review", + "guid": "614658d3-558f-4d77-849b-821112df27ee", + "link": "https://learn.microsoft.com/azure/dns/private-dns-autoregistration", + "service": "DNS", + "severity": "High", + "text": "Enable auto-registration for Azure DNS to automatically manage the lifecycle of the DNS records for the virtual machines deployed within a virtual network.", + "training": "https://learn.microsoft.com/learn/paths/az-104-manage-virtual-networks/", + "waf": "Operations" + }, + { + "arm-service": "microsoft.network/bastionHosts", + "checklist": "Azure Landing Zone Review", + "guid": "ee1ac551-c4d5-46cf-b035-d0a3c50d87ad", + "link": "https://learn.microsoft.com/azure/bastion/bastion-overview", + "service": "Bastion", + "severity": "Medium", + "text": "Use Azure Bastion to securely connect to your network.", + "training": "https://learn.microsoft.com/training/modules/intro-to-azure-bastion/", + "waf": "Security" + }, + { + "arm-service": "microsoft.network/bastionHosts", + "checklist": "Azure Landing Zone Review", + "graph": "resources | where type=='microsoft.network/virtualnetworks' | project id,subnets=properties.subnets | mv-expand subnets | project id, subnetName = subnets.name, subnetPrefix = subnets.properties.addressPrefix | extend subnetPrefixLength = split(subnetPrefix, '/')[1] | where subnetName == 'AzureBastionSubnet' | extend compliant = (subnetPrefixLength <= 26) | distinct id, compliant", + "guid": "6eab9eb6-762b-485e-8ea8-15aa5dba0bd0", + "link": "https://learn.microsoft.com/azure/bastion/bastion-faq#subnet", + "service": "Bastion", + "severity": "Medium", + "text": "Use Azure Bastion in a subnet /26 or larger.", + "training": "https://learn.microsoft.com/training/modules/intro-to-azure-bastion/", + "waf": "Security" + }, + { + "arm-service": "microsoft.network/frontdoorwebApplicationFirewalls", + "checklist": "Azure Landing Zone Review", + "guid": "1d7aa9b6-4704-4489-a804-2d88e79d17b7", + "link": "https://learn.microsoft.com/azure/web-application-firewall/afds/afds-overview", + "service": "WAF", + "severity": "Medium", + "text": "Use Azure Front Door and WAF policies to provide global protection across Azure regions for inbound HTTP/S connections to a landing zone.", + "training": "https://learn.microsoft.com/learn/paths/secure-application-delivery/", + "waf": "Security" + }, + { + "arm-service": "microsoft.network/frontdoorwebApplicationFirewalls", + "checklist": "Azure Landing Zone Review", + "guid": "3b22a5a6-7e7a-48ed-9b30-e38c3f29812b", + "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/ag-overview", + "service": "WAF", + "severity": "Low", + "text": "When using Azure Front Door and Azure Application Gateway to help protect HTTP/S apps, use WAF policies in Azure Front Door. Lock down Azure Application Gateway to receive traffic only from Azure Front Door.", + "training": "https://learn.microsoft.com/learn/paths/secure-application-delivery/", + "waf": "Security" + }, + { + "arm-service": "microsoft.network/frontdoorwebApplicationFirewalls", + "checklist": "Azure Landing Zone Review", + "guid": "2363cefe-179b-4599-be0d-5973cd4cd21b", + "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/ag-overview", + "service": "WAF", + "severity": "High", + "text": "When WAFs and other reverse proxies are required for inbound HTTP/S connections, deploy them within a landing-zone virtual network and together with the apps that they're protecting and exposing to the internet.", + "training": "https://learn.microsoft.com/learn/paths/architect-network-infrastructure/", + "waf": "Security" + }, + { + "arm-service": "Microsoft.Network/virtualNetworks", + "checklist": "Azure Landing Zone Review", + "guid": "088137f5-e6c4-4cfd-9e50-4547c2447ec6", + "link": "https://learn.microsoft.com/azure/ddos-protection/ddos-protection-reference-architectures", + "service": "VNet", + "severity": "High", + "text": "Use Azure DDoS Network or IP Protection plans to help protect Public IP Addresses endpoints within the virtual networks.", + "training": "https://learn.microsoft.com/learn/paths/secure-networking-infrastructure/", + "waf": "Security" + }, + { + "arm-service": "Microsoft.Network/virtualNetworks", + "checklist": "Azure Landing Zone Review", + "guid": "b034c01e-110b-463a-b36e-e3346e57f225", + "link": "https://learn.microsoft.com/azure/virtual-network/ip-services/default-outbound-access", + "service": "VNet", + "severity": "High", + "text": "Plan for how to manage your network outbound traffic configuration and strategy before the upcoming breaking change. On September 30, 2025, default outbound access for new deployments will be retired and only explicit access configurations will be allowed.", + "training": "https://learn.microsoft.com/training/modules/configure-virtual-networks/", + "waf": "Reliability" + }, + { + "arm-service": "Microsoft.Network/virtualNetworks", + "checklist": "Azure Landing Zone Review", + "guid": "b1c82a3f-2320-4dfa-8972-7ae4823c8930", + "link": "https://learn.microsoft.com/azure/ddos-protection/ddos-protection-reference-architectures", + "service": "VNet", + "severity": "High", + "text": "Add diagnostic settings to save DDoS related logs for all the protected public IP addresses (DDoS IP or Network Protection).", + "training": "https://learn.microsoft.com/learn/paths/secure-networking-infrastructure/", + "waf": "Security" + }, + { + "arm-service": "Microsoft.Authorization/policyDefinitions", + "checklist": "Azure Landing Zone Review", + "guid": "3c5a808d-c695-4c14-a63c-c7ab7a510e41", + "link": "https://github.com/Azure/Enterprise-Scale/wiki/ALZ-Policies#corp", + "service": "Policy", + "severity": "High", + "text": "Ensure there is a policy assignment to deny Public IP addresses directly tied to Virtual Machines. Use exclusions if public IPs are needed on specific VMs.", + "training": "https://learn.microsoft.com/training/modules/configure-azure-policy/", + "waf": "Security" + }, + { + "arm-service": "microsoft.network/expressRouteCircuits", + "checklist": "Azure Landing Zone Review", + "guid": "359c373e-7dd6-4162-9a36-4a907ecae48e", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/ready/azure-best-practices/connectivity-to-azure", + "service": "ExpressRoute", + "severity": "Medium", + "text": "Use ExpressRoute as the primary connection to Azure. Use VPNs as a source of backup connectivity.", + "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", + "waf": "Performance" + }, + { + "arm-service": "microsoft.network/expressRouteCircuits", + "checklist": "Azure Landing Zone Review", + "description": "You can use AS-path prepending and connection weights to influence traffic from Azure to on-premises, and the full range of BGP attributes in your own routers to influence traffic from on-premises to Azure.", + "guid": "f29812b2-363c-4efe-879b-599de0d5973c", + "link": "https://learn.microsoft.com/azure/expressroute/expressroute-routing", + "service": "ExpressRoute", + "severity": "Medium", + "text": "When you use multiple ExpressRoute circuits or multiple on-prem locations, use BGP attributes to optimize routing.", + "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", + "waf": "Reliability" + }, + { + "arm-service": "microsoft.network/expressRouteCircuits", + "checklist": "Azure Landing Zone Review", + "graph": "resources| where type == 'microsoft.network/virtualnetworkgateways'| where properties.gatewayType =~ 'vpn' or properties.gatewayType == 'ExpressRoute'| extend SKUName = properties.sku.name, SKUTier = properties.sku.tier, Type = properties.gatewayType| extend compliant = SKUTier !in ('Basic', 'Standard')| project name, id, subscriptionId, resourceGroup, compliant", + "guid": "d4cd21b0-8813-47f5-b6c4-cfd3e504547c", + "link": "https://learn.microsoft.com/azure/expressroute/expressroute-about-virtual-network-gateways?source=recommendations#gwsku", + "service": "ExpressRoute", + "severity": "Medium", + "text": "Select the right SKU for the ExpressRoute/VPN gateways based on bandwidth and performance requirements.", + "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", + "waf": "Performance" + }, + { + "arm-service": "microsoft.network/expressRouteCircuits", + "checklist": "Azure Landing Zone Review", + "graph": "resources | where type=='microsoft.network/expressroutecircuits' | extend compliant = (tolower(sku.family) == 'metereddata' or tolower(sku.tier) == 'local') | distinct id,compliant", + "guid": "7025b442-f6e9-4af6-b11f-c9574916016f", + "link": "https://learn.microsoft.com/azure/expressroute/plan-manage-cost", + "service": "ExpressRoute", + "severity": "High", + "text": "Ensure that you're using unlimited-data ExpressRoute circuits only if you reach the bandwidth that justifies their cost.", + "training": "https://learn.microsoft.com/training/modules/design-implement-azure-expressroute/", + "waf": "Cost" + }, + { + "arm-service": "microsoft.network/expressRouteCircuits", + "checklist": "Azure Landing Zone Review", + "graph": "resources | where type=='microsoft.network/connections' | where properties.connectionType == 'ExpressRoute' | project id, gwid=tostring(properties.virtualNetworkGateway1.id), circuitid=tostring(properties.peer.id) | join (resources | where type=='microsoft.network/expressroutecircuits' | project circuitid=tostring(id), circuitsku=sku.tier) on circuitid | project id=gwid, compliant = (circuitsku == 'Local') | summarize compliant=max(compliant) by id", + "guid": "f4e7926a-ec35-476e-a412-5dd17136bd62", + "link": "https://learn.microsoft.com/azure/expressroute/expressroute-faqs#expressroute-local", + "service": "ExpressRoute", + "severity": "High", + "text": "Leverage the Local SKU of ExpressRoute to reduce the cost of your circuits, if your circuit peering location supports your Azure regions for the Local SKU.", + "training": "https://learn.microsoft.com/training/modules/design-implement-azure-expressroute/", + "waf": "Cost" + }, + { + "arm-service": "microsoft.network/expressRouteCircuits", + "checklist": "Azure Landing Zone Review", + "graph": "resources| where type == 'microsoft.network/virtualnetworkgateways'| where properties.gatewayType =~ 'vpn' or properties.gatewayType == 'ExpressRoute'| extend SKUName = properties.sku.name, SKUTier = properties.sku.tier, Type = properties.gatewayType| extend compliant = SKUTier contains 'AZ'| project name, id, subscriptionId, resourceGroup, Type, compliant", + "guid": "2447ec66-138a-4720-8f1c-e16ed301d6e8", + "link": "https://learn.microsoft.com/azure/expressroute/expressroute-about-virtual-network-gateways", + "service": "ExpressRoute", + "severity": "Medium", + "text": "Deploy a zone-redundant ExpressRoute gateway in the supported Azure regions.", + "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", + "waf": "Reliability" + }, + { + "arm-service": "microsoft.network/expressRouteCircuits", + "checklist": "Azure Landing Zone Review", + "guid": "72e52e36-11cc-458b-9a4b-1511e43a58a9", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/ready/azure-best-practices/connectivity-to-azure", + "service": "ExpressRoute", + "severity": "Medium", + "text": "For scenarios that require bandwidth higher than 10 Gbps or dedicated 10/100-Gbps ports, use ExpressRoute Direct.", + "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", + "waf": "Performance" + }, + { + "arm-service": "microsoft.network/expressRouteCircuits", + "checklist": "Azure Landing Zone Review", + "guid": "c2299c4d-7b57-4d0c-9555-62f2b3e4563a", + "link": "https://learn.microsoft.com/azure/expressroute/about-fastpath", + "service": "ExpressRoute", + "severity": "Medium", + "text": "When low latency is required, or throughput from on-premises to Azure must be greater than 10 Gbps, enable FastPath to bypass the ExpressRoute gateway from the data path.", + "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", + "waf": "Performance" + }, + { + "arm-service": "microsoft.network/virtualNetworkGateways", + "checklist": "Azure Landing Zone Review", + "graph": "resources | where type=='microsoft.network/virtualnetworkgateways' | where properties.gatewayType == 'Vpn' | extend compliant = (tolower(properties.sku.name) contains 'az') | distinct id, compliant", + "guid": "4d873974-8b66-42d6-b15f-512a65498f6d", + "link": "https://learn.microsoft.com/azure/vpn-gateway/create-zone-redundant-vnet-gateway", + "service": "VPN", + "severity": "Medium", + "text": "Use zone-redundant VPN gateways to connect branches or remote locations to Azure (where available).", + "training": "https://learn.microsoft.com/training/modules/intro-to-azure-vpn-gateway/", + "waf": "Reliability" + }, + { + "arm-service": "microsoft.network/virtualNetworkGateways", + "checklist": "Azure Landing Zone Review", + "guid": "45866df8-cf85-4ca9-bbe2-65ec1478919e", + "link": "https://learn.microsoft.com/azure/vpn-gateway/vpn-gateway-highlyavailable", + "service": "VPN", + "severity": "Medium", + "text": "Use redundant VPN appliances on-premises (active/active or active/passive).", + "training": "https://learn.microsoft.com/training/modules/intro-to-azure-vpn-gateway/", + "waf": "Reliability" + }, + { + "arm-service": "microsoft.network/expressRouteCircuits", + "checklist": "Azure Landing Zone Review", + "guid": "718cb437-b060-2589-8856-2e93a5c6633b", + "link": "https://learn.microsoft.com/azure/expressroute/expressroute-erdirect-about", + "service": "ExpressRoute", + "severity": "High", + "text": "If using ExpressRoute Direct, consider using ExpressRoute Local circuits to the local Azure regions to save costs.", + "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", + "waf": "Cost" + }, + { + "arm-service": "microsoft.network/expressRouteCircuits", + "checklist": "Azure Landing Zone Review", + "guid": "8042d88e-79d1-47b7-9b22-a5a67e7a8ed4", + "link": "https://learn.microsoft.com/azure/architecture/framework/services/networking/expressroute/reliability", + "service": "ExpressRoute", + "severity": "Medium", + "text": "When traffic isolation or dedicated bandwidth is required, such as for separating production and nonproduction environments, use different ExpressRoute circuits. It will help you ensure isolated routing domains and alleviate noisy-neighbor risks.", + "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", + "waf": "Security" + }, + { + "arm-service": "microsoft.network/expressRouteCircuits", + "checklist": "Azure Landing Zone Review", + "guid": "b30e38c3-f298-412b-8363-cefe179b599d", + "link": "https://learn.microsoft.com/azure/expressroute/expressroute-monitoring-metrics-alerts", + "service": "ExpressRoute", + "severity": "Medium", + "text": "Monitor ExpressRoute availability and utilization using built-in Express Route Insights.", + "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", + "waf": "Operations" + }, + { + "arm-service": "microsoft.network/expressRouteCircuits", + "checklist": "Azure Landing Zone Review", + "guid": "5bf68dc9-325e-4873-bf88-f8214ef2e5d2", + "link": "https://learn.microsoft.com/azure/expressroute/how-to-configure-connection-monitor", + "service": "ExpressRoute", + "severity": "Medium", + "text": "Use Connection Monitor for connectivity monitoring across the network, especially between on-premises and Azure.", + "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", + "waf": "Operations" + }, + { + "arm-service": "microsoft.network/expressRouteCircuits", + "checklist": "Azure Landing Zone Review", + "graph": "resources | where type=='microsoft.network/connections' | where properties.connectionType == 'ExpressRoute' | project cxId=id, gwId=tostring(properties.virtualNetworkGateway1.id), circuitId=tostring(properties.peer.id) | join (resources | where type=='microsoft.network/expressroutecircuits' | project circuitId=tostring(id), circuitLocation=tostring(properties.serviceProviderProperties.peeringLocation)) on circuitId | distinct gwId, circuitLocation | summarize countErLocations=count() by id=gwId | extend compliant = (countErLocations >= 2)", + "guid": "e0d5973c-d4cd-421b-8881-37f5e6c4cfd3", + "link": "https://learn.microsoft.com/azure/expressroute/designing-for-disaster-recovery-with-expressroute-privatepeering#need-for-redundant-connectivity-solution", + "service": "ExpressRoute", + "severity": "Medium", + "text": "Use ExpressRoute circuits from different peering locations for redundancy.", + "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", + "waf": "Reliability" + }, + { + "arm-service": "microsoft.network/expressRouteCircuits", + "checklist": "Azure Landing Zone Review", + "guid": "cf3fe65c-fec0-495a-8edc-9675200f2add", + "link": "https://learn.microsoft.com/azure/expressroute/expressroute-howto-coexist-resource-manager", + "service": "ExpressRoute", + "severity": "Medium", + "text": "Use site-to-site VPN as failover of ExpressRoute, if only using a single ExpressRoute circuit.", + "training": "https://learn.microsoft.com/training/modules/design-implement-azure-expressroute/", + "waf": "Reliability" + }, + { + "arm-service": "microsoft.network/expressRouteCircuits", + "checklist": "Azure Landing Zone Review", + "graph": "resources | where type=='microsoft.network/virtualnetworks' | project id,resourceGroup,name,subnets=properties.subnets | mv-expand subnets | project id,resourceGroup,name,subnetName=tostring(subnets.name),routeTableId=tostring(subnets.properties.routeTable.id) | where subnetName == 'GatewaySubnet' | join kind=leftouter (Resources | where type == 'microsoft.network/routetables' | project routeTableName=name,routeTableId=id, disableBgpRoutePropagation=properties.disableBgpRoutePropagation) on routeTableId | project id,compliant = (disableBgpRoutePropagation == False or isnull(disableBgpRoutePropagation))", + "guid": "72105cc8-aaea-4ee1-8c7a-ad25977afcaf", + "link": "https://learn.microsoft.com/azure/vpn-gateway/vpn-gateway-about-vpn-gateway-settings#gwsub", + "service": "ExpressRoute", + "severity": "High", + "text": "If you are using a route table in the GatewaySubnet, make sure that gateway routes are propagated.", + "waf": "Reliability" + }, + { + "arm-service": "microsoft.network/expressRouteCircuits", + "checklist": "Azure Landing Zone Review", + "guid": "d581a947-69a2-4783-942e-9df3664324c8", + "link": "https://learn.microsoft.com/azure/expressroute/designing-for-high-availability-with-expressroute#active-active-connections", + "service": "ExpressRoute", + "severity": "High", + "text": "If using ExpressRoute, your on-premises routing should be dynamic: in the event of a connection failure it should converge to the remaining connection of the circuit. Load should be shared across both connections ideally as active/active, although active/passive is supported too.", + "training": "https://learn.microsoft.com/training/modules/design-implement-azure-expressroute/", + "waf": "Reliability" + }, + { + "arm-service": "microsoft.network/expressRouteCircuits", + "checklist": "Azure Landing Zone Review", + "guid": "b258f058-b9f6-46cd-b28d-990106f0c3f8", + "link": "https://learn.microsoft.com/azure/expressroute/designing-for-high-availability-with-expressroute", + "service": "ExpressRoute", + "severity": "Medium", + "text": "Ensure the two physical links of your ExpressRoute circuit are connected to two distinct edge devices in your network.", + "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", + "waf": "Reliability" + }, + { + "arm-service": "microsoft.network/expressRouteCircuits", + "checklist": "Azure Landing Zone Review", + "guid": "fe2a1b53-6fbd-4c67-b58a-85d7c7a0afcb", + "link": "https://learn.microsoft.com/azure/expressroute/expressroute-bfd", + "service": "ExpressRoute", + "severity": "Medium", + "text": "Ensure Bidirectional Forwarding Detection (BFD) is enabled and configured on customer or provider edge routing devices.", + "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", + "waf": "Reliability" + }, + { + "arm-service": "microsoft.network/expressRouteCircuits", + "checklist": "Azure Landing Zone Review", + "guid": "669b215a-ce43-4371-8f6f-11047f6490f1", + "link": "https://learn.microsoft.com/azure/expressroute/designing-for-disaster-recovery-with-expressroute-privatepeering", + "service": "ExpressRoute", + "severity": "High", + "text": "Connect the ExpressRoute Gateway to two or more circuits from different peering locations for higher resiliency.", + "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", + "waf": "Reliability" + }, + { + "arm-service": "microsoft.network/expressRouteCircuits", + "checklist": "Azure Landing Zone Review", + "guid": "3f79ed00-203b-4c95-9efd-691505f5a1f9", + "link": "https://learn.microsoft.com/azure/vpn-gateway/vpn-gateway-howto-setup-alerts-virtual-network-gateway-log", + "service": "ExpressRoute", + "severity": "Medium", + "text": "Configure diagnostic logs and alerts for ExpressRoute virtual network gateway.", + "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", + "waf": "Operations" + }, + { + "arm-service": "microsoft.network/expressRouteCircuits", + "checklist": "Azure Landing Zone Review", + "guid": "5234c93f-b651-41dd-80c1-234177b91ced", + "link": "https://learn.microsoft.com/azure/expressroute/virtual-network-connectivity-guidance", + "service": "ExpressRoute", + "severity": "Medium", + "text": "Do not use ExpressRoute circuits for VNet-to-VNet communication.", + "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", + "waf": "Performance" + }, + { + "checklist": "Azure Landing Zone Review", + "guid": "8ac6a9e0-1e6a-483d-b5de-32c199248160", + "link": "https://learn.microsoft.com/azure/virtual-wan/virtual-wan-about", + "service": "N/A", + "severity": "Low", + "text": "Do not send Azure traffic to hybrid locations for inspection. Instead, follow the principle 'traffic in Azure stays in Azure' so that communication across resources in Azure occurs via the Microsoft backbone network.", + "waf": "Performance" + }, + { + "arm-service": "Microsoft.Network/azureFirewalls", + "checklist": "Azure Landing Zone Review", + "guid": "e6c4cfd3-e504-4547-a244-7ec66138a720", + "link": "https://learn.microsoft.com/azure/firewall/overview", + "service": "Firewall", + "severity": "High", + "text": "Use Azure Firewall to govern Azure outbound traffic to the internet, non-HTTP/S inbound connections, and East/West traffic filtering (if the organization requires it).", + "training": "https://learn.microsoft.com/learn/paths/secure-networking-infrastructure/", + "waf": "Security" + }, + { + "arm-service": "Microsoft.Network/azureFirewalls", + "checklist": "Azure Landing Zone Review", + "guid": "5a4b1511-e43a-458a-ac22-99c4d7b57d0c", + "link": "https://learn.microsoft.com/azure/firewall-manager/policy-overview", + "service": "Firewall", + "severity": "Medium", + "text": "Create a global Azure Firewall policy to govern security posture across the global network environment and assign it to all Azure Firewall instances. Allow for granular policies to meet requirements of specific regions by delegating incremental firewall policies to local security teams via Azure role-based access control.", + "training": "https://learn.microsoft.com/learn/paths/secure-networking-infrastructure/", + "waf": "Security" + }, + { + "arm-service": "Microsoft.Network/azureFirewalls", + "checklist": "Azure Landing Zone Review", + "guid": "655562f2-b3e4-4563-a4d8-739748b662d6", + "link": "https://learn.microsoft.com/azure/firewall-manager/deploy-trusted-security-partner", + "service": "Firewall", + "severity": "Low", + "text": "Configure supported partner SaaS security providers within Firewall Manager if the organization wants to use such solutions to help protect outbound connections.", + "training": "https://learn.microsoft.com/learn/paths/secure-networking-infrastructure/", + "waf": "Security" + }, + { + "arm-service": "Microsoft.Network/azureFirewalls", + "checklist": "Azure Landing Zone Review", + "graph": "resources | where type=='microsoft.network/firewallpolicies' | extend compliant = (properties.dnsSettings.enableProxy == true) | distinct id,compliant", + "guid": "14d99880-2f88-47e8-a134-62a7d85c94af", + "link": "https://learn.microsoft.com/azure/firewall/fqdn-filtering-network-rules", + "service": "Firewall", + "severity": "High", + "text": "Use application rules to filter outbound traffic on destination host name for supported protocols. Use FQDN-based network rules and Azure Firewall with DNS proxy to filter egress traffic to the Internet over other protocols.", + "training": "https://learn.microsoft.com/learn/paths/secure-networking-infrastructure/", + "waf": "Security" + }, + { + "arm-service": "Microsoft.Network/azureFirewalls", + "checklist": "Azure Landing Zone Review", + "graph": "resources | where type=='microsoft.network/firewallpolicies' | extend compliant = (properties.sku.tier == 'Premium') | distinct id,compliant", + "guid": "c10d51ef-f999-455d-bba0-5c90ece07447", + "link": "https://learn.microsoft.com/azure/firewall/premium-features", + "service": "Firewall", + "severity": "High", + "text": "Use Azure Firewall Premium to enable additional security features.", + "training": "https://learn.microsoft.com/training/modules/introduction-azure-firewall/", + "waf": "Security" + }, + { + "arm-service": "Microsoft.Network/azureFirewalls", + "checklist": "Azure Landing Zone Review", + "graph": "resources | where type=='microsoft.network/firewallpolicies' | extend compliant = (properties.threatIntelMode == 'Deny') | distinct id,compliant", + "guid": "e9c8f584-6d5e-473b-8dc5-acc9fbaab4e3", + "link": "https://learn.microsoft.com/azure/firewall/premium-features#idps-signature-rules", + "service": "Firewall", + "severity": "High", + "text": "Configure Azure Firewall Threat Intelligence mode to Alert and Deny for additional protection.", + "waf": "Security" + }, + { + "arm-service": "Microsoft.Network/azureFirewalls", + "checklist": "Azure Landing Zone Review", + "graph": "resources | where type=='microsoft.network/firewallpolicies' | extend compliant = (properties.intrusionDetection.mode == 'Deny') | project id, compliant", + "guid": "b9d0dff5-bdd4-4cd8-88ed-5811610b2b2c", + "link": "https://learn.microsoft.com/azure/firewall/premium-features#idps", + "service": "Firewall", + "severity": "High", + "text": "Configure Azure Firewall IDPS mode to Deny for additional protection.", + "training": "https://learn.microsoft.com/training/modules/introduction-azure-firewall/", + "waf": "Security" + }, + { + "arm-service": "Microsoft.Network/azureFirewalls", + "checklist": "Azure Landing Zone Review", + "graph": "resources | where type=='microsoft.network/virtualnetworks' | project id,resourceGroup,name,subnets=properties.subnets | mv-expand subnets | project id,name,subnetId=tostring(subnets.id), subnetName=tostring(subnets.name),subnetRT=subnets.properties.routeTable.id | where not (subnetName in ('GatewaySubnet', 'AzureFirewallSubnet', 'RouteServerSubnet', 'AzureBastionSubnet')) | extend hasRT = isnotnull(subnetRT) | distinct id, hasRT, subnetId | join kind=fullouter (resources | where type == 'microsoft.network/virtualnetworks' | mvexpand properties.virtualNetworkPeerings | extend isVWAN=(tolower(split(properties_virtualNetworkPeerings.name, '_')[0]) == 'remotevnettohubpeering') | mv-expand properties.subnets | project id, isVWAN, name, subnetId=tostring(properties_subnets.id), subnetName=tostring(properties_subnets.name) | summarize PeeredToVWAN=max(isVWAN) by id, subnetId | project id, subnetId, isVWANpeer = (PeeredToVWAN == true)) on subnetId | project id=iff(isnotempty(id), id, id1), subnetId=iff(isnotempty(subnetId), subnetId, subnetId1), hasRT, isVWANpeer | extend compliant = (hasRT==true or isVWANpeer==true) | distinct id, subnetId, compliant", + "guid": "a3784907-9836-4271-aafc-93535f8ec08b", + "link": "https://learn.microsoft.com/azure/virtual-network/virtual-networks-udr-overview", + "service": "Firewall", + "severity": "High", + "text": "For subnets in VNets not connected to Virtual WAN, attach a route table so that Internet traffic is redirected to Azure Firewall or a Network Virtual Appliance.", + "waf": "Security" + }, + { + "arm-service": "Microsoft.Network/azureFirewalls", + "checklist": "Azure Landing Zone Review", + "guid": "715d833d-4708-4527-90ac-1b142c7045ba", + "link": "https://learn.microsoft.com/azure/firewall/firewall-structured-logs", + "service": "Firewall", + "severity": "Medium", + "text": "Add diagnostic settings to save logs, using the Resource Specific destination table, for all Azure Firewall deployments.", + "training": "https://learn.microsoft.com/learn/paths/secure-networking-infrastructure/", + "waf": "Operations" + }, + { + "arm-service": "Microsoft.Network/azureFirewalls", + "checklist": "Azure Landing Zone Review", + "guid": "e960fc6b-4ab2-4db6-9609-3745135f9ffa", + "link": "https://learn.microsoft.com/azure/firewall-manager/migrate-to-policy", + "service": "Firewall", + "severity": "Important", + "text": "Migrate from Azure Firewall Classic rules (if exist) to Firewall Policy.", + "training": "https://learn.microsoft.com/learn/paths/secure-networking-infrastructure/", + "waf": "Operations" + }, + { + "arm-service": "Microsoft.Network/azureFirewalls", + "checklist": "Azure Landing Zone Review", + "graph": "resources | where type=='microsoft.network/virtualnetworks' | project id,subnets=properties.subnets | mv-expand subnets | project id, subnetName = subnets.name, subnetPrefix = subnets.properties.addressPrefix | extend subnetPrefixLength = split(subnetPrefix, '/')[1] | where subnetName == 'AzureFirewallSubnet' | extend compliant = (subnetPrefixLength == 26) | distinct id, compliant", + "guid": "22d6419e-b627-4d95-9e7d-019fa759387f", + "link": "https://learn.microsoft.com/azure/firewall/firewall-faq#why-does-azure-firewall-need-a--26-subnet-size", + "service": "Firewall", + "severity": "High", + "text": "Use a /26 prefix for your Azure Firewall subnets.", + "training": "https://learn.microsoft.com/training/modules/introduction-azure-firewall/", + "waf": "Security" + }, + { + "arm-service": "Microsoft.Network/azureFirewalls", + "checklist": "Azure Landing Zone Review", + "guid": "828cec2e-af6c-40c2-8fa2-1b681ee63eb7", + "link": "https://learn.microsoft.com/azure/firewall-manager/rule-hierarchy", + "service": "Firewall", + "severity": "Medium", + "text": "Arrange rules within the firewall policy into Rule Collection Groups and Rule Collections and based on their frequency of use.", + "training": "https://learn.microsoft.com/training/modules/intro-to-azure-firewall-manager/", + "waf": "Performance" + }, + { + "arm-service": "Microsoft.Network/azureFirewalls", + "checklist": "Azure Landing Zone Review", + "guid": "0da83bb1-2f39-49af-b5c9-835fc455e3d1", + "link": "https://learn.microsoft.com/azure/firewall/ip-groups", + "service": "Firewall", + "severity": "Medium", + "text": "Use IP Groups or IP prefixes to reduce number of IP table rules.", + "waf": "Performance" + }, + { + "arm-service": "Microsoft.Network/azureFirewalls", + "checklist": "Azure Landing Zone Review", + "guid": "c44c6f0e-1642-4a61-a17b-0922f835c93a", + "link": "https://learn.microsoft.com/azure/firewall/tutorial-firewall-dnat", + "service": "Firewall", + "severity": "Medium", + "text": "Do not use wildcards as a source IP for DNATS, such as * or any, you should specify source IPs for incoming DNATs.", + "training": "https://learn.microsoft.com/training/modules/introduction-to-azure-virtual-networks/", + "waf": "Performance" + }, + { + "arm-service": "Microsoft.Network/azureFirewalls", + "checklist": "Azure Landing Zone Review", + "guid": "7371dc21-251a-47a3-af14-6e01b9da4757", + "link": "https://learn.microsoft.com/azure/firewall/integrate-with-nat-gateway", + "service": "Firewall", + "severity": "Medium", + "text": "Prevent SNAT Port exhaustion by monitoring SNAT port usage, evaluating NAT Gateway settings, and ensuring seamless failover. If the port count approaches the limit, it’s a sign that SNAT exhaustion might be imminent.", + "training": "https://learn.microsoft.com/training/modules/introduction-to-azure-virtual-networks/", + "waf": "Performance" + }, + { + "arm-service": "Microsoft.Network/azureFirewalls", + "checklist": "Azure Landing Zone Review", + "guid": "346840b8-1064-496e-8396-4b1340172d52", + "link": "https://learn.microsoft.com/azure/firewall/premium-features#tls-inspection", + "service": "Firewall", + "severity": "High", + "text": "If you are using Azure Firewall Premium, enable TLS Inspection.", + "waf": "Performance" + }, + { + "arm-service": "Microsoft.Network/azureFirewalls", + "checklist": "Azure Landing Zone Review", + "guid": "39990a13-915c-45f9-a2d3-562d7d6c4b7c", + "link": "https://learn.microsoft.com/azure/firewall/premium-features#web-categories", + "service": "Firewall", + "severity": "Low", + "text": "Use web categories to allow or deny outbound access to specific topics.", + "waf": "Performance" + }, + { + "arm-service": "Microsoft.Network/azureFirewalls", + "checklist": "Azure Landing Zone Review", + "guid": "6eff7e6c-6c4a-43d7-be3f-6641c2cb3d4a", + "link": "https://learn.microsoft.com/azure/architecture/example-scenario/gateway/application-gateway-before-azure-firewall", + "service": "Firewall", + "severity": "Medium", + "text": "As part of your TLS inspection, plan for receiving traffic from Azure App Gateways for inspection.", + "training": "https://learn.microsoft.com/training/modules/configure-azure-application-gateway/", + "waf": "Performance" + }, + { + "arm-service": "Microsoft.Network/azureFirewalls", + "checklist": "Azure Landing Zone Review", + "guid": "94f3eede-9aa3-4088-92a3-bb9a56509fad", + "link": "https://learn.microsoft.com/azure/firewall/dns-details", + "service": "Firewall", + "severity": "Medium", + "text": "Enable Azure Firewall DNS proxy configuration.", + "training": "https://learn.microsoft.com/training/courses/az-700t00/", + "waf": "Security" + }, + { + "arm-service": "Microsoft.Network/azureFirewalls", + "checklist": "Azure Landing Zone Review", + "guid": "1dc04554-dece-4ffb-a49e-5c683e09f8da", + "link": "https://learn.microsoft.com/azure/firewall/firewall-diagnostics", + "service": "Firewall", + "severity": "High", + "text": "Integrate Azure Firewall with Azure Monitor and enable diagnostic logging to store and analyze firewall logs.", + "training": "https://learn.microsoft.com/training/courses/az-700t00/", + "waf": "Operations" + }, + { + "arm-service": "Microsoft.Network/azureFirewalls", + "checklist": "Azure Landing Zone Review", + "guid": "64e7000e-3c06-485e-b455-ced7f454cba3", + "link": "https://learn.microsoft.com/azure/well-architected/service-guides/azure-firewall", + "service": "Firewall", + "severity": "Low", + "text": "Implement backups for your firewall rules", + "training": "https://learn.microsoft.com/training/courses/az-104t00/", + "waf": "Operations" + }, + { + "arm-service": "microsoft.network/applicationGateways", + "checklist": "Azure Landing Zone Review", + "guid": "d301d6e8-72e5-42e3-911c-c58b5a4b1511", + "link": "https://learn.microsoft.com/azure/virtual-network/vnet-integration-for-azure-services", + "service": "App Gateway", + "severity": "High", + "text": "Do not disrupt control-plane communication for Azure PaaS services injected into a virtual networks, such as with a 0.0.0.0/0 route or an NSG rule that blocks control plane traffic.", + "training": "https://learn.microsoft.com/learn/paths/implement-network-security/?source=learn", + "waf": "Security" + }, + { + "arm-service": "microsoft.network/expressRouteCircuits", + "checklist": "Azure Landing Zone Review", + "guid": "b3e4563a-4d87-4397-98b6-62d6d15f512a", + "link": "https://learn.microsoft.com/azure/private-link/private-endpoint-overview", + "service": "ExpressRoute", + "severity": "Medium", + "text": "Access Azure PaaS services from on-premises via private endpoints and ExpressRoute private peering. This method avoids transiting over the public internet.", + "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", + "waf": "Security" + }, + { + "arm-service": "Microsoft.Network/virtualNetworks", + "checklist": "Azure Landing Zone Review", + "graph": "resources | where type =~ 'microsoft.network/virtualnetworks' | project id,resourceGroup,name,subnets = properties.subnets | mv-expand subnets | project id = subnets.id, resourceGroup, VNet = name, serviceEndpoints = subnets.properties.serviceEndpoints, compliant = (isnull(subnets.properties.serviceEndpoints) or array_length(subnets.properties.serviceEndpoints) == 0) | order by compliant asc", + "guid": "4704489a-8042-4d88-b79d-17b73b22a5a6", + "link": "https://learn.microsoft.com/azure/virtual-network/virtual-network-service-endpoints-overview", + "service": "VNet", + "severity": "High", + "text": "Don't enable virtual network service endpoints by default on all subnets.", + "training": "https://learn.microsoft.com/learn/paths/implement-network-security/?source=learn", + "waf": "Security" + }, + { + "arm-service": "Microsoft.Network/azureFirewalls", + "checklist": "Azure Landing Zone Review", + "guid": "7e7a8ed4-b30e-438c-9f29-812b2363cefe", + "link": "azure/private-link/inspect-traffic-with-azure-firewall", + "service": "Firewall", + "severity": "Medium", + "text": "Filter egress traffic to Azure PaaS services using FQDNs instead of IP addresses in Azure Firewall or an NVA to prevent data exfiltration. If using Private Link you can block all FQDNs, otherwise allow only the required PaaS services.", + "training": "https://learn.microsoft.com/learn/paths/implement-network-security/?source=learn", + "waf": "Security" + }, + { + "arm-service": "microsoft.network/expressRouteCircuits", + "checklist": "Azure Landing Zone Review", + "graph": "resources | where type=='microsoft.network/virtualnetworks' | project id,subnets=properties.subnets | mv-expand subnets | project id, subnetName = subnets.name, subnetPrefix = subnets.properties.addressPrefix | extend subnetPrefixLength = split(subnetPrefix, '/')[1] | where subnetName == 'GatewaySubnet' | extend compliant = (subnetPrefixLength <= 27) | distinct id, compliant", + "guid": "f2aad7e3-bb03-4adc-8606-4123d342a917", + "link": "https://learn.microsoft.com/azure/expressroute/expressroute-howto-add-gateway-resource-manager#add-a-gateway", + "service": "ExpressRoute", + "severity": "High", + "text": "Use at least a /27 prefix for your Gateway subnets.", + "waf": "Security" + }, + { + "arm-service": "Microsoft.Network/networkSecurityGroups", + "checklist": "Azure Landing Zone Review", + "graph": "resources | where type=='microsoft.network/networksecuritygroups' | mvexpand properties.securityRules | project id,name,ruleAction=properties_securityRules.properties.access,rulePriority=properties_securityRules.properties.priority,ruleDst=properties_securityRules.properties.destinationAddressPrefix,ruleSrc=properties_securityRules.properties.sourceAddressPrefix,ruleProt=properties_securityRules.properties.protocol,ruleDirection=properties_securityRules.properties.direction,rulePort=properties_securityRules.properties.destinationPortRange | summarize StarDenies=countif(ruleAction=='Deny' and ruleDst=='*' and ruleSrc=='*' and ruleProt=='*' and rulePort=='*') by id,tostring(ruleDirection) | where ruleDirection == 'Inbound' | project id,compliant=(StarDenies>0) | union (resources | where type=='microsoft.network/networksecuritygroups' | where array_length(properties.securityRules)==0 | extend compliant=false | project id,compliant)", + "guid": "11deb39d-8299-4e47-bbe0-0fb5a36318a8", + "link": "https://learn.microsoft.com/azure/virtual-network/service-tags-overview#available-service-tags", + "service": "NSG", + "severity": "High", + "text": "Don't rely on the NSG inbound default rules using the VirtualNetwork service tag to limit connectivity.", + "waf": "Security" + }, + { + "arm-service": "Microsoft.Network/networkSecurityGroups", + "checklist": "Azure Landing Zone Review", + "guid": "872e52e3-611c-4c58-a5a4-b1511e43a58a", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/ready/azure-best-practices/plan-for-landing-zone-network-segmentation", + "service": "NSG", + "severity": "Medium", + "text": "Use NSGs to help protect traffic across subnets, as well as east/west traffic across the platform (traffic between landing zones).", + "training": "https://learn.microsoft.com/learn/paths/implement-network-security/", + "waf": "Security" + }, + { + "arm-service": "Microsoft.Network/networkSecurityGroups", + "checklist": "Azure Landing Zone Review", + "guid": "a4d87397-48b6-462d-9d15-f512a65498f6", + "link": "https://learn.microsoft.com/azure/virtual-network/network-security-group-how-it-works", + "service": "NSG", + "severity": "Medium", + "text": "Use NSGs and application security groups to micro-segment traffic within the landing zone and avoid using a central NVA to filter traffic flows.", + "training": "https://learn.microsoft.com/learn/paths/implement-network-security/", + "waf": "Security" + }, + { + "arm-service": "Microsoft.Network/networkSecurityGroups", + "checklist": "Azure Landing Zone Review", + "guid": "dfe237de-143b-416c-91d7-aa9b64704489", + "link": "https://learn.microsoft.com/azure/network-watcher/vnet-flow-logs-overview", + "service": "NSG", + "severity": "Medium", + "text": "Enable VNet Flow Logs and feed them into Traffic Analytics to gain insights into internal and external traffic flows.", + "training": "https://learn.microsoft.com/learn/modules/design-implement-network-monitoring/", + "waf": "Security" + }, + { + "arm-service": "Microsoft.Network/networkSecurityGroups", + "checklist": "Azure Landing Zone Review", + "graph": "resources | where type == 'microsoft.network/networksecuritygroups' | project id, rules = array_length(properties.securityRules) | project id, compliant = (rules < 900)", + "guid": "0390417d-53dc-44d9-b3f4-c8832f359b41", + "link": "https://learn.microsoft.com/azure/azure-resource-manager/management/azure-subscription-service-limits", + "service": "NSG", + "severity": "Medium", + "text": "Do not implement more than 900 NSG rules per NSG, due to the limit of 1000 rules.", + "training": "https://learn.microsoft.com/azure/virtual-network/network-security-group-how-it-works", + "waf": "Reliability" + }, + { + "arm-service": "microsoft.network/virtualWans", + "checklist": "Azure Landing Zone Review", + "guid": "412e7f98-3f63-4047-82dd-69c5b5c2622f", + "link": "https://learn.microsoft.com/azure/virtual-wan/scenario-any-to-any", + "service": "VWAN", + "severity": "Medium", + "text": "Use Virtual WAN if your scenario is explicitly described in the list of Virtual WAN routing designs.", + "training": "https://learn.microsoft.com/learn/modules/introduction-azure-virtual-wan/", + "waf": "Operations" + }, + { + "arm-service": "microsoft.network/virtualWans", + "checklist": "Azure Landing Zone Review", + "guid": "54b69bad-33aa-4d5e-ac68-e1d76667313b", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/ready/azure-best-practices/virtual-wan-network-topology#virtual-wan-network-design-recommendationst", + "service": "VWAN", + "severity": "Medium", + "text": "Use a Virtual WAN hub per Azure region to connect multiple landing zones together across Azure regions via a common global Azure Virtual WAN.", + "training": "https://learn.microsoft.com/training/modules/introduction-azure-virtual-wan/", + "waf": "Performance" + }, + { + "arm-service": "microsoft.network/virtualWans", + "checklist": "Azure Landing Zone Review", + "graph": "resources | where type=='microsoft.network/virtualhubs' | extend compliant = isnotnull(properties.azureFirewall.id) | project id, compliant", + "guid": "7d5d1e4e-6146-458d-9558-fd77249b8211", + "link": "https://learn.microsoft.com/azure/virtual-wan/howto-firewall", + "service": "VWAN", + "severity": "Medium", + "text": "For outbound Internet traffic protection and filtering, deploy Azure Firewall in secured hubs.", + "training": "https://learn.microsoft.com/learn/paths/secure-networking-infrastructure/", + "waf": "Security" + }, + { + "arm-service": "microsoft.network/virtualWans", + "checklist": "Azure Landing Zone Review", + "guid": "6667313b-4f56-464b-9e98-4a859c773e7d", + "link": "https://learn.microsoft.com/azure/virtual-wan/migrate-from-hub-spoke-topology", + "service": "VWAN", + "severity": "Medium", + "text": "Ensure that your virtual WAN network architecture aligns to an identified architecture scenario.", + "training": "https://learn.microsoft.com/training/modules/introduction-azure-virtual-wan/", + "waf": "Reliability" + }, + { + "arm-service": "microsoft.network/virtualWans", + "checklist": "Azure Landing Zone Review", + "guid": "261623a7-65a9-417e-8f34-8ef254c27d42", + "link": "https://learn.microsoft.com/azure/virtual-wan/azure-monitor-insights", + "service": "VWAN", + "severity": "Medium", + "text": "Use Azure Monitor Insights for Virtual WAN to monitor the end-to-end topology of the Virtual WAN, status, and key metrics.", + "training": "https://learn.microsoft.com/training/modules/introduction-azure-virtual-wan/", + "waf": "Operations" + }, + { + "arm-service": "microsoft.network/virtualWans", + "checklist": "Azure Landing Zone Review", + "guid": "727c77e1-b9aa-4a37-a024-129d042422c1", + "link": "https://learn.microsoft.com/azure/virtual-wan/virtual-wan-faq#is-branch-to-branch-connectivity-allowed-in-virtual-wan", + "service": "VWAN", + "severity": "Medium", + "text": "Do not disable branch-to-branch traffic in Virtual WAN, unless these flows should be explicitly blocked.", + "training": "https://learn.microsoft.com/training/modules/introduction-azure-virtual-wan/", + "waf": "Reliability" + }, + { + "arm-service": "microsoft.network/virtualWans", + "checklist": "Azure Landing Zone Review", + "guid": "d49ac006-6670-4bc9-9948-d3e0a3a94f4d", + "link": "https://learn.microsoft.com/azure/virtual-wan/about-virtual-hub-routing-preference", + "service": "VWAN", + "severity": "Medium", + "text": "Use AS-Path as hub routing preference, since it is more flexible than ExpressRoute or VPN.", + "training": "https://learn.microsoft.com/training/modules/introduction-azure-virtual-wan/", + "waf": "Reliability" + }, + { + "arm-service": "microsoft.network/virtualWans", + "checklist": "Azure Landing Zone Review", + "guid": "2586b854-237e-47f1-84a1-d45d4cd2310d", + "link": "https://learn.microsoft.com/azure/virtual-wan/about-virtual-hub-routing#labels", + "service": "VWAN", + "severity": "Medium", + "text": "Configure label-based propagation in Virtual WAN, otherwise connectivity between virtual hubs will be impaired.", + "training": "https://learn.microsoft.com/training/modules/introduction-azure-virtual-wan/", + "waf": "Reliability" + }, + { + "arm-service": "microsoft.network/virtualWans", + "checklist": "Azure Landing Zone Review", + "guid": "9c75dfef-573c-461c-a698-68598595581a", + "link": "https://learn.microsoft.com/azure/virtual-wan/virtual-wan-faq#what-is-the-recommended-hub-address-space-during-hub-creation", + "service": "VWAN", + "severity": "High", + "text": "Assign at least a /23 prefix to virtual hubs to ensure enough IP space is available.", + "training": "https://learn.microsoft.com/training/modules/introduction-azure-virtual-wan/", + "waf": "Reliability" + }, + { + "arm-service": "Microsoft.Authorization/policyDefinitions", + "checklist": "Azure Landing Zone Review", + "guid": "5c986cb2-9131-456a-8247-6e49f541acdc", + "link": "https://learn.microsoft.com/azure/governance/policy/overview", + "service": "Policy", + "severity": "High", + "text": "Leverage Azure Policy strategically, define controls for your environment, using Policy Initiatives to group related policies.", + "waf": "Security" + }, + { + "arm-service": "Microsoft.Authorization/policyDefinitions", + "checklist": "Azure Landing Zone Review", + "guid": "d8a2adb1-17d6-4326-af62-5ca44e5695f2", + "link": "https://learn.microsoft.com/azure/governance/policy/overview", + "service": "Policy", + "severity": "Medium", + "text": "Map regulatory and compliance requirements to Azure Policy definitions and Azure role assignments.", + "waf": "Security" + }, + { + "arm-service": "Microsoft.Authorization/policyDefinitions", + "checklist": "Azure Landing Zone Review", + "guid": "223ace8c-b123-408c-a501-7f154e3ab369", + "link": "https://learn.microsoft.com/azure/governance/policy/overview", + "service": "Policy", + "severity": "Medium", + "text": "Establish Azure Policy definitions at the intermediate root management group so that they can be assigned at inherited scopes.", + "waf": "Security" + }, + { + "arm-service": "Microsoft.Authorization/policyDefinitions", + "checklist": "Azure Landing Zone Review", + "guid": "3829e7e3-1618-4368-9a04-77a209945bda", + "link": "https://learn.microsoft.com/azure/governance/policy/overview", + "service": "Policy", + "severity": "High", + "text": "Manage policy assignments at the highest appropriate level with exclusions at bottom levels, if required.", + "waf": "Security" + }, + { + "arm-service": "Microsoft.Authorization/policyDefinitions", + "checklist": "Azure Landing Zone Review", + "guid": "43334f24-9116-4341-a2ba-527526944008", + "link": "https://learn.microsoft.com/security/benchmark/azure/mcsb-asset-management#am-2-use-only-approved-services", + "service": "Policy", + "severity": "Low", + "text": "Use Azure Policy to control which services users can provision at the subscription/management group level.", + "waf": "Security" + }, + { + "arm-service": "Microsoft.Authorization/policyDefinitions", + "checklist": "Azure Landing Zone Review", + "guid": "be7d7e48-4327-46d8-adc0-55bcf619e8a1", + "link": "https://learn.microsoft.com/azure/governance/policy/overview", + "service": "Policy", + "severity": "High", + "text": "Use built-in policies where possible to minimize operational overhead.", + "waf": "Security" + }, + { + "arm-service": "Microsoft.Authorization/policyDefinitions", + "checklist": "Azure Landing Zone Review", + "description": "Assigning the Resource Policy Contributor role to specific scopes allows you to delegate policy management to relevant teams. For instance, a central IT team may oversee management group-level policies, while application teams handle policies for their subscriptions, enabling distributed governance with adherence to organizational standards.", + "guid": "3f988795-25d6-4268-a6d7-0ba6c97be995", + "link": "https://learn.microsoft.com/azure/governance/policy/overview#azure-rbac-permissions-in-azure-policy", + "service": "Policy", + "severity": "Medium", + "text": "Assign the built-in Resource Policy Contributor role at a particular scope to enable application-level governance.", + "waf": "Security" + }, + { + "arm-service": "Microsoft.Authorization/policyDefinitions", + "checklist": "Azure Landing Zone Review", + "guid": "19048384-5c98-46cb-8913-156a12476e49", + "link": "https://learn.microsoft.com/azure/governance/policy/overview", + "service": "Policy", + "severity": "Medium", + "text": "Limit the number of Azure Policy assignments made at the root management group scope to avoid managing through exclusions at inherited scopes.", + "waf": "Security" + }, + { + "arm-service": "Microsoft.Authorization/policyDefinitions", + "checklist": "Azure Landing Zone Review", + "guid": "5a917e1f-348e-4f25-9c27-d42e8bbac757", + "link": "https://learn.microsoft.com/industry/release-plan/2023wave2/cloud-sovereignty/enable-data-sovereignty-policy-baseline", + "service": "Policy", + "severity": "Medium", + "text": "If any data sovereignty requirements exist, Azure Policies should be deployed to enforce them.", + "training": "https://learn.microsoft.com/learn/paths/secure-your-cloud-data/", + "waf": "Security" + }, + { + "arm-service": "Microsoft.Authorization/policyDefinitions", + "checklist": "Azure Landing Zone Review", + "guid": "78b22132-b41c-460b-a4d3-df8f73a67dc2", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/ready/landing-zone/sovereign-landing-zone", + "service": "Policy", + "severity": "Medium", + "text": "For Sovereign Landing Zone, deploy sovereignty policy baseline and assign at correct management group level.", + "waf": "Security" + }, + { + "arm-service": "Microsoft.Authorization/policyDefinitions", + "checklist": "Azure Landing Zone Review", + "guid": "caeea0e9-1024-41df-a52e-d99c3f22a6f4", + "link": "https://learn.microsoft.com/industry/sovereignty/policy-portfolio-baseline", + "service": "Policy", + "severity": "Medium", + "text": "For Sovereign Landing Zone, document Sovereign Control objectives to policy mapping.", + "waf": "Security" + }, + { + "arm-service": "Microsoft.Authorization/policyDefinitions", + "checklist": "Azure Landing Zone Review", + "guid": "9b461617-db7b-4399-8ac6-d4eb7153893a", + "link": "https://learn.microsoft.com/industry/sovereignty/policy-portfolio-baseline#sovereignty-baseline-policy-initiatives", + "service": "Policy", + "severity": "Medium", + "text": "For Sovereign Landing Zone, ensure process is in place for management of 'Sovereign Control objectives to policy mapping'.", + "waf": "Security" + }, + { + "arm-service": "Microsoft.Insights/components", + "checklist": "Azure Landing Zone Review", + "guid": "67e7a8ed-4b30-4e38-a3f2-9812b2363cef", + "link": "https://learn.microsoft.com/azure/azure-monitor/logs/design-logs-deployment", + "service": "Monitor", + "severity": "Medium", + "text": "Use a single monitor logs workspace to manage platforms centrally except where Azure role-based access control (Azure RBAC), data sovereignty requirements, or data retention policies mandate separate workspaces.", + "training": "https://learn.microsoft.com/azure/azure-monitor/logs/design-logs-deployment", + "waf": "Operations" + }, + { + "arm-service": "Microsoft.Insights/components", + "checklist": "Azure Landing Zone Review", + "guid": "5e6c4cfd-3e50-4454-9c24-47ec66138a72", + "link": "https://learn.microsoft.com/azure/azure-monitor/logs/data-retention-archive?tabs=portal-1%2Cportal-2#how-retention-and-archiving-work", + "service": "Monitor", + "severity": "High", + "text": "Export logs to Azure Storage if your log retention requirements exceed twelve years. Use immutable storage with a write-once, read-many policy to make data non-erasable and non-modifiable for a user-specified interval.", + "training": "https://learn.microsoft.com/learn/paths/architect-infrastructure-operations/", + "waf": "Operations" + }, + { + "arm-service": "Microsoft.Compute/virtualMachines", + "checklist": "Azure Landing Zone Review", + "guid": "e7d7e484-3276-4d8b-bc05-5bcf619e8a13", + "link": "https://learn.microsoft.com/azure/governance/machine-configuration/overview", + "service": "VM", + "severity": "Medium", + "text": "Monitor OS level virtual machine (VM) configuration drift using Azure Policy. Enabling Azure Automanage Machine Configuration audit capabilities through policy helps application team workloads to immediately consume feature capabilities with little effort.", + "training": "https://learn.microsoft.com/learn/paths/implement-resource-mgmt-security/", + "waf": "Operations" + }, + { + "arm-service": "Microsoft.Compute/virtualMachines", + "checklist": "Azure Landing Zone Review", + "guid": "f9887952-5d62-4688-9d70-ba6c97be9951", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/ready/landing-zone/design-area/management-operational-compliance#update-management-considerations", + "service": "VM", + "severity": "Medium", + "text": "Use Azure Update Manager as a patching mechanism for Windows and Linux VMs in Azure.", + "training": "https://learn.microsoft.com/azure/update-manager/overview?tabs=azure-vms", + "waf": "Operations" + }, + { + "arm-service": "Microsoft.Compute/virtualMachines", + "checklist": "Azure Landing Zone Review", + "guid": "c806c048-26b7-4ddf-b4c2-b4f0c476925d", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/ready/landing-zone/design-area/management-operational-compliance#update-management-considerations ", + "service": "VM", + "severity": "Medium", + "text": "Use Azure Update Manager as a patching mechanism for Windows and Linux VMs outside of Azure using Azure Arc.", + "training": "https://learn.microsoft.com/azure/update-manager/overview?tabs=azure-vms", + "waf": "Operations" + }, + { + "arm-service": "microsoft.network/networkWatchers", + "checklist": "Azure Landing Zone Review", + "guid": "90483845-c986-4cb2-a131-56a12476e49f", + "link": "https://learn.microsoft.com/azure/network-watcher/network-watcher-monitoring-overview", + "service": "Network Watcher", + "severity": "Medium", + "text": "Use Network Watcher to proactively monitor traffic flows.", + "training": "https://learn.microsoft.com/learn/modules/configure-network-watcher/", + "waf": "Operations" + }, + { + "arm-service": "Microsoft.Insights/components", + "checklist": "Azure Landing Zone Review", + "guid": "6944008b-e7d7-4e48-9327-6d8bdc055bcf", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/ready/azure-setup-guide/monitoring-reporting?tabs=AzureMonitor", + "service": "Monitor", + "severity": "Medium", + "text": "Use Azure Monitor Logs for insights and reporting.", + "training": "https://learn.microsoft.com/training/modules/configure-azure-monitor/", + "waf": "Operations" + }, + { + "arm-service": "Microsoft.Insights/components", + "checklist": "Azure Landing Zone Review", + "guid": "97be9951-9048-4384-9c98-6cb2913156a1", + "link": "https://learn.microsoft.com/azure/azure-monitor/alerts/alerts-overview", + "service": "Monitor", + "severity": "Medium", + "text": "Use Azure Monitor alerts for the generation of operational alerts.", + "training": "https://learn.microsoft.com/training/modules/incident-response-with-alerting-on-azure/", + "waf": "Operations" + }, + { + "arm-service": "Microsoft.Insights/components", + "checklist": "Azure Landing Zone Review", + "guid": "fed3c55f-a67e-4875-aadd-3aba3f9fde31", + "link": "https://learn.microsoft.com/azure/automation/how-to/region-mappings", + "service": "Monitor", + "severity": "Medium", + "text": "When using Change and Inventory Tracking via Azure Automation Accounts, ensure that you have selected supported regions for linking your Log Analytics workspace and automation accounts together.", + "training": "https://learn.microsoft.com/training/modules/explore-azure-automation-devops/", + "waf": "Operations" + }, + { + "arm-service": "Microsoft.RecoveryServices/vaults", + "checklist": "Azure Landing Zone Review", + "guid": "eba8cf22-45c6-4dc1-9b57-2cceb3b97ce5", + "link": "https://learn.microsoft.com/azure/storage/common/storage-redundancy", + "service": "Backup", + "severity": "Low", + "text": "When using Azure Backup, use the correct backup types (GRS, ZRS & LRS) for your backup, as the default setting is GRS.", + "training": "https://learn.microsoft.com/training/modules/design-solution-for-backup-disaster-recovery/", + "waf": "Reliability" + }, + { + "arm-service": "Microsoft.Compute/virtualMachines", + "checklist": "Azure Landing Zone Review", + "guid": "f541acdc-e979-4377-acdb-3751ab2ab13a", + "link": "https://learn.microsoft.com/azure/governance/policy/concepts/guest-configuration", + "service": "VM", + "severity": "Medium", + "text": "Use Azure guest policies to automatically deploy software configurations through VM extensions and enforce a compliant baseline VM configuration.", + "waf": "Security" + }, + { + "arm-service": "Microsoft.Compute/virtualMachines", + "checklist": "Azure Landing Zone Review", + "description": "Use Azure Policy's guest configuration features to audit and remediate machine settings (e.g., OS, application, environment) to ensure resources align with expected configurations, and Update Management can enforce patch management for VMs.", + "guid": "da6e55d7-d8a2-4adb-817d-6326af625ca4", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/ready/landing-zone/design-area/management-operational-compliance#monitoring-for-configuration-drift", + "service": "VM", + "severity": "Medium", + "text": "Monitor VM security configuration drift via Azure Policy.", + "training": "https://learn.microsoft.com/training/paths/implement-resource-mgmt-security/", + "waf": "Security" + }, + { + "arm-service": "Microsoft.Compute/virtualMachines", + "checklist": "Azure Landing Zone Review", + "guid": "2476e49f-541a-4cdc-b979-377bcdb3751a", + "link": "https://learn.microsoft.com/azure/site-recovery/site-recovery-overview", + "service": "VM", + "severity": "Medium", + "text": "Use Azure Site Recovery for Azure-to-Azure Virtual Machines disaster recovery scenarios. This enables you to replicate workloads across regions.", + "training": "https://learn.microsoft.com/training/modules/protect-infrastructure-with-site-recovery/", + "waf": "Operations" + }, + { + "arm-service": "Microsoft.RecoveryServices/vaults", + "checklist": "Azure Landing Zone Review", + "guid": "f625ca44-e569-45f2-823a-ce8cb12308ca", + "link": "https://learn.microsoft.com/azure/backup/backup-center-overview", + "service": "Backup", + "severity": "Medium", + "text": "Use Azure-native backup capabilities, or an Azure-compatible, 3rd-party backup solution.", + "training": "https://learn.microsoft.com/training/modules/design-solution-for-backup-disaster-recovery/", + "waf": "Operations" + }, + { + "arm-service": "microsoft.network/frontdoorwebApplicationFirewalls", + "checklist": "Azure Landing Zone Review", + "guid": "89cc5e11-aa4d-4c3b-893d-feb99215266a", + "link": "https://learn.microsoft.com/azure/web-application-firewall/afds/waf-front-door-best-practices#add-diagnostic-settings-to-save-your-wafs-logs", + "service": "WAF", + "severity": "High", + "text": "Add diagnostic settings to save WAF logs from application delivery services like Azure Front Door and Azure Application Gateway. Regularly review the logs to check for attacks and for false positive detections.", + "training": "https://learn.microsoft.com/training/modules/capture-application-logs-app-service/", + "waf": "Operations" + }, + { + "arm-service": "microsoft.network/frontdoorwebApplicationFirewalls", + "checklist": "Azure Landing Zone Review", + "guid": "7f408960-c626-44cb-a018-347c8d790cdf", + "link": "https://learn.microsoft.com/azure/web-application-firewall/afds/waf-front-door-best-practices#send-logs-to-microsoft-sentinel", + "service": "WAF", + "severity": "Medium", + "text": "Send WAF logs from your application delivery services like Azure Front Door and Azure Application Gateway to Microsoft Sentinel. Detect attacks and integrate WAF telemetry into your overall Azure environment.", + "training": "https://learn.microsoft.com/training/paths/sc-200-connect-logs-to-azure-sentinel/", + "waf": "Operations" + }, + { + "arm-service": "Microsoft.KeyVault/vaults", + "checklist": "Azure Landing Zone Review", + "guid": "5017f154-e3ab-4369-9829-e7e316183687", + "link": "https://learn.microsoft.com/azure/key-vault/general/overview", + "service": "Key Vault", + "severity": "High", + "text": "Use Azure Key Vault to store your secrets and credentials.", + "training": "https://learn.microsoft.com/training/modules/implement-azure-key-vault/", + "waf": "Security" + }, + { + "arm-service": "Microsoft.KeyVault/vaults", + "checklist": "Azure Landing Zone Review", + "graph": "ResourceContainers | where type=='microsoft.resources/subscriptions'| parse id with '/subscriptions/' SubscriptionID| project subscriptionId, SubscriptionName = name| join kind=leftouter (Resources| where type == 'microsoft.keyvault/vaults'| project id, name, subscriptionId) on subscriptionId| join kind= leftouter (Resources| where type == 'microsoft.keyvault/vaults'| summarize ResourceCount = count() by subscriptionId) on subscriptionId| extend RCount = iff(isnull(ResourceCount), 0, ResourceCount)| project-away ResourceCount| extend compliant = (RCount <> 1)", + "guid": "a0477a20-9945-4bda-9333-4f2491163418", + "link": "https://learn.microsoft.com/azure/key-vault/general/overview-throttling", + "service": "Key Vault", + "severity": "Medium", + "text": "Use different Azure Key Vaults for different applications and regions to avoid transaction scale limits and restrict access to secrets.", + "training": "https://learn.microsoft.com/training/modules/configure-and-manage-azure-key-vault/", + "waf": "Security" + }, + { + "arm-service": "Microsoft.KeyVault/vaults", + "checklist": "Azure Landing Zone Review", + "guid": "2ba52752-6944-4008-ae7d-7e4843276d8b", + "link": "https://learn.microsoft.com/azure/key-vault/general/best-practices", + "service": "Key Vault", + "severity": "Medium", + "text": "Provision Azure Key Vault with the soft delete and purge policies enabled to allow retention protection for deleted objects.", + "training": "https://learn.microsoft.com/training/modules/implement-azure-key-vault/", + "waf": "Security" + }, + { + "arm-service": "Microsoft.KeyVault/vaults", + "checklist": "Azure Landing Zone Review", + "guid": "dc055bcf-619e-48a1-9f98-879525d62688", + "link": "https://learn.microsoft.com/azure/key-vault/general/best-practices", + "service": "Key Vault", + "severity": "Medium", + "text": "Follow a least privilege model by limiting authorization to permanently delete keys, secrets, and certificates to specialized custom Microsoft Entra ID roles.", + "training": "https://learn.microsoft.com/training/modules/implement-azure-key-vault/", + "waf": "Security" + }, + { + "arm-service": "Microsoft.KeyVault/vaults", + "checklist": "Azure Landing Zone Review", + "guid": "6d70ba6c-97be-4995-8904-83845c986cb2", + "link": "https://learn.microsoft.com/azure/key-vault/general/best-practices", + "service": "Key Vault", + "severity": "Medium", + "text": "Automate the certificate management and renewal process with public certificate authorities to ease administration.", + "training": "https://learn.microsoft.com/en-us/training/modules/configure-and-manage-azure-key-vault/", + "waf": "Security" + }, + { + "arm-service": "Microsoft.KeyVault/vaults", + "checklist": "Azure Landing Zone Review", + "guid": "913156a1-2476-4e49-b541-acdce979377b", + "link": "https://learn.microsoft.com/azure/key-vault/general/best-practices", + "service": "Key Vault", + "severity": "Medium", + "text": "Establish an automated process for key and certificate rotation.", + "training": "https://learn.microsoft.com/training/modules/configure-and-manage-azure-key-vault/", + "waf": "Security" + }, + { + "arm-service": "Microsoft.KeyVault/vaults", + "checklist": "Azure Landing Zone Review", + "guid": "cdb3751a-b2ab-413a-ba6e-55d7d8a2adb1", + "link": "https://learn.microsoft.com/azure/key-vault/general/best-practices", + "service": "Key Vault", + "severity": "Medium", + "text": "Enable firewall and virtual network service endpoint or private endpoint on the vault to control access to the key vault.", + "training": "https://learn.microsoft.com/training/modules/design-implement-private-access-to-azure-services/", + "waf": "Security" + }, + { + "arm-service": "Microsoft.KeyVault/vaults", + "checklist": "Azure Landing Zone Review", + "guid": "17d6326a-f625-4ca4-9e56-95f2223ace8c", + "link": "https://learn.microsoft.com/azure/key-vault/general/monitor-key-vault", + "service": "Key Vault", + "severity": "Medium", + "text": "Use the platform-central Azure Monitor Log Analytics workspace to audit key, certificate, and secret usage within each instance of Key Vault.", + "training": "https://learn.microsoft.com/training/modules/analyze-infrastructure-with-azure-monitor-logs/", + "waf": "Security" + }, + { + "arm-service": "Microsoft.KeyVault/vaults", + "checklist": "Azure Landing Zone Review", + "guid": "b12308ca-5017-4f15-9e3a-b3693829e7e3", + "link": "https://learn.microsoft.com/azure/key-vault/general/best-practices", + "service": "Key Vault", + "severity": "Medium", + "text": "Delegate Key Vault instantiation and privileged access and use Azure Policy to enforce a consistent compliant configuration.", + "training": "https://learn.microsoft.com/training/modules/configure-azure-key-vault-networking-settings/", + "waf": "Security" + }, + { + "arm-service": "Microsoft.KeyVault/vaults", + "checklist": "Azure Landing Zone Review", + "guid": "91163418-2ba5-4275-8694-4008be7d7e48", + "link": "https://learn.microsoft.com/azure/key-vault/general/best-practices", + "service": "Key Vault", + "severity": "Medium", + "text": "Use an Azure Key Vault per application per environment per region.", + "training": "https://learn.microsoft.com/training/modules/implement-azure-key-vault/", + "waf": "Security" + }, + { + "arm-service": "Microsoft.KeyVault/vaults", + "checklist": "Azure Landing Zone Review", + "guid": "25d62688-6d70-4ba6-a97b-e99519048384", + "link": "https://learn.microsoft.com/azure/key-vault/general/best-practices", + "service": "Key Vault", + "severity": "Medium", + "text": "If you want to bring your own keys, this might not be supported across all considered services. Implement relevant mitigation so that inconsistencies don't hinder desired outcomes. Choose appropriate region pairs and disaster recovery regions that minimize latency.", + "training": "https://learn.microsoft.com/training/modules/configure-and-manage-azure-key-vault/", + "waf": "Security" + }, + { + "arm-service": "Microsoft.KeyVault/vaults", + "checklist": "Azure Landing Zone Review", + "guid": "4ac6b67c-b3a4-4ff9-8e87-b07a7ce7bbdb", + "link": "https://learn.microsoft.com/industry/sovereignty/key-management", + "service": "Key Vault", + "severity": "Medium", + "text": "For Sovereign Landing Zone, use Azure Key Vault managed HSM to store your secrets and credentials.", + "training": "https://learn.microsoft.com/training/modules/configure-and-manage-azure-key-vault/", + "waf": "Security" + }, + { + "checklist": "Azure Landing Zone Review", + "guid": "4e5695f2-223a-4ce8-ab12-308ca5017f15", + "link": "https://learn.microsoft.com/azure/active-directory/reports-monitoring/overview-reports", + "service": "Entra", + "severity": "Medium", + "text": "Use Microsoft Entra ID reporting capabilities to generate access control audit reports.", + "training": "https://learn.microsoft.com/training/modules/monitor-report-aad-security-events/", + "waf": "Security" + }, + { + "checklist": "Azure Landing Zone Review", + "guid": "09945bda-4333-44f2-9911-634182ba5275", + "link": "https://learn.microsoft.com/azure/defender-for-cloud/concept-cloud-security-posture-management", + "service": "Defender", + "severity": "High", + "text": "Enable Defender Cloud Security Posture Management for all subscriptions.", + "training": "https://learn.microsoft.com/training/modules/microsoft-defender-cloud-security-posture/", + "waf": "Security" + }, + { + "checklist": "Azure Landing Zone Review", + "guid": "36a72a48-fffe-4c40-9747-0ab5064355ba", + "link": "https://learn.microsoft.com/azure/defender-for-cloud/plan-defender-for-servers-select-plan", + "service": "Defender", + "severity": "High", + "text": "Enable a Defender Cloud Workload Protection Plan for Servers on all subscriptions.", + "training": "https://learn.microsoft.com/training/modules/understand-azure-defender-cloud-workload-protection/", + "waf": "Security" + }, + { + "checklist": "Azure Landing Zone Review", + "guid": "77425f48-ecba-43a0-aeac-a3ac733ccc6a", + "link": "https://learn.microsoft.com/azure/defender-for-cloud/connect-azure-subscription", + "service": "Defender", + "severity": "High", + "text": "Enable Defender Cloud Workload Protection Plans for Azure Resources on all subscriptions.", + "training": "https://learn.microsoft.com/training/modules/understand-azure-defender-cloud-workload-protection/", + "waf": "Security" + }, + { + "arm-service": "Microsoft.Compute/virtualMachines", + "checklist": "Azure Landing Zone Review", + "guid": "24d96b30-61ee-4436-a1cc-d6ef08bc574b", + "link": "https://learn.microsoft.com/mem/configmgr/protect/deploy-use/endpoint-protection", + "service": "VM", + "severity": "High", + "text": "Enable Endpoint Protection on IaaS Servers.", + "training": "https://learn.microsoft.com/training/modules/design-solutions-securing-server-client-endpoints/", + "waf": "Security" + }, + { + "arm-service": "Microsoft.Compute/virtualMachines", + "checklist": "Azure Landing Zone Review", + "guid": "15833ee7-ad6c-46d3-9331-65c7acbe44ab", + "link": "https://learn.microsoft.com/azure/security-center/", + "service": "VM", + "severity": "Medium", + "text": "Monitor base operating system patching drift via Azure Monitor Logs and Defender for Cloud.", + "training": "https://learn.microsoft.com/training/modules/create-log-analytics-workspace-microsoft-defender-cloud/", + "waf": "Security" + }, + { + "arm-service": "Microsoft.Insights/components", + "checklist": "Azure Landing Zone Review", + "guid": "e5f8d79f-2e87-4768-924c-516775c6ea95", + "link": "https://learn.microsoft.com/azure/azure-monitor/logs/design-logs-deployment", + "service": "Monitor", + "severity": "Medium", + "text": "Connect default resource configurations to a centralized Azure Monitor Log Analytics workspace.", + "training": "https://learn.microsoft.com/training/modules/analyze-infrastructure-with-azure-monitor-logs/", + "waf": "Security" + }, + { + "checklist": "Azure Landing Zone Review", + "guid": "1761e147-f65e-4d09-bbc2-f464f23e2eba", + "link": "https://learn.microsoft.com/industry/sovereignty/transparency-logs", + "service": "Entra", + "severity": "Medium", + "text": "For Sovereign Landing Zone, enable transparancy logs on the Entra ID tenant.", + "waf": "Security" + }, + { + "checklist": "Azure Landing Zone Review", + "guid": "d21a922d-5ca7-427a-82a6-35f7b21f1bfc", + "link": "https://learn.microsoft.com/azure/security/fundamentals/customer-lockbox-overview", + "service": "Entra", + "severity": "Medium", + "text": "For Sovereign Landing Zone, enable customer Lockbox on the Entra ID tenant.", + "waf": "Security" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Landing Zone Review", + "guid": "b03ed428-4617-4067-a787-85468b9ccf3f", + "link": "https://learn.microsoft.com/azure/storage/common/storage-require-secure-transfer", + "service": "Storage", + "severity": "High", + "text": "Enable secure transfer to storage accounts.", + "training": "https://learn.microsoft.com/training/modules/secure-azure-storage-account/", + "waf": "Security" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Landing Zone Review", + "guid": "159aac9f-863f-4f48-82cf-00c28fa97a0e", + "link": "https://learn.microsoft.com/azure/storage/blobs/data-protection-overview#recommendations-for-basic-data-protection", + "service": "Storage", + "severity": "High", + "text": "Enable container soft delete for the storage account to recover a deleted container and its contents.", + "waf": "Security" + }, + { + "arm-service": "Microsoft.KeyVault/vaults", + "checklist": "Azure Landing Zone Review", + "guid": "108d5099-a11d-4445-bd8b-e12a5e95412e", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/ready/considerations/development-strategy-development-lifecycle#automated-builds", + "service": "Key Vault", + "severity": "High", + "text": "Use Key Vault secrets to avoid hard-coding sensitive information such as credentials (virtual machines user passwords), certificates or keys.", + "training": "https://learn.microsoft.com/en-us/training/modules/implement-azure-key-vault/", + "waf": "Operations" + }, { "arm-service": "Microsoft.ApiManagement/service", "checklist": "Azure API Management Review", @@ -2476,12 +4230,24 @@ { "arm-service": "Microsoft.Storage/storageAccounts", "checklist": "Azure Storage Review Checklist", - "description": "AAD tokens should be favored over shared access signatures, wherever possible", + "description": ". Enforcing the latest TLS version will reject request from clients using the older version. ", + "graph": "resources | where type == 'microsoft.storage/storageaccounts' | extend compliant = (isnull(properties.minimumTlsVersion) == false and properties.minimumTlsVersion in ('TLS1_2', 'TLS1_3')) | distinct id, compliant", + "guid": "e12be569-a18f-4562-8d5d-ce151b9e7d55", + "link": "https://learn.microsoft.com/azure/storage/common/transport-layer-security-configure-minimum-version", + "service": "Azure Storage", + "severity": "High", + "text": "Enforce the latest TLS version for a storage account", + "waf": "Security" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review Checklist", + "description": "Microsoft Entra ID tokens should be favored over shared access signatures, wherever possible", "guid": "e1ce15dd-3f0d-45e7-92d4-1e3611cc57b4", "link": "https://learn.microsoft.com/azure/storage/common/authorize-data-access", "service": "Azure Storage", "severity": "High", - "text": "Use Azure Active Directory (Azure AD) tokens for blob access", + "text": "Use Microsoft Entra ID tokens for blob access", "waf": "Security" }, { @@ -2508,12 +4274,13 @@ { "arm-service": "Microsoft.Storage/storageAccounts", "checklist": "Azure Storage Review Checklist", - "description": "Storage account keys ('shared keys') have very little audit capabilities. While it can be monitored on who/when fetched a copy of the keys, once the keys are in the hands of multiple people, it is impossible to attribute usage to a specific user. Solely relying on AAD authentication makes it easier to tie storage access to a user. ", + "description": "Storage account keys ('shared keys') have very little audit capabilities. While it can be monitored on who/when fetched a copy of the keys, once the keys are in the hands of multiple people, it is impossible to attribute usage to a specific user. Solely relying on Entra ID authentication makes it easier to tie storage access to a user. ", + "graph": "resources | where type == 'microsoft.storage/storageaccounts' | extend allowSharedKeyAccess = tostring(properties.allowSharedKeyAccess) | extend compliant = (isnotempty(allowSharedKeyAccess) and allowSharedKeyAccess == 'false') | distinct id, compliant", "guid": "15f51296-5398-4e6d-bd22-7dd142b06c21", "link": "https://learn.microsoft.com/rest/api/storageservices/authorize-with-shared-key", "service": "Azure Storage", "severity": "High", - "text": "Consider disabling storage account keys, so that only AAD access (and user delegation SAS) is supported.", + "text": "Consider disabling storage account keys, so that only Microsoft Entra ID access (and user delegation SAS) is supported.", "waf": "Security" }, { @@ -2691,11 +4458,12 @@ "arm-service": "Microsoft.Storage/storageAccounts", "checklist": "Azure Storage Review Checklist", "description": "Leverage Resource Graph Explorer (resources | where type == 'microsoft.storage/storageaccounts' | where properties['allowBlobPublicAccess'] == true) to find storage accounts which allow anonymous blob access.", + "graph": "resources | where type == 'microsoft.storage/storageaccounts' | extend compliant = (properties.allowBlobPublicAccess == 'false') | distinct id, compliant", "guid": "659ae558-b937-4d49-a5e1-112dbd7ba012", "link": "https://learn.microsoft.com/azure/storage/blobs/anonymous-read-access-configure?tabs=portal#allow-or-disallow-public-read-access-for-a-storage-account", "service": "Azure Storage", "severity": "High", - "text": "Consider whether public blob access is needed, or whether it can be disabled for certain storage accounts. ", + "text": "Consider whether public blob anonymous access is needed, or whether it can be disabled for certain storage accounts. ", "waf": "Security" }, { @@ -8715,7 +10483,7 @@ ], "metadata": { "name": "WAF checklist", - "timestamp": "August 08, 2024" + "timestamp": "August 12, 2024" }, "severities": [ { diff --git a/checklists/waf_checklist.es.json b/checklists/waf_checklist.es.json index 2e5c33a23..2bb0760dc 100644 --- a/checklists/waf_checklist.es.json +++ b/checklists/waf_checklist.es.json @@ -2554,6 +2554,438 @@ "text": "Utilizar plataformas, lenguajes, protocolos y marcos actualizados", "waf": "Seguridad" }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review Checklist", + "description": "Aplicación de las instrucciones del banco de pruebas de seguridad en la nube de Microsoft relacionadas con el almacenamiento", + "guid": "d237de14-3b16-4c21-b7aa-9b64604489a8", + "link": "https://learn.microsoft.com/security/benchmark/azure/baselines/storage-security-baseline", + "service": "Azure Storage", + "severity": "Medio", + "text": "Tenga en cuenta la \"Línea base de seguridad de Azure para el almacenamiento\"", + "waf": "Seguridad" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review Checklist", + "description": "De forma predeterminada, Azure Storage tiene una dirección IP pública y es accesible desde Internet. Los puntos de conexión privados permiten exponer de forma segura Azure Storage solo a los recursos de Azure Compute que necesitan acceso, lo que elimina la exposición a la Internet pública", + "guid": "f42d78e7-9d17-4a73-a22a-5a67e7a8ed4b", + "link": "https://learn.microsoft.com/azure/storage/common/storage-private-endpoints", + "service": "Azure Storage", + "severity": "Alto", + "text": "Considere la posibilidad de usar puntos de conexión privados para Azure Storage", + "waf": "Seguridad" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review Checklist", + "description": "Las cuentas de almacenamiento recién creadas se crean mediante el modelo de implementación de ARM, de modo que RBAC, etcétera de auditoría, estén habilitados. Asegúrese de que no haya cuentas de almacenamiento antiguas con el modelo de implementación clásico en una suscripción", + "guid": "30e37c3e-2971-41b2-963c-eee079b598de", + "link": "https://learn.microsoft.com/azure/virtual-machines/migration-classic-resource-manager-overview#migration-of-storage-accounts", + "service": "Azure Storage", + "severity": "Medio", + "text": "Asegúrese de que las cuentas de almacenamiento más antiguas no usen el \"modelo de implementación clásica\"", + "waf": "Seguridad" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review Checklist", + "description": "Aproveche Microsoft Defender para obtener información sobre actividades sospechosas y configuraciones incorrectas.", + "guid": "fc5972cd-4cd2-41b0-a803-7f5e6b4bfd3d", + "link": "https://learn.microsoft.com/azure/storage/common/azure-defender-storage-configure", + "service": "Azure Storage", + "severity": "Alto", + "text": "Habilitación de Microsoft Defender para todas las cuentas de almacenamiento", + "waf": "Seguridad" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review Checklist", + "description": "El mecanismo de eliminación temporal permite recuperar blobs eliminados accidentalmente.", + "guid": "503547c1-447e-4c66-828a-7100f1ce16dd", + "link": "https://learn.microsoft.com/azure/storage/blobs/soft-delete-blob-overview", + "service": "Azure Storage", + "severity": "Medio", + "text": "Habilitación de la \"eliminación temporal\" para blobs", + "waf": "Seguridad" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review Checklist", + "description": "Considere la posibilidad de deshabilitar selectivamente la \"eliminación temporal\" para determinados contenedores de blobs, por ejemplo, si la aplicación debe asegurarse de que la información eliminada se elimine inmediatamente, por ejemplo, por motivos de confidencialidad, privacidad o cumplimiento. ", + "guid": "3f1d5e87-2e52-4e36-81cc-58b4a4b1510e", + "link": "https://learn.microsoft.com/azure/storage/blobs/soft-delete-blob-enable", + "service": "Azure Storage", + "severity": "Medio", + "text": "Deshabilitación de la \"eliminación temporal\" para blobs", + "waf": "Seguridad" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review Checklist", + "description": "La eliminación temporal de contenedores permite recuperar un contenedor después de que se haya eliminado, por ejemplo, recuperarse de una operación de eliminación accidental.", + "guid": "43a58a9c-2289-4c3d-9b57-d0c655462f2a", + "link": "https://learn.microsoft.com/azure/storage/blobs/soft-delete-container-overview", + "service": "Azure Storage", + "severity": "Alto", + "text": "Habilitación de la \"eliminación temporal\" para contenedores", + "waf": "Seguridad" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review Checklist", + "description": "Considere la posibilidad de deshabilitar selectivamente la \"eliminación temporal\" para determinados contenedores de blobs, por ejemplo, si la aplicación debe asegurarse de que la información eliminada se elimine inmediatamente, por ejemplo, por motivos de confidencialidad, privacidad o cumplimiento. ", + "guid": "3e3453a3-c863-4964-ab65-2d6c15f51296", + "link": "https://learn.microsoft.com/azure/storage/blobs/soft-delete-container-enable", + "service": "Azure Storage", + "severity": "Medio", + "text": "Deshabilitar la \"eliminación temporal\" para contenedores", + "waf": "Seguridad" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review Checklist", + "description": "Evita la eliminación accidental de una cuenta de almacenamiento, obligando al usuario a quitar primero el bloqueo de eliminación, antes de la eliminación", + "guid": "5398e6de-d227-4dd1-92b0-6c21d7999a64", + "link": "https://learn.microsoft.com/azure/storage/common/lock-account-resource", + "service": "Azure Storage", + "severity": "Alto", + "text": "Habilitación de bloqueos de recursos en cuentas de almacenamiento", + "waf": "Seguridad" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review Checklist", + "description": "Considere la posibilidad de aplicar directivas de \"retención legal\" o \"retención basada en tiempo\" para los blobs, de modo que sea imposible eliminar el blob, el contenedor o la cuenta de almacenamiento. Tenga en cuenta que 'imposible' en realidad significa 'imposible'; una vez que una cuenta de almacenamiento contiene un blob inmutable, la única manera de \"deshacerse\" de esa cuenta de almacenamiento es cancelando la suscripción de Azure.", + "guid": "6f4389a8-f42c-478e-98c0-6a73a22a4956", + "link": "https://learn.microsoft.com/azure/storage/blobs/immutable-storage-overview", + "service": "Azure Storage", + "severity": "Alto", + "text": "Considere la posibilidad de blobs inmutables", + "waf": "Seguridad" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review Checklist", + "description": "Considere la posibilidad de deshabilitar el acceso HTTP/80 no protegido a la cuenta de almacenamiento, de modo que todas las transferencias de datos estén cifradas, protegidas contra la integridad y el servidor esté autenticado. ", + "guid": "e7a8dc4a-20e2-47c3-b297-11b1352beee0", + "link": "https://learn.microsoft.com/azure/storage/common/storage-require-secure-transfer", + "service": "Azure Storage", + "severity": "Alto", + "text": "Requerir HTTPS, es decir, deshabilitar el puerto 80 en la cuenta de almacenamiento", + "waf": "Seguridad" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review Checklist", + "description": "Al configurar un dominio personalizado (nombre de host) en una cuenta de almacenamiento, compruebe si necesita TLS/HTTPS; si es así, es posible que tenga que colocar Azure CDN delante de la cuenta de almacenamiento.", + "guid": "79b588de-fc49-472c-b3cd-21bf77036e5e", + "link": "https://learn.microsoft.com/azure/storage/blobs/storage-custom-domain-name", + "service": "Azure Storage", + "severity": "Alto", + "text": "Al aplicar HTTPS (deshabilitar HTTP), compruebe que no usa dominios personalizados (CNAME) para la cuenta de almacenamiento.", + "waf": "Seguridad" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review Checklist", + "description": "Requerir HTTPS cuando un cliente usa un token de SAS para acceder a los datos de blob ayuda a minimizar el riesgo de pérdida de credenciales.", + "guid": "6b4bed3d-5035-447c-8347-dc56028a71ff", + "link": "https://learn.microsoft.com/azure/storage/common/storage-sas-overview", + "service": "Azure Storage", + "severity": "Medio", + "text": "Limitar los tokens de firma de acceso compartido (SAS) solo a las conexiones HTTPS", + "waf": "Seguridad" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review Checklist", + "description": ". Al aplicar la versión más reciente de TLS, se rechazarán las solicitudes de los clientes que utilicen la versión anterior. ", + "graph": "resources | where type == 'microsoft.storage/storageaccounts' | extend compliant = (isnull(properties.minimumTlsVersion) == false and properties.minimumTlsVersion in ('TLS1_2', 'TLS1_3')) | distinct id, compliant", + "guid": "e12be569-a18f-4562-8d5d-ce151b9e7d55", + "link": "https://learn.microsoft.com/azure/storage/common/transport-layer-security-configure-minimum-version", + "service": "Azure Storage", + "severity": "Alto", + "text": "Aplicación de la versión más reciente de TLS para una cuenta de almacenamiento", + "waf": "Seguridad" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review Checklist", + "description": "Los tokens de identificador de Microsoft Entra deben favorecerse sobre las firmas de acceso compartido, siempre que sea posible", + "guid": "e1ce15dd-3f0d-45e7-92d4-1e3611cc57b4", + "link": "https://learn.microsoft.com/azure/storage/common/authorize-data-access", + "service": "Azure Storage", + "severity": "Alto", + "text": "Uso de tokens de identificador de Microsoft Entra para el acceso a blobs", + "waf": "Seguridad" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review Checklist", + "description": "Al asignar un rol a un usuario, grupo o aplicación, conceda a esa entidad de seguridad solo los permisos necesarios para que pueda realizar sus tareas. Limitar el acceso a los recursos ayuda a evitar el uso indebido no intencionado y malintencionado de los datos.", + "guid": "a4b1410d-4395-48a8-a228-9b3d6b57cfc6", + "service": "Azure Storage", + "severity": "Medio", + "text": "Privilegio mínimo en los permisos de IaM", + "waf": "Seguridad" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review Checklist", + "description": "Una SAS de delegación de usuarios está protegida con credenciales de Azure Active Directory (Azure AD) y también con los permisos especificados para la SAS. Una SAS de delegación de usuarios es análoga a una SAS de servicio en cuanto a su ámbito y función, pero ofrece ventajas de seguridad con respecto a la SAS de servicio. ", + "guid": "55461e1a-3e34-453a-9c86-39648b652d6c", + "link": "https://learn.microsoft.com/azure/storage/common/storage-sas-overview?toc=%2Fazure%2Fstorage%2Fblobs%2Ftoc.json#best-practices-when-using-sas", + "service": "Azure Storage", + "severity": "Alto", + "text": "Al usar SAS, prefiera \"SAS de delegación de usuarios\" en lugar de SAS basada en clave de cuenta de almacenamiento.", + "waf": "Seguridad" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review Checklist", + "description": "Las claves de la cuenta de almacenamiento ('claves compartidas') tienen muy pocas capacidades de auditoría. Si bien se puede monitorear quién o cuándo obtuvo una copia de las claves, una vez que las claves están en manos de varias personas, es imposible atribuir el uso a un usuario específico. Confiar únicamente en la autenticación de ID de Entra facilita la vinculación del acceso al almacenamiento de un usuario. ", + "graph": "resources | where type == 'microsoft.storage/storageaccounts' | extend allowSharedKeyAccess = tostring(properties.allowSharedKeyAccess) | extend compliant = (isnotempty(allowSharedKeyAccess) and allowSharedKeyAccess == 'false') | distinct id, compliant", + "guid": "15f51296-5398-4e6d-bd22-7dd142b06c21", + "link": "https://learn.microsoft.com/rest/api/storageservices/authorize-with-shared-key", + "service": "Azure Storage", + "severity": "Alto", + "text": "Considere la posibilidad de deshabilitar las claves de la cuenta de almacenamiento, de modo que solo se admita el acceso a Microsoft Entra ID (y SAS de delegación de usuarios).", + "waf": "Seguridad" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review Checklist", + "description": "Utilice los datos del registro de actividad para identificar \"cuándo\", \"quién\", \"qué\" y \"cómo\" se está viendo o cambiando la seguridad de la cuenta de almacenamiento (es decir, claves de cuenta de almacenamiento, directivas de acceso, etcétera).", + "guid": "d7999a64-6f43-489a-af42-c78e78c06a73", + "link": "https://learn.microsoft.com/azure/storage/blobs/blob-storage-monitoring-scenarios#audit-account-activity", + "service": "Azure Storage", + "severity": "Alto", + "text": "Considere la posibilidad de usar Azure Monitor para auditar las operaciones del plano de control en la cuenta de almacenamiento", + "waf": "Seguridad" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review Checklist", + "description": "Una política de caducidad de claves le permite establecer un recordatorio para la rotación de las claves de acceso de la cuenta. El recordatorio se muestra si ha transcurrido el intervalo especificado y las teclas aún no se han girado.", + "guid": "a22a4956-e7a8-4dc4-a20e-27c3e29711b1", + "link": "https://learn.microsoft.com/azure/storage/common/storage-account-keys-manage?tabs=azure-portal#create-a-key-expiration-policy", + "service": "Azure Storage", + "severity": "Medio", + "text": "Al usar claves de cuenta de almacenamiento, considere la posibilidad de habilitar una \"directiva de expiración de claves\"", + "waf": "Seguridad" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review Checklist", + "description": "Una directiva de expiración de SAS especifica un intervalo recomendado durante el cual la SAS es válida. Las directivas de caducidad de SAS se aplican a una SAS de servicio o a una SAS de cuenta. Cuando un usuario genera una SAS de servicio o una SAS de cuenta con un intervalo de validez mayor que el intervalo recomendado, verá una advertencia.", + "guid": "352beee0-79b5-488d-bfc4-972cd3cd21bf", + "link": "https://learn.microsoft.com/azure/storage/common/sas-expiration-policy", + "service": "Azure Storage", + "severity": "Medio", + "text": "Considere la posibilidad de configurar una directiva de expiración de SAS", + "waf": "Seguridad" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review Checklist", + "description": "Las directivas de acceso almacenadas ofrecen la opción de revocar los permisos de una SAS de servicio sin tener que volver a generar las claves de la cuenta de almacenamiento. ", + "guid": "77036e5e-6b4b-4ed3-b503-547c1347dc56", + "link": "https://learn.microsoft.com/rest/api/storageservices/define-stored-access-policy", + "service": "Azure Storage", + "severity": "Medio", + "text": "Considere la posibilidad de vincular SAS a una directiva de acceso almacenada", + "waf": "Seguridad" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review Checklist", + "guid": "028a71ff-e1ce-415d-b3f0-d5e772d41e36", + "link": "https://microsoft.github.io/code-with-engineering-playbook/continuous-integration/dev-sec-ops/secret-management/recipes/detect-secrets-ado/", + "service": "Azure Storage", + "severity": "Medio", + "text": "Considere la posibilidad de configurar el repositorio de código fuente de la aplicación para detectar cadenas de conexión protegidas y claves de cuenta de almacenamiento.", + "waf": "Seguridad" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review Checklist", + "description": "Lo ideal es que la aplicación use una identidad administrada para autenticarse en Azure Storage. Si eso no es posible, considere la posibilidad de tener la credencial de almacenamiento (cadena de conexión, clave de cuenta de almacenamiento, SAS, credencial de entidad de servicio) en Azure KeyVault o un servicio equivalente.", + "guid": "11cc57b4-a4b1-4410-b439-58a8c2289b3d", + "link": "https://learn.microsoft.com/azure/architecture/framework/security/design-storage-keys", + "service": "Azure Storage", + "severity": "Alto", + "text": "Considere la posibilidad de almacenar cadenas de conexión en Azure KeyVault (en escenarios en los que las identidades administradas no son posibles)", + "waf": "Seguridad" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review Checklist", + "description": "Utilice los tiempos de caducidad a corto plazo en una SAS de servicio SAS ad hoc o en una SAS de cuenta. De esta manera, incluso si una SAS se ve comprometida, solo es válida durante un corto período de tiempo. Esta práctica es especialmente importante si no puede hacer referencia a una política de acceso almacenada. Los tiempos de expiración a corto plazo también limitan la cantidad de datos que se pueden escribir en un blob al limitar el tiempo disponible para cargarlos en él.", + "guid": "27138b82-1102-4cac-9eae-01e6e842e52f", + "link": "https://learn.microsoft.com/rest/api/storageservices/delegate-access-with-shared-access-signature", + "service": "Azure Storage", + "severity": "Alto", + "text": "Esfuércese por períodos de validez cortos para SAS ad-hoc", + "waf": "Seguridad" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review Checklist", + "description": "Al crear una SAS, sea lo más específico y restrictivo posible. Prefiera una SAS para un solo recurso y operación en lugar de una SAS que proporciona un acceso mucho más amplio.", + "guid": "4721d928-c1b1-4cd5-81e5-4a29a9de399c", + "link": "https://learn.microsoft.com/rest/api/storageservices/delegate-access-with-shared-access-signature", + "service": "Azure Storage", + "severity": "Medio", + "text": "Aplicación de un ámbito limitado a una SAS", + "waf": "Seguridad" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review Checklist", + "description": "Una SAS puede incluir parámetros sobre las direcciones IP de cliente o los intervalos de direcciones que están autorizados a solicitar un recurso mediante la SAS. ", + "guid": "fd7b28dc-9355-4562-82bf-e4564b0d834a", + "link": "https://learn.microsoft.com/rest/api/storageservices/create-account-sas", + "service": "Azure Storage", + "severity": "Medio", + "text": "Considere la posibilidad de definir el ámbito de SAS a una dirección IP de cliente específica, siempre que sea posible", + "waf": "Seguridad" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review Checklist", + "description": "Una SAS no puede restringir la cantidad de datos que carga un cliente; Dado el modelo de precios de la cantidad de almacenamiento a lo largo del tiempo, podría tener sentido validar si los clientes cargaron contenidos malintencionados de gran tamaño.", + "guid": "348b263e-6dd6-4051-8a36-498f6dbad38e", + "service": "Azure Storage", + "severity": "Bajo", + "text": "Considere la posibilidad de comprobar los datos cargados, después de que los clientes hayan utilizado una SAS para cargar un archivo. ", + "waf": "Seguridad" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review Checklist", + "description": "Al acceder al almacenamiento de blobs a través de SFTP mediante una \"cuenta de usuario local\", no se aplican los controles RBAC \"habituales\". El acceso a blobs a través de NFS o REST puede ser más restrictivo que el acceso SFTP. Desafortunadamente, a partir de principios de 2023, los usuarios locales son la única forma de administración de identidades que actualmente es compatible con el punto de conexión SFTP", + "guid": "ad53cc7c-e1d7-4aaa-a357-1449ab8053d8", + "link": "https://learn.microsoft.com/azure/storage/blobs/secure-file-transfer-protocol-support#sftp-permission-model", + "service": "Azure Storage", + "severity": "Alto", + "text": "SFTP: Limite la cantidad de \"usuarios locales\" para el acceso SFTP y audite si el acceso es necesario a lo largo del tiempo.", + "waf": "Seguridad" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review Checklist", + "guid": "9f89dc7b-33be-42a1-a27f-7b9e91be1f38", + "link": "https://learn.microsoft.com/azure/storage/blobs/secure-file-transfer-protocol-known-issues#authentication-and-authorization", + "service": "Azure Storage", + "severity": "Medio", + "text": "SFTP: El punto de conexión SFTP no admite ACL similares a POSIX.", + "waf": "Seguridad" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review Checklist", + "description": "El almacenamiento es compatible con CORS (Cross-Origin Resource Sharing), es decir, una función HTTP que permite a las aplicaciones web de un dominio diferente aflojar la política del mismo origen. Al habilitar CORS, mantenga CorsRules con el mínimo privilegio.", + "guid": "cef39812-bd46-43cb-aac8-ac199ebb91a3", + "link": "https://learn.microsoft.com/rest/api/storageservices/cross-origin-resource-sharing--cors--support-for-the-azure-storage-services", + "service": "Azure Storage", + "severity": "Alto", + "text": "Evite las políticas de CORS demasiado amplias", + "waf": "Seguridad" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review Checklist", + "description": "Los datos en reposo siempre se cifran en el lado del servidor y, además, también pueden estar cifrados en el lado del cliente. El cifrado del lado del servidor puede producirse mediante una clave administrada por la plataforma (valor predeterminado) o una clave administrada por el cliente. El cifrado del lado cliente puede producirse haciendo que el cliente proporcione una clave de cifrado y descifrado por blob al almacenamiento de Azure o controlando completamente el cifrado en el lado cliente. por lo tanto, no depende en absoluto de Azure Storage para obtener garantías de confidencialidad.", + "guid": "3d90cae2-cc88-4137-86f7-c0cbafe61464", + "link": "https://learn.microsoft.com/azure/storage/common/storage-service-encryption", + "service": "Azure Storage", + "severity": "Alto", + "text": "Determine cómo se deben cifrar los datos en reposo. Comprender el modelo de subprocesos para los datos.", + "waf": "Seguridad" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review Checklist", + "guid": "8dd457e9-2713-48b8-8110-2cac6eae01e6", + "link": "https://learn.microsoft.com/azure/storage/common/customer-managed-keys-overview?toc=%2Fazure%2Fstorage%2Fblobs%2Ftoc.json&bc=%2Fazure%2Fstorage%2Fblobs%2Fbreadcrumb%2Ftoc.json", + "service": "Azure Storage", + "severity": "Medio", + "text": "Determine cuál o si se debe utilizar el cifrado de la plataforma.", + "waf": "Seguridad" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review Checklist", + "guid": "e842e52f-4721-4d92-ac1b-1cd521e54a29", + "link": "https://learn.microsoft.com/azure/storage/blobs/encryption-customer-provided-keys", + "service": "Azure Storage", + "severity": "Medio", + "text": "Determine qué cifrado del lado del cliente se debe usar, si se debe usar.", + "waf": "Seguridad" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review Checklist", + "description": "Aproveche el Explorador de Resource Graph (resources | where type == 'microsoft.storage/storageaccounts' | where properties['allowBlobPublicAccess'] == true) para buscar cuentas de almacenamiento que permitan el acceso anónimo a blobs.", + "graph": "resources | where type == 'microsoft.storage/storageaccounts' | extend compliant = (properties.allowBlobPublicAccess == 'false') | distinct id, compliant", + "guid": "659ae558-b937-4d49-a5e1-112dbd7ba012", + "link": "https://learn.microsoft.com/azure/storage/blobs/anonymous-read-access-configure?tabs=portal#allow-or-disallow-public-read-access-for-a-storage-account", + "service": "Azure Storage", + "severity": "Alto", + "text": "Considere si es necesario el acceso anónimo de blob público o si se puede deshabilitar para determinadas cuentas de almacenamiento. ", + "waf": "Seguridad" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review Checklist", + "guid": "cb8eb8c0-aa62-4a25-a495-6eaa8dc4a243", + "link": "https://learn.microsoft.com/azure/storage/common/storage-account-upgrade?tabs=azure-portal", + "service": "Azure Storage", + "severity": "Alto", + "text": "Aproveche un tipo de cuenta storagev2 para mejorar el rendimiento y la confiabilidad", + "waf": "Fiabilidad" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review Checklist", + "guid": "e05bbe20-9d49-4fda-9777-8424d116785c", + "link": "https://learn.microsoft.com/azure/storage/common/storage-redundancy", + "service": "Azure Storage", + "severity": "Alto", + "text": "Aproveche el almacenamiento GRS, ZRS o GZRS para obtener la máxima disponibilidad", + "waf": "Fiabilidad" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review Checklist", + "guid": "2fa56c56-ad48-4408-be72-734c486ba280", + "link": "https://learn.microsoft.com/azure/storage/common/storage-disaster-recovery-guidance", + "service": "Azure Storage", + "severity": "Medio", + "text": "Para la operación de escritura después de la conmutación por error, use la conmutación por error administrada por el cliente ", + "waf": "Fiabilidad" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review Checklist", + "guid": "dc0590cf-65de-48e1-909c-cbd579266bcc", + "link": "https://learn.microsoft.com/azure/storage/common/storage-disaster-recovery-guidance#microsoft-managed-failover", + "service": "Azure Storage", + "severity": "Medio", + "text": "Descripción de los detalles de la conmutación por error administrada por Microsoft", + "waf": "Fiabilidad" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review Checklist", + "guid": "a274faa1-abfe-49d5-9d04-c3c4919cb1b3", + "link": "https://learn.microsoft.com/azure/storage/blobs/soft-delete-blob-enable?tabs=azure-portal", + "service": "Azure Storage", + "severity": "Medio", + "text": "Habilitar eliminación temporal", + "waf": "Fiabilidad" + }, { "arm-service": "Microsoft.CognitiveServices/accounts", "checklist": "Azure OpenAI Review", @@ -8990,7 +9422,7 @@ ], "metadata": { "name": "WAF checklist", - "timestamp": "August 08, 2024" + "timestamp": "August 12, 2024" }, "severities": [ { diff --git a/checklists/waf_checklist.ja.json b/checklists/waf_checklist.ja.json index 000155a97..20025db74 100644 --- a/checklists/waf_checklist.ja.json +++ b/checklists/waf_checklist.ja.json @@ -8078,6 +8078,438 @@ "text": "Azure DevOps または GitHub を活用して CI/CD を合理化し、ロジック アプリ コードを保護", "waf": "オペレーションズ" }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review Checklist", + "description": "ストレージに関連する Microsoft クラウド セキュリティ ベンチマークのガイダンスを適用する", + "guid": "d237de14-3b16-4c21-b7aa-9b64604489a8", + "link": "https://learn.microsoft.com/security/benchmark/azure/baselines/storage-security-baseline", + "service": "Azure Storage", + "severity": "中程度", + "text": "「ストレージの Azure セキュリティ ベースライン」を検討する", + "waf": "安全" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review Checklist", + "description": "Azure Storage は、既定ではパブリック IP アドレスを持ち、インターネットからアクセスできます。プライベート エンドポイントを使用すると、アクセスが必要な Azure コンピューティング リソースのみに Azure Storage を安全に公開できるため、パブリック インターネットへの露出がなくなります", + "guid": "f42d78e7-9d17-4a73-a22a-5a67e7a8ed4b", + "link": "https://learn.microsoft.com/azure/storage/common/storage-private-endpoints", + "service": "Azure Storage", + "severity": "高い", + "text": "Azure Storage のプライベート エンドポイントの使用を検討する", + "waf": "安全" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review Checklist", + "description": "新しく作成されたストレージ アカウントは ARM デプロイ モデルを使用して作成されるため、RBAC、監査などがすべて有効になります。サブスクリプションにクラシック デプロイ モデルの古いストレージ アカウントがないことを確認します", + "guid": "30e37c3e-2971-41b2-963c-eee079b598de", + "link": "https://learn.microsoft.com/azure/virtual-machines/migration-classic-resource-manager-overview#migration-of-storage-accounts", + "service": "Azure Storage", + "severity": "中程度", + "text": "古いストレージ アカウントが \"クラシック デプロイ モデル\" を使用していないことを確認する", + "waf": "安全" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review Checklist", + "description": "Microsoft Defender を活用して、不審なアクティビティや構成ミスについて学習します。", + "guid": "fc5972cd-4cd2-41b0-a803-7f5e6b4bfd3d", + "link": "https://learn.microsoft.com/azure/storage/common/azure-defender-storage-configure", + "service": "Azure Storage", + "severity": "高い", + "text": "すべてのストレージ アカウントで Microsoft Defender を有効にする", + "waf": "安全" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review Checklist", + "description": "論理的な削除メカニズムにより、誤って削除されたブロブを回復できます。", + "guid": "503547c1-447e-4c66-828a-7100f1ce16dd", + "link": "https://learn.microsoft.com/azure/storage/blobs/soft-delete-blob-overview", + "service": "Azure Storage", + "severity": "中程度", + "text": "BLOB の '論理的な削除' を有効にする", + "waf": "安全" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review Checklist", + "description": "たとえば、機密性、プライバシー、コンプライアンス上の理由など、削除された情報をすぐに削除するようにアプリケーションで確認する必要がある場合など、特定の BLOB コンテナに対して「論理的な削除」を選択的に無効にすることを検討してください。", + "guid": "3f1d5e87-2e52-4e36-81cc-58b4a4b1510e", + "link": "https://learn.microsoft.com/azure/storage/blobs/soft-delete-blob-enable", + "service": "Azure Storage", + "severity": "中程度", + "text": "BLOB の '論理的な削除' を無効にする", + "waf": "安全" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review Checklist", + "description": "コンテナの論理的な削除を使用すると、コンテナが削除された後に、たとえば、誤って削除した操作から回復するなどして、コンテナを回復できます。", + "guid": "43a58a9c-2289-4c3d-9b57-d0c655462f2a", + "link": "https://learn.microsoft.com/azure/storage/blobs/soft-delete-container-overview", + "service": "Azure Storage", + "severity": "高い", + "text": "コンテナの「論理的な削除」を有効にする", + "waf": "安全" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review Checklist", + "description": "たとえば、機密性、プライバシー、コンプライアンス上の理由など、削除された情報をすぐに削除するようにアプリケーションで確認する必要がある場合など、特定の BLOB コンテナに対して「論理的な削除」を選択的に無効にすることを検討してください。", + "guid": "3e3453a3-c863-4964-ab65-2d6c15f51296", + "link": "https://learn.microsoft.com/azure/storage/blobs/soft-delete-container-enable", + "service": "Azure Storage", + "severity": "中程度", + "text": "コンテナの「論理的な削除」を無効にする", + "waf": "安全" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review Checklist", + "description": "削除する前に、ユーザーに削除ロックを最初に解除するように強制することで、ストレージ アカウントが誤って削除されるのを防ぎます", + "guid": "5398e6de-d227-4dd1-92b0-6c21d7999a64", + "link": "https://learn.microsoft.com/azure/storage/common/lock-account-resource", + "service": "Azure Storage", + "severity": "高い", + "text": "ストレージ アカウントでのリソース ロックの有効化", + "waf": "安全" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review Checklist", + "description": "BLOB の \"訴訟ホールド\" または \"時間ベースの保持\" ポリシーを検討して、BLOB、コンテナー、またはストレージ アカウントを削除できないようにします。「不可能」は実際には「不可能」を意味することに注意してください。ストレージ アカウントに不変 BLOB が含まれている場合、そのストレージ アカウントを \"削除\" する唯一の方法は、Azure サブスクリプションをキャンセルすることです。", + "guid": "6f4389a8-f42c-478e-98c0-6a73a22a4956", + "link": "https://learn.microsoft.com/azure/storage/blobs/immutable-storage-overview", + "service": "Azure Storage", + "severity": "高い", + "text": "不変ブロブについて考える", + "waf": "安全" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review Checklist", + "description": "ストレージ アカウントへの保護されていない HTTP/80 アクセスを無効にして、すべてのデータ転送が暗号化され、整合性が保護され、サーバーが認証されるようにすることを検討してください。", + "guid": "e7a8dc4a-20e2-47c3-b297-11b1352beee0", + "link": "https://learn.microsoft.com/azure/storage/common/storage-require-secure-transfer", + "service": "Azure Storage", + "severity": "高い", + "text": "HTTPS を要求する (つまり、ストレージ アカウントのポート 80 を無効にする)", + "waf": "安全" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review Checklist", + "description": "ストレージ アカウントでカスタム ドメイン (ホスト名) を構成する場合は、TLS/HTTPS が必要かどうかを確認します。その場合は、ストレージ アカウントの前に Azure CDN を配置する必要がある場合があります。", + "guid": "79b588de-fc49-472c-b3cd-21bf77036e5e", + "link": "https://learn.microsoft.com/azure/storage/blobs/storage-custom-domain-name", + "service": "Azure Storage", + "severity": "高い", + "text": "HTTPS を適用する (HTTP を無効にする) 場合は、ストレージ アカウントにカスタム ドメイン (CNAME) を使用していないことを確認します。", + "waf": "安全" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review Checklist", + "description": "クライアントが SAS トークンを使用して BLOB データにアクセスするときに HTTPS を要求すると、資格情報の損失リスクを最小限に抑えるのに役立ちます。", + "guid": "6b4bed3d-5035-447c-8347-dc56028a71ff", + "link": "https://learn.microsoft.com/azure/storage/common/storage-sas-overview", + "service": "Azure Storage", + "severity": "中程度", + "text": "Shared Access Signature (SAS) トークンを HTTPS 接続のみに制限する", + "waf": "安全" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review Checklist", + "description": ".最新の TLS バージョンを適用すると、古いバージョンを使用しているクライアントからの要求が拒否されます。", + "graph": "resources | where type == 'microsoft.storage/storageaccounts' | extend compliant = (isnull(properties.minimumTlsVersion) == false and properties.minimumTlsVersion in ('TLS1_2', 'TLS1_3')) | distinct id, compliant", + "guid": "e12be569-a18f-4562-8d5d-ce151b9e7d55", + "link": "https://learn.microsoft.com/azure/storage/common/transport-layer-security-configure-minimum-version", + "service": "Azure Storage", + "severity": "高い", + "text": "ストレージ アカウントに最新の TLS バージョンを適用する", + "waf": "安全" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review Checklist", + "description": "Microsoft Entra ID トークンは、可能な限り、共有アクセス署名よりも優先する必要があります", + "guid": "e1ce15dd-3f0d-45e7-92d4-1e3611cc57b4", + "link": "https://learn.microsoft.com/azure/storage/common/authorize-data-access", + "service": "Azure Storage", + "severity": "高い", + "text": "BLOB アクセスに Microsoft Entra ID トークンを使用する", + "waf": "安全" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review Checklist", + "description": "ユーザー、グループ、またはアプリケーションにロールを割り当てる場合は、タスクの実行に必要なアクセス許可のみをそのセキュリティ プリンシパルに付与します。リソースへのアクセスを制限することで、意図しないデータの誤用と悪意のある誤用の両方を防ぐことができます。", + "guid": "a4b1410d-4395-48a8-a228-9b3d6b57cfc6", + "service": "Azure Storage", + "severity": "中程度", + "text": "IaM アクセス許可の最小特権", + "waf": "安全" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review Checklist", + "description": "ユーザー委任 SAS は、Azure Active Directory (Azure AD) 資格情報と、SAS に指定されたアクセス許可によって保護されます。ユーザー委任 SAS は、そのスコープと機能の点でサービス SAS に似ていますが、サービス SAS よりもセキュリティ上の利点があります。", + "guid": "55461e1a-3e34-453a-9c86-39648b652d6c", + "link": "https://learn.microsoft.com/azure/storage/common/storage-sas-overview?toc=%2Fazure%2Fstorage%2Fblobs%2Ftoc.json#best-practices-when-using-sas", + "service": "Azure Storage", + "severity": "高い", + "text": "SAS を使用する場合は、ストレージ アカウント キー ベースの SAS よりも \"ユーザー委任 SAS\" を優先します。", + "waf": "安全" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review Checklist", + "description": "ストレージ アカウント キー (\"共有キー\") には、監査機能がほとんどありません。誰が/いつキーのコピーをフェッチしたかを監視することはできますが、キーが複数の人の手に渡ると、特定のユーザーに使用状況を帰属させることはできなくなります。Entra ID認証のみに依存すると、ストレージアクセスをユーザーに結び付けることが容易になります。", + "graph": "resources | where type == 'microsoft.storage/storageaccounts' | extend allowSharedKeyAccess = tostring(properties.allowSharedKeyAccess) | extend compliant = (isnotempty(allowSharedKeyAccess) and allowSharedKeyAccess == 'false') | distinct id, compliant", + "guid": "15f51296-5398-4e6d-bd22-7dd142b06c21", + "link": "https://learn.microsoft.com/rest/api/storageservices/authorize-with-shared-key", + "service": "Azure Storage", + "severity": "高い", + "text": "Microsoft Entra ID アクセス (およびユーザー委任 SAS) のみがサポートされるように、ストレージ アカウント キーを無効にすることを検討してください。", + "waf": "安全" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review Checklist", + "description": "アクティビティ ログ データを使用して、ストレージ アカウントのセキュリティが (ストレージ アカウント キー、アクセス ポリシーなど) 表示または変更されているのは「いつ」、「誰が」、「何を」、「どのように」特定します。", + "guid": "d7999a64-6f43-489a-af42-c78e78c06a73", + "link": "https://learn.microsoft.com/azure/storage/blobs/blob-storage-monitoring-scenarios#audit-account-activity", + "service": "Azure Storage", + "severity": "高い", + "text": "Azure Monitor を使用して、ストレージ アカウントでのコントロール プレーン操作を監査することを検討してください", + "waf": "安全" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review Checklist", + "description": "キーの有効期限ポリシーを使用すると、アカウント アクセス キーのローテーションのリマインダーを設定できます。リマインダーは、指定した間隔が経過し、キーがまだローテーションされていない場合に表示されます。", + "guid": "a22a4956-e7a8-4dc4-a20e-27c3e29711b1", + "link": "https://learn.microsoft.com/azure/storage/common/storage-account-keys-manage?tabs=azure-portal#create-a-key-expiration-policy", + "service": "Azure Storage", + "severity": "中程度", + "text": "ストレージ アカウント キーを使用する場合は、\"キーの有効期限ポリシー\" を有効にすることを検討してください", + "waf": "安全" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review Checklist", + "description": "SAS 有効期限ポリシーは、SAS が有効である推奨間隔を指定します。SAS 有効期限ポリシーは、サービス SAS またはアカウント SAS に適用されます。ユーザーが、推奨間隔よりも長い有効期間でサービス SAS またはアカウント SAS を生成すると、警告が表示されます。", + "guid": "352beee0-79b5-488d-bfc4-972cd3cd21bf", + "link": "https://learn.microsoft.com/azure/storage/common/sas-expiration-policy", + "service": "Azure Storage", + "severity": "中程度", + "text": "SAS 有効期限ポリシーの構成を検討する", + "waf": "安全" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review Checklist", + "description": "保存されているアクセス ポリシーでは、ストレージ アカウント キーを再生成しなくても、サービス SAS のアクセス許可を取り消すことができます。", + "guid": "77036e5e-6b4b-4ed3-b503-547c1347dc56", + "link": "https://learn.microsoft.com/rest/api/storageservices/define-stored-access-policy", + "service": "Azure Storage", + "severity": "中程度", + "text": "SASを保存されたアクセスポリシーにリンクすることを検討する", + "waf": "安全" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review Checklist", + "guid": "028a71ff-e1ce-415d-b3f0-d5e772d41e36", + "link": "https://microsoft.github.io/code-with-engineering-playbook/continuous-integration/dev-sec-ops/secret-management/recipes/detect-secrets-ado/", + "service": "Azure Storage", + "severity": "中程度", + "text": "チェックインされた接続文字列とストレージ アカウント キーを検出するように、アプリケーションのソース コード リポジトリを構成することを検討してください。", + "waf": "安全" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review Checklist", + "description": "理想的には、アプリケーションでマネージド ID を使用して Azure Storage に対する認証を行う必要があります。それが不可能な場合は、ストレージ資格情報 (接続文字列、ストレージ アカウント キー、SAS、サービス プリンシパル資格情報) を Azure KeyVault または同等のサービスに持つことを検討してください。", + "guid": "11cc57b4-a4b1-4410-b439-58a8c2289b3d", + "link": "https://learn.microsoft.com/azure/architecture/framework/security/design-storage-keys", + "service": "Azure Storage", + "severity": "高い", + "text": "Azure KeyVault に接続文字列を格納することを検討してください (マネージド ID が不可能なシナリオの場合)", + "waf": "安全" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review Checklist", + "description": "アドホック SAS サービス SAS またはアカウント SAS で短期的な有効期限を使用します。このように、SASが侵害された場合でも、SASは短時間しか有効ではありません。この方法は、保存されたアクセス ポリシーを参照できない場合に特に重要です。有効期限が近いと、BLOB にアップロードできる時間を制限することで、BLOB に書き込むことができるデータの量も制限されます。", + "guid": "27138b82-1102-4cac-9eae-01e6e842e52f", + "link": "https://learn.microsoft.com/rest/api/storageservices/delegate-access-with-shared-access-signature", + "service": "Azure Storage", + "severity": "高い", + "text": "アドホックSASの有効期間を短くするよう努める", + "waf": "安全" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review Checklist", + "description": "SASを作成するときは、できるだけ具体的で制限的にしてください。1 つのリソースと操作には、より広範なアクセスを提供する SAS よりも SAS を優先します。", + "guid": "4721d928-c1b1-4cd5-81e5-4a29a9de399c", + "link": "https://learn.microsoft.com/rest/api/storageservices/delegate-access-with-shared-access-signature", + "service": "Azure Storage", + "severity": "中程度", + "text": "SAS に狭いスコープを適用する", + "waf": "安全" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review Checklist", + "description": "SAS には、SAS を使用してリソースを要求する権限を与えられたクライアントの IP アドレスまたはアドレス範囲のパラメーターを含めることができます。", + "guid": "fd7b28dc-9355-4562-82bf-e4564b0d834a", + "link": "https://learn.microsoft.com/rest/api/storageservices/create-account-sas", + "service": "Azure Storage", + "severity": "中程度", + "text": "可能な限り、SAS のスコープを特定のクライアント IP アドレスに設定することを検討してください", + "waf": "安全" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review Checklist", + "description": "SAS は、クライアントがアップロードするデータの量を制限することはできません。時間の経過に伴うストレージ量の価格設定モデルを考えると、クライアントが悪意を持って大きなコンテンツをアップロードしたかどうかを検証することは理にかなっているかもしれません。", + "guid": "348b263e-6dd6-4051-8a36-498f6dbad38e", + "service": "Azure Storage", + "severity": "低い", + "text": "クライアントが SAS を使用してファイルをアップロードした後、アップロードされたデータを確認することを検討してください。", + "waf": "安全" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review Checklist", + "description": "「ローカル ユーザー アカウント」を使用して SFTP 経由で BLOB ストレージにアクセスする場合、「通常の」RBAC コントロールは適用されません。NFS または REST 経由の BLOB アクセスは、SFTP アクセスよりも制限が厳しい場合があります。残念ながら、2023 年初頭の時点で、SFTP エンドポイントで現在サポートされている ID 管理の形式は、ローカル ユーザーのみです", + "guid": "ad53cc7c-e1d7-4aaa-a357-1449ab8053d8", + "link": "https://learn.microsoft.com/azure/storage/blobs/secure-file-transfer-protocol-support#sftp-permission-model", + "service": "Azure Storage", + "severity": "高い", + "text": "SFTP: SFTP アクセスの「ローカル ユーザー」の数を制限し、アクセスが必要かどうかを経時的に監査します。", + "waf": "安全" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review Checklist", + "guid": "9f89dc7b-33be-42a1-a27f-7b9e91be1f38", + "link": "https://learn.microsoft.com/azure/storage/blobs/secure-file-transfer-protocol-known-issues#authentication-and-authorization", + "service": "Azure Storage", + "severity": "中程度", + "text": "SFTP: SFTP エンドポイントは POSIX のような ACL をサポートしていません。", + "waf": "安全" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review Checklist", + "description": "ストレージは、CORS(Cross-Origin Resource Sharing)、つまり、異なるドメインのWebアプリが同一生成元ポリシーを緩和できるようにするHTTP機能をサポートしています。CORS を有効にするときは、CorsRules を最小限の特権に保ちます。", + "guid": "cef39812-bd46-43cb-aac8-ac199ebb91a3", + "link": "https://learn.microsoft.com/rest/api/storageservices/cross-origin-resource-sharing--cors--support-for-the-azure-storage-services", + "service": "Azure Storage", + "severity": "高い", + "text": "過度に広範なCORSポリシーを避ける", + "waf": "安全" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review Checklist", + "description": "保存データは常にサーバー側で暗号化され、さらにクライアント側でも暗号化される場合があります。サーバー側の暗号化は、プラットフォーム管理キー (デフォルト) またはカスタマー管理キーを使用して行われる場合があります。クライアント側の暗号化は、クライアントが BLOB ごとに暗号化/暗号化解除キーを Azure ストレージに提供するか、クライアント側で暗号化を完全に処理することによって行われます。したがって、機密性の保証については Azure Storage にまったく依存しません。", + "guid": "3d90cae2-cc88-4137-86f7-c0cbafe61464", + "link": "https://learn.microsoft.com/azure/storage/common/storage-service-encryption", + "service": "Azure Storage", + "severity": "高い", + "text": "保存データの暗号化方法を決定します。データのスレッドモデルを理解する。", + "waf": "安全" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review Checklist", + "guid": "8dd457e9-2713-48b8-8110-2cac6eae01e6", + "link": "https://learn.microsoft.com/azure/storage/common/customer-managed-keys-overview?toc=%2Fazure%2Fstorage%2Fblobs%2Ftoc.json&bc=%2Fazure%2Fstorage%2Fblobs%2Fbreadcrumb%2Ftoc.json", + "service": "Azure Storage", + "severity": "中程度", + "text": "プラットフォームの暗号化を使用するかどうかを決定します。", + "waf": "安全" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review Checklist", + "guid": "e842e52f-4721-4d92-ac1b-1cd521e54a29", + "link": "https://learn.microsoft.com/azure/storage/blobs/encryption-customer-provided-keys", + "service": "Azure Storage", + "severity": "中程度", + "text": "クライアント側の暗号化を使用するかどうかを決定します。", + "waf": "安全" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review Checklist", + "description": "Resource Graph エクスプローラー (resources | where type == 'microsoft.storage/storageaccounts' | where properties['allowBlobPublicAccess'] == true) を利用して、匿名 BLOB アクセスを許可するストレージ アカウントを見つけます。", + "graph": "resources | where type == 'microsoft.storage/storageaccounts' | extend compliant = (properties.allowBlobPublicAccess == 'false') | distinct id, compliant", + "guid": "659ae558-b937-4d49-a5e1-112dbd7ba012", + "link": "https://learn.microsoft.com/azure/storage/blobs/anonymous-read-access-configure?tabs=portal#allow-or-disallow-public-read-access-for-a-storage-account", + "service": "Azure Storage", + "severity": "高い", + "text": "パブリック BLOB の匿名アクセスが必要かどうか、または特定のストレージ アカウントに対して無効にできるかどうかを検討します。", + "waf": "安全" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review Checklist", + "guid": "cb8eb8c0-aa62-4a25-a495-6eaa8dc4a243", + "link": "https://learn.microsoft.com/azure/storage/common/storage-account-upgrade?tabs=azure-portal", + "service": "Azure Storage", + "severity": "高い", + "text": "storagev2 アカウントタイプを活用して、パフォーマンスと信頼性を向上させます", + "waf": "確実" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review Checklist", + "guid": "e05bbe20-9d49-4fda-9777-8424d116785c", + "link": "https://learn.microsoft.com/azure/storage/common/storage-redundancy", + "service": "Azure Storage", + "severity": "高い", + "text": "GRS、ZRS、またはGZRSストレージを活用して、最高の可用性を実現", + "waf": "確実" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review Checklist", + "guid": "2fa56c56-ad48-4408-be72-734c486ba280", + "link": "https://learn.microsoft.com/azure/storage/common/storage-disaster-recovery-guidance", + "service": "Azure Storage", + "severity": "中程度", + "text": "フェールオーバー後の書き込み操作には、顧客管理のフェールオーバーを使用します", + "waf": "確実" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review Checklist", + "guid": "dc0590cf-65de-48e1-909c-cbd579266bcc", + "link": "https://learn.microsoft.com/azure/storage/common/storage-disaster-recovery-guidance#microsoft-managed-failover", + "service": "Azure Storage", + "severity": "中程度", + "text": "Microsoft マネージド フェールオーバーの詳細を理解する", + "waf": "確実" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review Checklist", + "guid": "a274faa1-abfe-49d5-9d04-c3c4919cb1b3", + "link": "https://learn.microsoft.com/azure/storage/blobs/soft-delete-blob-enable?tabs=azure-portal", + "service": "Azure Storage", + "severity": "中程度", + "text": "ソフト削除を有効にする", + "waf": "確実" + }, { "arm-service": "microsoft.network/frontdoors", "checklist": "Azure Application Delivery Networking", @@ -8990,7 +9422,7 @@ ], "metadata": { "name": "WAF checklist", - "timestamp": "August 08, 2024" + "timestamp": "August 12, 2024" }, "severities": [ { diff --git a/checklists/waf_checklist.ko.json b/checklists/waf_checklist.ko.json index 83be3434f..7f2dce610 100644 --- a/checklists/waf_checklist.ko.json +++ b/checklists/waf_checklist.ko.json @@ -3863,6 +3863,438 @@ "text": "Azure Cognitive Search 인덱스를 백업 및 복원합니다. 이 샘플 코드를 사용하여 인덱스 정의 및 스냅샷을 일련의 Json 파일에 백업합니다", "waf": "신뢰도" }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review Checklist", + "description": "스토리지와 관련된 Microsoft 클라우드 보안 벤치마크의 지침 적용", + "guid": "d237de14-3b16-4c21-b7aa-9b64604489a8", + "link": "https://learn.microsoft.com/security/benchmark/azure/baselines/storage-security-baseline", + "service": "Azure Storage", + "severity": "보통", + "text": "'스토리지에 대한 Azure 보안 기준'을 고려합니다.", + "waf": "안전" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review Checklist", + "description": "Azure Storage는 기본적으로 공용 IP 주소를 가지며 인터넷에 연결할 수 있습니다. 프라이빗 엔드포인트를 사용하면 액세스가 필요한 Azure Compute 리소스에만 Azure Storage를 안전하게 노출할 수 있으므로 공용 인터넷에 노출되지 않습니다", + "guid": "f42d78e7-9d17-4a73-a22a-5a67e7a8ed4b", + "link": "https://learn.microsoft.com/azure/storage/common/storage-private-endpoints", + "service": "Azure Storage", + "severity": "높다", + "text": "Azure Storage에 프라이빗 엔드포인트를 사용하는 것이 좋습니다.", + "waf": "안전" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review Checklist", + "description": "새로 만든 스토리지 계정은 ARM 배포 모델을 사용하여 생성되므로 RBAC, 감사 등이 모두 활성화됩니다. 구독에 클래식 배포 모델을 사용하는 이전 저장소 계정이 없는지 확인합니다.", + "guid": "30e37c3e-2971-41b2-963c-eee079b598de", + "link": "https://learn.microsoft.com/azure/virtual-machines/migration-classic-resource-manager-overview#migration-of-storage-accounts", + "service": "Azure Storage", + "severity": "보통", + "text": "이전 스토리지 계정이 '클래식 배포 모델'을 사용하지 않는지 확인", + "waf": "안전" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review Checklist", + "description": "Microsoft Defender를 활용하여 의심스러운 활동 및 잘못된 구성에 대해 알아보세요.", + "guid": "fc5972cd-4cd2-41b0-a803-7f5e6b4bfd3d", + "link": "https://learn.microsoft.com/azure/storage/common/azure-defender-storage-configure", + "service": "Azure Storage", + "severity": "높다", + "text": "모든 스토리지 계정에 대해 Microsoft Defender 사용", + "waf": "안전" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review Checklist", + "description": "일시 삭제 메커니즘을 사용하면 실수로 삭제된 Blob을 복구할 수 있습니다.", + "guid": "503547c1-447e-4c66-828a-7100f1ce16dd", + "link": "https://learn.microsoft.com/azure/storage/blobs/soft-delete-blob-overview", + "service": "Azure Storage", + "severity": "보통", + "text": "Blob에 대해 '일시 삭제' 사용Enable 'soft delete' for blobs", + "waf": "안전" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review Checklist", + "description": "예를 들어 애플리케이션이 기밀성, 개인 정보 보호 또는 규정 준수를 위해 삭제된 정보가 즉시 삭제되도록 해야 하는 경우와 같이 특정 Blob 컨테이너에 대해 '일시 삭제'를 선택적으로 사용하지 않도록 설정하는 것이 좋습니다. ", + "guid": "3f1d5e87-2e52-4e36-81cc-58b4a4b1510e", + "link": "https://learn.microsoft.com/azure/storage/blobs/soft-delete-blob-enable", + "service": "Azure Storage", + "severity": "보통", + "text": "Blob에 대해 '일시 삭제' 사용 안 함", + "waf": "안전" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review Checklist", + "description": "컨테이너에 대한 일시 삭제를 사용하면 컨테이너가 삭제된 후 복구할 수 있습니다(예: 실수로 삭제한 작업에서 복구).", + "guid": "43a58a9c-2289-4c3d-9b57-d0c655462f2a", + "link": "https://learn.microsoft.com/azure/storage/blobs/soft-delete-container-overview", + "service": "Azure Storage", + "severity": "높다", + "text": "컨테이너에 대해 '일시 삭제' 사용Enable 'soft delete' for containers", + "waf": "안전" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review Checklist", + "description": "예를 들어 애플리케이션이 기밀성, 개인 정보 보호 또는 규정 준수를 위해 삭제된 정보가 즉시 삭제되도록 해야 하는 경우와 같이 특정 Blob 컨테이너에 대해 '일시 삭제'를 선택적으로 사용하지 않도록 설정하는 것이 좋습니다. ", + "guid": "3e3453a3-c863-4964-ab65-2d6c15f51296", + "link": "https://learn.microsoft.com/azure/storage/blobs/soft-delete-container-enable", + "service": "Azure Storage", + "severity": "보통", + "text": "컨테이너에 대해 '일시 삭제' 사용 안 함", + "waf": "안전" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review Checklist", + "description": "사용자가 삭제하기 전에 먼저 삭제 잠금을 제거하도록 강제하여 스토리지 계정의 우발적인 삭제를 방지합니다.", + "guid": "5398e6de-d227-4dd1-92b0-6c21d7999a64", + "link": "https://learn.microsoft.com/azure/storage/common/lock-account-resource", + "service": "Azure Storage", + "severity": "높다", + "text": "스토리지 계정에 대한 리소스 잠금 사용Enable resource locks on storage accounts", + "waf": "안전" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review Checklist", + "description": "Blob에 대한 '법적 보존' 또는 '시간 기반 보존' 정책을 고려하면 Blob, 컨테이너 또는 스토리지 계정을 삭제할 수 없습니다. '불가능한'은 실제로 '불가능한'을 의미합니다. 스토리지 계정에 변경할 수 없는 Blob이 포함되면 해당 스토리지 계정을 '제거'하는 유일한 방법은 Azure 구독을 취소하는 것입니다.", + "guid": "6f4389a8-f42c-478e-98c0-6a73a22a4956", + "link": "https://learn.microsoft.com/azure/storage/blobs/immutable-storage-overview", + "service": "Azure Storage", + "severity": "높다", + "text": "변경할 수 없는 Blob 고려", + "waf": "안전" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review Checklist", + "description": "스토리지 계정에 대한 보호되지 않는 HTTP/80 액세스를 사용하지 않도록 설정하여 모든 데이터 전송이 암호화되고 무결성이 보호되며 서버가 인증되도록 하는 것이 좋습니다. ", + "guid": "e7a8dc4a-20e2-47c3-b297-11b1352beee0", + "link": "https://learn.microsoft.com/azure/storage/common/storage-require-secure-transfer", + "service": "Azure Storage", + "severity": "높다", + "text": "HTTPS 필요, 즉 스토리지 계정에서 포트 80 사용 안 함Require HTTPS, i.e. disable port 80 on the storage account", + "waf": "안전" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review Checklist", + "description": "스토리지 계정에서 사용자 지정 도메인(호스트 이름)을 구성할 때 TLS/HTTPS가 필요한지 확인합니다. 이 경우 스토리지 계정 앞에 Azure CDN을 배치해야 할 수 있습니다.", + "guid": "79b588de-fc49-472c-b3cd-21bf77036e5e", + "link": "https://learn.microsoft.com/azure/storage/blobs/storage-custom-domain-name", + "service": "Azure Storage", + "severity": "높다", + "text": "HTTPS를 적용(HTTP 사용 안 함)할 때 스토리지 계정에 사용자 지정 도메인(CNAME)을 사용하지 않는지 확인합니다.", + "waf": "안전" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review Checklist", + "description": "클라이언트가 SAS 토큰을 사용하여 Blob 데이터에 액세스할 때 HTTPS를 요구하면 자격 증명 손실 위험을 최소화하는 데 도움이 됩니다.", + "guid": "6b4bed3d-5035-447c-8347-dc56028a71ff", + "link": "https://learn.microsoft.com/azure/storage/common/storage-sas-overview", + "service": "Azure Storage", + "severity": "보통", + "text": "SAS(공유 액세스 서명) 토큰을 HTTPS 연결로만 제한", + "waf": "안전" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review Checklist", + "description": ". 최신 TLS 버전을 적용하면 이전 버전을 사용하는 클라이언트의 요청이 거부됩니다. ", + "graph": "resources | where type == 'microsoft.storage/storageaccounts' | extend compliant = (isnull(properties.minimumTlsVersion) == false and properties.minimumTlsVersion in ('TLS1_2', 'TLS1_3')) | distinct id, compliant", + "guid": "e12be569-a18f-4562-8d5d-ce151b9e7d55", + "link": "https://learn.microsoft.com/azure/storage/common/transport-layer-security-configure-minimum-version", + "service": "Azure Storage", + "severity": "높다", + "text": "스토리지 계정에 대한 최신 TLS 버전 적용Enforce the latest TLS version for a storage account", + "waf": "안전" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review Checklist", + "description": "가능한 경우 Microsoft Entra ID 토큰을 공유 액세스 서명보다 선호해야 합니다", + "guid": "e1ce15dd-3f0d-45e7-92d4-1e3611cc57b4", + "link": "https://learn.microsoft.com/azure/storage/common/authorize-data-access", + "service": "Azure Storage", + "severity": "높다", + "text": "Blob 액세스에 Microsoft Entra ID 토큰 사용Use Microsoft Entra ID tokens for blob access", + "waf": "안전" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review Checklist", + "description": "사용자, 그룹 또는 응용 프로그램에 역할을 할당할 때 해당 보안 주체가 작업을 수행하는 데 필요한 권한만 부여합니다. 리소스에 대한 액세스를 제한하면 의도하지 않은 데이터 오용과 악의적인 데이터 오용을 모두 방지할 수 있습니다.", + "guid": "a4b1410d-4395-48a8-a228-9b3d6b57cfc6", + "service": "Azure Storage", + "severity": "보통", + "text": "IaM 권한의 최소 권한", + "waf": "안전" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review Checklist", + "description": "사용자 위임 SAS는 Azure AD(Azure Active Directory) 자격 증명과 SAS에 대해 지정된 권한으로 보호됩니다. 사용자 위임 SAS는 범위와 기능 측면에서 서비스 SAS와 유사하지만 서비스 SAS에 비해 보안상의 이점을 제공합니다. ", + "guid": "55461e1a-3e34-453a-9c86-39648b652d6c", + "link": "https://learn.microsoft.com/azure/storage/common/storage-sas-overview?toc=%2Fazure%2Fstorage%2Fblobs%2Ftoc.json#best-practices-when-using-sas", + "service": "Azure Storage", + "severity": "높다", + "text": "SAS를 사용하는 경우 스토리지 계정 키 기반 SAS보다 '사용자 위임 SAS'를 선호합니다.", + "waf": "안전" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review Checklist", + "description": "스토리지 계정 키('공유 키')에는 감사 기능이 거의 없습니다. 누가/언제 키 복사본을 가져왔는지 모니터링할 수 있지만 키가 여러 사람의 손에 들어가면 특정 사용자의 사용을 귀속시킬 수 없습니다. Entra ID 인증에만 의존하면 스토리지 액세스를 사용자에게 더 쉽게 연결할 수 있습니다. ", + "graph": "resources | where type == 'microsoft.storage/storageaccounts' | extend allowSharedKeyAccess = tostring(properties.allowSharedKeyAccess) | extend compliant = (isnotempty(allowSharedKeyAccess) and allowSharedKeyAccess == 'false') | distinct id, compliant", + "guid": "15f51296-5398-4e6d-bd22-7dd142b06c21", + "link": "https://learn.microsoft.com/rest/api/storageservices/authorize-with-shared-key", + "service": "Azure Storage", + "severity": "높다", + "text": "Microsoft Entra ID 액세스(및 사용자 위임 SAS)만 지원되도록 스토리지 계정 키를 사용하지 않도록 설정하는 것이 좋습니다.", + "waf": "안전" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review Checklist", + "description": "활동 로그 데이터를 사용하여 스토리지 계정의 보안을 '언제', '누가', '무엇을' 및 '어떻게' 확인하거나 변경합니다(예: 스토리지 계정 키, 액세스 정책 등).", + "guid": "d7999a64-6f43-489a-af42-c78e78c06a73", + "link": "https://learn.microsoft.com/azure/storage/blobs/blob-storage-monitoring-scenarios#audit-account-activity", + "service": "Azure Storage", + "severity": "높다", + "text": "Azure Monitor를 사용하여 스토리지 계정에 대한 컨트롤 플레인 작업을 감사하는 것이 좋습니다", + "waf": "안전" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review Checklist", + "description": "키 만료 정책을 사용하면 계정 액세스 키의 교체에 대한 미리 알림을 설정할 수 있습니다. 지정된 간격이 경과하고 키가 아직 회전되지 않은 경우 알림이 표시됩니다.", + "guid": "a22a4956-e7a8-4dc4-a20e-27c3e29711b1", + "link": "https://learn.microsoft.com/azure/storage/common/storage-account-keys-manage?tabs=azure-portal#create-a-key-expiration-policy", + "service": "Azure Storage", + "severity": "보통", + "text": "스토리지 계정 키를 사용하는 경우 '키 만료 정책'을 사용하도록 설정하는 것이 좋습니다.", + "waf": "안전" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review Checklist", + "description": "SAS 만료 정책은 SAS가 유효한 권장 간격을 지정합니다. SAS 만료 정책은 서비스 SAS 또는 계정 SAS에 적용됩니다. 사용자가 권장 간격보다 큰 유효성 간격으로 서비스 SAS 또는 계정 SAS를 생성하면 경고가 표시됩니다.", + "guid": "352beee0-79b5-488d-bfc4-972cd3cd21bf", + "link": "https://learn.microsoft.com/azure/storage/common/sas-expiration-policy", + "service": "Azure Storage", + "severity": "보통", + "text": "SAS 만료 정책을 구성하는 것이 좋습니다.", + "waf": "안전" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review Checklist", + "description": "저장된 액세스 정책은 스토리지 계정 키를 다시 생성할 필요 없이 서비스 SAS에 대한 사용 권한을 취소할 수 있는 옵션을 제공합니다. ", + "guid": "77036e5e-6b4b-4ed3-b503-547c1347dc56", + "link": "https://learn.microsoft.com/rest/api/storageservices/define-stored-access-policy", + "service": "Azure Storage", + "severity": "보통", + "text": "SAS를 저장된 액세스 정책에 연결하는 것이 좋습니다.", + "waf": "안전" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review Checklist", + "guid": "028a71ff-e1ce-415d-b3f0-d5e772d41e36", + "link": "https://microsoft.github.io/code-with-engineering-playbook/continuous-integration/dev-sec-ops/secret-management/recipes/detect-secrets-ado/", + "service": "Azure Storage", + "severity": "보통", + "text": "체크 인된 연결 문자열 및 저장소 계정 키를 검색하도록 응용 프로그램의 소스 코드 리포지토리를 구성하는 것이 좋습니다.", + "waf": "안전" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review Checklist", + "description": "이상적으로 애플리케이션은 관리 ID를 사용하여 Azure Storage에 인증해야 합니다. 가능하지 않은 경우 Azure KeyVault 또는 동등한 서비스에 스토리지 자격 증명(연결 문자열, 스토리지 계정 키, SAS, 서비스 주체 자격 증명)을 사용하는 것이 좋습니다.", + "guid": "11cc57b4-a4b1-4410-b439-58a8c2289b3d", + "link": "https://learn.microsoft.com/azure/architecture/framework/security/design-storage-keys", + "service": "Azure Storage", + "severity": "높다", + "text": "Azure KeyVault에 연결 문자열을 저장하는 것이 좋습니다(관리 ID를 사용할 수 없는 시나리오에서).", + "waf": "안전" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review Checklist", + "description": "임시 SAS 서비스 SAS 또는 계정 SAS에서 가까운 만료 시간을 사용합니다. 이러한 방식으로 SAS가 손상되더라도 짧은 시간 동안만 유효합니다. 이 방법은 저장된 액세스 정책을 참조할 수 없는 경우에 특히 중요합니다. 또한 단기 만료 시간은 Blob에 업로드할 수 있는 시간을 제한하여 Blob에 쓸 수 있는 데이터의 양을 제한합니다.", + "guid": "27138b82-1102-4cac-9eae-01e6e842e52f", + "link": "https://learn.microsoft.com/rest/api/storageservices/delegate-access-with-shared-access-signature", + "service": "Azure Storage", + "severity": "높다", + "text": "임시 SAS의 유효 기간을 단축하기 위해 노력", + "waf": "안전" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review Checklist", + "description": "SAS를 만들 때는 가능한 한 구체적이고 제한적이어야 합니다. 훨씬 더 광범위한 액세스를 제공하는 SAS보다 단일 리소스 및 작업에 대해 SAS를 선호합니다.", + "guid": "4721d928-c1b1-4cd5-81e5-4a29a9de399c", + "link": "https://learn.microsoft.com/rest/api/storageservices/delegate-access-with-shared-access-signature", + "service": "Azure Storage", + "severity": "보통", + "text": "SAS에 좁은 범위 적용", + "waf": "안전" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review Checklist", + "description": "SAS에는 SAS를 사용하여 리소스를 요청할 수 있는 권한이 있는 클라이언트 IP 주소 또는 주소 범위에 대한 매개 변수가 포함될 수 있습니다. ", + "guid": "fd7b28dc-9355-4562-82bf-e4564b0d834a", + "link": "https://learn.microsoft.com/rest/api/storageservices/create-account-sas", + "service": "Azure Storage", + "severity": "보통", + "text": "가능한 경우 SAS 범위를 특정 클라이언트 IP 주소로 지정하는 것이 좋습니다", + "waf": "안전" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review Checklist", + "description": "SAS는 클라이언트가 업로드하는 데이터의 양을 제한할 수 없습니다. 시간 경과에 따른 스토리지 양의 가격 책정 모델을 감안할 때 클라이언트가 악의적으로 큰 콘텐츠를 업로드했는지 여부를 확인하는 것이 합리적일 수 있습니다.", + "guid": "348b263e-6dd6-4051-8a36-498f6dbad38e", + "service": "Azure Storage", + "severity": "낮다", + "text": "클라이언트가 SAS를 사용하여 파일을 업로드한 후 업로드된 데이터를 확인하는 것이 좋습니다. ", + "waf": "안전" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review Checklist", + "description": "'로컬 사용자 계정'을 사용하여 SFTP를 통해 Blob Storage에 액세스하는 경우 '일반적인' RBAC 컨트롤이 적용되지 않습니다. NFS 또는 REST를 통한 Blob 액세스는 SFTP 액세스보다 더 제한적일 수 있습니다. 안타깝게도 2023년 초부터 로컬 사용자는 현재 SFTP 엔드포인트에 대해 지원되는 유일한 ID 관리 형태입니다", + "guid": "ad53cc7c-e1d7-4aaa-a357-1449ab8053d8", + "link": "https://learn.microsoft.com/azure/storage/blobs/secure-file-transfer-protocol-support#sftp-permission-model", + "service": "Azure Storage", + "severity": "높다", + "text": "SFTP: SFTP 액세스를 위한 '로컬 사용자'의 수를 제한하고 시간이 지남에 따라 액세스가 필요한지 여부를 감사합니다.", + "waf": "안전" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review Checklist", + "guid": "9f89dc7b-33be-42a1-a27f-7b9e91be1f38", + "link": "https://learn.microsoft.com/azure/storage/blobs/secure-file-transfer-protocol-known-issues#authentication-and-authorization", + "service": "Azure Storage", + "severity": "보통", + "text": "SFTP: SFTP 엔드포인트는 POSIX와 유사한 ACL을 지원하지 않습니다.", + "waf": "안전" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review Checklist", + "description": "스토리지는 CORS(Cross-Origin Resource Sharing), 즉 다른 도메인의 웹 앱이 동일 출처 정책을 완화할 수 있도록 하는 HTTP 기능을 지원합니다. CORS를 사용하도록 설정하는 경우 CorsRules를 최소 권한으로 유지합니다.", + "guid": "cef39812-bd46-43cb-aac8-ac199ebb91a3", + "link": "https://learn.microsoft.com/rest/api/storageservices/cross-origin-resource-sharing--cors--support-for-the-azure-storage-services", + "service": "Azure Storage", + "severity": "높다", + "text": "지나치게 광범위한 CORS 정책 방지", + "waf": "안전" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review Checklist", + "description": "미사용 데이터는 항상 서버 쪽에서 암호화되며 클라이언트 쪽에서도 암호화될 수 있습니다. 서버 쪽 암호화는 플랫폼 관리형 키(기본값) 또는 고객 관리형 키를 사용하여 발생할 수 있습니다. 클라이언트 쪽 암호화는 클라이언트가 Azure Storage에 Blob별로 암호화/암호 해독 키를 제공하도록 하거나 클라이언트 쪽에서 암호화를 완전히 처리하여 발생할 수 있습니다. 따라서 기밀 보장을 위해 Azure Storage에 전혀 의존하지 않습니다.", + "guid": "3d90cae2-cc88-4137-86f7-c0cbafe61464", + "link": "https://learn.microsoft.com/azure/storage/common/storage-service-encryption", + "service": "Azure Storage", + "severity": "높다", + "text": "미사용 데이터를 암호화하는 방법을 결정합니다. 데이터에 대한 스레드 모델을 이해합니다.", + "waf": "안전" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review Checklist", + "guid": "8dd457e9-2713-48b8-8110-2cac6eae01e6", + "link": "https://learn.microsoft.com/azure/storage/common/customer-managed-keys-overview?toc=%2Fazure%2Fstorage%2Fblobs%2Ftoc.json&bc=%2Fazure%2Fstorage%2Fblobs%2Fbreadcrumb%2Ftoc.json", + "service": "Azure Storage", + "severity": "보통", + "text": "어떤 플랫폼 암호화를 사용해야 하는지 확인합니다.", + "waf": "안전" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review Checklist", + "guid": "e842e52f-4721-4d92-ac1b-1cd521e54a29", + "link": "https://learn.microsoft.com/azure/storage/blobs/encryption-customer-provided-keys", + "service": "Azure Storage", + "severity": "보통", + "text": "클라이언트 쪽 암호화를 사용해야 하는지 여부를 결정합니다.", + "waf": "안전" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review Checklist", + "description": "리소스 그래프 탐색기(리소스 | where type == 'microsoft.storage/storageaccounts' | where properties['allowBlobPublicAccess'] == true)를 활용하여 익명 Blob 액세스를 허용하는 스토리지 계정을 찾습니다.", + "graph": "resources | where type == 'microsoft.storage/storageaccounts' | extend compliant = (properties.allowBlobPublicAccess == 'false') | distinct id, compliant", + "guid": "659ae558-b937-4d49-a5e1-112dbd7ba012", + "link": "https://learn.microsoft.com/azure/storage/blobs/anonymous-read-access-configure?tabs=portal#allow-or-disallow-public-read-access-for-a-storage-account", + "service": "Azure Storage", + "severity": "높다", + "text": "공용 Blob 익명 액세스가 필요한지 또는 특정 스토리지 계정에 대해 사용하지 않도록 설정할 수 있는지 여부를 고려합니다. ", + "waf": "안전" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review Checklist", + "guid": "cb8eb8c0-aa62-4a25-a495-6eaa8dc4a243", + "link": "https://learn.microsoft.com/azure/storage/common/storage-account-upgrade?tabs=azure-portal", + "service": "Azure Storage", + "severity": "높다", + "text": "성능 및 안정성 향상을 위해 storagev2 계정 유형 활용", + "waf": "신뢰도" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review Checklist", + "guid": "e05bbe20-9d49-4fda-9777-8424d116785c", + "link": "https://learn.microsoft.com/azure/storage/common/storage-redundancy", + "service": "Azure Storage", + "severity": "높다", + "text": "최고의 가용성을 위해 GRS, ZRS 또는 GZRS 스토리지 활용", + "waf": "신뢰도" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review Checklist", + "guid": "2fa56c56-ad48-4408-be72-734c486ba280", + "link": "https://learn.microsoft.com/azure/storage/common/storage-disaster-recovery-guidance", + "service": "Azure Storage", + "severity": "보통", + "text": "장애 조치(failover) 후 쓰기 작업의 경우 고객 관리 장애 조치(failover)를 사용합니다. ", + "waf": "신뢰도" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review Checklist", + "guid": "dc0590cf-65de-48e1-909c-cbd579266bcc", + "link": "https://learn.microsoft.com/azure/storage/common/storage-disaster-recovery-guidance#microsoft-managed-failover", + "service": "Azure Storage", + "severity": "보통", + "text": "Microsoft 관리 장애 조치(failover) 세부 정보 이해", + "waf": "신뢰도" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review Checklist", + "guid": "a274faa1-abfe-49d5-9d04-c3c4919cb1b3", + "link": "https://learn.microsoft.com/azure/storage/blobs/soft-delete-blob-enable?tabs=azure-portal", + "service": "Azure Storage", + "severity": "보통", + "text": "일시 삭제 사용", + "waf": "신뢰도" + }, { "arm-service": "microsoft.cache/redis", "checklist": "Redis Resiliency checklist", @@ -8990,7 +9422,7 @@ ], "metadata": { "name": "WAF checklist", - "timestamp": "August 08, 2024" + "timestamp": "August 12, 2024" }, "severities": [ { diff --git a/checklists/waf_checklist.pt.json b/checklists/waf_checklist.pt.json index 1e41cb251..f9bf55910 100644 --- a/checklists/waf_checklist.pt.json +++ b/checklists/waf_checklist.pt.json @@ -4783,6 +4783,438 @@ "text": "Faça com que as configurações de tolerância a desastres do site tenham sido devidamente consideradas e alteradas para sua empresa, se necessário.", "waf": "Fiabilidade" }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review Checklist", + "description": "Aplicar as diretrizes do parâmetro de comparação de segurança de nuvem da Microsoft relacionado ao armazenamento", + "guid": "d237de14-3b16-4c21-b7aa-9b64604489a8", + "link": "https://learn.microsoft.com/security/benchmark/azure/baselines/storage-security-baseline", + "service": "Azure Storage", + "severity": "Média", + "text": "Considere a 'linha de base de segurança do Azure para armazenamento'", + "waf": "Segurança" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review Checklist", + "description": "Por padrão, o Armazenamento do Azure tem um endereço IP público e pode ser acessado pela Internet. Os pontos de extremidade privados permitem expor com segurança o Armazenamento do Azure apenas aos recursos de Computação do Azure que precisam de acesso, eliminando assim a exposição à Internet pública", + "guid": "f42d78e7-9d17-4a73-a22a-5a67e7a8ed4b", + "link": "https://learn.microsoft.com/azure/storage/common/storage-private-endpoints", + "service": "Azure Storage", + "severity": "Alto", + "text": "Considere usar pontos de extremidade privados para o Armazenamento do Azure", + "waf": "Segurança" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review Checklist", + "description": "As contas de armazenamento recém-criadas são criadas usando o modelo de implantação do ARM, para que o RBAC, a auditoria etc. estejam habilitados. Verifique se não há contas de armazenamento antigas com o modelo de implantação clássico em uma assinatura", + "guid": "30e37c3e-2971-41b2-963c-eee079b598de", + "link": "https://learn.microsoft.com/azure/virtual-machines/migration-classic-resource-manager-overview#migration-of-storage-accounts", + "service": "Azure Storage", + "severity": "Média", + "text": "Verifique se as contas de armazenamento mais antigas não estão usando o \"modelo de implantação clássico\"", + "waf": "Segurança" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review Checklist", + "description": "Aproveite o Microsoft Defender para saber mais sobre atividades suspeitas e configurações incorretas.", + "guid": "fc5972cd-4cd2-41b0-a803-7f5e6b4bfd3d", + "link": "https://learn.microsoft.com/azure/storage/common/azure-defender-storage-configure", + "service": "Azure Storage", + "severity": "Alto", + "text": "Habilitar o Microsoft Defender para todas as suas contas de armazenamento", + "waf": "Segurança" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review Checklist", + "description": "O mecanismo de exclusão reversível permite recuperar blobs excluídos acidentalmente.", + "guid": "503547c1-447e-4c66-828a-7100f1ce16dd", + "link": "https://learn.microsoft.com/azure/storage/blobs/soft-delete-blob-overview", + "service": "Azure Storage", + "severity": "Média", + "text": "Habilitar 'exclusão reversível' para blobs", + "waf": "Segurança" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review Checklist", + "description": "Considere desabilitar seletivamente a \"exclusão reversível\" para determinados contêineres de blob, por exemplo, se o aplicativo precisar garantir que as informações excluídas sejam excluídas imediatamente, por exemplo, por motivos de confidencialidade, privacidade ou conformidade. ", + "guid": "3f1d5e87-2e52-4e36-81cc-58b4a4b1510e", + "link": "https://learn.microsoft.com/azure/storage/blobs/soft-delete-blob-enable", + "service": "Azure Storage", + "severity": "Média", + "text": "Desabilitar a 'exclusão reversível' para blobs", + "waf": "Segurança" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review Checklist", + "description": "A exclusão reversível para contêineres permite que você recupere um contêiner depois que ele foi excluído, por exemplo, recuperar de uma operação de exclusão acidental.", + "guid": "43a58a9c-2289-4c3d-9b57-d0c655462f2a", + "link": "https://learn.microsoft.com/azure/storage/blobs/soft-delete-container-overview", + "service": "Azure Storage", + "severity": "Alto", + "text": "Habilitar 'exclusão reversível' para contêineres", + "waf": "Segurança" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review Checklist", + "description": "Considere desabilitar seletivamente a \"exclusão reversível\" para determinados contêineres de blob, por exemplo, se o aplicativo precisar garantir que as informações excluídas sejam excluídas imediatamente, por exemplo, por motivos de confidencialidade, privacidade ou conformidade. ", + "guid": "3e3453a3-c863-4964-ab65-2d6c15f51296", + "link": "https://learn.microsoft.com/azure/storage/blobs/soft-delete-container-enable", + "service": "Azure Storage", + "severity": "Média", + "text": "Desabilitar a 'exclusão reversível' para contêineres", + "waf": "Segurança" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review Checklist", + "description": "Impede a exclusão acidental de uma conta de armazenamento, forçando o usuário a remover primeiro o bloqueio de exclusão, antes da exclusão", + "guid": "5398e6de-d227-4dd1-92b0-6c21d7999a64", + "link": "https://learn.microsoft.com/azure/storage/common/lock-account-resource", + "service": "Azure Storage", + "severity": "Alto", + "text": "Habilitar bloqueios de recursos em contas de armazenamento", + "waf": "Segurança" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review Checklist", + "description": "Considere as políticas de 'retenção legal' ou 'retenção baseada em tempo' para blobs, de modo que seja impossível excluir o blob, o contêiner ou a conta de armazenamento. Observe que 'impossível' na verdade significa 'impossível'; depois que uma conta de armazenamento contém um blob imutável, a única maneira de \"se livrar\" dessa conta de armazenamento é cancelando a assinatura do Azure.", + "guid": "6f4389a8-f42c-478e-98c0-6a73a22a4956", + "link": "https://learn.microsoft.com/azure/storage/blobs/immutable-storage-overview", + "service": "Azure Storage", + "severity": "Alto", + "text": "Considere blobs imutáveis", + "waf": "Segurança" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review Checklist", + "description": "Considere desabilitar o acesso HTTP/80 desprotegido à conta de armazenamento, para que todas as transferências de dados sejam criptografadas, protegidas por integridade e o servidor seja autenticado. ", + "guid": "e7a8dc4a-20e2-47c3-b297-11b1352beee0", + "link": "https://learn.microsoft.com/azure/storage/common/storage-require-secure-transfer", + "service": "Azure Storage", + "severity": "Alto", + "text": "Exigir HTTPS, ou seja, desabilitar a porta 80 na conta de armazenamento", + "waf": "Segurança" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review Checklist", + "description": "Ao configurar um domínio personalizado (nome do host) em uma conta de armazenamento, verifique se você precisa de TLS/HTTPS; nesse caso, talvez seja necessário colocar a CDN do Azure na frente de sua conta de armazenamento.", + "guid": "79b588de-fc49-472c-b3cd-21bf77036e5e", + "link": "https://learn.microsoft.com/azure/storage/blobs/storage-custom-domain-name", + "service": "Azure Storage", + "severity": "Alto", + "text": "Ao impor HTTPS (desabilitando o HTTP), verifique se você não usa domínios personalizados (CNAME) para a conta de armazenamento.", + "waf": "Segurança" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review Checklist", + "description": "Exigir HTTPS quando um cliente usa um token SAS para acessar dados de blob ajuda a minimizar o risco de perda de credenciais.", + "guid": "6b4bed3d-5035-447c-8347-dc56028a71ff", + "link": "https://learn.microsoft.com/azure/storage/common/storage-sas-overview", + "service": "Azure Storage", + "severity": "Média", + "text": "Limitar tokens de assinatura de acesso compartilhado (SAS) apenas a conexões HTTPS", + "waf": "Segurança" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review Checklist", + "description": ". A imposição da versão mais recente do TLS rejeitará a solicitação de clientes que usam a versão mais antiga. ", + "graph": "resources | where type == 'microsoft.storage/storageaccounts' | extend compliant = (isnull(properties.minimumTlsVersion) == false and properties.minimumTlsVersion in ('TLS1_2', 'TLS1_3')) | distinct id, compliant", + "guid": "e12be569-a18f-4562-8d5d-ce151b9e7d55", + "link": "https://learn.microsoft.com/azure/storage/common/transport-layer-security-configure-minimum-version", + "service": "Azure Storage", + "severity": "Alto", + "text": "Impor a versão mais recente do TLS para uma conta de armazenamento", + "waf": "Segurança" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review Checklist", + "description": "Os tokens de ID do Microsoft Entra devem ser favorecidos em relação às assinaturas de acesso compartilhado, sempre que possível", + "guid": "e1ce15dd-3f0d-45e7-92d4-1e3611cc57b4", + "link": "https://learn.microsoft.com/azure/storage/common/authorize-data-access", + "service": "Azure Storage", + "severity": "Alto", + "text": "Usar tokens de ID do Microsoft Entra para acesso a blobs", + "waf": "Segurança" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review Checklist", + "description": "Ao atribuir uma função a um usuário, grupo ou aplicativo, conceda a essa entidade de segurança apenas as permissões necessárias para que ela execute suas tarefas. Limitar o acesso aos recursos ajuda a evitar o uso indevido não intencional e mal-intencionado de seus dados.", + "guid": "a4b1410d-4395-48a8-a228-9b3d6b57cfc6", + "service": "Azure Storage", + "severity": "Média", + "text": "Privilégios mínimos em permissões de IaM", + "waf": "Segurança" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review Checklist", + "description": "Uma SAS de delegação de usuário é protegida com credenciais do Azure Active Directory (Azure AD) e também pelas permissões especificadas para a SAS. Uma SAS de delegação de usuário é análoga a uma SAS de serviço em termos de escopo e função, mas oferece benefícios de segurança em relação à SAS de serviço. ", + "guid": "55461e1a-3e34-453a-9c86-39648b652d6c", + "link": "https://learn.microsoft.com/azure/storage/common/storage-sas-overview?toc=%2Fazure%2Fstorage%2Fblobs%2Ftoc.json#best-practices-when-using-sas", + "service": "Azure Storage", + "severity": "Alto", + "text": "Ao usar SAS, prefira 'SAS de delegação de usuário' em vez de SAS baseada em chave de conta de armazenamento.", + "waf": "Segurança" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review Checklist", + "description": "As chaves da conta de armazenamento (\"chaves compartilhadas\") têm muito poucos recursos de auditoria. Embora possa ser monitorado em quem/quando buscou uma cópia das chaves, uma vez que as chaves estão nas mãos de várias pessoas, é impossível atribuir o uso a um usuário específico. Confiar apenas na autenticação do Entra ID facilita o acesso ao armazenamento a um usuário. ", + "graph": "resources | where type == 'microsoft.storage/storageaccounts' | extend allowSharedKeyAccess = tostring(properties.allowSharedKeyAccess) | extend compliant = (isnotempty(allowSharedKeyAccess) and allowSharedKeyAccess == 'false') | distinct id, compliant", + "guid": "15f51296-5398-4e6d-bd22-7dd142b06c21", + "link": "https://learn.microsoft.com/rest/api/storageservices/authorize-with-shared-key", + "service": "Azure Storage", + "severity": "Alto", + "text": "Considere desabilitar as chaves da conta de armazenamento, para que haja suporte apenas para o acesso à ID do Microsoft Entra (e à SAS de delegação de usuário).", + "waf": "Segurança" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review Checklist", + "description": "Use os dados do Log de Atividades para identificar \"quando\", \"quem\", \"o quê\" e \"como\" a segurança da sua conta de armazenamento está sendo exibida ou alterada (ou seja, chaves da conta de armazenamento, políticas de acesso etc.).", + "guid": "d7999a64-6f43-489a-af42-c78e78c06a73", + "link": "https://learn.microsoft.com/azure/storage/blobs/blob-storage-monitoring-scenarios#audit-account-activity", + "service": "Azure Storage", + "severity": "Alto", + "text": "Considere usar o Azure Monitor para auditar as operações do painel de controle na conta de armazenamento", + "waf": "Segurança" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review Checklist", + "description": "Uma política de expiração de chave permite que você defina um lembrete para a rotação das chaves de acesso da conta. O lembrete é exibido se o intervalo especificado tiver decorrido e as teclas ainda não tiverem sido giradas.", + "guid": "a22a4956-e7a8-4dc4-a20e-27c3e29711b1", + "link": "https://learn.microsoft.com/azure/storage/common/storage-account-keys-manage?tabs=azure-portal#create-a-key-expiration-policy", + "service": "Azure Storage", + "severity": "Média", + "text": "Ao usar chaves de conta de armazenamento, considere habilitar uma 'política de expiração de chave'", + "waf": "Segurança" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review Checklist", + "description": "Uma política de expiração de SAS especifica um intervalo recomendado durante o qual a SAS é válida. As políticas de expiração de SAS se aplicam a uma SAS de serviço ou a uma SAS de conta. Quando um usuário gera SAS de serviço ou uma SAS de conta com um intervalo de validade maior que o intervalo recomendado, ele verá um aviso.", + "guid": "352beee0-79b5-488d-bfc4-972cd3cd21bf", + "link": "https://learn.microsoft.com/azure/storage/common/sas-expiration-policy", + "service": "Azure Storage", + "severity": "Média", + "text": "Considere configurar uma política de expiração de SAS", + "waf": "Segurança" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review Checklist", + "description": "As políticas de acesso armazenadas oferecem a opção de revogar permissões para uma SAS de serviço sem precisar regenerar as chaves da conta de armazenamento. ", + "guid": "77036e5e-6b4b-4ed3-b503-547c1347dc56", + "link": "https://learn.microsoft.com/rest/api/storageservices/define-stored-access-policy", + "service": "Azure Storage", + "severity": "Média", + "text": "Considere vincular SAS a uma política de acesso armazenada", + "waf": "Segurança" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review Checklist", + "guid": "028a71ff-e1ce-415d-b3f0-d5e772d41e36", + "link": "https://microsoft.github.io/code-with-engineering-playbook/continuous-integration/dev-sec-ops/secret-management/recipes/detect-secrets-ado/", + "service": "Azure Storage", + "severity": "Média", + "text": "Considere configurar o repositório de código-fonte do aplicativo para detectar cadeias de conexão e chaves de conta de armazenamento com check-in.", + "waf": "Segurança" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review Checklist", + "description": "Idealmente, seu aplicativo deve usar uma identidade gerenciada para autenticar no Armazenamento do Azure. Se isso não for possível, considere ter a credencial de armazenamento (cadeia de conexão, chave da conta de armazenamento, SAS, credencial da entidade de serviço) no Azure KeyVault ou em um serviço equivalente.", + "guid": "11cc57b4-a4b1-4410-b439-58a8c2289b3d", + "link": "https://learn.microsoft.com/azure/architecture/framework/security/design-storage-keys", + "service": "Azure Storage", + "severity": "Alto", + "text": "Considere armazenar cadeias de conexão no Azure KeyVault (em cenários em que as identidades gerenciadas não são possíveis)", + "waf": "Segurança" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review Checklist", + "description": "Use tempos de expiração de curto prazo em uma SAS de serviço SAS ad hoc ou SAS de conta. Dessa forma, mesmo que uma SAS seja comprometida, ela é válida apenas por um curto período de tempo. Essa prática é especialmente importante se você não puder fazer referência a uma política de acesso armazenada. Os tempos de expiração de curto prazo também limitam a quantidade de dados que podem ser gravados em um blob, limitando o tempo disponível para carregar nele.", + "guid": "27138b82-1102-4cac-9eae-01e6e842e52f", + "link": "https://learn.microsoft.com/rest/api/storageservices/delegate-access-with-shared-access-signature", + "service": "Azure Storage", + "severity": "Alto", + "text": "Esforce-se por períodos de validade curtos para SAS ad-hoc", + "waf": "Segurança" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review Checklist", + "description": "Ao criar uma SAS, seja o mais específico e restritivo possível. Prefira uma SAS para um único recurso e operação em vez de uma SAS que oferece acesso muito mais amplo.", + "guid": "4721d928-c1b1-4cd5-81e5-4a29a9de399c", + "link": "https://learn.microsoft.com/rest/api/storageservices/delegate-access-with-shared-access-signature", + "service": "Azure Storage", + "severity": "Média", + "text": "Aplicar um escopo restrito a uma SAS", + "waf": "Segurança" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review Checklist", + "description": "Uma SAS pode incluir parâmetros nos quais os endereços IP do cliente ou intervalos de endereços estão autorizados a solicitar um recurso usando a SAS. ", + "guid": "fd7b28dc-9355-4562-82bf-e4564b0d834a", + "link": "https://learn.microsoft.com/rest/api/storageservices/create-account-sas", + "service": "Azure Storage", + "severity": "Média", + "text": "Considere definir o escopo da SAS para um endereço IP de cliente específico, sempre que possível", + "waf": "Segurança" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review Checklist", + "description": "Uma SAS não pode restringir a quantidade de dados que um cliente carrega; Dado o modelo de preços da quantidade de armazenamento ao longo do tempo, pode fazer sentido validar se os clientes carregaram conteúdos maliciosamente grandes.", + "guid": "348b263e-6dd6-4051-8a36-498f6dbad38e", + "service": "Azure Storage", + "severity": "Baixo", + "text": "Considere verificar os dados carregados depois que os clientes usaram uma SAS para carregar um arquivo. ", + "waf": "Segurança" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review Checklist", + "description": "Ao acessar o armazenamento de blobs por meio do SFTP usando uma \"conta de usuário local\", os controles RBAC \"usuais\" não se aplicam. O acesso a blobs via NFS ou REST pode ser mais restritivo do que o acesso SFTP. Infelizmente, a partir do início de 2023, os usuários locais são a única forma de gerenciamento de identidade com suporte atual para o endpoint SFTP", + "guid": "ad53cc7c-e1d7-4aaa-a357-1449ab8053d8", + "link": "https://learn.microsoft.com/azure/storage/blobs/secure-file-transfer-protocol-support#sftp-permission-model", + "service": "Azure Storage", + "severity": "Alto", + "text": "SFTP: limite a quantidade de \"usuários locais\" para acesso SFTP e audite se o acesso é necessário ao longo do tempo.", + "waf": "Segurança" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review Checklist", + "guid": "9f89dc7b-33be-42a1-a27f-7b9e91be1f38", + "link": "https://learn.microsoft.com/azure/storage/blobs/secure-file-transfer-protocol-known-issues#authentication-and-authorization", + "service": "Azure Storage", + "severity": "Média", + "text": "SFTP: o endpoint SFTP não oferece suporte a ACLs semelhantes a POSIX.", + "waf": "Segurança" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review Checklist", + "description": "O armazenamento oferece suporte ao CORS (Cross-Origin Resource Sharing), ou seja, um recurso HTTP que permite que aplicativos Web de um domínio diferente afrouxem a política de mesma origem. Ao habilitar o CORS, mantenha as CorsRules com o menor privilégio.", + "guid": "cef39812-bd46-43cb-aac8-ac199ebb91a3", + "link": "https://learn.microsoft.com/rest/api/storageservices/cross-origin-resource-sharing--cors--support-for-the-azure-storage-services", + "service": "Azure Storage", + "severity": "Alto", + "text": "Evite políticas de CORS excessivamente amplas", + "waf": "Segurança" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review Checklist", + "description": "Os dados em repouso são sempre criptografados no lado do servidor e, além disso, também podem ser criptografados no lado do cliente. A criptografia do lado do servidor pode ocorrer usando uma chave gerenciada pela plataforma (padrão) ou uma chave gerenciada pelo cliente. A criptografia do lado do cliente pode acontecer fazendo com que o cliente forneça uma chave de criptografia/descriptografia por blob para o armazenamento do Azure ou manipulando completamente a criptografia no lado do cliente. portanto, não dependendo do Armazenamento do Azure para garantias de confidencialidade.", + "guid": "3d90cae2-cc88-4137-86f7-c0cbafe61464", + "link": "https://learn.microsoft.com/azure/storage/common/storage-service-encryption", + "service": "Azure Storage", + "severity": "Alto", + "text": "Determine como os dados em repouso devem ser criptografados. Entenda o modelo de thread para dados.", + "waf": "Segurança" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review Checklist", + "guid": "8dd457e9-2713-48b8-8110-2cac6eae01e6", + "link": "https://learn.microsoft.com/azure/storage/common/customer-managed-keys-overview?toc=%2Fazure%2Fstorage%2Fblobs%2Ftoc.json&bc=%2Fazure%2Fstorage%2Fblobs%2Fbreadcrumb%2Ftoc.json", + "service": "Azure Storage", + "severity": "Média", + "text": "Determine qual/se a criptografia de plataforma deve ser usada.", + "waf": "Segurança" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review Checklist", + "guid": "e842e52f-4721-4d92-ac1b-1cd521e54a29", + "link": "https://learn.microsoft.com/azure/storage/blobs/encryption-customer-provided-keys", + "service": "Azure Storage", + "severity": "Média", + "text": "Determine qual/se a criptografia do lado do cliente deve ser usada.", + "waf": "Segurança" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review Checklist", + "description": "Aproveite o Resource Graph Explorer (resources | where type == 'microsoft.storage/storageaccounts' | where properties['allowBlobPublicAccess'] == true) para localizar contas de armazenamento que permitem acesso anônimo a blobs.", + "graph": "resources | where type == 'microsoft.storage/storageaccounts' | extend compliant = (properties.allowBlobPublicAccess == 'false') | distinct id, compliant", + "guid": "659ae558-b937-4d49-a5e1-112dbd7ba012", + "link": "https://learn.microsoft.com/azure/storage/blobs/anonymous-read-access-configure?tabs=portal#allow-or-disallow-public-read-access-for-a-storage-account", + "service": "Azure Storage", + "severity": "Alto", + "text": "Considere se o acesso anônimo de blob público é necessário ou se ele pode ser desabilitado para determinadas contas de armazenamento. ", + "waf": "Segurança" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review Checklist", + "guid": "cb8eb8c0-aa62-4a25-a495-6eaa8dc4a243", + "link": "https://learn.microsoft.com/azure/storage/common/storage-account-upgrade?tabs=azure-portal", + "service": "Azure Storage", + "severity": "Alto", + "text": "Aproveite um tipo de conta storagev2 para melhor desempenho e confiabilidade", + "waf": "Fiabilidade" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review Checklist", + "guid": "e05bbe20-9d49-4fda-9777-8424d116785c", + "link": "https://learn.microsoft.com/azure/storage/common/storage-redundancy", + "service": "Azure Storage", + "severity": "Alto", + "text": "Aproveite o armazenamento GRS, ZRS ou GZRS para obter a mais alta disponibilidade", + "waf": "Fiabilidade" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review Checklist", + "guid": "2fa56c56-ad48-4408-be72-734c486ba280", + "link": "https://learn.microsoft.com/azure/storage/common/storage-disaster-recovery-guidance", + "service": "Azure Storage", + "severity": "Média", + "text": "Para operação de gravação após o failover, use o failover gerenciado pelo cliente ", + "waf": "Fiabilidade" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review Checklist", + "guid": "dc0590cf-65de-48e1-909c-cbd579266bcc", + "link": "https://learn.microsoft.com/azure/storage/common/storage-disaster-recovery-guidance#microsoft-managed-failover", + "service": "Azure Storage", + "severity": "Média", + "text": "Entender os detalhes do failover gerenciado pela Microsoft", + "waf": "Fiabilidade" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review Checklist", + "guid": "a274faa1-abfe-49d5-9d04-c3c4919cb1b3", + "link": "https://learn.microsoft.com/azure/storage/blobs/soft-delete-blob-enable?tabs=azure-portal", + "service": "Azure Storage", + "severity": "Média", + "text": "Habilitar exclusão reversível", + "waf": "Fiabilidade" + }, { "arm-service": "microsoft.cache/redis", "checklist": "Redis Resiliency checklist", @@ -8990,7 +9422,7 @@ ], "metadata": { "name": "WAF checklist", - "timestamp": "August 08, 2024" + "timestamp": "August 12, 2024" }, "severities": [ { diff --git a/checklists/waf_checklist.zh-Hant.json b/checklists/waf_checklist.zh-Hant.json index 692a96cf1..74783449b 100644 --- a/checklists/waf_checklist.zh-Hant.json +++ b/checklists/waf_checklist.zh-Hant.json @@ -7067,6 +7067,438 @@ "text": "利用 Azure DevOps 或 GitHub 簡化 CI/CD 並保護邏輯應用代碼", "waf": "操作" }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review Checklist", + "description": "應用與存儲相關的 Microsoft 雲安全基準中的指導", + "guid": "d237de14-3b16-4c21-b7aa-9b64604489a8", + "link": "https://learn.microsoft.com/security/benchmark/azure/baselines/storage-security-baseline", + "service": "Azure Storage", + "severity": "中等", + "text": "請考慮「存儲的 Azure 安全基線”", + "waf": "安全" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review Checklist", + "description": "默認情況下,Azure 儲存具有公共IP位址,並且可通過Internet訪問。專用終結點允許僅向需要訪問的 Azure 計算資源安全地公開 Azure 存儲,從而消除對公共 Internet 的暴露", + "guid": "f42d78e7-9d17-4a73-a22a-5a67e7a8ed4b", + "link": "https://learn.microsoft.com/azure/storage/common/storage-private-endpoints", + "service": "Azure Storage", + "severity": "高", + "text": "考慮將專用終結點用於 Azure 存儲", + "waf": "安全" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review Checklist", + "description": "新創建的存儲帳戶是使用ARM部署模型創建的,因此 RBAC、審核等都已啟用。確保訂閱中沒有具有經典部署模型的舊存儲帳戶", + "guid": "30e37c3e-2971-41b2-963c-eee079b598de", + "link": "https://learn.microsoft.com/azure/virtual-machines/migration-classic-resource-manager-overview#migration-of-storage-accounts", + "service": "Azure Storage", + "severity": "中等", + "text": "確保較舊的存儲帳戶未使用“經典部署模型”", + "waf": "安全" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review Checklist", + "description": "利用 Microsoft Defender 瞭解可疑活動和錯誤配置。", + "guid": "fc5972cd-4cd2-41b0-a803-7f5e6b4bfd3d", + "link": "https://learn.microsoft.com/azure/storage/common/azure-defender-storage-configure", + "service": "Azure Storage", + "severity": "高", + "text": "為所有存儲帳戶啟用 Microsoft Defender", + "waf": "安全" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review Checklist", + "description": "軟刪除機制允許恢復意外刪除的 blob。", + "guid": "503547c1-447e-4c66-828a-7100f1ce16dd", + "link": "https://learn.microsoft.com/azure/storage/blobs/soft-delete-blob-overview", + "service": "Azure Storage", + "severity": "中等", + "text": "為 blob 啟用“軟刪除”", + "waf": "安全" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review Checklist", + "description": "考慮有選擇地禁用某些 blob 容器的「軟刪除」 例如,如果應用程式必須確保立即刪除已刪除的資訊,例如出於機密性、隱私或合規性原因。", + "guid": "3f1d5e87-2e52-4e36-81cc-58b4a4b1510e", + "link": "https://learn.microsoft.com/azure/storage/blobs/soft-delete-blob-enable", + "service": "Azure Storage", + "severity": "中等", + "text": "禁用 blob 的“軟刪除”", + "waf": "安全" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review Checklist", + "description": "容器的軟刪除使您能夠在刪除容器后恢復容器,例如從意外刪除操作中恢復。", + "guid": "43a58a9c-2289-4c3d-9b57-d0c655462f2a", + "link": "https://learn.microsoft.com/azure/storage/blobs/soft-delete-container-overview", + "service": "Azure Storage", + "severity": "高", + "text": "為容器啟用“軟刪除”", + "waf": "安全" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review Checklist", + "description": "考慮有選擇地禁用某些 blob 容器的「軟刪除」 例如,如果應用程式必須確保立即刪除已刪除的資訊,例如出於機密性、隱私或合規性原因。", + "guid": "3e3453a3-c863-4964-ab65-2d6c15f51296", + "link": "https://learn.microsoft.com/azure/storage/blobs/soft-delete-container-enable", + "service": "Azure Storage", + "severity": "中等", + "text": "禁用容器的“軟刪除”", + "waf": "安全" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review Checklist", + "description": "通過強制使用者先刪除刪除鎖,然後再刪除存儲帳戶,防止意外刪除存儲帳戶", + "guid": "5398e6de-d227-4dd1-92b0-6c21d7999a64", + "link": "https://learn.microsoft.com/azure/storage/common/lock-account-resource", + "service": "Azure Storage", + "severity": "高", + "text": "在存儲帳戶上啟用資源鎖定", + "waf": "安全" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review Checklist", + "description": "請考慮對 blob 使用“合法保留”或“基于時間的保留”策略,以便無法刪除 blob、容器或存儲帳戶。請注意,「不可能」實際上意味著「不可能」;一旦存儲帳戶包含不可變的 blob,「擺脫」該存儲帳戶的唯一方法是取消 Azure 訂閱。", + "guid": "6f4389a8-f42c-478e-98c0-6a73a22a4956", + "link": "https://learn.microsoft.com/azure/storage/blobs/immutable-storage-overview", + "service": "Azure Storage", + "severity": "高", + "text": "考慮不可變的 blob", + "waf": "安全" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review Checklist", + "description": "請考慮禁用對存儲帳戶的未受保護的 HTTP/80 訪問,以便對所有數據傳輸進行加密、完整性保護,並且對伺服器進行身份驗證。", + "guid": "e7a8dc4a-20e2-47c3-b297-11b1352beee0", + "link": "https://learn.microsoft.com/azure/storage/common/storage-require-secure-transfer", + "service": "Azure Storage", + "severity": "高", + "text": "需要 HTTPS,即在儲存帳戶上禁用埠 80", + "waf": "安全" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review Checklist", + "description": "在儲存帳戶上配置自定義域(主機名)時,請檢查是否需要 TLS/HTTPS;如果是這樣,可能需要將 Azure CDN 放在存儲帳戶的前面。", + "guid": "79b588de-fc49-472c-b3cd-21bf77036e5e", + "link": "https://learn.microsoft.com/azure/storage/blobs/storage-custom-domain-name", + "service": "Azure Storage", + "severity": "高", + "text": "強制執行 HTTPS(禁用 HTTP)時,請檢查是否不要對儲存帳戶使用自定義域 (CNAME)。", + "waf": "安全" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review Checklist", + "description": "當用戶端使用SAS令牌訪問 blob 資料時,要求使用 HTTPS 有助於最大程度地降低憑據丟失的風險。", + "guid": "6b4bed3d-5035-447c-8347-dc56028a71ff", + "link": "https://learn.microsoft.com/azure/storage/common/storage-sas-overview", + "service": "Azure Storage", + "severity": "中等", + "text": "將共享訪問簽名 (SAS) 令牌限製為僅 HTTPS 連接", + "waf": "安全" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review Checklist", + "description": ".強制執行最新的 TLS 版本將拒絕來自使用舊版本的用戶端的請求。", + "graph": "resources | where type == 'microsoft.storage/storageaccounts' | extend compliant = (isnull(properties.minimumTlsVersion) == false and properties.minimumTlsVersion in ('TLS1_2', 'TLS1_3')) | distinct id, compliant", + "guid": "e12be569-a18f-4562-8d5d-ce151b9e7d55", + "link": "https://learn.microsoft.com/azure/storage/common/transport-layer-security-configure-minimum-version", + "service": "Azure Storage", + "severity": "高", + "text": "強制實施存儲帳戶的最新 TLS 版本", + "waf": "安全" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review Checklist", + "description": "在可能的情況下,應優先使用 Microsoft Entra ID 令牌,而不是共用訪問簽名", + "guid": "e1ce15dd-3f0d-45e7-92d4-1e3611cc57b4", + "link": "https://learn.microsoft.com/azure/storage/common/authorize-data-access", + "service": "Azure Storage", + "severity": "高", + "text": "使用 Microsoft Entra ID 令牌進行 blob 訪問", + "waf": "安全" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review Checklist", + "description": "為使用者、組或應用程式分配角色時,請僅授予該安全主體執行任務所需的許可權。限制對資源的訪問有助於防止無意和惡意濫用數據。", + "guid": "a4b1410d-4395-48a8-a228-9b3d6b57cfc6", + "service": "Azure Storage", + "severity": "中等", + "text": "IaM 許可權中的最小特權", + "waf": "安全" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review Checklist", + "description": "使用者委派 SAS 使用 Azure Active Directory (Azure AD) 憑據以及為 SAS 指定的許可權進行保護。使用者委派 SAS 在範圍和功能方面類似於服務 SAS,但與服務 SAS 相比,它提供了安全優勢。", + "guid": "55461e1a-3e34-453a-9c86-39648b652d6c", + "link": "https://learn.microsoft.com/azure/storage/common/storage-sas-overview?toc=%2Fazure%2Fstorage%2Fblobs%2Ftoc.json#best-practices-when-using-sas", + "service": "Azure Storage", + "severity": "高", + "text": "使用 SAS 時,首選「使用者委派 SAS」,而不是基於存儲帳戶密鑰的 SAS。", + "waf": "安全" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review Checklist", + "description": "存儲帳戶金鑰(“共用金鑰”)幾乎沒有審核功能。雖然可以監控誰/何時獲取了密鑰的副本,但一旦密鑰掌握在多人手中,就不可能將使用方式歸因於特定使用者。僅依賴 Entra ID 身份驗證可以更輕鬆地將存儲訪問許可權與用戶綁定。", + "graph": "resources | where type == 'microsoft.storage/storageaccounts' | extend allowSharedKeyAccess = tostring(properties.allowSharedKeyAccess) | extend compliant = (isnotempty(allowSharedKeyAccess) and allowSharedKeyAccess == 'false') | distinct id, compliant", + "guid": "15f51296-5398-4e6d-bd22-7dd142b06c21", + "link": "https://learn.microsoft.com/rest/api/storageservices/authorize-with-shared-key", + "service": "Azure Storage", + "severity": "高", + "text": "請考慮禁用存儲帳戶密鑰,以便僅支援 Microsoft Entra ID 訪問(和使用者委派 SAS)。", + "waf": "安全" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review Checklist", + "description": "使用活動日誌數據來確定查看或更改存儲帳戶安全性的“時間”、“人員”、“內容”和“方式”(即存儲帳戶密鑰、訪問策略等)。", + "guid": "d7999a64-6f43-489a-af42-c78e78c06a73", + "link": "https://learn.microsoft.com/azure/storage/blobs/blob-storage-monitoring-scenarios#audit-account-activity", + "service": "Azure Storage", + "severity": "高", + "text": "請考慮使用 Azure Monitor 審核存儲帳戶上的控制平面操作", + "waf": "安全" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review Checklist", + "description": "通過金鑰過期策略,您可以設置帳戶訪問金鑰輪換的提醒。如果已過指定的時間間隔且尚未旋轉鍵,則會顯示提醒。", + "guid": "a22a4956-e7a8-4dc4-a20e-27c3e29711b1", + "link": "https://learn.microsoft.com/azure/storage/common/storage-account-keys-manage?tabs=azure-portal#create-a-key-expiration-policy", + "service": "Azure Storage", + "severity": "中等", + "text": "使用存儲帳戶密鑰時,請考慮啟用“金鑰過期策略”", + "waf": "安全" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review Checklist", + "description": "SAS 過期策略指定了 SAS 的有效時間間隔。SAS 過期策略適用於服務 SAS 或帳戶 SAS。當使用者生成的服務 SAS 或帳戶 SAS 的有效期間隔大於建議的時間間隔時,他們將看到警告。", + "guid": "352beee0-79b5-488d-bfc4-972cd3cd21bf", + "link": "https://learn.microsoft.com/azure/storage/common/sas-expiration-policy", + "service": "Azure Storage", + "severity": "中等", + "text": "考慮配置 SAS 過期策略", + "waf": "安全" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review Checklist", + "description": "通過存儲訪問策略,可以選擇撤銷服務 SAS 的許可權,而無需重新生成存儲帳戶密鑰。", + "guid": "77036e5e-6b4b-4ed3-b503-547c1347dc56", + "link": "https://learn.microsoft.com/rest/api/storageservices/define-stored-access-policy", + "service": "Azure Storage", + "severity": "中等", + "text": "考慮將 SAS 連結到儲存存取策略", + "waf": "安全" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review Checklist", + "guid": "028a71ff-e1ce-415d-b3f0-d5e772d41e36", + "link": "https://microsoft.github.io/code-with-engineering-playbook/continuous-integration/dev-sec-ops/secret-management/recipes/detect-secrets-ado/", + "service": "Azure Storage", + "severity": "中等", + "text": "請考慮配置應用程式的原始程式碼儲存庫,以檢測簽入的連接字串和存儲帳戶密鑰。", + "waf": "安全" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review Checklist", + "description": "理想情況下,應用程式應使用託管標識向 Azure 儲存進行身份驗證。如果無法做到這一點,請考慮在 Azure KeyVault 或等效服務中擁有存儲憑據(連接字串、存儲帳戶密鑰、SAS、服務主體憑據)。", + "guid": "11cc57b4-a4b1-4410-b439-58a8c2289b3d", + "link": "https://learn.microsoft.com/azure/architecture/framework/security/design-storage-keys", + "service": "Azure Storage", + "severity": "高", + "text": "請考慮在 Azure KeyVault 中儲存連接字串(在無法使用託管標識的情況下)", + "waf": "安全" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review Checklist", + "description": "在臨時 SAS 服務 SAS 或帳戶 SAS 上使用近期過期時間。這樣,即使 SAS 遭到入侵,它也只會在短時間內有效。如果無法引用存儲訪問策略,則這種做法尤為重要。近期過期時間還通過限制可用於上傳到 blob 的時間來限制可以寫入 blob 的數據量。", + "guid": "27138b82-1102-4cac-9eae-01e6e842e52f", + "link": "https://learn.microsoft.com/rest/api/storageservices/delegate-access-with-shared-access-signature", + "service": "Azure Storage", + "severity": "高", + "text": "爭取縮短臨時 SAS 的有效期", + "waf": "安全" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review Checklist", + "description": "創建 SAS 時,請盡可能具體且具有限制性。首選單一資源和操作的 SAS,而不是提供更廣泛訪問許可權的 SAS。", + "guid": "4721d928-c1b1-4cd5-81e5-4a29a9de399c", + "link": "https://learn.microsoft.com/rest/api/storageservices/delegate-access-with-shared-access-signature", + "service": "Azure Storage", + "severity": "中等", + "text": "對SAS應用窄範圍", + "waf": "安全" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review Checklist", + "description": "SAS 可以包含用戶端 IP 位址或位址範圍有權使用 SAS 請求資源的參數。", + "guid": "fd7b28dc-9355-4562-82bf-e4564b0d834a", + "link": "https://learn.microsoft.com/rest/api/storageservices/create-account-sas", + "service": "Azure Storage", + "severity": "中等", + "text": "盡可能考慮將SAS的範圍限定為特定的用戶端IP位址", + "waf": "安全" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review Checklist", + "description": "SAS無法限制用戶端上傳的數據量;考慮到存儲量隨時間變化的定價模型,驗證用戶端是否惡意上傳了大量內容可能很有意義。", + "guid": "348b263e-6dd6-4051-8a36-498f6dbad38e", + "service": "Azure Storage", + "severity": "低", + "text": "在用戶端使用SAS上傳檔后,請考慮檢查上傳的數據。", + "waf": "安全" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review Checklist", + "description": "使用「本地使用者帳戶」通過 SFTP 訪問 blob 儲存時,“通常”的 RBAC 控制不適用。通過 NFS 或 REST 進行的 Blob 訪問可能比 SFTP 訪問更具限制性。遺憾的是,截至 2023 年初,本地使用者是 SFTP 端點目前支援的唯一身份管理形式", + "guid": "ad53cc7c-e1d7-4aaa-a357-1449ab8053d8", + "link": "https://learn.microsoft.com/azure/storage/blobs/secure-file-transfer-protocol-support#sftp-permission-model", + "service": "Azure Storage", + "severity": "高", + "text": "SFTP:限制 SFTP 訪問的「本地使用者」數量,並審核隨著時間的推移是否需要訪問。", + "waf": "安全" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review Checklist", + "guid": "9f89dc7b-33be-42a1-a27f-7b9e91be1f38", + "link": "https://learn.microsoft.com/azure/storage/blobs/secure-file-transfer-protocol-known-issues#authentication-and-authorization", + "service": "Azure Storage", + "severity": "中等", + "text": "SFTP:SFTP 端點不支持類似 POSIX 的 ACL。", + "waf": "安全" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review Checklist", + "description": "存儲支援 CORS(跨源資源分享),即一種 HTTP 功能,使來自不同域的 Web 應用程式能夠放鬆同源策略。啟用 CORS 時,請將 CorsRules 保留為最低許可權。", + "guid": "cef39812-bd46-43cb-aac8-ac199ebb91a3", + "link": "https://learn.microsoft.com/rest/api/storageservices/cross-origin-resource-sharing--cors--support-for-the-azure-storage-services", + "service": "Azure Storage", + "severity": "高", + "text": "避免過於寬泛的 CORS 策略", + "waf": "安全" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review Checklist", + "description": "靜態數據始終在伺服器端加密,此外也可能在用戶端加密。伺服器端加密可能使用平臺管理的金鑰(預設)或客戶管理的金鑰進行。用戶端加密可以通過讓用戶端按 blob 向 Azure 儲存提供加密/解密金鑰,或者完全在用戶端處理加密來實現。因此,完全不依賴 Azure 存儲來保證機密性。", + "guid": "3d90cae2-cc88-4137-86f7-c0cbafe61464", + "link": "https://learn.microsoft.com/azure/storage/common/storage-service-encryption", + "service": "Azure Storage", + "severity": "高", + "text": "確定應如何加密靜態數據。了解數據的線程模型。", + "waf": "安全" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review Checklist", + "guid": "8dd457e9-2713-48b8-8110-2cac6eae01e6", + "link": "https://learn.microsoft.com/azure/storage/common/customer-managed-keys-overview?toc=%2Fazure%2Fstorage%2Fblobs%2Ftoc.json&bc=%2Fazure%2Fstorage%2Fblobs%2Fbreadcrumb%2Ftoc.json", + "service": "Azure Storage", + "severity": "中等", + "text": "確定應使用哪種/是否應使用平臺加密。", + "waf": "安全" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review Checklist", + "guid": "e842e52f-4721-4d92-ac1b-1cd521e54a29", + "link": "https://learn.microsoft.com/azure/storage/blobs/encryption-customer-provided-keys", + "service": "Azure Storage", + "severity": "中等", + "text": "確定應使用哪種/是否應使用用戶端加密。", + "waf": "安全" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review Checklist", + "description": "利用 Resource Graph 資源管理器 (resources | where type == 'microsoft.storage/storageaccounts' | where properties['allowBlobPublicAccess'] == true) 查找允許匿名 blob 訪問的存儲帳戶。", + "graph": "resources | where type == 'microsoft.storage/storageaccounts' | extend compliant = (properties.allowBlobPublicAccess == 'false') | distinct id, compliant", + "guid": "659ae558-b937-4d49-a5e1-112dbd7ba012", + "link": "https://learn.microsoft.com/azure/storage/blobs/anonymous-read-access-configure?tabs=portal#allow-or-disallow-public-read-access-for-a-storage-account", + "service": "Azure Storage", + "severity": "高", + "text": "考慮是否需要公共 blob 匿名訪問,或者是否可以對某些存儲帳戶禁用公共 blob 匿名訪問。", + "waf": "安全" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review Checklist", + "guid": "cb8eb8c0-aa62-4a25-a495-6eaa8dc4a243", + "link": "https://learn.microsoft.com/azure/storage/common/storage-account-upgrade?tabs=azure-portal", + "service": "Azure Storage", + "severity": "高", + "text": "利用 storagev2 帳戶類型獲得更好的性能和可靠性", + "waf": "可靠性" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review Checklist", + "guid": "e05bbe20-9d49-4fda-9777-8424d116785c", + "link": "https://learn.microsoft.com/azure/storage/common/storage-redundancy", + "service": "Azure Storage", + "severity": "高", + "text": "利用 GRS、ZRS 或 GZRS 儲存實現最高可用性", + "waf": "可靠性" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review Checklist", + "guid": "2fa56c56-ad48-4408-be72-734c486ba280", + "link": "https://learn.microsoft.com/azure/storage/common/storage-disaster-recovery-guidance", + "service": "Azure Storage", + "severity": "中等", + "text": "對於故障轉移后的寫入操作,請使用客戶管理的故障轉移", + "waf": "可靠性" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review Checklist", + "guid": "dc0590cf-65de-48e1-909c-cbd579266bcc", + "link": "https://learn.microsoft.com/azure/storage/common/storage-disaster-recovery-guidance#microsoft-managed-failover", + "service": "Azure Storage", + "severity": "中等", + "text": "瞭解 Microsoft 託管的故障轉移詳細資訊", + "waf": "可靠性" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review Checklist", + "guid": "a274faa1-abfe-49d5-9d04-c3c4919cb1b3", + "link": "https://learn.microsoft.com/azure/storage/blobs/soft-delete-blob-enable?tabs=azure-portal", + "service": "Azure Storage", + "severity": "中等", + "text": "啟用軟刪除", + "waf": "可靠性" + }, { "arm-service": "Microsoft.Devices/IotHubs", "checklist": "IoT Hub Review", @@ -8990,7 +9422,7 @@ ], "metadata": { "name": "WAF checklist", - "timestamp": "August 08, 2024" + "timestamp": "August 12, 2024" }, "severities": [ { diff --git a/spreadsheet/macrofree/azure_storage_checklist.en.xlsx b/spreadsheet/macrofree/azure_storage_checklist.en.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..afe31be886e7adc0873aa1aaeff6f29853d55781 GIT binary patch literal 26066 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 literal 0 HcmV?d00001 diff --git a/spreadsheet/macrofree/azure_storage_checklist.es.xlsx b/spreadsheet/macrofree/azure_storage_checklist.es.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..d2367de002331fd993e950e76aa4b22e09f4a4d0 GIT binary patch literal 26859 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 literal 0 HcmV?d00001 diff --git a/spreadsheet/macrofree/azure_storage_checklist.ja.xlsx b/spreadsheet/macrofree/azure_storage_checklist.ja.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..0f57271725fec7e6847dae38ff1e9a1857a17316 GIT binary patch literal 28159 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

UVMG^?lK%DLNF23bSm0DXA7TNYV$N!RH~ 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 BHlF|h literal 0 HcmV?d00001 diff --git a/spreadsheet/macrofree/azure_storage_checklist.ko.xlsx b/spreadsheet/macrofree/azure_storage_checklist.ko.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..0ae78b40bc73f43b3cd699daefa48e604f000d62 GIT binary patch literal 27646 zcmcG01yq#Z*1myA2?8P_C8B_Ir+{K04boi#l0!F)v`DF>v~+h5Fe0Ti4Bg!gL&yJ} z!9ef*zTbD(f8Dk4c+S~}{qFtjXYX^)JEPKKmr-t9xNrgOLWBpF^7BTC7ootY75H-< z`11;+D{Tofw_?&ZH)pgrHIZnS!2HULg*py>X}{@~vL|_1x=exbW$ijb!d9T@NeY3Hi>izQ`xlv8x2`E%FPnCoy7+ckT%0=T23wbF zxf#j}x6hZa@Y;*By5|mDklc^DoXAEkRUISiGG^eyGOI)BJ{C3Cm;cbH7)K5B#gZrn z70J4m+VQK0_asa*CA`23Jw+$N7e3Y9r;lbZf%$DI3=1xk!6Iiv;-l|WjDEOA*J~p0 zij`G=M3ClhvbzGVBWMzPI{zqX=A-?^Zuv^JMwi!A6RVX+ZJJKqVU0P^i+`e4LwLRV zBkF|<4R1nO_wxxerFM!B8zZ3}t^j zWjp^N%+QbJ{_T6Abu<`QD~910FIQ-XUxchMW6|YZqO%Xi&rj}kKU*fW`0P*|R-OOw73a>~*G~a}a3G`pD zS-taeFg@IA&q-h)8oy3_huoK;oB8qsYSpm&&bOXVVnmIj#a<)A`QXV&u6#K#@GoEK2b(}SW1a2A6C<1W=ytp?$*TM4P26o z6gy7-bRwaaI+$)vE9Uax!oEOOQCg=mgF_oh)Wz1w+aoJR5H-1VqT`us&M=9S8_o`1 zcAV=YIi&^KsO-iS#P+4~pkn#sRSeC6FN!PrL+P}8H*QGd1#oqgs6KG=>tUpL@*MPf z!lrLQLCk6oLr*Wkn2P*+r4nW*#gzJmq_$@tpL$12u3z7OvvvKxi=;m(E5@C5DjJ$2yhpF@2@55WPR&UVmA$kW#$AItHnmIq3J-sigJs%puIHPV+eVHv!X>fT#vv1-DS4%Pj3p-riuGW=oo-%x? zJJY_B$%I;7vjSH@iMWAz>>mwG{PUkLU!-`aZs*(nN$ZK>!#mG0akE7nlbGN_TrbdE zKP{rUXA%r8k8-K_FLsx1e0b++>Xs&XKjj@!ZlY3xbn`7QcE91rtQ{X7Mp$aHl)WEc zz)fkH$I83T`-xvbety&&E79(dF~*zrqZn&1h23>sn zTbAs@YrpY~V$vaU&A;dU!j}iB63I^8#tyoBFnzlV?>r*--P6e9te@=%96#{ z1-Z3M@O>M%YJQ|6SZM0_R>$Sb_VpXLDy%W@=4;#=kW5#~3MI~nvYkOS&K^Y<+3uY* z$X>P(lpNTq!HD%^ve|susn(7}>4=s}9e+-eZ0ffB+vrTv#-50ydhLzhLH$wOYo5j^qB@%RK%KSO6LaAC-H4hl z;X=62QynvDJfSRukw=LHr8?F*aH|%5Kv;;{~H?g3#u$o}16C@#6P=KT6E9*$--T zeb1uQtEi?GGx&Ov=7gKNI^@;+QNQit%hpyM^40h4d9+K)<%4R9xdR}9`=h6izDZ{; zq=&-0H`@X+>CsqW@|MdAP4HQ#SkxsMW4*ohAB4f;aEisrX! zvdVZ=D3!V;c4+N9H7TGLGN|Z$Q-wa;BU_HUs*EXYlWFzZr7#Dj2R2JHj+rmh!lOpq zVP-uTHo0B2MRXd)Bc@Jf*`qG6ZVNx?Hw@!X?Mf%0eb!FLO~ChAGm|hwGQHb6qgAER zP#|*XwnFuudIZ-@@iEh%TNtF;h}BZ&!i9@*moD5o+rsQXmc~}E_4KT*n2>*+?PDXR zc0mI4J zm&Q*p-%G$_2+jU2-m;#nVwJ7;bK-X=d9RB`{i9a1(Q_r?C~jq9}M=ysv5j&L3F= z0;Ib?rMR{TjUZSNBsI$cHDizqxEz(0pKjSW6rN5s=CAo=$WeP4q~CtA;9> z#zK9-(9BWk<1xjNFz~_B>VdAqp?MV)z&_XYXwhKl@T-PWt5am(QKQX%9LLBlP zaMErcL>|7-)2HfeW6`fxO$TaP`8>=)zT19$G6h+gO&J`~>O6!l9q^46fwQ6(ETN~_ zqtj99Ri75wA_KZ11?eYSPDG(xJ(=K=Owe}RO51=Ysa>_J!ReS0HP}$4$Q&vcxYU`m*pGhtcI z)D<=z?Tja|hdi8_t>R?kj%{8h6>*#!m*wS0uXf91{X&&7VdA{nS2$O2h8a(ao z`T$>!KgP}-luTXtHrcAZ1=C#H1*;8nt)=r(Hy^IE3CV!B`eo zYi{AWYofips3AY5$>p96O&h7~;vIf=BNLgskP*Y&9rhQC8mLpq2dLo=jzSTNsmTj$}ge)agcP^`W)M znm-vh^`ui>jl3!7>)}-67fV`N@sZ{pLD8 zoT%E=s}n8@bzEcMEKAh%LS@N1Lru7PU#X(gL^g;Fyfn6!c}sJwnsD?}@ftg+y|E*- z{Lp+uP#|>oCGoN8;>hU<)y>foqcQ!?q0!KxjKrIxd$yASof^vxeX?iwYHJtA8Pqw9C`_zi12>#D1=N^nsXq(QYim5$V;W5wC} z2K=e}hhMF33U-svqAF}LkhEuoFR3XatcdA(f>9lZ;S#izQ)O#IiotSY^xP$sC} zJHl%852=|^cpg)HiI>Hkvo@Ltw=)WkGFO8fv-E3k$!57;UdjDto8kI+v5kt8=LM~! zdiYXNjN8fMC{ySHO7%>saQPewcmhsL-?w;7-%Z9_jb9|V*HJ=pTxeRs3Nwb}EkY%@ zWbfA=Bu0`~nD#-7G7>F^9b!gd)uwBSL)c}jgq7ru>i*?QMVeo+AcQK_xzM`$sL6zt z;wUbk9DJ|e8Xef*B`)a`lRUahNI&)={5hJ@|ls;Cv1;wDLDWLskBQkrB<)YMzki4iLzY<``KL)||u(O4S#X#5J_e z&aWVrSux}x)wrwTW9FRIrY7{px@E-eOve(^tI=YHuP_Z?QGP?mxQI%rs;(SMHn^zh zve3_|OPmphB@R8V8Z-rI5B3b?v6r8fHFhK|kLweb zoH7d={id)>`Cr4__8)JFmaYn2rQYuFiQT!>+TZO{vnF%*#1{Xu&%IhK<>dSwXmG%NNGZBt6oeMtuT@w|ADVC=FdButj#*~tZ?(#xzfrf`)-K7VH`m9s&QQ{>n^;UsGwfxICPhy;FxVI1C#}lyGhP|=@*VmR=L49j$TsDu} z`$tX4$Z|>>T=w%$t)UE=eZva6-BtOgRh7BMyI`JbTd-alg-PMas$k7Gj^VMBj^yg8 zh5qE}BGxR=>Z&RlQ?PNkH^D*5L_~NPuH#NGO|#{MPq^8ws3%h*~VFrVDa;MJpDlRBWVi1^e$18d!BZ-qz_ z9v+vh%B~5gRdjLstP?&i)zn~~udedawROqXwTpTUF%(qlSC8xD5bpzLl9As|;lDNL zUu(LXuv9Cj52IqX^x-D${9b6e_2J1f7HNVnX@bKn{?=?zLk=IdHFfF8n1(tuJaZc4 z&Bro7BfdQILP2z$#AQigf5X;*dniVJ*Ai1#mXy;QJQFsWY~@f~Xs5$upu;5mG4aMn zEGHgg1tx=-&*4$S&uvz9oDM35k}Hqhg?FdSzy>;{TpJX*pq=oeLlddAsvLH6ddV{N zRKlb6%_M3uGp=y1nfm4w-N8_EBTxVEXB;K>r8?Ni0DoU4Bq(Or7lBqp!x4Ykc?C+5vr-jYA_7>XO z+_bgnEw8AUz2GRH*h!}N{Fu-slG@hdCi3SV-TiI(VXqb5lM-GZtD}O&xrgm(4c!3~ zis?h49JoyE6(wx z{p_GE`Ej$4q#bU@#vnFOl{87D93cgjT=UE}4&2u6C*R4opfz-3wi!TuC4`8r=ROe}9>i zOg`dfQ1o^i_l-lJXY)mbNv5ewi3{((FT3}Zr7s4V9~icTYcN+_Z_Hb$)^fy3RNZM~ z^B&;#9%z5)9oi}q%*op13hCIjSPmdI`I;?5il!Z^(a%R& zY3-t0+V2SW#9nIpxSH?6H@q5eMfF_@12=j3KQ+ngn z;gM!~BRHAtG}N)%W7t}dCB{)Y*E#laTm9pplNbOYzyEApi%@l#MTB2WTH!K zUm|myMXGDHQ0`s4Rg&T)PfGQf`fM43O6G63^siZr5_tnuil#h`IC*cShEZHG^d!j% zJ4(~GFOGK+^M#>rMHASfaO`BqJRe#$AGqcx%sAg@RXvf0liA=?!w~w_!QQS=mw#G4 z?amIgVr?Nxjc`)lZ$i=4qVipQ_6qgO8yyLa&94me>tOyO|v^2$HFG=U3Jy7^-ziV8)!2ji4%3j&$S+nrlHJ{E$$(rnC; z-4)?Y3$)tdU*&z$7r-KDnt_d*;X)r}^)jm$Nm1_$aJ(l26R+@pF>;;S<5VWS+{|@2 zrxcVd-|9W*-@?XQ{{6!Mxc9?A z{aq;GTBK`|AkLDiy28QH=vsY#b*@vsekqfCy+7+@?hM$qB8N9f|0-~^Jjpp))v-J7 zNK&vnJbY3WN}I~-Ow;HP$~_Nmn_l125B5lypd5ML2k#j>l!v|K_Ay(0*)^wF94IpI zJ-fl$HSJ^5fgfSil?Z{lsA2g?OK`{HNgj9DD<{`8?SjA zY4*UHRZhu)S&atqf>p`zz!)`7rvsM0fP>ME@g=Id#-)=|d0F)Alj1@`k7fshvgAW7 ztEN_i7&)`aEXyquSQEtfrBR6}Z0I(`rHVb*0Uh z>@=bC3|C~r#nx|BgByS&+W^j(8i~_e$4eG{q`gqvnACvYi-wq*Ox>4mF`-`JF2BH= zXxeDZl^%TjjEgtj=Fy-)(Lq<`RFJ=g>Br9)r8+vD#Lf?{-QL}xHo#VgjzacLtrKIa z-}Lra*@ShVB=4h+V30}l%+P|l4Tg%8KFE~zWl^5DQ=ZB}n z+7@zL8rldL>CMJ|qcs(!sQ7ZtWTM+Jge3X>tA4)rNM6$z?ZxeFPJu+b*wNX24Bo~# zN9j0K`P4AN#->^=5pUhmkHZ=(ORAR^GkRKQr3FYLcjbi*3+G*3);9Ged5kChnr5=r zW>>7CT*S+j!#07vFF#92FzK^cwJd1DL07Swv3>LsRuxdF&0AL^eajqu`h#P&Gj?7b3&87uM7imklg7IYkj0$bu2Nxa&IgTvPi=bRO<3Q<=@b;VMY=o z)ec*}+G>^M46_^!nYKY5Z{@*QL$lHx@Pp9-c3|s_szo2B@w!)QX4Z>hwuFUWmRe#_ zZDzLU!P#110Qa^Q>=ZO6y7!hk_l8sI!hV`geldhAbBW8O?4x;-C z=gMbxy7HY9jAL_YRM2$!q+>MLGV(LIQ|gpD-Bf*i4_-#j483Er_YUM5RWNBg^H4fL zPYM5SX9#gG34cH&V@8_n_mWqSV+^e_I}$NN-#OHE&x~k46BfW+Gs9NF(zpXp8(ERH zC$O8q2~4VZyuB&h7-i;^?pEDsyGj*wk(dceJsfa2GqXelja?Z0R@gRMV$NCmOg3XI z{?$#%lIP0G_`%sr=skhTIPA9bwVd&DxpZi$8uRRAzt!48c{i_BpIq6+%)Dp& z8TcY37(bvhq!bpV|C#~T{@N{N62>q_7#N4!NlGr!)E#}Wx5A&$T9#a$-DG+oB00|F zh;LSrve9FXXKP$EnBnW_p$=|wwKhIDQPX5d9hHERM89Pxhe;T#MTb;YwDW&Lhuya^ z54?l@(ja0u5XXS0{f<}gPZ2B{fGgem7|nF$=SY$fO|=GiVI}3L=-Q5%C3OZ+M(Ym=I(3P(d+zEmE+*rA_I%Mlggfp0;Ss3uKPl1l^olfQKNa* zNAIS*>aJ3%u0fVW-ZvWG2x@moKb_gp--0??RE~a5)mX%5EEW|dY@JFJvF4GP(_eY` z%`3O9!Fxi0k!Lj%U1;R)dQN6W)b_StCrxG$$J}1%P;P%#+YsL#2@{sP>r`6iVq=Yc zUPbN3AqoD-#O=%5L&VMv-!bJ>dDN*Ect<7%8L3S8)ETr^E0bLfSSniWx2^GtHCuz~ zZmd0vc$gCB%2sBCSIpEX9P4Ss7)tKxvcGB2`gV>RW=t#|H}!C75Ve+{BznrZW)M|A z$i}|79HKDCVRI@U_i0k*wUG;Y$)43gDm7oy z3_5O0F0A-B$LJBAm>KZ)&LqS>qKi!$UqnT2Kxa`~o^6$i30Xp%{N*4%06qaDh#X&h_e z7O3h`=BLig>{A_yu;9&=e_`9W)Zo&)FjyKC1II~yQ95_MhkW|}wEofCRN;67^@5tO z_ldI#83sB=zYo*Trn9aDnUce%zYT5LT7j#;d(E@3)q{9Kn>5(M*vwT-Xui43RZK#g zM?h}-@uqnZ`#YYb$p~V0^{erOhv)#ihI$|6jE}W1(tZxZsvGs z#h8+M%E%}O7|2J$JNUs%P;$<29Kn+IN5-~~5zmuA~FHn2OvLr?$ZRu5&K(6XuGA~*7hbFQQ9hl+V1A=nZT6K{c)Y^`9j=eT`^lH>KyobE#Q9hrZ;N-ZyDJY=o zeI&g^atof-Mf)AYwqZt|p6{7-Pa9l@t@!4R~!&?v* zOkKU$lQ1VQeh@Qe*mFwMkk$w#Wkfld(JU;r941UnYu%OQj~-T5$q*fcz>4fx79w0* zD#T{)rQgnVq8LW?#LSX;X`?pXYS*$el*R#TH}`4Yro9AHKP=3-t2IG;sh2S8?i)q0 z?Tmc!rxX;$)e46zK{lIZIv1LnB2`%8RSCYNQK#OPEH4ZYv(qMSO`I@k95bD{(oe6( zashc3w%**yBDlQFmUWA{IAFdtlcxH0=HSYGS-~t<+_4wOd;Z5V#rQ+E@U6<88scc% z?}Uq6fvHh&%nHc*cCeWN|0T8MUXns51^4XLOYg;Wq~cgRAk%^>qC*(+xXb!Taj*>eS?e_WL#4$o4ql(n&kktws zhr?<|%>gz3GRVM@L;2Y0PKHL_>A?={1mUjZ};oU4zrV)CKRZXB@1#ILsR{ zlQ$1N=}|PxU5m`wkT%14e&~Kxw{QshvEnIl>Ox}HvajKR5pA`MR30k{EW6EVCDSY4 zN^GpuR+1kox`<~Qof3q+G(qZ=VcRQg;;^{EhJiMxRDrar+b5-)?Wg_D6+Gh(bhaOB zw;~>s?NIw~1VR28rb*~v1LP9z%9hYNcA^ zx5~Ob?yt_<&6bD(|5}zMxr)Wrk1}*1Vi{htC%rgfdsUZ-apVo+Rg9AX z!-!U#_JVi1X*6g#W=qWps<`>O89&9|B7VPa6?Gv;%jL)o@|bT^Wu#S`Iw*z5fh2M% ztvg{+sor9h&Gy7U{91R|!IU5ESNcoE?>6Uk8rBW32kpKI%Hh~gfV5W#cBLinWwx73 z32#l<#7s5muRM4Y>(wz#awL@70GoYdI!C&FbB`PxI(j|LKzbo6PAZo|A}8^Ipu(dU zR)VQ_(r8~P*cn4iGsIM7Qw^x4>Sd{^7g25cmQx5K0>>1T;c`~IJPX+6x+IXXcPFMT zJnwG0xq3cbJ1R594UOhXFWKX741M%a+)&gJBm%7=;|`8{nt4ikc&l%h+E#ltF)GE$ zpUB`sd&QUU<~UakE@D+mIy?F~DeeBWj=cs>JHCfv!h z(8d`$IR(BZXZ)_eEaffUVG&`Rl5E`ugB78QTRz8<2?$~p@P%Hzc0g%@YB<#P*1N5E zQ#Dx>WbN6REbP6J-=3H9t(&v0&rgbpli8{m!l-;3F434{@KD`q^mZH}=$!_s$S!xq zEeA*Pfq^+(3HA@pQD2!KEZgO78DQ5e%24|$FFlhoh^~tpy&WH^=R9#*SWB7QlA6n{ z{9yV6^;!mGVLKQ+DE5AFW1%ssRWdfHPxD&VDMK8yyiEhsE63Lky))bUuL6EVgW*R?M_^&MlCFkc0D8qW^;2<#fK|GVN>Zikq?gJAxw9_ zQRJSi>=TQVX&!Rwn^IRC%O1h-qmDaKgKx?`G!3LCFpb>{=_eGbv3Tf_S{nQGP;?Ak zUqhE~HLs#sIn=tRo=#mrPE2~rj$@&<(FZ3;#Fb}qcbwJGhPFgZebZrL_W{U&jfqbgqA{vmzN(oCv})Z zJSc94yFCIvjlj+?40FqC&%>$%qRLe#>D&R)Jkf9l%bc!d-R{UU+TPr=${n4D3GwtW zRxjImEe<}hpIq)o( zupq{)hN|5xT!-^8TqoO0uMboRu~KYCKkzBnaCMk<>lf6vJ~G2)u0`8aZb@^~bE z=-TeV1O8y+h(N{4DEkWMp>*uEd&a2aDXbbC!MtOHWY?KuiK4ZMt^@V?V!j3NcT4jd zYn-vFifSGKx4tsS82Qf7alpp*#&JOsZ6v-sMoXJg+FdGwIKCiKzSS##lgR_G(3 zgrFcxNGwo7=C@yIw0FWUKRa1%JynMK5guhbdBr8lgVIQL87jZd;F}$!_Mm@UP-;!X z5m;)%C|eUdG@+wwS$OOU89B8umK$kEEzppeU;kXmuLc?-%8nX}`P}=(_~h;mjld2~ z+2kdJg%%W*7+*(vq3kAy1?(ioy0?j&p{z&Ed04H@U6lnhWLFf`&Ju^eDT{y*FtCgn z_ykKZ8PwoPy5+GGo3?tfv9Xwr97<0%1FeQg8+0={`gvRw&D> z$Q|2~`5&De9K%q}m4hrl^8T_t zx8o~*#J3mI^&3hsB0fvX1Y{mp$pkPyhxi9+2vrY-aTlO) z7mT}OAnMLzFH;9SA2&myaK1)15+^4^6V9P8{U)u<^h``otSEC-45omE$WH)XeJYN3 zck#YLkW$*|^yNjA>ynMMqe0#XYt!QD=ZZeO#%Ll~JH)0*GNo5aV;gr@XwgD)O~1GO zqME;%VLZe$HTEL|Jwg0CH~rH2)L27ILdNZqo|X*i8x66aKLzRe=3sXXXN>NwkB}aP z(b9YQO<9&KUI}{oLh+8Xri5^;%~cea5XQEL2Op#=A76yd>&97{uyg2wv`g?A>7~AH zXjspLq@YJ~Y#s_iZ9h3Qrn|ygDHoFmaE-3rX^+l_6HV=JghhO@hHSTkolOsfMUA8| zm$JNF28;O|ICY)koL#J%?JJVkCvqFiEslJ9ePSM_lY>s{V5J)`p_+S9_E{`J{IBhL z(_?REr%EY}4t`fhMnc0l(mPIW*DRhf{0_6KfbJ6)071w&6+D$sx5ck}JiD>@b zr6i`CL4hg3{L#!UF)b=Dj*{pg#4!AsZ zdJ(=m^70iH9ElB9 z{8D!JoKy1*=7aZQ-zocM^(%KKT>b7ZEpDgKUZHh)^{{Jy@(QuHqH5qAllN-L>gq03 zbFIQvY*|!%S=5~9YDg&Ffv6EiicI@DOSJmyo@Y5?wZp4w&GaLV?m_*brN)i>)ZCiAAPLPtnG_=F$u%b!{+j*{mz`!3^Tq$L+PYfn(pDn$_|S59!M3!VfKUlMH9oC(m6|CrE86#a^UT+(O8RUs+}=c} zRq@cR&ufRzL;3jlVB1Gu2o#~_=9{d@_kc$q+9NB0f5uT9wLuvdd$Js{$a%W@>gyVr zy9UngWY962!Gla=r`E_)iO9}u%)VjIJ$TRTK}yawFzo0lyhYofC~#sy*4!tkwNuJ9 zs?64P!;{~!vV;rx0=WZAmuHPk=z7Mq|Jv0={rM^My2Xy6FN?M_NzJU z(edm7=D217D>FHZYYgp>;U)tDZVC+K5#AQ1km@N98`V?(D$0o1a>`Mke&~K`c`Vfq z8q6sxrDG?SL@yn~-kjImPf#y9jD4zE;xr`AMg3~or_pKdGz^wAz%*yPh zzS-BH;6RdSYtI5pDk@S_`myrCZrK3F+zd_AGONrit%+NzPD`HpWmW7Z!s#V@YJe;-VoI8HJj6JKG ziBD-*MBP6o(5ur%^;cpWW~D7mWiCZFXStO7ji>yLC3469^-OT6Qa3| zGzg_3N?vV}f(B(pEdAeCNh<(LrO&DgkpCIvh~Y0F zfIcgECOHiqqB*N4*9){1;FMn$e;Ln;=-O6Ib!(JQA8g}4B#tGfOSW|tUJQh+CS$6(8mO% z1sI6tSH7K~0mGm9hK2a;D}ZIn$mVCh(SlL_$?|Xi2g~ogn#kG|emjHnlV5s>K7HNh z)h1d*^NU~ml)&&OzgQ7{1i!GF$$@&W4Y+~$QYJvd|6v*E1kJ19DIqI>-H-BI0jxY1 zb43594kG4==3LBy;jfq@`k46#09=UX7hK0^!0;DbK>sY)7JU$f=lECQ`PXG$fK(aT z{6saw)f1TeS;f2&zb%B|JhJ&se8li4AD$r6gF*q|1ETrGhYWJW@FyP-{etTN=Q9z_ z58|_0v1A@~R*GZamaV(Nc3=Df?B$2+yeZpb>+pf4KnG9~#gi>K1fPT~-uw_dmsFVXVZzlN|8+zk-o&V1Na=`Zva_*^OCfwt(U zuy=LWbv``>Nn=pl6lE8osC$Vn+a~vx9b+QPQe=x2m=%xEN%4H3r$USO zgW{=*A)e6NBK@XM7$2TfL@UOyl=FJrV5t{Jmu)JNyVu|=#{7a#;$?IhiU%?#lkB-D zx|Zmu4|IOwca&~{{@fG@iDVDp#Cu@<8PZ##%v9l8@9+Lb#S*W6!3tt=FSh8 z>1ra>+<)7J_vG9CTft`!MJxaDP$BNWAL@_ar~F1OP+mn;z~N7+)RqaQ&L^{suz_Kp=sW#_K&D)jL2N0007d zKwEv?qG;N6m{LJ_XTV~a!PWm=`O;T z-<;yMs7EnO7I}xSD2{|mJ9-(2VAOdvFQZKW=(5?-Erfm)AnsN=zka~kU&(+sRR_c> zlgdx{S;Xi3~9N1DQo! z&OXXNkm0|CLn{BD0aZHB-1>E$GpCU;rbKzyu+I z@wTu8)R3H4BVu8BW=$QsVe3z1$R^DBFP%pQumYK`!0eB7<^MY2h;kkoKq)d^f!QCN zarCSO9)CVv{|z!e|BMXwKO^&pOTPaW8SeiTndbmyg3JLVey3i8FJKz7c#{31%s&Cs z@I3}lQ+{4e{r4GUoUT(RaUgdRppZFwHvcm+;s1;b<3A&#c0Snu9+|TL12TWO^zV_e z{AbDlNc!xzRW$X(vwVW7HwK;XPQ zbsJ%VXb`f1xw9}O@A4!I|EPma>>@Sel_PVNq`!P%0`2mE{*X@(&rOs3mh4*;4Ue5D?ja0al+KmyjSEAXWbV$Po~t2L6Qb zG7k4&E+S0&4bgv74nWw}{N>3%KuGaV5KjLM;rqWJ{Ps752$km`{Ey{-L-;pK9s(wv zhw#5AzviyZpszRH+B~hr{Nv!M7b)pcQ`BXB8!P2(C&FmR!m4y2x^kJ#{Op*|D)Ew; z`EuVqTZOFavwAnMTE2WjUfvMt_618V z7&(Ki#>_}NXl_Ngu^}%eA%-8_-H6Hn)&n!hlZ#eM)0e1l8Q|Fl$a@K*tN=zKtua8J z=xQQD-ME+%foHcNZ>LDg>yIO?X*;9r#I6bn%p~Q|e~2&~fTvo-vzT>X9(*N-aETdKiboj>!sd(t+yp2zpu zIUCzVvc8MZ|0s>cWiVrlHo4!0<)xohijif?yB{||hSeRFXqe2;GZzAb=s;TFDZtzr z1{#3=xu@s#^Q3;~q5i4go@tK#zbG#$>uKg;Xyf_qfRG<0aJFX%{OQ2xUvj{~w)7W9 z7QpWyx#YKNDd}e=`G<#ADj|2P^?t=*Ci>=F^dB*pE8?De`u`)B17Zm1Jd2?dPij36 z_3zS)Fb?6<+2t{<{=X~Ft6$M*Gqh^+{Y4@?6%yd4@Y>?X@zQAHFF6o?E6HaFAbpXE zqEZ=dH5hGm_g7U&0`P*R+}L1%ogD&-0TvYf3kzERV99?jzY8S8+|#p61EOqto&^Zw z5I&t_!GBTi&9J&{Dd}^bMIDpCNgu(*v-2Z@Wq-(lJhDRM5%4=_c~lh*n~28$y+I@R zft~yo^ywT6YX4>l>7Ok5kL3g+0MDqAM+8Ka7tGJG0BIb;=CjiN-qT1cy^0Kuxf@QKF5J28V*8H1mGtrEHC#v;>XU@&%SfKtlOBO8uV99?h|GSoi zpJxHWIE2mTSnywzYx_9?ESfscq9ShKLJx59>D9N)|Z!Afk-$=^P9Gi}L=-$4qlr z=UIfQNq{2@nFq13<1`Q^V8l}P&CUf4Mnp#IGgw(&n$@*m6pt|b@Gvj7og zgw5wR{r{r8_9l)KkHNR|ECROUP%40nzqf-w<%mPWU*((#C~dzsbwoLDd;hZT_sOs- znr-@TmQeh`lK))(S1rN%d(%hQe4YjWB!@VQyk3_jGEE78;YDFKD~B4DPuRE|e^OdW zB=S6p#VLx#f-RMG(7$KM-z$nI)RrxmOdw>2Vw8ka@YrT+A@6kNU{-omb2wbF2laSu zECTLQ2DjZQg)G&=Pi(EWnomxqX3fj0UBDabaVwY}Yr(c*TRpjPW=(#zadtC7nxUs< z5GHc6j9uVATeAaKL7@Uiz<=~6pJ#Vk=2&>Rky$~Mn_=owF>tgEhaQtumhl{|PaaSB zfDd_&W^;2xj^Of;PGw@8?FNbdJw;95A=mq^(DYp3E53YXFEURVhj`}xh zM2=2YwALRT7cKQbRYS^%v`q*#?=^RR=C8ZxRNC<<}(2Wcs4N^lYJn0S@hL|7v*7x~+ z{NDH8weDT_kG*f4&)w&&v(DOk1Vy`*IO2)}vJGlLwzjmlHC+wr2lWfOYLJN8qxaJ;7b#=x4kU$|o z&vMPMM!?SZ#wmhw++&21ZLcmjvA8eV(rJ9?ZAXAUTOhyCvm(i=!BUdJlUg`80e8-voA;7@ z^hJh*XHGcSoN2iLw3LFC{^u<(OZ;0qh)IcN?r#YBzBPy5MmNitma^4d?UGB15$HG_ zf6}JHwlA)Wr~-LZC}iGm((=&ODK>h(>&}A;wd!$;!9kd8L2|SRTAC9%4<6MKXd$lc zhb46ll=4L@wOJgQ)2^29)e-H&cC<5a7Om@a>MlZ{z0#B&qc0OEV4jBi)%{8vYHb&(l}8O2>fJ zD!5V*mK^)Q{)#oeuR{o13GcjgF~k;NbRk2dO2DA?jIihR#P%VH_nE|PoLk9`Ei-8O>M~|0bv(Q6xYWBfJQJfoHKQt0=aVn6 zsmF9Ir1gu?eys<(Ph)+-VWy8C?lyp8S`+#|LkuB3lETmRY9EjCro5`F)LCyFqJ7R< zL>BWlSzNUA{eo_Iyhg=|LaGddvv4j3yC_A#6kY^1+sc(DbtTE;*ZSmw%o7ULpM{%g zVv^HHsOUYY=wt1DNW*4&XvaG7i8RAiSCp8@t4qG7ku1KDV_uPF59cK97R?Mcjice> z>@*A;jW@|1w?qlSfPG%12*JE>y5jXK-(nrK_0$e<`0I+~thss3wK7=3wFGrPg^nuG zsvK8Ge6$bLzNiXDKVpY-WFu`u18MU<|4@lV9*BoNr6PZ$7*tu$)7t{#kKg>b8{t76 ze;zwayVVqlJtHG#ql;6ILd-g)$arbxCU~pcgb&>fy>;NfMMmUiKd#4*+#_% z?wOT8?0Z;#@Cgg;QtY}9UqX1vhZ2L?$Z;nnr;lD*I4CBnvN2A6_^1w;0Z~3T^}I_m zYJ@%^%{?j7+N?-oU|DhRQoh^X-Cz-({d-n`Cs zWfz&(1320^fFT~fha@t)O8W-yp{#mFrWX(m^X;( z&TAji)8ts_%|4GBeyTprbyyX~n?8NcIsqDKXLHL+Nl88;u*$#7s6AVu=UxF{oR^o7 z!WCa6+j)+&^uv7f-u7!6CVesSz|?7f)joW}!l)~}jAqpQ{bWr9|HLl;n{Mqom6Fa>tMFUFG`p}n8 zxqEPjY)c?k&KN@R5T^-?xMVWXP_-!@V<(wUY--lcV(OrB;IK ziaoligUGj!lL{lMmr-_UZb6174K&7zmjMLyT(r2Ollr&W&4zkWnt?@6?1~}&FoWbE z{WVTj@u*R9Wt#=h-M7y&byh3=Yg$Rc09_$_-W*tt7?5FvXj@fppB~%Rf{+!x?<`Vm z5>{PmW8!BbOm(luRzbE4TH9hJoFe}20d)-YP6T&mSm|1dga4-6kk}N$v>ZV`)Z$+a zH+n$osgWmSU~AXCp-Es_%N$e`T}mKsYQE3N2V@%gw46J@l_Xlw$$s{SC~ICAFBM9@{j{DyXihqfk2BcuzF`}k7IA09*^=C(NMv*j*^dz0&SE5DNIdP!ouzVe<;_3WJ_#qlnhsiyRmqa5gId#-YTQZ)j(!MR=mL4;NNH2x6Zv%%)Z1FK%%j^y{|u zzIXim`Fcg-jaH^y_l&mtoeold)k8E0=f^ zKzFY;d9Z0hTe(OQmOr>Jv-G->O_Zjd+8~E{$w=*4#&+loVb8>hq zh=lXJXx--u9eV`e<_JTPkAUizoK`um`Nmu#8gjf4;e^qX86eN<5nCT`m-AG;ru)UC zW4y$zCifaUZ#>cy3}ks%CX2eFDZ({aNCQ1IKY}-rnO#w~eNim3Uo?1h!kCb+s{D%Q zII%!8#_L^$OwK}E!BL@&b&b!`I{Ikz1F7^`d$vGf)cCYAF1t(R8TLQ5pF$tUt>8M7 zgaZ=*Ao@%De_E4UySTjkss3-1Twcxz0DIb_Ic|Y#B@gPn2&$geI1xoNS6?9xPftE2(1@X$FbeyA@zD-%@Y2(tAo9-uXA!N(#6`$B}+;R|RT-L~e zvYc<^#kK`VzU|f6#neV132j=xhA1(0z=vaEz9>=bJp(=HZrgloJ18`ZOC1gp+Hg!8AKb`hUp~iC|1zGuh z;A;n{W52Ggm^`uY{yUe1C%Eqyd$0!XVGEf=x2PA6K-KV&^?CsU(IdjlIl|*buvJC$ z_rbuNrDel*xTlZ#fM;TG*WQ54Ki{?R8;vo;b@5tV4_PR0pLYS-!zxkMhK>ZAH*Dj6WGC;)e{Xmbk;zfIue`W>YJ7_x<--hZ4dhN z9v+?mF<`?c@o%0-F28%QqizFejx){ z+*^Kswa@wqP9FL8JCsF|&;&wqUCUMR6~T#GP6*!jVb>UVx}4DrAOYsanr)HDPA?d{ z)cpDO?aY{H{DlHw;uDQm&5I9G+aAViVnq$6DCV$c_#fgzbXr0;>zAdzohHmOk?3~` zf(JqFG6zczwgM1Vshuy*B{?=|X_e5-cFnReD$Hz4sE8rj$hK z5JHvS2_Ym9I0;yA?|q)eAgvQv(~-tIp&ySmbK!Anj*<@+9OAfoIDcyoI+o= zRr!7t;ZrB!hnn#7(8)s0#pyAS-|X>YJ`V?bWw~@2&BDcM!VXdgfN&6&#?w?Oo8j@7@K1$fqI2 zm#ETMm`NJnJM=&C7o-sFn5Zn8>*15Nc7sRDfJ(&G*&8SHZip9iu;dOio~EAhVgm%z zD2l~!pV$l5Y(KA=Jl*EB^Y8?etcFhQ4;RW_12AMq3D}PvIdb-}3l>f;mP8-?Uz;j6 z3eYw~73RF-*^#oRj9IjNsL7v^G*`YFc4(fal21caisTzxJC9kw#4sS$s;DBRi)8#T zy~poPq$Fx(O3}C{FyASnu;34STLm|lkpns(#>s!{onZ+r+W#1#R`4VC@#VT5n5lP9bZY_h z=%1{8q@!+lLwe*$%U?&1&=6Sju;+JuWa(gea1odE{Bp!U{$dH_?GYg1k8^SLNHaXMk_Wbzq$s@Hye zEczs2VYi*`=f82#&7*$(`Nn11XG8VlueJte*|<8F{MRY{3-1R#{E)fxLDjlLA#LDe zRqW2o?A2=`Vbl(>0`MnHnAN}=XM+6v$j)@DNN1FTdks#j$6ZNyy^xVoJ#6$qfG^#} zr^ocPc-Vqgydpk5ZdchTb12)DOA*X@1PjP3%lf9z>j`5_INBM13AtojYoxVGkDof@ z)2+Nq>*MJU5?)0XRF;^L-mt4-@Tk;wD%Zv@pEe!*pu1#+$mZIjrByo@D)P0$kkdQ3 zmyh+1tka`$xBfXDMc~$HOUw6m>?~jE^vJ)lP8uIcgWY>`_eG-0DmC^Aikc0q62f%- z^k1v&*UXQ-SbBpjZ(mK?5wqb&UmN;#?TQq`dUK1~r&ekJ2hE^>(^DNG5>MVjvS|O@hWXkdFqsS<4e7DHn&T9G^#!0#Xg3D*-FWJ(C`k?2-rAO0DxXK#5 zH|MdXF{8ftez@w*RdzW%Po10$Pl&|UKvlbp-dn3MDCx2#Lb_4mU|wtI3i*YGT&3V_BzPV;c1o%TSgFlVXEGHwf2ktH-d+6U;p}A zGSyP-;@LHcc zp}(js_=5Ug3n0SaoDz~%o@M9Bdn3>&hhDOi;plUUG^$tM?gMA0a=Ld93wL(p>cj4N`Ncr$B>4r%lgJ_k zoD55$CUX)f{AtIy#OE?nQU|Y>=HL$-)U+3CT*)sNn_L}K$=1t@V#rBwpCYx( zA2}tz(Klh8zvwKjGKl(kIyso%ZC#_y>uE&5HdXXZ2U@x9iz;v0bEZpju+lm=J-x9d z(bajDe0Fi+I_-IFblls~9KGkJ8`kO1DNucnoM3u=0dQ<{_bvHz8;$5nJ3JS{o_PK7_7ipiWx*t~tJ67hpJD}$rboo(O7PZCJdQbImD)TpkfD8^RxSQ;Lf z_Ahwp#+2R2DW@8@vl9~edVh(&wP>b|FKg{vni=JI3j3oMG+#O1DEZG`vyE*?WWX6; zZ}%e~l)W7Lu}iKL9dOs&QSF>eo;C7T>iJ6ZY+K)&@AI3P)?#+ZFCL;z4IT9QZsUVW zftz#Q&mt&;pKjb15EaJVmvDC0_9fXb00b|%M;Ts&xDASV|);3G>* zS0MlXUk7~*=@5~iS22q%e7^wb);@2xNK56FHJ`&EtoFH#r)mlS=CCq1`75xjH=TCy zO&6LPHE!)hE%DT7&#%oDof|0XJQO8uL%zgTp%;7thv08so9WJ!ln#f~53;C?LbqH2 zqmXSJ+6Ki5{i0GBgxGoey+(B8p*1?CHM~%@vQ-ihty(h(ttc#DFLWwFjyF^Ja_>bm z%O#j66qY3HY}2u9n6?B3)uJGv&*zhu9UV(1ot#kMwRQ}D3;(?IPTBU>oYC$$n##Af z6EMxPj`AJN;mF$a0n=jxpbj7r?06YBWvT@Pj}I2vtjq>l#=tpQP;lej_UyHlZ*!V! zimt;BG4s8>h*~c}aq9&tEMPPd<$!g8(lvJmC|BqvNYvWy%qT!-z-T!s<%RcK`czoQ z+yM1Lb;|c5Y?^y0F$}8SYlA_qKGj#3VWzHX)C1o!4P6M`DNfW!3-=FlVuJB|BM$JC zp5TUy4yc7iN8g4$#PH5i=0warNL=9;?n0k9LyQ^lGu!&h)Y?pCcc<9|+!6 zhN_|q6Oiw4ql^7sT@3K@CEd*q25%a~0#j21g*k{UuC}mlE=maUkYfA#3m|>tT-bP3 zVasx_MS?ojxXFvhwRf`UFNykr=s$T2G%fbJ`rHI%;4PH+ER=S@b- z>*wr0Yr*)QcQ8|2mt;h>Uqq3yE`jH_a(0!B-BK1QDVqj-1Xz5ox9S#JCC{i>k(dh> zNXJi-r6}K2S|J;z(DW5=r2-_Qq>BX6WUf1_G&niojNMmZEIyw|k7w@sg{DyJBksCS zbmU-GYYbf5{CPgZ2B~}{ET&P_|O@>~df#%Z9AfyjEup4z>Ii`WGNE zJP2g_6-DI)fl5qY+0$&mdO{_V_BL^OChFY_otA!;`DZD6y}QOt9}M}A9V_MYJ1%|h z?y)+Zl~JW<79&}jfG$YUO{Y^n0Tn4@t?g>MRKlqBkW&sBhRwE;4ox{Y9WLn;$g#PP zk|@|PE9=f*0|Q0cAdA8j3QHEll4cQq^A< zu=-JMjdurGxVtOxX%)jFHRR&)w7C&lS>a<|;d9K8(ig)~G_{I3*`ohpG^TfSNuF+m zChz3AXIfAC7M1w9V==a~D)0Jwyks(`SlEj+>vZMXQ$^vGGY&FlI}0&sj@wgb8pO9+GPvX6#|>+Tkc2y4!CIiJYEY z0mFA!Ku=f8EYUX-k~djLv-}M_Cbp9~aQ;;xg*X#c4!uvPHw`mOj*iV78B(f7bvDx3 z<%Mv*(I*kQ;f#45Idm5%DIj$cRsqo6X7`rSK<~{-lG&YYM7KkQx||W$N5E7o92?9c zyEmNF^J;UW)_g-y+REFeb!G56RP7W>ST|+Lek1CWYMjEAc2~{4mF#k4s)JxoL#b1# zg>YNXGmJOn^Tw{G4;$|#sY3j;I~4J-Ro(rP1E_V!XBeNHvJsp$j^2*<0j2Kh&7K*g z6~W!iJ(E3JTJ#h<`xqkzrFSU(wvC+DOAJ~-&Bm^jhMK(T`KteI#L*^nesB?k>rGs# zkl=hJ4I9(X^~yz`2IY@nbi9_b&_kVtji)z`Hi*_0bR;%_@m?v`t&O<}xO%7t4F;En zF)hz&FqsMH%uHC^LMxXkh*A}<-dBt1y`A9i)=oUyMSPR)0+nzy4(*AY-q{dN$_C}x2>jJ*Z z>tBUFsA6@3B1chW+ev%NX`77*nI&qDdYUO{ayYirF(KP`lo^!L8-UhY+OR$GXc=H7 z|H^$YSyz=D{bq2}V^Gj!V&ICK()F5J`YE#d{9c~(si3)89Xz5I=a?V;+B~hI?3(WJ z^0)Tu-SR6-m9}t}dWl5TB&#&^5?kg7CYHr%gY{JxLZ+X~sYa2)@u7R}uDb?#hdi&S zEx))ne=4Pb;|dHJl?&;Du51L)Bp^9!zlHNv8Y%k^VYCdAm^Omk#Frd<=JP6N%k08a z_xka$y2fe0`z)zN9G9IoC!TFh?s(b_CH9qJyZg&*kJj=S7WSGt20hnrZhM>zR0Kb8 z3`UOgFwr$6baM%3YKJ@!^YuAj>%O$)8m*d-b(bt3wx8FFbFhw%QO>~LNSHDN@#dQY z4Vn+qjw@rq8Q&fY=|S}sH=KPh1CFE&KQoRwvj$%;%>wbbQKY(m4jq~-bB{18@5J5BcFc|>7Kcn zl4M{5OVIVYyzZNQZ%(sfWC>(lFWzvee7dh=FmoO`DUrpYUzmYU7>MssuU@yFy6mAw zKca5bhqJ=0U8z{>MMYO`=8E)J21{Bz-L8{JUMZ<}i*Nu$k=csWhPNus^!Hg6a#&hq zyS}ZGaCAY(J~!A2iyrZJQ-aC?S>h{zn1DxK-YS*zbGCM_;vQ8abEj@91}uOxnM)bKe$R-n`mwu=?oHWM}54Rc=>x zem-cMn>)c+tZ!qeox=_Uu6L`LaFlLACSScR&t|i-x%n130@-vN6_P2E$WFA(1Px!; z{8$;G+U({y_+vfth<&3dkYwG}8U#T8LH4U9R+8e3sr?|kJ zVYcAU+Pi9XJ=rhY1ltTsyz1W=&l;kWdkZ_Jn+7 zhjDoQT2x}ZXjRDTeI6`3n94$`;U+C!vRijruSr?pKUzdCUt;C6mEy-{tem{(#R?pL zPZtAk&M3iMWA8`LZ)*1B4PW3Y{uZvwg8k-JY{xR`+84Dw`Od+l@78I&DHZHVxd@Vx z?F-p`FwJc&Rgx%E&HJjV_f@_lK^oHqUehen02gO7XJ<23{XUtMR=4X;(VZgE4)E#u ztyE!G_9*kUr%_ulBL}H#3wKdB9EdyksxB`}7EXrU?rt&F2b- zF7EkeZKQ~4&7Xq6-U0fvPQulqlWO}?rwj}RFc#KOcI{l`4*KRt<|*TSq>7ZtY!|Nl$f`OT4!Uan^1K73aslebZeMjcGXQ<5?k)M zW}EA@0V+2kbzDcPOTUNcQiZvh%%c>%(iiMQsuVWrcqLcgU1)f>(0IH*;0qn!&T?=k z9Q}m}sB+(kp1tb2(qqfN2;n@zY7J=TKnxG%U`vLV-0eG;&`~!B2PT(X0V&ory8BBH zIEpe8e`Fa8@V1<#f2#8$CcjXIPzUI-yPs3J3YQ(1VZ8+yvC%JNqR-_zTunP0#7RYS zlinHGHHhb|Jk z*1V$3t@{*NY#`KElav+lBs(TOYOeR1KA|p6t(v;M*tK>2ype43;(OV)$2AZ(fNHxS zZgTDVql$KH!J=JP0wSo@BqhAiz>^Z^?^yEO;7t2dldL;c_~lXsax@x}Nz)*EbN5jM zlQ6cy_Nr~-JrSn+F3AHlo<@9`aKcZOkqUHiyk}Wfxf0-h-TE_g=h@7vhbqort`a3> z>9QnVQ~a&QeJONG#k%@tibKzvIAtcJ$ak0&_JM7XBD?&vHws-Q*U4_mhNmFuks`;? zfK4g>9XE`6{)J%Qoh$fNjlwft>Yjsb?bnlvvy$xG)9H?Q%F*b;GF^e~*=Ei*r+6w+ zm!dzsY zSGmh;>6{KVe19>{y=yRS#H*aM)m9m{+>-<013muSkMsIuW8-OMioVE@+X|n}gOri4 z#qJq`nT)-1fVs(D&QCu^&kJs9rSh~&8TZ!AJg#*XYHw(BDF0y3Xy*XW?DME&mPoGe zJ0m)A?72hlwNnaQ^4?GBdkmx??oMu_C#ybexOHEcVr{bwqz8kchPu_^yC@NU{uG3w zDiX{(=-Q7=+NeY;yG1$=Xe+mIfS>j*V_YinL#FkfED&Jzwda(No7{5tm||5DQUMw^ zj&j~YvZgFS2}UeBK3pm@PV)^?261D`rt|8!Q+s+44`Y?Y_|xS_rswa=ipb_NqJX>J zzeP+m*YTvb49w1H5XtuL#j@!l-$5;r4ON7VwR&;G4>( zrxo1-)T({;xjqdpKbR9cOUJbs&uoFX(dIJTEt+3@#9Amy(!^=F+90cE{Oi!5J+F6N zL$XR?qWtog%<&@NB{pL7;?>%GJ8iQ)*x3!f@>Ql6Q#ZAoA=xKNCp{C8qtbJqc0TwV zU;l$7(6;K-?(TSJfK$gkDzB6_-<$puF0D~Ii4Dp&%#qnwVqDUDth+XAUC8?E-r?Xb zcjRnI`0PwPt6SGxXo1;2;U&IE2eg+*sYDhA4E$u_6M0kk}Wi`6|pn>2iV zpz>pQf6S6~#RbHGfxUEX`Nc2;mBG1hMxR@l%^1A>)T7;1!;2hGc2vUpxOWIwX# zWCYndh>U!1OSbG@LzkBw8yL6}^5$*Yn=;)ex1~O9mU{bb%YHcjcE)q1Z8EZ?#mu(G zlCA&;C}KRp1jmI`-0Q{la7H&Xs)29#|2s zC8Lx1j(+cw-8V~K!Vsci2wX1rk5#{r1@bLY{M>JT325&jsV>C|;Cm83DhGW4LWkM9ERY6aV7y^hN~INhP3ki1_vz{EO*JjvQVx6}eR|9CE^ zO>^?v?A?IdxJX>51DMsi^db-6MJXo|x)AFM_Da*r@&`V}ecy4o=e4Lz8Pm^B4yC{h z)%)4hL^k|Cst1p<)Y>YsW1~7E5PW~yJxsvyS!Q^mUNNYlQ4G)OtyCCAebN-9;hWdA0)x8t(0<^eK{%nVctR`Q&1h=_^1>siy> z(b!n4+Vkb>+(*PCU9OUDu%(Xa+vL5R25q>fTXU4S>zBgP?p*bxsJPRQ7uwdvYrjaF zGP`Cn7fWPmtMvOTuie+RqnfJc-{g8MGB{GR*S_gO7Fw$rCH4giFEw~gkmO~=K#;wr z^r}SUK#Pi5WID2&Gq09V?M*Zjs}4I%BJj{4~*+K!ppr2gz5BfuwUEpGwYwOGu0EIxTOT&Na)?UFaP} zmtM+zFOpIM$EF)QJTfb{22Q2TKzq4v`UEe~)J<E~g?R}};GEw)PggkO zn!MrBxKSF0>@`ZQJNal4QG?<>@gS+`Ai+!ZN}>xulKeW z+`+ePH!AxMhjE&K$awW|&aBIr>tO9v-ReSJDTYe#bHi&oeC7>5=$vn1YN4qSbC;4- zX?L)bY|L^-!naPOiqvXF6~fg~`r-2Ynl0@}9(j@r9Zo=pBj-U$JX6CI+(BPAa^d{J!xq5F75I2oRz2bu)4Wew<=> zhiJ158_t~^A`6)B)zv_IlpEw|*VJj;@^#Ol`ta^s(AQIz&Zp{dqDIyU>sR_ETb4&^ z)3&=-{lB7axAOa03%?~~DB6EDgwz#1Ckcf)g3vLyu>M)>S+9|MB@(_RDk)keCFKxU zdV+d`ozrc*d#x8-BQ1G1AoIdNMNp!FBVf>AA>YBUd&zxqXn`B~n5$rR;91x~)!ewv zJG)tG_;p*>!*pr8b`((?Q1uc+(OVsC1n%+l^lx8#Z}K81y&g=DVC(G1_-HjQFHA04 z6vOxQ;M$`)yOj-_Q(7rkcx2lrQkgNG_%pI?XYv~c3fi|d8nSd6>G;vmbp|}N247|X zG|l2~ptH5+G?@ibBq7wS!Z+x9g3~ZbUhyXOC{vIfc&A{2(%Y>m7Zp~hEIstZ=@VIg zWlXcuXsi5A&gpG-@|av}!rP1iDktA!$W~7NySl_Gz>9jHZ&7k73^$!^>80`MJNM(m zukHMm6h1_R|w-SxRiEAIg*^GyS^AJC$FX< zKSVzGHq3K-kO>98B8mN4R@jQwP|w0hx9znb8@I%7KcqB6kAKt6XDY3MOu2IyeKKtD z^B_Ssg!W)DEMDiUY&{c9S1706!2nSGg}xo}PU#C&utZ@>c&COYziOfE7d&;$^IBUl zcTO;s8+L6=3_;hKBO};#;xzbOX#+R{V(+Qu2}4W4Waoo#pK(%%pSpw2X2e&8OVk_5 z%#~QLdnv@g7cDD`W01S%^@~Yb^(O5-YXfsGB2{~yu)fTd+yt4Z`i^a=eOPsah*buQ zm3B(hInPO`dew^>-YI+bTBnH^K}8rjvE6bnUfwKC7$%5fol9hEb2MKTKAsz-5Z~;dJL9(Z`BOS-eY;tPUjq~TQo)VhawTA#oH-cOx+mmrrDHPw9YOdU_aUi(H- z`MNH+*8Nh3#C`n%hkCmtWmCSmK4Y%tH5YDGXA_fXP{LMXKa-$s+9GQCDyDX`Ip4a| z$10*BR2jEP=hOvPA)%AD{~)J7Bz0!XEuuc1!KjyYL}@Cg-}VI0O7M(*MGaKjXs75X z%l_QM4|#rRb;(*}jM$T!omQ9N(kqk+wP3g1*%Ah6y`=fm-=@Z#xa*_d&af4ez7!kA zx5q^=dY$KTWXaQN-2twtk2co>H(NFq<=Z>uQ-Fm|$DBK)rvui*gh;rG)W{a%)|1hb zamFZN_f7{;<->wIu;3r9@Z7f+B*$S$M=wSrnnP~P)uN#^PAoHUa6d!oV$=bM~%mv zu}&Zs@`aiz*9_s6YK_r4%T$_sXmuDr-FPqWMlblYHw}E=r*L9@0?0u_-k zTh48`e&{z|j&?LF9WKrcJD<3~ZMQJhon7zdMwU<(ATe+>e7^!=R&O({!b&B^2x6Nr zmKm)IO<*!|ml*+3xt-cs!8+~rKtD_13^1?1lL2>pYZ4!GJC#2aUQO$M=CV-PnQ~R& z%v>k%VQs_)%J%js!lSa2AM~|1DYsL$vgCFJm*?Db|CTbOla_HiG*M3?dPQsJW~6Q^ zmF+zGXox36KhEeDipR9n#k~(Yh#+c#r6Xu)@6Zg$`cA+58y2%LlSVhgZC%7IHz78R6a&(|rzci=z zw2|S0Cac@2d?5-H?3ov&*^sE?JUzqA!3jq2@9ib!7&GjbvMk!E^Sv>=c1n?u&h<0(m;7;TPW=7} z*QxRq=Pkt+OWx?}#-+3m#rT}UE+H%Gmd7zh9G>|IX$qKoyD1!ZhX!fSGaS>|Ar9=F z(Sk1}Fc|YC5116d)dH+~!=0z5mqq#cNwnx-F@}Oe(Ul4{EA-ip!?8@-7jmI->ry-& zs&%A|p3^rkF7-R`cEGDhCtnY1fdrFK;=B%Lf{sZ#jIZY9t#y zH>cdd8vH$+UBa+8*!b^BNM$>oiw3P8fM9>cW`1~s`i z({)B}vpo>kRBIi}K1)RtthdPYC$x)Hfo^#_Ki;?iN==uMT(rTX1h13%_>r47(c0+U z6LL*t$KyGlCwAnFbrl~z+L5b8tH8@o^dshmk{x!T0!BdoCT{|`bZ=tTdelZaWnx-O5;ngD z$ct?RqEq?Ezs$5eYY5EhPuecaALwh9Ap`3&sw7{k{9J7h1Ev18uyc9V!Q$JXd+WSw zJzXl;c}uSk)n>n7SuUu3+LLQi)2IYHIop$*<|R`y59{`Hv(FGgvv+eFIM)o%ny`7< zaz-W)#^MEsifwIJck-b6C}h0vm@IyAMQy_Ch8g&y3dW$w`$JOxQecE(#FD#tweHA3 zyk!`!-^X2Qu%I+wh-M|Im+<1Q;X$SZ@%;mszGrS(vbMY4$&aIuA8fceDc$9iTXT2! zLBG$p#Z9r$4e*?MCS5+lcy=b7k8bvRjH#7CKlj{aRm`S4mAe8q&D7KmWVRgBTi<7C zILc77lk{Rec_F5=j?rz_ZN;CnwDMB?hQu(`L#$@!g8%ZUbd)r&k;*;n^or`ESO^!A zZ>V9rbr!|PkPq2;OO*gQExj|jD~IG4*%pi&pVIky4+t;~9bqa!;g>P(oMG!B{=53Y z`Ho>YJFs!qh}U+Tds}DJWj9|~x*N-M2~NZ|@!V^G=9E)Qe@yBe%SwKsY_4x;-LQsp zr?EILfn&d~Fsg2wkbtB*sd+ai4L+ROyEBU7u?ZF+JPXx^^_%jTzP6?6HzS4X~UZ`uwvg(lb)OuW)ag26COs=gv)!4tqzh*~SZvQj!=budO@25&n| z!%7hy+p=%B$%rr4^1{uSg#~e6R9QAwu4jSqyEFNYju`WJ=8bxVE-@3&qFlOOa>!C{ z_|_MNu-fq2#@Wnvr*|O$pElRaXyr+(mC#Q?4O5S_wQP-8fuqdMm+&h-#=W5k(Cv}s z4V_4*MV#I+-k`!7Aexk+dNIf1Ncp{L@mclO2Pv089{mjYP8RQ0I#BX^3XPxn!!lEr zH+$Je#RJ=^?qPF9J8L<Lwgr_r;!1>V zck^%_pELp-q7Ab0=C5A_S_HT2OwphNIA409X_EE~7o!!N48d^Va?G%;3@(q4;j8-*OWjPhjDthC=WSg3sH-=b{2u zn!)l}b%q@d@0?^F`;vT|=D$jtsf&Xg!)XNT6i@BU#abg2OF59n+_Q+hy8~g};7i&U zJ|PTK8Dcl5dIdsLtiHy5Z2+8y_B!bEBP#KNGb5fwik@<#acqKQH)JF4HbOI|sjc%%n?cWX7umbY`~3OZ zr25io4o%}4SK2S}*LNE7zuQhU;Lq-!T958VJIFOfi{jmTEkc)!}wUT^Xqm4Gi!fQo`gvF4bD zm67jRIKHBuNJih<<~zD|*!t)B_-l%pndPH{utH&dN5h0pd#h>-YuirteoZ@IxxRHj z_Tge1G;#WYo%DW<#pygIE8nbzJ1(s-jB}2j23w5ya?f&~Hceq(%&5tMK)s@v$}(-g zAgm^yt(Yr9Mk^$fO={rwUs{(8s!VaRs9w3dQ<2&!_=*}MZ1|}8VjXrbP5`+0iph_=}+MSj3$*GMf&oHla#E!?vROa4xu050=;+Z>rt-iYy zm0|yFdw%cRo#b#3cB=AI8_<1>>00A;gjMGqBT?_|vIXsXdl&nbE2^LhTkC^Z zd)?Y9z?^oZq6q|;zygS(yAV^^mgj43VAPvcE4qlhK9rdt2WNYk~R*dYY+=`>< zEax`M)~9txypj;QeMY`B)%}Q$c-2fz#VM*~cgbWW>tqkMr@{Gk2VXdlG4!-8Y?f;Q zN}i)7(XIBC{pT5-;a&r{L*IUUDXSF9n)IF1^x?o`Px)~kyLhhM^`1SrXeN)z2=w+Qnfh|yl{rr zU1kxK?=OsOfYp6zNzfbYOVTg!P7k|-%63p@0!_l$7dnyyrFD^nnS{n1%1xX}I2e0Y z<~QAQ0dupZ);)3Ho%4Kk$+F26*SKZd&2rjE34pz~*jxtuN)P%idwznfzg7OENO zcv<4=9ZxUhJ#S)Nk#-X||^87L+>+FZ)Q2=C#_1Asek^Blo}QoH=7_<(h4_ z$Qu-X?ycXovu&T6H~HxhP_<~ja-(`V{dfECA3spoj=5yxCl0Nmq@a@!Agpqes{64j z|AWVKuWORxa(fq=YbCL@<;9P&|Db~h_;_{QMjosP%JV`u!u9E5Hx;gvXbZRMJe-34R=mGeg z3KUpT*ZH{=HtXT)GWL6EBh4}9Wa?Y`URr*>KW#sy*XqJ#dF}iLsm_XJQdl$#q_>lN1*y_lGd|2c+jIrMT4U z@2#mHi=<|g(f81MvR-t=zhon87R7AozyFj^B9!I#T|N5{dyP210Q9NIbh(>PG1s{F zBf%7V`#dQXH^nu8!jp6F?_MJ({F_BKB7-NtRPi^9?`%IxL{>2?pQP_QYkOAa zh1>B1s!DFV`JL)JtM-!zn!GDYMPW}$5{Zuf;yg@%;PP)=Zhk~u1cC{;elhy+?`&zA zc?6tOE!re*w)AteJHlC;0w0G+es5MDux9RpiN%{=E{G04!HB%+%n z#Gtt4>F*d!#+rwc{EB+>B{Bu0aCSe!w@y@qn-640^gxt&|8Eak2p%Mxqe(2qn&-)W zrx4mAsF&(Du3Q!Zu3VP#liu_?(!YV_uxRE%4gtdxf#He3aEE~5V+s5J1~yNoAW5|4 zLa-2det*_GJ!r3nws>*KA_dVR@zDM^gF=T4S`lmoE_@>pk50WnAQyj-0jvyK_*k<; zCL4(+Q!llS+If0x38s2Ad;hRYsc(#5HBn{>rjM5X6@4Kd-?vS~1CO=d?yVn{H1-Ua zZ%5J2(}~pM*H{(&N@C5hBy7oqgQZyG`XS!17B8lL^G4Cma?M#Pp8EP5OJ14JgxmM) z3PF}Tf`q$%$&zqOqzCaZMZDohT`9Re75-mgz54$RYmI2CooL{oNO3i_vRcIk;lyqCbm)jQWamO-VaheVs{hm^Ad=s^KToc7Le`<2J7irYy*?yd63isyy9;;QS`CKHN zWmh_?`I%Ob*Y@02X^s>~zw9O>nkOzaJx}ol{%boGqi44bF1?v( zV!N2O&tRq*TdZKrgI7KoPdFb2#a_4>SbHhv!Tiy5>WOr5g1auKNPoDicgm`R?c&uG z&IhOCE@#|RHa}T?Txj|nMOW7=S{c5Nf3YcL-%p~Zh1Caqnb#)Svn?@0nAqcMSx8?gJh$+P?KWXI{K& zzl&At!MoCxnQ9Ro&!hv2mk z8CATaK_qw|*TjuHb8}$xVO$)9+j-B(J5L0i()bh^)DzfU6cpHbp5`}a=80822k{|5 z{SlwG%fd1D4(X40`+*V;VzVSFMu;J$uF~%{^3E;?`!t>UA$0;8o{7hQu*6XSK0q@> z_7lxeK;z*E63~2jx~~>;#-C_TGg8ut{9AAngn`xDIkS<3z^e}M5iegH=97Z^EF zqwqh#5N_X(6Z0=H%;S%x{u7w62#GxAahJnuXgOl`_mN5bkpP55nm^0;-_cb4AE5ce z(#3zJrv1ND^M4VTB~ecTd(4N~lXqUP+K=~P2{Vs79}dF5Q`7q2srkbaLBju{8jt^j zIQ?G)Can9Ro|O5g!_;UbvKxhG$yXJQ`4Obdeb9?D&CoAT9gf4lv!g_a&EdvFxMRQZ zNFDpxc>ZRLP)hzKdua$+|GV)_Hla_ZrL%IX5UAfDh@3C!gvb8p)FhNpuO=e?-*sJ- z5EdJo`$04WQ2PT|;)~uZ1XurC5fB{rI{wEb5PoZa5+H#3F$w%Zjrko7fvQ=7@%JQM zK}4r*$t=Y4W(B6+ll<63)BgTRVritNNIS1dEcd5cirPL!a+CkWTFlCM(Fl+wf0{Ig z>Hw+0izuoLBfw9jL1*MYj$Qf~se!{N{fJM9+0AF1{U?9cynPVV0#hv9dP*pEBYT!5tAAS%@ z1esW=D&{2jqk})7Xh&owR$loLx8@gV4<5S!roJ=&=rqp+dBjp&T*7|HV}DYh--;A^ z{F?;|pEi2Y-z=RbwI0)ieR%zIk|;H!-wF|W{M!WrgXyfS7k_Frj?V1hJkzrzto*x&C@5(rKmCgGnDf04j(vGMvUz4h21QP_v{ zI|?7H6QBMOg?&f|Q7C^d$U<;I?2rqmJ`&`7?%C7BE*`#4kQzlDJ0aLluk251ggAeg z`GEEPCfOI$tu)hn12DF=1k#66Ry#nS-<^?s4%1iO}PNX9!}>36O|f-9NKm zT0(Bqdte1llUj`(OyR_&dO+%UfB(z@70<7)5}uJLIzAjcY!W5;fnu1D-GnpyRZf7^ za%`&c8o~C#GY>KGp3+zCqY?TM(Y6om0qO+X2ct4kwggc7Xsi!(A1iFd*lqvI*;h9v zW33q85YO$m2cgN*mJkcR&fl`OVg%aU=^~!n*S(d`NUXC`Y}~KJB3$}pe?Ojhj)-zI zB)o9h+NVQb@OS#hIuo+ntmOyi)-4R9i54p0-?`Zp0-QIDxG|ZCyS(oPeIDY+pgUMdZ7BVW()r)X+bL?DV*%6pg`mDA z1SlSK$jQX+Z}DmLGp@Az-K}FQO>i<1c=>k)q@PIyc8GEOs16+-S7sQ2u)xC`0AYeN zi9ZrUXfkwv`C))Cu~x#4KLLuk>@WYNdz%)q{T&Z-cSy)l#6=|msPel)3QQ7a+D{=r zG7A>+_v-}qfPGgxMF|*)aw3o{mf0!B@h1WYg|j~^x9k5M0Zi;y z5dIb6|Jrr$mLyr&+~Y$*I%ma5m>LLTJZRQ&Yk#}`#wrmABdQ>g=0F96D7%Wz-2L4n zgkWNscQ_}!GycO4Dgi*1|7796UH|V08voGYKN0?~UAKi-AwG*46GHMU+X)IJJnReo zY@9U2;G(Qo)7#-m-^Qo=3HQb|C8(g9f8=)&-WGd z|BCQ`?fMcu=8{-u>)}lNM>+i4bwafhvm=U8Wq&Ls7L)GDM4H3ZY$lO8{pCvBK@;20 z^*<~ScaZuslm0(n|L+L?D0lyY@PF;P)MSJ#Ol)B7JHOkT6OGLuNitY2O0Ukakw)M1wY&4qs~(EPKhz&QV& z?nIl1vN`h~jkWEMg7yc*f2+y=TtGB=NC|}f{_J~1lZQI*{{W#ad@JuY5O!Dy#AYsKs^1fqAH5vm;f2tl4_@38(+x%_ z!hiJMf4K1X1v7~nO+O!`_iF+n`TkS_(dHo~5HS4Nng|oXVXgiFkvJKYvJ)q@yZf^= zv331p0Ri>lDUrC}uYB8A0@36ltwO%U_?_~-mSlD*u*WB?Q8Kbm0M-k3f4j#^bw%Df z*4ZLfkP@XP-Z&6yX3seNPOGsF0B%D8UnP~Y>_#J#f>}V@KnNof%I@aa1_ES(49IQe zq(mS+bs0GXhCKcsWiN)}*n>vMK=hBi<=C0nu z=Ub83$`#YB2Ts2AkV^cne{zf6%|0YxdwgNfOK5vxcL!-IoebSB6hS%dZq`IY>kCMk zZftc>0A74Ft)p&*@HRjjDwpOkQVjRzed&5{w&D}Ae1qkakHGD}n?g?e?y#sPk$5Xa zjN#==1@?sVxKi*8BCR6QP^!J}^Vut4AO98bZe|^3a04;B?*A3)hHJe$Rw`ZZizyw{ z9IXekVCh5m*haytV^^SGFx#NazD)J}`DO=52h88#<+|^v<@Pr9U}(P2>*47Dy80C( zj}w^Jx{u=vi@fmD^890x>&F~XCm?l*l|s-qxB=X?Fc4lB*6($t*>giodbt3k>XW|4 z;vpAa_bwA`YrlzUOl>kJByTt{l;5Rp%DHAO zlhFweo|XH67m_{#^Of9b|57>kJjpj#qpxzXxZDz#JF|`<{<5)l=~BG0iNnk^4(RMT z-MReclE`i(-s_7C#$N#c_EWuXmWWn6E`|DQLz()TQ;Vf0Xl2$^=C>VrseRa^W8vWT5A+bVeV7u?=!WC*FhE# z(HQ?U9l0&m}0i}31M@%I`4R3WqBHBz9N2pdn~TXOR;6I($2 z?yd1Xl0ScWT~gxRCxGKej#QpG^8fbB>#h@j32UgX4RBJJ0?*CpmXR{_SuW86+_80E z7$G&}EWBiG@a&=EHFZT9_byY@S0z(d*_JvUn!h>6{2_qs)g^~0$PK$A4^{nnIz-$Yq7Gs7 z_DGZwy@hCrGDHhPm>3Mv#i&uEMj0&Dn>43@R0tgmYW-Inrl1mKZXjc%$u!!|#7Oh$i z&6#^`RrH6fGpdR#CW_I)?a^@*_gKFr3Fd?84OkJ{g*FkZhkSAe=0Ados^XOczz!hE~j-{>qgucXQC+>m0tPMzz*l>M+w!>m#OWxDTqzqC9-6aXS5l(B%5bTcKRjM z-GDNN-0p3%z6QiSv#ye^hC^2j2`c(QYVs`od+_+aSrU)lmK_mfeosgv0_EyiEtQia zss6Nfhj~b!c}PyRqGot`A!?OYa>PKOT`RdSpPqzcX~XWYo5#u>R# zlf27bnOgVxjP%rUsR(+o+l)Ml)5?_62IzX{#&+M963UfZX^(HOn()scgcs zSQfixi_cb}Cv1_;cL@2Ba~xa7Y6?1XqCej2lJ@B6Q3dpejFC5n?Z$NA$~$lbdzCUJ zr{WAsMX1*I7!$1=QL!3*GalzTlO@~*K^8;YW-{u&qxvIOBby(MOuF3k zj0)vdq~tgGybiyr&6 zbR|_af$KNpvgN0(?NJkJek}upCMB-}h0w2WF~1;P{opTDqUjs8`xd^7nHP$5S92R5 z(hA~>5%3Xf?xIpf8`9A5Uwgp;xk~Y+7RvN6KDsJh1x@{my15X>xOyqiw4N#7#xTVt=INK|1x7BoL`okr8Ch#Gx zr0PaCjntdQuT2sq{Rvv(qUxH^*DuRg^GR!R3_H=!I{dt_v&Eu?HMuat`iUk_$6+rt zvCQ4G?-uU6Tz_hgY0?UK1+O_m;s5|%c7FDJ_Vx*MbMpSx?b*U2u~Y_lDjM^H^Ahl? z32iZ(@LKXzKJTXKnkcEB{RdmJAsM;0*476D0%{eGtA2EwR|6FHLZmotsxXE_eiv?3 z(%4VQ2;5fsI1!IjX47aj%ad7tS&HTmkfPT9>Jel&e+`4#XD#w=+?Qm%tQz>7-u~LS**H za&#Ry8J?<{Fw@sZxY~*KkfI%n5w=hQsYHbPxYg5ChMO}Ba~m5{5W|9#odcH|I=@J z94=L3xjuDlR@QlCnb(Y{y3}Bn!l_Px?~a#t$8meb48Diw#W8=e3Evy>rr3rI(^bv!Y6t(_Dhr zywKM_VjvY5Ms#y)OkY3gb#BWg(W^+*g4-!yOAR2Sie2 z>YJ=wTrzReDWt+rBt84eVcSf|eqB$8c1UDt4Xc@{aVfLoi}5sGO0Fwy-K2DdsS9`e z;WCPTvCU_}YAiT7f`7LEXmc0j!6w61D2zE#-4=;Wwp@9cD9iE~39l<;Iek0YmCZ|Q zFkx-jv#t7R&vLZ(QMGu;O$$?E*QO2WxgSLVI)G@7DpU}9YY4qQP9J>(iQT49RDUHA zgW;gCr`*%4|2hLj2Xj34Z^}_Q9_mf4+p3ypFz}Nnh&=V5O84#kK!4G{aI%^?P=$G* zr}du34o=ftQBF&7FFwgXnUN#<)9M-DY^tu(Z4@l?cs5dXakTdvohHT?r?)%v^_3*? z(acmv6~*kj@J_!$Yj3_=U!PDNH|q zR&kOMscmZ-P?1B;v{uiTYwEVBP`SGweFXFGO;28=g===y21QbQiXgilZz^TpcnGe8 z3zZSow=wV&45=6UQ2=a3VeJih8u^LN%;x{=;KiMvCM{W8!pfLMXoPKXN@|yye%Nn>%l+CW6X5UfbIQb?g61rD= zgM9hIrgFx%9y`LRfoB6r`}6>Z^QZrO$IYa+6((4iXBu+yLU!cp?5&iCa%P^-l*OQj z??#zb2N!syXXD13gu^b48>y=BMR7A~5se!Kaevg@ABa9NQcXfUvi#BsQ7S|3KaDHg zCATMlG;>`H8@OpZT|xe&J|J){tcN}xu^z|O&i&3{CCrR)bL?F`pNh^@_B+a|G>i8n zK8^h9H#00QU%RD3@mLQCAO+Zya#R_%$J6owt|YsJrMtuYNLV6fn$_tqUBZOLjh7RS(X%?$IsZr56_tg)N8KC zwd19b5pNzqj(^*DIk|aXyZZB)lcED9l%P2g4|tFSHHGtW#!T1Q0;0ZJMWCx0^f0|IPCXBMxv8U*7RCZ%(R{xnQBo|RKswsBk} zyXwn%6@WzF3j&)r4oFmwO|kFU|$n3w{o^O@{0b(VOx$kGInf2om9Z1 z>X7(P?PmgC^eVu+BnT1#0MvhL|IcR0_8uOtzsk%M57%jNU{70|AYn+Y{7#)8o}I| zva@%3!2PD+_3aO=3u_23)8cHgCtW1$b_W8-K(>%C$Zx#SVyt#e*)2AX1X!=DP1f#) zNrUEoQfC2iGelc_#9c+}0Z9Re3RxK_YQv8!iU*HzGJ)z?3dGl3NVSb2O@o5oHX2iR z6Sdw%3N4^h2-5GBmS_p7r!8qw)%VN-TEpxl$;x8&p|L!lKicQ&k+M}lwo}(J$`#IP z#twpnE+Fm&9e644(Q0md>qGg3UY#u>Jq(u0p=Cb&7EgQE5DfPI7Sp%CZ2p=Uzy#Gb z;F`4s_ZM^@_Y>UhwqZ!;eGN@}L%CaY2yK*YlskR3K>cSxORc@G*5Ct~fX`gkzXSSr z^8PcdzY@7S?gZtq|3n2wV zO1M2^8NO`{2K4Uk9smhYL*|K(@5L-c8kxz=gZhDQy^&OX_ZQ}BObj#1XCokk%Rfpe z;O)kGH=@nNCJfedkQ>E|?x43!m&4VQZ#-?cE(OYKxN6_Ayc=v2V%(?9z~@iJ?55kr zLUgNeNSgx5#qc!YTCi3hILX~7&v}!%P`)&YiqXLOtL&oWc&#vkY-z|7*7aQF?j#@y z<;9m{l`Oz189&$5M?#VXi=&t+045vjJZPGgNN-h0)V&Zpn5G8j%M9KnMd&w2tko|l ze*Td(#X|?~lnfcP@mAWIb8*~xsWGd1?+n-Rqts^#n@S+9c%>AdI|PLEME~3O1wX03 zuCSj*D*w*~<~;hm<;ve!03eK@^PlMdGhjInKkq&A8-9o%{$HF(&J&#P{Qh5p@a9Xu z2>!JX{CSr1NATY)fp`Cv<=27yJj?l_`oAm$n-=Fv?DNp`o6m13!0wN&=sfVenEwW@ z;(_=H{HF$-2cH*?-{3b6zrg=PM$Yq`UzERj3LXD-i5ln-;|*s305bd?g;%ZbPCvi? E18@3QbpQYW literal 0 HcmV?d00001 diff --git a/spreadsheet/macrofree/azure_storage_checklist.zh-Hant.xlsx b/spreadsheet/macrofree/azure_storage_checklist.zh-Hant.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..5ff5743f6559f6db8a27a0bb582b4d540985a312 GIT binary patch literal 27123 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⎠oh|%D+(JJ|(Mh){?3u+^dS=1K*}cq^3jq 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%0Ako0 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

b(po*%K-Uh)883!kUa!pWHi!i- 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

!kLEuOnx^N1Wj>>1Se2HJ=v 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 _maqL4I zki2F^UHdFZt0eM6QTw?QE}Hq7ZB%{=_M0Ad)TmH`zZ-6Yub$%2UUFnHG*|#IGzbRhmxQbB*QJ{_-3xB~ep|AS1n;fH;);2rdHXuU zm;D~@p5Eme`hHxkZkMVdk}<+o^1J`{+f7?v4BQZ^B)7xw$c~*WfP=2^TVPZkp9FY6 zfqLgH)X>OPivCil4NhM{ZoW9xov;>tbG)MlzW0O_zICzJG~iwUXK35qt1r8e-v@H` zXk0yM>DpuHg!0+W+G|XpoV{Le-k4+JGu($M6FC7>?@;z}BRLCGPtRPHQJBR%V&ZLK-`A8ys+m`!q6q~u;te~MDCrOnBK6vjDO(6N$_(zbqx8Webs)4#cRwni?LpxqOD5LS&7?gc=U$*!#aLX4~`k zIqN~(ZuE!0$U4~&r~hW!)`5B9GO-q*WOhUJ`cWwQhHCn3`WeJd{sJayTwe6iKxSi` z^wh)t=pi>RQK#Tx#!<=OpbTtw-PvtG$g8$%JgYMUG9ECExJy|C8OK*nq-1zvd(xOxy&`bOZi(MKcKi){K>+N`-t z0J$bW_>p>dr?y|$huzk8Rgd@1U+&($dVTlqX7&5+r<=iH-uS=*lPq>PGR&>a;7t#h zN8GI}0$$@QXS5Wu&NI>$Fbtiw328({iC_(9O7XfbgB$`?>I1LSzXy1YJ~rl7P{Ao~ z1r-jv6=gEEzQ%D zO^xZDo4%-~olKu48FDjTtYHVwnp?%$5Xqt8myqES0T%kzd5^y2MaXK;wyqS|XJiPu zRXWVLDC;@WWCFjGx$^WKIR2`??fPWeb@8W;+9jpJYa$K>{hjgb5N;MxcakoHPNOU5 zEUA-PDWX`#2(1_=Tna^+EMX;s7^P0b?!<>qr+*K08hvckonV5K+{ru$H7@oXcY<=$ zKg*riY1{e$HTGw4Jtsr{q0dvWYJ1%PQl1Ap(%SSny#EMp;$XOY%)k=F(L~gwjmkP7>9Uv`wU7NtV$zoE1)eOmh17V3N_t zM(rNuMW15#^RUUd*l71Z{t3w8?vp-OuVoD0hJHzF%2!RR^K9!Pq2SxYSUDLl`~j)Ir_bA{k^~`&`n|6`rAI zO7q+?e(r`QIrqD`Oq^e=8wXYNQ!Nk=I|nh1dy2S+U51!OS5E6R%T-GW(~%URg~~}? zwTe_NEofU7vZ=zjp43N7r+*J(8hvck!(xJG*A>LU&I3;4VxxnNakbzNfxrsAX^j!p zP@cKO241rjleZnNDpyk|SZo!3-4_pex*6M}qJ0v0KkaZ&c5t>W#eZXVyQ3$$g0p!t zzG}=18*T(ho&$8pCAvN-_kPxVnF>ptl586(bfws|=iz2NnN^?@yMMh}LC21N_5~1=WFPciQ zD%^XK`k?Lf?*VP2kBxc~OmK=PnTOiO#iErdRCJ>M@G}q=kJk@=`a|D#w)+0zhQ>(g z4Xq1efY2@dcHMl32+Fv*&o@)s6$Kbi03K)V5E%Cw+bQ?X!1o7e zrZV&JzQ8fujnyC1hh_M)&sb<3dp5L#n8%p0RTp3GVsX=@dCt(fdJWYh*t+4U`_^}( z7@+V2z;woao1xm=Q-=h-5<}fArt^Mx5WazqV`f@V{J77j`Mur=GOGgTcca zhUY<^k3Pn2BJN9;p^wp(c}?@8EJ~8nToIbGTHjr=jFhR&sdgw;k%p;xQXhSs{ypep z^s!N2g0eeL@Fnx0$GBMUOAz;g6J?(#E!OQbe29;_L;MN)$^!o6|AN&!NSZLcs8`{F zws^)OIrr-cc9S5@bD9ka(&IsI)FfjrYHWC^3H#*&4q!gAHeH6SMORLWO3DldfLB>b zC}X9*-82bF+d7q*$`hJJZZ|%%HvM~$wdi9%juQw_TYeLe|F9E(@ZFz?2bhPe#l_HD z4JP5*%uOZ0h7Us>!R;Jr-|kgiTjEH93Hdm<6=8V_6xg}zeCEuXzDLo<=lU{rf>}3T zc00?zY%_q?4P05=5iN7#=Fb5Cr?er`)2hUXlpTrccQ69cFy2G)<-z){R|{md2WG>^$9`qVSFtno$^&#)c${)6s^By|5{_G55afndpt+pe7pH^ zJJ568c^KZahu&O!;lp&bCtuXE#(s4j4(DIX<(3wFA;dT028Z3V<|BmDWe8z(<-Fph z;z>)2BA0~LbxUeiGa`7y+osC(A4KxHK0-MCdl16tW2d@CRDSI2L)_y$lrS!ay2mN3 z(YC{oS+c72{nm|agcQZY>0#yaHf^uJTLu54jnAI`hE!hJVcYA&>c4k<)%G1th_}Qx z1=png0f=+<8*?++C;BMw z<)@2*JR_~YAssP*K)V`T2Az|(d6{!iuuT$yo7kG5Z=~kw$B>*odSKg-huz*w@tk#K z3?=2&Z!qEDY(UWN+t$3ftz3EAADR`k6JI}=+>}lJu&=u{j8Xe)n2`R2w+M}8V;?H! zk>=owQK1P=X&Js4UAbsgk=1ES+N5plbP-n88L2sI)0)dVPs7B{nU62d{vLcW`q+t1 z373yKB~&u(lu$9pY>)b;fZ*txr2fgYLpWNnTwk0q#aHh6s}ZFlbjV^^_Bz{SY1|mw zJfTsy&g^M8aNTF2n{|BeVB;_NPOtZS*W2XX$6vbdJ+_)o=tyv=d|BVd9?W20-@EqC zs&_Odr{X-S4uW2rDzkP;+tUMwiDK>Q2=vfUaI*`*y56$3ItPA4F$o`c9sqcg^he#V zq;H(Y>l(H~{h`zLplrs=`{971@St4>12=jD_s?;N5^x%N9MInsKYwRB_&ge5qIR_~ zhy~uR>5_MYMewS;K~X>U-w2{z$fmn=xlMt?_i!9go$q%|&}hE+`9n|xJQQ0y7E>g%t2?1;vM;tF~xxq9U(BKFw#{WJuhufT2)+_hBu z&F*pabANVtU2fODz)yjdg337`0hujBK%y(xjVg+oHzcnl02?Ywc$%gplU!C1PG+hK zE2ocu%pwTL=P4)lu;(Zz_KaJEFcuYvE9Rx-nPMW3z3w4@cys&7PwKg!ZNJ_tknb>u z`FtcDDl$PMmm%rUm3c!|TPl5&S2EM?lIhD$opF*1S<0*}D9@U(M*2v)EP|waoB9UP_)RE%sQ`+T9b`m?-pa&kldAv{ooXqkhJ! zDOm)P@;rq_+3cR7up!uhf1V<$i{nIMs(UGUrn=Z;Atbm}cBZdf?V+^}(Y-lTW2n#s z^;-srKv%A+LX=81q~J9GBBZ{uQ!0qcIkemJx+-{B{d_<~76C*&PyJB3s%NMl_6#%z z#lZ^Z84J!7IL#Khx@c`13OnAl@MF)cl? z;pqQpx{M9XJ%F(LDe%CcHqNg+X3Hv%=*lJIf@O>nNNU36Tp!6&Xg?`wElN>APBW;D zxnFtABbCQzX(RfuXJ{k(j8Gtn3Pp7gm2^!o*R$=Y6e#EWZF^wd@o*AHJG5)XR&Stp z6Bq$EX7HR3@fi+DMGh5OL_l-N)h^uX|5C%kE`*er0+`cx9DGX4vMJm%h2k)eH?zj59{sK z2JD|gj}GbO`~p$Fpg{B?F8<|s+;{)+>eWWE!}jGvj{|%ub`P%@=+rAy4pzi=aqkX~ zuN++iSr4^)Vm?U*s)tw5rUn{_*b26pKKD-`9ZP6iYDZ7Ctz?pAO`UPb#)fUhFIwf{ zq7{UCtGCR2r>O?>7gVm$XZ)Ze&eccPLx*|&*%hoOl4s_Ej`-|J4c`9t8b%kaVHk&a zTzzy?*u1#d|2YxMnNz(&g(g_evg#GOGUH9!L5*EIzi?lnUr?U%MPbAOu6niWLA^(E%0nGN?;`IXqo9RK&?yIb0 zB?NR;yo7*?Owih86)tpTRU~;qD?wml3`~2-NR#F@VO5qSZ7P^3BXNjd;mX4mt~px! z7nHfsXSkyK`*E-UqPMflUZ`XU!h#81uQk|&SdSiXC>DeH`tBS|MJK^rbYtZB216sv(P_GWq$|J3MvtVNB zU3h)-gx9xkS09Hv0xYZ7TYWYQj?6E;iOC)0hmKzy)#hlogV0M)-i$5oSuHz9!3TRE z`z()!4M!N7s}|bKT~j1tq1d-U%j>Ab1oK>0-$Yl=3fk0dDPf3Z4nR9b7|l5mrBJD? z7;AXsnDXnJIa+Fagzkrl7Wo&{HPL5GO6bh4aiWrF#}FzpW_dR1Pcu^6R+|uAoKxdO zg(j%uvKlA4a$eUWS6M++oxr>dsV~H`%}JZflBqN)5+26X<$jGbM{8}*QOCcawuwGt zk~+?=Y@(95I${!oIzCO%xOR0L%ouWF*CeHt7SYyFsTa}J`4!N7Sp^hbS*n~dnJS`H zwkA}GhBReak}B`fpEL{&p?(FFqNTNG=qmb&T8uX@sO)pH2E5KYCT$FLhwPfYN3C|<9)GA;IDO`Toj#J~7IKHscDsYO)s zEql-lGMJ8R0^v?=TAMS3Tjuane%D=mHAisLIW9L)=YbZfr)OaU111n%-dNs_{b6_P z#|Lqr(O@rR;cDtIu=FP_q6#Zz?UiZd$n zIw2KrVE84#VG@y(OxB7vB2DWmdSHox9Wm(_dGmD8%_b;&ZKIE5M*qY#TxQe?czSjN(tMhwlb_tJ2^H)d#PaWrCR zq2|3QhBmvL8~(nQ)-`klp@ry^nby-ECPT>N2xj$#Vc@$yBS-4B-i$&tOiJGwa!VKj ze{U)Fm1n&@!;86)Fi8y8q?x86&o}TK0~$`i`_ozm=JcRnK4?MntH^X&6&YQ*OletX zf{{`sI(Tcf@ic9c6KG#+wG}lik64gjMW*2@a?FCzQf2IljS2n$S@=F$UvE!+Bmx}A zuF@pnZDXc2yLgOBjwJji-kF9AvTKhs($6wAV-0Xec`lOoKPW z<%YSF8$K04NXV`B0rWLbISV14ByR+|m zdHh=C>%1S_8!kPZ&Cl@??&q;Vt=&${U(6}Pqe2t>#j-Lyx^knmS4d<=@+>I{6%8ev z!tB&GsZ_~QQ6%B^LF$*`X}Am@^A~viIpQxc!KMCUcJ&?qA?|{=KuqktH|uK5O{~~G z1ClQ|kPWbzZNT~;7;s1LPC9&48)YZ)xmeVNpf}!B2)H;B^Fe!?+@B8j%3q{a3_2tX zq2YPJjoHTYx!zHc36`;}FpsXB$u^+{Pl-s{5-NW=X;{NySXEm#O;gsfG>BiAr{ThU z%rek!(U@gmf=ex9c2yq#A;Ok{iTQ5aQ)TJRaJ1J#xTEPmHf#qFlmf}!dS}@2nnWLK z8^{R)ZSUi=ZfL&w#LkRo7sOGC31+dZAdapqc*~lSC;CoC8$wmtlExr(6IC_(u&9zc z+}B3^f;bH~{Km`zt?I_i0xf?pG>h4lar}pHW)TS_(f;5OgK{O{F%z@xUCoDr$enV7 z=^g4El)g`E=-|vrKiIHMhl@p$toD#S(Lar)+XQw?8;3LY{!p)bf*GE7BA00-e z55y*j>SGSFH=RY}n4tA=*y+pR`(eUDKkLa7ml+d=~=4EgK zbY)eSMI+OcR4M@mDQ(s@t%bfV7BrQd@iJ!2KAeDtTc%^ijDitj#*Bgo78>(xTmk+= zOfzOo{MTENF0pR+#KOHcZ5L!KTHOek@dy57oRh}hqI;X;uYsJ+dHM9^iB2y|syh^$aq1E*zc?pTDegp#DK zMM(u0BB4QhD||>q5pD{P*c&Pxvo}<5p}nEcjoKS3`6G<4`su_wmy1EeOY{jJFKf`R4I^2Cx8*{(> z2>kLJ#7=Rw3M58Qp}46Q%fKM$%1N6RB~3WVQ)tJLsw8#6Dk3v|IA$$N8kvVp)dzzV zIGVzmL_hSpb1yyuWI~_!3?NfrPeZ*4vDDevkSCIUrzHB=H*C)Yc$58xZMR@+-msdX znP6y8F!<;0)aoN^ZQw52c)qQrK89K|r)2~?nR@sZMu)E-Ov!L0Sby{JckRa@?eXvI zVgH}t#Qs*M~M_T-eR78`~^+#fj!0SV>WsOmHhm3e}u&*Yod?%{mO(# ze}K2C-yL+QC-f0yKM0L!>@XZGuBHwfK~y^gyFpZYKHQ^N2KPW$E-RkpMO~4k0O}s? z?g`U2PFhwoTGv7<5sA`#xJQ8lC+4a4U(hKZ*i%fkXTv~HNv!`86}VMq6nh^{np43J z_&6PR4}H_+Q2Fg(_}12q@X{J>`_P6-JnOC4oZ#YQh2dD}95bqEnvo}ACNjg|R~^Of z?X772UiY1GrR}g04-RbJeMM$z%Q~q;`n{=M1i9X=4tp}Kw6DHW15D~#!ozv zJkxOOu};Ikd%gL_9y~59mfm`Ulp+>OrVc?T(mBRX_=7NVe3Pm zg8c%2CRbq^t@-XsR00 z6r7Txsq?CBE2gS&g|hJB1_fT9pJsBHeAwhLsn6@f5w4X#Gx248oyzStxapYHp$q>U zu0RI9=N6!zJ%3`)=e1isD0S@5q~WLZk0+0HQQyH4^TU?)$Ag}&tdFGAQ7`u|F+T^!?qpBddq z6=fCGhg(?^n#q#rvo0Y(KvR~M1tV-}J{F+Bi|5lU4U-RB8YVT-(q>ou@rAMTEySDt zQ7fd5iy*xEeRDi8Q+%-Msa0H_Y>5vyBb3&_R{Y=hM;N4cZSAsO@$T++T=f=89{qG6 z7q9Ej-aU3l^r>S@DWAJj)0xSXrrx)k=m_45g0%DDjf{Br8MZgI0!0 zO|!DVrXyB{FN|0jD&P*3pItZYsJt*adC+;(!qDg1(_;uu4co`ik=PC0yVjojrrf>< zajeG}tbo@_Xve*qtJi?}w(uQd(s(A>4e34PghKa=+YTxcx1DlXNgiEUU%FIYi=4C> z%;rinPU^hOiD+AuRt+zjCVWDbeo4N>i`dg_2d!2IZ3mN@Xgjkj@A$$x796{nFftKT z{B~zRDg9{f-_*n2*2;|$4fJCWxjFm_bPw+BKm~xQDFDS>%ly0xtP0EMEgv48DKVo_ zE>#UHcVBjgBRQ(W!;nYO=gbyHkpu9vI}VVXzKd!PpJ}1<_h!|7WBdN!^}~Q*#Em8K2MVFwgy4+83Y8qK{=SsFcq6Y5r`N(Gskfv^L!>N%|b zsL%wvUIryVS5}EEnkomDXQ2oMmh#$hlb3BJs7PXGq7Nk~@#6b5yT;_hc8wP9r`h#v z!~njqZ`ZHiT&vi>4Ty&bt%m%gBd+b4$}Q2Ab_0*bAYCHzsye+3{?G(+mp!Mbu)q6F zZ^$=2%c!;=%gW-qu)<}i2Xtjsq_m*5B$?$}7p3J|=e6ZpS7{mUcPf3|IhHesZmYF@U76T1&~H&F!?8@Cmtt!wxm0IVcHKXo49nLrI`37p$raS++zq zr69B^nYN%BCUdrSB%-M6uo?L%i4w;YOfw@)K5Ryq)I>9y4TQiKw(vK^mQdb{ue-JO z_NT2&t9!|lzBmjzJG4SvHP&~b1d(4QBf%bmrWHefR{dMqr@=|(<}~?4_h2MoM4*8%?4)R3lD(P&v%H~VWMw`G&*>H zxN<>uu>;6}J|tfJ^r$aQNt@JGE_3F}00-zdd{Qe@>F;-aNT+=2uu-#cSAEsCNT`F9Ocs z?D3F7-!)c)ZW>}Rham$(gy8$LW{00NdN+t62>Sn}OZaQbJdk_sC7QupwBbW^AutY} zf=Vhi^!h2-@Xi0}(-_b`9aft(b3}JNj!o5tN<-Ff87NJo8QRoE*~pm4NUg}e%}8F1 zs7~SfW0KWsd~akUWhW=4(VZ{RfO_6nB$`Ka-fkmajR_xWbn1Ja$px4)z7< z4~CL?yaXUf)&(tt2pWZ2njmH3GyrbaR6ZO%F7IHAf}Xcy06oX(!jp9MEWJ+C1KY}+ z?DHJzscQV+>DCs|x@bA&m0(-Z?jmVdgtF1lOV&D%+?P#=Vn}7bSEM=1DJ`)&gaKv6F;+4ZO8xo;pf*a#^!Inu4cu#k?sL)0lxS&!y3%{ zW*zWlyTlw<-iAz-ZrY_$Q-s!k**J2knU=T|N!K2UNO~7*ESd%UpxsA7*yD|tFMmy5 z5qXEH*V+|;-{I1Ld-#pBsVJq-hPVh1lo>=i3TUg9&7`y(lbWlRA&q6AY2Apb&nX-- zOk3!NA4FvS0}|~hxHo#x4R?gLP$v|2xAU)q=W65{n3@F3_R$S# zN}4x3Zst16`FkW!JY-d-`TO!J0EBnkTtKvOCzbHnyws!BU-Ji+fN^c-fGw$Iqc3y! zb8hz72nNmme(q#jkep)ugCz&P%bD6mzB>4~Fp#v4qgYnBOOZ5<*$!D|)iBZG;@CzC ztP@8CUmy>XiNpbU-Tbq5jT0(chB96nc_vj(^{nl== zuA9l3#tqiuw{-PC?4gbVi8sVYZ0r7Um_MgWJ1<|7?7f4K3GM64JRf&(r$Su^r2fL2 zb~*)s&ZRac`yX*@Pt4ZLi^%sDBSo);`a44`eaJ4y7@;n*f{Tc3I9zvly8y0)mf28`U1BTX^a~=Kb$85iqV;h<4lC2stlmWg|sg( zrX=7B&~~&^IA2yns!FRl$E_s?nNF#QBvlx}k&0g1VFe^hx{`)t$e1WPuU)W0rTP~k zirFjYtM^v6?uUr^_a-p(CJFL}ublpvn?h@~H+tS5#+Vpn{@<@Fn5`R#c6hJYaNjqV zSe%1A13ZtEqolpKs|UYcrUWTN@ej{5gb z>ZOVu)=K+yhj(~vgZR-ZwV}j>k3lgaqhwnKHn>XGha$m^mFw{TT)?tXZjZDB4OAWk z@EJabg>>fZZ=lTjcP(hr^)qXXqCht9@x|-4CRqF;FjV+5z<$fyUk|pympM)>!|9|c zoWpCTyOh~aV<&`Dr3VEC91Auz$cwS?(@X}FA1g&^AJ%X$R^5ov)cv5~iZBxr4PgVF ztZ9+ij5x>$hBzH;vM?PiRTndh~B{>yr3m&~36I%Eun^nHDO07sLp_37EsQBfmEHfLDMW>7}97K=bM*WSiilBGI zbXpRGK7Km%wid5H2m@ z<6($6gn!W3kG2IUG~9;UA!%_^329%uipiZ@>}|Y ztx>-&OUx9mQ7NwXMW*>;^}V~M4rIeoYEo>*h`Wsv(#97(3CFK)r@R|jxwpVU@ur&) z!|C_NB%zG^LCCrghwuEbsV_hYVs*2d<1+DYQslVYYSe&melzHp1_1la8bo1EKL_sR zYPoy9t`xuv2Ker1Z6den-6&)iN)3E4WE>6nYi>JDODL#K&8wVEW+J)eE=H4?DGMbs z1PW>+V|}PCD=!wsb0HA^Qll4DD7-fs3zFKQ88;(|H{mdcNflkd4T8rx6yi@k^%njG zrFStS-WW1Ln8{whfHl1}M((U+*I$R&UHgx85zV(4x^v~7cHSYYe)!Gn8!WtM_yKKSI%6H27 z(<}?>I)IU1%^XLaMPiu})=mGxKpg>ONeeRA70ZTL?=#*p5|@%f)m)4oaPk# zVe7eIZeVy~9V3U`!7%YM=H)Uj>^i{sqqXN#v!fo!Ag#9(&(~&O1sBRtxB*v#TW_7C@qD{QDQ-hlVI!I!; zoOOf-=!nb?t;~8O2|+9jIG6r*dX;k!Uhi+i>AHn~x`mfpz60v5a1CK~+f{V+WN5`i z;1YmQvD)ggd+T0ms?eqIF`8|N>s1&aZHjLVX2s)}$@EP$f$J}}Js31mIvf;tN;*-) zA2(gIR~~FI{^6Fc0XAoENGb>lRhvQ%`X0}C62EWYGu$p2@b^h(E}@e59xhKO-RH6c z^0+`*k-Jq+VP8UW`Pi}~AYITyOEFjT{_1}~EKzeAHZh6hg2n){l33>~nrK}t1%;c^ z7$r2g;uSQ~LtLOXr8SVYVDPQaMoLe@nrJjXF=mV%_7xS&7tB@Ky-V*9vEys-91VAo zgW(tfFLM_ZF_YVyb&ob5*Tp)h4tWIP@^Y}N^OPFqfqrF$hOaUvP>LuVVkJB6^unD# z3=Nfp1bXc~gI2cnR}6jJU+;91o6~{JU=|iv_XIEHaS5&Pd4>qZ{4I!xoBSj1MDmE& zBA8=scdX$$?X5VI-}7>#r8TnosFk$eH_Ddc!Js>E>-+v z{c(ihLEDq}=CqC`43LHc4YIyk*q+!Wj58_Rya{o;tnLbvpmnOCOfjn5|K7^+yRWs)>%<~iS0_uxH+ql)abG1=;A z)k5);6ELbVi$(yKXfjlicaUKoGO9T7d!J&zP|-E#LGfg|{{*_vTwH-Mvl$;9^3Yom z&?``FQQaNzxjTlL3$4XLOVMwAVeEHjJKhwOi!j_CXW%IIR_<}rEYsWNj@}=;q0xWN zSjvbz%G;?XK1vW-5q}ikD$?o8oEp1 z{w}t6?Y;()zXQRE-y9&jNEcP}%0a|wIzP&gaO5b@5BC72zGLrl&N%(v^aJkA?=n{}M^h{ub&v1y+*r0CosamhxIOdvFfxXtW3cb0UrNX*44e zay>3n_M(}L9&f^6B98b?VL~m1yNOmxXY^>W9`i;t=uIq%l#1xX>{_?ZxRxPrAMz2) z&43nER?p1i-l_FZ3{Z;hu==GbuRUF8G>3~q_65h5pz{ZXzGIAcb}QtqLBHq6<&Re( z)Y#a=;qb`P7{ww#bJfaB>YWb@nxSh$e=xHJ@8!PrSy9`fT($FhA*;Jy<&{$GE-phn z(*%i=6jW4S}u$=M75j9MHCA`NQ_iT^oM6XM|jD&5Dq(?T&^wJ%JI~ENOFby9EXax}c`9S6t_Z4Q)C1y%|p2Z5R(ABtre+*Iylt{#6>Q zTS$>fzCM~Hj#6IjBqIzb<55@6eYgh*xi#bWJ@0qL^}FP#>MythR=FPAYtuvc1$CHY zCS(D=hXU|DrewfqXoYUlQpqXMm7+9YGH8JXL-8XLa;vaP$pD#d1cSU4yQgd(Os*ii z)?|V{Q+b(LFMzz+@iVZMFPq;F%FlN%#BHf>HfAB?{rePN5W)^3a z6n6_=sNFOq)+#J;IDm&yrb@z}&=~g@E05gq6ON99jHnsiM?1+D0py6~VqEM&4+$SV zh;1OYavpKpY=LF%exF-Fyru8CB?NV9Z~lpv&NyQ5E}Wz3HXnZM+5=w~6%b2mrWTBG z=<1{Si?^oJ$P47tcT|Se_u9(ncQy5VWFPjAt|d7)0`>DUJDX(s{j9J!9!bU4PHDv` zd4_uHC*J!J?29l*aaI0HB}GGn?c!+&c6n{K?dL%L zA=Zrsx12amzO#OoFqQ1bc6=Z|VdTpo6CW?k^(hB}l^7k2QI8ysCPw3P#f{sA988v( z0#(=#!awnfdi+!r@Jsi=JnetR`t`Dgc*8F|HfS`XFwYHld9vkh z5;2CjhkuPT8Ux=8sSp5sbBg;$%gmcUY!XrJv^|>+Otg@yrO!rE?_5L^NS|&cb)Iuv zQc@#DGm=^K8zcfTum%%^Na?L1w-^-a$ekY-B1*b%!|gqXyZw2NFd!Tx{X{PM8|(URhJKL__E)P1PuWZcZT(gWYqxoHhU+ER%4-kX>$KloHeetu`-eW- zlD8fqncvNCmyWIRTVE`mWL-_}ZDI_MaY9wH|8%%bLhpKr)U@Zr?;u`5hum+5NiV`~ zB~|%tUow^Z%5h47({Vpqa zNyA1zJ2@!_Ast-x5I0%!Aenf&=>&O+ zc-LhKd{+oH%Q=5csi*Hx1PPpWqH*_F#!0)J)mB<+%!CXtp$fs_?9}8cO|FtAy2_Z` z$Si&15WQ?Mgb9@13hoM(Rbm+%jwA01lLjvFI0aSluu#54Q51=zzb{)Uk#zJNN!k=$ z)pgdMSw;W;uvqTiH8@!i;Dx;pugxHDt+{m!A|{9g)zv@bU-d$YkbJObx^c119MxT6 zo)y5mj{h1j-QNue)i>iJG^o?}@Roa3>p~WXMnP~g4Tpd)p4S8U<1De&2mbnU=k?CK zBVQv2zFcF~0Q+@g^X$EN{kOV_NG83L(*|CI4gYq(NZ&9pZ@s${`vi*LXoo#2l=_1K>XB?y}#G@6W*-3}+IECrnf zlWB6F2YBFL6bGD0P&~GMOv?vL*$uJmE#3!6Hbw*CG+RvQ>&|e(J5e7XH|2i)Y1Xm?&;_4_rxJE ze=rn^cfrR`xu3m4+`j^F^C!x$Ig9G&(xK)Ov+fYzF*B1h%|k4jv^H(Z0$ACnbqLM= zF}BB1e#5TcXJiG+8Fq7!d>m6ifO^2MGjb4AgBCkjaclh+(MHufj&!D5a@#Hb{YEV) zPtoJywm4}&|2VBj+e8yf=0E;Q?!qy)?t6AvMCL?YZJGPvz9Bbugav)VGJ$jO`+Lpi z;wFqht-nMrNg$%^#<5C(hOYRhnO6TUSSM&fuW!t|@8Fhj<%EU+Aq=JfQ)TxCoZ_$Q zA2qtm*;tMFcHLpd*NHxcK}k-!l)gNx;eQa+>01K{UBGv`$%d@n`fT8px(9R zE>a|Oml_c?k4hkNz%GOU6gGK5GQYq#O649T2c8Q&mDygl0tIE{DH`^y}SckiYw>o!wI+3`&aS%q6`7iJ3qCb zQC!)BWT71Nw;pbLi%y|&^dVWoe40T;G1gcLjdL6LrJUYk(ZIELGTY4R2V+7m==)F` zNB0M%-5LYwK)CM!m*;}WG&TVWJx|~xy!60@0*^pBWM2~kdBsufdalNCo1;GeD$ z`YnaJ44xcUC1bcieU1X`XT{j={dMPOp=MeOq0Mpi@7vGiQvr+b@qF(l;ipqsy_*S= z6;eDDP~Mnf#zf+J97;)2IT_qyr;nVK4sV6RAXNvL-mX^42R#gnLnyvnFpvR_6EY#r z4uQ(1^eNgpm9}OIB};V7Wqtp%i46GH5*~s>-BDUX%!%77fwwsd>UC#NB8bsEUNB z;!-D+Hydn*+uXH>5biV1q0XqXSy!Z;jy#O~Prr9ZJND(YFUmdWlOuB zdb<6tu&AyLh;|$I{v9`M#IBWGo?wxt_Cx_88={_@QOQmEh%?wWWg=pZe&0Ph+Pz}h zW@!p`IV@yAqh1vcr7VpQ%wTktdJYAf z|CZ3#1cse#srnEe^!}VcR>!GlYVA$=01a?NFszu`pU7DaWZ&a1+r_kFple0td?h&% zO>x>q8scp2lQ31j8j{L-63Y?W;Aq1pCG@B?8YeyI>0@WR5!+$}iQ(ToviEpd(Siak z^+IfaH+o1q#=*WcRn3Pr7^2n9(N9ZgGKo^ysSkuD#y4Fmx)?fWyc}&6a!vdE3&3-r z--BlJo#7rM-NDk9f$s$PNwb3HYH^aK+jvdgJYI~*ThcUf{3Tj1ux=vmrhXI?s^`LA z`dA~I#`31;;%@@sQZi!?szl3sE0Kw-o-Uo?8CZl`F;Z=AQy;?9-lM^%mmHYEc$jAs%m60#$FGB-W_ z26dZ!AtmTLVQ9(9Yhf#zP6glQT-eg4SXaD90sOb)TcY+S;V(~}mGlBdPh2QRSUuZ= z%V>wKs1=9|$!4%r5A$V=#aY$IFoJmr*DM;=qA3vKh5av-x~(#bkk!$m9Bgb8UCZDm zx=E}f+IIFp;4l)c+_T{dWcGthYbh-Ywc%u*IHKH(lE+jt|52>;xY5BNF=V$vvVqP| z!v)iwfnATs39eD)Z2mNezZ=|g+(pc+ETbLsU~yV0%%d9elU>u%B}AEEJo{ZmC51eE zv*$gBQbW$#;98s)CHL&+|BKUF)^NeI2@4bQ=`HNnnc_3+Rt{ap!k^)J^}B+4WrH2U zY@*Ghmeo_$d|vSs3vp{K%&Y>w80F#DNvYYTnndsevtc*EWX@2H+IVZKdYK8!Tx0nlyf8E?mwy|O^@>#2Cv}v6G{%qz&hx4Up)B)_-kq@0qCeV7Zv- zko{6VKgtp9vmjd>cXW2OSRo+!Z3+r(n}vw9dmQ; zFCA&@L|R1}rD_^?u^X4a{MWQ|7f~~S#G!@itwaI*>%TwUQ5~?KQgzn5b3EIZ*9U^E zSXRBA7!drnKJv!>sLPjz;5v>(Orn{2Q#i3QvH%iMrmn|4GRaL=+8KY6P_-jtm+dwa zi>wkUwr}oQ7OUW0a<0O7{XJ<-$@&-)z~Byb8ICTZ0E9@$WCSWQnm$e zEP10ce|p%S$>WcBhG|gu&Aa7-F z+*htz^0<1LX?DsJe3VsTwq#+`DqG7XHKL2EMTxDEqND!u0LGU9jKkbr=5Wv)6wkpO z3@l-t)(8$EnB0&r4uvpcD5ktwUASs(;^=Y9Z5A;k$F@jqA<FA#e|7`ly6q3thqtyF}i*i z2s_bFrj@oYq*jyIsp?-yme)Or>7JypmG)_-YHgf_RI0k6E|3WH=F&?#6gL@7Bhfs+ zVY2vzLJUpxa>HKp25%k=~ zdsllda)==KB%zb%_RtM+J+D#rgWnc{Xa3p_TeSw?%0qGD~b=0dv!BNkQVhVOPI+-V@ieNTt=kXE9-z zi<3x0XSk#dS@D;1Pj&6Di&gyTN;k@!+9sxEUfJOj(_TQYCr%rjN?e_;I$OP_dUDNV zOL(I!Qr%;z43oNI;V}({JdU~lEVoXgi?|sn&hup`D~(h4wXDPX80wnF^8ufa9S;i< z`#@fp#7xCF7`bK|x41@{nF=ek-?f(B#YO5oq*m5hMJA>ih1M<_U98B|=d@EBkqbbl zMK=_RA+rk}tTVYd@9@8qdc&Vw{$IsvcAUUMBWlDGLAQT#4A{<}&lblvI{MhU97_S> zY7%0e4y)E|Bxpq|RZ%K(6q>>yN?+i)|6qvdV<*Mg!A^%Vk`jeR##mChCHv|&&c8NV z_=b2$+?9J>LzU+P?=JefOWxU-;lb7&IJ%Q{d()=xG5UTrK$_tr^ZkHs;cOBY@UYZb zfg0fcGaU86U+#bFJhj!j#@5q1+rn}n#$IoECsfl*;t4B5Am=VGs&K~PF8kbeX(M_8 zkbgqVZDE!BVY*Auc5p8ngPd=Azy9_Dq%tqBJ(DhW&f#y*v1gP52v*uIph^<0xCVpRY?JgyT}x#P=9IKhR-0J~gARF&DhC}%+{|Z>a~n}T zfKuyOrz&1YC}-~q51C+buh-A{%oWo+>b87$Ck)6t_3hsR?ddrNi>aomvq>+ZEmg8k zcWSG$U$R<>U4}dm@{ja+G8^VzIO?zh-8uB*48={qv0gVSk8g$3(#B?xk=)th*ETO- zFs$XoQcMt#aL}^~@TOQM&nA0HyhO6`w!ukTEL|2;;^KWboAzZZ=_-eRD_mQoJb+`H zsdCid6_VG}N_Z9`BQV3M>z7cSSrdy1g&jsGG0NZ+(^}Njm`b}OQFtMkKsDQuKgdbgX!?H3KvH>)~eM8KX32X#Zdz9 zcD4RnR~l9zTw){fJL5N|hKskk8hZtQ!8?3p_CVU7j4Uxm$-*62D~ukJXWyDiSZT@? zNV72Q3U3V16klYK^i8RMn`NEz`Ve18BISHYo%#wbVyDJgY8pz34l_Zk3@+}Pc{tV> zTHsghq|)}p#|D5$sXZ%Kugm*1{1(}S^d#nCqb!aEyyb;v*k-QBMUpf^UUHf%tJ)E! z(51DiKRWa{ex(X1$P^)yU$M@8M8$x6bERq^D-y{NMZ5-4jO&a3c|JhUkM1PS{L`=* zJ$$r_gfqnG=ZU5H_!K6$R}#;t;Wz2%!K2L)Fud7>zw!2wNx{*Daq)#|Xv~zbchhBG z8}=KHwabpLH4@M@*KYO(U_+LsbYJkV9Ehjz?|-x!>L^N6c=PWxRzr<$*QelfbhZnU#V%l#%P6B=46tTxTs9PwCgJAq z)r76J+nBbb3~pj#&Be%e?~_;Gf=k$Ga2M!g=|&+!V1h-ODf4t|$-#EV`k-elLKc2{ zLl8#GUBsU(3a-2zaEIZ*vB-w zdNW@o?tMg+ag*X~R7s2ey?gy17HrLt{NT&~vJbyKXVtp-D;xxIzk~&ze6aLc7r#Gp zqT|1RpevvjsBB?@6W9c#0L&``Zdqlb)uvN4Ij26=J*U67Jsv}8dC=h0y> z%rr_^=Wo2TF~f!R46$sS;{gkKmB5rMA0P%rzQ)tyvehV(t!vToBbrUqsHHBm?f!95 z?O|hy%3f@)IE43Tfxxr##{KH6g+QR!nbJDRs-E0q&mwa;YB?m8)k0oww_%Rl*S|eC zcna%$TVcB`$uzN7BmZqXyHAkMz0Z#PAq1_Ow?4PNZ;mb-5iq3ajXj$aq_Si2i+N2a zpsy*n=5~M&F70pEp9Z>Ol9J~|?y*ST9oRXU4 zxS*^|>6V3_xFa(>Qn+0Y@)x!WsKQp4nR$W<8tN7FBFvAN?PkKd|Ac(wSWm;3<;K-tVq!C;TJ^p2&4!|s+E z48PO-Age-DPXAemh;6h_zvFF z6q>70CP->r^@wlXO~x7ejrkB;29D#BirvOmBWovXw@OP%CnWBJVnK7 z!w?A^V_d@z?q8Y>`~A%kUjgTWvRShEY-k4=B7>{qQUQul(ALd0J%M%Gs%&ztQ$#&r zx`uUn(o2HrqI#J0HkFgv`;Mhq@5kU>1wDZP0w)_#?y4Zcc#P9w?G9{Xst1VXZLKk< z#O;e(jKvDM#aB-{9%ZlWvTZ|>qy9aOHt@Z@c}j(HhDCu*$N}@0-p+-ikH-)svvjoNr^c$WsxMRm|tk+kCliJA0TLRsitR z-Hw&dWuJ&D@Rs~Q;q-Lf4+_#sA%h8vS_w*~JC!tB;2bq{eKbvBi%|_id!CBGFL}(8 zF@TLo!iQTBFRi<%``Fyzp>u)leSG$0v_qZ3; zJ+LA%^BF{X3>^CW}E*2w*Uz|JV}o&=_6!)gOZ@ z!f8&04HN_%-yBPPbj9V0Y_2&n)8ZfRZYf>LpMVQcJwtZxHPj93|Kx-+(y$#o6)Qf7 zpQMHY+iIX#oggYjhDXppxEvCAvI#4_dJr@Jlb%R}xlgIJ< zBxy(?90N9~5P&AO!vM$)w8i)) zHEI1I@c^aJ|!;^uMZ2CS@TS~uu`D=><&fy})4Y+WKWb7u z1xzkR98VNX03Jz{)AOle>v2ha#C|UVRR7b`$O1yvag{l^=k2t(7|_P(KoG_`RVHUz z9TJdnDW459KAUselT-BI=yHgXwLtMjNHG5Kc1uQ8I zY%y&!y(D1J*gU!nWoEAN>*bhx3=qoWO>X16alM_x43d(FYh& zd-lp{LO+o=rj+%20pv<l`o+*=bY$I>@+3R~3xMWn0DZ{Kh3 zGLep(XjAr$^M5v+8#CV=pge4@UmZN-NXLRy&0?Rs8WO{=h9}UOa|qL3mY-m831B>g zbFMzyBt?lX4dVbuAoY*vQ)LCqrg>fV0+P3>m^{m>DV<4bl3d59^6SQ;u}~XYYFrgr zmTznoSzYMw*mG6#N52ha{AFozmc!9u1W2|b0~eGg0H!Zt=0P@eo_%RasV%$#XYhj} zI>}kj!jNXNnaRkh2h^sK;7~dm+?D!)BJD7KBbv}?p^K{H#)zuCnGqqtBD#L#V!bUr z#FpiJ*<`Xt!ggXF**x=?;yEs!nkeo zy{pQ#lm7)!`g_CFCh-hygTcSK!SDeRjW4J&t8AWP4zJX+ILlw{#--etf>uezRUX}D z)v?k2s4{yToWcrtSb=5X?wS4Q4$aMoc#w_P3~37mU7NqxBsUHV)mx$+&6MPkxZ#o^ zG#L4RKJ{L{&K)<0__S3}`Z3gq&hI{bSpcJnxS1A;7{KSUQmB5PYo?YaEvr>ZR+Fj| zwI>UUkpK(i>oSZ}0uKJzlj8(EbsphR;`a3ijHIcLcTc{SiQZ_JedItF2>uE8-v6}3 z0uXL-z(TDBOcd=%eCJRWswV_>ZlY7u9@h;o|C{3P-KLwECuTIUjMg1h2mYRF@| zzV%KS;2NV_c>WLf-iE0AIF||J?i0;IRp@^2^$vG8YNQ@lQ&JfcqlWa zuWS}Z60ek=Dzhww8zz?)FwkKbUn^=t4uiF@S@2<;`~b=X^r)@$gm9cG0`o5uz3p2Px$Wb`4b#V$*! zA*bCH6@sV7hO>60<`33lm^uP}{xY!$nB5wC2M>?rJB%|>H#RWDrhnd+PT~9r8g-Y= z_U{G(pASp41BQ>fF7E!@K;WW}MhMTC09y_*!!mD4y^ZG+T}!^ujfu2|jzt+=YeO;1 zadOxzX;NWD9ag!u!d8?JL?#?hK5{Yht@pyDYW28pfZ8&b$@}*3=prC%At>$kzKgZ< zp9?uB5@UA)!Suq@QuaYVvRGy^GvF7Zf}zNo(j{k~ky1}(g2zRnmV!w=hp~8|BES=|&SPL4JHZ)KOtc5(b6yD)MoI{KY zs_qlawv`AtW>WkS9M#7UNl6V_iL|48uAK8EY!7=r2$~5fwSWlTqkk!&#V?$pqiGRa zSB7>k{YqY9%O*sdOXu-jWczVK!p|H2(@c^W@+(+~Jv)C-OpF>mwc_b*1q$NRc$1U8 z(_Kau9s8KBoP{N>;Qpa|CHRv8V287+UjBR`sWn3(4z<7b5=`>%Kr>vL+eVv8a4^jd z*IXq-ceZ{b51YIjH-CdNeEcQ2HWU2)67l22wfNYl(ZBQk`Zcu@Q}0n9!2NMij9m#E zO`!(McbMUAWB_LtCPYqghC!i?Ni(z9LyT9pqnuY#V*k|79u~}e&8DH%f!cKcFuD@l z!wk?KwM?}jqc{mMz-iW=Z@V%00~+B>yFY-6HWSXa5ukuijbXw74j&*T5L?_1l<7Id z;vzc6tQu*XBI#7%UCr*Sni|OoH2NtDH8=cDrnk2PYaxHE)Ho_3!-+(P!9Tl~vR^m* zvv{m?3R!s+oC0G_--u`eb1~NM$>)oJ;R)R6(vR~3!Wrrn^Hq_%vd2n>K9L>>HuLB%irYgQ zOUbR#5(V6!P01o5Uoi^xdwU2osVDDYRs#=90~O<;F9`^bDt05LjtW! z&~=YrQPnKapiHy^@VfMppv6r9%bFswwRo+4m0uV*`>SKCW~BAB2cGX#nRZuOS=xE~ z-w&sVSt>up{$SgdzZsC!$!M)>j`f*x+_S5@NOi5UW)tR)s37ABrH_)5)*4&oR*tGx z>Tu3Q78|(*S#>g9saSFen=Fgw$HcC;P!ncq+&MVS+dG5kU2OE5HP9b>gA6M!=8XWm z59@B;odB(`IV%rS1VqS)@mr~bS+cJMpD$Ky0tl;7lFYj%CZJiQ4_;3keiMuxqB@ca zNnJ5TB`r?7vh!$FHF!B^)jexveAneLDxFod9_r!W7FQNl7vNgjsvP03i1g7^knuB5 zw+S4Okc^+6h8MN9@L!%U1~w{1d_wkO-NCu>VnMX?9KGDcA)7beD2@fgdW~&i1hcg0 z;$Yhe_AF?60AE)X43*wgzna7WnhY=u&P_^F{X76_uqnDN(E_?UGQXo1lgwUeqar#~ zrM;0A9KHWsRx=>BA*2!wkoW*0(tv)bc&dg>FWi>X{jd z#Vm1B+TiT2CJ_)9HJ(6G^|X`##56>FFlteD2Sy1PPbCOFVd6RjBH-U5?K!i7K(s`K zPX5{fUM`s6sAnlwkPSq?$FpkKqb8CZN~=|Myd**+@Vke$r{ErX8eGN1L`hYl+fax6 zmS0p$q!hiK$dr)58&|D5nm;mH;7zWARE%Urpz9Fxp^!ApLVy*h{LNxS4~6Ij($FfU zBwETPYU=8VuTZps`AW5zrm9LCjzgp^WcMe`QN(M&eS5@z^?28ezSQ>Q#v`7d5woY8 z>bD53USj0_>~U`@{VkmnnkW)R-Q}g&q-=)zOaFM6XjU@Y3OjzmM%~00)FSrU`>`?W zE!2jZ8mH_RsxGGQ7itGgWa*~@*dI~;15R{{00up|&=|2R#fOdZ0CMyxf{D1zaZ=8u zq%<+bR=XIRB3I;q3tb-CsEb1NO2NJCW7W~3^Fa;384bXx$p={Ld{%j^_efmVgIjZO zh#WMN8t}~>E-I3a_#X6TC8L_M%16tpg+d&iHZObu4$2Wyre5m$H_^!Mb}8*CxP=^` zcOYcpT8xD6Fj8Nl+aZ|+1G^dnF9eC)kv>`MGKPQsH?s^vwnae|b=(|f(v@snIy0GO zZm9_gos4yObDxs=0$fT~mBV``C&FB8BuAh_ulb`k{%Lh+8}CXn4|wODZyBOXeV-^J zKT}lfqD#(MoO~j58B!<{7XQOV=)7q*E7)nF#AwOkbK10-h&5_*RG)(eYE%F@Hk$uv zRThEi^eZA4;i}#C!824!w*F>?BUCxh`uS{iW+_VX_=xVvzcY zc_uL?xC*p4`JhQ8bTlg^eH377ARZgN7H1L$I%!;{QW9rs?n}C9@I(@GYT3a<(cMzg zOmGVs4Q@PvVk2{W&bhcS(vl?`wY#>>syRbJgkOZ#A6Vqzv$o(W76J6AXqp0Ch$bUw z(_vL6@j&|wtUjYL8C-RA0rU+zNil%gqm~&;C6)r3>}SUv^M2rmWaU`}WCu;OP@9p$ zafh}@CJK7;7w5n9Szr_l5kADE5kkr^8>7x5mER=Rs*wZ_?kbSL+B)4hI{+6v6dm?G zTm{wz9oQTN77%!0U(?LQqL*OWL{emY)QJCNlRDVA!hyv&*B7o*^eO5rz<5#xK}8>! z0tOovWCvSTqdt(zMj2+l><}5IIj|ti2H%hX#PCt(X8DUy_F-Z)kQ1Vb8 zmD-`K{ZrCx@Ha^SUg$Y_@gfw=jBZYWACsp;xj6#cDOr?()V7F$eWPih<(ePm_<&ZuaRD^Kl(Xi24%P>NC`{I&F@9we65X#^wsTbJaS;BCP5 z^hU}S`-~{SqD5I@>ycgb-Qx4EGl+4oM<`XHLQZgRhUTJAsS8dyn${yY>F+h~2|SuNI?M z0|9Ci{lwsik3L{**8a+<==5H4sWfC(R^-q#rXuHEtG~r*Oo>(06fqX41S$c7VqMgv z6em0;CbwJxMdXsx2cv!1Jn3cI_3p{c2yk6&IxaZgBdVeULcBD`7;QlF3_*!}6(zSa z>{1aH(oavt0GII|9K~U_P|-szl}knRJ9q)JXhKQ}BUP4Vx9xzUnBwlf=$6ps2|PXS z43+^4Up*lPfn52>b-=|_g?%hLvO1vNU)dIPT=vC@m&u|8t)~k3^{@hBpF|0MKul&5 zb>nYJL(VyC#iaC*+6t1^y)a;z&Tv zu19r!eu@#PPMi*S#2pL+=a&ID!TX92=CC%II^vk)SBqml! zRtZ~|E4^T;R(Y@MlNMV}SM8}LmLq*#J^2Yn#el1ZE{h~hGk1YJn9siNwc=GBL0c5) z14P0zUu59_HRC(mny&BPk|6Q^6N*>O5!W2#8M%r+fm&l&e#@{famGm>B z&pl*^J%wI8riCHnhrQ9NdsS(k>k!QAi#2Q43GjRdCS`SrQdK^{C2nVu$Yqv^t`kes zmy8d=D89ll2}ngxiK7F})a7x*>!gaYkt}{)qx}2OvslEh!tGemLvDMRxZ>eOxANe@ zvD~Zs^}x=kAy5b3>_u5EU0f@Dvr-2LfJ}xV-euSnf1zTeJHv2*uh-v*R#!nLF9=}B z{~_rrgW_tIDDLhM+}#Q8y12vQ!3hM1#e-{tEbi`Z!7aEG+$FesaCrOG`>}Pawx;He z_U-O-x_cr`?eV(c1GZ_0_!%AJ14nSsRyqsMY|}q0XHo0zY~PxuBxlM z7f4M9=6hZqV*#Y)38L}fa3|~ZXHZVH0=}9m9Wc1Mtdym|5uh_6(*Fx!`ONUddamCe zdfj|3mToKTcOR|=LC7K>2I0*4WAk(kLr887H=D*-`mR3|m&45lt z4!JFMhMwr{{6y1pb0Fu^hg(ooc;7r!)B%px&_%d%Y(5xkpZNaFLEujr32b|Lsr|Wq z7WTzPFF%Ie^qD0ad&cjyXM@kQUlg}uwGmbexy|e3p!jfD_4yq&#etdZ3X25|eeGQA zpX(E$zxQ?)j@ZpBH(_^Y#+yUdIS;}+!RS5SW zb}7-Nl=H&XH{@h@#V?mKyWiS+Fekg&3Q-ZZUS5B&GM^M+0P?)UW==kAE{!uk4JYvJ z^!!fyDe5Up#D1+hB{LYhw&1bisiT)AW+)Hh)$p>bA zvLR}>-`k~m<2REJ`t7ZyrKJzR)dX>KIqx5&oO}g~1U&Vykvuf)Xcg*SVEho$d-*Re%Lx(4Qoo=7MznIgJXxks1|NR}x5~U2JvH#?|ID417a&(FJ>^A**6E zf$<*SDo?P_!WOo!eIObAdVy|IgCiL}xnx3YZu{4za$)jjVwWi`TZXN`l#Uzh_tOE` zB1}2?EdUtXNHQS(e!vUJkTVPnTgW*-~dJV@k9-&8!~hw$&{>i9avd} zDrnQE5L?RT0%mz_yM~s7+ne2btEgFQt1Is$I?jBT2M; zUo;TDaCi&KaE-Sy0tpl|HCv|J1$!~lpK+y1XwNwjvkbBnwR%%2MmU;kiua-1b}LYv zAG$mzp(zWo)+nU5u-XmYP*jkvg(HT_#C_k-NItgg#U(rXr$g+;M<;5P=exHgIi%}G zM^)}22q=BN!cV1qxjy+>7%T5VxA3>Q;wJIpr( zhyAJB8z0B4yzfs=0MdvZ(;Cq+LLmlHC7hpT3^>Eu5k|x^i$#5jeS3)PMQ^x8#g2d7 z8WYK4?-@cZ0IOd-Nq$2SZ8Jq1fkIir1xA?HMmSdqz}E4wq~_HgTE|Ew*|=78QF5H{ zvR|poE39~!dr@l48pz$hopg&aXu)|V@ugu|(b*xU|8B0#q)<>K6hBKQxLVMm@K}iD zx;q^CWGj1TG1JlB?FY7f9A^N;P^;L?R3m@EAy|;@YmMLJ`s{FmA@-2!B(E8QoS+T% zd>jYKX^t)n0e`CE_(%Oo8c|3Z@||ny?CKOW;6^4A7D1DAA-yUxde<>hpS23@X>#>o3Pz~ z6gqW;9YyepDMyK1B3SEFT&D<+GR+>59sMb4De1YtEi9rfpPF+`S?O;bYotpLwYhghA!;ot?7~{fxOH6yyag-3IN^xOd$?v@Mcl0bCO}8hvL&gEp zSs&C&i0rJQrBOyyAchvyYsi0DKQ4mEKBLozssL8|YTxD;12TSJH-ivhVU%gwvtYU- zE_?dy&dyURr&M%KF5o=#rX{|=9S$o)#;1mhW+tjndoEM<7EN?8=hsA*RrlN5Y*-nx zmRgXxpMuo1NGkqPjWU_cgkbQ-KgqEU;0|veZe|D37uikD=d%pN{qgVqI#T^KZqgio zQ3;N#W|+e6t)L){C`~_lO=AXB+`8b0JcI0<27<3S<5LxKF2rZJ`0M!1HjRFthcSv`ntis83$r4ieeTXnnQrB zed<`mbuHm{V&%y1kQX~}Yuoq;Y^EKM5@y(m$DupnJF6N}HAh`ci~i;y3ALSc;f}LA zPaZm~$Wl_(el9~@VX>0?owrL5I~sx+E1%bP^2*5w_?kzbmx1NTS>{zkVVPwbM6M-?D<%y2uhwi||bPoP|{kk!VnF z*&Qa{4;=+;{I|{Q?9})~UC|`AD7dVAQqay4(<(=%Jl;IURPN9uyXe-z$@dN_Q=&DI zNxRm}LG2=e`+ z{ewhaprBG0Cutig8<0~UOi0|w9SJL9DIeF5{Ko?F8I2(Az*(0vpHy`0H9*O=+fo!zqM?;;>Y8r(ljaulVO#sL#4icKy$znuqa5A-2xCQ}7HN>^u$L}ghK48v zO>`;1C~4O1){P3CN(}eMFmPy=l-?de5^U`_&DJD6y%Rda0}!4dVi?W=pqw}FwDu>j zH}h7&KoWYO^}P6Zud_|IPSk9VGS8ep7NBx#rd$c~b^NzXc?y+gx&r{>#wM(KUVZc2 zYam{br`6){^A6jM{T8UWYkhZ)upgtengk z@r_gGHa4(U3QYF%GOg2f<&y&8pJf(CH%_>~aPYTosOCt5-%dLIzZTT?AuE=1zgcbhdY*R)tYw9n8 z%6uq@mdjkVKDss&TNZ&!eF9N;4uw7GT62m7wta}+sH^R5GZ!i_T8Z;hbe5Ya0yRtNrkY#>UJ}Ser95jo?*Y}1Vf8(@~C3x&6vDjb4OCb9kM;|%~d0)p=GfN)}>=l-N$ZRDX zdipRIN+9RvRac=mRmv^FP4B^}oDGz-U`JdzmEId7dnJN+9*veh6FQb%!B#xy^@x^m z`oXK00AOrzf-nl|jK`THM9AD5OTi!4vN*2pCa44FbHnb=pHN5>;R#;6eQZ`e<~gZc zQe}Ek0z-#=&}CO|vZ`B9%kf{PHe|gO5ge1H`*lhh+()uCA~oc**Z55N?3I{1e(M z44K`RJ*ZYKK?kT(BEhrlc{S6bHP|f60|kEOBA=w4XN>s|R3nh8ehw{3pT{5GnnKU; zbkrwSY_#ov`PAW!)EG*-CCOKnKio`O$3IaES5T-#o+Lu71`s(0B4E+m{oIr0*UfS= zVE3F5w~(e(4tXrDbKu;L4R2L!t#EBNXOB(g%TF*vp)?`wDAHndX+1%+Th_Bnk_A7D z8NW8M{)aamuo6l7=hUS&n=lYdMS&o`slUpDyB86_l~NffcyZ}C!7HVp!9lR8i8Sf# zNetU3R%!u?r=?kDNFNfLpVA<<0wid&vQ&U&8wG4StF#DE6I{fz_JIdA;<0BUlDt%E z60;bMagD0}1AGbuRdJRj1qn;Ln^yW${QHiZY9t0s=XBLxdo^8VL%TJ36VG#vFp!}V zWX9t^o-GT;&2=i`l;^vS+Gw0C{a~PrIJ3?fcHxT|3mTus7?H=!JaskcB`S?YqX zDVEneQ5flCu?h0H=6jINv;;lrmLs#c5JhHS=D#57{`y8>9>P_r>p&$_@yAq~FnR3j zDkb+mjj5=ug+B#vN#=y2%lv5Kr7aknG+Awz@#|p)o_9t>*t`;FZb|&dn7>AyL{b1P zoSMv8O?%{dtFH*vh3ag3eHx%4(=ati6&zHK{v?UN-2P41kX;-)D*R}4v`#ql&?W$X>}I9MEg{Z z--lZGIg|GHHP{^B1!xp$>8BKg$k~_qS?SYvDQ%-z}TC&8;e)Vr{EA^ooUWYoOgQHc7SvdCj5jlg^`s&x`e1{3PgpSBFQw$4+>`$~3hP;I4&IthroTrsz;Sd47aJ`aa(H68d7J5w zT)!RT*Er?e9&Zc&B#-D}qQlUK;p1pIZ(gE!8(DB?+InGGVEe&oohIH_g_2c{-^vhy zv-4|wBC_X3{C(A7@8kMkZ3~D((ks=~zG5ZTuN>o#u=qZXno?W5u-+FuL~s2D-k>BU zoRS~I_0wamS+dj_08LPvwnM4WUt}giu&2bG!qF9Wfqbd{*yOE2ehanqu}P<9yY-}| zgU}-j6Kd#4!f=7tuS`$&6#{l75y{i|Aa=0|+Pl@4;}x{Td4AgFlD?Kf|4BS4I7cXj zQkz|HMXa5*sC`Uknj-1#=QA~Td~2c~3-BG*1I1!cs-Ql?b{M!#!Pj7pvmW-x#$|O^ zkScRDEeVzPoTkR!RAWKLpbjyoM*rOgvx>g1tXO5R*JqY-Mz#Xzh<;VsL0m}vg7d(= zKgTq7&8FU_-`m@|ZV);#34>o4CUq&W555TNC2tCOSu;#v`n){-)t~tH*6SD^b?DpC ze1!rhGMKtye*HXN<3E6StDTTrfyYF+tY@bOi__^V#4ZB4fo`S6jU(C6Qs^XZzzpdb z0XC@=LY-a#Wf+7J)`aQxEc?>NzsSd|V9!9eQC6Y`*2!wi+~|Kcgy?yrumtc|@!@pk znLkDUp@m~1O^U%~YOV!N7XE52hq9}Lza+{acaJINU1j#bnFu6qj=3_7n{*7aIP0_I zp_0NRGL4gZT=XME>V@S9!Y8c~pWIWb_jjnM>B!nXpS!h#h?>ou6g3(U`+#z2dgpx} zPnvA^T}}*Ev=bGe(xq>`^V{LvU*soV$k>9(^hPttHVo46nAKq!fNs&ptR(30+3bmUGU_Ex83u5)UfM%XtQEb$Yrk!(S&DC z1dQExzn$D0bi3RO_&bvh^<5q^K<(NgOSm3#D#;o}M?XnwN;NTB64zSj!ZmV_-u_@n z=-A=>g&TMs3P%YL?!AmZ;BeNQA90FJKqW=aRN%FR+UH%=0ciCj2z{78Q9|`wHQ}Kw#^c)e5#Sr z#VFN}vypXavzVeeuHD6)#LqcsJ700KD#j^TA=gwHQ_U3lXH`wj7{2B7;NV;BTMgZ? z`02(=G?IexuD6b`xLgQIn$a~H*^4;&r@NbpKNMjGf!il@iLsF7&dEt}rv<6*ZJ36O zn0eqU&O=2_c$`x5?jiG}4t8>rLQIkjeA=?=-`9G>CP zLJANSEe3$mQcn_#Wc4GttEhD&ID1&w{8J)0$+%-rDfi1cLWPqPmjy>HrBuO19z3Lg zlH?;~VlvnAH`G0dWZlYcXC+B;8xhwSQ@t2f@r+*lI>VNPsL;%>OK%%9 zlNET@fYisfZ@R{NN-TfwO@vPVow{t&svS3ADHMG9mZ3bZ1s0C*BY5(_Z=j4QQp>?- zMQu=SH?;b_TZAV|+LpdHrA3c>lLV2+ZgWh%Ic*Wpn55&Brh0Dgbzcoem8;#~DadJW zvCfplhZfhW^Y!u!$MC|+uu`?t3A=QHQzd=#yEyf)r*$5SsbxA2yjo&su4u2Kb0UoT+?O!O0BBg zjZvDFl}oBpLMK0(%|mVl1R^68XRx9~Ys#*@N)_3W(NYsQR?^fb7LJDQF#?1s87vzY zZR!_JJ~sSl0u%y>zIeosZ+sm}uSGfj2jcJiQ&ZOZ(^!J_WAiDVd1U>IM}_()=La8# z4?}XtvfZx;(>~(m4OnXCJN~cK#LrV9LWF;I(!El#ieLObHc!W(Cr-WLd$^BNQQdC+ zHP$k7-af69Ti!$W{xW#l-sdXZ583^a&FvaMz>}UbNDIPvWxlDTv~C1aU4nsQzy#@3 zS>8l`<@o8@b>pF|W#ELR6hUGUSv>ZkL)@42yb)vqmoQ$0C84SF+YB5L+lgLQ#bO{x z0!dt8YI|?|*3ECUiIk$v4G0f}lubx$9xtdE(I*(jRthFTXn^5v?ATzfhqMVLrGT8= zRJ;{rN9r~NT8hW$n!l|d`%cWm8|6lsZk^*CGre7gzYimS6S~@4{jvA`Z4j|MhF?$f z;CyrP1njaj(2ZMfWBR-~%}zwLe?1J7WN^!RNWJH+MJJx4*X6yiMEU+eo|ek67>{prxIexNaYY7MtrXQt8CbAc^veJbA?&PX#bttKuMSE`6BNT zuZ&RTRb(c-CCP8unS*Cp2HaGoa=?jf`)f!qaN(MX4IPZi;+A>R{xc=u>#;wr~)iO z@$AX2Mn+vQBG5S5BMb97I(t-+-m*bq^^1vMn}2MP*P3K7{!il0{FACWY&)7f4M!cZ zLNWDi3%@UXAgl>jj3QD1Z!oaLV<HGL$`?!l zn-or5xR4hhNi#g#j4&JW zOf?PN{25`zDYmP8b6WUFcR`Tfue$brZ6mT~QMd22MeUuOws84kaoNAaKThOR^JMTP zpKckRw%aLT`TaLUvqTc6j&>lHxTWBorpKH^zL&WY5ghGlD_kxu3BjwoL3r%?%5;pu zp3X!bz!W7wzd_`|P1m&tiCO&0;zCut)H9qtJ3gPrZo{)G1dVv7)c6z$F@E06hWylD z0t+Bf04(?Ich_G2hDmuuVzjs1@|3f=_~PI8=+<#i>~&k(ob&6Mq59_!iBZIp0${c? za7{^RS!|{Gpr7>&(>$Zg#tuZ#5a{3!5+}l`Ncc_DvD2@tM8A=E#aJFT_N6% zws-TH8bK3x<1iU)Fx@y#JQMoc~?6aAV9PmdsREi zll0wLLXlWh0y>e1{6IbyZgzcxVru3BUUr<8#EezIhP#wzY7yCt#1y%@&Y9=_{r!Mm zPIZQMVR({o+FB{1AWnPq`eAwcC+JOu!sgRR2_DN>bZK?_Ivi(dXOz=GgO65r8B+vV zYDBE=m!R>j0Z-NroP&IvrVmubBA246eW(W`uo*?en>=Ob^n zdV4bpHA0z3XNQ+^9{68_^JqWi1)1Wx*-JYXCSiHjO*~)#NMsK!{{RZGnQf&A-W=2X z&b$zKKz(1~XX$BAeT9MIayhd~^D!gQ4P_Q~n90;ZL&gbQVyN~hrN9h%fG*vrgvfyE zNhvP)8KTphkif+^d(2L9^qjNM_bzt>YcF#ZrN|Q0LJOTgF@?^acKc8v`ywmp{B@s6 ztaPsPJ?=Gp4ciYg`KfI$dM0jGL|pq@Vpzao?TYuSD!bks4Y@zH&^ ze6?-%eiuQu&rwVCJ{Vne&x`6@7_Ve#2Zcdv4Pv}6CI`U3 zn;_~yxn$~rzr>7E6?Rk5EaV<{w9Jtr$|ruHY7Wxh^2X@XUN}cc450{mVR^z}R#!BZ zY^jLGU&36zGR+f>8fzJK?pJeDvchgMXuj;Tdk7giAswssst+teI2Ke1uI0limeH^JoY^yGk3Jr3*rgnIRehg?g51Ctiu!mU?%meEC;q<3}W3+;dA zgMQ4j`c#3iE5=+M}i$0hCs187e9<5v@wV^+4wF+mC*;HY&D^&e5O~D)c`TWpTj26 z{V1Cu=t?H(3xD%u8}sgB=!IcX{Tzs^nq;kcNcD;rDVbMnmhqvCfC!$8Kh&_E>>lvG zcPu11C3$n7nLxP?iZjhAcxznk`GXj7`tfgft#)(&Jh+7oEmE5#s_R?IEX56!iD`GG z9+@i>)A%7CELeud(tGu8jp}Bubc+NvfsG=?(0al|F%-b~oqVaW=pQgEDqc1?;>V%n zXs}`t^;Kdk=~05>xxs+D6dN@_*vQ1w74me6D~!dHDZMjj+3eU*RB88zYa}`gfuEOIjDU3&oa#HN`^llSeg<(g)vsaC4ef?|U?D+_^BFnu;N^HfghK+U?qLvQ^9 z;=^)boaB{-sFlzY8L(%(zflLd4F&iw#!!Nk--}#ZWW~+XR&jYq__myTn0KC_aH0A= z>4RhOh4WXCl8%5(TM`ASeEv!#EwOc>gF*GDHlEb)W3MYebO5v~WvbA%%&KV|V?gfA z1prCMM)E|B$2k3bdqPvcgZmAmF}R?Sq7}q)8IYlz6-Dl@ zU`i17}11)qH-6b0g$O3Ta| zfmd}TA#(P0X?*OQ+@>@B4(SCB&fg= zQ9{T-lxWSYVC}pW&2eQw%{p%@!THgg3eG@~z7;%Fnl&;Lc2PTrf1+|y5s zN!&5cG~YjCo9cu}m0U=CE?wnxkO9OV&8YA<{qBCZDR`=Zcsw|eNBr)MlZ88B{zC3} zVv5Te*YyYOdEGyuHnQBJqqL)qmQR-D7H^)X*3`FBx^F@Z4$K-?`;wB z(1^U_57_`rM#YD1ckmel?kQ|u`qNj$YqC~FlUTW)*W-WZOM1rmMN{z>`?>8Ud+=@T zPe+d44AVPxiPLc|HghDKquFy_LotDb4g?1`B|Ct@n^r|&`aX0m%J&ouE-;zp6g^xz z1YDJKJrl}PXH+!IUl+SMf8p2)G^TVqA@P@}In?Gj9FA?YtG95qvFp7NN?1}JEmZJP z)A;Sh3PS)##s4JDptt9FCXkCIOmBzS_PhDi#gURJ2^jrF)S)YsG%qiYW>m*WL;?r> zRzi&JO6fvGi3)nZwCbP5c2GPIIlUli10`WO(%S$?TK>Run?D!p5dx8WZ}0VT0Ith} z{;+O7=-f)T*Ub`y$t1EXYq`itc(YP>#nTM_&Xi(*p+_(5QN9u4XXJ3` zq9|B)5^N5n#-k1IC9(Z^C|if)L7tI36?b(oN8PzMB};^q>t^bjK+(XM4$nGX1pP^& z8rG#l2*r<|Wd(cFPbw6mw_4NLgf3Zu;*-=-?4411J-fEXKEfE0_K0_eH#U}_Q3GQ}k(f{r8b)PF z8ZzK&Bypr25e=QcB5^|XF_)%7C(_b*Ss5^F!%pr+T28kcn0dNceHyAN|q~?zt1OYz8%*kMY9(EEejITMk|OPtLOhl zARHMkppcL=DH)qR-V{kk_~byq(B}TLB5>b>sLoZFHeqBONZdh^vp?27DQSZkOxDy- zDgz0?McaU4L1(Q8$@fWk1hHU{YTBb_}a)l zjmVtiCimRW9tWLY_w2Ed*4ryIGPjEo>QxKPQ|Kxu#1<|@1(^(j-pw)Nxn%QPz@B*$ zgtM}E|9-7twGN0!79ZI_BUnZA^gLRY6rM1%-1A85GpgS$M4LrS=$mYySIilVhI7*> zr9S(LIEXZrfg|sEW+X#h6~dfCfFod|!)$htc=vagnUHDvB;7gLaV(i8vvDexM%dO^ zrSXD|&n*2m+6|rd^t!9g8rQ^yW$dRwh2thBt0xliA{%miu<3@;szP~2>XHQB^=k0If*f(*5s50gbOv=W&BVv9U8zPQc~J;IulKnU|5w9j(P=F1J%fxmlXYdIbE*MT z&W4>EH{xgQKqkadr0^Utl=B&@3UZ&cNqrs~GeMNL0YLyxBln&a)k!4b@8qNu7KYE# zx!F+8GZ>sr!q4I(qj-Y(AJ7Tyc$sXyR0{jvcoKv6tgT2GnN6)1W*SJ#?uJ_HpsyHx zlH9>BC3{$;!b?E>1HPoWB0Ct*>gk)=2Vho-3o+&2M*E8nBf;jj%QMno$oYNALJox; zkYJzyKfx^sA2&~*>#`ccOR@fhg1fX0Yci@Q?1dSj)(89b{y{ao@^{<#!=#ev^ivOT zY^yD8!?H-aCWt9~xhlQZ_w`CU1rRZV@;7KQzgch6Ub}xybVA&I6@66*Q!@bmXAVDbA5G>l)SXf-6tG3K45MBf=A*z(EztE@Gds-T zT0qC7QOw#i6&<$UB+q`h(0{0*alq_QM4#0Xr-k-y`}eRI44ccMEu0T?CQ--8B%R8c zr|>#O1$wl(JkR|&{LmKut@-h`R?6}5hCjGox;rHhDaZMcbQf!3BdX_s;5HaNcNjgI z?3UR!t$GO=L0TsDT4SZLhzeUCgGG$zII8!V{MzH2`Sx}_whtzA&bBjmLQ@ZvSJ+Ef zrec?yJ2@goi1VY+?%m?)DfOn0ID89ut;4)p+NtGJEpi1UkL&obbq#{M`+J2eB&%?b zbidPQuXgE<6Ke{Q559M)_JQw5=WxR=R-v}po6FmjBvb}k4PRoj-NZSbs*v=L5yfKu z8Y!TPGwYLw>yVWuFe*KC?X0bEewX_EqsSvB#a^jJIU&hMfGarj+EK0^Urdl)RQj}> zYWPKfzz6eZW#`O8e*#3n^BpEMY4fne8B}R@^=$9aVoT}?=3W(SbE$6JRctCic-TO0$`uVL++N;92s<%V z6-L?`Wk~Q^zf)O;Qu|d(vSR~$=J#C}HQ)3n zKwI6NDIXsuDh4S%Zyk(DW?kJqZ*VyXSFJ;vP1vI?`c#f}H3>#>kzc==7IcLD5V>#7 zt~2D&b!8ciG6;2^={;w_)Y6Q!=(g1`$Y|F0ps8zPvnl<)|$@T~@c`U44!Fd7r#mVHxG&$tbZ5Wf)X%#ji! zDu0VRs6FHvRrwk|5mrvg!2k?E5~SRM9SbsW=!PQ&?P`F+99yilFzZfM&kvr)4Eyco zbtK6`|ITXdx`r1007SpqVgLYt43DtjX!iy(s=_cQ$ zN+7Dvwk8hSv4Uh`j-jkGt3OmAW(&)&`#cy@4NAUEW17ond{Ysn+pyWK`M=_#pgBer z)v*lcnP@i3c60b(k6>~{AbKGjIf1$vyZ7^8&;*1-+}p@e1b}6%?@G6#*9s(Ag2%p* z-xY!4bgw*EyT8ZTI723CMo01g@X8^szuH-A;qXBUJ^xd=RYmBBs$u!Id(TH_Te|y2 zFj6jZwTYFhjmMIwVJ42~$57b1+=LgUK!|%d@@~8AeZo>d%&B_waRTyGO`~zV% zP6f{JfQ5RgpGQfQb}{LyJ_*MBVX&Y3ApC1N#FCysCs(G+VXn6^lKk`wKPCg5Huo|^ zDnmnSZ9tN-PV7ozM}&_i*QN-98GETLu#TVStpCz7uxw}hU5X?F0!XFxAxq~%X!M!b zH>xxnxUSOG52ucXyuza{h>4=l>qZoNRH5Mp&x;f9)W0~bwN_YBX%KIOIJ27{osF{y zq=&479MQmI^Z5g>=jThPSJLkPhJB!((yLJvNA1zBDsv3B45$pQT9pcP|ZegiJe4%@k2vL$>q-!`=*F z75Wd=DB8hc{*nH!2f}`&fl(vI17|Xo^S{u&+}H;t-)NzAdGW`RuL)gW%v8h;gR!{3 zZhfCS$V%^CBFkF?<`j7?{`O?lWE7OcxQ@$p>h`|eABR|^_jsD|L@e+YQ8E5pJL=F` z5n*m{k8*0-VLjZBu`l&76g@`7#{=>DRFEK##t;8IwEE!Ko~ABn8nYcocoVNrF3^1u zjy|?@ivs0J8{vp^!6^lPdn~Of*E`SLFt`Ja@nx{s6V!XQ<*+o49!XM8SARV5-ab;xeNF(E)TMHzJSB*oB^DY30ULv0 zQsPp9Ffk|&nZ3lFb0gWJ+c<7ptxO)mb-A00%$e%bFp0Git0^&=kBt)Z(wL6Blz@<1 z(lzc!YkhuAZOUjV6=kUK|Ezr3Z+`g2GWO?_W0jS9TOVCbARjX>k4(=}#;jw-S+aK} z*j%?PyS+(GmeL)fA7tAtU_eM6yuD?pA$6!ReiEBVG*fvEL?|&z3F!JAp3NcR`Kv(? zSb&V1-?7Sg)Zy~Ok#*ze-crlYcfRau4_%2~O)N+Pta?~a`hf_8%kdIuDCRhE=T_P( zky30%p0861vs-kHtN!!{stXTQ_k^d+i%T3iggGXgGP#c+r1VZ+;C?^4er2iWfsle6 z=X;X@oU09A=;R@q;(mUNaLNw~6a@Sc^+49y8F+ZC378H7sx*p6j$qmz zXf0_v(ft)2p>8h|H#;+&RM@tpL5t{m37XR}o<>@tw3w1tjCEsZq<~!IL9VYEnyyvg zuKrBR^>b*UxBYvUte(-~{HIJ>;)6>w17hg5#td~`0yO4BpteG7)ksCWaz3!iN`{8&i6>`;JjMm-a?*k5fGuNOI!#Y!mQ6 zgt&T%c|7r8#A!Qu`Y1W)ozV4HhT*B%s@Xv-b(%l4dY zt4k+z#v_<9TP;$8eK%iWiH7+%i`~5zXNo9SPt|T0T4Y}`E0~{CBhF1XNA%tmXLa0= z62>|_OpHASLa{W4Bk~02Kl<@n(qvt*>$CK*L(1BsaNEO1*x4ZChj8*>rQ8qH=@9A4 zz9`hM7Y5M7g;96&Ej|P!nuc6B_f#NbCHW!J@L-Cud;{6tjW`j+^mA^|e2216P>~#6?RUtX6AJyJ?^msRJoDGyS2a<>5TNuKI zbR!V#H-hm2MqCQ8X_}%fD0M8%!N~ad5P6G2If`&V)TSzIs!caEmjY1@Z4)spj0Fhy zmTDhD&GU5U&v7VA#M=jdlK%F2Svp8ojJ)TPxeCmfeErhha0o8s{W|Cpr6I?UR z>RSuS^e9Y%b+|oQ?O37-$Ife{(EgEo@e2wV5t{MnU(FIPF+z3c=?+qySK~OO1js?E z0Q&rerMl=#h| zUhZ_!WF^+f-g(&e52Fuo-&puHuCD~;E-SNtD{^x~-{*bf=g;8~Y29xhX~0Hu`HCyhol*ih4i-Hk?ls}%Tf|)V`i+fwMeYV z()5KE{0DO6F*USkKGardWc%-toK*W-GkNT?Wfg_SHkeEsPW59_F)k;> zBiQ|?p?LGlpUw(9IQo2?ln6szAE+@TRv#ADYC1S)^ve0f0AOob8nA`cLWG%w_3o$v zRvcTeYv6oWZAOAP@efLMV&a7}?{GpSgnk5%0ja>DlE{UUN6srlYUX;-Pmma~fo5#TvGcsOhWsXkv<@5=@I zCzQk6fZuX)9zBHX8JeHn3&y^p zJt8=66s+{gb|pwH!e1`knBYI^sb9FV(B*GBHrs=4+`_!})Z8M+FP%c}W2Ashn@+cr z1Y)l%+6}$i>Q;n!fAvkq_x?UVv$5FZeoX0%Ju)kEQ%ju*a3~qgYKYrhB$^E$AhvX#sczirQ zc$@xsyl=_vf&4u!{=Fm5a+kCY5i$-3WtJLB(C1N31Y&rCu+Gpg5!kQ-IwiiHzDCP`TDn{WeAX15_?q^6UZCLRM4_;2mmcItH!{=8S1%YbjQV}7{XxWK~xA! z#a`$at$t#`jQ^I}Y*Q^3Z&2FYYk(K}9Cr6s=SJ<1pWE@H3%`cu9I2Y^oiO_xZd8g- z*S4Y=o-p!&otc~xF8hLvh!6*8O_nZD;=&=LiFlx!NTx?W=S5KZ2-cYTbZ=~?h82lH z8zLkfYuvwiXR!cK6bQ~29o9I_vTI)Cp7Bt-eU|&ezK0EYYkfwwA_t9pk`b(QT*-e${Br_qfj0U8Eg!aHr3(ku?}w_ zaC17WK=7c;B1F_c&1$x8|2;wa_{m34!T!EZH(=9;!lMvo4ar1I3hJnxW#~k$G|}Ow z98$b1bcnHVlX+t`Gm1T)3Gi@-ZK>niR$0ldoBnvMtBc+Zf5&1XOvk`qF4516^WqgU zc|zS{tW+wchX;^2*9Km6y1@0e*kI;KnX#KOHQ>Np{59n^>j7jZ)(S`%?UB#3JO!vq zRUiir2l?%NZt^_2g+s%4CN)&~PZ{h8^(4%mB8zvE6KJG?#90k_UAAqT4ek@0c2O~J zKH+?|gthA+CZlPPS-0hOVMm7ezqH@{rs7@8k7NDTxJ)P~U6ca+H}AhXhde01)eP4d zf!G{`Hd?qMgRdSr;)1X>PZFs7`X2(hk-dfd5h_jx(Us<#@C4f21aQ9?ga^ZWpEQne z6ftCk(&0)?%yvfJp3M*oCou}cldCEOB{sq0$R^wqH)4n5HAiB+JXlYfP$S#(yZ=3k zpG5jYOxo>Z$x?pEC08qbcV1(B%BsKg`eV}g*0Xj#wCP1{8VGUd5rIg=pxWGwhrCIW zlAFq)qWd|lAz>Tw#U89+YUY!#P@MElT3tJ#+8hw(SS#%cX9q@+DM$SGqR+U7F8RHE z1S*pCw9U)>j9KxhT+Q)zRhG#yEQX4mAzC+k|BWv;d8TP zdsFqVT1hFI9&$`*JPJ4|@WeLd;+YEpOs_>GX41kxNmLaI!A-CZN5Mb}GwJAgvxV%T zh=H%0m*a!EYkVAonc~&O`K+JS{;G9NQ~Co(;>3bBs-4egioEN2%=+ED+xn5K9A@y} zHTn^JZ`r$+!)m!ym{?)^om^J6F@EZ}D6HNz`U0oHG zwKL2K;i|UT7#-uVGTa(cAlExTJ*64K*t746mQ87p7|;a8sH6NeO<|pij+76hcxi+# z?4L3S$Az>#51bMBMQa&$k zNLvOA0&_Jb{@4kn{f~q?M!Qn?&Oo&XcoQF)9{_)R(9Mib3JR)2MC_jOco2lnN&Vw* zd_>g*I9}EpCjE)lS~58)z-Txip22an-Yst@l=MGpq#&f5y%~iEMgij;T;4SEw_Ak= zu;UVe+E;~_XHQ8-iu9=jNsvE8B=oSILtGVRDxAOkOCg0&+Cw$s>BQ|=Vvi^C-tUglyU9waM2Hj4^-ur2^-ktx)jja0uY zIPryQYlRGd=Y#YSMg`wHUv{9thIbWv!>6wlgq^uBt~_0*cpx*^-j@Y*BtU3Y-xC-8 zx)%_w*`b5H6fn!j{@Y)qjF;l27@AEXC2{c1)S)n|02Pn&)E5szO6DBiM6I?zTunZx z6zdYMnZ=?Dz^e41^%WBq8~Jt6GE0&S%WO0)VNC9v)KLgIH&#bM$)Yq9EYC_QvpfwU znGof%``(G{gmE+>VNB8v$n5zEW0Lf%LYh(SombxcT3j2Hcwp;1SXDP^VsMqoUdua79FDxU_5S7J=L0jmPt-3HJx1aaw^N(dis0-!vq%=t~LUyJlrOBNkO_pWS z2&~H}m$D;ol_D%F7WhS-rn4{+u{)X-*-7bWLQh4marKcjO+BXuSf!tEvVZEgO0QrzIv6w@47x5UlCpT96 zTJ6pl4Zs`YQ7qPYAjCwO|DjC4&Ai2FTK!xS>FcyqW`jJR%ReWHMzHm?%rLn#B+*0_ zRt!=cklrX+7Dg$n$~c(?8BhJ%jfooBnc-+cW|*WMU~4+5ixU|}aQE;m@*500d2bQd zquD%rmu6r{$KS^1(CkKVHMP~v&0Dijk9t`1CpG>MEEPh?+AGz;3m-9l2EnnXCxl6o z5&SwWAx!QpAlnvK6$|TG#iAIhgn}w!z6cZFFUvR`n1dVH3E^l$LYSl-;8%)F)xgkP zO3~d(XLO4}#<_Hpv5W2_|KzR3W;t(LqNwP->)BDGw!mV_-q$R|=XM-Q&Hf zhYuU*2v;7dDF~IvT9xy))TJ6N4XWa-qiI_n>Uab&Hs3rO!)b{Ih}hsb1o`t^{+74j z+iMSR9Xwj+D)gmwO1ZC9ButIV+O5D9SZS~UETZT-jO9Tz_6}M!a6eEQ|D0SlNi-lq zpBO0u2N+tHi4jck>!0kG4Q3C4Vxyk`Wiww5&I|Go%B3;d2I= z4+gmpmX}$=!aRwxB8egK;g(K2>m5zVdXuyR(n&Uk8pPU8K1U6JBiB0;4?2uwN@28O zxOjztrKI)#rGj{W!PKu%xJ*wCCBwwAj?3`>IX@no*XYpHVq3z$P_;Z+`jCq1+w5 z9vJ8iuYZ3m<&uAw_paPR8X|L*K9Y}Wf0z1_=6Y2^{7Lj0`+(V!A=bQ;@TA?mjKWbmFF zBSL$_fO_(uoYPOgI9*-Nb`pXdc!9~TaC?VIDPbPU^~OlbTvn|;w+QgBV$Z3D(fWP|IYYvNkir2E2k zQ`ksGve4~PfgNQrKM24?*aD!9i%9vVT%AEpDb{B-RTT@qc|aeJcY}dmJQx-+JYOsp zax*A@_`x?2S|VhRe6KFqBZ-D(FP>I{K<;cZsti&`@)paaDOgJZ#Di);gk62+4W5$<2E3xf0jkr%wUpyFn& zz-u71_|$ygkFa1@*q-2km_XMS;G`*Fk&Q4ScFaQ6cN`%A=k&yrL?Z-XTDbwavq_6G zNHR%Zs0vvT&q9W+G+~rNj>#>(k zM7r4s>AlY}D2TOdh|q`6Eh;u&S$S2-Y#SVqj7T`g7?0pP>bOq6J3mz)PfOL4JDa>E zgJcnl{8%d9u%59h7HJw(5#);8d}pWX;|ZyHl6HXa2Bypp2gu14`eJ%DgZCKQbl7&k zi09uBLE%#Vsx75)znM3!h74Znk?_h%R>(@a;oO9ojt%vD?>OAYNs) zn1k(=1!R?S!Owfp4AA@ zV`Y0mb%V5+Aa~`)W+z`F?dg*wBSdvt`2o4JN!c<;YQdPR87rbNXK}`}5}Iv_f&Sju zELFSKK$ zqWapR!Uu$%^=NQ|$p-WS-6yQ9hCuda3)$v5#@fu>E==}`zQp>_c)a#L(~pYjv;`J4 zVN7C)57yK=8VHI*hwOhycG&9LB31JNL&8i_8i-*e?~*oP?{yPKpA_u5zT^PX2vgxo z9<{v5rR+W=pzng~2D%pA8;nVSg9Ia0!hrFxeQ(`x zp)SSjfwsn#sJ*9mrRpkRZ_vroz*_92i?rr|hPXxe=aoTDKRk`VVZ8k%N49g zX%qjUQ0rhSFW@xtUOaj_>CzWR<6iAwP?4)>t#nSX>p`Jn zL5pZ-_88AbmGDS|2FnOkf4~war;1gJ*O`Id?RpHlM>X%EtGAQaAqI>wqbukkr{oip zbKgmd;YvG_G>oz$NJ7Dqs!CWii+z^yQ2r~=>ZB@o6=v?5|JY9E#}ktIB<+9nR(GjR|V7(uK%6YY>J0z>HKr+cK~t~L;kVPGx^VLZL4fFv1lp-n3)Aa~|f z9F}ETGT~Q%D#^_6a1mMRp-<-)Yg4zb15pXl)vdM+6Es(Fo}p{?nf1hmDb zX|);DO1FWj;h9~iNcV;6!WlT&mG@nUH4@x5oAxUXw9tLZi~TMPLQu#TL2FWyWLQj+ zX^Cxe=Tg*Rp7{YQsz@3`VOcQF%Z%~T&vQ`}xzF9@S&5z4P9`L_N!kH1Ils4_Bz+5h z=TiO>t#4&`Z}HZ*k{4ZfI^6iuWoWmiN(qPKRoV`RyP4`ldG9)dy(N%Xfz0!YP8S?mfut|Q1#o`)=>gh$yM|<)|DRo^{8t>*AFq5u4>WAhDTQu4jGX+Pk$jruHbFJuyeq(MsEBR|gadgx*#b_3KJ>3&An4TY4>bRv}#8 z&f7j|)EZ8Jw!UWt+$0e339777C0OUuWvJHcx>ktZDk|MqPw!!cYZQYcpi$n#jzc$< zAg7U#JmAnI=T`_M(<%hWox>`hm0Sd@EVGP7eweZ>sZ&g7j_{u`|fYgbXrCJHR4iGROq45TpZfN)vI> zBPFb^^*;K77oYiH->sz4f~q~7#Y5CODvU`!X$Onm+4}D{eEsPC{QG(#*<#~eQWLA+ z*b}SuIbQ4kn&Vt_H2tXR|F}SOYY5+b!MAXO&wufsu;g~L6R#8s-pc|iGf!2`1L3P? z^}K}MN$V|A5_fujmn0b>Z`1O-dYSoqBMgQ}>~g3o;SMB&8F z?&&XWMrr!j->1SYR?1xyu01CFDeNKGarQc2oj-Z>vhoh0pe z=RE`&{{1V)kl(|9jq)+k+DG|yV^&htmbf_P^loaBWCX`d%R-Vni&8GK@Gyar|C?2RF5}FRaE$opP)tlR&KQ z%EBp={_ZF3X}{BdCNkONxt$i``7OE0w3b|Q=b+|sQpO46RV1CvXeRG2kp?UcqcX~p zf(Mx!^)9iqc*%q;9!WdQLnjXjCMm4IQ#Xa?B}-I7ns$q0@!SuNwVj-Ceo82rmJ%X& zuF6@Q&&rx5aV4aCDb1LCmY1w7syNMqBq_=P?P8~dk_jmxl6IIgPR0RS?|1|;#{?7PB_+v=Vu>GAD_x2?znVpnVw%IvW(^F6&SQR9UH zQ+ymxJ`Z?sPtu2N_kyqW-g&UjABuwE&cjB6=Eq9aR^E%F_lqA7cOREC@*5(HU`UE#AxkGDi|&TWAGh0e`{&oMam3km z@3WW9QvL4rvZ)}U_8KrA*c`&`P{SZEZ9r*kr8&dOW~JUeUohoqzdkPUCs*E7OnMN?Ng)bgI12`{@YmcO6VO| zdV;7SLInoS1F4zL=};w!MkuEV`KP;K^6|<^LAEi@D~7dL3|=5x)|}Er^t|Xgj*1{> zX_8A#6msdF%%oz1v2tY|CP|#SOAAvw^Oa7>e37&RnusE^G|?VFkPQ~5>JFvusOx#D ze2)#Gv&d=BSc#%8)=krFyI33AAoH%vufvrjv=6cVaqWXOAt?Vi;Fc1|D@ZIW%!iF+ z8~j7%eU+zF&w7urVJhVOi!>M%3Vj0;hDvO3GV^my*r!|B^hK$~0q#WE5ii=)feO;e zn?2%>+kg3QNgRjaU)nvOh7Q(z3mdC0E<8C_eqjfgx`iRU@FezMIH<9zS(%j;DEb_Y zrNchXYwvFg<_S>5aN5NImYBBhHcByJ<>h?usH8?ZC*w&HjnGIFGM;zCYnv{4a$2IAvm)+x_w$u^&Y+tEW1oq`vP=c1$?LTZo$Vmlb^|nHI z)TV2%NV8&FxsrK6Y z=~D(PyY!X9ES_C_ejYp`qPw;mbk4;fGcF3X2EppoUG+0k0{oFV~| zXoOasP$Y0SOg`SuGkTSE6`hq)sL!mgu&2~1IftExNzCJtrMv`0lqh4osAA|TO!GPr zS(*;`pLVfAI-yvBq#aPFB-(zjP6vR@$t57}bWldC+#-eg2+I(o zg{mZhnQ`-y8SUJQG$iQBXcG1OSs15fEUlp=l_DL*LTZe-$XLRwEQ_L2goV2lBDG5) z(g~#yB<+ASlMUJi>vcb@ByYdZ;@A=1Io8ryg+=r508)rR7AB}NUpwIoOW_6jaHg};F9W%x-T`GwctIsQm!5weT_K&JP$ z>w1s7+$+wFfpa`*OJOCpKbp<=gF{? z8G)u0q}EavI_{-;Ll|ztP@IZ3sWG8w^!1h$r7_Ow;wOnl=!^-)CwIf-V?C>VFY1}e zZ*L&zOg(Y|co=D1Fz%N%i~O1Nq4L>`g*>XlQbcJ~6>c?QSG}YYs$NLi0X0F9fi`%l zBfh}A z20?IeiUI~gV{Ze-X1F;@k3OKfE?Vy+Kx4`iGHIQZk6a^k96qlqGTf>-85EEG5JE>) zj%k;}<48gX=?ZHOLzl7g3SNFMnw2msAbwAu-BOtQ%F)o)%fb8YkBNZ1FxkZbfMMM+ z7C@Yg9&Hc(<#E{x0 zQt5;eDUxj|Q5Q@`SxtZ<@sqMa`>s8w?J}^Q-4Vi0!79%REK<=d^!gU{2(HfBW(6SMTz6!P|BL ze?djW-m0$1ugwlzrB@)t+9o4}_?+4>l4yhwPpA#M8zvuX6!d9nV+6A0!*a`vK}*Rl z_27Iak}^tSmgRsa6lc;%2-Av%c?#u?SW@klUAr_bolu%a(he3NxppOFmZIqDVBdYa zfnI?5Vj))Lv-d$>Za+26F>~UBV>u@;o?nfYPOC;EcMg38P0D<~gl4$3U>UCqR>H8a zD9rsVcXywsb~Rc$p&E^(9cBiyw#>>3-hOo{bZUi;Ic}`lXYbz|2-QjhMEXnUe1THz zj66b16I&eD(kkO-YI>x5wo3lNrNC_EimRPMG_$m-h8vL{-V#Qc?iGT8tqvuOdw*-P7|f9(xlEh#z+Is_OyOz;Zi%K@VuY zZm8t5cgdBgua&63y7n-zpcR1n&z1K{`uEta-3^DdYAB$jze7k;Po|Wfom7OMRpOwt zhAqu!f|J;#DAy#U{G2i^l4yjSPXnePcTPm;7m4)LleCalWt{ucg_mNVi)Z60lFTZ7!c9H3t5J;?ckrq0g-v8?*RLh#RXaT(cQbFlgA!M2 z9n!0K2^0vD3CRJl1v&A@Bi*nSaf|tt9v*wM55go%X)n;x#I_a_MQT8 zkO}@cCrM5cjo^=IN%A4`vGH)z4$;3YR>^AzERDByDa5up%m{g7;l5nA-*?ww)PTuzd0|3r|9A>utgmDq_}8obrMi^}S)-mP zj>9;Mp|PV7Gv@oEV!Y-)n*~w8OFx*+X72K!%+C8~6Y~Bf?SQN~w!HH08eaXx7ht~< zy&EL`QISJ1Vk`8CwmPP|)lC5Vd1gb(mN+N3OcIR{!wI?NPmY~W5(dCnFU)%(#o*1Q zbWoZfVsmLk;1#ad>Q{boY*^Q4#~C9L#&uE0Yz6>+fRxUp*(-0BI1J-ZR7K^x2Lxnx z-Z`6)cP42E*xRw?DE21v)*X9q4!9PgDu8=m?Prxi2r$IIk+zHcHl)(J+^sM@3o>Fl z2>-z1GP6WW%>XCQdf7q zpV`ULY(jFBq#a-|icHl_4O%P|`M;r3d}*PyV50Pu#+7u=8=RND^4eV?)rGdKCGV{_ zqMrW_ef0ke>|h9ZSaW<|2NA(q=cHOmq7ke$A=P>}O#V+abEs!NuG!zb8E@o>-%)|6 zZ}ej&&6{o0;xxib%g)ghAHUr0g}VM@_Mg|bHH3>?&#MEIr(gYld;isdsdU1*b!D3V z@$g2{ocQL&DPZO06BEC$dG~lne`h~{)}dbvI}=Y~y(6=TeC8`H2EP3J(Aws+!HCa_ z{bL)#?yFP3kPFT0`f}c`n(b=0SX}DE^vCMt9|ao>OqRLJdk9Rt)`b|?CXnH z|Kb1Vt7c_?jhfyzi!YBX_AiU=U*32@1S;X!UT?f4g5y+DSTkwHJ5>_<8}hUq11?+{tSU^K*-)RrxG^y6!!xLG_J!3^l|RKlUsy%|)YH0?kkW zkb&;If=YV5+_iTr;5%N-|1iGGu`k0qANJbm*Zc%w`@NMr?Db!NfnpZbzHZ`U1z?p6 zGp%nc_>!{x&H-j3iAG${6KXc@hROd)*Yjt`GfOunNrEb2l^@qo0uV3`h9?eusznf{ zl{>DV+tniZglZ9z)~%9UTV8o@-!{kQPQG){LBR+|LhrMdd@L>naop-*$k2b%b}cDi z4r|_(%-TYz6^p7qBAA&xk&Bs0qG4vvrvV@hk)O!Sy?SDD&kdIfaaTeHpWtZn!E1k( z!{8cLrg_1l+K*TkRDvZ%Tn0htN7c+-RhZjFE%}6^7Ls-_Q{~!~U}uWrwgc^f`n|T4 z8eHN$8gB+&?7orZ@qME=k7i^ylDB3}PzApHCO zrDwEf;@akQZ>{UEUhFwXuRLX~4}46%kJT+-^Aaxce|bQ2`9zDDd<%XU7j?u-R_B!z z*2J$_ktPKTgvdoWEBv5zLzU)s`A9yYe1xPO7FH6m2kL%@f*vHbF?^3%S*n!vWnC~K ztmo7qkVGSdbsAL65cxk*SgB|J=L;(u21+3LX2YNVu|WUR{2s*4^G}sJ>TzbttW5GG zVsTK!EXt(l@j5G57K*3{sw@s8_XvsHF6PK56myWY14f@?%l*9l(BL<6rM@-0&&aE5 z6CTTqe*?!#GZlV!k7BVlhNAbdXbS1GfzSE+-trjRHMgpg?CL_&G(4wdgd`dv!P8(# zhRFZfrXe{xCCw{8Em9U10l@Lc0In`l#xqexMK}{-=B`-D?TVFrLd6P6JHYo8S%1r% z$o@_w5tXO3_#b<2k6cJn3idePVtG}?vL`drH|p2C_U@YUI~EyIOPeNs(-y31g`r&6 zT80pubIMpqq7i~K4gX_^{GTm2)PsjLpv4B#E(?>8MWv8tnxE#Zi1WM>GpPS_XQpzy ziYA{>MMKgKn`so~J}RTjRHIgayF#zx>1FJTLEi%h7XZjgQ^JI0g`kCTIwd$1GoL;a zg(Mll%F`-thRFZftW1t%siLw9{DRH0%x6)U)+`rEDVe&iLJ`lRI7;2DY!|8I6N*$w z+JQTOBD?wRt-b*;8c*;rMg6hX!?sbo!b~iyb$pKC4T^`Y%5{Kz=|^?P|9y09&E%zzaMzz`23RtPly7PFb@=OhPNSWFTR+ z`mz8lm2EXjdZcVTAPB8kO7lvKsnUzeVYJXQ2c?#}Th6JWA&Evv(=>d8A@bAl4eWQs zz*pb&sQaCuQDQ~ChnZjUw5)v=r*XuhD5zM$3+ZSVJW10)#AP@T-m)ut@(C3^B<+A$ zIkr5})1X$;aV`{-&P`DL<(B6m1?l3;2D@?OH*|q>qc2n*QyNr%7sa03yfZSo<=>&) zYz;xq%^VS|O9S_#u!dmrw16f;WxrA4L7m=VdYxYdluxJv`sCR8q$*1+yQ}28{~-!X zIE?x;-ke?SqQ1J%d@0^Qz2%ku#mDN+yt-2VzW=^^W9l)lJbA$H`;{@88x<$r!Jn^8 zo9q2net-6d^@_Sp_1gZ}6*7q9!|-P;TG2HtcoM7XWbYhr@UPeNiu%A8F0X<&sw!pw zFRD7lE`@38`9jE7A}v_?M*o4)zDpJJYbAxaJhJqaH@os!_^Mm2FZy}Yt+-eFdb#(~ z-dre9!s%>`Y~9${ z-@Z7=OcEv4L6XGn-j0oq==N1r@yU}Up9Bt`^EMMr&J$d8MS=^8omuZN*b|4uZ2d!) zJT&Da^)Qa#mR+t-9h|>BL7p0%&C48@cdkGoXDm;3ohwkwjbvV^Hu|5wjqGWn|7m-} zNy8MS!Rl6qqAX3DEEfTOxRyOQw#c5M$vL**;HiT}O3(2_->Ov6u~~nuPy=a(8Bp8h z?Q;EH^e}h#W*^_LU)*hW`=P*f80P}TVUU%xUqSWlE#eyDH-?f6hs=^IL9ZtlZdrsr zQb-!oG;I&v{S{HYi~bn*ipQ18v2yQP+R&U_*QW*G*muRgBd^L<=lO+!UyfZ4??OC~ z-@(>m!`MA?pPYo{C<;JM)? zzV7>Rf8KpRd^qW|nSRIvgZ=dNrSx4$mK*YSA+I;?{>!xwe{TBp<2R446}RrwRfa#L zE*|G!XS_s8eEt|;@WXNqxs=bU-{v<@-WWKD@z&BBcKrLD*}YB#dv19cPpc4b>NVFs*7_TmgGa zcxN54)OWwV2fQBXv6d8`}#x+96P_u6nlfr zR?Fh}Q)bbx&woGWIY8oVFdp`XMZrkHYco z>I8@ct$Ca=%NLa6eN`TQeEg!9_uFCr9zMq(9%b2O9_I9Mr&nPQ@1sk>qtslMnuotn z-5J(z5;59{{K>gK(*noNG}Xa@FE+dV6FEvqYaRSL z@Bm%bO6S-lCm&kkKn_VGX}{>2;}0nw{Y0-E)Gxa@GXsa5@r+euX1py}zG}-Hni~zW z)YW_Dog!FE*Pf*Fl-sP zq8keiI%6TINJ;s%V3{f%jFybFT553Lk|Sq`FkUsvG1v1Mk)X@Dczreqj-3(Wi=9s9 zn23R4--&Ay*>4CeO|bPKyG=?6jDH4aEl&qYNvny;+06F*Kxfwe%gol}!EIFZ5$a(# zUD$!H&fZAS8scG=S!f$$jU|G2X(E6lidqN*QR8{=H27i~5^YpYyzBENaO@26&dZlT zh=+lbDDeC5?|=&MzaQY#zub<+s0ar?#N**+yB{arPkghVPuQW3`#$ADtdAE?r^Lt2 z{xQy7(HsQ_ox!@QITW~M+8D!y=?RsxC!D)@TJ2j&tn?!8$R;j$#l}vw(K+j`k6Po{ z8P*j{&a)2h>5#%gsnq|8eHX@e4cY!*4SgP)f~Ofgsq6TDZ`?=JdA>M!jYG~LQC097 zx6G8)At**Ha~+9viU&8R6_Gy3UTD*3QTE?x9=xU%!D|#-CQ-@cEQwI??}s%`p;N~@ zIJm>P9oDDGpPTwjjQu2DhN=2Ki=IfvjqRGgv%WZCnbJJ2O)KKsD0YT-=LNOrQw;Gd zjVsx-x7m$PdfUUur)gBcG;e14L}dGvnTWCJ;&%QxoxFwWzo^WO* z(JhMy0j0dK%v#r%12Z%a57LV8Ac~z~Q%!6T1?3a0)}~f_3Lp_N=ueq zLEW3%+~31-v$#W|_f_E5^+7*c7xY6db8WQhnI*xc>dQ2fhzcSNZEVwcDMVS?q^twgvzjzs>*#*Pe_3NJF|HF`6MX1&`RqvZcnz(H z*Pz%L1{O@tGZ1Y~@BIR1!z@b3+8K98$s!UhO$|&~R?m!B8h!okR5NjG4g)sAq&h|Ly3}#kDbAByYwpy~L zRf16G1L0KlMAPWm8O2Q_wPO98E0+fpXhlE)#m+FZCY*qQpB{NR^nAOETVGngB3oAe z$!xD-={&ME`gyQlX1_V%BXLuje`0fDXt<61zK55N+=MZ1OIURGFkUEb@}HJ|m;-;@ z?hOPX;u;?Q+;78uh=fmfIb;y-hHjDRR5K=-4Sf}1WYQmZVKs`)k1M8;5y$xFT_pbX z(FuN?Q0xrx3nme^V~BAI z%`~Py{P{2mzvJpSNOh5Yw_$U;H4k@bK-t)hX6W4k^SJsY)M}@2#c*zUgkNvgWVmz~ z(=4`l4kLQ6Xm%NjID=z#feO@eJP(`JH-R*Uw}iJco@E*v&&l316M_pO6bqdw%>xy* zB2a;1XE;_9sK9Ne8Sp~l-<)$&tE2D|jorq2V?}_4? z5@v&J8?AI}i_I`8%|jcsBD8^GXLyR%(3Sh@;lQuX+fQ{J`d2)7Umop1A!qQaBHHn` zV7YR5(R@j9-cA0Pn>QwXrL4RBhYv&J{Jax>`fkF0xU1|M|B_$hU%t4;ciZ6~kOA~W z3KF!-v}ztBX0ImJRn_N#7FD_a-h^$`LDN zL!1ju7oBV+W_%Qu$DCM2%n8NLa0_h!e9>|>(+K#f1}RUG?x{{G7=JF0E1{4x_)`&A zdRwskA6-rUqpQh3psNW^Fl(Yi)zXfzG?&eD=x^dFX}oh(dewERoZ7?kz$L2)T%y>S z1qy@BZhk1RtnVY6;lD4TAANJBGd>DBWBscOf})mr+nXS?Aj-6iaHcgeQU}uXEpuG( z$kG{iKM#VkiXbS8ouTJ^S7U^p2=FSAA9LXTf2#JQA9|7f*9Tx(T>uuf+;AEi;}z*F zjqI126Vuo({wFXI0^{-2TV{VAfMpc{SQIMi`6 zO8)3uEiQ=Hhd)_e_!G6RD0XED=#)JU02Ixm|Cf6X<|b>D&&~*_ls|id->zt~O|+KGbZH zI@bp+SzXW)wcIOC8)+C}As%BmGmgX+T@v4NDue5T7sY84l;uH7RuQyBv9r{vsmMaX z7trU6l%*1Du9%^UgU(=0T>%zqnY&KcgH>O4 z>%dlg`Sk1;zQTSiS8FcSXGw6=(*3!u^+#2@;FEPek6FNXaXE3HNbbwm!X%}1@ zPi2aCarcW9A;wro9PND{c;{Vt{4QNydtw^3aVhi#h>;tZ^Sxo6Tt?N&MyKp=~zIka^gD-3KNKU{5TL zyMtZBT|;Oh{Apl9&7he5`r&8HiAV3cNXYBe{I*WbM=g6Etdg=Ly>gat=RMIpI`OR6 zva?V>s>-TCo2&V4g_@6IX9!tSPKAQsg08fK-8Ab2G-HCi?Pm4I{?IAKPAZqVcWpq1<}3&9(ZrLaRryGYl%2L}-H{ z{y92NySvR{|WmgTd!KI?OzB!?ey2BaLA_6{@r4DxNmisM`vS8pX~qqF@qX1crD&b_ILf zXbk!GuMwJ2&>7!6)*$EgHq7-if&cDr$?-f>XTu%jd=HXguXiefy} zBXqh(fkr`R(5X&=MlD+_bqBr9spSyzGCfJYtZtl>+L+))ITeNH3N)`!piyjjIVqWZ znoKBStg$#9dKP|bhG}PhXzlf|GVyPN>#=m<7+j4cdKeNobM$I6%rp&urY76Bi~DfQ ziOL4F=O>}rJ zRr3m|8pX~nStX+g%P_rufZ!W6WFmtT&q%`sajwSEt~he*^k{LI60l0+A?TSks-H;1&+!0X`C-`)?d zaro2SrOuW%?EeVEl(aF2IlXq+`4C=RBQ>L-GpJQ3HKUe$70=RK_M}e(d@SvV<;oG$ zsV0(+H*DsV&2y=lS4hn$c6NYI$?B|BgMwd7)7igh;k!Sf=n6p@VLZSQ#S|q>H=^rAt2$lI z8sfQh%qyg06g#uqU7QGxB2J6Yw6s{Wi@s0Xz0wd^7Y;>Oj%_d zsLW7T6ECtlo(~ZwT_Yi*pfi|MCn2MjStpfNjuO+0K)8Yo+MohyxOQ=WqsHoTCK1mi zWL_a5qu3cHVX#;0xIz@d`Y7;403=+d4~}?qpDnm0r$lY`Nae zEA(y@JI|ks1#c8F&97J`+C-mcOw1VS;nFE8x=`atxxd5obJ*S1K6=xi)6!!;#g|Mc zF?a#Sp38eap^!7!QzvhumRsL7jk2D|6fLn$OO!DR+IgGS3ehQ9Zgneid0SM-+bDLH zJteD8vj;^S$3C0Ii|uB&Bku>=ynMgd?V&{YcG$pN+(}cJ<<#y4Aqi>-CkYCfCyA)j zr%}t)c@y2|cnX7|&OGi+@f6l_B4jU(3>{Ol98wjzJ}oNrX%st8lHx>)xV?P%Q2%Zq~5-3?;a58e86`D)abK*v>wTF_KrOmoA1}8}HFqz3oMKtdy3DMOtS{Z8F@;oq+E7+n! z!A7xj(T0wK^@DQAS;L-TI5o)sF0FT>_s%eE^^X;;y(87&0B;s82sq+Ob7G_1B1xd)70g7#RaTKac4UW z+Tm*X5xBE(gMO4xFMrfN=;jNl`UVCN-a#GFC<&x)R-4;fRK`Ycx!WGBtK5 zyg6QU8*aloeKwK1%Vh2JwiX}5=j79w#eLXsAyfO=dDe0(XspGO3*UNZ1pz*9}8SLNjoY0ttacaExpiUL_;$i%SE7_mQ9$M6e4oXT~ui9DE1sucNmZS320s?IxaImg`8_u_I$V5DyuGo5TKg1HYV71$Q@Nm*M!SMfUEWB-HD| zJ4PdpDB=wE)@lBz<=*<9JI6=}k;2?}k|@_w;+g1sYq>OS+0T@@<}WKWe-wKOdrLR) zG;dJ^#H`;u>a;oaFi5$_L(lG0kGqj>qmVnaAzqCyOB5Ya`=B@DHVnG(v9I;h{6g;x z--1!dJi#QLb9`J~+l3oXII+>#wryJzH@2NLHk&4Cj7E*^q_NZ3wr#%ieBb}`JF^e= z-uGGSTKD;8(D9{lEu+hR$0VF(g1@)1PGVXKtuKoO)MhNHyZzIL)=Lb6KA#x+gc=Em$LKlZXgz;93 zqbmx|2zX67xznvcjjLL49*a5$uV2-aqSuSE|kNxY{ zQFbdl14Ztyc5w5*&x#||B6o6OU(Uq8V9-p~{7mqS%#e-OLwkD^QV}VXx3rA3pR5_02G}{ST9d9riI^Q8_ng8b zIDyYEIY`_f*5$rP2N*CVh~*`+AF1JlfhC`!6zs~c`R2~d8g1lFMXAG+W0SD?l=Rd( z!vYAT^aZHk$$)jfv*v+$E##*cE*vgL$fHsG<>~0SJBYnUs0^F_)V=;8=lwE%`>Uo_zN2!Gt{>;3a1+X+iR0k`hgrF&->T^wx@M)g1X14R+u zNhk+?)&;>ONsi;{l)i~tW6)!}2z6vt-%StUJ)EJiFs~1Y2RV@93Kxx@6(3xMKA@o& z)^9HJfJnNySEmzDsrWZ-#!VE?`FZRz>Lq=JsnnI(-*e==aMlTJTgj637WJe>l^B0e zEpD5Kp(L0d%7z^FmSDUlL_Bo{EIIydXCykQ8S7Yyn>g9sCe~o$seX0>PW*-IGzQwt z;I}k-I6vz-qO?0_9c`==Sz=xEo^!3CMEu<~eW)>T*!upmzEg6fUlK(+TOA%+C%xzw znZlL#vohkCdh187p~KB0N|W+AL3ks}#t7-nH#pT$p?-`nWZ(01C6hK5rQyFBqI}LSNfKNG z_Kf*u3S6_tu02W*mT;Uxq))~%6PLFcjaYcp@iH`KVhON&n%pP8gbY>&9_KE-rju7`QB1e0T3$J5(bSI~3n^!Zg;Hz+D}`uh@=b^#YBN;Fl^b~?fYs! zSl+NA_N)(-znBZ(Y9C-pvxznnK_+S_9j6jRHgMmWzlkZ*rM`OgQr`9Y=MNHF7@$-c>#$CN&!#r`k`^K@W_yfPyKyh3gG0eMMA;_5G_BcBsdB~;C$E)T z%o^?G+`Jsit`sg;D#`%Sn;p>1-JY!Zk?FXN}VwhPjhT; z*67w&Z{D;o8eK&u6J&b0?BTpfgn5l`p_ty#-Ip6qY()JUrIkd2$dmQs-9&KzDCloi z$8bBUF1)>hdOCL?9$;c@dum@AT^Mt7`Lx$Rb%6t{T#lVU;+O8{HRiQ#OAL_nln$^A zP3!h@gi+9l(=s<-Ufg__(ngyCix5TZG&j#Nk6~sQ2n3cSB$*fja#tW+K=OIP7f77aghp366X0ao z^OilPd7Ds0-GG&uC*zq1(hzlh1YXXSji_N_*IK;U1zCk?A&`u$xmo?7EP z?oQ&jkfM@xL2Pp*bA5!iQT-N^2-5Cc}w!W%0&bsU~OUWY8Lf|I6lD4F>BxFn$JARUW+8{b>Q6O z_y=N2FB}j!mGh1w;EHSBnXT48D{TCk@zh8#YL4n-Fslg%lPy}^HU(*eM~9_HBs-5s zN7mU9dVm!qQU)3FpdgwOvTZ=DcSI+KNaGPeD|T3#x=w(^)yCa^WvnJ-hhQnG?d1~C z?dB{p6TBF^apTeqcyxkM2$n>~X>|oF)#WiPd8zF=2*i3Aoy2A2o|xpZWtDu-`p8rKVRf^qn-rDTiyFm^EM!4HcwI)~7Sk!s zwO0;JtSYZS!VV}pKm4t?fpVpLrjf~|*AFj}V>*YHSyo@1?Zbh6NN~C0voLZ~YF^_*HCl#hNem3U-C%FaTJ+h9EK-4KM)lG#`E+2 zHW#kI@9FB~HEnEts6*5Ar7w{Uo%@XB^SQZOU;=B7sw*`=(YvmcPm`!|+}E+RStQ_;GH94L3yk^*+cvH*a;GWSE2u!X&7~P*Yq}~rxE^BcOvJ}B& z->j|(fEl~BU*CNy&|62i#xd6O?0_!2!?%5mk>9Q#g%juvDc0&`h8$WlL$Kzw;FMFyHQ=V0s6 zyHw-7}S5SLlx@xs$<#n0(a>6h)~G7 zEY9b%u{tLmNEK*nsROz{%U}M8&4ZOdjt=k#9wf6g-WrOtxdt*NDfXBsKYqtc1ZYg} zSdzGSHS1Orx8x^v@YlM+-CRb{U z>K)`7mezmG*-#kpjChz>u^@b|IiPsJ2;y^z|C{c6ASIS(IWe5|Cjn3KjkaM(8(mK| zI0uSp%oW^nF90hOv29U`K^}{fm&4;EIpQC(y6@n-6w_lEE>z*aw85ZMKYK`jG(Gn2 z-mTzYUs7z}2W}au-25+9Fjuc7&NCZ7FuisKL9P}B=slZBDoXU?RAM5-lKic;T^ZQN zh6Vkgg3;-#(`GLBO30Tc!i(Ktj9(Yph3*i4$>Y5Cr2N(5^;&80HM@;f@%SrXg1NdG z>^UWNFi`~SU9=R5xUqR|1PN~042(b=Tl&V=V@0`{06 zHqG2z8|UjaWDZc6TZHYM%;fAIEZ+VZO~^#d{&X1;lVpkP4GJd7_A^ZCH2duX)`&6* zBA|i3C7~UmvrDc3&zsQM(ETIw>U^I-|ICJg6z`KE^;efpZgC7k*Y6|3zE(D#DXdAW zf`a6LlIp1bygYUt1Dq&P#&#y+QK$sOCSR%P6>>Q43$4CcCo)qm~|ve)JA|w zQHPLN;RzW>sd*vMX@|#jTqE{MmRCX6T#`<>^Kx_L4Ev}ualR@R8a`MFQ!^9*;Yh|F zKG|gx*bZx5QwVvtn5~%&X9!mXmoS+Kcl$jOH=QgxZU_bjKs8DYjSl5Yj@)2qxQL&d z2?)k@%AEyd)wZBGjkB%Z1+VXo9t_p*>Sg@&%)%C-0EBeyLuyw8drI3-k!+UTvYptV zA#Hs2{sh4jW?|syjoFopC@{Nnf`1T=iWHr_eKK&3gLzFy?7Ov>)9Yx)f)~F7{$K^1 zxAl!QBj#74A2<%-;a|Z0w#l6Z9IB?_?#sdD#?pXxZp0)NFtg!s@ZPU|%|8~~qdiVP zC-fGY_qnKgfoVh4M%x4DqR0LyBD^u-@|fqI{9>nk-@c*dCD!>dBV3KfD!j8BJ5N0; z{JS2CnJJ8d2|$*~bJ7QOZ0v5#jOPzoc!;Uxk*6~foa7s2XoRH46LI%CEfM5ssGmT7 z1sCvf)@$H+FWYn=W^ z%1sJerm)fd`Wi@AB2t}*h$K~3;MF&dwE(2LtvyYXW`b>G3*c)4h*J8Ij`_$Q zKYJt@plotb(ZucILZUtRQKPsQX(R~v1%>Atf7Uy-b|Dd~?(wEkAq04EmWSa|3^e4y zjm4z;bmp}0Q;~wT|Ly_o5$)%rRlb&^kPL0GM22st}U&Au_sK-+64`$BYp;I7k;F^T)-PEUJh+?*Gvim0^Hi$?@18bIz9~z#w7r|; z9PGek4I<+<4IEH)?Kb5|APh)t6oB&!t9zSuk(ktQrfL0v)DH_cG;xc&{dn>AU3;pX zzGnBOG`cG0PhP72wCd!pkhLZ`S?kV=xld7)XSTgQL3+M9p5&n_mI0b3_&oRM(mQlJ zpyo|U0(7f{$q4CVb8x9wgpd}$KZ9l7eI2cAnBoZ9-)1e|qlARk(E4jGSx_w~zNM!k zOK#pzkYQOp#cfwGHox5cE#0R=S5TER1pAM~Hqk3->T|{xmVXt|0gaBLuVBD93v{VslF8Q7FQcis#{n|rE zP)^j`qG|K+#npjp^|wUUjCuIm%l4*vb-ozcERc888b2{+OD_~1dl-QdIRF9v8RBDKuMs4tGd*QenRqA@RD&8E1kGL8c; zE5;mCsMW;ZPZ|PTTnh;lQNFw9q?FZbLU!ayiPlS{NjoN|K8%Ko*4L%`Rfps5(-9Xb zAuUNJDtU5I4jey4@%J@(v6K(>I;y62RL{nJLg-Gtb=kSfioX-rO>R#;ysc-N(58cO z))Tj^g@s$|()TDNbMbA0VbKBv)`VHrZS?}iajkN1WR!wR%O>s;H6eTQGbK-$1r`51 zBWI{@?wLuVoZ4v;q>4%~OKt|5w6=B8i7#rJ=cUrxgIgw`PZ{hM<9)l^wKJ%28>c$A5T|L3Dms@; zaaKrZRu4=O3=G`AxF8v5#|P=<{0@M;p@)D-#XX0zZuIE9WGJnsG_0dSg!&6yyg?tr z_KxbaxV?5dS~N6B)#N@KNN~N~d1-!mdvx-9cB7M_bvc#R^vw1!lV?j%o!Vb1nt!(D!x56qn&h!s zpzqKBF{3P!AGSS}Y_;lDpy!|mZj0PtE;N&suqX`y=Icn9?F&N54eb_C(*^vaXjSdq zp2fcncv)oiW_uf2nif57iBQ4j#8dA!egF>0zfmAB=j5W4-)qeBKkNpYR=!zyc1+$( zgD^rhv`gQ?q>`G+lb9Wdzlt zL;VNG-mEDBss-BN#Qcn3@WK^r{hGTXeF#88k68H+OZ{+kF&ILOZ|bVK6EA?s5*L^G0aTi!OB^j6s#XfQcpJl>F$1^65B1yCH4^?vxkFPs#(M|l z@cNF1gQo*y5u{|})f3^y*l}ydKU^%EK(!K0W)jG+b zbK4$GvmN(u3T7k32QI*j8W|XZsosX_?M{O zlL67pP!w{+D*Rmbi8rLaI z$VR3Eg&3MK;)2#b8t!wSps@C9giv^8NQ(kPe4LwPVmCE|)U~Dg&>OaQ$P?w<#A!N zVfqWHT9&pb2|L!c6ZEt2_}O{>SVgqIMa4ECv;hylrj%~(yFOPJu%bQ)x|qM00738? znjAa6A-gF~jXkq`QrFGD6bxNgD5QnsJM}AzOAhNW@?FH2Tx96>e_0!xc%dh?Ll9tC z{B)(W+qjH-#a-{4GYadkL?&m|PN8S8Iv{LZJyMI)zn9T- zlyk<7ku_HIRh%&rWd?Phh`S=nHq&+tb5#6G0~z#pQ)X3FIc^ps)bD+{B<1@goSQ)q zY*Fk<@<}cxzPU4Rz;-8Bx+Z1nN$I#qlV5~4F=}T3@}+^!Y^Py7=<<{EQ2lWKq#3WP z*mkmEH`2dzC$NUC-w(FG=>4|=S+?m)`iXjpItL2!YO8kw?gk-9Y|^3y zL`ZqLh{HwpZpuCSsfUnG)RR5KYv9{s)cgQ2**zs~P7pTB&6DglzK}1>+iU>SqJ0YD zzxvD>*n697xi?M_l>nT)CD&(--n6IC?SOGNS9qLk$`vPhnv%G~N?6wB@ooVJQTiQh@ZWtH@WDY!f7u@2*?9Xk z_d&WGcx2L|Lvq0w+i+4cJ!75fMm9A^bJ~7v5i#$S_ThXs)TMwNw{yLXy<^Ja=_JE~ zU#y?nZolmb`nG^NXB*bqq*X2ow=iA=`!eVA_Fs%LKdwYmF8A-EVz;2R-qw2QTI8zWTh z888@8mseQi3>BsO)zE`)U}&eq^s63WgmA#HZYjlK%Q`+Ul3dzYc4QDKA);d4Ieeud zJ~li3Q)lp2Sj9R+L%?ep6}n%W;EqYI92p^_1f%@NKh-hO8?BXM^2)nuQEW(jerwr` zCi~X=PLHayy&8~^CDsjZbZ4Z}(;>U|W{?=Q;krV^C+jX{)USl*Qqr0=xO(LY88vu| zjj3CUlVyN?cC2ee3uQ5is%MCYPyLa0#8bjk`{!G?Jn70q_t(32DqUi*GSbcGOaw*~ z|8)FJsfn*UGK&efvgJKiDA%7YEjBmTjNaejD@R=fd)asGJd4DVgxdA}H4H!aS{IWH zBIboo9b8TpIf&=;`j-5ch9r?prZ`>r5HgsXMe-GHmFVT8jx<0)JCo8#Y4OnXJdQB- zVL7@%E`nK_N88|AivY?JN+1hZwi99+|G?!OStG*WX8z&PypO*!8n><$0b@SQshGK1 zt4j3yQ1Nt|kdgL5`8B<0|>Q zG*RYMdnfGWD!Jf+*p3XGu!noKecN6CDoi5(=D7!F$`@r8;BU94>3MGNQYq98wr?VAexl*;3 z2$GbmfLf;*v-kg~vN0)U?BAG|cFrBi`Yv=pQ7bO|*2j$SGI6$1XIgfP|5 zSQwi|EOvS&CdqmPTKoaShMlZ=#KZN>=Id@2vg@?CYvBy6tm`>)m23@g?Jldm)yVE@jJF|;5)pn^utPjkGu$RSXp*iGZc$WOq zi8*}syZda?6~7G)*bCJa4cpox6m?9n^gRkD_;if@`FHC6DY|y>UO!YcEoKdj1b)m# zt(BVZmZnwO$W-rC4OZUwTMZ`_l1k_uOD($~{hpA#XcF6#s;z&c)%DL1rr8z#&KT_!wDSlg+nxkhI*~2sT_sgF1=06mfvLHCc>#{77e+!vT@_z1r+x2|)Hl z!T}Smk_d7U`MN48kpwkzzmB|@yJFrDzGtl6Br|5sK5Q6_smZ$3*2R$pz+1E%t_^U* z$q##Y`(^?#4DQ9h^*5xNAPx-(t~w9n#g>jiNHY@1iLdRElQUcb(wvv42HiqEviI^4 zLFq2X7MZpi_F)I$1L8T?PQ{TCvy$0MVx!zr-Gf-_Q(6Rs3Bb!~6yG{tcKAoFMnv?-Uuu_-IZee zR2?fm)NmPyOsNd95M|@*!#@~yS>#j;lS(U>S^;S|&`X$up{9fwcXQ0^MGb9^yLy9? zC>fSt{4>UOwwWj@e^Uouw}7@Xj*^2d+gu25ErvD@r@t-0#>GMz6%SdflC@}7`XoF0 zr;)sTC!0q&N$cF2)_*8r4hhcb7|l+}-nU@5wrqi^%rGEJ9LxPU>-GIAsTnzOq*|`d zQ6+mcyLjb_3Q|snL-=LHXOPdxH4f0CIb?Hh!lXpPCe}KwnN5_`lBH6~LyD2#66unN zytCPva)*(8bS3`IAdyh2<@HzaDpy+eDgro8GRclC{vp(0N~EXZSQ3P~I-H)CiA+XY zfD0BMA0z4Jx-9s?tfY{JHSE7{jB;Rpswl)3wfs3;~DNf;%H#&#` zr!X@4l0T*2aOcC22~e2Gj;lruC`=`w%Rb#jFbQTsRjHAnFUs3a0>rw@{gasSW&+$I zh~f@Rvi<&cZygTaLB)xmdGt%a6TfefDtzq5q+R9~!}uJ}%mf7=MD?6P>&&^xSDs~^ zMaJpFYzNyE;LoEEgyH;gZJIZy3_FBms75tbJriJ^DkchiR*}(>GI4yd?pU81WHYq5 zRvv4NVEQ55<9_W^zuHaUJ3(l$v(7PyaS-%%yl1?i(^It{uc7S6H`TGh!LX2r0Md%+Gm0!f-6((mZZ6XJY@p>uk=8_PVdp=dasM^b2(ECotG zBpKPuQtm29xy)U}{y|~@DH0LaNHOEsj02ZNo<%`is9d0`o&qp5qLSa!#i&EE^V!|}CD{m69OJ$*wDcm4Y$6X@#4 z+N;+v3!BYn&mmKSEZDaKqC3D+V~x(Xv@esEj%uRpdD;h4SHCG{1`^-``IY#Te~kb$ zN!@J|0qR|O5s=m9r1E%;Va(2pr-L0z+~Cw~sK8&@6GD>pc}pS(`^;Qu;TEBMFYjJ>u% z3Y0ODgW5p&;3<+=ri3rW*jyE&w7_^AiyF$#9GO2|etU1P1E13n0urD7OhU> z9Tzm^Q*p`{76AvWhizYyctYKwZsSmq0rM2pMfu(iC3Go9*UguWjH5OynF{r<@3Q-{ zm#>4K6^Aaxr&RwaO$sQu zp4W}?$#6Sva0(HlQTL3&PK2zoIoR~5SRwTi)B^d&q8?17e>VtSN+ z42TdLYlkIzpjD0Skwa0XKl6u|88&lY$z@;!?v59dY{N5W75*hx=KM~d5Zl2k@O7eZ zc22}T&lV7!ei&9d8?HJw?lI0WnhYy7=yXV_5ab|h^_#8tz5;PSByqUWL^U6|aLI*~ z3L$eLiJecZaPfPkg%v%^-ya%pX-5fmi_X={=GoBHu!?Xq)G#B9FzQA3(BL=AOa$jA z`<@%&r>yR^O77QtlSUsd1vv#MP~2nYefxQ_QPmdp6R}$N`M*sie^E=L=XD+Un?B&{ zIVq@=IM30LzfW^(>XfPGsE^%B0t>S?wXW$n3(cQ5kIcm!q(QSw<8hGRs)Nmp8_b0N zdevg9LKlfEM>2C&InXy+(Wg?55b*M7)~(|-jSXb^#PJ4I9sdRU0bU?Fx7%izF{}jn z-@HhpU%Hfb-vTxqP=MUFt|SgKmXG2eG;4$PsAopAyH`)>@OMvqPEi~#H*odq8UH@( z5KdR$*X!N(9g`04BX!>nSKkA5r%LE50~q~?>q=DK(ITz$9VuL6m!@EPOEIhBHlmKl zh$tk8rBSh*p)vVyp$!NnMbQ3r8ht^Wf#9aKU+#k-aXUG-7b^B>6uKcs;g;D#;|zYK zSd74wFpz<0wBr-^#mYvt7mO`G;w#W3!O@d0JLB8dp&@aTBvwPkB835~-6$M6DwwM( zI%=|AGt0^B$xm!F*4)wq6d9sN&Wf+7V46exgsoF`OiYIHnVll-QZmdB96P}UGh^HifI2ibdWEorX}Q@<-Bfc187sO z_5t=Q2sN{$%Mzl4*XeB$gkn|OmYaC7$voNYn|Qqk=i93sI5) zQKDHaTh$SRuun8FIkngJoZQlg8IC6qztv<`aXF@%JYor_{V@P%Rmt7q@V&SnhvE{u zQ4a*F(q5O$J^}mj`S+bFSCf#+#DGyyKB2Gd7W6d_Eam|S3k$L7f3YD)fI4$ zr|-*@`!z~z(pWWHBSEi8@w7832e3~XTEU^Zp)Zy>8KY!_u{VzWQ~tg{><{>#7}|K; z2_*N*(x`I$jmx}!PeeJK>CcEX%39A4;eON4oCYWD(7ARBFrVys&$%2`9P7;{OMMq# zEvIU0s-q4D!$NV0qG`{huHJ@P!?!d|<3LO;l*7E5EDDE{bQT67=CAF>AhjLfBT$8q zobgimIq!>ck&vj4};nbXfxZ$IZp}<86Ou zxrQg$H^7fZO2v<8$E)xmx_tNErmjNe$0jzzr&-yjTi(o5(nHz|Vf!%?Qb;F!tV28p zcQQ>M%{1+@yp7BQ-K;>`U-K|%Fgaos;GBtpc`c9sY`Mm9z54XJ?=y}NDlj`xzgk26 z%=#no4nKBjF>(u>M=@QD+A1~gd->be@&&e-Z{8T=9UC4{j0uevit3@$+-S|&u-TeR3 zT}{R{x+MruVy;=91l?Zjgv3J3IlxzCDh;Ce5ff+G=aSl|Tj)p>F?^EfbFsyvUGSM- z%pLERn*ST*8Z=lKY>7flIAY)?gyl;i;2s5$q+z}MH&hh9^xBR=Q3rzKQZ2=IYTThKTy6D=hfzWO?#uLMeDhBW z<95=mZ;bSNj^G6_`Lu3cb!lv$snH0kK%}u3;Z1+Ir1#;Mt(yaQ@k66?y8y5FpFVt{ zBtp|hTYY{)0jb*N{soT?1e6Ttc-FM@p`JvPqt@aT=e#8v(^M(yN9~}(OF9l8aAyMN zk-gbBNi^notbj3v(of;tW~@blI-`wTwt|R|)!7EA>I8&a8q=IvgKU-rJ%^&&rt8!e z8OUDWi@ZxE@s%!nANzD*6ZiphG3hEtJpji`nWxI)Lmo8@cUA6Y34?CaLX?hny<)CG zMzNcDR8AS7>KRXWIzgLd=S@im8T5n$!R=n|{&Xo+9F0r96&SkFc(t_hJA*Je@Oo_( z++*<+^fxER@y^^Rr;HkCmr~LtPy)HT+Dwu|&K^7UI-u*?>9je|2@++5lhd``nI3Pj zm-nj4!W}IDVu`J?uk)>^36?M|wzng65`g{Z1HDcHnBWj(S%+0K=N=pgQ&)}F?WZn; z*WG+1($W7{W9Z$zXG_gjJX12_e`t9y@X^FkYUxTM6@t7+2sVGdN_ezdt!YLM(s(o} zLqsc-&Hf`H4)`cRw`93vbv=Im=V-Xb@J2=a?;&QLNa2~~bh~YqhD@6QAgPEs;?n7} zHeWVWYHr!d7LR8N*-*-PZIt0FUfS$`N|b_`hWObA61D zFdj1(yFWi1t^-_UR<>L(M;uQx?}lh&v*6|e-k&F`KRG}4JrFO(S*_U|t!jvv&3B5X z%9xKPwxh`qctZ@ZUT#-|_XGXBjcd8C9J&L&0$zR(U7qP%QTve|Xs|40&R@*blfQV2 zWC#DpzHVX5=|Qv3&_aeGsK59;TaVp8Rf#1?*VcF5$!R6QRnGamojSxEx5f+wVR1Nx zNYkBdCs++J+}#WmJ^4I$mjBoUlUkgUo>~}-ENE$_=TT@mXjB~yN>^I1zx?^rHro-N z!5bd)z`)ww^REz^fRiFv1Hz8wL8v`uVWym4>!!C?H9;c=X8czs#*Y?6sI*v|DmvQL z+Nm`5aa03u@${EHkNi zKZY>cqP-x&XaEu{KidH;8%F-dZQA||xfsbAS&c>f(Li});1YxS`eGlK#Hd|}a{TmW z>Z%|T27%|Ynb;oumsYM2zQ@UQU;9AYu6lNM0jhi9XjbWuX`irIOJ;1CjIy0IU1P@vmP0{v zCb*9zjG-jh>c07}(OrX*mH3xq%Ho`SL(* z!iA1~9G$-*<&ga%Kgv}6*K$QoW|SIJ)DG;QuL^FyMEn6bfs+D#h|yWg1*&W6`gab` zk7YS*=OeVG?P2-V<^P7>UsIx94{tu4y1_1k{n|XYAcu}3rAyg0)C~wEbcPX@bq$&e z6H^&8aP%1!lg6LW@AZYR2ax5bb1U#$lx5N`X?fE~XoiY`$>Dq^hx`z-oV$muE|P2L zr6hzVoPT~t>eddc#$$*3l89gxE@N&$NM&q#3}cN=vEn-DY5^D5p)%4|)2Z#Jn#cZ9 z#Hbm`AF_ua(=kJ01On{rI=QIe1UEc_;6(0AVxpRa_?53(8S4Mit#y51>8PC$H72(` zmC=q5dlkP2|ES9xtg5^g=<4J=Wu52xm>YVh&zas0{5wVBnW^c3;zGZBnT9&D94j^lbj}4|w-^ ztWxvo<(%m%>KT5?mS_qU4wf0(=>bZ~q5a~u0J;5XLQS*@(c0S&dOp;=v!9r-kb5w% zW@6)dx@RE_C9=$%vLyJsyzS%oLPyrt$2`nLK!Ohbii+X773d|q;)>Yc`N z+?82qu{Tcfe*lMhOV8)U##p3-3NfFwY(fWT72zXQ+sc3)3C{^BYLWup-Ii^$UmiX^ zUf;S%dQVy(r9?oyd_sV-sF&p@lc}G$tSyJF!4}b@ z`LzDN3A!d46?o7cZ7q0c(LDDSANS9fF}b_X2f$lAzt0I1NA8HmPomPKx1FQB-`4g} zP(!@E09__xr0-;t#&QN;(2ZwVSd75w?IJc2ae%VM6eF5F!KX;0LkbN$B`~2h`U(tp zT8<7NN2o|-*xq^DU+gMzphV#QD?Pr#;r@Mej&hpx+@Sk1>x{-#b#<5>70Bk0>=tD9 z;-EPz*++=yPSB34jeNQkexH53u5-%DeK{=R_a(e(i4b`vet8g5B%0$0VCvo6V{mpe zNP%j6bHv^s#(A(pc!>m_GrgyGxLfx_`O7mtIZCO|z*xcq34Pkd&-$Jx9~o%)UFT-K z`^B{-1XRw(>s45y1YqlfQ0l#KJDv|OHyCgb3qj2uWy39WhC2U&U)azPArcc-8>xj__ptGu`vG-x2F0n#4j0L5_fbZP~im zmE%Sy9HsT+d66=Op&&UXme|lCi%=>^?DXkq5EY}tC98dEr7pbWHZiFRfS14Yi~45A z3oZIfpoI;rP|{HghCvgA0Wq~0silCY`$VP67}me_FP)*g%EGqw`pc3Do9de7F|E{a zm0w*Zz1OX0^sG(b*d_F*QLRAyjg*YSyxy3K+7i>?GyM^QqQn!}3-pL9iJ7{&`?jEx zjV-po!iD`Hj(H*}px!pY>Pv?gf$h3%=k=Qj*KSO4 zj6^>EM@lx3j8!E)y5>8FCTs?1RN}Sl{ki3I{1Hz@c&m7a3BP{KKGbeXfExkfe?d8K z4kzrZcv9?U!etPET!dS2GcZPOM7o{Bjp^!)k+z%4!<|OP6pqPJA}<_W8-cQIBdZBF zwQO;9j>C+`4gdIC865sDU87qxSKr+g6iUDoby>rCeKYwDyi^XU z&k+BFqzb2nyzMDwRW%petK~32lLwD2^sjM(`dqzRP??>NA&K`rLru^6~=%K2Qj$%=&tN87rcr ziu)tt9d@qn{+z||vR(PQS^Rx6Gi_7IBew6o@8h-}9uWAJOK^l6-m$o5j_djJQW%*K zH&DPVV`~ei`;Oo$w{uw%)j|= zGoW3@bvHuWZ~I@C^%q`sf#(^L03AQ5h;YZm>j)YnlNzE+K3NUmk9MM>Y3UQ_pb?K* zyZW2D)Cd=MNgAAiNd{Y-A!pV8v@(gS+RXdI{1>5sr9e~Se*;N+n9hT}nrLPI|8?F$ zTnuCYeG=m^#a7QaTXTk;G#8U+l^-Q|)5^+g5~QofPmHt9cv}Qj4Ks+;vLh}ISi{il z45S%E6#K3C;`+iUwO{9cl^efnN6 zI+2?IABKL?`fqYmrz4^IsRo;PL;`3{MWK(C(L=pmlzOTbcxjcVG4L(+;;w84B)LPi z_1`kA+alHB&zsZb2Aj4YYS>oi56ie4KO5HUo0L_dTT)HKi})PYhz~5cBiRA!n$D5> z4y*Bq>D32Wq4U%q(gd^svq4oN4f3(u`IYef&{iS8STjp_SIt*RLN2+hJgoG-0C7Sd zA%8kdeF^2BJUquIN@pn$5r@(gzLasQzFC{pFlJD1`EC)sULVi6OP(BmKIgUnE<8># z`O51NY8V%vsN8fDJ=b@8f*kgXm&mX2+2(6SnpQkJ)n&ksxr2LfIec}fLc+#Iw!hB@ z2$7g63LehqBxzZ>;!7^hR<4%va&-owMr8G5{%K=ht2^T#B2uA>JUVlN_x_B*;{LV$Z zMvU(7=cQvWbcoEa9%*knqcO{swX%D92`qnSt1Dh(#_on$({1BJO3UNi>tWz-i26YN zNdcX{DH=kdMJp9-93(H*nKociYd^cc*D8b*VP-iJ0%4g&iS!Wm0`-AJSfw_4_A+~5 z_I-9fO*aD|$wI&*S%uO=X@x8~#VeA1mTs2pR%eojB$mn02frWeK2@n0x#Jewq{=H< z1+?B;(v1e;&;3P96n&~;J9WQv>@7)&d6oPWI+|2 zJHMW-us8c1ZESZElx^Os5j}OBY^zd#Vl;$8j-El94d7EtUNpt@>7yg*0-!4Z@Mc0}`PLz+K&uO$gZmylDBK zX{WKz=y|Ja4FBAr9qi9l2gjyY13LJ(gY%fc)|wBbKnw$0eTz`iuWsVfMc9Dr!2wlkB3p3k-P{+jd5*l;YLxt#DONHL0F4=rS?J z_o8(VmG}i#Y{)d?4=)DRM#qs&K3$w@*v;MiCO}7xDsbG#H}yuHK1~IA4~ml01wOV$ zE7EJ&Ve-GOF2BOh$_o zr=0rn6w1`WBI6G=nJoqq?I@9`_>$)*vqaLI{cRc}3%M$xS%iDAt;+^O)X7c|D4kDY zJk-rCyQ6FG;2F{ljWu~S+q@MAbe@|YG(EBRvnxhs9$YNO@FQk@Md0j$t5n_9I*^ml85aJe z!Dg;*F9&~s5?%qXH{U@svnkA~(=M#Amqm|Cv`TXpp%N^FeBGA(?SV!ni04tx5;VfCUz70j|{DvB?e)sx64ir;t^ik1p5Wwj+hocQ-}J|{`b zHoe}u=w@GsZUV+yk5r~`NjDrsEmK%St|$^sj9~@W^hJ3`ZAXad%mguFw&aj@J8kfn zb0>;oxtu8Yv3nXZQ=X#{#;34YV+(jV-74@++*uOejlDGr%;5ESZn1d_amq#&tIMhJ zB8!xUN-8e$D&TYAtExzGMKNL;o<$HP9+(s&J8H@Bj&Ov1p}9U!H~NJFqr9gr1U1Cm z=(2zrbUti@QDF3_bQcOF1O#XwQ}DGCmd3 zVnG(4wCi(@7C7;@&&s(aG)KHozGzCIDFO)Xw?-Sgi#s z@CgJ5Er|w8$2fh#^hO~a$LoJG;)DF%K|tE5p@r7LvAH`U8~z^_Deoa=$U~ex-lLs?_U>ZGL!mXtrd*tBq)z-2c!kar zL{s8``{2}=-~$q5t+b_hy_{rP08fi^Ei#f+sM`Mk`#=Q0LOUiqsY5SiaTH|Ba^as< z2>&Q{mLvFQGRu)mhV9&sy!k)I(K)G?=P)55o|%hdbPD%aqRaKtKdY1eQOneD)e7T? z=8O>zofAw@4Y3sB@ze-T%Sl}4E`|ba@5&6R!_;ce8-qH?GiQ$^1C6 z?#IJZm;Pz~(u?0dz{3799*)8xg_YvIy~D!^$sKY3B51aaccWVWi7GCGgvDXFe_A zgNi%qnB5rnNO)Qf57XO;uS!EBgIgJplpF`RMYDV3cPj`gN2RkJ*z!YU#vD0Y@zb3MKg8llmYxJt(r&!&+`(~7sa3uYAw z6bUxe7p2tN0=AU^nBQ`<1+ zW_-Imw81Ju8z^>`FBb%{ngU9`AVTp!+Gb>R)v@^sWA;NTM;U3_Aqi%+08nu`uT`1fT-IT9VaM8Cw8m@O8v7Dl3Xt9qmVO5QYY)9mV4g& z21+$LV+G-|r^HHWNYFkQEd@8_{!aAY8D>SR2un&cV&E)3HUmzT8ENgn zoYE`Wvf!XIXi%rcqn7_owD|a0en_9?sI*@=6#&0`-MAoy4@3nDgQT@1#(GYqW|7O* z8CD*(*0#B%-d0HJD0Y^_D6)J8Lt!sc{y)t4Ov2COxt!bXT*9Zdy55%b(` z>q-Go%l|gq-c1X|mE=ZmU$xXR)iL6vj^ws&JTEHM#Y3Z{)_B9UEpOv(9t%J}-E+u| zVdu$x=^PpyF|E+AVZsP}g{#H8cse{S)X-FJeaxCeczuoVkAlvicAfB#;(BAKwtXPl zi@1A3UoF!*PW1oF-rILKjvMKtUxjz~WXFAehRql7EjhV4?)LO_Z~86mp2^Mr2ZErj zj4Ual)ZLy>e^CX1f@~Eii^H{w#i6^T;?bKvk8fR zQg&Q7o?Y}$N({A6Fl=ZA=DD6h-z{!)z1|DYF}=B2E~B|v-zuo$g&+ER?eQJX^pk77 zgA1%}(jF&mH<%>7)83!{{c88v=x17DlU|1^@(#ums@0vk*WT|OQ3B(P!hobXc*Lr8 zl;HZ3=TWo8>fZ;m&Oi(fX3#*nK(y9Q?ABbPRo-9S$iv&USO8A~#T!mPChg3UB1f3R zv_wC-axPSo@9@=+a??@XMUnTn~>-yWyj6oG&Ubn>}?m_ z!|UAKX`{&FIJPP)Y|3rsxL5qC@Eh1dA9X5&O||U|{0FVHqv=}mhG^H}^xS?nEw@ju zoK;mED;*9A6~hn%k+QmLw0Eg;5f>`wMH=p_$^6`YHX*l9%8o14X~}(3Y*&YDv;1}< zJmRxIt!J(IS3fwJ;P>ALc*Mw+XiYgitDjBF>XR$id6mhyD_9X%+Dpsyzl10n)^;V3 zX4G-ggfYg<&+2CrvihX#xTcIvydX4%5(D;w`BH1gdb?PFmMmSm2ViZn@Hdg&Zi74t zk^a^FY!T9$XLmS|5=Usww3I)&vdrV8Xe+6Gds&;g230K-E6PlDao2T8J+i;}DgSIj z%Ab@S*P4?i$kSqvCdluxt6g)ZM6;c{XajUPl_C& z0MmLJ$dxA~GQvdVN0P%o;)XxSlYp%7%l=w_7j{1HkM27{S_JP#VCg^ho3*y(GrWx- z*bnAbF5t%(=Z|>oM`p0m?+prV%SIbcQ3LZ#-XyHf(}qE%ZBsXSRXr{cd~7&A5Ry#* zLP*(h!=WTccG(a!(PFt^kHXM%>@tKHHhTN<(~ZI6O{D8A4ENhzy_(6k*aQ9^CN`{= zZGUM)ZU}#88@HkN=E{C-jC{mS+EJ;&6>w>cceO5JOdQ>9b;!Oet#4H)v;^+`(0uFI zYN2{g^>@oT)%r%hl)!FqI&zauLvF~GyI86$$vc)LDUh)h1*_7yU^VYj*=2&aak%I+ z^O2iu0&+vjj%#(OzXB^fN7S2=2lc*tSUpO_^yaE=rXZ;L&-2Y1I<7&nm*|laIzz2Q zdl09iJlQmsBy#1fmb@yY0#1-lhqFbh-OV;Kl)w7A)UoTYO08fo>NhwrdEs~6pW~j?W9v^VHUjDiz&(x5u72Ao>~FaK zt7U(`)Z3}rNTP{{ypd22niLvWDn6}Ofn2%n%AA)nVI?nH;GNO?P*Dk1CY)z^)9Mf= z9K&!QpWqYl2~u`ksVGUm(wxwzBbpUnqYLH6vz_n48uzD9Yjv-`bI`9#h-N;RX@CCS z1xek*brNp^HxbmO)A0;G4bLD~PB~9&)s!qvEA6ReFd8eDlI3N?1#gln;b9IV?&BGJ z0-iz2j_VRR7=B!r$hLz0#+T~>F}V7l-cu*&0I#JYUb&{pOYFqA^1wwB!DD1}yJpcQgm7zV;fL8qM`B zulxVFB@8ivyO&-E5BqK&2vG`sO6vhBbc8}rLnO$RtE|o|QAw5-K+2`#bS9d-WU`Y5 z&v}t#d2kAD#(hMBPe3F{S(?X$6d7;fB1Ny^+?31t+>W4HZ|8>NeV<;3-EB6j{`Z%c zb0yY`3qRPszZCFM^S{hCAzZ4y*CFdn%==3?n%Qm%21_uY*!((EhkUg+p(hQg+v#`( zpMY1q8y9yk4`0!vm$zEaq_)CKGv(eC-(3<~O+BEf^QJ09%c_d&(4$frtJ4yS6RI+A zL{fEWxP_Jbun3<3i;%Jbtqv@A9=#Ou*X@c>YDyAsGHOs%e{IkZBbAL(!GGK?T9|`@ ztyfw(Z9y|Y(cM!2jnK(c`W;B2BXn{aGD5D*^EytlB4=$@0RctU=`Bz;tkqtkE6)lm zi;s-(3CIX38&H;KcRG*~*J`ddct}ELKQQ!c7ozW%a)!BVo4o6zGnszGHr9T4Hu01DO)KZBu7O2T3HFgR)8 zC)&NqQAOR)dK}m@w59sv4hRi9rKf@vIzq#yp(y0aMcs%tD+Lp64$YvlWI`n^D~qBi zv%Hj?hug2XkD~AiC<-YX&@ggP_qaz!h(_P<=fB5hnm_)>$~Xn;KkN{>eq}p|G4FxF zMIS9!(A2rr>&>8y8;qW!whrp@VT|#5*O$Q zV(ro+=g_LF4n11`8c^W0ffUSa{t!uF)LMKK>s?vDzPB}0e8J7L2zsqyd{Dd8+w4YL z&mejZuBR(&fhq>PwkvmmQH&(>Fvx(-t6<0f9@IB$O zjk0}@dZ)(=_RD+ZahLk>!APNLrBPV8h?kGf>iBniQ)w>rgA9@0@HV2&S}b~uNbwP7 zK!Tu+8(P9y^iTAn_t)wFbGU;?e_^d$N5mF#!kBql=!h+30uJ|XTzvfHN^Qt&#|g@s z*&NF8@b~>CdWG0L&ERFSUM^P$1o{{61>y&(ubLFdoIWd?VdPoTmhkQ>V zn<0h9Z6=?9>Af2lpK3FPKaXh#m(3P;`bjnfZ1N%S7Fyu;6-mvCyw--3)j1PgTe32( z>ZZzo-876Z=03idPrw&R*?{3tBEP&3#A=k(VKaF@jENF<$Tw0&SyeT~{lC1oK#h%w z2=zS$MkIxfP~T}VBDr#lg9?RYu<0_cw_R52ZI`ur*HwDcg*`W{GCqu$Pk<3g*?`JW zBA_xLcJyXTU1+^s*zO>pOu$;~`Ft3d@yq-Eh)vTnOKaPgclz@Er4_%tduZ0Pmg$|E zH98*eW*eq&5m?C=w|`oz?vL8-UaN2V4E?GeT%bx=8 z(x(0&q8$9fRZcc zwNQCcHB4lc-oANVv09}mOR~0U%chBwvr{k>ow7xKM<+7=B6&H#nIbd3;60EN4 zlmW9!q0+d>M;Z-t9{|lK0HCC7K&i>uGeMsu)DNcj*H$3*fU4YrztM^N*?i_;&~C2x zb=zHN%P-FsORqJNvwRRCvMb~*1hwaML^Pj(h`t*aKO#9h1e@MJnVT#G2jtH6CN!92 zq042WYM!%(=QZP1R1R_0hJ|X0~$<;Ja&;jAFAek9k{^H zNH?u)HOgnF&Tk#2|NH0*?9sNH8`&4X)k)u^#_|w(jeu5#=`UWlt(>MkHC54VKjcNEVxw0&Q zkCoS~X;h)Tg|=m)?oy_zvMeiJRBb+@mOlQQPr!dk*??L;oBfWI__&xqxW)^U1GH|z zu*3fGziu~w&}#K%_L9orkyj5Y#p#f3J`J)ZR~AJhrAQmbwcRnEv<+*3BC*a}Udd8c zbuy9x@FClL0%S|d29)C29dD$>RR=)@#19zDGaJjpae8k#@(D#a1$ZNcj!=YYjCSP8 zvPrtK%}WMB1>-ubU_yr#tkqFPu7e7QDZ+~2gI)Oqu#1!pC_+eN*R^m=U{78NgHatN z*m4d4fdS=G76vnM@TD0gel$4T|6_hIM)(udQ~nYEqCfIq;(ql9j2Fyjp-4c?PtPDC z8p?3a;iZYv;YMsOK{3(8$%*uQe=_xSe}ux9d;Oa>RK`NSyPzqYj?m@Py1&SkUFggp z6k%KkBdh_MN2OztOot*6iG)qT2hj2f02(P9Fa=5^9Dz_$U+%!?ivEv_g(K}aZQ$6H z%dK{+&cxle(SObU_WA7#q~l*h)n!!1zZ*V8D9b4j7%6mwvP|pyB3E`HDHCO(573T7 zxSA+dRap%TVo>@NRF=ZWo{9y*mcT;$tTtM6Zf?NIzQ_5$t-6ODb1lq( zCWuVCxo~;&!)ijV6;cyYXk1N-X`Ni;%2GCMUDhcBhl_FTaxtM@E+(|c)oF(d{H?H> z_()4J0cjy+18Q>Gpm|aZ=mi{mjU|>Fl*FI))oVopH1h0zfMLKx!xm=S_Kc^L6?Lp! zYE2|L$QueO)9DyYF%5$uSC&bW$QDO)<}jKw#nGIK=^aPLs+4KfhG`26AA>0-U@)X? zK$)J+Nk>Y&Uw-v!a#zb4=z`Xyuh6^BTq(GrcJSP`vtNYCsZnZj3Oqmx9ib)@;DLAJ z;{T+M74iW&Z&cPKf~93wG2Ya$t2K&24N}|1nW)k*B3Sq+L@@z{AY}vENQu}J@E9Z_ zucmuf8=7>QIBc_%^5JskrmreOf& z%ChBHt;QM&)2StFa7v$>bs~7y>N8WQ5tZ^WfMNm$K*|PGDzF@(K$OJm?LwMaE-d=2 zpsq}sv9@#&MqVqZ0;ebPi)o4cG4a!b+`TQ$`+e5L)2Lj0YK}80js`=hjY`w z0-Q|x7wz)fVy-;~)dCT*0Gg&-Xvd$eVAz|oVp1&5{RR}I;{v{=*-A{k6U5J^Ef3Ri&Y-c1S{AX$%wAC zTWNzU^SGAMdG8)KYo&jGCxAHFzY)K|jdDy*flElCBTRY%T=H&QeB7k%i@zLd1(_wC zW?0~_)|3TP&&q&F!Jl@C+MHE7{KM$4(ZL_Yeqjstftq3hP(#WFEcn?#4JqLp z?w^%fnS{Y$3)&*rht%m!;F3WdJRPYirnN|oi648c4E1`$>A~)A?>DShatoy8lp>O& zk8Fa0)mm8@&&!lmY16Te=LK)#w$6CCE2{8;qGAG2M9Kyf@!3Om9xB-I?hzAY}*2u{8Cm6 zm<=!LxKxc$Srx`|3LncUCSWtYlqFb2NWpqK9dK;5Hg|e7i z1^Rj(^;)|Y58AQmx31dE%{_pk3858TZcx-+7kvnQP0A5C1@<9@j?k-Vun)O1bht}d zwg3uNFi=u3k>w>za$bw3PV%g+f_hc@uunMw_910yy$UUNSg%NltNZ9}1kti>hWJ5z z6R<1I?$r-}GR`iJ9>xCY-kYB-`d_t(BLQ44HtIXNts;8$pToXsn)TWxG{b9c>mL@< zBRWSGQ!(4@Xj6?BeIBWc+l$ED$rruQ#kHD?hqEM(;}?jYYSEAWi)m*EkyrC$HyUfn}EyFol4qir7El(}6*e}x}}gd*cPlqauNN_#uI z&*8PvO|2-VZl_@ll^i>bq1c*RYQ@)7a~! z|LY2*wY`{AuidUOojx3L7t!DB2VgBvDe&Ha@IXJo#=L#pE0$}m+cwnoE(7tzgF_2- zyn&>V8wG{c|JWK@TrXi7owe$#e!X93>!mGPcrnyp-0B@`+n`T`r624DW10SPSdB@& z!g|G4h9;1OCeo2s5Zb&*q4CYDoCZdcE7x6Bx3X*)r0yBdbU-1}vSU?KE7v_7-n@J; zvYY@$lCpu#ixR=n7;m;sZxi>gwLWaFmrEjRPhJP*+9fchMPIgS$h#Ypb)?95%X{r_ z-Kw|7#=YSgHd)WYkH(1UadmS{j_0}Z^keGR`Hn6ma z(wIkQAC`a$0G-E+$Qtga4UknWaRieO9@OH~QP6T43QDf* zfB*)$R_)sHl2t`q>Ht|v$hAVMHLS%x3R+G;K}p$w76+E|RQDVd=;o^=RG7Mmufm^~ z+YPE1(4uT?7nRspEx~gEet8l7IK#ROP}c2AYo2o%&xe0SpVrIo59fG)UQkAHq)Xm0c&2n)gmAj^3#=H}?v$FMnQ+pofKw%{oVr;e!rH$%Ym z2b#HUPQJy7!^rod&vMME!FfaJ{3(zwDRhL+PwV(1S9Z_=gM=>QbyKk_Nn)0^O55IQc~y$g_wqv zk}H=gOJt$rkfM?u@;rKD^?A)bwt(u-huE>hz{ z=Gr-l=z~Mk3C0lMmhMW0kjLt5cA?MRt0+&h=%?9B$KR`Wo0ZT(O7tny`&aU1_R{QN zLncK>8iA@c@-~Cobvg)JPUDv(R~D&i)3Qlfi(_%RM6fE&Q`WR?tBOkSsthNcOCQB7 zC!m<5Y(Tr7jba8C*(>DeE!%i>b922{&gi(t^(JJ7AMA%JgtD9hcalO!D9g0|B68(c z!32b)VKRdf$0Qc4DNDuDLh&{iS)*jQXruHo#&QD2NXiD3<#ddZ6oo+<15u>JT4)`c z__d6diAdfpdmzG_nIr>jQ^1=Cv@9z_LMM#>CGVhZsn@&KW|vCVFGH+s2_+Q7*#Kby z2^F{`k>Mq8JE(T2LvrP`4kmJC$rTJCYFLs%Ubk&>nA%mcx`=TIQQPGsdz251l@ow5 zQZ}G=WIxi)=a9;g=om~m0MSR&-ERCH%QU^sOi=sz)5putUq0gLwpP1Hc5|nl``bI{ zlE+R=?PU{sbPB9S3LT+G(;A@2m1U|rnYSe?l9od!T*~S=Zdk)hk=2=qc^od0D1BV3 zoPcYQvH?9hhV75gr4i9#>-xR9@91u6_7yi#np93elStWsjyxMpq9hJeY?#Rz zEc$AztC0s!$MMc7+HE}w>b21|`u%=|2~15xMp~_LP?Pgbtl&7?+r9MXfeF=Qhy804 z#7pF32X*gs#HpNyIFT#YX`8_a7naFVpL3~p$m>$%EKg+K#9V3bJe;(xe8j1mfH;w| zwC<521G%!7y&YHv4r?X7ydel~w(YGljR2;64x9fCcd_FT1_I&UIAD(b!N5|;Bn4p~W$YiI zrmAB%<{dw1h^l6!-kg%FCxwpCn`yava^);nnLbu)2Kg$+Wl^%Gs3hwOQKTYCAYB#K z8$VZHO~}=gvH`sbiHyy}3kWYZ>*d^TPKMK@9mX%~i{da?pg&s)8(` zT%@$9E%!~X>{6Bt5=<~# zsbB&o#20Oo=Uq}lekrUZe(t-PkozWO14l6j!*~-s9VtyaC2>v) z9ieH{`h>>Bk1goN!fnO8vJ<_J&1Vo(6SdsrGrRmKgX9;?mu*>HBrRsY@;GiF_Z8N0 zKV@G{NZFIJ0Uf7A_L%AjJ*Q-$QD*4V1y!CcHfp`zt~OX}_V;CjJatNc3<}-gQy4{B z3bAH}rGIeBI(=`k=51g@(LW>GoKI9IP|cabYFcPncQk}t&Ga)BAo|GtndotEwiIx!{oN3)_T`CsY&g1X4C&6O>4h z(1n!x>~o<(mABS+LhnvN0Z5@E^llmoK(6evxD3*5`rGFz6PYYokyb@kiX5_S;cwqZ z0jdco04W>z_9>C@w@(59kbeE;J$iesIm#C>ifWEO!yb1J36HgcL0iTrB$VTn^gk(d zgmO$9-7_ZsFWi)Fs;cTa&2NTDNiciO0) zG4X$)?o!X}^1=*~fG~KzVxrXl!n!pmTPsAkX0i5xi+TcZLCVs)ONs=y)WAZEjnKba z+aqf%8skbvzggQ z39BmEvsC5s+Zu)}k1EV5Xa*^Cgvv}qGsu<8w$6*Ltyx(C$yLR3RyTFWWSsH1F4MM3 z;;_p2XhuB&%^+pRRp!~C1}X6lszSg|yYhA8fAo>p0|Q$)NkraE4`^K$7(}BXK6$|;GLkh7lU9z^?128g}?*JfaioHim9Qt{Sum-FWfC#^&eDz-fb~>8KZ4sLa%fp;!_M!j1fF(W>uI8UhYVAKj|u?OLqvX3{N2 zXy_@32`O}hj!r{N$dz>{T4u36{^G7n7;nlF+@*$TH>xY!HdkpKu8ymH#H5~pn2@sL zI!Z~7=qM%jWf?(p`Q2JaqrX}5Gpim0>^A79G97r3gEp#U8=AJO*65jSmV*%Bsr1rF ze*W?1OLX<=tr1;q`#WC}F9jbya0Nm;PeEBop(C_&T6+SyawhA7S5?Y{lG>SXIcIfO z0AZ=#S5?l z^R#jy39h~vZh2nCfysLSAdD5~hUaJvrI-5j{qG*ovDuv5wWvD}czvg%5%n}Qf?T<5 zR1&9U#qv_>6IB!mtCY%ERp&xAoszj2NkI5$L_GnGAZ5qZ@R-(wP}L=Qfgxh}@%u)t z!3q2VQKu=*g-qLQv4v_CJam;Q(S(X!n62Wm9%6~Xfu(;6EdBFPkSCYxHF6-Ww7)2z zwR9PE3h)tJcMjcNW_&iVOxl{y7Ghy{g+IewZD7e+LzHu?R|3Qst0LN2zgqVC!EB?L zwj703Tj%JjT8^1J{a_4uUtGm0q2H$iD)qE}3UcK}l&#Q8&gxokuDnh-j56gcZ|l00 zO;#sa7}ltLSfic*Ymlj-tar*`C#30Zicg4Ht=B} zH8rN{r@&HX&%Oq|{Lw74c99Q~E}4OnS_OBjij|+a5z*YxkGQ*mEnT^fw-CE8(XD-a z+x?LEVaQ@4B=iuu_C<5iANrli=+H~R4;RrZ9I`YRfcfZo)Nf4;XTrYo2sx74a};jZ z%ax%y+bj3?eDl_=?Cujdmu9xi(k#)tzLeE)*xA7Dd{1)sgxWSiK);VWz02$fuh5W< z>{9rCqpE zwkkYHmd76O1V5a*yU?;@y9+HDY!Icz^vf&kL#57aNIP5}kj11iY3r8S99Vg^b>r#yZNJ=THk$R%X@?F!FuueRAd3ObAS zX+TkzTgM@z?Gz@JuhpKpTB0R=x?*9MMcxdj8qk`Vnydv>Ohcc>tQYXe=h1xjEBd+G zt=-)HW2=vLv{fLevEyjKNA+vB#2~$!Q_{~iTVaTGT7Sne%mQkKTcBECi+BT-|6q^O zxHHH+ZFr}8Wj=il>;Hh1Q6?d!_GjpvM>}47yB8u)6zrgev(EqWR(oIGVOyuay-{07 z(bH|6UKxl7nzWHD;V`~X6beRIR;;Z>CR&*$RhSru$BA$2r$cqL?6|Fyk}t1bokyeo zL}+QJ8c@Ww(+5Wo2tn1}=?S{H0592`Es!$>AyZ5N%DkMLB$5J`*Qy$&EhnROC^|)3 zNVG01nz+bvCL0bD{_>KELdW=7%7s*wlu0^rGNit?oQ~Gfvg6wFT(pjsc#C_1+ZSN> z@xE2qAAntWK38+%3qBcJL(wT;Ftu`0N&ST;C5zJ{hpBuG6TA=%iaWcq%aSq;Hp}uj z^S|KJu{BzD{0pWegQ;j*4B(QXj@U0dv6X%L*qQ6|d?5}0v^hlk!5g^3(qy*xpXf}? zzln!lJMb@#h(hRlGgA@#3*a!xdB3#0ZqX0JN@X0_xg<4serx{W0(@;on6UNl*l{*%Yt zH;&V>L|S&-I8MS6X)#Kp2>pMotHy;|9pm{@cW~GQFr34iveBt9x3Tx1eX(=xHEs+s z=xp(IIsd9pYSO`jJee6#p&ehn%HS4ae*%Pp`ZvaHl=k|V$z7X(6A2*O9p#Yz-4Ib2 zN=J8!-2C}xZDTz$77Y=wHK!2^IvMFi(J2;0t(+H`;H@mRqgg@&Ay`nF3f3ldTqlJn z3Lc#9#N*tzpwp2~T6Wxmo=cBLOMvn0+l(1VV}qjBC?ghb*y!qUsA-Msjs8ZFT&;OH z>Np`$*Soz-KC!BPc0ZeowbR=X)AkG_WEHz?(eMbn%*_(-(RLI)HnIIHotw69hCF1{KY~mf_39?&FnOchDRFRIYCqe&E|nwSd0Sa||8qzMDbOG+;V zsdcDPZbpGA+ny~zfuO0-EiVr?!M_bC%MshiBuJWGx#~pQskCHe3oWKq*04&*jOA$~ zMBS8m8IK&qg};rQ4oTCph@l-;Q9uI+N}ppdG)Fd+lDY`DL}=mQuZ=N=WK5%~Ugi8p;6y=`qCqF(_4 z#AbZ`>o1_6`Ypk2vNaT-?MtElnz& z%34_|m>k@)s%c7=HEAJoQNVzn@cvi&``_tR7PRd6{ufwvZ|@`aI#PTsR?)Tk`f+9O zY)kthEo+R>p11xjr1MO+ciA3-eSZq9a5bL~KvJ}9{;rSX{;{g>*?|vdX~pel4$*pa zZ#|yq56-VxE7;+7C%rRPG!MLa`-vg3kJCq%b4rm_sHTJP(i9Hu@}PvKo($Kc=oC$z+@b0;bvN1a?xE415;MuN%>(;3 zTWD9mXNDb%(p~BmR88HfTymDg94m!mR*NcSsmyrE+c+L!+T@8}H;_!I8z5yzb(fU< zQJ>KwkRc@nafI-4am%0!SRdJ6m(pe?epPzgl}H_BXvN?+xcv%gP;vaVj&JnWGk>s@ z)bHIl8@;t(Tl8+$tSJs*`o;pK#kA14nkUncYI5bKNwZv*G0Rm_>YcIZSfkpGiAr!; zNuVSP@|E+%N2-$vNHr-tu3gV*6B2WYpv9VuT2~eF4SIW)TzHc0#%_n99|h4$&Z?wkI%n z(n3e5?KH@oTse=koMRO-FBLF&7OYAu!OEo5`=L}x5$0axi4U146CiU^_R}s0NT}_z zA#+mV6@={fk>0Oho6}$a=0LF@lqE&4u0If(aY7#}Ep&utOvBpAl{1y)c_uiMRS7ex z3eH5M)gx^SndDubq;KE9k-*w(K(OI0Mc`q)~TB1^4EcZ|L`Oa`c~d8zY$t=Iw+k?1EtB8^Q^8^q0hlK z&GfO@0tFKcrYvNdv}G;orU-I!^27(FlL??SDLbx3lw^o3gqC`ZWr4s10y9`mxiqAD z_q*rqq*?u`IYhqEnVn>6xc1Kx`gJ|8IQQA0t>=hr4U@|EF8LcYT~o?-LbEC@bcDW5 zgK)`}i8M>Y4YeazR;7S3jDlq`@EMgdV@+C@ zEJ?IyU!)SI4uv(xN9~dcs2wRgt~r5K3C*D-@VwhEM}dtBPe2yxd#5iMREX1IjAR;& zL9SfZOn?-rz!x+f~7=x4@R|raSG+#i%3vFvl zj;^kw>*c)wpulvR1K59W>fF6~2#$~eJnH#U1}I?YMT44iI&P3m>hGjiE*jo+ZPqe~ zt{}3KtkVC>ln$>F9bG|i71kU-g`Z4F;ghoCn)B=wJ}H6p1?Jp|Zj_yhaQ&IkffGn2 zX`v%@U{Vhxy|N3QS=Isbat@>}sp2eES&<}C=2bJ|`1+ahWJ0E#lpWWBXJ^VuiPvAQ zhOCQxh(6851H?dt4xB*FNDCdI1Cu({=#_b<^0d>2pQddMvz_!l&?J(zd77x4i&V!y zK^;i_jB`36<4nqq>Og4K!#Y4pJf?#3n4nC-k84?ju2EAD1es`@$kgdjc?|?A-7p^m zP8?frLl7p?w?fhd&?4h%luk=6lPk9>tA&geD`i^g7+Th>&WoItX`D7)$Mb>*sjGSF zr9gt^I z0ynE-Ra*%rM3d!Z!g(!5_Buc7oKDC(ld|KAd|HPWDR!;zaXo9ct_2vYRzMfvq$D(% zy4DSF9K2fg_sf1L({viz9NcQ?i!5_{PQ#reD6rZUHC_Aas^YZ|n0J z&gesA4z3Yl;NYy)$K}=h_>G z;a+or7Iwae6rKCVcWwtO3@*#fyDR-5UzX9Gny>WLo)&soZVtbLch)1u1(BU=etLSF zHkuRg)od+u3BH4?Pj5}3hdzps?%?Umck&8nx?FEoY2**>8g?ywMybFZOXJ8i4%N~Bb@+p zkh0@@!)R;L-X;;GLZmNdH;b!*l*U|zI@zepJXZ02o+?uz+L$Xtq_Fev#7zyOZCR|E1pT_n0a@Vt(%9H{uE)%m?Vh!Tey5&F0Pu%oZr{crn+Mynt%D?Lls#H-RrDxKEr81g6s(h{nW^ zZ6Gqf-)>jX-wZRvebm-KJ+dfNlVx4O;yBkaKwGD*POE~IMV=RB+7?MV62bZiWI6$X zBxT39hQO*vAMf%7qhp-dO2!u}wPineRs^<} z#gBezkK3ogf<4DAdFEhR!x?>Rx(A&T08ae&-VCIA083p9Dh+w|`RD!x`Ua%qfEBTi zJcqr^<%Lhq`_wgoE@o`eb%`W|d<^%A$wT2LN_ya@;KHQP5nIBv#;q~&<6Q?+p~WOt zCNtBAr=Kmad>LvhpqDA*c3Jg2t{b7$BW z-kTn=?E>}q>1wX6-Ln3g)NZd`1Z?l`V6zazp+8$JmR~LB$=__`d>G2`hz17`WM&Il znlR`(B`n1lsG4YV8>n&M3N{ibkfr7DfiTcQT zv0{TRUjE7SW&aU6TJH6?(2{oYA@Evwk;bjmp}(rR-UFnnSfxV^)@7i5WXKVcho%K2B^jY>!A9UYQ%l~S+5-;#m*TbiV z)Pc6I*K2XFa4hM}vTv&ev+ecEwFH)r^{zpFH+tNx2{qk4kUyJL+>pP6_0;0)Y`t9I zZ4u@~K5xjJNTG3a$|g;X92IxwbgNIlZG%>XU)&{F$&PB^usM*Ar8PcRb=|TepJn@Sy*~$NBR@8p37| z$KIgdiL#bQ1`bEKLbn!2l&m}Ild9T7k#~fT%9nWQ;I}Lp(6}vT9F7T*Cu6G zbXm=SCY|w0=%6r5I+iQZW~xzHCc+KSnO`K5O(+r}Wyf_quxdCIBqhHn%P-#Srr+%J zPHQ1%H}ETa7&=iOP;m#nbxcU+crXJHdOM~X@6tA?O{riOl#9Gs*~OEMK^{3%WGRQ6Q_U^ z?!JN9WrlVwx`C0QpRL*I8$y~Fu)}4ul*^TcG0i=1?q=(jtpt#Cfh+zEvJ@R249diC z9&(AN24$Gf9zsfs9C0p8D0g``E`C&;ViJ{xUWYjtmF-|uwqx&bn;LVQDUqfi-$+yB z2~RW0syt5_PuqrxoaZc;O&-fw|FRs}ZTvEvY(g0hDLcN~P?94)8F{mJYGJL)cHul7 zs|&e!c{fwq4zZ`h!fghnmyq+Q^XA^R9w+q z5$VPTJkfC~v}pbNl%}h>kjmq2!d>S%w_(^vw+qnGJ&shkGxS6O%7n9=vgA|xUrC`O zYOmA=0>NrC?>nJH`uHusTjS zld?`~nQN1m;RcD!FICDWlq!+3;}%YimIV*u$L}kx?)_&V)V7|*FP{!EN4ySP=|;hX z*S%|j^)AeeoZi&UEf)-1#CtUi+j6YHSofyCDDWR1?7s1oI&wiqY{@GW(HLnzAt_fqM-bo|kQpRz~k`Cr>Wl9HBvg*BaZ&3h8|c#w)5U=c?b+!A+7JvLIaAMPb)3A72U`xZZkj zu%GORU=NN)19s}bDgWNq{Ii~m=DpgpMBdXdAC^3m$wfd zgWc8=c6$SI_sf3~qj__MX+X*VsJjXH*{6f^*)(u|O#H+^`AKf;pA;xl@2N}+q4is_ zJdZ2w4#hCrE9b1vIujgGs*dgDZM}o<)#vs>q9^t9Z$>wt-QQ z9q_BfG0R1p$*j?lg$TP;+z0IW1i+q@9k&Qd5{L!eBI>?%Gn@>V2sI=QnPhT$lOGjs&AK$cJ=5MbO#}McN863Qh2PA47q|xiB|+N0eX9Lc2{3-J0Qk+#CC4D$ z-@JQ_>!Pcd0LkdjUERF8iT+Qd|JP-UEwH*=dTrVu@>kVF*Ry^FqYg+Im3)N(<2s$X zf={5XcsDNoFNa=I=88n0$~^T;Z8@Vok)K@id51Ce(yJ_vWuwi%EQ*HlxZiHsu*_Ki&X)(#GI8(am;d z3(uj`*ztwhf1EU*<7PMhS!q%T(GC_(QVe8XMCdR~1wRM3;2;m9ty-X|~+UA*# zG0C`H@Hp*~gh{C#ah}SIiL@)2ETH(W5=~x)F;(tYP4Ed-6Qu08EruAk{d^-~ljIa> z11#FHs!n6~PC7Uk&5TkSp9G(_zjNKtE<1_kOkt?2)rb~CV8_S)Rg@3QOT z_7$>LqZ6uVlw@g9CXClY-;OM5mhiZ#l&sn;4X0kYU#r0<)M}8juZzNA)4A&WIFpc3O z4$LsWp80#6f@vm)cPqHtODtI4yGh(%z;AJ`BDFm{zv_Y%IbwU5R&_BZKA}}>*seYQ z-2HCM2`4O(Byo{N!d0EKqAW_r8(^xh1ZQ=fXL**jq8OR4%KbtNKA{kUlpVK3lEfwK zZBt^dx_O5p;sI@|pTW+Y*9^+Pi(lbLUg<*;0%<%IS4u*qM)V}M8b%94r7j17#o&I)A0ED zsC|GOBtY*2ro%0;11<1DVzFf%6i zD`NPBiWpLM-0CUGT`kNzy&=97bD$hJ#K`tKaFO>gIQ^+P9%X}PuqC`WWC*siClUj! z^!5|XH&~k&a``G>y z-u(GzGJ#HgYk~dY^g$i_tIBkmBunYr3>)@q#zV;LPO|28q z@6+po__Vs9G4W^VH|Q-hFGv5HEtU(0@=SlS)2`G>DoqZc7CBE!p0K>iGRC`xGodma zl(t>Tv!uvnHsbsG1wed40T3xWuF}sg03sz`s?K%*+L}1ylRothXM3}y4c@6G^w$7N zZ`Ir~^I-8Y7JI?ib$x`~gA@7fPFak{ErlWCz=yK$D=Vz60L=LD1Ul+`cz#t8DRPAU zOsgsy6MtS^oddd=bqClzv~Mlc-Z%J6`=MTqqlt3G>L!cJCadyd zq>w203yJaxg+!$6sQr+Vm>nKG$w1izc?DaG`VA(z163~cc!Oo^n-5apdQ5pf-0Hkd z-?y~I5sn-aYF3~2wVm%Zw)HRkPCY}9JtTn-Op9Duo}ypg_vcSc@$s+BAjrYh+}$c+ zo8;@FZIcukx6ORo7!`8mN;^PBEi)FEN~^w-32V9z5-2Jy8|?~pDtvV0e#KBep<;-X z9asHO#n9)MSFeuHed-d|%V?p$ocr1Lp{r6m|2v2QNyqk@Dun1o&f;MH+NLwm2Wunw7RUqj=+?C3HwV4K%PAy8h0Cm#NYDyA26qoV zuu&nuiXjg%1$g?ExSDf2@d2AWSIck8(zvg;##6&)BR3@#Ry2ErR^$axvm(cv*5rj$ zhELg%Pg74d!}&eNhurbTNd4w+wMlM(;{}2^AZDO4_@p8Pj?>dCbMk4GIb-7g{^OK- zHFZ&PRZ2KN>w@v5N?28=F^lVt^R&)+HiF*eetk|pp+1L{9p7mvNjp|J4C2xE>~@?T zibtP`kvUtRq#bs>f#-(x1I+!TkZeC9d*QWF`A#r-hm@H;zn+E^Il|1Q4H+U=7D@+D z4fJQ1(9xP!9jh9BUUHc?rOJ3&i7**J?pK546RJT-*>No?&s#9|E?&SuE~4)FR6g&x82>*SpU^y~D3jC|Ul8gk{lO*@enlI4Yf zprhifsyfBWw9L5VRnd&;mtW(MPpEMqWykf4o-K3CE=fr{4YSBxw}k1FSoG`SZKxx( zMA1)TaR-Z@KTZEyswTJ+@&QmA*z=KoQsf8)n}+m{iT@jse)6R>Qe;gMD;9U1jzxr$ zOvpt03X(T%A`+QoU0C;hq(7g4^pmpVx=(UnygwpEMG22p#h8K@Bu9hV9yq?QUqU;x ze_%f@f43I#hoNoQ}s;tgL z6KAE$v#`neNO?X1DJNyeO^%X0u4tYVHg6} z;#@o5B28qSji{)PeCHF8Z&G$#MNgaBL5e+M?6)-eX5vjdXoq9)H*Jl!eeu#A5I=st zF@g)&otKLc%;rj}9Mh!!^k>yZZ^QFF4S6dAX!Vj3sMnD~UQ1ba|E z&!osV5tntHbY;tmysluXT+C{oCHgSZzETnAZ6?C?goTfw7ZVV4Qg+;=$RQcWwE&Uw zfD2j;cfmIvIKwa|q*=F`kMlmk>mSJ6p%5341WOfZMn39`Ttr&`?BC&UF!<%`a=wMJ z1Xvu>An`F=*!>xeZO=8*(Y_hCW|N!WZ$URC7CS!|Vp| zH)p@SGkbUkND|^`JbXT9OjgXGQ`oQ#;xF~Bq?Nt-c$WzB_R8U_JJpfPs22 zOHb_q&o2)kMUL15rj-Ybi9Z(`z0>nU<82^7&q-cnp#Jb((5LR?lMEbe z3;wR)u#i3S!{JN5h;Ei%Ff?Qs255EHUI;r26!&;-hOTho(clDg46hG4zy404ZSTR> z22tksd{PfmqQh1E_3X*RwPwJRgMae`NE5l%s)bq%EKxUC*Hv4uXeDf#Q6w#_n}+j#P^L7gEPhSzg@e!vxWzq>Jg zhu{ytKq~>eYt+6~f&)JAt=}x+sKg9MKf9m7$aka%Qk(6{Be=5F*=A;tYdJdK9kDpD zb_GlwU!Ob!oU1sn()1iVCN9EqpI-<-iX36N6AA%71XfOjOk1tuOx8^aJQxLQL{hOd zYZ9SESrv6SUsCuudoclLCuLtP4~qO45ZRSC6T+_p!geB|LBlQQ^UX%AH%wa+=B`cH zr?+}~5HET4Q0jsdIzm6DA=u=~b(*(HS4kEpUBOGjw=8Ho?#z!ErK^U*SmzR z8UH@e(CVN4-TZGhxR3K-dp%E7=q_C~Sn`{HK?ZQQO`%U-?k za7oiQf>&XF7VYNGKks6SN6Lvwi%0X7j42E@INN|fq1{{^O4v@Bojvvtll=1Dq&Rja z@FO!Cem=w^xX>=$aW-U3-ngpD>zVd}_4|Cl(e(O>K+Givoh`fRRoZ^Bni{J`6LPpT z`MPP-IlXwHm^K}QT)D2wvdi*}rFoq&uBwJrS(PxQo&Bs+Z4xIVXO~|gP)w*0AZ2fq z)L}2_(vyV+yB?OCZ3Aq=D=J0tI&hgE^*e>($^x5WA|08jIcmH&yWEr!f`)qQ0BNip z%xudH%{Wl=JEG)@yp4dvd^$W|OoQjg#GgTtwF`9J3u5=T_Zw~L=DR0YWXWgmT9LGk z_QqOS=Zv?!(qXFvP`;HS?h2U~Bl%??g)b(c@TBaBT2o?2ReS}cjW&NW+z)1w-b&n> z-5=Ci|G(ZbF_nZ)49;8FJeav#SO+#=Zri;YSG{S&AN-+QXKyk4i*4{i+`JeDB^zlw z&}&I_z>~Kh3=B>O+KXvD@MGd9p)T&l@7T_Fi5-K;JgG3>Ztj?n(y_X&mvh2us5iy+ z8IbTYXDX`|6b8g_J;~a-th1tMWIIwSS@?wk#e~8DQg*~@D6!+LhLV2kb|)PWe01u5 zqxE{fVb>6y0=w}-%pW#0*+;KH-3{e2{xkZdoeXfE&ZC!>fe-ShhLOd5?l1Z~-K;^_ z@x8v{uS}?5=X74%5bEaY{X5DxIi)Iq6gt9!CR7D{2&`P@v1k&}usDN`!8&hsXs!2g zS=DJRnY_m!o&P5x9Q6bst{CHC*L z15zPFc5wOthw`7b-3LUX` zPlHg$#Q&G>-E>2EU6h6DSgaKsS}$5Anl#ZHc%H{x##<|G0d+?cLFppaf^%&e(* z8#L<^@zr-m^#239tPk4dA&WHAYZ$~%Y`GxJl6u}WOR7W&&XN)a4HY$KHO&4Js%*=a z0|#6gHcKDXEhnJ5r0j@Ujw8FYSyHn9zgbQ<%Tr)&Qs{`&b{ecru3X5fkxj=LQugp7 zu7MmpW|^u>%h(epGAVsnyPN=Pld>ZQLW+gmH4?|(bJGUj?Bmr|Yo0ThotFkZdC*Y1 zHxdWXr)|Gk-tPw{@L9B~N7wjx4ZQkpYorv8y5XS0oetxc(_mb3WuSk`+oEHlF0`Xm z7eXssm9wPkc!k~CRhS;C^kLj`0*p(_jwsw|RP?0S!5|laO+pW->jd@SbWF0GhDnku zi;|Zz%VSoxTmns)juSJ{v8>M8MvAhOd_)g?OtPGSNs_W7dO(ATN2H-i>7f>Q$OA*{ z=l~jh!hXfSx}C^XncOY=jUgcZ{PyNYb70=PuV#IZJJ7k_V^s9kx?2wXxv?dGd&y^N z6FQ}}m=rof`6ghO9|9}OvJon8I@XG=W?D%TR?EC#U7c2SQq{3`8NEtaX$asLTFYg$*XdX=T|(XSa8of$h|A&>eypp_8NEKu1V_2fG@jO{XA$q|g!C zG_BQ^Tv>6YkFK;}QsrE4Wlh1Frf68xi6n2@sw+pj!Al=eD<>dor0j?`O+wU2X~T~D z!&-Uyt(RXu?Fyw~4+DVB`Px?P+z18u{9Cv4f&T^nv~aZBwa(sN-MpYiB%%ig2_3cY z(7BOI8c1%~eRodV<_@Z(OsTbX)!d*}yQ9LS2%vJr8^5~If*Yu163FiJa9|gQl`IzD z!$3#>cHk{&E9!S_Z*Ug$rpnUNv}_?#!`V=HsV56ihIa~ZND3Wcc+-GGa^<|P(>r4He$7C8QLaH`9K@m9&C7EPO}a70)6$X_)9`6FdN8p^W61)@I& z1b5lioBi@nREtkbtv!cq`*q-w%2w&A@A^5w_TKMmO@A`Xe{k8EZ#&@%*EfOHg1U4% z2v|)60msCj2R00pDy)YQ(`>oE6^q$#_=R6`wyWi3SgXtYO5VK>6N*p0CLkBA;uMGt zpu9TaC7eGsQ+cKjCMlt^F0A-I_E$~7{z%zT#UDrij;OCDui|nJFpyY>kg&t+F90Sc z?d`lsaW?Sjpr`FEimv$A<*XfukhKS_zsQXv@bQYZA+0~xmUZyNeG|A-x&)gPIl@Y& zkr$7Nk2m{cK`s-mnft-IwSK?QB7CXO%J$)MF0ief0mas(DN|(n02G%)owl})J#!)Y ziph863QHN(`Z3}}C@F*6Nh@FP+JY}dQK1JAEB{Km-A>0by~ zWxc+#NNJbuMqjU4em@^te9n>eCn8Mf`NYJe$Pp$qZP53a_=)`AdnWNb)*SL(xQbT> z<$#Qc-XElcZaV1#GY4WGi3}1Bv6(>y%bmT%DPh4+PUgt?N=o*izyQ#%j+l!Ud8n+w;)TyY-h9EIhPkY6rnPpJzRq;~y>p9< zz1Vryrn`B_V!ql>0zkiJr^9y$UB&u=3R|Du8A(bUq5acPNOEPVcqf`vhpSnpH`_L^ znaD-WvNnmcRK=NU!h9!{k3v=xP)JgCRK-TAlaJYKsf)brJP!gK@B^%@=TCUMetG{x zZ)O(l#w(!84m<7=`ikMBW*fiLn%O{_UdID^yH@Q5+%*hU5d&MZO^EMUzWkjAx~3!7 zGQ695^6JyiCZGRwnvz8ssGfQ9jRbc0(}B)v8qi6uESpZWN!hS273+A% zrBX$a$dR0k4|G-&fKF0&RKEj@63R?BM)qbNg8Ak>3M{~3lz?H4J*NJ4ifTOqL|p&? zTKFn$IeE}~zWVSwI>*rqk=jT~tDZmhmlQcdtERO)j)_l*JMU+h4zMl*uyg8w1Ij<4 zHq?=!Gy8g<=U0;`ZK2Y*NJ^F!Rl&IEIIGJ#VO>>cxoCwx0Y*YlAEm7(ptPjys3}l_ zhCJen8K7+Pi0cqyKwW1DI^Ez9+uObox9B(^u>_P_-Y(ZRSGL#iZkpiH&;EV%ayFlT zS)NDNz>~j0dpXnB7+NBK)*-7VD`SX>hgkvUzIOArp9IZ=92|*5fsPJJ^of3l4G98Smmd*^ z5k`FqBuok&Vb;?iVRGdxPDR@3pd*7x6kOyw{K$%&$r=U|6;h;WIJ~ZXNVuK=36rv8 zJ{Kt%F3KRqYz(rQ-7CafqIAoiX5Rg6X4$uft7jM zW@W0~2a$=A@x1L|_IkmRq|8*QW7&FS_Im9js`Ug!m6RRdSSd+c)I+Nd$v=xz|IAdt z-JJEugD5ee^#@qlDI|{u=b90MZWPt^=a<)J2nsa-Zg14daLFgLt=u+^AA2%1%i|2i zM9=pb)ECVk%n+>IGd;NrLs`de-d?*)QKM4Gw-?+xPseuaY1rlj-9D^^LBv_+n0;k?kX%`4m!a(> zXEm@A@-)e`&zzJ@sV=U0-PODZx8>G8##v9mI7!)2zkr4(kEq!srLDj0I3FIRc=8+5wb&1XdmQn%s~qoLhldfgJfcH^ zxj#G9t6N9l2~(x+mVfZ83@)O#n`pJ&*dlgAUp5Sg)5d@^P6pX??Gs61Pm~8dUe@aC z65M!Gkq>p6iwE?jOp<@w&NfdUZZh@J91>QXr zOcSbiN;fAdbcE_n8;?6C{w#0hSEW`ALjNb}8D`#o`%Hg@dM&(7udx0~j@}=1Vv#;J8{noC8@XK*$D0=+>&g^BY?!yP+P8 z_JU3aXX|MUx?|!K=C!TW{c@wc%I0TU4E0V*OADcmrD+&fMa)E72^M>_5Mhh)VdHuN zY)s0IS`67-x?Ie(Qd$q~<}dF;_CsA{cd*#Y?HaOoy^K26wSRm%jA@`RKR+-T_vYuD zAHB)z$YA%Ecg`eU3^U@qBqSs%ca4u@w>C^*xUs)-2P0)}r*!I)LPuEKG~jwnd=kuH zzf-7}{ue+E)H_QoZ7<8Avw$ldHdVEhOnS7vVT<(9>v{ruP0Eg1Bnh!Pi`-?#Mus4e zm%?eK;HUlgeWMn=k!u0-f73)OktCr1M~m~DO%^#lufygGZ?b!4PCfbh9FpnN5l5v=lUcJPC&wLxbf{m z?*j9Oo$)_;NXoRSR~bkcpALK1(_rs0@e|9qjpeGv9lZF~w{Yd&qMO9_Omn8*RBAbo zSp!`VysdNAYk)c3s`%%Coaw&HT`&gBN+RpKM9l7;5xlGq13|;SLU*!g^8(d z=5PnYjK9v7b8GktV1JxUbkGXvml-%7`}-yKdw`BU7+=!=JdTKiWAR~s@ZN6H zIF#Q;L-{RbR3~(n(?UlW)uhq_dgT(zf1&udfZ|`?RazT!(K4+6wY7_3ZOnXaJiWAl zmi@Gg0tj{dXLM`RSHU^~9pSh>p}jVXHAYx&lSZ6#P^2eK7EsmF!58%#Hfwv8^O%6g zadR+i&Rx#PfCYFT)sdH(JYv4o3&DxK%RSf^%c4i*gLzQe^CcD@k8K66qc=%b)qg9m->H1 zTU9Lg*gC_;!hK^o9qFfK$Lers$^GI+YHE96<*nJAKdXKQT*O*`KV!_{#R)@4)P5qs zamFk*z;iabyPv(%`}Y=7=GQ|#r1j18!R?i4?hR*uVWT12)_UMJTGh=KhTg_dqg}Pa z^vu3?of^B`J!N+%5Fyh-M_AsZM(|PbXB5txtid-mpR*y3QLWeHLKqwM>^zA@E48E5 zHe4H9$~z_s$yuB$*{U*^d8)$3mixwbdQk)|8>F$K#ddKE=BL$s)M*-LXWrZa&y%aD z2c6xkpx?1QxiyFM_mB{?kkzc;{pnE7-j(rSu!4cS{`~3=SbHS0W0_m&-T1rZ)|hj%bc$6?=q`Vfm(yX%f(@Txz5V{!&LwzuB94AF zl_l?CkYLvlO2V}}s4`Z2MotnoP_4MdIwLz?dTv|8 za1b|YG%~fBYE&#wUIQDNM?vD~<7}nU?(4IV);%BSYa?07sCYM~zvFWQhOaX4Rq9dXTm zdB4kR?GU1Fmq>$cuAgC%ou9m+H2t~d546M)YCfqqonATSO{H>`vm}!Z<4u|}(G@An zMWtjXyEw~6w%*FuoYRX8XxZ`L;a~suS4FABT>JVqz-VW^ zz`Faj6LrOrF3WT%Lrdt~2{iz;&=G1ksRm$Fd_vWY9VP$F4U~ElajA`<%`=v@5MyU; z#i~*XR%A(2maWKjz!x@y+BbvKk$qZrd;=wU$M<4v3eTtIfBX&;rmPkv6g}LW7C9f9W)wUIg7NV7A9do`*1|!Hdh>C- z!^}}ndQU;U5n%enSm=N|O5!w5i#TG@wLT*8WYI^C)#TlJggTPX zLb@-c#JDadlUT>;m1Ufkz#YOm9&_M1s9BR`Ez9b*NOO_!`u}C`-Jjezl046U1*e^x zCe0WkA~Igtv%PD4h!SliibJX;yE!`>%NIzDP=#8ciWK{=-|)x>!mIGj1dyDbvAg@F zTO`XffGGEj`1sR~W)&Nm2AbuJKr@t`)JeWQpl^wyvs zh}m1@^w_WAF>^`C8Va585}4HteNuevCGhWs`1hNx>DK*-M0bZ2>!R2{P4q`J)GaCo zu7JU#t;n*<)ZO^3Oz73J7G-Ug!Y<` zpAtvLp~wkFFfTGbC4OEcp$!g+*v`7STJPi8#|}kex*qFkq({HsXC94cziOYa>fF~t zWlgvwmU=0QTr~k$>N3x)F%u0?j7$UQaz+3h%8tkMpxCpUo9}+TbYQaB=w9`H$5y3cYYedrJJgDi_M3?pp7OKC)e=iG*Uc-i3YNY(QKaZUiObQuA^_-OJlz ze@es^vA1*AL2KLw(zv#q5!Z&Ylc&X4L-Ut!-cQA|q5SLib$_p}OywIjJz_&~~hfyv~+oC1mNt`=rq{X|rAlTP~%`GhgP-gcC3g z*~=Lrdnh~kK7nlx-ZZzTy-~(m9vm7ekw&*kl|i5DcF@!vO=XSwo#_CONBe&IM}26x zN+J2?Ch5rz!`>@%T)ZZ~Ya&gl% zyUvpmb6dKTcm0X7TVhVwuIY08n_#rNb|%(tTg0Y-tm5n-*B^=9;HD&R`o5_Zq%!+M z&yv2e^9MLX4u8Q>8@fEdK+bBfFe!dvP3Wg!K%)EQoe6_zEBcuwf?C50y`-t*8MW&v zR+_32D4H;CKWV~)oRRPVWvBh5ql3ra{Q7Lna**un+x~8Q7`aL3RogU{uBhR`Y?5>8 z{fO-m!r%3|(f|10q+R|~>k|PQes&jrEOLT=&r4*O67TgpT%-5JO;l?N(e0lqmq{s? zKuOW}p&~76)h(!3x6lQFnya;-Dy_aP$heZG=?HR0Is%lPyj>wd_I7`=`1QAEZ-Azv zC(!Nc*A6*?bkf--edz|2xNbf_39skfhqjk-cOrC$a%7hvL(cN+rWp>5@H(O-uzP1j z`vzw(?zVB@!K<~1Ep=kTSTdNmKS$c`oS$RE&$wLMh4U^ZaPGqyb$8P*O}PvGNX5f< zyH08iXyv}y=W0t$-4`xQHG5N){4Gvu*|Y@wGvgPskN1AgkQ-z94Sp!`KDM^)%cO3(u4>#BOwCHPFX7y zY;R=aM+y`k0?>!)MSX#B?=pyI2%U8M#iOvw{_$|a^i~$#8|&53jgfvT-q-H-G@&T| z@qx@P-uvRuk--haW@w~V+eLABOzdw!Z4rMXS4KCh`|yGLWe?`Jpc>%oEu~*~71s2u zC%qv?S5iz#`qO?9IIoUj!b5E+-EP9M8LgXD0(D4s-`au2!c8BuSSU1Yv1(qkf+_KH zFNoA^VknlrZD+2C6_qi@U;@29&usgHH)mNjbtzX?6b-f7%~dIUDV^})^0+d~QrddL zzSATVH6zIc%1+uh%&H*EZjHRpG8sFQ;d9dSxJ_^0AE%}L4fPIft#fs7u8JTi=;BBR z<4tc|kFK}FVcDILG*VvlHFNzb`G5cQ<-7lftUkU%y2^&)kM-5v)$qpY3WIL$ZsWT2 z3B>JIL_X{kh;{7l-%ua#O1c=E<>JHoL%`bbxoK|eKB&}nc>lakhV(rdoV5oY?E7&u z4yD4|&iNbuGkR_AiN(7`u*le8C|)GW@K>MLb$CO>IgV|P768)AsWpPg_6w`EmS)zVj1G(~QNwmN{MtZK0;mU&}bR@CKq_aK!f z+^87|H&AvwstCoV`zb)tw|8YY+ZM0ic1^tcGIJWi(WTvxi46HM9dRa+0Ho4qk5s@S zCn)s1B$6rdvlO};1-`x!MP2VGY3KSwY=m_|_88ofu8iCZs>BnTYVkbP;!(FdYIaA3 zc;m{PCX=Wc$s|yA@`yu%&)&ZqQ)MJ}Xel52Uy|gXV%7E(%@Mh49WS1$A_Q1cQoro{jA-nlR(LszlWprBTRLN8q{@=O^)jnn#cjd4XzQ!>X>O5JRl53vit{;s@kZo6q8?T3i| zgLVos|EYL2Z~jPS&VRLSbE2+~uMgG&#&}6K0~9*J9Oq>-Oo^X5>OSmKc%uobG}|BftAh(*fX4HT z6KxO;6QmLMg5pI&E3b(D8xg11cHOJSjWf+}P&4uypzOr$eq_lfLDSkaGGLX{qa6AN zkUe~$gQxd32O=+H&Qs6S-7u1viF8c{8B3qq+`{#B`?J-MdDP_xeHZQrPk*DnR{dkb zulu%z=SS-{w<+xr+I#qd<=-A3E{ng^r~zG`m7wNjB}|E*QH|2(b|%RPC*Hu&cdvaB zd(aDNLQg$%!oel26V#-NdQ?@p9WRzuX$pdxk%9naCv0PMki#LV7FY+8K9(O#%1ncj z(|;Rm=Oc}uI(T!sY`SBQiGkF8fa-ASP(s{pA1hD(_%Z~0K8HoxRNe4H`;U~;(@#v_ zUfoaXHA;2-q#eMV+MWg-tQ!c_^Ca+qq((K(3FL~b^Ew6q)8BJ zMiK;+oiGNN0+Ez$oMjH^fxpDD%Jrw>`j$%bwkv$*48}1um`*I{a}okgTRq=1vSTMy zYiqGF+o5pe&_ZYNXwQNxMRl-fwETrvl*z0_>zgQd5{Bg5wgQ1L`zFj=KZtr8;A-TJo z5xKr?^9SMsV{oPHJ~#zN<3A0>=WQ`ayndE<0jvTL96ni9+_c%d^p@DHe?MOMwY_&G z?8h1bitaF?4tE$} z(CG6tE~}exunN1%s4cM!cVVNfXaX=Q*;I91j~DxAX|h2!BiR7TPMo$-td9{SNl0(o z`lBD$*S~kwAXH0vcLU5EJ^GhJ^pw(1dN1jQny|Kipw#%qk91S-8}EGITr2jkuL>H~`K52o zx*KLj_n-5->-uIJ&XZ`k#b&>4<08W+A8r!8r>9GUysi(^qLa^j@8h<+oUZ=My~oAN zMGTb0ZnGbce6p^*d)Tb-i9R)(p$LZeh30S6C*h5{u0Hm^HFD;5H=%C4Ml8{3Q%r^% z5qKY6(sl$2o$x-ImoYLWeo^#tn3>qs^NCieDeJ9kw$Q1>nYRwuk)$%2EwV<)k|Ohs zcOo}cA*5;QQafd2HJ(J0rAZ{&j3g2$JALawlG901Q1mCV`9pt%ZcIn`U2G`28cZe0 zEe;2MZ$Mq!LK+=Ism^IV`2EV8m(PECKiDe>vfSq}~}+H}!wdYp|GSSdbbNcg`X9S3d@mD%5`o>NY`MObg&t$nX~ zOI$c!joV^`uF*liHnO-&a%`Z`2^Kdm$7V|W!lLUwrKaC35qJ39BM~OnbT!t3d{ks+ znee)if=0geLkh>uEKRJ*W+c`?+38E-c;}D_D}&2!iYlgYu8wMdRQf}mHQ7P95gxjX zv?pcDd+jXiw)Tx`PU!Zyr#}p(-N*vaha0&jUY;V8%}bG)5}(d7t7zbsDC*Xko=lC} zSK$`ETW|N&==*82-~8=^%fFYpm>CY5F=`=!TO)hfhe9WimN4||4LYhUB z&B&sGveSkznn;690Etm2I{IB)9ee_Z`&d6WGmR@gX@@``njE)QK&dg5R`Z1%I91!) zxP6Nuy}u-71qz*@`SVg%ro>OLf9}uA@ctLQ`}x1o@TY5#}KMxG0lo!0%)CLCDz$NO)*`T3Wm z{|3Fq+gM@O&X@E*jmCAvb2u9g_oKx={MhYqp*qAF+7N#1+r4m(umRq z^HtVrV;a5E_jUNbHKmC%*^ERPC`(h&fEghXewTW(0FQVz@`z|sZT&y%H29H*p0ODs zhlyN$BgRK$Nsqz6zja)^iofznMGx8d^JS8Wamy$Cj{$JxY05fu|sl4;i&!|PP`bOlc_Th|mS)N&) zXRGl;Ri_y_dPYVLl$|_O$5uVX-w5SjuR0^(uEc1RKd!Iu{#bmti(|CgiYKy`*0!H? z6XAy;!tGD@rb1S7)!eoXLcU$!eA3_ERyY3^Te032S2z1b>wP4fS^^t^9~#>T6q&XW zJufq6O8mUcm?1>a-heCf^t@rmjBzAe5 zr03;^+L^M1muOjiqvDv*);2!vj+~_HX?F|l4;t$E$GRNHzj?HO+;!{OwgVN~1s*sR zTO3(Ddh`DK$4}Z&TH9#n>gw*gKfktJ|2mo_+}{A&u^e5KkhY1>_2H}rhI>iU3luuR zbY~>Jyct>9JL8SZoiN5op=l0YS-NnJ<+^FKG%nNQCDl63F3~fxOQ0;iKtho;VmqEe z0w3|N`Lu36M`dBdx)x=8S{kDI^(W+8fKMNJy6E6YtP8xUXjf_o3{Fj(m+lBk&=;mar)!LtgD++{lwIVQ>f)()@Fv zGw=hCy;&{~*y|Yq`!^#iSH-GsR32U>%VHHSrd2JxtCnK9Qh8q6Y_)9sxYncra6Kac z4rQlm+@atD-2rNY{abbUpJ!8=vAYOrSRFZ6q#?-GAN8Hs`2ipI*r8Y8If2hJE=5dvDoSJ2uXJ;(+vRY zd+i=dd0IC4^{4K9TI_F$;XmLR32>#+_sr!HPdy{z`DSG0%Bw73ZXs0J&`eTQh|+p3 z3RyM2X#6sqP~$3-Miupps3Me|R2f+3-zRB~55R-+$$O^rHa$#O?V>CH@?-B&R!eD- z&RkMR4~0(9nHf>SHzO;nTxX@Ny^wV#sZt^rMcp{zd}B*xYnj^#e@PmE(=!5aPufEwq+UI_ zuEna#vZ^q;spNP;jZOnrdPcws%1-La$f7_$ki?Kg_uG!{yhAE$PzX|rpD6d6ipOFK z-CZ}svbhSsa2kK|`~K0d5;W<6OO9M%E{qzz84=C2t5jW8G$erhsY@;VvNFOdYWymT z!m5emB#o%(84(pIJMBsxSrz=gVRz$@mye=DL@M7EyUmy1 zsAI_DS$GZH4&$TgA1Rm|bOjfV!8OLz1PV>7iJ9mAo)SO3SqOCz-`?zF#}Kz%x@@dt z2>inNs&=bYtwmkPaEZyOOLgYL>#C*}J-RYdj=!l)>e@ClT-#7~T05ard|W$`SmL#N zIG{CVr1s#n@6#vR6r=X2ia8d~pS}I5X=lI2;mJ?mzkl}h#j{_K7GL5ChC(N3@x1cK zDRDT?WVu`_?{X_Mpr`1G;gu=%GQ34Kl|yKs)uJeBCA?p%N;g@xlx|#4Qx~(D;bMle z(|QVP$_7u+D4{|5USSXTl};E><`uUJ`r^e;?~xu}QuYRgrf*PC)T&jvTCTh>vJN+> zypf^^Y9q?h)GJqHX646g!A$BdHZ$DCPBm+s8X9}K?Pt#t_A(! z(VN$AU%&bOG17rce8*7egm=-rVy`K2_%4!ixy+S)`W;YB^o=s(mU&&c0B-@~bhB!L zR;r~?O)digmM+UDR5SHSn;AZ7C_Am1Go8{<{(i)3e|uN2x8XV$E_Uz=cS)fV6golS z=J}oB%6XHQrLMea@=UigO$(V-!meE9s?0Z~9-s4JQopmA;dh3z(~1FWhsO0`V!?w# zd~AvhMfT|n?7IVr{^8$Vq*ZSJ_S5=$-Tn+xnoB&-Q0N4undfe|7)k>7hqHZ!P%c)i?CiOg<8J=e-JDytt#X27%P#7fjx@~_<`O3eouj}pS_VDT> z6NkQIPtw*WPr8iawzpBtqDxam_D_axCFGDK$K+pc>evJNkhobjRIGUjhIBs5ZYXzG z2X;TdYjGE!6BbxsSDU-o*l$QCY1?2z4Zg$=4uww8;CaP<%nFdy`_rLR}3YLyA4eI@iV%j|t+R9r!@CIkq#A;vuX?om1?O_= zJI{0SAtqCMO8l%XE>u=~W_p zQzDEzsdlr#InvcuIWjRV^xQ_L{3%Pgx2Lbd>-?J+;E~4d%w6d|w6}EEy8@D)WoHYQ z(R~CMSNlr?%uc(KDxne2x-6P{P^e+>8Q!Si)3M^c!f_S+ezeM+FJ8WHH4XqUPx{mN zcZXQKZ1dt|*6dRT2}a43rcG!Q8=M36gO*CjGOw&Bi~N)EoqTHu`&hN#v5O9Uxt_`9 zpYi*JhyJ;3Mdc}C))x0OtnE1bj$v8$n{HZbyjp!5w4DmuqN<*`GV^0~kbm}o{Lb5@@$`KbOkgQvTxJiJ!ek$3aM@=ek4q_;epx<{N?Wxo|Wb2PuGG! zC34d5As&ZL5AL7WQ618hLN82>O|v||6E-?TQ{ltgw7acKcA(*y@&3<)2hYIlN;%uLKipe`2<=K@*wdpiD#4NazG)C=QX z_Swv5{hT17L+F7ed~3S_K65d=d`;UTe97FJD>HHG0K1$k@IZyx-C0x^0H$)O|8Y=9 zUPhS0oiuarI5u!+?2!noBlW$Q7s>Z9%|~L2W-k}l$6Nz_Z}?58AOlz4J18a=%Q{`$ zP2qc9nf0-&(7wwz-#QwPU_3;|!-y$Q&jsJc*;qfy`{iC;r57c!9wut+jnB?%# zNXa{Umc19Y-Oxrk+v>F6P+&2v)UY^PoyU8`G~SpfW`LW#O6w;==lBD86bn^8G;%Iez)_R5G$g>tnAlx52B9*x3FO*wRr&ZSbkgJdV>JXn}2|RX^8baEy~AZsd@R z>S3#XvdX&Ip7lW|0nE0(yL+kKw}acD=fmPWyA$b=%*>`qdP2UYIuZWJACu*Hu;RYq z6cLA+wE%3o0AGp!-CInP500d>9RfbrIUta?hO$F%Y6b7m=4Y&%;RcGnww4EwkN4S_ z^uir98|MUv`10iBEx7V{lKIC3LzvpdS`@hs38<@5_ll;2XkdTV3CRAf6x1O|Ws3+afYm%Dtf~sR>^Xmd_cIt?O|PY; zaA95k-05vU8WA9>bE%GFmT$(A8VO3PF=%=9NyCr+8@0yVu6>8=w8v5gmrvc(nd_TZ zEcCEbhO&km&s~CthQ|DCv#B5L5(4Zw3chyRMURi4&Z#7Aos!V!k6KL=0qI|Qw$J^& zeVIpel&5@WlV-tWu9H%xd^KnhBW?BhZ>$)RNiEUzlETLe?VX{sOPy57CqU419A%YRzdl!C{UdXjH)gnXv0krWy}67QZfWC~)tp4( z%xyUbu+2Qn&BAL4Zfz8@PjqhMu<(2|$!T@c->laT?V2B)&zaSa z?vJ)kF*h`$As1P|kdgR?E@Ok&1YGzR(_gnSfZ+0H?V4Yc@mT5cSOp~e^5FD9*MQUO zl#P`1(*en5hQ#w9LIWXwx*6{cck(d+^w=r+AjsIe%#E?}`C<5P)zPTG;-Q30Ci*NR06_CgzGFsVs+vjxufk@ENGOBO%jYhU3o_ zUaST;dblK4kofT}9ZPXTubk@J>A8S=@9)=3xT46}pM66gG&SGt1rdB#rxNeXU60jP z24*~rVHwI_1WyX@ed<`+NVI<%$(qkh=VVDcBs(Qi8f}tL)FUMofSSnm&=sARpY!Dv^R5+2ovyCrcwc z%F^q%ZMznC^0L{|Q+InT2w{*#x;y-n?CsGTlAV<=Vb_vQC;gdB*Gr^r9W6_Z%}KrQ z?}q8%9nB9-D;$IsL_zqf$u`$Z~EVik#Eto(#$@AaCs8Fg`I2ILtl_c<8j$lU#s*%lJ+GRcA>~Z;B*gR+Ie19Qu z3ltWwFbF9u&G5~|IdVY{i>L#&%OP%wo|dYaHu_@x3OCcAkF<3c+OB#s6Qf>AjOXA; z9jO%Tzos-Oz)(2w{bo$^-P`NhE}rER&M)Mu)z|{y2+qsOBP~K|@=Kq_wlM4Va99go zZfp_GnazbUX@iS(*Gb%?qLtabbD_apvGAhyQ(b54b7G_*`$tVVU~!Q>96qWLnyHAK zI6UY{P9e$-;gUU{Llj=ktUkxna6Je)-Fb4;iAQvdvl{r4lQuE7eOLeaj!`6Z=(E0s zWrw)RxBakt&5gv^=X_#0*FyU(<&JSsN9Yr) z`Q?M`CVJdOPAJ-~Q~k=y(GsatRay%5l(wSIhCKo@NAyV(Png?LOEi=a+ekmp8{Enr zVU7yN&Rw<^7O=U9q&pW)T|H`h!BPc%6EKlMhu6o9Y$c*I@g;xg?NpAw7E2vQh`#!o zB{BODT{RQqNE2sXryKV>9z2r|WyqmaIi&MMKbh15CVEbJ>O3K}56g#iScgB2&kbeg zKNAt`aoizk7P3SaLfy_T>CdosII!1Ry0IYiQ;EA-jyaabp6 z%-^I>cSYSehzH2T%2?%rZKAq!iK_}~s%@L8~- zq%>_e!VAQ4Qiz-XjzDN70UnI56nEit6;s0vb$e;^TyvNtyewAW>G5y2?V^}Y|13^L zE1VsHmTw<4XFWw}T4VQiUmtpjKYPSA6a3xXK_e)V+!6)Au2SgD22}sbvnfVH~I7 z7enJgi&L1vLOo}y(9DrmrtWx;gX#>IUSs|sZuu#OxMXPucEu;1&%#}Y`=w{ zi?3fR^d7^vxki6}z7B4{%B)K&eBR_%jI6T0a|_xn(yMF_X{h>`R)eYxkDUwZY4}Pp zRwrMl!Iz}=#^1@*={0kCiQ%t$?wma31A#HQ_OuYB{DEh-k~K(x63Wv!TaTk(X5!H!eg|CCWwX)!r3edMfJfIW9A-}NjkscUBy zIft)4A3EUoq6DsCs+qVMMnwO}dfsSF(|{Q$U)A8Yho-VlvSP&_POkm2kAs8nZnwTg z>e4x5CR=bwL#;wCIXqu!6ProBtCTi5gVS<`X{IE_?s-8nx~=3ka=h1^^{n2BnW5{K z^M!C1qyD!9h>H5!c{9G{XY}|1e6-Z=qa80g{NF#`>Wxp?IZ{0w2({GhD6~*52f*Ge zQ7L?fGH*HhKStqhrBca3+w}UaC(Q7u2}r`(x%X&WHG`ch8aeZ=;ueoUvSvPs*W-_K zAKi3X65wcR&+0`tdJmQ)=1)pFC7Q2oa+K$m!`dG^m>XOgCm_-QTmyEgU(s{%??cbWS#))3Y}N~Iv^V>5 zR>rj0bYl8zL1yQD!jF>%Zf;eKM;XxRqBUIH{^o1cRowBr!qt!JG)Eg2(vIMy{nN1n z8#&_Lx!#e-jcYE`hKfoF#KMLO^rcu?tzQ3fQNv>5Tp5b^j}HIp+*g=#sj-9i7`4eysuAW(E);UB4?7(;*v5ZN_Zv#%^7W2)CXSwvMB@QNB z&(Qz8<53#$yF{A`%jaHaDUgQOW^oMyirooDfyjLrJwmSYUDumTKmv9GTrZxhbtR-u z(r>A~*A?~GH8J_Dv@f}vaH(vz!fCormGPeVhD;g_fQ-(5Zq~w$xM}H}U45j!!wU5! za24ejXI8EIR=3t-FCGNfIQ7^n$iXCe%`M0;a8lheD7nXboiy+=tDmQth~ z?mj9#3^8=8Qd)cK4xU$bm}SD_Z$zWQoafQ82GXzCkG4Q9`L>x87YDiTdUl4El;)+7@VVx|QH zY&#!DBRLK_$Nsqc)=X{l*DzG+(wrHIbD!Jswcc%!ak9TC?Q=f;&fS}24}B2KPM=rZ zR}=M8i}I=fNvf00#0)v$-?xTl+im3xn`9J&UlOZStJ7ni@VHxbgWT%U67 z$izPhu9@Ovt6><&rxDc%^O$z4ZMWb$h@ygWn;|mx4B;9dpntuy7`J|?uBkqe{Kq6lGW{~=R=e&(R*3Ms_W*3nX=*%k_Qv~*{aOFa_Sjlc zc}j<;L#&$iJWHyA@M@2EY3ddU)y0Xo_A(dpubiPbrt99I$DIn##Wr8<>})ZH zv?!56=DmY|fKQ2=7YsnSYGdndJb6mV#d}|BjWcLruz1mjn@Gnc^wl#&@*~I~01{QM zMpExArQFZCU-*WSc&Q!EoyNtqWUam)e3Zc~P)RuA<^r5$BL#In^_p5f7DB(=kF`Aj zAe*)nZYQFO<=wKM?SCZHO6}UW0HCWPzH27GkQGI}yl+Y5mIGcHz?1z z{HNrdp8(yp`^=W#gTn>wE5ST;9i4{r$9}Usu5LWVyr{{Pkk<$5sqTeCXVDK2H+N?k zWBTpdtyC2bb%)u5hvPLhbGz;oMDU@b{y(EjJ+iUuDgK^V$9nm+ZDn(62hM_X6TES zlr@H5^x1#vf;KPSQrc~`420z*M!pDJFLvi30lYMtWKC!6Ey|`gLO;2Yul+Im%#(Fk z7Zg#3$$=`3O@3ZuQ(e_`qHl`3060X6!)>x?l6u|&`>vL3EY!#viE9hoVLT5mW^cJm)hlQDZ75aQd(@imMPbe5zG!LHWSQT(*nk5SO^V* zC?_UWC|>YD=-#buAzNxCsD807<#2=s-TcoXvHf74V4QBrejtfk-UcBK)57gJaaJgkw=(Yc zz}AGLx4z=D3MN>|WrJc4J!f+?mYfUf#|Q=owIVTh!R!kQ#kZOG@xUa=CrlpCQ{Kkm z**65`nP~Ot#Wiz3q<)}%_2H@>6>iU|gVvfa{|?cu`LiKY6qblfg-zc+IaGj?KwLks zjM+&%f+)I0=aEVZc3A6%wM6mSi6pax1_B;H@oxG|s1?@v4f<+T6%<7`i7c*>x zYE8~%Kg4zWm}oNbv4DNCV*#tez5vp=M|TJnh~9%_g&bazbo_CUy4lfOqcZ0&IM~3ws1S- zoG01$dmInZ)+e^be2My(6FEkbw46t*Znv9FE)b?1p2WgW2fSoBasKnfx*Vts*4fli(swD`Y+ZiKRST8uHpzao;Y zlq@w++4WlbUe&M-o#mwn;LvTcKLaZ|FY-vKQ$h9KRNKC|+WEx{A>|y8e)_VwuK2h( zzW+MvO%~{oMF1xF;fP^!hG#X??dLGNxfwHcpFg&#FVWe(P!q5@&Y4DH`h&5Q?^6MN zeo-Q$Ow^U^ri6Z&K&3j@n8QKg3l1FiE%q*1;NOkIg2gUceTkN^E9bS#Fr|07Hw(j) z&V|Y)g~_}BV(G^65O2pzfn0Bu@w=3is(kOR_2*YyN2N+5S@vVp*edyB(~R9{EqB3w z1m0w2HD72FXnhWwj4njqv9SA)iN6d8iH~Qd*J)koN6(Y{3w>%{?&8JWhBkvj)*knz zy4x);Q!Pr*Wu-SWhINw~M|&V!D%0jXj?E$@gsTo7gKk}8%41mfcWzku)>3b+&Y*D1 z(T~&zH}4uOOL|PX`;!~r8xUR*wn{|x^}!V6mGUePal-U9l%zWT zi4Ja`nKDW6{TaDeQqssbpr+Cv&;4=Sj!NyixwU6alolaF)k8FIC4mqc`>MnEt%wRf z8(z({R1{cxDU^!%%BKC2cg-v1=GtzlkmAPX_59{5%BcaUdt0|)22(60qr%M}p-E`A zV`H0H5(-*bSu zrj2Kka*S0^kDTkAHr3-*NWYV5UJXNCsS8yQ#$feTP0%PYcPI=RK}Nlzln4e zF8|+&V8o==*jH2=0lY8o?_Ha+3>sC^gv!Hv!$AhZTCMpNN+%lujtohm<@-OCbYHgh zh<%vvE!(BlcWaLAQ)ab(Pv2W_TXtGtm!nQhoIx_wI@)(6mhTL4yCfKrUqXwel!5dr z>n*rJT%c{3l{=PnWN+u3s#mTSpJE;>^zZMc)&*gsBqw`qZ4_Xhr~>~rwam4xNx#1? zbD-334v4d%Hn9Rj!nJiG>^EXIs(Hs$prOfw4`n+tSfpz;7pGs-Qwt$`wn9L=2a!SC}vN)PIoq`1ibuJ~6!kiDp6T zcTYLGG~N-dPNA*=LzSK`r`#OxdDcnm*m$<}-dtuBt*@tW&7n(Zdu@V6*1nBq)brw3 z+@f3GoezG5L2u0#kA;Zl4mx^EXELupc=n(lv48^caQdp(qjB^&H8)YqGl`>n84niu z^>{vdT9l8MG~~p;SFBYHthe#rY??h#Jz$CM|F&RJ4mv0aTSXX|sC#vqD@JzM+PX+s zhp*!ChO+zY&ibj5Hw4>!zpq4S@T&>d%@uq1!cPpS)xD%gZgM}+=}LH0yYF{I3tnw> zGz7eqc?K2k3-_EOX6Xww8a%B`w|tr|xn7shIc<5I?sW|Q0?F`61w8yV#+dQD-+nN^ zFEeM-UtozWY5N|4^^>uVG5wEB{^zfl2jm(z1sSiA;wu$uT!gC&q zWkPuACSmRH&(9ya7o#$k+SP)wROh<0hK%R&FnG#suG~1ij=PQ;I!-^we^Gv!Q`%;w zvkX1ciGO8tkXjM=V%I)U_#}kdfHEX9$KjH+TsJ7yeY;e)O!c_iOCq7mjEiu_a^_1? z(tA**l1UQR%*GH(wWhOnbbr`nkl`W1=N2Mcx;8y&vnf@Q_j;$FWn@N8!eglsqj6Z}?aY7i0a_W^ALPQ~{l0M3G= zK&CzEc)2VU@O{^;Wp)WM)+_h4I<0hU;C)zgY1C_~=S|TV**^bJ7$XfsSbzRakrD>3 z7|)nP7>E49kUL~0rC?C8os6P0o2&a+v3DK7boj%S;T2zJpJ}hk*&uN8N%K%qT9ai! zfwJQ&an@2osbhT_AEU0NQBuE3^M-Qu?kOtTFNcWl4!ar%V{`vB$)&~35yNLp6mgh`nb?1p z=PG0SEgN&oa(HGKJyRRZPyOfw9GHt<1EW{7r)->AznN8;;>ap{@fl*U0qr{fJJunE zg_Jndc~2$0NuVwq2v~b29krVAljv%|q?}~`V|W}DYveWBBAKM?Z4Kzn6MhxiCH}fy z%j0u}a!0;6k5gUuDHpG*jj^6YUN3_#=N_ZOK4+CFg=rl=)GV;UI1>?8de&s^+g?`_ zmGLwxD1n?UW4411s?D|bu4O_(3APKA+X5jNo8;c~w^;4ZPdCP+hbV99kt$o6U=K#i!o^FznCWR+=G=Oq0 z$YYTyP#4V{?sVo&HT|SFC%(@*{#2{;^;-;KosW7QNu_M9LrFd+P1??yPabm-u_-P2 zhNGUENjh{Qo|SRRyfO{{D6l4O5sy~o2=D3YpgLx-QgYJ(r=pW*|2wF4KH|XoG9L1%v>d_@;@&5@wg;wtB-7z-=(Bqz*SvE#dXRYn-9)r^%dCWs49xtje>K-px z(m!172J<-TeD9jT=Y0BfRc?UqIr*XdU04Qe1Eu38ICb{1pm@<-XSL&Hkq}dp~ZwPWrk{d6ZyEp#JAt`@Y@Gc-VQma6+`CYWc_>XC96mW<*gnyt6cB< zP$djp1RF@64s1PidMIv&T-tfgiimf$D8ExGj>KD_2zpAg$E*)3%D zr;eFfS3>of3=R5GEO%4F)1B5WZ*u0=c;;hOEU1`_tDdJ65mW51;vVNV2$l2On>(Tr zU;gx(AdmkpIuwBNd|?31hPiqiqkxU21Y5(_IyZ4P{w-q~PH+!6yelYNedB_uFnM}5 zDypo8Es|k~OvwbWn-~a{Oblti>{r_Ca_RO6b8)z5>wC_%kSrZ$Q%o)#?`Ph;_H+9^ zkqZZ{Y*RY1^QJ7lb@yL!$?s?_WPC_*(SXeqEU&6LIOR2+Haj=?*7lqj0(4#X-v zUr0o)lGNX@)jH3myD+O&oK7E5T=cvkhxy4(E39w7<@#2c)4Q%dJi)?RXEek{e8FPL zKW0<9@FS7e#7HWJC8R!|;Fmb2#0d>m2-M_^Mk+_gWg@EZ_&{5^4>^(VmF)*r1-^W^ zmB8Jc%Lxd61iK3wgbfgj(|ef#zLF8NLwMjrjR`rDsA4ClCH*a2Btn^K^RStgmL;N1 z*>-3$g zKp$@&GykNq6y@~+^V4PPyr6D#KZBA+K9T#DWek66cn<4qlEk)^;9|$xFi^>%#jM+lHAF3+7{bPFr{Z;cLdAOhbkA1s$oiHU)?^UEjJ< zZSw-2lBcU!{kxa3;>`Mt^dS`9>vn&s7Aul^d>v;fWB1qaU5=47m>@qyhh?7mGI~tW z(bj6ejK!eJlD$DPd5b4&iV}+-6G`zo1@*NV4KiSJ`t#(IQ;?z(9ND`VeMn+P@Z%aD z)SYS-2C_7;5_7fI`?cim;Qg=;l~0GG!)&nfhu)L-83v}Zgty;S-ggn$Zz!f7XD&)3 z>*YJ9p3M-W;kE~fTfDv+mk5h$M^(QZdUs~8PeWa?3?)WIP8dfn{*3<N`r1tMlkR?9v69D# zf(+faI@><+{EA-t3~5`{_li=Pu>IaWm19yTu@-ZNFnY&KBsewg$g?iHV-4 zoZ4+q!-oOZ_j7h_bRo-6U(TI`kLqxs;lIoH2d5vJU{1t@7#AQ+p_Yhc+f5rLc^d?C ztVZd4-9Ps|L(X?Mm@em>~$5i z1^bfTPq|NdnlEA_j>F?}^AM!Q2GaKzYb&smNfgn|75?I$Ic$Hpbqk#bgC#1tPHanOkzwuX8dUY;ihzgpSZ7mqM5>yoL#wV zaaJ!E|7uW1j!EmHcMGL5AM1H%W_9m6&6ZmCkFaC&vu?8-YxZhiSOL@2q!hXwR1s9$fc&3J-2vEI}P%&}4{E`{Y$~ z4+&Rr;G2#B$oOr}s*1d=PX%7(j;mU#ouMLLsz#Hys-{9oPoyh)@lX`bsOQNNNPkCX zpsb)7foQLrNS`=ZnTXgqCmVYKpNgAP6;`iCCN9=^FDRq>+Wz>G5?s;oYaqxT8z*}l zgF%>u8>M0yA%n`AGww$ah!;<%j!cmHJ0u`vgCTR?x(Dpj#K>IaoV-zB_Hh}22LCLklD5u9=N&>F^Y*j+g=f`bnq4WkrrKrpp!ZhLD zojh+}hsuDWup73Zi9L5)!M=A~;OPmY4`8hh70bS_(vlbrsaKshFqY>k6>VxwxdGA!?m(w-< z&ckw#v3d@e|5a6Te_=Bx`pRD|YeD z4cYpmqB6c*X$EL`67u7LZpd~`_DamAC@+L_!H z^nDRonjmdqbev9_RZ-bzJ;zfZ$qb?M>sEo3vTcdDwZUe_e0r}p@xxfzPNI(<8v!o2 z%6r=M2k%!hEI71ALf!-X!0}`KI*UU{H=rqT^_6sb2?{H8y5RjS=DGVL1N=S4)>3pK zuxpXzy<1`N&Bu1rmbEU}5aI4*^Fu>*4-nPKGK#6uP_LcXr`|RH!}3Qfkr0bU*IYYm z!dZjk2B#=PWNir<^i0Pohq!4`Y#bC3vZ6OcEs&B{J(Sr@UWYHEAFUgbQ&qe@~+lPOITC{5A4|RBS=o zi%jRLsa+&g-aucGrcDmR?OH@dUJ0-1_b+#mY>TTu+h|#T2Zb6V1@AazC^&8mPa+ZByA~Gp_aYZntNFRV4wV<|l1Owktkvh7NwSX#dL2 zsMFpZyI23ZKs9OVaRL0~6@%Q`J(_At_X~y@82^wF%@@Rql98u?B~|1P(mX{s27lfi z*OIjZr!16XzblQZ#fd+RU%$<6_K_LQqaIUGipJ`T_?AsLZIsbL3al}Z(QbnSoYyjx zc3bfahL6~Wh?;}@X5L+qn6cjjZq(X>qt_(jp&pGBCmt+d)zC&l21w`}DX=j}aM9Wa zEE*{2{(O8}=P0vg(;nuHZy)|s!&sMAxe~(FZG~-8sJ3oh$r`J952?Sscq}OTkNu|b zNVb&kxRAir2I#7WsL3@}7Lgf=0^m%+@h#&7_$0({)Mn9VHHkvHAB~&L_j9bl8-K9a zD)5U>cv9E+0o#Tg(r`iwUiOe~J-N7*cbC>(XAAttTY)5c-DVee40|)w!%vA-xi6c~ zl()CSTFEvTVp?Qt$(U6Do)Ek%eU>0X09Sqc{FgVjuy|!i-1K^EMG}C>*Z(CP8hh&OL zPg3xvJ%8DIt#*_9f+S~2XMPUBG8Y8kAAm2?!m!s3z$(-Y>zWC)Gl|>jo84?Ao%=cc zkUV1N12l-kyYzrT>+bR@d=RGb>*{LVBTT8`NOh4_Mnr}g;ts&^b;cP}gcZvk6{xpt zMVWQ@64~*e67=>=Ed~-;OKAC=-1o`k6@UN^TBB0xIRd(~h6Sa%!WCayYkA z70N$kxCgBg0@mA$*t80VpqyaIjWVo}JMErkbv?*H|J#D<{vdk192XJDsQgM0!3XmZ zfjK(eX1FWHxrd@;Jc*kUvxID9_V6z@kiyDrv6bqWT_n)oa^59QOxourp(hb1*NsGp zUQ{crAfcQzynCji=Sln$R|19qTCv7BcM8~`jms&*V*K{%1+8D%;28vs&nXP(tP&u} z=YS+ReIvK8)1M#Gr+aCra4B7ew!iRcUhvi=a!QrNR$V`&HV07ZgkL)^0J&y-6dlC{ zr_JR2(WC#ih;HJw`%S<+M@6bAW9>y?%@hNq;T;k9C%Cn}fHLZ+LhknVmc8BwBLz7g zso<{|ZPW5q@lLbQ+F%>I%uf$-bCYyB>zm47Rid}#ebFuqv&9E0V|HFZ?`V0Jt}tkW zHnN2Y-nLxJpM8KAnLKT-JrGg7HS>_j?!g#j8)L-OIELx|NTXhhRN_;*W6=Fbr{f>X znPR&BJjGq&3cHdHSl=hsw&f_U16FWoabY}b%WA(sx)<^FtG(Z}8H&J8HTm#GKv#lC zW8&*E$tGn!M$Akd{8~0T`rI^S|7pS!GgmQSswYo7!U!bz?y@wKQl-iy#KEz&wa-u` zNyvEc)Z3h_1F&V;z`oV)v`9}#otv){?na9`eYditlO<6_dvkH@<`DmK}l zj1X*&zg#3)TiNTPCy3)}d6of@lYYo{4-zH<^lH$2DcwRY*)FR6I~U^w@m^*TnVCzN zAD~Hn0-%37@D0OW`-PryBpoBI#PHnipqnITcbQ2-yU*x`%0u7uieTj4br=s8w{r(zfK@md)eI!emg+leJ) z@VS&}11r-TD?rO)Bg*aqv_o5;RFO?YV=FZ*H0Vl7by{uve<@p)DjdMBQv}$L4$<~W zXJ)XbtY=bFzm5*M1cUSh+^-*@{ox8^5ya_2AsjCJD8PBV85}eADMvU7@nb~5;FE4ML&8Tjt&q2s-AjL_k*DJI z!uTq!Riw-H1dmZUidp7|PtkyN%>(Ze2{!GDvmP(El1&$J>j~3BWS#}T_0iHjO3Gub z{A4I>n>qpuebHa2Gvr$LSd8mJ_mACHLb+8E|A#!)iC?7lJ(oizxkm~@}spb-f*%`Lp+G)sXkM=lAPJ|fV_uG`F{^IXh?arar}d&rG=yh&OT$su9L}`0dA*o*sxrdrUjxWGfNoR9Va_d1wfM<`&qC z+MTUmO_8u{usT(SpRXmV+E|UtVR{EuzaRm;2K=_&3fBhJdFhYX%w^@tTDEFln&|O; zRd>Q)k#sltu>OkcN?zwz!rg1|Wku){{M+Z!jA((=EH#+oM(IZ9ACh-tzsh!9dEW}$ z#(KVPc6C?$dNV)72V3(3O-Ryllt(&ecu-adK&R5>U>mQzTV?9;1y3n$0`yuC8B-^x zpA(bboljwg(nRAKd2_yne8m#F5%Am=iy@46%)p}tDxzh|d7ZxEqH9u>oQof8( zNw{49ixl4j4x<@8!g&F@eA-&^)fDWPPaN{cch>*(45-DOCFhU-sv)vz+8n6Gs(l)< zk$)mR6k#`#MNiugUNwmFth3OOj5R73${N?OFnWqgI{8=l-|-PrW5kK=qPbvz{TRnb~8ck#?TJOOe(n+#@ zFpk->Sxg}%1WG?9S$=T;%exqw0r}yqPs!o&dZ5lBXJJ@EkojyS+G2BS;uAj$`Ev~b z`kgG8_=J^Os#_AX>$hW0iXTkv(*;^oI zWbx{G2=h$u9@0`BbB_op$F_ zT%l9S$be3$MPw_FEnFnlg2wf5*t_s_N^BKBo=5b}4%$9Ij!19ePz1=c{*ea;__bIB zw(>{<%?G5-b(Lk*Rb;bAa z-I@S;I6x0?bh2my=im7}`?&F+y@z94%%M~X=$c@3z>@#VoJ zQVe1d`R&bbhj>>Gk!j}(G(Jy==dK@($3Rz*?hc%+Z|n!y)y??NNH}&U@L6Qe7RG

s(VHkwqfU@n6z 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�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 RNAM;Aj9^ufyY$EK{{X+Odx-!5 diff --git a/spreadsheet/macrofree/waf_checklist.en.xlsx b/spreadsheet/macrofree/waf_checklist.en.xlsx index 4b9d773dbb8fdf50d4646a54d3c474e0172c3707..f16e9f398da5ce8870b96b674a97e45e9aa12913 100644 GIT binary patch literal 201186 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�C~ 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 MReXZ|_HO|HALN6}r~m)} literal 176673 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.Kl$B!kmK_jPN95i+}Z+S6#DJ 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 NFoJeP(NgpP_&*%L-XH(~ diff --git a/spreadsheet/macrofree/waf_checklist.es.xlsx b/spreadsheet/macrofree/waf_checklist.es.xlsx index 7455b1500027ffd8233bb145c211bf4d1be8f16a..24948fa3061882b53837a74aab0f3f18e91b42a3 100644 GIT binary patch delta 162912 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∈pTlno50uOQn9)hIh^i+!rBq+g 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�Q(-U1g55SM3XI+Yr3*E)nA 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 delta 156792 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 delta 60517 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 R;w8I?fGD6z2tGPP{145;((eEO diff --git a/spreadsheet/macrofree/waf_checklist.ko.xlsx b/spreadsheet/macrofree/waf_checklist.ko.xlsx index 040d312d0bbbb6a98e49319f9f5511b12f2eb711..1b8df19e7f1682a80e0beeffc03030890e17fef4 100644 GIT binary patch delta 146664 zcmY&gyKA0;ZVlMLef0 zNI*C-YWY~QJZrx}`|}=>`*UjP82Wo#AgDS_Y8NF#27}E+&6yrQzg^Y@9W}35K#osi zKD`>lywSsajoBIQ54P%g&PR0IkTUdPZzI26ghsN=7pnNovrZ)YiXfrkc5G*B)P?)G zY1IGEOEpL@dtamc&YE}`7rU6|SiiRqiaec%$Bf~>4!|Jc&x>%9m zrUD;|%j()HC-Q`m#<>a+~dn0CH2Ko9G-(9sF;q}ED zS!3hOikQ|Z)wCTpEepRj!E1c+K z()NJu0d>7UiIJB!1p@Bw${dEEDaZPwCbmNHqrI}>Dxu3Luy!S@w@dWS;(o($R<*)a zg{ZfV?-+ij;^DQ((z@43(py#2ApSU*cUr26q3(cnc0NZy37a=U4rw%9jeJd7vNW1j zHC3-2MyyI#9W;7^Ind;mQDj59hz>K@jR&ah&3=U-XF=m;v0GgtYwvByQTsU&|IfkL zLXW0u-D0kXq`S~6x9w_RnZT`XMpcFOiG(+|t#;>3=}zfa(WRf9{O5|A=6$vZbMfVL z2VKqWbz>9R(F1(m2=8u*HO+G@l9DauGlad^>%$n*UAjVg9Z6<)Z3O#e-4% z)zw-@V>?|evvEUCQYvpkWh)cHnow5Pvt^d*>0TxI_)5L6mef$4t=y5ecJGPrt?jEz zyLv4Po9(F#m~vLOYdL8Q*i=GrvQ$7(3;SACP#L*eqWi}3s+I+9>W|YAV*kD_@?#SQ zI?>o}(ROiKbg7K^jIFrcSq7O2x{5Q7ul=x3KOaL0zT|O%$wo}gLrL}6^gk})s_B64 zot!P#__3y6ozLWH^YqaAVH-Kj(AgU=_GYEg@u$1rX{Q*yq=;Rnl9&)YBmfkY6*%~Q zE*`t3lj2Pj|2Bh{waai%OH~pNm5W_W#+=T&hn(y*=iomQP=96{O*ggO36mm#-{bn! z^iXM6dRMZmbSkv`a6cG6xyu|q%4|y+cXwzQZ$7HpIF5C;2rev?gYIdrM(*qkt6r`f zyMLAA#28i@u6<#4n6)&@x(C4ST0i8~l-yz+LuZ6#q~KMvF408!h%YQ-Ycy(P#o4B( zJ|$67$`!>Vl!TP}BgH02s^F_;{b&0gO|Xm4)&OqY2;8KW7r|Ma{1>X}a{0rqwB~cS zR|jvJNq|5wCK8>zljB=fL&Ku}yt{gH<8tekWrBGTXJ_Djes4w$IikFb;ax?{$adRS z_93`;hiZK$II_P&)!hBcEBkiI>}dY}4*YGqyyX7;vl(i)efnYcl1bKuMD;xc3fXG7 ze1$-i9kv+5P4*>9O?BztgZyWP*nhV#7gP?emQ{&Elg6jc*$&$jt_-pggGUzugh$JLUAoAi8;XHXhr~{vb7bSVUcm@@rFtU@Zl* z>vaa{9Y({#kus6yj7FmL7xDGM&dnxvXm}9$UP0d__74U+vh4_72Q>wL$rcRSZcjB+ zrQL6#x{VA;%XrMllTHj^O;V(-)}n9#<`Oo9b+8uJ|K$n%{V23#FVS?F;9IzZLT`dI zl#7_!ALS0^sOAggg!2@=HvNG=*IJZEYYoaqZB>lL|YDvrE=A{-xBGu zM$)e;b)hj^=kwv~3^Z^vMt^RXZY7VQk$bb#!V9Ku z&IV{9jzgHp?DSF&@E3EYYiZhH)^^1b&IIgor;d5N!kl~8r!?fAsnnt~rUkfUIZ?cGnS-~KbnsR|5@fDOt7 zcSOyq25&DR<0wBYQET)CPJXzJyD}l z)n-pZ&#($zOeU#G*3WGBsR-kup8oSXW};=m;L{B>jK$5PB$Gr)fHS}TF_*T!ymEc3 zA$odyIDPnHEIin5%xCZZaCF%lxbi7)zdG4F0k}_Ynolpp-8BHJ$(ob&?NuQ)1!ni@ zGu%<&?z~&%GP_YEJ^f%Y`7nDZbD-VNY_^hn7Vx`kyO}I?RQ8qmt%oRzyTyJ!P}l#1s~^2G#ya$~1DZdWy!Sqn;7&_D_bh2?=*DmiX$8 zp}%~fPRVVLG@@c}r$>C8Zu6ZxDPOPdNPr-zDQMr zCev2v6%b!kubkARj7Q|@P>OabacouM#d^jL06YpMd}6{|ATRu9nDzB3GEcHxoMNyw z1w_p+3anC%JwEJF{n0#rdB>BGO(-4@dCM)KMRj7$4Qe+r!joxT%@)ecBFYGrq{{v3 z*W!=rvCsg@fow)a;DcY{TP%vtn7q-+ksXbrxoc}(S((Un3YxXDUkNy7C_ZceZ7PxIg*ku{ARt8rxc)Rbq-KRzIHV{4a-B9+$ z=OoLHYkNGgraYnZ{j1#Xy6kcf-@@qAL@E`3pbIrDdkPsD*C4caudtK`s&$-ai= zti(Dl8{mhsFIgxg{;Z)7(Py;wrF!}7@775QGn zM!344G(A=a)$XT;<2_T86J+~z!JIyw-tykU_KvG{^g3m-ac|C=2DI!Jr5-?yzqoXv zpY>`P1ungQh)S10r@_kT3umQm)?;qvcOyt?Jdn_Zr4y1HIx{pS@he)omziZjO$aR; z_a{Jjv`n%|+lr*d=8QzpyUfG!OXUk&2FYYfbkh8hVQK3r-{e-53?;84AYB7E%VdOC;> ziabo}h1m7Ph!6R5(rjLo2D`>82`CZH!qrf!?Q6&~*mf+(g1@n$omFiK--v)evRD1X zdOW`!!s#j$El7J7E#NOU-|XA~m!WU2#!$JPxJz0C#t0$2??k@f1c{gAa8irqIFVV= zNe&Ezbu}{JfmISD^$fziqdq^Yh3ynDuMu(cfK%F8osVl6?(ao8)a9EG>>-Em7UqAJ zw)My>=sy_jmqPlPCM=*zSkM`P*KEvCg(b#%D5CmE*OzzzwYpxVG98phaf^6TU zw9%vLo0HV!RQ=L>SbE(iA8vaCf!kuM6jO_7s!Q&zrSgoQ^H)tQ@kmfs6Mf&nwzL^2 z{DE)*JoX|0pjz5bY0=QA3#44~lFCYMNEftw`^PhIp=Z2|uf}7rnM?QW^>`UR-)MS6 zh3y@4k!|{VLFpHIWP@Q>IdzMx1{|${v`qWT-ZbLXncK2?ulo;XLz$V?t5C1ip!1`4 z?)!#p>WQqKoO7kz5LJc{8_b)$v{yBJ!%_qEu{CVdKrIRH-HEOJ`r2b>5fFLbZ3t+XP$^ zYjfuiNN!*#4f}Ydb?-FkIomWXiSKli^aPXB;})X})tHW1p%mNQO)9;eonz-|-s@gO zpgooU8>_2+$9>NXXM6TvHR9^s)(Ux@z7FNvKABYwrL&Bq4%mr6kL`~r%9EB%Qp@l2 zR5_{rqKS4joBdn^AoD@_>eJdsW}WbmGj}SHA8#GT*85XEG9V5pFKM=S*SpatNrslG zz4!j;TjUmR`%DwFreR$Jk>Nnxr~d1cvcVC(S&HoQ@#Y1Jcu0b_((7PMhpg|9)5wOi zuD)*ndb;At(?b=Y#AwelpB6K^eA(k-&!q&;(sP`2s<2I^;_5KzVhoM$eg}GzXQA=4 z)OgFdRP)A%F{{4&lH+nxS#8!mP%0t(^O2=31CTw{#%E-8f#*}u`z6dKqrLWxwsO#u z)FLtb<$OV{WO#6kFb=V2tW9WQIw0pyZ2I$(cnI7}FRhpmu}vYZEDft*l~V#5qfkq3 znJ6WsU5jXVa|Qm-Ev~$N{Pk%hqq9zP9b=Py+^Eb7F)#LXe~peJ^k*h(OadX;)vmlG zxH2J2rZ{@*##FRIO*Z!{C}DEm@LY@T)b7V29m5Wni$bl!^M>uq`RqpzJUDdQ25odzQC#-r`_Kx27WV2_!O-e`4e-JZ83sF)3o1o>PSYM!j@Z@HI)QCTogPz@edxp&cXLrz`eus@@*c)U{skj>{dJ4T z`h{^iqCS(pPVaFYis6%}=jL8zl>X+Qvv(xA0Q2+$nT9N}9F~KR&OAIcr)hMU+YvO^ zZ`rFZP&;rkn#N$c{aA*S53T-`M4#Q9YvRW8PIxj%rr?fcrVVH(oK^H=<}`uo*bO9M zyNG7$+;aYj-@PgDjoa?V1EjO}j;plo!zzFLw&dX+X*0E^qRQy#Ls`JkCs1mF=TIIx zV>OUhL>n85CE6}S*qYG<1$BMAwg* zJ##Iqj~IN_MpI~$LjyDWl1b?dm5b;;mhZ5mI>}K!h1a%E+)Px1!IXR>nE}5+0HtmO z+~iCw_)fUZjjA_Evx0hKZnxCB0oY@YpnBupdaGX^BiYwfpy>zT5~Y1N^Uy_mArq1kZaJ>l*=>^gt@P$o*Q=eyc3&^! zn#h)wT@T?BS|n*zed|c(QmK)Ii&2eP&N68SU|x!DUD+KT zs6yp-uwLVU4%bshy>gz4=4QO@)(!PF$P#GfZ{H(KGtP6iYN{XWy@j+*G;H2%Nv)2z z*Rw^Y%a@&$wJR>e$hEJCR&ocl?`sph`DuTPBay0WC(eB|e8Ih}U-`kdPtMzYMdvuH zWYmjqI{M;vy7VLx0(oBsAe^+AX?Ba2D2X|(s6@nvVTetpBqT~|b{`Z)87RPY4re|y zBbywbnL>Tq{NxjuIQA^NxaD5!E;GnhUKz*<#2X`_jVtKXZ*TGhO6xmMFf29yLSZ8{ zXv@EP!OdzStTF2r_!kD4!eI&sAXck4pQ@SE1`+^zGU*C<$1bb5+0^&wGPLDR-C(3x z*YzHnXDNi=6~!7>ZWeJ`N5~Z-5PALDacufi^=oRvA6Gvlui?&qTp|zUHCQ1vt8+JY z*y62C`LsPmSNVMnn`$6g8jT;Y_l+y`v?tR}8aWrL<3t?_O!evd_F|c-ihMdS8c?D; z;%0h}&`G2YO{Nc6nsL?nmxLSFDN`6=W7B(4C`+}JH8NspHaO9F<)pN5y||eNYUiV{ z8G_?Y*p^V9Q(4bu577rK{b7_X>-o@lJch{vZB^te zh#nB=BwJg>8Pd^HqXgNrm+Q@+sK7s%kHPP=+o4OzW@nf8Tj0s%Q7;%l0l!;|$Blu9 z#bJ*#qXy5YOrb5Ram9ETDf_p_!~^@Yy-g1X7e$P%l>}PA-WMURj~*WiLb*f|wh>yB z0gs|gE^c%EZO*wWDz6{SGuyI|6aDHPprraPS^rWY+Vj;n!7BZr=sDjuNRwI9qoe*_ zlxzibcpIoy)oZqWI4eXYsV-~=D!EXz1UIKAE1KONl)J%&!O7|MW9LPITxV0xCoWf2 zhLhXJBO-v8z~1S>Jf*)pimxJf{3=kBeU#+8w8HcHM?3HB5jY5C^^RbR4Q#2h>sd7t zDtYR^St~24Ii)&moY~C*Pc0F3H~*}NOq^WqZG1R|(kr)0mAl;9dVJzd##Dp4zGy=@ z;Z46Ck@6WD9gJv7gsR@X|0&RYKz{H5yxCPV7HneYxfntp29FV*x#oXrO5knv_Cz=y zWgC%~M=|H#+&thKvFtZ0_>~3fTBqnebUPN&GkRR7;2YPoDCk}Gzh`LpVT+fxcY!xn?R`@{nY6L~H|FS>JFSU@pUCgWKM{EP?VA{=V4>f zAl}Fxh%f624sKV*{$|O5KRNbGVE*P!KA#gV@Zh+hv6Vb=<>ceVJB=d!$HjI%zy`YB zyZ`7@lBw@Ef$IP~*jJ{#$!ETWKUYt#AIq@g5^-{|o4NYq>Kw4G!_{JR$?qR=%4f() zZOM31%^L})SRF?Z>p2|HH(E+q!O`t__FtxtX*Gs|OH&{J$@E5-9NU#XYu4+R!3{!@ zNnbhM&4d!&xI-;ut^@?4rU`41kkV`;OeujQCk20AiN&9)Cb?@9x~1+7{eIJv zPOkSTXGs_q6%1QGSd|$5-mPsxZ7Wrk>e*N7qQLPKwa_%DP|zq&ZY=g|@v2h+uAWO}nF!GF0 zURV~Y56N0iv>6BPy_d&iIkk}7FPh}ENs3I(Jiq3~#aNf7t;$;vyERrMrZED2N|E>}^owkX7(gSAj3gm6`q`UhW zm^1R!{DZf1%IjrjJ_?n-88<8cZ5B`^f!9o#cP5)hm3(~Bp38fdY#!Nh zm-y#uDdGgS6TQ8;AX_2$s+7p(?08v{s3MAjkC2E!BaA5R_Yaj?l11*i$P|COdGfR# zH)2sAFdKVQC6!f8>C8l|Jg?(%rxpTmgY!q{PI)_d<77QK4t)=~sCUkjs-_?K^$wV!Xz{^w?yqt zm2#--{qs2N^V&G*#Z)IsfB@ZTLigJL1fx4|6jxhX?(mb2cK^O(f!y3g{;jP)brN-Y zo4EmE7*n2t>6{Myw#z))8^=ID{@KR&b#aNwO=VgKwoy=tUVvIw^OOa}jdysXIx6g17T?UnFeUWZ9cEP!t}E-Cmc|pi z6k`;$IC0K-HYRX6Yp93j)4z4*6uLeR>_aE2+2=<$;aOjU&^*3E)#NTeh!SoF{%Ia| z{9abX@ki(dM;TdGl+c+{n2QN>T$oTWt4MEDhgla_OG;6+1UBdX2NDND_oqxpv}Mg3 z;V|MXadS5oawuDD(O;!5RRv@BI$!7`@uOYec#s?)IA(#rIXqpi zkUDcb(M2Ywc5wx$BV|NA7?Ezz5LN)S)2@xfj!iZ}ss3U;pL%K4gft|RA4*j~rdA;K z$zo*}6c|TQS`*hLYvPG9Ev47PBCrmndX@?W)a%#jT~<&k{lQP?o7P<-3Wn<3;ccVU zE-){M&1Y-z$pm!g$5|in2#nLC@`!Afk^%nPGBMmfOfUiK2I8YL(i&n_1qtH6DYoM& z#RdezWa5eZYNPFE9}tzNk&!0TAjW)%!C$x38pzo4RP3ZP{i-eSpJS*AOM^9r_t&2s zLp@UC5ui)-#4kOy;6Q#iruvN{{e|?R%CX3)qXs)hY}n zt3wOa(D67E@N=eV1?gYLV_ecEb+8Zo<3S%VprTcip(3VjO)eLLp%TZFt4J(n%0OAh zj|pmc`CJ%i44$ZkOt)Y^5rM`5zrEPp^spxVR@exb>~ZUS+TD6899_osl7V_q^ehpe zFDz(wO`tc!2u)LXLxii?tNcnoa1tF-{ihv;)TOp!@Z~?wkl90U*F*@KjFos$5Q|gP zL+W5t!;EG7#8&*MJg73DQ>}yOQA6o)A@p4Kjm73daZ8IIeHnwt$363bm$zfdQ?3-3 zVN z;&%!WYF6x_zfT~&wbnEN*AB|x9<$*ynnGRW-u^93rF}rfpByr-`BA>G(S}#|VTVfR zhoIdmcqVO8&|{>Es%laq3A$o}Uco%ODP+_UCIpx!gn9B)$T2_s$GK@aaJxwDoY&@J zT|7Qmgp0+!h7&`OIKSZw*KiJ<3intzqbe>OiBqjM=|@6|y%4-etZ61B$BG=sG|=~b z_R0eiB5H006T;{w`%&z>3DK2P%M|umDR=|>D|~JBCBHSmRD{M^_wL1CdQzgY6G8)C z7Rp952&&(fZx>V4($JGxXkm&477VGFD3&Ry8NcAx!HND~uY@XLuWzHR=fE5uPjn*6MRT(hgqbm&4saMRcWzVAW3-Gv#H{bFl9nFkz5@|J|pcH5JpcpXjb97H)`C<6kG=#!qsoS+08Gk3G1t?0~`?Ligs$ z+*G5K(>z#?vlW<|mdQRn4HH+^&}K{oJ!ocKQMVlIi_zsQGx0KOvX6f+OCX(curImM z5u!uC0EL!4gGFSDR6OIxq@;8M`0J+q)g^Rvn!j(LaCT%LpYs*OSr*oa6Z32377OIV zs3@A7D|M+oeA=JFsC}B^QSvW#AoHgj@PZ_S9mf}+&7E{67MldeksG)fr016BEzL02 zoN$KLEW1y%RDAH-%MdQVX10l2YytGUoea+y{F7f`w76dgT*;4tNin|oB;(qlfp9y7 z-U+Ma9C(rbtL-8knFD^cqIG}+LvqS!CS}oEk77kXE5@tPNNecr;YtZPWEQdzfb|fb z`Owg~7nxM;O!!(0#n@Q?O3<&iG1Y)i@aEK}pm24xfAj-2&?|rm#U@n4t)@N|dOU4|`W}NbYcq^h_+WXi@HB zW!t(ZPvzjJ>!zLb_wsEmC$J|#wk%;o{B@QFf^(%c^{2lFz1?#}f#aW)K>R^U%hVD( zQJ9&6ei)B;hoZDPV^>1A*Gmu>fit2;2YrYAA1y@Ui}1N&G^Ty;nsq`m_GsQQjEIpB z@ai(_#io9@6;(ZHaZG5!eBfn}LLLepG;)4Q!6-=#^rF*-(Mfw0n`4_i(m5*p zXJ>QitPsmM zP@$9;znuT9CS@XpWe+~OENxtO37O)sW_B`Xn#ej{c9($Me>x^Js!*z8+wvbBli3CV zZu-uyuc8rEqca#DDl{H+tB?Y}s4137FSTxw7?EPNS9l};=#P2jKvjQaDcMm-6 zGHQ>Hbef4ERQk2XJIYePNtXoYZ`{X`Ksw_;Q5%IGlMm2a~A5a22f3jTKPm5{oYRh}lL zqSNV^is%lM;us3Vzy)+1aN;V=N|qH)dg2kJxA04H|7Qm9B7h2O7gW4yWk;t!coe=~ znz3_~8U6AVAG*5?llCW<0$+Y7vMnZs)=ge|Ru0tgGW|W&xA?%7fLv zSerPBzH_I5ti}>Q%6~`lt->cSQ^H1PpqErjVx?{T;ix*LO3TX+b$mp5jru?`GPZq3=ZMEJ5%GtnZM=UY`vSzfXgZ9K zEp?um5K>0lRZx<$iJt4(fy{(oeezol|2fpy_KB2(bcPe2#F))gmgNA?!>ND4{t8!Z zqb-Lb>U3*OiF+P^!{$Kbh!R7W5T(GT_PP=y za8{L{P}(=A1k=eImIic{V?3|LA7$K2hhAxx_@|DLBg!|@!|eEHDe`wGWK;d zb|W2+U;O7Vytb~lR7%M?E0#`9%I)7-r<_~~}JCOUoJ}crLukeirXLid| zlAHLTOmloJs=PRdb&1)D$k^u@)i#OesvvBM2F`B4+k-N^4AB5RtbznL>P31 z@nR$iBd2RZf)l7hEu{&ozVdZGJvhMg?qxf|^*`qWy`j!%aIma?j1BxV(==i7*ZEtF zI%$O9iOo53IVLe6vCuIihL6#SEUcPBT7}iHE-b!<7Mj>0@q?8~?!U|V6{o!Z6RQc6 zC#<))>KTT{2<8=Nc_nM~?1r0==nB$Golt7+#A zeBt0*@whL7XQ1oL^p^Pex4qM4cq; zKzx|lo#!4n;wzrpB@a&Dil?)A&7+)ka4gEbqfmH1?)9y^^Bv47(ap}Sq}u@j<`0XY zk@r8e_|6>>Eqs+0M(P2iP4>Ir8&JBfSSoT&Lsyg{ulkYeE=J(Q_)! zlem;35-z*Zf*(UuZowlvER0M|Q!No=L>CQgCH1WCNa-XP@hc0G&g%&49e9)(_l^VP zrpW@0xNJZ25s!ry!^N;!GYM=s?q^i=#~gdPIaJ{ne<&J^^D0t^)A=4d?Ij!42aHQJ zE24AdzG>J;1)pwk70U>}BB!jOSKU7E1erzWmm``B=xD$D^XpZ;%z>56zgKY=4z|UC z?`O^|WDe3~R!nTNt4BinN)n2iVkl%xd%$tM_{l5>>kCTHJ2h+V8c(7swUqH?gl8OW zSw8!j*^asU(!ypBuwUKjN`np~Gg)Lb)p8HJE)xX|$%ia{Lr;fY-27f`ULvq%)Y?&2 zrsUvl6`$GU_HH#FJsfuFBd{NDq8my751eqSLu~O3(2-v-usywX)65I~;W`yEnSMnn1y?;G80cp#u(kjxB}_3!V6BfTN-<>D!F_3gkwkYc=#&M(#4=u1&nj zh%|V7L4%ROIh&5k#>U>^)zr_jbJQ^2z?xnu@ zmgH?x^L3RT?`JzKYF&onql)HfteIP`3J+{iNf31Ek>MqmbAQvV@?RRFq|gD<)_~i| zu3VvVW&A|43Mt0HfRGF-3S7%i)fAB&s(TH{ya#d)546vei58bDB&Rl+b*t6(PKmkx z158TH$W+#Co6s)r(sZASrO+bY-rL_XojG8tvw_7)at3N@S*gm!&k1sZMicFI0bm%p zw|o#}F)3xbE@{YH0!uF7U|4AUMCRw~B}q2z+lobpdfEiL{X+;;QRq>f>02G_2JB!) zaY62Es(E%hRXnx{&jZSipiVZy9|)YoY7>&~zm)nklfH(u+?6|4UR^!r?cItpn3EPl z1(u+*mbNHp*AmSslL@$U2xNLT#UU$qOioQ1*uB+40k^SZH$mmk4NWMUHxqqL!YP9) zl%(L@+i&3G^Wt6*uz38~h@1LCfX(uGHZkvCY=7*gEJkFKlH-q4DM+hEFQL+0P@$v) zQP9fJ8kY1YGkd1d@X$;6%P1-S@4bY{55Bl56Hcj;r+&NcWa_-r!*>TZz+(|xvQIPh zZ8Kl6;_|x!-IQ~9-EdfD36Z85mswT$H4`8T*fX7S?R|1955QL_Bv zD9Gv&$Z2I*--4{~ytc6Lr4a9<>4BB?zZe;Cu(kEKw#JOEPuhdenedM*OTvD-AVXKp z#|{mkJ5LHXYxGx+qyRwmIL~UYXlQ)q2_@D~bf-9m8)`~%1q&nglvYHNocUKM8wG1Ae5qOid)RF(bPXqG#zgU08)IrYh zsQu-N6Rwj$xn6A`s_+i6A4wC9bdaxdlAq2Qw4vf}{q^}I1KriOyK_+U&}ez^NT!D^Z8_RFe3P%))pY5h7b8sm3;{OtI^K z5c}WGF$o2nHqgH@ZNj#9ox{rW09D~E)B#1gMDo|wonw?-WYTLFjS@%aTo zh-=-if71g72xm?hP3p-_QpF}Z$zc?hCB>xJaYZ`Qc_E+>m5zag4k>vI9ps2-hND=w z_=*|r=0qxWjh#vz(-o@wBrPeT4?Nb#Y-!qH{WIBbzX0$x&5CH2Y$%#W<5B3@E+=|} zvh{+Rvnp4i$8@c!gMKsKEu-_xzDcXgtF8C-H-li2iV7ab>%BV4wiwGC5iy zyFkw3L;C@vx?;#8aQ_U9D9+TlCK z)x`meMQfb&IkH%N8?V$CpVba)WnR<**F_O+@<~|bbiBvb6qA3;#_@Q|uOFcvD0$<| zRN`=@ZKK43rdL<(wnzdV7hi0V_ExaHbXEmy=ES4HsKceVDi1za*MC}yFN9nkTtbl; zYU*C_aaPWh(^h4YXMD5WG|2#>B|L&Ob6?Qva4^RRG5Y{gVB0)*v}; z#)~LeBR z*@O^&sgMBF6{=%oxj=*U8DtVQQU!dy>AG#btlB=;|d@If|?+_VJjAltaD#exZ0I0t;6d{!J(h zpPo8GzX<-#zGpvke4#rAG&e(#j;qyRf z@1BWjcMe^+khp(WnC}u?vIP^b9(9JdO4u9ywQ*$vf!pLAPeyG^VxOz=;n)q zO85muCafuAXin)>LEzkqHmf>aAVmvrG2oB zT=7KX8L8moR8>i#%`pfYJV@H?Q(SZp*3`_cvow?lJr-dSH27X$anIYmHM*yHx`UN0 zR0z7~z39u5>4~q-@&A+2Bgzq&c}g)DG5~<7DoB+QfA@DQ>p=gb4vy`i2{?oU`>sKlB0gZD-~$wkAfu6wDS?V(upe9ZgvU~@gr<+iK(|Q90J(|# z!UdlYq=cNvD)olPD_F-np>f&WoP>%qCW8WP53^_yGdv(NDcaX$ObrP6g30Kr9NZXb z=$Z|6&N3t^j4;7fIj9-U2fx(tWkhTyaxd(vBoXqtKcA3~RI{`{-sNbS%`eIl942Mk zLn&9JnAlW~$?;}kfHc2YU4g<$zWq(kEc}c8JCue`9X9K#1@%X2jOlHY|1B2oRG~TI zzOv5etPTI$De|I9IC>zyRyu^vazX`To5GlZoGm<_u79Egi%=!vy3vIP;VCOBp3h zk})hktpVfgKz!srla~=aWc&{|t{1kZqRG7(6zbu?u|f^9#~t_z`T^aE+-o{!pN!uZ ziqI*5Ne4YawQu)Zma8|bSR2A|bIQt^OiaUUVBz`8d7zqjU{8UmBhLI?fm?X(U=>|icJvj#E&6Jp`38C+~+ML z7V_F9Oc_gPbXfXB3;a?kxOF$lc==rzt#eLtO4-lvf-CL(1YuEy;xt%`G>wde z5U81g={8Q&MUQq4`@Ne}AN+Qe44&D9>sxlPV3g+}LuZ67-UjOu3wsbuuWwhrMf4w0 zB}=w&FjbI+P?!$V}{Fn?z7hHBz?iHu%eF_fd4sr>!*x##E(TmY?Ns*sxgk zobg;arkQ>Y%`Ei09~BV>!PX^-+6=^c%2OHwIL5w$kjsS0{6S+ec^GJh8+ZVbUAdSC zI+mf)G4&fkRVY1E859&mf91ka&D9U8tfvWCojuTm69sRA?^_+H1vww4NSc!q`f_K@Ky5*L}0XFgH=8ziqKVJ3SuxqYSW2=GmD6Y1hA*Kp;gz5XWJ)+XEqQIHLU0?V!aq&iC>h$ zt};Lr!v#F2VV3z|-Y5HrWdgJj%i* zEiRSmsEy|4YTC7Qke|pU9%;_1%(_?wl&|#N^zX2qB)wIovac$v)om&!-Gf0k5Qouy z8qx)qYnqcVVDuuM)vow|4?zH7Og1-$M7lmJk9YWY^l`8;C$ta#{XBWQA&A1~r8$AXMTgBY|IKhS?4n@pt5H9huiaA^P%U)x$5$qXI| z^Z$%o2^ct%KMI+&8MnnJEJa>1b}zU0MLNQnn|HiWW-~!_RhRB{6Z)!ovl=`m^Xt5+B3peuNY6Ft?+{4f zmDoE*Fze54$E}16sG-H?VJli@7tS)QN1FbiHGos71ZDsC&0B$b?^r35{q6-PK38j| z?e0b0Sl(Q_ZDXe^O)G?4a1j4^pkLf1wUk~ULHq@28%gQo*`B<<&f@Rc^k(J~X0EMe z=Vsd5>+AE0+8lQg=601yB6R*ql6F)Lhd*%yzX8RM#|X-JZPwu=wGBvh$)0Ci3{gC9 z7mHH^aEDH}Y~Y)3T_G)SYIcs>m2Pm8&?KX6k{nW<{n~)#juitQCUWPkAZBVYyC_k5 zb;L$E73?zwk%M>D*miwt=J7ehr87%J=hE1BMrt*&TkB3rQq|%cGtb zzs4sY_nH@(k4jya!hLUna>xg+55M^y^4a5C;%jF$I#(ao^vW-$Sg-I7tX!(yUL3jn zI>2C2FSo8x12t-WH~l-TZ(D7#s&lW@aWK*=;R^3HN*|{?=_Le=x6E{Y=}insG)LlA zf9|XI>ujZzPHzoQw^4O&m()CsICiTmD>}TPXg~rj!|RHPWiiW~n}bsI^sm_OuFA51 znFU;VS4rVSv~61_L)WdaG&;%Bq29c5nj9*{M+L;`uXD-eeWyJ}qlavk#XEvbVzGY9 zzeMvWWv9HH_xc^vn9G+=vvdnCC$;u!z_iGc_J*VSDn=lG_)>=oB{70%Fs|Q(uqbVl z6#`tL9BuJAXF>`veQjTiIlVnQrM&O4(rvHmc<9+@_&Xq75zt4kf=*UdDVe2=?JOf0 z;iMWRB{d}4ws zmaz)#$vMhzQCHF2Gb|>f!|d111=V}suYh6 zCo(9|f2W;NJ0fJ*E=_t+JD*sT+gAU{k4rN~W3h%C%1-{nUF!NUjC93aT66!;Kp!1C zKkzw|`?2cgjyVyUn7k^emdZ*^A*S&^7>yqlIz7NP7boXbkQ{ie9*zXxC-NxNNgf?336WK=j))wbE zIhU_`+^V}hcuhWp>bHC41Fcg-ZdadMY#;-(A|zkD&%a-Zt0ZhCMqu|pz3(737N1Z` z$}1|$Yb*icl%zd+el0IO*9~mOJa%@jp4<(U{Xg-+Hcum5DM>fZ_vJ&D&4BCe^)1>( zo7G{Q4))jg`nQpAZC9t)4FgkGmWRv36rTmik(k=Q;qy;tN|3+26+$XzSe$)RIvT}0 zyzY;9t!>%CpogARbK~20gzz5X`gR!%2u6k8F^DwS;*r@cjR^$3r?ZwUrTwlWkzY_v z^>prV+1Syvj7X`QA+ku^F3%B-n8+LSv`LYtO|sB^SR6aDHcYRx>`PPW7QhCT7LO;n zUP`5WeTgI_{AqP$_5EA!lrZD7rf@I9erU6zo;$VDaM$*)f0a91 ze{s4j6EMzfxTbdS4gmG~5{_!5z};mz?mm64T|gfFq1n*@d0|LYM~ZBM!4@N?Ky<4m z!Z{Vo^=n_4gFDy%GVwb(39@%f^TS!p{6wDVZ&IV=4{$k%Jhef-2jb?h;tZY&%bp|8 zV-4BG3zHU()}8_;?tPhbGTPzUPndH*^WF*sT`aTf0RC7@lh7zP)IUef1ZTlHh(EAl-hsDEK6X#s;GCjBcvJEX;RsV1|zsBV_ocoVR)l?f_E3J{=E$@%o ziggJozZ=wjpF5mhcpKF`iJ!P!(?C^q7Rjcm+Sn>KVzVp1FQI+V-4Qzcg{f=TEp@#d z=+Pj}1vGz-+%xGpVC#r}tkHm3y}r`5B|jK8iWh9ENeN6kYQ7EH!PG?^rfx!nol{QZ z&dtHMl>L@h^%g@lk9A!RznwoR(i|;q*QWEAXt2otebhyTN#sh^6#ikoRW3-*WruIQ zmGReaYzIqU=Pk8vq=H&?b;$2ZM!9%8?qopl$AJzP@LG1^5su5ugHPA&O5e-euA=hG zoCdOPyVG{W`ny8UMv2KN=abeQN1j_ANR%a%g2)@1tlr5geO!B(EW))K`v0i9>aePw zrw>SXw@7z4QqtYs-62RLa0Kb@4k>An?(Xhxke2R}_v-hjKJQ=L=Wy=b+1by;&d$tw zq>B_q32e-tmcCs!iC?Ily7NH6Yr(LgVC9+3uQ`_}P3a0bx383Kb_1i9@_cPPb1G zh)tXs4vF)&a`@!*&5O^Y%#CWox_W!7-8dcRdw}y-*8~MO6v5^Kw+RV@O$#83X*MW| zseQG>V0dDE4peFbtDogswbyFIDfi0iN4Kb|qtrz#OKdy^7JU@{EprRKhzj?{->q6z zIL~lZSb@VCCte*rFIRwwA;P+#z{-KRFgC~VGz?)(wB~SG8I_qDnKu!MbP&*`B4IL; z+uL(bN9!)M1JqR4T<2=?<45S-f+JE`^z)kbkG$1>&2jkY0Db5wjfI#a4pi>Zx^{(d zYh#g;&1Kz^^`aeiqswJK{60kl#{BD8BO2~Pv;xK^gLZA3IMqvp6O4|6M}7R%3)o%{ zf;+!3<(3+Tn(PC2X7IR_>LkF0DA!||6AH)vB9|8K$DXJ?6(3Em#ehqbDy(aT#u2IQ zJ|u*p_HTai-5E4{TOqV9AZYRIQ5M7Q_l2g}(<}QNpIq5WmH10^+#whBT^rOU+zM`X zgdsNe`OHIVIT+@!M_DCX`_mNJ%ZEfY`V{d`9ovZED*^2_zC_FGi)8|>Hxxt>QQ-nU z+ybwy0-7w_d9CnN7{93{#jMVh*z=f}%h`Yl2(Ku?xAbhtRq`-3cw^p-aH=xBVKr=p z`DRCEBd=+B2!p_o@oi!Tg&$H*Gjj%ov-OqLNWEx$05M(|ZC7fJp4=#7D%nSJ_Ul*3 z|0TWwsHw7=T`AufGaovaO&9!K>Iuj^zfEoGlL%7LdMSb_8AG~UOG??Tp6`}F zb-A7EsCP{jyk61SWGoP`W$)wwJ1*e8RpYS$w$7Af^$-9k-3#=!UM{|fsdYsNpQPwECDKnko z_}z7Iqb9XD<^^zEG*`OJ+V0VM@Y!b0hea;Kvw#fwzUFGK)MF@ZpU*|Hz@lY-uC_~L zT_C?`^cS-_wp7YXFia6kV{TgucJcxl$m8<9ucqz(xP4i8B%c;EM#Dj5CNGQ+hEH%I zqVcBU89{)jpvm66n$mO(DU_D~faf@sn7U0$gTS4VZih?m%FYJyzoLKRsMp5r?&gs1 z&>30(x(V(yR z`y|2pd_~ZXM#pC^yUzQ9;@O{s=DIBn9%M9^dSz`a$L# zUar}9Ah}guT@thcN;{m#H*c)hbhhGKuMmdLuZ;FoPQpGi@_U+zS0;wI(v56A^!5efm+L;3 zkMjc@$Z1gq!pxjgnbQU-POFnk1lpC&B`y^?KN`F@DBY=B1WW`kn-)!4`rL>|addgJ z+Sf@29~gNM+EH+EN%{{<%=41396=68Tujb;+*E4}uj1?Pmfv>GrZk6weWcL_uR}uz z*k!`LKIx8iO3&6AITVXIv2Xm>ZY0GTP_Za(b&rGwEsDx|^o9#(s(d8f(TN-_-dU^-o^6z|UV&33*Ym2m zO*64UyBtCqpF~Xbaqw>uQ(BrYb(rg3eO=kS@2Y^PzsK$$)b=%*X;q4Y`_T97CwgLn z12J9-c_yPjwio=D@Mt(-R+cgjyF!K8G- z#Z{rAHK8S{>^p5S(~8`MpR&Zdcpn}^d|Mhxq0wI`BU5MOQBj0x|lu61K>l&1tyAh2k!Yen)50-E+}TV3+t(l zj=0RsETIXTOx8E?#C60vsHJ@v(6nZo!dFaRA(j6^eNiaeIMBi4w@3Bb}vFYM$(GSr#b0T*ZNzOSi!b zqjmQ;o7|U^A-B)_uRkl}W#ZBBRAT>NNB>UG=Q$l3hmiAVN;=iyRGQtbj%K@Ec=M?+ zYH{%j&6^03qa49Vujx5CeJ_jedGN~t3RO@}>q%-_I)Se1ZD7hWPbuC+(CW3Fy64dD z?l-vkargVdrQ)E|GBG3x*{hB^Z zR>pb9eAn?~*3C+ADt*?axmEHm49qy&d#KXc4A0*bd;o7^+eF!*fN&57vX|0J~EQengP*ONntJqAh zzQV_D*^Qn5XgjB`S3b&;6;@HsCHQmmc>Wj@-mD9k|7VIBTv0?AJ-UxON_zUwyU}BX zvsKGA4}}Y$+2j@xDD)UnL6T>p|Mqc8wcZgn5FsvtW>+uK^pGgJD)@ZYW~J0VMRN7F zWjvhlj8?6R{&LYHbfn&+n({-rtB-y6$^+-( zYj8y>BK^0zq>WH|T#Zn@aXJ&#u{w%;zdtG}d9pLA;*Ly0(&iEe_2qYK0q~7M2Ti&V!i|Z zmo21zX7Q%-KjUs1RW1o;I7<5odssct9_crI4x zTymM6%|TfPwRqKq?B3Okz@R`TBzA@Cjp##8BZHj%rPH!U@hX@!Op=zwtNJq>vkD^!sNP~t{(aIM`dM1f!`eXnN!>-O+)5EV@&EE z6Gu;{9E+t|L_3Z(x=~{Rdh73wcd%z8`Tk&M^a&Khp$x1ZefnvCMN@7bXn%SjMJ^|7 zQnK6$Pcxq1;9c8f`Qa%_O4mET0Q_?kQmRtidF8DWDGZqR@*I@2G?-PuBcJWMT+0_M zZ8vsX;A(FK+EA65BFzM1g zlqTZBfbBwdE0kT1yM-r5<6OW5S#8-9vel#AR!TB-4H5GJ@r&BcOOKJvyjs6WG^+6QIug{jrd$6NX7m)f9_NEat1|X+1`4pNnv4;Xrj$Xpzs!nK6K( zaP|-9Vf>)iTfO{HKsXO;t;X>3cg|G+UW-W-NHMv9U(S#49@D>CRbs^<@~@~qE5-R) zf)WB=o_76Tjgo|5=C$9J7E>YBk(f59cb{q~JN9eRDL#s#OmJAbD$??*V#ocC+&AN% z|3(CI*9Sd?n6j?B=1mv&1$mFe-f=P3O^eAWpMM^xm zmy1rVz!@6maO7;dvD96K(tzia1gU06StGR4qZA$F-GFvR#T7B#wzq3aL0sxMwW9I?n6wff_AFcw%YV|4>^oX_Pfogn#HBDtQ3t?1P)5@Vys$9 z!ZdW3tb=UNft?r(C(#mr@`U0-<{Ss6hk3ty%hi#Mi&~^Ot-&iaSn%$MG)+?kW7frA z8|D$ILynMl)dC(2CT54eOP5y6s22JM@H>=_Jiq}h>2Fwn@51!YkmCyGnsZm&w%iZ0>NX_%fIk9oW{42vfXK( zbZhvS%4gM)H6!TI@z^|V^Jc{Fy}8aI7BIuS2 zd5Vh&Y>Yhy@#)Mf|IV2T5Lx3yMD#!a7x6&^Pdkv@_2?zdNj=b;F%wsfB^N!d6qB+_ z&qJ4Q?r@O#*C`IsqhEQL@qN)XhsRR1;Ij6S6*v>6VdUhJZsD;xDCGy$M$LoE#ntWQ zuF=zT7I|jvgq9NTboW}k-%RNNLNC+ga1@UJEzu*wdL8SC)UCjGyhkz@TRk%3->Jm0 z2q##k4I0rNEqkrumW~K1f&UInuaN4b)ew18n^2h95dx{r<8OgpyWhjN6x-qBzchbD%l^!6#`ojr zp!t6iSpK?wDt|iQeE7gj0I9GC#4+-rJ7&ptAi?2=96gx+mw!*bC4d+BXqwzl6;~-b zqqQA5Xv2@LMsp1>fS$Jzps0!kif5L+?e=E>lNEm`jQuEt8o4<)8_iUX)SI&I*EWW)Ois?MS9a|!7h z-I&5Zs4ns2;Q2QCf{*s0+AKNGp1r(7U(>FgXBJ*DO?g2aOUwAQOZCb9>ZV3c7JeuF z&;;%tt#z%Eb->wFo`~0TWpC-llQ8N=?HOD@jca+ui{72>Xk}lGwP?_;FULnFVTzHq zJJ9XeR1Kgiq~aQGalS&?o|s&2Z@7Iw@RLWXV~ya;F5QSgN>*7VJIlpYtgbcGO`P>? zoCU{@#*f)*BMp2EP43sgJSt$) zDos7MDu0R7@Fd;AnlzF7M$RavPb#CmqTw$L{0-R^ZPOVO30)Ln6dA00b&29nak-Ns zeV~w|%#XNaysfmdQiYzr;9z4y5w~g;QkBZ?FcPfj4ICvWI}rkAGTw!U)o@{6CnONg zKGsaVvxxZSR46BBXLH2u;Uqgfl*e|Y*Tl&bVr)MN)$(J)bShOrVC*Upmlp_3Hn%zs zXc8ANsnFzde9}kiC0+3znPugQK9x}9>QyWzRU7d}eOJsjT^3Wem{Gj(fvlVNZi<@TlIL4s zJ|ccD;7{@Drs1gR-EXJ?&enZ;#E5Rb%uxvBOqQ{S2T23;p=t0)qm}U+qEn&8Ro@>r zyM+}3o8SHO^Q~QViAT1vxm~Pp(op1+Q$gTT81;b}uylHLGK7t=;#Yh&Iu8XdzO4lT z)>G;Bv=!-gT{FZ_@(A2s2@rnvL-6k!XKvBaar$j2Z{QXQUi76d|?SLoPhKdO`ImN znzA{o`RwUKsHOw`bh}s*O}yPSF5W7Y+L;uZuOI6u3-TRKzO@zZOSbg65e64Oe#f3j8VE-!UO@kYv9wgdJF(9crjQcBjZQ+760;$7iOha8WnDxMD>+bu@%9=4wglA8O2 zMtNIl@9#U)ue*n1WRj0sG9ITHT42w;Pgk4evk}ZPmUXj3672NmNIWSUd9*57)5pH$ z2L;wln=33+HkYR`Ej>|_VKY<7QXcKurZ(j10A8Q_Y8>HAFm&b@Kt*%QBJb(|%!j%l zV)--8PuxHWWQn^hHAAW>p_Tj;{g71lqXAszB)bSVcsbTm0BHeNrmwT z$Ao=wZKrth-_C=4^fg>NEfSd>Vh%Df1H1PG)S~22khR#~Z=~^@z0+_yN@%`2iZkh( zp)aP~8EQHUG|S2~62Bi@O~AnJODTE-P%e`MS}5vGp?m^+Ut7!5i++@omIlC@(0CYKrnU zqtxpdIwqms30CXA?e_lYa5LW%Us572iEXO#c_hd2P&{<`1A&wq@X7q8p6Rgm%a6Wb zvQGXC8J80-Ci(@45Q`^F@t$pf7eZaiOD_vlKWB#m-t$>_{RZ_Np9yTVml?Xvvvaeg?d_E$Kkf!P^741-m#+mqv;H)^oph*%vOnxPIWggbyO zxC|Qmk|T+D$EXrvHPYX|%MCNg>LX|rhPr?^kscxILX$u{1t`2Bm&0eAg*&=EQaTNCbm z5ekG{0*+DVG#V5NL#4!idk=z+O0hMvn1iZgsc~E}w5EL9eN=x^+W>aF@yPQK7`!m- z@I4t!stZ?Sg7M7LXNO0o?~gx79v2t&YseVzl}%l;M;2q`nm68jJ#1s1bXb{^tFaO1 z!?qku6>FJMm<_7v#LJGnctFv9SV`p(SKN z9&#l2w&E|Bwot7dH=e)v_p{kwpRHd-<9X_p!2AM;5Qra+4lDhg`~s1sp|qKpSVhTG zboSCtu}*`MF=kqsh3UmLps$^5|E=o=;?95Eal1!v8+E$3iN@f*-}`p{gY8rDCQQ5q z>kgXvJx|QrJbNDJY7Kc=_DY?sH2QeGDyhA~DOCXuWN7Mohr;mKZBNG+5m>zSqr+a1 zmkMe;zTSYFzHRJqg7(?ML;5<7F}N5Z-)+Xz%R&ktjcC3q^z!XEmaf~cS1^IUotM`m zanoV)*9@53n3QljmU(Qwf^=2ellsPBHn&CH;v?0x^yiW>)m^t9ruK^;Qak5}(ECrC zh!)H1!GWU+>mIN9g}~R8u(}q^20aeiWU_4{yMf5`rhW zg7_khrxc%`N@4jLn5`*#{fQpT0gdA?Mp6CAa(0Cl?{QFjD5PQBd4tgW4H~&F?~Q`q zN8T>);&QMq&S`G;92Q)QjUF0e4iiurWlq9<<4hiAvxCo7%LQwoXWiI^j_zx!lKc${ z$yf7yA9ODV_*46vR9#f({CcdkP_y^IVoPL!7}_y(wIhj6c(^#|a*sc0LBbeQ4(w50 z6r;HndQ_@&nPHuIm5P`9FXvzTG`JvW)XCqgLnvJbY#7@*8d1!IsO2Eg)kU7o4&ND~ zB2zAW7MR>w+v~bWoGlB2L33y{>0m?n^4Vo4^0%!hjIBcw3HPNV?FWVS05!E~Wpx^> zyqG*Ri9<7J21)5@zM-5JCGoCbul!5gXCV|LH;_U*u&GZQ2-3}AHlbG)eQ0y@c21_0 zA4)wc!5FgOTtu9z7)bc|T|p0H*qw?^60yl{Qq<&Zv_kIZ+}@ivf~_^h!;ZV@g2w=N zu`pQ0*VRTz;5Kio$_7JsY#(?nJYcEEL-rfUzn)l<1Y7Za=%ZDzj6e6s^biUO&Lg+d zl8&Vzvarge5{oF6bKn8>{`s#TH9lK}!}oAw3ZC4GRpPJbuE<8IW;nB~!p0b`aLwx> z=AVgh*Ex0i&d-l|_xEd8`t69?3`df?z5qw;QdNP%Qz4C{CW{#eWZl7wA?IBwB1_Mj zAI`0#w_yafxL?9>QD?D^XsLdqdxQIz^#Y3|5b3a{4WXm77O%>azqY1j3^tC%NTf-u zq%V?&dX#}IPye@=kxub(#uPhw6|2mVI)&+ocjss!XyWEAb)-N7R7JCoMKw>_X0gJH z3W`y+i(1xi;8x<5KVUW-s<^9W)qWAfvOo(FTg5DoFx~!=;BV0wKBV3LgQdk7qu~(a zkM)sT7*X;LO;F8hbM0QR%|4ud+2%YNi_Xls?X7fA=f#Rk`U2!!& zD9WcZa|;JaP45@y+xwHYheleiVMzg!C;<(@r5c_ls?o(( z^PC)>loIPH=yf@5h-7~U?|=1L(b2i%Sab(Y-p7G46T;pnRbfl-+uLzfoYPoE)YGrw zN>^fos?#l=9gUKkQ1DI~yyjnIg##a(Ehi$t+h45O@ov;&CG_0Q z)eX7cvVMMuWEB$~$dqhfI!qY|7G(a^&9Q><{E>gtb z$f@%|VRo;ywWUF`k#nOW((&UO8WT(DM?&SW@R43Q4#K!QARf5=V9rR?ue@OtY7_f> z%WA4tT~3L2{If3T%daO;;$%pNh{_kKfRWiF>+s)lP71DTLJxX)W*IIsrkYV0&wfpx>R>I!x=4tQ zr6qiw8(ovf47Y)A@^`^Vz$HxR)u(VDmypPO1Mp4OZ$r(?$5I;~`VfaTGC~Um(-)o} zQR-hVhF0T(DHlB?pzQ(yrZjb1>Pf?Ah|5%-xT}5I69M8WQ%skPj6B3gaC^40)SaK) zFq6(jpS}|ZErKTzKE5%61Vn7Rg?mc zA{Lu!MI=V2gEUnA${(zQ=IS}7D&i_ zOoiAMYN@ffuX!qSPip(~F4o(Lo=n*>sU2|eM zW*YNri%S`EcJZxD`CZ$2R4^FK`{H2LVw#{JZftJ`AEKH{HixUB=RqBgH%D>(8^N`8 zEUm|ypUJJNz_`yxyDztH3J(>xw@#-q5#$$>)}5G(Qruj;h*(if083RY8cAg3ielB= zcV0W%e0&Ccwky2zP6sRp2b7*R2vZCuCku?; zI@CVp$@@n!MJ27G>#6M4a2^NxoHByp)jf_nLcz`KA<-B6SwYWdLGwj|rD|yap}!n$ z)X|Lxm5?Kad<#D_|) zZj{eut~F?4!=A}N5OV3`=|#dHko#u*6duB1-RN8-%_!<``WF)Q9uQ)3pM7Dq~=#FNS;C&3%ex2C-`gTQVFq;;SE*(1dLV1pg$Es!}f zLTpfc!gp4Bmi)Op|EAsc181__+`v7?tF$fw{fF9;c><%>+4r?nZGc%@odWM@mOvZ`62QJc7 z-!%>x2?h6zhE2{0An|?!9z3t2$l{RsiXAz=f*LT0UpHCH z{r4pwTowL}Ds zhO!9=O9ZnBv&mtM)|>=c-hp8i?dyqI)j`6S{R-`TYKviQSxjn^&RbvYh7qyNLS^z> zjp^}&_aB?L4$ki@?b~!UP|PG?;uwaG=PSD80XK?rsB6JN)L2aog#VBwwV|yTVk49< zflwSu%5+VEhTV^cCYC*a6;ddbsFX0Tn;=cvsiKSUZ`nYFoGU!jn3PywOLytv^TYUk6iov;0)l12t z9tqA}F18XiS$2^h3u!MfQcta((m=9YOY6cDoRvd5Y&0or{^lMxYEl>IAsxT6CP`?X z!{-SWo`9zbo418;Pl2P96YKaDBcA`QJd?!>qje z)(b=*6sina|HLpSraaedHy@AGa^qVY&@g689z~ZvU)UMryjzSwx*TMDJB9eQW)S|% z@=WV}e*{H7NfVztl+J;C^9NRq3BYd{_r3Q*)GATi^3&BxTD0Bz2aC16<$6J9!NHa3 z^EGlW)gn@goqJG_R(H`A^V2|Nq@#WjyjiOqj38J>f2IrPnZ#1o?My)V z{)(UFHjsXCl~9MW$hui!CFK5-mlR=Av9)Ak(`@@sQZ{h%=teGZO1j6Z3~opHnqxql zJlM<7$i$=!N%tvCn1FC;YXaF{+{-c;hzsaxFL!;ubNG5U|GaHaDb&Bkk&p+Ge;sBL zhCy!pRr%`qqdT{?mU|aE^~aGVOIx57ZKOoXXeBN*xXeE8(30A zUD8tGU}i#eBO-*hv99zPtJk$0zG471Rz9AT2Lq`a_MAtgE#fA+5$4jy1a^=su_=bQ zwWR-a0C`urYb$K`B9A|_x!#N*+q5ZigwHz^2~s(Erc>H8p_s()+{Z4M8Ryy=`0?0Z z6H9sEK-Vm=ilmA=t1S#e`!qbxe&?)3SEJ&dRL6^;zxV-T?il|lcA@z_e^?sGnmnoC zfONowf6gQMlxqw7jpZyhS=;-tsuH0?kXUlWJzm7pBjhW&^xuW2;i(C4BG*3LoCurDvb#aL{Wnb8!}0=aKG7Q45mw!zV&uy4O?X>VltwBAO&^;hUreb0T=yMouS*woO=mU(^6@*%92p!(VrA!4`7fg;L$YDyai(5@7!@vWe(1NF@h+~hm@(A- zx!b-FFz+lh?9v>rK$gA4ZHhID&zHO;u#_-Wh2Uh19 z(xgYrIc_rirAR4)q(u$~eXVKf7${JafC4P`m_r@CPJ^0(_3l9wwF$K1B=ci=D%#@U zM^S2|S!{313VT(kMV8J&{<2P!ohu1wD@LahT0f&+`YA3MIvnUt@q^=}Ea(UOpQvZe>SI0v(Sq-=@6z_KNpiNgispvkXzwH^9UXjr54b#*J zVA&K)h{-{XQ;)+c+ko0d(|rp6tDE?YgR`asdd5Mz$=&qpoyVG31k8p%<;cEhV##Y) zi;s9C&NdCp>L2Xkt&m(Q4y)Deef2h2zwu5QGYNIk60)76C5$i`Ei-$^ zfiS+IMl+W_dSVK`;ce9IsgocQOj0sl4Un@Je1K-M@0?jz%ziIZwi=sdeR277(=FPs zbcT+v)RCs7f9K=K*|4=@@0o1Q1Kp9C1~Yx!#H z3(V+BMX33k!xtIMvVBaFV8+PSYxFA1;ZVsBBWH5VF75}|E*B)V)C)nTzlQ{L#4V{MZMUXxh83bO7U*%y!&~XJ@fPhQB8O zAh54I(DIcMVyk5Fg?rPa+~a%vcU-iwN<*vR*QiGwVyOO%g&*-=G*oe-LuE?dis+`pv?g z_P3S3ON6;G&kBC{+<811CHO`8hd-8&`$n&Kt7rRO77B-(Fk^|YSYp+!5UkB{3YX|Sl4CN8^N+QfwRZ= z#`{DXugnn3k+r}^ClCfiY;z&gzBuORJaRtDP7Kpx{nq0VhPp+C#Fmh}KzwLTxu)W| zcK8PC`}#dlM=tGXdX!;5E*EXmoP9(M+MEgKpgQiFSJ{)WobjQH!qQ?I%|2xAUzHu# z#76ZcZ1N+A-iX^4w^x33la1$2mmPe_%hW}b<@^!IhW}%#Q$spq6H_nn2w^p9F-RzJ z7ANPIH(-paYmmJ8&^3||FpX$Y*mF?P4@r{}>5FS(1(F9#>*uG>8wLB{HMF7roi%RH z1dchv0Rl)NGHhBLBJlfo*)RPVqTv4)*|7GF2sz&h;)wl6+mFiZ10DleqOT~r`1@_6 z0#}u#?5MxZg!jf&2VxSmIkJ_Zo&-HYx1XvbI+`}{fiV#kk4$XfA{57iTAw;uz`=_6 zFXASHNRU9Rh6b@ZH!5Z7UDTWUrI(}wY?>(n@tyd!p2JC^+0+(ZY zBYfRr-Y2{}-C)C^4->znn+1&VaM(e~U>Ef|p_E3fM=_do_!Zi_JS3x9O+SELtn-i- z&KM1@3-MFfgQDeU5go!M--%#wL?wf|=)&>Y@;9$WFt10O3(x)5bl-P85SH~!Kf+pB zr*P54B?csawY|%nyI$F-CBGU#*q+$M!oQZEwBZKVxNUrsu3+q_p~t zJOl`tj?f3SW15~mmp@o7;TRYR3wFm9y2!7h#nxN2WmAYtYm}m7%!Ga7M7m!xg!a8! zbL8lughL>&_MH#HO@kSu4m>8Xbqeiob#of3ni8&g1Z~Y zVyB}g+6fh zYJMUVOV?QI;nRfBTaAj?9pk@lYI!`HE=d!@mF)!!VvyClmU&rfeU2QaNca)`gOU+= zch%5H6c%R&75rNuC12qX)54M>1%WA*@((fR;uQ^%Q*22gObrOrCelc01(X((!Y?DT z>V69TV~}j829Usw+oHiHXHO!=e+Gk;pq2Ym!X}$b+iX`lc*O z-Ng3=%u z(qAhGX8-P&&UE;U1YR^OU~ZUKx+DfqXQP}aCRtTHkelZn%8}kQ;&@K_7rl<3N%Ti> z(3wE!-40CI>h-{J$vr~bf7)pj$=_iqC{yYTrUX>O9ZpIP{rz;M3L&&a3>fT98N9vH z<{nt$k@Z`be>OGUJ3mx-oCR^I50NS9)THqFizyqnv#PA`3lpEe(K>@^$N@ku>gxD< zkaps%+;8#D!PezU*=`zK$xf3EOP_O5jtMl!%2w)?%-kcP>8g@0{w7Z?Q3y3JmoowU zPrIPi;x-L>k*wyG=m}b<6s0+PSF{tdHL_q!2v5ot6>=;dWd_ zBJ*>CN)d4k6A$2FWzmG5t*YTCYxkoD(hp3L_J#Uv(p z{-=A$bq`avmB&{|u1&4FfWzc`a+JgH;Ha~6I?1!aX5{1 zixA9zYC3HnpU_u-_1nT)T5jVjLJ5g1XM@XGp{de;1^oL}OHHb%Da0~Zl=H=u`}pK( zL;^X>!T*{2Y&*+$mjUcwK>kkPjVw}Oe^k_s>NmbZa^LA~U!Yh+6I3^^z?@-D9l|ofG{~K(Pj#orUwoUKDC6w6=)T=^%8GFl)?buO5Ajx(Y zdC)xO!cU_zxzi&76+el>s1#W$p};D&S4y4IL7A+Wfj=Gk$CO4B2O&|JS06_)%SOwmRx^!cg<3e_-Mz%cs>I|PDD_~ z!+7A_{)#9+<-&|2kDJy0TIwSIxlbP) zkgOtYB%Oi+9ei5?e z(Vc<$FpYTZ0Bycyhk~d2MK9May8<{z2zGedag}}^AS4Nlt>+YZzz4|_D#`s8vz2k{Y(1+Z@`#l`vU zAoy+?>p}@Z?xJpsx0Ls0M8Q=o8&f!rNXlROIa5F`!}}R$`obaNZ2$3yNYXlzN&3tX zLLBvuJ<*auYTx%>Z>E7Ydd2ai6D11eaeBMm*vvOur0p;zNwsF7e$E)cppl73TwE00YsE2Cyx5;-=!pR1Yu`YcRm&ZZSW=Lg-r zDq8mmi`%S0aemwUWAs3kFz8qev>4=oAA$=W zmq_WCV<%aiZOY&;g6C@vXlB8?ftwFnx6@Z7p=Q_Bzoj@B0+=6X)fF5jd{|^IVawDA zhipNHEz3=$J`8s5japigpa@#+N1Px3H+?1C2d%njpSjs`d^)bZmHx3YBT<&U9BjF^ z7Rf;}hY=mPy+vu=$H+zUbM#rw#VTpgapSLv`qDXKLB{xtge>oJ^*nV*sq8xH$S9ow zBKo2|1Mi6^ArfNt`zgAt<>tdp5|4(ahEmA^R_ReB#33oE*V zU)*LF=*H{+f?NPQ{!1Wp5(D{&OYO(SyDXZC>wSOkg~i9HJqRzojghw>CI-lncM0=j z;^4VBWU=1wm)X0pYxjeFb(cqW5Fz<-60hXEV_rCnsKKWF9Mv54#{Mx1C4W1D5qa<3 zM7en!<8J(9CVBJf)$)mPFaD34=F_&vEasPuA-$-*?M^{pnAYt#$>%8LD`pKJl6c~q zr82PX7R9FK^lWX?6}yIFW6QDAa0PhA4b>346Po`juO7j`4@nGpDt}mm{M3r}Ka}j*5x$=>i8Lg1)_B+RTf)WAaNX6K2JnArX zI_OSmTBINeVv2$YZmL?D+65_#?S5_FRu^F?6TSVsV&+;NtkAL$hy3z>y3NF!YO{o< z-xyzj);MIFLJblxX^?m& zRgTK`mN#Q)b6L;u9u3#m*FpG9Plw1QgMYNiDhb035>c%&%Cm>u=Pb7B(f&;`vl{MJWGbdmHydwW(Za~ddK>G=xiM2C-SmV??#RTBLxqC#x4c5QfCwsO|N1uQDA*gvuD6# zE%PpoDe5|PZ8O2Q0p1l)l?!ee{M^64%uT(KWJzGYD}QWXW`2DWDuV5e^R@Abmz1ma zed#C-lj9wqj=KGSR!zmBvB-~D-f=)~HW9%p!B`YAH1%63+f;_M-c$otXlJ_Lu-qTZ zAKgnM#XKOl3>f&Sq#x^d(VWP4rEfj0p#Z>JV5Wb&zkg4q^%YtRFqZhOo}c6%rDMrD_P=>zs&_PnJwo*7Ak5OU@{(9=QGc zfElyL#GaW;pSm8|@Hz1s$kG4G7c3%ZWjXYj4E9WVsEleVbQLzghJi4SD`SbFqPk_a zNrdUe>{A=7ZK0OO{7W)zBY=%xCmP#x5o25@^kIUi11 zzq@=sxDoN*y1jk8Xnx*4e(wT|wmTE32qnrvw4bVP*w5_mF1K7lEG?DCP*Ry9fozx0HKuj60&jZ z)Vp;X1(-7)EUi7;^@D&_hZ{=J)+IR7OP5w@!QB_x)n zyff8eF=j#^y)5ZWNNQ-{yN+l{R^f6kM1|Z4wb*S0=K&-8wwIfJS;fi}fY@lRhD4%JLQ9qd?lGR67 zuS|6|%Uvo~VuvWnFANmo6siUB;dfklft+Q*6px|2dX)ghBCFX6zzuVU^_7T?8Vu?2 zY*@bFpjKl2icBVG3(`4opT=R1FTbodC**-okn4_AAYZoBX02kh!IA}V&zxZFvhJIHHS&1wqbT`#_nM; zuklr5!v0c1n21MM7fw3ASpFsm7**Nw{MjHve?-tst`wWnt>297Qv6-plR!A#v7j$a zC~o?dGb2UB->2aV; zOjs{U7+IIrbor+)VNnUYL@4^r3VdidD6G}3-$z^Qr12}n@n)j+V}R>3tXby5+-1K( zu;Lk3q;e1F)&_ray$ooRg?il?I-Uy$XP<1cc44!`Jek0&5151WgLo-KBRGXmbK7kX zXT3QW{}JKkJM^9d@;pGqhtB&mM^P*>rD{)v9Rr8-+jYZ*9VPr^CdGRO5mrYYLOgPqN_wj0J`#0%OrAQ#BRw1mu$?8!o%FBh z>=`V`78MENK@2wDE9o`Jv}@Py9|Xc{3f*x|f1SmUWpC*r359=0J(Z3!7F!a2@vqDO z=|LFMJGr3*X(v)_6dj{@&iG#tos%pe&>i5?m25e(o)3#j&k(^Kyl#E-^XH^&l>bFX z$Nv#^m0?wFP57!H-QAMX-6`E&($Xc}xmCKmySq7XXz6b0ZUO0({Eqrv?_ZvM*lX=I z^UlmWvt}p?U1=WoE%Q|f=`^r^R-d)tC-U$VD#q>W`h0Ul{770<`pODWk|G`#b3oEpTxK{t0thW(tJa^B;yc zg_t@3lKVsco%?h82pjw*x7I{jTw1?@U;+<8TKW7FyJbqg^wU(0&yWDoq-f!6 z=#Xz|M+I+5nK*l7>|-;Z2QE;8t7Pj5dJ&Jch$NXl55?W{Aum@A$6u1Pvcjc9QBVz3 z-tZ^QrM|Jah&neLh-_0)FDqe#Hssnli#=mEl#c5!kp^#Z+ZpHFgeq+R8UY}{v&aQ#6z_mMdor$ z!IQqR!cwQ;IyPRrn%be7vpHIg7o_QniZgIofjj$kuVHZv>pbq>xCZLZhjr1Z!lAT) zRfy&&)(*OTQr74qSBL0FXV`G5-)~>yjI0tF*}=vByAn(pZCXAgI)$s%nRyiCJgL6~LV18N zB`9T$OQ0H=uB$! z7n1@IVUR5LO#6(JBkiUCO8`&CkXj<+#IpZN02dH@3USCuvK5R#sK_YKov`raA(n!> zgans%rxsY`hU>UQxp3^$WMzJ54{qo1j z0{#%{oQzkitnHpSxLgDOcWf%Zp}i0JYY=ip{gia9MleNgVQ5UNz;1RVNEt(+AqcF2 z|CcGZ7@Cj?La;1=Fy)iqx5ValIs_@cQ?z`)jty{*X#! z#n&xDS*>*4Fz_!0Wc&)4LR<)dwq*?u@qw z2(r5BK`F9pcI|h#@-C-S@AM-X8oyW7%UpEZpE>)vzkg18b&(lr9CF(P>?ux&y?%L!iOJx)62+c-(q_ZjC=09>$)xOfFLKPJ=amGE`imaVx>PF+L$Mxw0a` zN-lsjPM%x!`-iugt8)?HzDT2kpxra2YeZFqO|Xx*U`6|B$4Li2ptW++@k6mc;a1Gx zsh=9Qf@k;V=oSj6gbsESBM6Xc3;jYSJ?w8Ho)PWZ z{)XSe5q-}=g~~%4`*hzEVlN;+<%R!~bQNR~JJ=8*bJ1+sDk0vDOCfW)iE2@tOZdS& zBg+GwR>|KsKE?P=MX@zW36+BD!Lzc#S%a67grYQ?y=|K-{LoMAXH_50Q*%dkv1ZI} z&RSphEiNGJAnbUeI%j-|!?CXI9);86cbhoV^`~Y@tdo&2Eg0f z;ySAbm+FCJ;Y)b+ z8wKfU?D#x!)n2S0o{{#Cf`5a-v;3U3DD0_|U)3IO%@1z%)>Ky- zF{0^VUB1Oa`XOFr{#F1GDLbnakM0BG!R~VCemFV%D&TIT^;rOdIA3$qZ1Qqo~ioDFNuDM z9ZY>07x+fsex`>}Yrs-B#J*_L=reAD|DMf861`MfIpXk_?i~U$-K+nUvGqeSu$mX3 zb^_5xcf-PimBUgvLm6vA7fGJ zdS(pPo{T8ggI)pD0vaYUVAcibT43jXSRVL=$tGSB2f3v-4Ik?SN7Njf9Wh=uPDr{GW z#2H{n*Q6b6-MtJw?`+(ef~Tt-vs%bS)Z+<&lIz(FbM1Jv-vbw#3edevQzBI?+fJyc zVum@kFv&_VxKi=ZT2s9&8GkhJ-5W16LsR*T5>MEM&q)Wg`^yPxYfwe~u0OzXNb&X` z-X;%{%bXK_Uj%yZ(R=jT4gK zO}VDlwcbaStW`mQ3g6|mxqgC1YL(+2L#p)SX@wUpP5!CaBm6C9hp|6-5#tY((PDsr z6mwk*9@rqr1ei_i*M6=9F^=7n9ir?*ytZS(TuAaN+R@oYEIIN0{yXAgQ{b^uTBM%%7n<)NPw@RG z?vbPpQP{EIUm9s|CbP1VahvoZSP&{j+BHuc*ot~^Up${SkHVd7T5{WsE>6m4)*U`R zL-$acuhn*ikf+e21ZzcsHXAMx--@Fr<&Tu|mOGAlyqNP0 zwr~3Ht;)%ehp}T@e!aEJY-n{Q1D9#^HPXJw81EqF6lwmHl*|%wDLQ~y`>vFKX^fda zuiv^zg?RSlV?9Uoz3N&1CP!}I{o+7u1YLk$3Z} zqe}CzUv73%#=G?IP<_cSZ5`dOlZjSC>lY`&B9+8;1qTxU=a>vlOh_VFeuofM5-Mz< z%VUKHKr%XB#otO~AGkQ)YrICEtb5~E$~s*Nw{7TJrg1U(l}^Nc!hH50QaiB@|7A%B3RC8l%KH&$W+5*X zV;fT-W8XUN0i@{T8wxki&gFp-gGr^f&Nt~B)#J?2V(2THb(xLLqTLbD+uSx!<62n@ zZY!G|>DWeF5h}7h z+HA^J!7v9G?!RK-5SxP>g`*Pm>pgu{q19aYSOci%-ddY z^YT`}S$3J}%+8-pYq|&A;LdsWBUiXdYxSOAQ%r#2;Ue<?Wtf_O7*DdU7;8A*Yd{n3*;$R5F~jrV9$^B$t|<` zL#z(CzwR_U&-7~R&oU*!J^X!?yEURl`UxDv?{$OiOE4!@NuMGDT!eF*5iRvD>J`>E z5m*>m{zDIdmz4tY3(SX$ElAyt=l!L#ZbH`K`OW>~8Pr9Tj-L06XZIWULQ<51izelz zu)3vEXg49d)>`gc<*&lnvR8$P{2_`52;aNW@RP%Z{o1KTWf31q-p9*bY`R_f=w&v) zqz`&58h@KNIUd!oszZCQpD9!hznbWW9w(*QUf>Q0hPF8HSK8ht6+OK~xq9|pCE-=X z(e0q@6W<|jT=X+d#7cl*IGqLK@OtwF?p#Jc@`{J93BPn%D#d1Ka56GE+EY9zweuXJRegbG~Aj$vD~4_JPbZ82!mB`HdWQqiM(D?Uughl-m%es zW~2AIJAf{8AdraO;y)X@ZYWoKGwBeWqu+`*)-q+}FGjpE6M}jtOoiZ8igXrP*AUd- zP`iB4-lE*<<2|}@7WO7y(Pm=t^sx=rEUK*INHI(E+1(peOkHyv1q-0=a0w{7)jUJf z|8a6tWVZr?`qa6zM9kz5^GpxWtwHJ#H70bQImLcbO9wJ8b;eQ^_(8-4ra|hF9PurxNrfI2n#;~OgTn>OAlXzgS=C?b*gbt zArCzrBiTyeDYX<_fwcHJbs>dxni{=94_}!3qLJ?Of0c;FOB3w<$fTvu^S;t(bwJg6 z&5`PI>o|Jx^rG`B4ujA>|B{n)&(I1=)nadtp3iMF)8Pz?=tlosSyhcBb?&&7A{pT0 zx@yYF{M>egn?&oiEQdm@rBMo*OjVKH#Q#M$!C1GHkS~9z0-CdG*#DdQBC2*FkKrb1 zY%?tFm?JSZOMnMd677FRI|^52XFlik)gD?S{k)#rR0kI`;J#nEHfO+<(Vtmp8I7WL zTJ*R-J|0j*Gwmo7TEzjZR@kkzaoyNAC$CE^;ny4FB#cb8n4{T zc^dpJZOGK2KbbD}O;}L`LcX44H@n6%x4pqm2JqDz7{HC|gNA*H|Juq*+d;`jM)J;~ zsOD8u8?~O!6Nn1#%v^xJ*Imx)?r^l1X)j+@N=rm>$f)W4c}i?rSO^8>CQZdO-d_wY3Opvq(pyU(CT zy1}KZkDhm@r?sV?za$A5-7)NM#6kfUvjl~3h#p$>)=S35ykhY_4z)|_KxO%)8M;(MbW`}-0$q#hAFgRuMlQl1XtFuy7)ZnzQ`j2|(c82t z8T3T&bSZ&Vug4lbNt=%KS-B0Ce^%I_^=1!0{nGywwg4;K0U;XLH=YD9zj+$Y=F5-3 zM%9H+q)Ynu8j8lIYC7nBa~Lsv#_DZD{@2~G5W5VV`^-zRODy&rTlqTb_^a5-u|F&W z8xcq+?4e|9$;64yIBpwzt`r?dHD{zp9U#8uL8mh14Y44vu6yP1VVv^)Dy&eEn0_!? zb=26a#%X$^>x)=2Mic4)V}sBoQg7ngw8=z}X!bAupSnC)M9300m#%0oXW)=|1WFnj zI!9d@P5-TM8HWNsV{&*v^^d?!eVD%(kW1Hn_>KtO8Kv1%TGLO`?E}z!{vC?I^g%7X zsJ2|x9qPawQNKD0Q#<9`W^ryYUN3hUEFYAvk9sDFZ*NqyNpMm?&ot_(gf;oq*{0uH zIZBXfir-vYH<9WH-LM)jx-0qLMG;C#K-;Nb-)z zC=a0z=21e<+?iN|P%3uyku1v72=VivAabhbVIk$uZ1k((`xr_mjp^lhki?XnL!;14 zS(M99YTNThuCng4B~hNX-k|=?8gK8r*T-=^YAOnHJG@*PCy~G+ILU`V6GpY5DCpJ9 zHXiQz)cA_}^ZH9JE)S(zohi{I4z8SE_W#&%@XV$PDe{Rq>uzKI*qT}umWG5x;XY{Z zai0Kh>}Scfr0>TY0pxQVzwyf)a7`$0xVktkRVFo~G^0hpL@_Na&Uh4sX$+LZGFD~5H{8@(pUKT3pR?Md>RAgqkiLS z!mhq1{*nCmG*R1Q)u|zjk@n?@BbESnw7f>KMwqa30>XPOO7$!ujHwGrl{T9!GDVEc z=Vy@ZSwu?v;oKl^@;5#!RtL-AZOJ+K^sEn~_sy)pvRH*7C7vnwqT+r`c;%JyKu9>I zXhPYkXX@!g$kH`GxYyXBz1#-nH*oGL_BS%2!y-;^??IfZ9%uHL-I_W0`n1xUsMgq` zO}%{FY;a68Z@7PYSYx?WS<7}kDLaE|*O%znS`$*bUT=+rYQ2+5*1X6WJs`5w0Sj^<=5lsjhQ6JUv7Ca-@^Im zzbz#Q!y6pjMOg-`qRxAu%q_2Q3Zp-=9UlyNjBIREG1_lJ^=2dyzZx`#Ybd`!|Gk4E zR0#CTlRgqE-JG1~_#^>#Sy3E35|Zav`=3wAY21I_U#N2VB$JRU20d!}mS!E?y(xU- z-u%@k>)XaXy?b z7?#BD{cBf@glloT!)O_DRIfFW6%nbWwQAq=et1>_$Tt7sE5gH~ZMj&nTB4C_@hNTZ z$VipL-nWp(8$*1{ax|@Ap;G&k9A#KB}09i8+rm-!5Veo3`htX1Yu2LKH0PX@Qnn^1jHoo@G^1 zzU#gpqBO_If7XJlcd(IQ*NX4Oq6EhxHez8ZMh}|nSt*dgLB6VLwziH z?e4~J^wson;I~UUtQ=`)5TDH;BqZ1{eApfe-Bi^vdowk5rId9W_ujm5Jki^iHsrSI z-eL6&k{ij4}^D;>-6Qg&!>_d$+PfLHo8vQP=tF)F&V4ZkWivYYa6VjE`I zHY1W261sfKIicbMf>ju)E2yNW5(CzS0h#v+N?n_Qp;9c_!f;6e+2AOwe{Fh1@z`n2 zRGCkCB{pMTbBeDtSuGRNLuw5=Zyd+SD~8 zrMKNlw4RHZZbYbrUh!;;Iw?NtGvYEo%rxOK{1tedn7y%_4)eDN0G4CZSO=u~hkoEf z2I@r>q7I?ZcSqDB^&&s7e&#&1+R4T@Jd=`t9Y(xA5PT=L$DCRyjnBz5Dy54Bmm?pC zferma+8ry&L3k^k+}dc_BJ|(r0LZ ztEh`vXAg5JfUpWpTI?R%;SzW+cYV18ypO0dkIpK)%MPjaDqS7Oz_BS8@=6{#Xhh+a z$XK~JOY|YByH*5T^4t=8Dn^6QzdWAn_4Z|capUR#zDVC@%P8X#p@#RMGJdFhBcJF# ze_s341yrGo-J7**%Y0cg4br5A^D+*__c1!wW(4M}Q9SB0Ww7}pL5;lfh)Q0h5&n-D;|QCkdZir`qh(}pX*}oS7(29! zx38xsfBH79&D1U>0=tWBPRQ5>cx>wpH3G||=}}0snwUjCY+gK+dIG?8)B#DU=b|q= z{1@0_WNd&HDqVG3w80;9)AqsFO^9J1l}b7O78-G31S@E*8&6Z@*^ef|&_$8kv3H z#`E)YosU6Dfhr)XZrJv49<-xPmy7YhydamTU`~>K^}@5H37fRJ}W5Cq`vn--zCqUzmA7>JTWOe&Bfgo9R%Ob zRnl!{UGPpny?-!X%Mt21X)`lk)<^??1R+&T=Q2vin~~;(hdm|Ikdq>XwlZGOMt-Q! z__Ad6mk+k!?DOLolI6^>3ZfW>hRf(Doy6EycXDIs_@x`7=r^$U)@X8-(lSa9OXRK zLV8R4b`1nHpIjX|*HF<(awE@8>=5>ecNuIB>Y^zJ7~9z~0{0Pe#5j~f4s4bErx(eH zNgP`cwT8HxChh@va}Mi%$s+DvzSomd_N5(7waKTge)mooK|)DMmQvP<(d@EpA_z6` z^o|N}#zsoL4!zSa7m~UkoBoC)>?gQS%iC5!CB&5MW~4mn&fNqG6b$zHj=S_(T5eem z0F3=U4HQ#WuzOw+X~IeeAD})hY6}o0@(~X4rO@^0!`ioRl2yNKs%G2>iyv;;4m7q_ z+|J}t^aX9toqkdxXw`O&9l%b+(5Qi{w3;molI7W<#300#X+Z&W{7{ zSih~BA!gyP;~PEK>%tPgT5oVbp}h=#0VIMVe)DU#i0il4z=u^Fw~DvObDr}i4%lYl z+b*-H+Ck~3+|<$;r)uSVTc5Pi4T% z>Gn(xKk-=-i_C#L$q-#e|GsAlN}4^;LyN# zbF}YO?Rz&5IUh|~rq!wSl^0}83|5{u)Cf5c_KiW_!@>%_6H;t9F_O>v72!1U{6&KA zW|s2IUAng1npzg^opX1n5tXXUoagXG?dO?ETeKit(0`H`8Wgho8>`bB3ye)qQy&DcOgWV zB!bD@5!dY{4e6$T6VHi86H7~OiGCi;QBO~B8$AeBwe{&=+b4k*q})&1)EwytId-zh z6c<8%Uc()!`|LNGCd(~6#XjIqj8@b)J_VbWKpO{@SiDtK4;P?gMM4**1p&2QSA%?n)|Ei(62Y(E9g>ntWiv6!}WT0i(9$+zfFmD5{d#8Dxllg*k_q9H)4TFH=W z$;RR^Y38HXp$Y!GoM#vD1!-^wnn0I9x37^6f%8^3kj>|^R0p`b{j@f+$d#P#k|XYn zLo=#RN81X<*mI;ib*^i^|5=fsDy*OqkIk8C%BqnGPd>f;v3cGw6Q*mB7>hNQsM6PA44D`Qgh}s1Kj#9OJP0bQ}kUd(97vKzI z;ufW_PPoCbc=U#c*k42GwT@&l@7OoIm(~8_T&cxPnOPq{9ZcKeB79_VEYrBP-4S4` zpcvHCaIbit3SdiBKFC$Hyd+>yLu)^YAjw*-1l_ERz6hE0C8amIbk|(&NoLeBc=5~G zV+)zQI(q&-ucOEPb&M0LXH}et0uWb@qyB)E6Azug&Q5NVjW$V(IE^US&EIRy@}IQu z5rA-~%B)#_2}_3gtPw<5DB@>Bvb5-~ZHtPH5!8{WHK=6zHvuvtJTXC{D+6~zgZ`8l z5902CCgi&D4}!TZxRkfNKs_VmKFkJWpagi>y=WN!Y4RBOB^ei$%nvsUi{wD_Op9FO zuiX1dM?IgC;!Q_@s7;-8bBU#dW>^`yU0gd4|wtFED8 zii%x7q?$Zqza{YRm&UJ2HEdO^;#`Gz5#cjt_$LCq4m>P~2{i>(j0LEpDJn27+;#du zQCZh|Nd8!ev&nqakaGZL0&}93wukdIyNrqFU<7*(GMo@OeX<9&e~f%GED0mZ=8?=U z9h-YZK`hvM8Qy3zoL8k#??9G8){Nv`ofMH@ilXS^Q{2yNnd52F&gj?5ithyVOUlxXLs(Kz}e_#EsS>vhR{3DfqKku-JmLb{U%|ZGLXTi$OzKFGg z_f;G76=f1O&(UNq6@A46tP5abFRP}Kk18v|pSe5T2~iYvL!EQ9?fCeS#`SJHeK< z2nTzsw9dZz`?-51Br1X~542Gr?rd0u*{ml-NSIwwn+KaN}tRE#gJ;9BK-&4@M$EcGNsLQq8QAoFY9M2o^r2-HH6>&%8e{rzL9Vf zQ(0ciYJPa+s2I)_pkuZkuMIs9+zxo3F~v$#%Uh^5w&A3ty1W+k7lRQ$-ri4_Jw8H~ zW4xa7lht~2V_R7_J!Fm0U%oT9h%k%X>zoZzHP@zR4AU;ixAHK#e| zzj0^bhqch!4#96>;U|DgsT4vs*IFEW zKFn>v(6dg5HTDvid8o6Zf*57Z&m@X4Gpc$vEO^*-mo(9g=y_z*b3Lvga#t}}RkwzRx0i&V)4SjcEx`UJT zZN!{G_6rZp)4|^-Lx4y{35t*>!UHSJ08}9S6 zWBrK5=ap7|=CM8Oezlf*JC+pphi$mLMN@su)vh|+WrEvQ!jjz@Bn#@7C&-=2FQ+cIt3@Y?TJ>@{bjes)R|HcILHD>KFbK@H0-;mdeKO z2TJd3yEURg0D9&*_r=y@z~j{faqD#h{o(!HS7>!Ps&2!CYz3_7>9_1Q`aZQKhrKCv zB6TPj+$6U7oeL_Ro$|g}>)?>icI^|7z8pEM7q*26yME8LxMBalJ%HF-2|B;#b5^c;1t%1!d2xCvu zV;Kt<&m)s7@5ahWI<_yf!k7el#e$huT(`qwn7RK)lpy(t@k_1Q)Bi`v1FUbo6~}j7 zvrduH_m22)Bvx=N8XUj@anaD5gC_pw!hpO*_bZi&LQ;ne3Hl*RZPS5|ek}oiCD)>X zWw~o%#@6sxjL6Bh(gnF&^&J(Pk$|4NGMlkaw-Bs372#}6+YN(sN8WkPKG};us{Tr> zN>A@;HsxOO!oQB|ovq^I(J`CQH}#|`FCQn)B(6$_IG8$i<~W|I+}6-gImRDVyO1Miw(cSZbryVkX;y-N6Y(tURrqt=U`Oz!q! zh5fi!$yJFUi$5`=H&zbc7Nl+J2;uQSbdoZqR91ZXz+zmrs>&(zTV-AU*4-2^>FJnz zU<>)bI|L>y7@3!27G{p6G!eS(547MjUzs(N`7{GJ^8N@mv_T{aVoDcrXrpE5+MecV zyNT$1#ctO6ejs98I~+Y`PY3giaXlAXeDh)6!{2VU+vVn1Gost9DY7|HSS;k{L*RG1q>#B2*cvfkT+^{wmHn;v`4AJVnKagF--CId1tFNkq%iOV@57 z40Wlg2Rp8nKqt z0RpEdsaI&+u7L9Aa$X!YjOMGIOx}E4k_Y&anY+;y;{LV}ZF%hc_AVCq+45EZbBDF|IsR|@k4rGV&qwu4QDttB%Z4*)$5AUC zl?^u!6kRn;b{cC!B)v=|QDvJ;rKM5#iYSkJuA4{#M2k#^A8PJ-eS)e=TSf&3qnMl} zmR45!M#u(&HE}YUOsY`0f}0JXNYHg>-~7pjP$X~3DlF$%ioV-rg>y$c2fjc#csU}; z(smUGuMMS(m(zE>DT}^EazFTUBzD<|J}Oa&N^IJ-mfqcOnHGzdh`JGmH=a$L$kNWX4qJ zF4px|zRFn!NT6@+ONEGTrNz}+`HwmphQ5jFWfB*Vse4Ute1LBxTAaA_+@#)cL8r`L zXR(Hfcq#kiv!xv;Z3^`QGQFiN}&OkN>%Qr*usLM1N zEa$XVc>WzJ1@!ojTyb9d?`&eXY~S4ET^JUauDtsl=HWRswLdZecn&*Y7-~27PpQEL zTH0I`sO&S?aFwu3xk~dFsST00k?5EG>4~?0oe5#*1Adtc=OYi1A967U$#O=CmA@JUy2WLx~-& zEsrIFm>>YxqS0;1!1s1~cjisuMA29IAwJsBSTi3F*VU}!o+F(bM+pyBR~><(HP<7Z zDLxv3kWd8JyDb|=#Mhe7PZ?mi3C6JIiFf)IDyMFcCo3J3g`PzfP%_1kM!dn#f+i~m|#pG+y|g4FCjy4Y4NX8F&CeDIEJ+y^u*|HF)s<-y8j-=q_ZJ- zbX7}h~zYeC38r`)({$rjtx@w7fY*3V(^{(P!Zi#=G z^L<&a1CDuy7r+#k5wzI4_tusr+Gd8!+u-!Uor*1g+#NZEw|zXT)!sPvzTlj+$}~dy z_abHW!7McW5z_Of?O3>8Z+R2uh z;D8?8nrl?7tbvYw5!gdt85(P@B^{F!n8x*25iE-Fb|W6FE&|J-J90RuTQ}}9Y5ER# ze?}d)kbDEHvh5AMSF&tOT<)$x@EQVjdfcDh`H(!^B-mQyBBuih2;zD>@=Yzp_wUo5 z${epbb;Fg{dQfel68~|SC+b%unx;LOG_+BsKq*Vu3ICQW=aQ?#PkJF_`_iFh$IA_c2eAv92})zII}QtEw5e!ihHq~R-cx@vN~z1Qo%@(~kj zI6eSWHJF37Pss~Xt`Vb7enRiLdPL$`zozeW$pIN&$69G;{-AWtbwCKXueqNXuEmD` z{gDcA9-ztz8|k)@TSVloYr=z7RA%9@SQKMobEObe*!kr`Y3*3IZ#y85{72%o;kpJq zShakC=&fgprRM4W)7{YuPzGAg)BuBT&wV~F)J&fbzUtJ3o`O6J9(}Z zzp3p^vE*agJQ`5VY6~d#o1=&6XQ7rHJ0^<^x*`K*wLum4M>aN zxB75StSqJKm%RZ?$=A9+nh)#-l~}qSn$9Gk?T;B!@egG+ibYa=08Za|XC4CiVTx9~ zGh~=O+!kbs27{iFkIqvIJ$Se15T$c)hzlC00G0Pb|NhW#X_hy0-&n*tzSl)Zdl54C zmeeLdT_mk`hCC!iriYDxLmEFGk4&bEf$=X7!Y+-6o%CQ876y?JX{*BC-lBUWD~}LN zTw7?sVeLg$OhY-=pHq~?@0P^31y_?&Lt|I7%F~2&ms7Eq(-^wQNvEpQ!>VQ$A=NJS zAmRM`uLp=NN0@c1%aCv?v0EilCAq%F>`p(n?2S!5klR6XOGfQ1|4fb6gIpjFOGx#1 zQhfreB$j3ulxk9*W40pX_5y$cB1e1F?ipc7W$EhN#n@3WSBOfUZv&oLK6`i}OL#(h zI_8PQak-$R5(9X0u|1B~tkzatXOOgm;_kBs%D^BQNqqT7tfE2ZqYrI5ant7gD7x5K zhu0=mPP_zecjp9r&+QpLSjEKin3J$zU z!?nfyT}So1jB0R}8NQ}0LZlM=F6QmH8mg?ldu@g#CIt9ULDw^10mA0(L3g1Uo)_H5Dz`CWoMpltB1cU$7|745DPE43wqdk8~u_D8?((iHqqZ` zI2Wlqx4W|8J4D&?B2uu4ZlYB2L_w55WjQ-3(pApKQdBn~oib*xzJ};h|59UNmoYz? zyUd(wX)wQZQsgVWUQKOgzC?%VcNtTq@T3awmF-pNjZ^YFupxe_^Yj#gTp)O@d#eU4 zi(YH`Nc;yY12x}^+&K*lagr*!U(Ks(JFOcWT>q$95*;nGYlNh^(EX)>r?Xq7wd<>J zSe%K9N*!vc2_x~_udIRh?~=P=at|zH8eSvkh!4P_Kw)Umm!NB#*}xGd!#R+^{)G{i zoQ+q8n)mM@=*qGoM-sf{Rn`GCJ#U?bBwYdbOp2QVB`5}m&*#7^=X_~7`Vg->!|oT? zwWn+#D6S(904h=2%&79+P!%#GxCM;vi7copk;tZ?khN{^O5!r^|V(1^>1vV`~ay@3zZn|4>Ef$0r~0p zdwLD>^dPz^F$ejH%%G9m2osAOQjnFeJ7~tdRRj)-EBaqSrk7^F`+K7)mxB=VhZRf! z1gLT|_OtDu!SW(WJEq17>g@10I=V}Cs5f}S1RklfS@VbTANa*VIOsdrwr|OOT_H%Y+u?_HLYEy?MQ__} z8^e@*jo!=UgiYUEV#&~IQ$3pBGB%tFrVH4p#N4$ni080zN8|ACs|ju^^+(IJm)I=L zC^~#oiEyiC8`z@q*IouUAZo(5EGBGPbw)J+X3Z+gLX~mGj<iC!?%bmU?jvKUee6|e5AGPv2~{4>0dU?YxgG;=A_I9We z>hYL^5D^Ky_G|`ZplSt>-Gu4f`{HfnQ6kfQABZy4I>F6RdhW7#sP1@Wi<#O&ALvh~LcZBi*v_V?erD8k9!-vDJF# z3joha{ake92n!BYItmC?Bj_BYY>RmUvd8tfO~zSYkB!np6jvX(}C{s^~1uP zogAs*w_TMM@1jyiGg3Ro)rBnfGf#a2nfJxA86b2ii<2TGwfns8a2bQzm)N2hrC_GM zJ!ls|HZJk17gEg(DS5brQ~+$kK$X(@fmb)$b6jxu43nc9evsvm?)eAcQ7Y3)7)@{6 z%!nr+I@}=r#UF>ZjdnxL7CT*r%d)9VeDb_q^pT%zdfb&KS3m9rm;k_+H;(km1sLbu zTKwp%wt8w>?tU#_P1FAv%}+K3m?DY%0ZSex4~>y`ysYp?t0k4+tO@c~h0YIPvzpvC zh&gQaYIF9l#Eu#iT1w(v(|GG6rCTaQn|+Azs=C+%bdvs+?PzgTOXl}Ui$F(YVLF4Z zh^pYqXN#eqZHbzz<(x+HPHVlPuDUl*_ZF}B2i`QAe>FG&rk9F}W}@!z7ab+_lAY8$ zfAk6`C4P`-BIB2ikdD6;S2dsc5L7svbE-?)<&N^>MeWXMb~I0HXCo z4<|n7ZqF_oP@YlaJU8HoK>%re^krB6WAlb(gQn>8zA@Ab?Ws4L%Bt)XW5vmW?o+75 zMQ}7)Sm(?P9+;n(K0*xi-PeC1GjE@qy)epplzR-@n-yPh$-6uIBs577?0>3yL1 zd}Bx}y9~>*vNCNMrIwbKl09*TvUvGM(|`z|b(eIO$uJ}CVS+(G@&2~9<)FBXW&`Q3 z^NQr^hT7uzE6UmDs6|T&)aup;`2HL}c%8 z3jc53Yq2ib_qAhIVe8{YE!ZKmqOS;}x_`%v+JH%;Ige#6$Wt{UhgPSGeR<^;*q3x> zrYm=3YK$={jr@Me0!6kQE1x!lcTaR!cdvIMDitct(uS_SEDkdW>MX^`&j?(S|z=|&n!>F#dn?r!Ps?)RwA?f?D4`Eag_ zGc&&(Yp=a$ZG^!!F(UJ+K+oE3QUbe7`WqTLvoWaBZa#r%}OyEW{&M4vB zk;M`oo$9Fcv)|)`fz$Jw__&-T-dOI{In#8Rso8|3a?b(mQ;J2JNlO8Vo zaQd=}7H=c*=8BW!n)e02#D%;yKz;M=<=Opp|8oCw^Rn^=3VHXDbN4CfB46hDx&RKI z+Hmc${^}^Y`vI!dXOr%m%GAx)C-tt&!I7Tx?9|{-;pl$a&yFGh1#AmDll)3~YTQfa z*yldfMR19B7wJheHLD~?i?{$4<@^vfZ0*28nSRLJ99qFFNzZE|!dH7DiIL5Ro9tT& zO!%Q~FUI-radkbGfi>yDbGLF&FH48(DB|&OTo7r);XnpjN8LiBD&HmI)4M_uRgx5f+rF6*GwP{OJnemqnZn^FT4Zag`b_=e!oRNR1;|nN((YN%Kmp3ZbcCXA&C<-2Rk45r+7^-(DXVgg!#?V zApBK1$iLddFi2Gwq#*v2d^7vRY<8o;mQnqlFF9>@=kh*1uaGzA`RuNOj|YEiP|+q$ z$K_qb7L~NGijO*3_Pg&`k%r1tU*X@^=@f4Atj$v!_RD+S9*?>@Dg`g?3raX8T$&1u$!p)RbmW!dEdnloDh z9c+$Jx~Xwnq^tWqnTM;z;kHOi`#nLXBc-Q@R=%|x^TcW;+xOi?Oo3%-VHBm_kqli? zMe(`9y@;LMe6BD22?qwv;g1s9VS^~w8BoJkfZS3ItECxN>&Hv9+2=wLG5CJdqMMBc@+g0NC%-6>K|-e3w<+zhbN;mcz!?JeBm| zbAy(Lz@CmPZ8ex8@F>#(h$2eER7uqtM0>(b@mMHayKQ@`kcA~Ho&T9xJ1J)|KM^Z7h)>JNie>{y@$Gy<#q}gt6e|GS6^Kp|4p?tY=qL)SGLqR^t;GHx0 zY6sAhMcfcSWfIN2+&PW4*S_9^nl>*Jj_(_H4dUf|h;=P|&`vE7H|J5g8iikr*0ldQ=t_sB36z1+wFiG1%bui-1z2cq}4DwUN)PaMJ%DW7CM`GJR&j zRRm&e28{FYKx%nBut!5@8ssES51)Os34X9Fq?+C0jYfMA%}Y8cXH6Z5^-5JOiaqlt zCDS!ybs3l6s641EJ1?cuUrnY;B4!BI;9nP^hM_e#K(+br*LGf*<}TV9Oc zu@SR=0VI6S5;XG3lKOp}^Sh}!nUB^E{ASSQVyaYf2}!=t@bwG-H6=2!KP{bEq?8uF zH>_O<$YaPHshN9tavR^#u7$(pxpgSH1?^n@q<09#Co6L~^yex|QqNR6%*5i zsfN$nhpy>OjiTb;4Vjwh93j0%;BEp#tqO`&I#@SC&bdL0LXyBlY;)wZX=Yzd+0q<uAj$ z6}Dy06o2JeOgw96;k(#5YSI-#%|0kKFN(p8-icu=1`+-`-X%kQ<=5*ejq#SJ*)qNw zq=4RBa{7dMeydo&6bo#bgb14&S^3PpQr$Ataulu=+s-uOagl`bD|4sm^1{I_QFG_6 zaa!r0ih)bMrMnSeDqb1E28vHlLuBmc;^lF0(?8g~TJ4>UO)~saR<~0?R~m*#wuX|G zl<>`=E9R6OBq>^Ne0%#pMP&fA*kf7m&a|ue8T1~;!<_WVrx2jiu~X``r08@CzKrV5M}?!~V;;W`1{zQXR^M%lNoHCc#Ph8%xV zXDPL`?zhxKD!S0J$PIXCf6LF;sMcFsmnD%|i1yGMnfTr^CWDwacbhWXD;M+PB5aky z3*U`yR~D1s0pjDcTWXx7`|O*ArO!vO-`+qgn7z&Fc0W}aA-I)^*+l}UbjhA@OFxM~ z$Du_I#ARtwM>xRI-;Ym9r+{?Uo)g|NEybvzXD1ea(^~WB$finfEpYuJ7__3zf*W45 zU58@^=8DrJZ-KyQH$zV&j!7I*GKjrrp{H^@4a67K1McnS|Iy+TkEb(^kg1|tLHW)`kKrVA+686xVw4#+q1 zrAHQU+qrBMxE1kU#OC!&niUaI`3K}@3c69Xg^OMMk{=*azpF9{4k-D|Iz}Z?{3UK) z=lqj@0FeK&CNL8>@RN$!)&Tsvxm)$wG;8N1H8G#O+kw5KY2CaTMd1t6$84l?36D?T zwr%hC@zlG6WE?oa+mX&6$w~Eu^T&pqsW`jb(bIlisp2FbO#Va&!85x2h#(Ep!--Rr zkq;hv7flq3RJ;i#pKwt{clgHeBZfa~{GT5N{`@jOoV2l9b>1Xvr*q*}$fCrYv$Yhv znD44t)^5rL_JE~^;3_88#N;^{7$cVDH2ktQU(R88?$Fo+^x^RflnRN57dbxRY)hz+ z-2*ke^tI@%5(xtOPT$naN20>REDAMKEKa9Dej;u?VaCpQZkaCS&`E!0w9N{!7$8($ zW!^cEu!I>rlND~8p{7!Rn80igt}DekunhSrt006^Fe)VjdZf&F&t>NQ5{kGS#N={c zdb}PFm;GUwdJyrs6FWsa+jMj>yxj$PYlWJb?vGw+_A~xtYYIinhraYh28x0CL;`Nr zV`C3U0_>Uh$C|sAhj;K9LbL`-t$@m0oo0N7^_>}K*Elc#AyW#Gvq_sWLA8rTbaCOz zW@y-^ug{8Ab0P+uu44kL`L{@GT#}7KFN+R(0vUkQrg*z=Dr3=wyNjgPo3AqQaR-B5 z7ymm=e)llq-qVs|yGMowwld;TJpT(dJx#@x9TGnEY0EpwKhH_qUC|97e-nlsG=9&c zF5g`;DnZhgh!S0eARl`8Zk?i7T{|FkYQ7Do(?A4Cqe~7!@B=lA#(Q{1L$~Ur30B`V zDt7tdJ$uI)mCWjUo9BHfm~38s63K|+ooSzMiJcFX;im`Ajg0fTxefF=8%bK3bH{eu zm=`wmb!wBtJqadXA9&4xu8>8AmR8g&PNiBdel?f9b8ojC!JT+K-zi;lvm(@CJ#r}6 zcfT)i=%a)Yn3Gc2nChp&5xKAS0d^`q$i|s>5XbRP0%}N50+v{V`eud!fietC;9n<3 zd_T`Y>Bx*5;;4}CHI0T%9+n*QEK6UNBJ^qfnmwg_nhB~O)8PTqZZdl6YP7t}*h)nh zJ9hE+6CPD$aoS40R-fG=uOKV3lw-iBzDNk7rUe`xSVC#fn4XvSq4I@04>l#<%D=HD z+AIPO^l=ND!x7k>DyLS#)R#uyNhS8BW(wA`NnS=;aZEs_1IV~?T zS=itKmI-p9?hh{mDwhbNi<-By(hN?|^f8j@>{z^@LF?y&zT>|pP8b(Hl4gcw1{K0g z&J^J6SaT8-7stA7X#}#iM+k{0cFswK1tL@GUIyImk>r0su}r=p$T^#J|Qg~XXb1=376lP9i3GZZ@bAs{Ra zh6brG2U36}HiHhVjs6$BYQR4%_V1Zk=UDpZBIb`8;@ptV+pn~b$-c7g<|CJgH~|Fs z7Tsn#tVHb3@qu}q?VfdsUff41z@+#io(K2Y*pgv2EVh-b&ssX~{-yHyM7H0TVyoMAJ1sjEsolwt}u;0#i{09W5} z@~((}uj=k=+TH2V;fCZ^Y@>PCpsudBErfm5TJJYEZVDgM6Sg1rGZ48v?n)g6>H!D{ zji;2uVS4)Mk74J~Si9&uU;ntwSW6H?d9iOR7hX4C!o{JWM!ss2aG+c(Pq6L9dPmu0 zm|ncjmfZe;hhq*AqXa-1wMds(wTc__em9Ggl34@N#T2Ue>a!WVAP1av$#_3D4pr-( zNqo8`c)Oi_mc*EI+ThQtqM+i)RV%KcbzV)|OJ}v&%Kk@T9=f3{tVn!s^i z2-9r>A8(BGx|7#_{kb?2wg47Xv?JSo#B91D`bDInEq3?H@rXGadr|oDy^bM_g(oKJ zHDb|bZAFODw_HD9-@p*RJ(nz(FU8{OK4O6<&q@hTIrlA|2JE*wJj*ZI!k)E^#r>2L zeT>+4$8L|>!{cx)T;0E+b74T`}fivW(Ys1qRYhrpT7mV965S!%-m#E z_K8*qu{ww;Stcm6Q%Im;6b47JQ_9J!vWA9zlwwN7z^;!4>F=p!!Tc|FiJV6h%178F z6f}vPg+-A`D6O!aj)6M`=V;|qQIu&hYMl=*XmOe$W(9ujsNR{Jwf-b8`oYd9&CSUa>|#R~LH4<>kNh}~gD#*DlkR+p6q6UCmIbLOL&wrpwE1v# zPRG^GOjlVCyR^^sw6bWJI{WW4P~J{wTJ$WXs?hr6&~L0BH(4X2fCf?XIVTU93MGM1 z1H86o*#B2&ThUJk_5YHIG62_T7|bW|MXiPEGd8RtydTZRg`4~s&R zQXO049KO@&7+ay449TGl-MgM}>T3Yth9e?QJwBLIy{p4)s(IAAJTrDmPAl+*Wt2fd zXA9~|3v7L8-N!4p8J|e&WD}oRrN=&$Ln}i2oah`eQ9^o>=pNpcluFlbDLj0b-ptE4OjHCU(ZZmMxsFqLzeY? z(4y$1AO*U(6|fGbwSL0Ocx$XIc4DYG=TNBFK3Z|%Z%17}G$ogKkZ3O7|3fv1M*Uvd zDaLIeRO0}H3i>=edOM>BP~-Qj!NK2bStlh1PROa`fTiZCw$e(&c1Lpxf9%UTKBm>j zXs|wx?XhUa-Fv9lu8nsA){vr(Ah~|F(AAG}gmE>$J9d%pqPI?5>nSf^)gC2hKjc4P zXTTf!@nhMa2yE|Oy9CbaMeoO*6g^uSj+@d(J*}2k0*~5Fkb|i(FxtDacSYHEM}9hH z;fn?7m${X1VP5+7g{Y2PDI(O#{nyLeEA>e^S~gaKcht5k2wmj(8LIBEe;}}A^5%i$ zxtpZ&Olu8b%5|B6OnoDJ!+HLoZ$+IhI7zKipCwfU6`#Z)WY#UO5fmTX$U&z#dQb&! zV52q(`^V`35MmIaPAA+4dEFJr>om{FBs_R*%7zs7W-*k~ywAwEx2?P#@-#9 zmZA5$JQYpRthngMy~MjMmky1QLtM69tlGRhoRG*tf-B@?>VSrNY?vBHb+WE=;pZ&k z9dL4uMO@EEtaQii=J}B41{>9I79QN}^6ancEC4A;`}poX6r~4v5o;Cb4S~DfcNX=O zkl{xN*z0$tITGV&~=0XH4;K-Rll;iMl*4Ry&7!dR+5i(o9f zfq!Oer`!`Lg1c6N>>BZ_w#Y-OtEs4|?1Qbf?{t+5^!U}crrp{TUZPa}lJ6a0$*@`} zVyJ#KAFMH@ABpr=lnxG%O*ddSaW@up*IHiNX^{CHC0ZCh(X3#XJJVkQ8RaIMpcTYm zEX#Mnm=gsIkJ>X8v(N5#AIE^CruR)L*T2$e!{h0pkC;}94y@^A3AM5jWuvySx9C`VrScC{Tc#j=UB%K?|TQj zK(t6n*ShMJ@UdD&Uzd<~&&2zVOy`(**6pt{5P6^NFJC4@W_nAC@5TXdI2HSP%}ceO z^A=^)pZn!3EcWQG+TJr%FZ+dN8hLmGx9!gPudQa6ix$uinY4$uNLBVjgG^#WSoR6> zBq8Y(utP92H2v(-48@^?O+JPV8t?w$ywWw1T5vDNTJSk2Ndm%{K9-}y`o60^{3hKH zuGvJzure2Oz?QyjapkM#)Hl-^risl@s!MJU{7{S~Hm=+DD8C~0Y8xI^FW6<@9pB5G zK&ganrc7^?6_-1RqVw7Cos8drNO#V&P5C;Q^4lQj0L?3~C9P;d)-n&)JTVs|exVy9 zabsD~xThp*pR^!GGqtbs=0C)=6$&@Q-Ug_%p5S!YQZvf4o;01z1l{_%8O15>ZA7c^ zp6z&}#?)-{iuN&Ly=gJW5EIOLufd=-RMOj?QdiAMdRw zhRQ_K{7h@uT>n*hrB-KT$rFR|^V^Jb=uRS;UIpbkTd{#f|! zE{nn-RYc>_>Q=C#4IB7}-JZT>+V-*?rhu;CJ~QOOWX@S*Z8^gzO_+w0zUHVn$hib( z2D;Ibb_Mm`iGu|fap2>Kcuu8fbCFuAev1c%vk3{=%fY$*`Lha^V13vJ9vM;nbOul9 ztBG|rG%Q61RC{grbn2Oko4yJ*JBz#$afxJ!kb%#@t9zHM(+Z`d=ldD2OQqw1+HZSL zrnb6T>`&61>ZN7f6Xu4^+TNe(#qy7+5le8KKjg{=+Um?u{K*St+-wCROV>H5mlb`Y zO13F3?xwGWd`(MyCj>X3Ri$n-oZyFIm4c!;m)}q#v16_rg@mL?WRKZHec7eDPbn96 zZvbbg*=XN!oInSxMYYTcPNO}s^AS#kIVhjTwh+*#bLr!w4!Ta`PKklmI? ziJ?I=hfudLpj_(ij7}6p z&eb(|n;>Hl44vqqrhQWL)qU-f+~oNvbk+j6`*-)93*GeUg7Z$Dts|8Dg6t z1B&I2IjE$uWrsAiGde7NeeD+p=O&(L1Pb>d1RiVEN0H@}WP`SVp1=bFzhBZs38i^9 zvlEc{xD<7ZVjXN25e|AO&BAWT&q+U%7kkj|a9=r%GYR5HWODN&ImzfK%X5=B3S;@W z>1PPrBL^0%V(Yn9%li*WfL@7f+892rZwl-WZchR$k-Sv*u29Ka)#J_VU1hDmWi4od zqn6JGVpN(HP`H@bmq_rEynA@d_j-K&09vHk`gp%>|A=B(8Ik|pE!mbgjhAoUn~A2d z8$sL{qbkV(<%h57TcVnu6ve3F7Q@9^GQ|pB^e!22l2reKc|ZAw7zwZHoJm&S4B2#w zLMQEf-=!`eSB;j1Q~2E_m8zQQ;w#bvc6WdSqjtFG<4nN|H1t+bvc2qmv(NbhB1RzJ zgvOUY5Q)F@%Izk?!K-O>LKvofL968HL9)Dk7BwcN&P&?T2Xoa(SexgkWYF?m*dJXIPdb`L2o& z`8)cDNah?KJfii%gRyj5d`I~_;{#Nbg*@2PT5fl*)nDzp; zCJc7vsWPb2Rw`@B<@9DLA+-{5>;lpyW`q~>2x!m?Lwq_j*1Xuobp4QKu`n?qbrOnB zty|AE(N~Rm;VMF7Q0})X(?QaSBfKz^psMQ5nACVcTY#U?<@#i*@^W*vcRrW^obipi zo~EaXD_`fP3i=|{?Ts0T`P$Grggfu46>dukk&O^y}d^T?l8UAuHs9~g5~1xtGODoe``O*3V?tz5W^Yh}>Qw7sA_Ruz22j^Y!Wab1)8fQ#U}iW0$mUr8+SY$IutfrI zP2Z@#bO-_^o}c8G4x7rHCHRijNqsLM>!|Pb-3c=U&2kJR7p-Rkc?1@nCQ}ekGg=oy z%a5n6?CtHQ(MS^6yHS>BT)YTU^i za3ciaKoRRzd-noJ+NTDgh~E636oQrL0Ws6E*T9?`SQVly{I-K%}s<%vX)P-4qXq2_+Hp z${-xvU=pqxdz&fTvH7vO9J2!A0|KL%*ZOeQRV~h6 z%QV>*TVsdyYSki)NjywvzY zE5fCC?Pp~=t4f! zi1%=?CE4OHO{aRY5K@1-kV`rZzw6=o5Xy^xBO9e^!>dQgY7bqg97abHg6hE7K|#tb z#11cr%o7m9rmrgn`u1P^q$Ladmb^@p;}Y>JG4ne`j>{S@)vL#VR!K{p3xOfVL{bfg z+6vIjFaWG?!Bo~LWkxkwPqvJ-zF~t5`_ALz6V)=*Vqo&;YMdR}g1;{@G*E2TXq3EV4RCRKkbd$L~3O5KgxBFd>c4xZI zzGaH(G!k>LhKYl@&}jGuz=Z)k;YK-(6j?wTdOEUk#U^=l7&V7qghe+3L5)dT%E z=m&4~%Ha`?Wsos&QG@I7|v1rZH-JX{ptsCf7DaXsOTr@?kEIzue?#YR zRV+YwF>SJZ+wfgmRW+=IqLSNGfI`zQo zW?|Mz)&kP^YpmM8HFAANL}~ry9lrH6vXAC?m`QE!#HQGOSb-gtEh{Hm;P3J9B@8$! zO=G0-$4{Gfu^lI}T3eK+b@S-D584)Oa{6c>BSOI8NB-V*VW3JvSqAz9P$t6 zxBUze@X~JO9`yb}u%Bo=%KST-xgar-Sji5qv3z`Jgtl)$Hfo?87#D}y55#}`-cU2) zI5`{a)$iE5MFw-F4a_~)tnfT%*Lry8nY!KdYA9%%$;Lw;Czp%#F3#U~A=8>$*scq+ zG3M*a6vXhjEPgKe#4Y{tWB9L><4w$qkwUMhCG*Gc1hPk$oAUH;!+xSzKhbX(bY|H{ z+4gstk5c3Oxm=}uchw2EK84rrZ)b54v0F#5d{C!%wNzyQ*S&u{h$nDBK@yUpDPSxz z6N|oc5$rzT6gCbJE+O`T*8(HYs8GQDU!4T6P0AX#ab=R*@SACm=mqsxRQH*mZ;KJv zTAxm?A(_2b!@QbS#v3B8)wvWZzUCn~a*gV9A5|4e7Jf3mgJV@I0y7s(Hr9f4{mL_k z3q-A46j%fadstiZQt8emu6+K?>O~W9gUBOg-fF2PIXC4ZLPI)L9Ci5CqIXEHg(Tnk zUUV{E7hQ=l z@@>U3_eT`W=Abs8!dLcX;{=+^6mjEWTY0v@UbbhNRTZst$_S~>qDq9bA3m+W=x?1x z2a}XLmDML_VSrUCAs3F!c!3dOvp1`Z%dhlz_C4U z0BhjCL})Y_*!yj@gwZMDm+2%bYassI_gOD>)H{98jj&q->W{@^i=CO5L?)c!@_C$A z`S$c5f{Z^QF_5&MGvX2 zTQ*a69gzNGf0>L0TLB?k75YYzGv@7(1JXHXiQ~l_Kfv7+gXP2UhZykaT;`t-KL>;A z&SX0xmxsmI4C*RmdY(DGRerfUQ~klZ7IomCG}Xuj@HnHHBJ7g&0<(M*gX53|g;PuS!08yX0^uK_)H!RPNu~=5s7>Z#Zu%W#E|R99 zcd(MQ%eLcv3cK+dU;gw}auwzk^aH@0DR7C-FEQ-nvno0>Y5YifF%XKYw^u( z^L6FAd+po5x75XG)x|)V!3lLQjB}m@!5SLdAV3mlJ zQ^4v+qht!i@c5-teEN~V1YczO{pT;2wPQ6x{G-i{IltkifdhNQr=LPj6$L%7t=hQv z`a@A+YkcP`8~YTm7w13uY%_T2i;mChv%N5yZ@&!eoM0YS_oOFUA;t192aG1&@CeAq zgn7cuvEpmh1`WS=BcLi735RYFg%=YUA%kfs$|a>h|93u?b^!DK$ggE`hQ%+^R7(vwPtLr+)2fAIe{zsDL5a zqG!(8K2536LM{4*GFMT=2602?RE8^wdn`K^_ z^hA`u)fz8o)%cBmhWl=Z%Ofhl*9PbNQKIJ&p>jrYA6m0z8mX#>MOf?|@)VN#PnDKO z7)BLg3TeLr65K@oB(+v0xXbcbiVG5A|8ef)4i)kslgz ztl!<08!UD+q>OF~d%F3#FF1jo5T4Nh-k0$xJfmtANM$-8@*oT00BxdzN=T|hu-jkt zvoL=#r+(6GVJj{Gr?~y!Z)w06X?Za#gNnn9TA7@|dnsUWl20joDEqx)+QZP2>8Z;7 z!3yFSreCh6IPQrWkN_Bi zB)v<;6@#>Ii2-!cP>z8AoR(Vx#b@L(0f`u*4(wk#dI|XdaBU;#-(#)~Pl7u4yEy)|VfrvSM?Zee5DpQk$i+>36wLVnEdgvci3tCsirlRDqM_Nx@E-ABNI6>k z@vDbT@l1=D#v6PH#0D(YZZ-wZUuNB7kD;8?t4_JMRvNu7sYq{6N7rMtxca)-JR{ zY3d}WOIWROYlWKpb>=WXo)y%sd;Q?=cA7=`)wBxck^vh_xl;FQ({Yzn@h^ck*4k*p zddRz$C>s@Tm2vm|c)l-BrALyI@3CsTed$(;L6g~~g0-ur=&-7ng2+6i`-MZ0Mn*#E zoM}60ARO-3w0<4gpF;(H&tq^n`;}s^4bOsd?d~*r6)R8KA#P^%WNLO$naq#i_u98s zv(`ERuJYLECF#sZQswtx%Pv)u>7|Ead=|=UbMul;905v*{EMC5rhxlG#G(r2zUWdw z7A--6uJ9>btp35ES+&)nZm}f?99h-Nc--^2wME}cT`~G}Jg~R7x=_$CPOGV&1bO&k z;k|s?!makV@M%wHt%{P3ihArSloUT-85+}#eki90mW~17*NkXnj@+K{9BQt(Rwmx- zGgL-xAH&KgmvL)9mTY|#2#NtU|KQ*%dt`? zCrwcFlW`+jnRV9&=w^xrzAo~0wKs1SkA+Gcpn0tE56VkT&N}xfte80EK$sbh`Su0A z0*US%n!-A3B$f+v^ELy=h3}FGST$svw~yL-e_qEDdU%IIXoDti77?f?HGH6G zSH>l;zNzR-O|70CZ6G>~UAQt1PXaDnVCreCdp3HyOFPEqe|uYt5U7oYN&R?S!OQy5 z7)1W-!RJXIJ4x!PyRh_=(KfUlFc^N-fRj1=t0^Y343Qc)Q$m(O`41y4M95~&`PJ=7 z^S+T2#Ihp#=nO1=a@~7%W{piy&|lTRbKR7wJK=s0TBLdi5OND?Y7;8v_n#otsor^e zUs;`gn@^`_^GtcM*^Iw=5ZI`CaC)rJFVH0Q?}|{$N?>^nZ0gDY_Fk5)-0H->=FJA$Vjsm)Z**mMDS`rrvx#G0l#p&8D!Qk9Phx zv`?0e#o)n|V;wn;kpy|F|8Pk&`p{Q-r@{FBle)e+2P&lZR^yvht$KEvm3w;%%h$`4 zQzK1-)S@e~W*w|nVkET-a&QhaB=sWzXi}%puwc7@~_0&T!NPYx!i+MCt8=|A!M2v zEP;eY3TG+mbO$s8cLvP_QmXD#GS34vMBwEaL^A2u3QKe?;E_C z8LYXmqmBcP6svu9TLvz>yA~rvpU1ot>5HYiD)_~+y%oF;;WlyiyLY}ILEc6SAJ{Go zEWy^VA1inVQ}>rZcB~~=%FPm6&oXxV!#T1X@X6^uzk<$CP!Wg5&<6FE{Y-2Jee(|l z++f;idMHYV@>0cb<4xa!A?58g>1is0_w|t&+F$<@Ih^sxrb;#`>8V>Uk3kV;A4Lc z2emlYMAS$|TtXiQ`vW;=x4 z6fR78;)F|&2l-#3yGIa|jax1ucL0S%F0zA=Wwt~-bj=YR9JprI=#%*osG}yt z^CZX~qt@I%P{^K)GgJtegHvf}$g|BDz;a)Zk~)6g2He^{CrD+w@3`&oJwg{=-Dc>v z@`l+gf!8srH=Fte_~Dl?6U#G{+adiyR6Hr07W88`{W2Mm^wd5yh)V*Z{;hHEz2h_z z(yS1@(hU9L!$Jfb`|Yunodv#CAcu;DU>m$gM52Ykf3GfF1^m<*qWKyh_OI^Unupsq zaHw_w&6j2vrW9yheSewEC9!%HEa#biyj^VwMA_`KY+*0ev;!bMj&(XPd+6=VV?v0l^7lcne)}_RD@Fcsc#OnzkO4u(4$^OuL z&OPUG(t|~b4iRpP*0Q>N)QH~hZi@r8`TM&g_yh!X#?3K5o)OY`&l6YP7bqk|b-x13 zwmlwKjT;541SNAXtD*6_7;rpo-QVxF00YhJdV*$5Bh55i6e+T0|1(sgjWVO$5q5ET z6=7Bb7CQ4`s>Yz&a+wNn)PLAag$9caiqR_aHfx2 z1o^BM;g(8!=r@rDAqgcy1YVK&h;LWBEjl%DvZ6pxsrv|1y-lEP(go_G9#d57p#Cp~ zDc0@9OPJjm<9gq7ixE2!^(ug`&E*;BOB-&Cv*fYLW`UzBh2BPqbr5y?774u_5s+4^ z_GDF?`Zs+mqBAniLdIr^17f(`YeSMnqEgscd26Z}E(_97G$FM&5F^ZvMh<2W$F??K z&*o-;%h5+~x7&w>pq&)0mQC`3Z(1!jiFUP}yg;Sf>+>P+-P6z*-!8$!(536zb49{y za)DqYS^PX#di7LM8KRzuVGp((%H_!q#4Hc@iu&g?yb?plR|tI0IwKvt4}Y*PCs*H$ z%}(i!G5sO=dcD!7uRKmiqys%O#!N4IFF<`0AxmZ{)O$oL*X2d4%f6FJ>$XwS+%A5V z1ml2iTe8jub~+^LfUekX%@NzGM@}^f$p0lTk+#uqlca2t`&yupfu;}z&f5{%vWS{S zKNCZ!rgyOji@`fq$O@v|XT*^=`dOsD#OC8R{*2JAgUHTJU=3(}>RAG+fF{Y;$%7Rp zSU?n-dbRBCEj=#7NU_^r0!MVe(Ctyz@hAA}eY) z{Mkf)JM{oqvF^_B{0%&cjr_MP?TTM#WCi!UR+H!aw$53JTDF1%goBB2^9Zwr(sh>7 zU`l-6{f{jY%#Xo2$iFhVjX>Pv*`di#Humc}f4u~p@M8jiB=aIKL<(Z{2%78KE)kLY!^P8C$>m^?)98C! zV_K4&2Y6O`_m5N$XY2GL1@p&i!cK*bQK9R(01ci)80In^QX$zvr$420g{X7MVY>ia z`&b9e`uTp7YOs@zIPz};AS*)xjm&5eN+`={xNU0ZM!wo=5M3E+CIk~2aRB<1gEYN4 z0;GghX^dk?+3cUWN&U|lFyzh6wTTqe48i{$wxoY1qlE1&7Kp6UBqFm2UuK&l{lfL& z>WZ?enlS17PU~5Klf1<3JH`P2?s>d>uLm&@jb9W-TqDY<9l(apKussW7eSbauTf1> zzOPO|^Pz<-O$rKV=7hRo&R(y&T9$~p;6ki=lvOj?K5zE88*?{S`9mli@SRdtD+F-} z^0tQ7Aik$Azf7y>wSZC=%M2w5*kWWQ5|@yZC_)M_$d)QDNXVadS%bDL`OhF+ad3*S zOd{ez2C>E=Z@AsYkx2^{Lt<}W_K0360Z`KhK<)|d($RTc-T*h5r_H)L-zzE1s}oH- ztWb~J~D8=zX@v(7Gn{qbZ%qS<{)6lW4dkvNgydDB)Ex{dEg85`IN-kc%#mP?n+p-P~K8 z1fc+L9)v$ZZ(bSR9V>d$Lz&M)4*_&+hM$+^O(zaX7&DNuCs4XHASEhhKcGD zc^1BYXE3p=<@pJixM$%qcq!l##r%<%5Sy1PEWL!bt9Iir*=knPJ;`qew`Y?-$#Xo4 zj)B+6#~Iai>7+C9$E@-=Rb?mSH^oFpYu)AnFZJ_2(8ezD7^CK?8)nbDG;x>lm-RwJ zuDXt$#N+j=Zv5_aZMT&)y9Spin8R>|pwZwUWJ)YDprB|I4SA4SDb7H4)$BeujsSD| zL|#AbKP2X^BxoA9TEhGriOG{6fb0&_hfHpuGwHwxUnRvt`--gCzB?(dpV8 zWrqi0hU%`1#N|Q2UtX4SMUXznwPk563b9n6Alrlw|Ay%(mIj}aj?dH{(5;6JL>DR) z4QHzyRi3hS18;ZI$rOMB8t z9i%LP52Dw5J3#>398L=uj``L#K1Z7>ue=l5xSs77%_|$3VRz6=PgD2U@u{V*irnP{ zj`xt&?tScv20XQXd>qv8W_AhLs`9@0KSXg~4r+Ot3-iVV*m=2Y#(oy6PlJhsU zI61>GUaU99SQzr|4Pa5-LoGy9e+*MQ&~}fEZL50Y4yZ-{Hn~9SvY{+YJw9>qv@ZX7U18XB6~c@LO1?So zQs{03ojCBQ-N!*&@xZ2bTG_5yJ^gwY-^%}|B)zAM+rzO*I1oNSy!!l|J7d_?<91}P z1Bd4}|Adf7e0OH=Z&J!`=g)Q}%+61Bw~TL+^IKNqK2mq~N5C(0xU2A@ckaKfY8r;3 zWg;=)61Uf9mB{|=@th>WikQ^|PC-}U^&g#u+eWx1iFZ*rE7_(`UU!#1kbJ6(dD;k| z$uuRrt*4Q6m;Bxe!&z>ii%^!H`>p3KhR;!z`>_ zL;vm~K{+e=ymoZx#9eP9rElr_jQcWl^{>NS7JQ}Ereig#whr0~M^~r7h(i%4PDEFM z>7HZ}VlSkO8u~%QXQXZVHbwPu6LEVhzn$8TW-}rcf_(f|YJ!*>fuKYUc_owp@@|Y^`&|ROw?Te@g+`m(bpT*ZpjPQUpWa6IlHagc z_t}TdBVMrG5m8%Q7ZOKLA_hg-KRC%ZA9+w9l_(*&KMUi- zFjHM3xR}23e>U=vHY}HGj9@*i^#7Q8%BU=xrV;7xl5XklknV2jZjo*-y1N@eO1h*w zq(izpq$Q-|yOsCR?-%Fnxo&oLc4l^ZI=1kxX*wJq$;*BEnMXE>a)_QTZU#hc?ucTb zeG;<(l;l85cy(DUw6wN+Kcih+=DcK-m}tlU@Qbd3YZhq3X-i$91j z7q9FJnn6b(`mhem=L7Ew5kCr=w)5K~A*%2Ry50>OQH!q&rRIpijX<4Q0X3Q{DbJOT zPe?P5O*SGHQcOyO7hntMllYH^0gG)|gfpex84?SBs-H@b?wsD6wHHFCFmzs#9V|T%#*4qmQkZ=E1#&p*(pz}oAgYt@K4xF^IHk(L?ezN z`rZ>XLi_3uP^#Ey-3$=3>j)$=OhQcXD#^Ju;k}fUwAQNRVxjRRk^mWvPe*b6HTRGK zBGO+LYeEqTNZ<}cOVAC~_O%a!Z}NzD!QNDdx0I6?mZ0Gq&~|eK=v*o(Sm?JxN{r_Q zkv2WduZN>^lD~0(Zmva2xwDd5bfu^(t>B(G(#cL=aqQY8h_UPMaU7*xef1|cIF8ws z4UaW$0wA3sY-LX1u&Qdj6^AeQ`!3z|GI8cY!}XXqm~tq}>u_Whe<} zT4#nFer>;9<-K*>#jM;fcHh{^ig{H5fEkRFotZ7_nquvX@MitQbE!IoVJDBCsRXo< z*SpYhkhzQVCgb48k%iQ9u?ScWAH0?r05W723+%tqxKg`(XZ&rly_^qtMbIollKjU>Ee?t5^oM8qPn$U(f`+hy;3+dHPP4%n_0v!=RhA z9v*QnOlH&1_#@K5kP<4~9?Ca0A#mc%KvS;&=+a^v3jtStm$>4-2@;t(((Fp6zI=tC z(G0xlbpt{%FJ(-Po@krqQ;&t}bj<;|7b&w2Q(jE2B( zyEFoquMP6oKHMk9z&d;PSJbH4eDysQuO-6!$v?lk&}w7%XM6T_91a5@RU?brZ6*$; zc9RB95w*WSvo!&nIX#GaB%Ei*QclL|u>4XT*@oR9RRdA@r6SE2QO|kzQ}`WjRfe61 znCxjfs>uLD_%DUZv0~QIfHZeVG))i01$yMdHIG&#PF#wN6rY!Jk>r%lC%p zI0b#8+lIBL?*REOsHOhHz7V0@2bl_KPK}+OsWbAYLn7?wasTJ7Ue}qtWf|RIasuxb zH{e{k=^o_6m`9_7>HiNkSDVNk21Ofby+>WE^-9 zIRcG8Yr2^)qwm{>e^(2SFl4(cCgObS?+Kh+XR-Qw`E50O>3@|)*CpUqee5J%R1;JG z8lp;hbyTeVeWy2BH)6e3Z^A5UYRx7lq^K}=cynA~M#9Gm#$NwgA*AnfDl+<-o%V+K z`DmZu?9vLBQ3Sy0(VP2h{|rG$``k*d^P-IlGQnzy)F-V8b<_7y%faj9rG5t>;%XS; zRKF49oyTs#p@;j~^2&DqD;l!qlx$4H?wBz>zBXCrF~7WPTUqp`uGdwp7?QBK^W-ZY zp4W(*fW)LEH2y)*Rg+tfawF+(NQo^xL#!lMQVE0lHSAmarmyZPTWiqH_O>#!%qbap zYVhHijGL&y#pK5>;7`8PMJJmM;sRexKybt`IhG)%IPB+mFAb$$;UQGm?nvcK%FM+A zeq7m}zkt0SPk`V@)OflW&F<%x?C63DxS2aio8N-pbMD~BY+WYGP~oY{^gXy+w%T5@ zyIw4L)y^Hp+|sAVyA=6 zKcEDzkqMkmh{Qp~$A@e*5sBE;^sj?q(6jx;R3B8tjmI?KC-vf`{qUoIdKLU%1?Yo_ z#SJv$YU!|`TP)YgQx`k>fM6ppx@dUFgsQnMX?**qq{C@Dn-x)exQ`QBoW}sxV~X)- z+i3iRDn=RG2BTP_!wW0^GBEXzl_~*wzKQNEPCk8IfBgNHeo9J&Uq?u@o;!Xhc#d!57>2Ye1$l&VR+? zH7+)qE!etKrpF)f(nG$sn1O4x-0udwZcZ7Fu4Ww}bkhXxOwc-8y!$R5pK{yS)cPtW z%hKfLXuJ{y8gsFCev~5+^bkk}fMDQ(ie)R#{Sy6(9ML6ql(|tdKn$&#m|pQ+H&|Rv zxDu8L&Ka>hF8v|(#;gb=f7J}LZ@$p~&=Kv26TN|yFSJK26SF9HlJ+jT%YG%ss1}$% z1I52x?oDPS%$}?0JM_?p^snB~uTcN+)cy*MN&~Kl(P`+c+#(kcDHwx&TsuELbQAFB z^~`|61qdz~d776AUGJw(_BS>bwhW&Kkc;RAeR@i)I);(&J?@F0<$R1{MzOD2xp~iT zhwW~nF_ByEu9l`Y!t|Yq54<3?1|^38F}?(4LK0H#1uT%8S1Hg4Q&L*ox>Q;d+2)rn zaV_dgT}Iq#Uhrx2>)P+!p*g4N-)t@$oA@zrYGN1>i1J}%x4Z)Ksj)L_K5+0Bgxt3~oG>Cd-4O!8>&#qj|y*H=xSnEva5VKNzJIO)3X&jWqN zx^IcEn3M5ZC!#%bldVK@=|nSi3}Db}^LbuoJ%n?R8evuk}EqN4eDT*|*%~#P_IoSVIa-*^KfF?f{{@yJN zBoeHP#zCWEfTFHhkMB7EIKA)~&dhkS_iaw$WJ+}zoH74t$}coo-c~15Ia}WPQ*i}e zwj179oD88|Hn-Sb5Gz6<$K!xb{1XYym_m571WpA5Gd^Ec+z6F{#qbv$rG3^Wn{n96 zx)2%}!hekq@VqQyae6#sadZRRa9bTIeY=2`3eQJFQzo#T^QB{5ITnX;gUJz!&ytao zvi);R>5H7^s!IFD7sHO#cy~YFLI~NdNs8iA;u3K#*>>U zs_M!nUO~eh_by^tD=l7zxX6%++j;!3;gd`lD<;iMVT1kSRv&|+lnZ9EWO0h6i~!TX zjGz^rk`Aw#L?}>GBL+~F)HfT3aAJ;^LQyE?{zd0&nI#i8_$3o6gdQ?SMJMz7NBN}^ zCLd!Jug_SAin@G4bB0PDr!nDc$_43cjj4-y6ec`b^Mq4r_I+G(e2w%<$p4uBi(Ilv z2!EDgR)B;0K+*tL4~|c6n5`tHt>>u~6_uJn>8N^R^+H z2}}a92sCVb%3G>TQR>b>Vl=E*G?S@$bdgL7tauvp^5k%aXn$(9fIkf}(prW55l)5t zoe($8&(Wn~2{~O8nN`)Fg6F(6&U(_$@K9ZsbSFQAGr4}}7t5J()jN4<7xzE*jb2~rky_wt|n>MdSo`%l75fjMHILaw-} zJ)pg5kD+bj{OjoJB^t!NxT}MxH7OSu)_uOh!|JoF6sbQsQ(w$rS@*kdQ=QaFwZ}76 zGM%-^`>&MCEd`*2(lM%hALJ}{1Z zg+E3z1j5>$H0;*Sj>}lQ#0HAM(HDiGt&iK~`xsOVk{qZtcu@MM(W@z_6B0j@(-*up zWR}*#$SeEegkoMZ>9^w78OZzBl5-%2+F)pf-WX#CLUUfHNj5sJJ&aJW!QP5#lbCAQ z38ojp_o#mx9Z^eyF#3@VjrnFrU*LW~p_uQdG@ZWo)khuT-jeYpf^~I+*{uF8x5gxQ zE!P)cHE2Z_ruIY_`Y>9IJqE3M@q${;WQH_YS(f5COT#%HlU%OcR`ge=dTo%FD{*2E z@Vjls$gIIi(6zxz6Nn+T=VXa%oprAdMmHZpkw*?JfE3X^cF_6&i(c+5uj$*89CG18 z(^^Q({-{jt3o51pEM4$w(y{~0`rV~!xM-BZBBXm)4E@5%zbIii4sC(MBS#(=LQft2 z^BZ3xr0cpNr)T}f|5S!#?L{MZ^df%!?x;l}KCHjcS3iWhbIS$JR0H{vbxhq@@G z=aeq_&>@*l#~#hR&>%0)PhKp$*PX4rAl213!d1db)?PUeB>^X{B(V)T52Bj9%$g8O z?VVpA_U_7G3e1HLMOf8!LSD_XMqxx=2Qp#TU+K&ZZuZKpB1ZbqGqXqA6j>j)SoAkf zCyOqhF4P#$Ul$!&_1Wt7UJREJp1!`^xIotNy>~r>0nc;Cb^n9*AK;grSlFLPBH(d^ zv9M9jKIN(Tn{+vl%OroMLlBjHm*CH&Jm9gTj*Ze4$@h;6UO|xojLpzw z7mZ{2EiOx&$=@bTXTB|73kaECLpw}8Ry{YaxZ~azh`0d8A-MJ@`knprd#1fF4!Y`| z$VM2mUNIzb9s1-Oo-uF?EH0Fc<9uORbGuUU^J}d(>@Oy(U}`xQH?`#j z!HC+@XS(r=sdf|O%AvxeUVG^;gmdT^oA5N;1 z4U`G~8nR8W0jk(50jj_rUhlY^EcuN4@^XUewf<&+$PxjMt)OF0o)PvHu2}+D3*h&~ z{sj8`(>JjT<*k=X@93Ovgem+chGc~wt)&E^<|l1f5IUVNs+A4}GsjiTilx?CRclC= ziuW&87;LS$mFKCrr4w+2dm?I;+3)-fH-(cGs9&iMX{4W)6Ly%TGpHHu#^?VYpFQ6YHIp@#?0TO973)N6K5nLk z^Q}CWUbR&jTqFIUVSq&FIVmwOqK^{k;*1n7qcLI$D;U*GDh%fv4yqnXZ!ah9Q`i>I z(8siy&iXgI^?wOGF6_;6{SU%r4v>hY6o^~eZEvcQSvgUm&x<a05NGmn2FL@KjOkzACDZ zvD4i=up-GQfm`HgyoaCOiM`Jc6(jX2?e$lrNLxYgBxnCi-{%leQuNKxQlsplW}g`O z?;x7ZA>1M6oCVAD^v!e3J=Dx^PXMrfZ=0V7XJ;Y$&@w)WY_4!DGcl@|-zK0wXGB7(lGbFYnB)N_69$V4!?h5a*hau+BNdCBO^3D}Rts}ZwA;xSRKs*w&yND>kiOH5V^ z{Z1o{TE3Z=4`Gg3#S8lA?;~n)H2+Ct({qAEH$VrofZH4br_B>>6I%I_a^b?_?4U?6 zM{A9hY!h|%`_s&%B6Gf>_I4?(`qAB|4N)kL{jl&Lm0;w==%Bm;3u)_ ze#_^o=PaU;b>n`8j#K0g%eNOj*=m3pvW>=hPsmz!cEl2)f{jMCh;u>3!Y>O*8Jc7a zd{f*gltE#C9C_G0wPXrYzgiRt^&EdgABw*M=N2PCKkT%t5~SiJ-8+v#oKxs2{JdKM z4uYLxKJ>YW<87UjK5mq8SSo7dS@^->n#kD~8G<{Wb!=MaEYv^)H&X(GWntgod9233-{+ zfo_oPctY)>-oX`yvBp9P^e*efh9adWv-1XBpyb=X7UfU*NFwJN%cZ`2@@))QAe2`) zGCZr${k9Gl(q8-XqfNFh)mP6cmG|3`-e6P~Tq3+;eJ42v$tCx$7iS6=HL5R4pkNoB z8h+Q)pwKg&eON7vjFJw9Tu&ZM0h=*3f>bU%*U}@p>@%q49`L`Od(S2lf@l0caw>!> zmZ0SF{hFyZEb0w{$(ma&RS4Vo`#;FMEyW1R%L{$?!>C(iR~^gDVO2a)ms2aOzEO9ff zekWbT{R%p746uBXGQ9pT=GD7F$3QfS*$KJqWu0IFS}g1bZzY_Ym}$mCKs^xa03C|FE;{ zndzL)voy|bkBMoBjwCDfF#oZF8>*X0cWz7KXVta)e)Br;=aD&O(#7s^(mncgD6S+Y zg=$)CfGGjN8XO*5RNVWPkrlt+-l*u%D7E5W5%JZB31`rKHG|BPb5`{I=97#Vp4y7@ zJ_YgQXJK)p8bEPKhb!dGp=e0BRD3jpO`U6YD%4dpW~&EpgX?LZh};2=0Kuto3ZUsa zs8qCRiGv(HJXJ6B%bipH5ouAmXH4UZIadGMhX^`EBNbs|wZwsBD1DsU7Ev2SC_k^5N}+Tceaz5zxmnF# zG1T&Y8l7O$Xu7R+&xv)i>}8S+7zQF5Ph=J-SR`^y0wBo+|I%;)ymR6~QeSpqkOYR-1 zps1hA+NjI3XM?>va*LLf`Juu5DvY~>);49Vx9&>+Gt*e4l~aN+Mc$-W+%w zYFC1n?iQ==o@R1az?NIVn|Z%FMZrt1?xtr5861RpL;2?q4wkw>N)>pD(7P=NRMZlZ zTSrn#9~#tJid3prv<||LBS`SHf0Zn1GuA-N8^Uh5IpX0`2T&6OOu~c-%<$$Q+HaPp zB^wtE5zv-8?}2GJa;L%WG1Sflyd0Ae)|Bxxd-^Tmh;E*~X8~vzpDNj&t#Xf}hutL0 zmpoH!KT|xMWJ`k(*?{%;fo|kNN~)%zqFP~-q;yJ{hx~?ycEY}fX;6RVo;#{Yq2DRV z)JMe4hKmg9@t=)NK>xd$6P070#m`jtKvPoOmwgu^&N@hZfxd}Yehm1Nj|O^u;D1;F zkEKj=B6c*Epw2rT!x@8;J-n1f%t(a>fqNTOT9o`PxW6m}{MVIO!$pC=8{*aoE%jf2 zI&Oi|@+h#On!H-!?5Lq%w@87?e)Vg7dRsd^wd*s|(8qR>gkQyCz!ArS`{4D9u2sWy zt0%&d;2e7@W_yX@9^L>D%Sa+R&3C@KcbmBP8RO_%0^iAC%`ke}Aq05ED%IWDcVhddG!0 zNm_~uKm5M;>6K6!oN%BP)<%59_?Mbm2Uyu@=>KxF$exW+ehu=6-hm*y5JZQ)7fASI z&r$V#>=Ys#T4w5q587bq{<;W242Xt4KJ>Ug*y}?+>IKa8d8ujv9?bh9-Cq}T67Bfr z+x>(C9}bybuWc=?R70hu_`RgN*CVn1gdORmLW1(q!oon$CPw?Fb46dSIK&#+TSVf^ zG~A19+Tfh(_pkP~{sYs`L4KSY5J0uR!eqTVsN%G*0gl+yXvBCWo!l7GjMMq}ZlbgX zK2VV*-|J-XdtDEI^2l>kStnBXp;fFR5w8e$$w|iKx3VSHRC{Zp2hRHyS1_h9Cz5R|ol zOBUjISqF}`2>}xqke+;ELz=d-wJVzBCA+0LXVu*exl@{~<49z?DpnJbwElWZWm+?( z2`BmFYT1cTmVnYktBLa;1<%=oNh^yBXW!Muquxj^W(m2bwHUzx2t|y z`FE=f-u1cTDs%RX2gYM*4rXQw&jyQogQNXRO8}UEO3)~M;9v6I?%&h!&^K56fV!uW z4x2-(Q*|@XZDgboic>im9~-~bJw`>swD+&%u(h)5mg;)_p#|#fq8*+4S%C9;Rv;Ty zHu!R*AVJr~w3fHUE->uzB;*$?%pS$n%eDPp>FrwW=;EwT(c20+dIBbJ-|Ov=+CF+? zA)W5hNa`hYN{LNyD?%hx?}i%gB^!mC z?yt|oh=4tc$^Z4_2@I?2?Mi-Zhh;04%N#IZTa60;?-oS z@!Sl)-BH3YWN2x{JTGGr)*^l*`kg28Ft!livE_~L?chHJ6AHnHr3qSa0iI;t#{A70p*)88rG(|y{X(^$(%d(e;Z>cY!kCBo{sFe1Sw0kpncHKLFa znx?BEI6#0SrdHp{hhvSmM8O|^ZiQY1X+>LUcuELvdH^-;731OLNY+UcCq!e zuNV%RT&>Ke9sGPfL?1AZ`H&SM`TQyPexnNT@TxY>xs8y}8okwK6+4SNm9P0$d!k5M z@%#XJ2Jj7ClYcH%FEjz^a>i8SxK&$e1m zgTU>KnOL7>d@pr58L4%7u#sS@qN;eN()-v{Q_goi?Q|9P_JlkZA(h+1r zy0pBt`xLGc|Moak=baN#bwzSr=$ix=Mo#j|RZ{i>rj+GJ6G9ya9>x^>KZOF=*r_t| z1c7G&Bg3sdOPouVIY#rncy-%HiXc;@f15Yr zut0ktr-2y0qt7(2wafdW0*5|Mbh92sMM4hNMhm(M`(3RFljMlG9Dd6$v*MserovEl zr=cl@e(tYoVcxa@6qtmJv&LI&mHFU*0Gi{_R2BjZr68RpY21>P-$OzSCWF;Px&&+L zU{KTaQ0L<&5WG49KC#L(4|YoHRb(>`$}VM84P60!jz# zig@0Z<^6QyJW-{}(hz&~hwcTy)Rhzw?!iKkNaPO!O`Vv2{lSX&D>{Zx5Lb{$>U`f|b5jjfldB`4d!L6j zWtA|hSw`IOdU30AeYMX1-pn>Uf;wLtH0>&g{TWjS!mk_0ioIsxGO&Zc2HC4zeZ5Ac zF`hZ`en=d{*sX3^i;BS=8#aDvO2HcF4jd(RoBjA?XZ$Vxoek{HzA@=2lNe+_X87mC znN%#L!Q)F?xT%JJ_7?);9Y-6q_Y!C`T={&vmWq4ZcXFzHc@=OT9TqgNR{O**v@Rev ziJoe4Bk-IN({(G3bXzABnvUS`hNSlb#)7gCs;%Wdm#_{ev%?SAy8%&FSQ2?*wPbfp zDj!LlCbWJD02LfWJr29gjb8)oKe(DPZ7e?q-5xRSQe?hJNY((@J+|Piv;gzb9yVIb zTU?OkNVQ zS%TCJc|%e;P`{NA;pg)}UJK=rp|-|5OluZ6WE~=uu(bNOaPIs0?|yVh5raF{taJp$ zjHjg}y!3e#fZjE+9@urn&pcA(;4ic!Hr2z4qc$rx5DFgR$(Kr+VU|K`8TaE}_;+?k z1bNVnQT@KL@w9*Ke;6@Z zbYvy#gZ_+;yBZ+}qS}JC8uM=Y1Y}`w3!t5|J<>Y;@kRF`V`A44;o#i-6b!v7B~AD( z)DfQ;?HmWw5|2clOn#HPtc2@p3u-DJ(tmmU!5_#uiZ{;qi#IBST9-osP!RIXS!0vl zfJ9rDWV&cr#}^lO)q-|~`1*+Sj|3%=CX3A!x=4$>R1OrL-6wFtr-tir%asE?n7tS0 zV}I`AJ0>Uvq~e_jmIhPc*r^tUJzA1dWUsz>Jb;;-$l`CJlRgcp@Rq*3f;f2a|24XT zLvXP3LIxZvK`M*}Q{3`ld(((`9jY*v(yxNTo>A%iX?^K!*sH<1W7pt?=?bl&YKm$q zS{{X0qFm&|{_3r(Xtfrxp|8LM!BhhIS7SnmQd3A@-b^2`LYRJ%BWQd+S$uU^Q zA9uTvV-c!_ZP=(QCL@cqFezQ|)DSM1ge-vn`g|kf@QvIM^2vh8!^eOWdCL1D?yUWJ zL+gH~#A?dOQ2(L&IXdK3;LV|+04HC-B}@srSxNho({vDe!^-+VF-+TsGLjL#!rkCq zx{SrdO+6YpzYS~ETG}nIB8_SZZ))QSkrvNi0!1=Yij5JF>(&NCg>!c6Lx555g)+wr zP0w{Ej^Y&Bd}A0g!<@#HvBC&4BpIG1r=~ZG-d2+KKlCTZ3FS5zdMVugUAKLU7f^${ z7ErSfa(m3l=G!#eeb72~9xNLpnon1P7p!fZrB92Cym1`9>iN*mbUe9r%V!kqZkh68 z?SWQUT!4?X=5%^(l{cO$u{Aeq(Nr#61OTXZlK$!D>epHYoyM_8A_O*O+1K`|_#-QzyN-XKo{G%nq3 zqW#T5guDgEBCctw;?fCZoo3P+6CB{$HsqZ??E2c$9u(0aN@YKIYU5KSKWi;hdLeLA zCTq4}t?K;8lFIxjZ@RMwblIr-Y; zG#)?ryId0#m>I6@5G}H>?+Sh9F~g}?7Z4f1cn4pMq)G70uMRho;mu;jF9(~vE5i5V zK(4kEN3z*9JX7D~qw(!cko()@Ki6}BZ4hpXph9O1-KWf27|WM|0ndc2^o<+qdB`}s zFpe+1?jADL=wH;@r|XmEx9d-uprHN*Jo?+@lZ@-Q<5c}mgW`x;UlyLG5T5sg4p>+N zb6mTe?&VicT$iSv49GYD9E5XnfsXHKKCSlPss!Q&Wz@)NEZIuPvY71fTLsypsC+(z zROnmFLRLKL%acQarHF~Ex>-As8NM`#-ldVxro&iv^+#JD7&*pvHeU-4&MNdn^0NQx zm`3tG>+JXmJuKpVdQt1y*x){x$1IB#Wk(wEjY*3wcrdRzfKD17z^e_<4~4Ldf>9tP zPo~tW)Jgi_O5qIK?P(!%)rxG!f2VMUz^VL2n#9EJ1xYIT6p-QJyy%3=K~%OzLQ zszDmdYd9SXGvOKz4xyOBUG2d|Hbz6PFIckJGu3`EaK3lj$RI96&UV#DN@3O{_J&Hl z6%hrlNCt7fDNExSzYk6n%U!WBtpDe;#w`bZd)ieG@>ydi$eL(3+pVg3le~&jA zjKpC2QEz=8s5bV~2vOJZ2P>k-+!TYfFz=|atjIlD0G(ljXDZ?TnE>CBkDkZ>vJv=Y zW2R$APY5mt;#uB{vI&y_R1m0?34U6bBpU-V$`oRm>Ml(h2vcN#>22Z!J%BK6Ie-wv z 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 OBEr%j=u^RdnEx*|Y&Svx delta 138764 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⪚jA zaI*e^aA_Y-R#CoKw)iGZvhtay-kj#;u>sMiQwKiLr-SyKXIEfpeSpKDUqcgddfi_{ zRCtMlpjZxG0;ZrMB8KWu~ z{^R)By=aT3-H6fbW5f0?4tqCpKd@=kHSBBM;~w%KIWya)MTwQ?KO zfU!g5Psdq1Ckp);)x7|a#aW(=*llE4LJ z3Fo_<2y;|wXhqO*%nZE4C$`Uw%XFgP91h8EQIK7W&?&l~10f_OCs^~B?`Gy%FJQE* z!AC63#juGcSNBI?X=6D6$e~`rCpzJf4B_fu0R>jq?oh91|~%zaPW8+r4BXw z6N*xQ2L_xM0z=o_C6!W}-J92Md;28*nW9?l@UU-leG*_(WGtNEx$klw$TO0*)*#MW z?DZ;bAa7oJ`cqp72J_szIiyyDQMxo|v3DASz+7~^`D@cphvVUxOlKwSc|sxxoWzGB zGTRVLskDC+w7T@B!qrq_9uH<}-4bx5T z2H<}C-ompi1in#T^r?L%8O$RH>R7}BSxvV1RQDobrQw_CI}{Y+^!+D!#+YP(C6XQ{ z9~96x|MVb;wnHoi3J-GD6q%{@qTh3R!3}EVuK}XEAN7#UF*xwIdNmCS(Tw>GOhpHs zSuuYPCTf-4n`*`wKmni%mzP*+K7dus@*?8gc|c@}J(_OC)M<4RhERT)|7ZHNY51fk zArFOIL2cP#Thlc=Hk6((rS1QQ28600?& z{9YC5rPXEWLD^)%wtbrTwy!#9yf_!PhcW-ycZf;TFmYJlAI}p_;fWNGC^s@P60%=h zb$D#P09Gq3EYy>}lrbN)v^|WWWQf`D?U>*AUgobK#<=ml$ZVihBOHcq+nySphPD}d z4N-<-#8T~LyY9>8o*B&f{K&CxO~14z&muKl$(3>z9gG))mG#CcZWZgtESxV%83<*q zn%EENeod)0m#Mt(i;f~r;H(@!8+Y>+*Q=$C4$!%rifa)wS)BTwE+iqPj)6_9WU$FB z-!nWMgaf5Vh4u*!>HqKLh?6OlB%MDu&Z4@l>fbvv?kooQn6y?j7Q61w0#55cn|YcK zHsha#P>6`K-wqss%IFh*Y;p!~-oE4}|39X_GAgU?d0RlFySp3dlk_MVwNb4~8dpAZvZ=kHWjJR>Q;9Xo78!~W*%H5Wh~H`L$`P@2$Q%BB5(!FaD)TXl_tVJPi7-DD z6-vZ=v__RFci#$!$$)?eYyP8yB`4q{fosI}sxr%ZyL#0XG@XB>#v;?HinE(G&aWsm zuT=i&M`$8RK^9xNw0~~OCa;^V|1*@oX7_J$aZb;BD}r1`Q&-ev@t)tL{YLchYT26_ zUnZ!goCAhjq#XNfeRL;5V-7zcMmmBDatQh`N)P`FS|!+idy;H-P`Uo>CIJk%@bl() zqSI(_C;7Z*T-#;D$3H3?0W+<_HDn(}_7D(J$yE(+;)mj*8KOjhZEkS1?&e&`!szKPnVHBp-qXH{Lt& zwzSD;fAbPG>oy=!y1>*aq)XjTl?t_6_N5-}jue;I`^2dSI8zcw;l554>rNsMW^Ig@ zJjU;26k&~!1OYn9=c~y*{U7FE53yB6zs56GbP3qYtk|RlG*lOkOV}mVSlBbZ*%f4| z9^1OEn-91Zd%@^SNKrj`Zwo&k6mS!GaJxKO`(A#b-*uBygDS<@~Cos95I-9W1cCDQ4pF>L17rpx4T8m zp(rj(x4SN;Vg!QjhX}j{q*$a4{QsTf%tV?@m-id<+}=dgqW~Gcd+KsE^|c)OY6+g{ zeN$?IU>-Kd6iNynbU0q?BAE!+Asz8)_Iy3N3_1mW(w90NEY2!+ZU-C>n(}kF7h1!Z zH(eoO0nvG(2_EN%QeB~IS|nfrVlR{@gQ%`D zb&S7ZWpX$fUwXUDdR?P5lVg_MPm_0>JKL6;Qer34)?QBws@lYlh zj(zIR6XrHs?GoM1c+(V?8(%?GXT`6ib2q>pr43F1o665_>ch*0c&;Io#O{ef8HHQt z1@*vP$rR16NfBz({+P49V$LnwOBh^O+N^Z`%$U|XR{y+A3G&(%xEks@#^YVsblu7q zJy*#D4$!1u;B1?!aN+>u$Q5L|>O9*X|_y#EdQcRc;XborupLO{NcM+qk+APW@p z4n44th8A*KE1=A9>&zQ6Lw>j?sp*hLB;W6TZR>5g5w<;@L%sY@_ipc^T&DFsRREq( zcn`mN)6>0=p5~(AviKO#Xj96?gRNs-OkycUj^DRLquFoT#oH|AY`^>Yt#b+r{F3bU z_<0BJ`MA;TZf);L+5Q6%Q;-m216I<3YWWyr#w;}1FvhbDmK+lObK}n#Nt4xBHinXE z0W{I5DyRYfZ>Hhs1fVHsHEHsZG**f9JYYhig(9+wX}&Por&fWIOS^@|UvUq|3sCAi zMydMI1OAt&kO~-7&AU;Z%R(Z8qRZTBW zsr&JVz*9(}l4?^i(+-9DUqD*n;!|pb{_v>j>EHkjHvGSPbOzpd_`wqB%KABlec3fW z$`pu!J^m0rSE#*zyr8pAwEA-CIm)?q2OtyPN~lc~X2~`H*hQbCpQY9^CyYU6JcDi6 z6~26vH~70H=qK~EZ2ZVj{QYK4siIEp3Kc<|2PduQT(j+RjbjL!J3dwy{y!)hDzCYL z?f=Oh9^}q=OtNzO6ZRE-zA%(q?|xn`<)6$GEZ{eX3;0QDL>jsQWE8K;ZKC_tb)<6P!C`jBhX>3FJB;Drk|Ic^Xy6*4N1wPRPZSc39VIa)bq zH@E!GLN7h|!Rg**-O!bG{Sp9~uAA!K-^OqkqQX$}xq~@eWBT6NRYk~Uq~3#UeSyBJ zF)@@#Cb^a`pnrsZMZZ6dOMZ)XmAI0Ed?o&+Bwmy~+h(G-VZ5+i4wtIoy)70gqMWuB zOfy{`P#$g5hDDfv!Z0@a(O;Az8mo`MQLAP3 z5?3_)?WY>P%KBsI92qYclIEQBuqCHPO=ZUD!I_!n3qx>nAuZ*(PtN2zpPIjZ1s=S~ z1;3*!c~KYT3-A&dH7)JIzWsbo9L1G10M|vAYX5@5uCd!pfG3 z-5l_6=eB~8pAAH9qLAYCDV{ZG5qx!4qnizD4 z6BB)=??(zlHtt4)yhFh{HC)>j2s>&{3XSqe*#s#u{)W3XM$b;hQ@LWccdBBZHk{LH zLjEI3+d@KeVYuV@EC|KMjUDTDYrKQPYx4mMYxT0zKZ*!%GV7Gwp{g}s){v^x7RzR= zu9qaPxZGFSfx8;jjM=daqZzlG!?H#!0rw95i{CzB3;Jtn7Kn1ds))q(%PG^P4$@sA z2|&CqS41tP8ZT)()8B#`T$O7e2^c_Ps!Pkgk-*2a@fipAk7uem7bY{adAoe859Vy* z+l=k^sfX=x8rjx1(@wGA!0csex+OwhSVrR=_4h3-M|E;sTV<4xdrPtG^~*g>(Cwne z6+2yv!z9}p)AplGH0G_b7nFfvkhJHdB0x(=3vC7Y2w zy@YA!QB(;tqvc=E#&$q=*}Abl=RpzUPZ4@c3iEY;?(7M;DSm8lU96S$5(A2xxni{YTohTe<1bVDF?*t@qC<9q zvQV<;N%e7c>jIOWpFW=?2o$!Owx=&{z2Ca2x2>N$U0ZASw12rUEqKAbqwxV1Aczsz z#}4Bir)#5{WApEWa02k{jUFOdeO%A?sSGU>(f~hCOYWnXUpPm$)t{Q@q@p8b1gult zGzR77yOl)x_omPjDHjW}WWltaj_Ak@#T4Qxa&u|lqtUm}i+$lEfPVkQ1V)68kxidQ zLSBMlcFIpY@M}?!ThsXIY736qS6GFy4djjW1P9qS0An7)_ZbHO1?ht~f>lXAM1jC5 ziTu$U-?l@NjM{g(cB#{1Y126R4YW1#SxnK%7z&CN#h5IHj=PL~@?VPZUq4l)CP6E~ z5I+d|RP}6-Qe)zQyvBV1&eq6;cS_p*5E7$jD&wAj=Yt)GdXsE$HwGPr4vD1Dmpq-G zl8}lQV2Sp)<6!JP+YDYHeI&4r@FkU;d!xMlj0d7ZI^wO08x5M2uGIHmN-BZHnx;l1 zFr>77p~1qr+=7f1(n!9TOf|k)aagz$Avu#|SS6RjWIYo@qH(&zms)YF4^Q^Bt6YuB zPx(8zN(A6^N2G-EzA$TQdLW4=sJdrN?$w%`t>_IqcgQgCNOqET--h6RhN(e5<7(bQV{-s*(#@web#-d34Qc!LPO z?kC<5BBdUl=)YD5(QfX?SH2iwt8dA5Xiy(-fp{}D{q3yVsZVE2M4sVX^5*8|>TB(t zrL$yQ?Vzr6J0U|Gr)1>`x(skL_ApWq-l2bUy#nyQ$c%ySM+uVPX=GoTD1b02c$ z+M>=_y$ig~(JMN}tyoM`=^DdZ6p{+tvR45w2S=jT|l zQO@D-X9%Nb;~^={*YyQTG0#62Y)4sL}9<6Gx~hWo<8T!bv550a3CGhi@wuo3J+OC zq?-iXbbV!4Dn4E+sBOqht^GdQhHEss;{h+J={6WwF_yiDyPd0BDz54L?~FQH`uHus z#k7m@ip0ax$kM^~%iTm*Trg=qXA`4A^Ye_CrbOj>|J`r-m47A^w!X{T`XnH$(I94= z9m#Xq4Ddb~-xV!-s30NPmTm)JAV{tD2)diO&86 zXE&Ns$No(D?ycJ7Kdbl4A@*`xpTfh$m+Mz*VJ^~>)%aF!{Zj~SeOPLt2sUx$lZ8cv z;Wh;#PZgp*_me>=_)j^1rxBDU@QZbJZT>M=&jtddxnBbgov`vlIO+JjV>rLJ?|U~G z@QDJluLatHr+m|osYaB%lRvQJPNCQ6z)txid%1$AMZOXZI@dMl@hHpIzzHwxgdim_ zGc}1@_)Y3XwOc_rY$}8CoTcx`b|+!$DTisuS)~Ml`szXZ9U6e_%^fT5SeuUbye$xo zE8>}|pTA<1uqpnDd_FB+#9gA2k1Utsvrt8^n6(CIO(_>pf0TL)K`VvEr3&$?Q5htP zVv3`5Q;Sh>NzAx|6aAgJVV}x)%6Vh?z=AT3NA(ERZyqvKJ{5ht7IBxWaXcsy$Yb|# zOoo2TngxyKz5Xq+$I{}08XlZHCT;ye!K+}8ljKO>t$SXvYii0J+UEEsp`-5P8CbD3 z5RlyOR?xmQM%LEb@JVGma0<9~c)s1=ULMU4I8ISK2_<^Eh2FQ}aJW}>NvO=CL5Q!c z2$H~e$*q_D3HINC>@lRjJgjyjE$p*<*fCuzRk;6Z@u{?Wk$ArOl3rJ2-z6P&C|k|d z54!|a)HI1y3N+`iszXe3BlgV>V6V*O1NFM=_quZLNQh5I?9)?Yr;9MRs~au1f@VTzrje&=5#WYDdvr2R$2SsTS46WL=thL#Ph{CIoiSl1?_shUH)ID3MRCzXE-th9l z5Zd>!v9YrJii;*_szM6N>5?=w%B{5bjS!<$;8~FH@AXV}{KS_xw$bvi_Rv5UcPl*T zPIM!LlK`VRwUr*n$vpe1GG$9;B`NaaONeJ#a-KYX4eDWKvf=z-o}=D5y=^k)O)-j* z{s5V45CZf~s|1kGF$FPpY83y`-^yY4(yP)Fo5b~g56e2;8Dtkme{3&{tC^rt!DK94 z`&xdKHEG9lCS65>qb`cSMviYComZEZF?vx-mFv z?zm@owf!z2fpt3wy~#LS;?XrR5(aqLc^-*!UV^Mh8@NwGki!pk*+%*9y+n!V{U4a5 zt%md@=(Uiyd$GM~QfjtqW+;_#ku(${O4g3=%jf&;+Vjqs0m%P8EEX4^TMQ|-D2|=MjzFF`zm-ny9NyTSjG(h8K%0Rq!8w*b~r;+rx%-kzM6*{ zA6sq;(d4iLq-&qFR@K_)#n88I*^HRcoXcVI$45P<;bLSSQfMih9u8FwrG%C3CduEO z90ApEMjLvk=Iq}a9d}8pp`k?mcbyTPK3o^Se57ZtgAx-X+S1A>V~=a*4>8<#+7z|x z&kWbP7TiyrHqhB3uJbl(1}aE?mU7k0ro8=67ffSNu~=3Wxh<5Uj71ziC7ca*>sn_J zrPLN2@4e4RC!95`kIoz+TLe_fABZvs0d@Y#mlxCO*~5tf=`6SEtLN)_28}yMl8LE9 zwz&-a8+NycGC;6xh9=URhF#VqeVovFMrCoERK!)xj2wp%CqcD3;Hq5C2A1-b6RdV7_XW4RfCLiIH7X zTZ?jQZ5b%h5<=57|71f)gax<0wa~<7P{%1G3&_DT&fpZ4Cj7CRjWsoc_cZ4R+%krlY_f$yJvR*T#OQ z?4^qh+sCFb8);h=?ri?kHw?YD=!F$Cn5O!6R}4vFyoy~o*2XOzXizfsBQ79!2?PYQ zLx)`+GPu8ZU+nrvQX!hNX%uo7NW>PxN_j&{H?EIxd)UjI?n!Z3BfeUgv)mZY1l?3l zED)llqS^&U#B?6vU2jWr3XkcWBTVb!-FO0ei<^TB6(zICH zd@JcH>qiA74!qVShe9J~?AgUClAGXU(VOre#Z#ut1&TTrPz&8qLVi$IH&oyg_I^9ZU9H^UeA}Z z){l7ZY_N?gxbTy(8!AVWjQpU` z*zHf=#+Ckz*Z^R06M7{|?(@b7*RXhqP2x|5k4Qf>!paVMJ2jjfWH}PO9zH-nv*v76 zT~5+P2lF7EUr?nQVVvob-Coq0s{P^1V8)zGHA?`u2w&@2O}!ue*p?hupBc2PXqGsU zU-DNoQ895vak@|@ESwU_l~kpNMzqn&|56?K-^WNVwl*HX5(ubq*W^-Y{Dcf!(@apNahjhoL< z0!}Hj-~xoorcB3XzhhT~D&uOxLz*Lc@52vIY>A&9p{US$TT+-_RydMC!_z?S=N)kB zZ9u9F?xE$WeX81M{oJQEV^%_#^3-xM);u>;09;F~M3_ZfzC5>ISIv8@#Qu(Z-fTf1 zrOE!DN=nx$G!n#-Et*TsXgbBA6-{3>xGT6M?`0#0@~R6-1*r-GbyJnmLE`>~Y8Tzl zbB|Gjoy!2_+JKx&N*)}LKwLi(paJY&K>m|OtAmrDqEj4v+Snt^yE zx3Myf8%4CT48;vzGTeSvrNnXJd~{XzF=WGHVX>l{ZA%6qW-tSDc&yMS{of|_Rj9^5 zn>7A!lZsTkIDU*}u9VE3!lM>UjO;09T2EAG6TVxeVajyYMXT)$G@W_F&pE9IGo>~iDPh@lpVDMBhrg5(8q|KMi+ z4?gGkbrvDbQ%;%!gpaeg{1dH2?ycv|Pn&unx28*v7iT!CtV{d(E{cp7Cu_^Q1Y43p zH`9pE+sm}j#%+#!kJk9|14(yGld(6aof>#Ze3GnM{k=DAWGC44fS!Bd%y_QG_lTeE z@ZC}>C=SRdE{&F`7+g<{e)$aDSeNNMWstW>t@8V1V-aaK&38W4@tRx&!S5!sSV-)J zKL$h7!DMrlN0B>v+vx^J&q_BdcbvSD3;0Kkk3V7%#TexRKsvB~T23Y)IO)0h%BZ=G z$95L!95}ZD<8{Y4pg9>OGw1sSIgvnrJc!jWsAEgbb!b7R>EYjPZ_H?$F#WZnGTD=b z<7cenWE{UQQIS8>SYb&!1ujJxmz(tOi=(awf&SxivzJTap)KSTXCBO>JZ6~>cMng^ zSiq;=qvyz=B7w3W_p3v4XEoFKT}*dTVguC^&6er7e|B5O^l3!d+{x|m9_|-x z(V?s^+Az_K|Nf!)WyX>#9CB)-I7E^;TVGy}8<;d*GO@ID>$M7wh}aY%&6s^Wm1i7_ zAM4ydgbcoIPzDl$Igk*%7er&7BlVnnDD}_d0D&SS_rX0rD+o3@Xl9@}e@pPT7lX|I zS9|yNeg5>5nQ6)Tbv5s=F}``|?*e=yslP9qN3aP(B(fh^#a1Jucl8x^UW|1eKUjUR4uSZ}wu8qfav27On+)Qt(T2V?nAY89!(V!b&z zLzOs=6z=R^=rk<};0PnBy?)8}YO_Ue5N8^*j9L8?aEx;u?nq|<5-`sfoQQX1Fu7;pq=RtDtZ7TpC5>>z ziwcuA4V5q(+u_0dlt*958fD2tW6YL6w}8HcXe^PYw`43oX}z?;opfumHeZ^cTGL4C z40Uiw63aL2&Sl5+^T4dF>g(wEF=NvQ2m;$sHUi3YtFG*PU7633U)GNwEr9}~mu24K z1vOP!|A#Hl>l#m`5uMYToqgbWoZhSYNun_$DSxN>Va)D{IOM9^?Zxn#=zgvZ@;qfC z2mgGO{d{xZ@?!JvhMesZo!3iiNVX@qD##60VhgiX9?)sYsQXO)bH~%gesCsI+$6ls zv{A!-RnOZ1!LC7GrJ&WY$|_8lJLYMsfE45DTmPh|t*Pz|CwZlZe86R~SZ5064C&?Y z$9;>-qL_u@aMnWo;Zxta@rRTss@y7&2Z; zk>zMEf`#i2`V}`Ze~=*CE(o7RdF863pN-n<8445O~1zRE1Jr!)7=d9;I z423IPpB@zxJSI^*17-pCtjjXtrK1F*<;=L1sY{Gh(lPi)bnt>VVl6$;u#J`gEb<@u zRf6`Xc{|#PBTQ)QosVkFB4H?YNlD3Qt`Z1Nrig)~cmEW%xV9JA$<6f&I0A)J@$oSw zV-saaHr|G^Qg0tg-P4e#zBjP9dy8kdA!LE_7}8{$mZfEs5(mZvf1)V4>f5!Z>0IB&c|AWp+H&XcAp`tLUD_yVcAH6upj9Q& zF%3Ka`k2yxx>omAZpf?Zz-c(0coh(k6b9hy=`SFCmv1A&MiNC+?fc0t)z{iW5TEfY zH@OMe<#}7Sm^(1u9J%IZ$kdk%2l3TZgO%$+J?JWkaC2I}R1tRg@Yq<{DTw7^VG$B} zCkwxyHLN?kE1Pi05L&lym#W`Sjkj=X3wCCX$5ZpKSlXpv=3)%eiA^woy8eM@6AU23 z~OiAbvLW8>7bG zjHnwHF|3$DXV8aVE^VT$kzpCjpqLZ1|YSWqlLEqAa1R*PLcr0tCKB;1fbz2!#TaRCgpnZcaDW z>Cqeo16`Fy7XeUxTQy%VN0!`AZMEP^50egv0T$&9yjJO2ox_(@P+?d5arXf<3L|;f zwRK83XdWF1!_Xu2?^0B?;CM-L7ce)r8H%5pr02+d5+qoxj;Xa0Zt6yP4-_ zosa0WY|A0Pu_ix_dzEKh8`Z12`}`L~Ca;kO_LshZS{ne|5E?I?7 zmWt(=UzHp;Jg0R4#Zxi&-)qo+BUJB>_KP(HX>pA^^jZ&a_&rR-BS`|tXV=zLBw z?6+Xq&MtA!wFv3kfiM?*J!aVEACH)S0O@=Aj(9AE%I9mvgQ%O&>Cx-ag}zm5#*AtZ3bYfN3OS|Y!F zj2z#+np!J!UfQe68aiSen}MpehP3_6F}Ac2lO8d>X8ma+eiO`W#T;| za7XnBORDy~6m0V+#2yEHK`Hb5Mh6J`YUxKCifNKEBnj4(ew;S=N$igiZyKi*55DB2 z?h7Xjhy6DpRl0(*QAO=x-oIF0)POL$KO*mG9uYNvE!Rjxq_=bWO(Ee-L97c?CDA2R z&-tzMj~c%&i9uG*1}|A3QPv_rL=1Wo5*G;r>hVsl`=g7ToE%1VD8I0`VFQXaY1c*L z4|uFUj7fru-_Y#u;|0U9(u6JhtQzcV5O!OpFR7o8ENe5Wo($9bSi}b(zv2DAgt5r( zMmT(e1dTStFdFW5Md!P;Th5K7H_u}G&h7kI#mh&F${#9H0k4Dm<(+=#wUb6w2>q|9 zUmZi*o$9vsE@zCP#%zqn@K0nQ@EHZ*iAKGMNOd*mSvTr2_Wp#oNCoD<^F4kcK@xz^ z+A^QTp$U<}pr%6$Dx8)ffth-FZ>%kqq)Kt+PKl4X_qr%DPn(`bUg;a$%>ZZ=<3u81 zfc5(=$#RkxHi58KTJ4o2BIFO@0?)69`Qplvl&y}{o)Z8c$KrLr;<|{2SvyAe{d}MV zo?dVLOy8eH6oa0qBOZQr6(sstQd114K`eWPZd#5&Hc$;aqnf7TJ$(;(|H&2fhR|#E z0S3>#Iw1ugf`+YcCNp5s3p$)?_-d`XU?M(|LZ+kUXF#YdTB^Z6Hz3^%(435L|fmn$Fc9B`a_$)DXcN5CU+5kp=u1t52 zIXWl*2_NW>8T8<{w#r32Mi=8xY^=RyRV`_c)$n(u(n;ff%T!fS3g01NaM9zw2BZM-p7p?YckH4* zSwbiJW}J}5;3y*N&T9uFAQf;tQ?^Ex!q1Wt;CQ!#|LK{{+QBYodwi*wCyB(4SC9S2~&Ic+5ZsMKndN zPOOMU1zo)yJUh1Z+8D-OeF6IQ2sR8Ua-5q}e!bm%R#-pu0XA$RQJBKE z5W*}riCygs`#t!gbvG>{J_U{-^D{_nOVJz1&(=u;f7hK${DA@#peOwhxP5Se3TX2{QFxF=eTQ{@%3i^zi1Qe?tK8Prl{tn1 z4~2+_pICLGocP&K6E>+vfp!;<4KJEj_2)wXe_bu)Ms#+8TMTJxQ6^)<;v1kU-_y!BF5{n8#3R_DYWF{9Ws}6`lvDBa zXGBz3&sp_lU-Qc=(zq~fzB7}xsb5iF5N#t97;}2yi7eA1*%=+d`bp|k^3Gg{%!*yV z#7XNt^&du6;gmuGI~AC*P&JuKlG?_y95#wlqA9c4u4?9e1wDyyozmG}_E_q0u&uQoddg^q(T%mI8xD@6AA9ZwPtciwRSC)8 zoNWl`iFOAjo`MC7ngWA;a25Fga-4J~AWR($`}7V@*GNot+B3utBjt6o{rUvGlOVGT1)7}`Kc32?FML2 zzuM*BaR=w03~;NeAhz8dG`b*oxFkS`APGDL#_24ph5ZRw2l-n;U1K--@%r=o^3pX+ zmn0ja7gY@e7u$U|(6mvBjeC}l2iRmKTm2cnu#>*RJQfFuFzT`_ad-q&<9)Q5KoqP9 zCCW5uU8_+No=O(>sM3QVG^4^cR$j_<@!zBVOSY2tX7D3opGS{uf2JLr%;!lu=xF(7 z`egrd%RaKn9G5LMuN1GU6L1hU^Ys#o*+@X%Pz_uPru@SyAkN~;L@wwtDRDA=bWJgN zIr303B@Nw>qM9n?B%xv6nkoavjWyX@`s7!gC2p`4NZHFS8j~fo*>99>!m_y;l|A6^ zNnPjhn0ju?gjD3A;h52+DCBe%fVYHAsX_p?pM#+Y9xv^G%J(y?;fD(99~N2S$4djS z>a;ZAN>UWCG)hUN9>zG?j`5lF8|?a`Dq_j8(mP&Z-AYpbH1<}wijuYnEeO|u9i;uga{{?E(CRUS{+g?SZc<6G z5MnXGw?%_8iefO*fRZ#yub6jmC~NH3=wf=~7U?HpQqUX!%+&x7siZ9eih)TaS4;-A zcW8r4W@uLBd3~{3MBE}FPWhIt^9sdNKD0Sjw{ob4hjoe0pFE6;vTtpOcUM04_+?z< zpoR`zPYEm;ZKa^bfSIptw2|w=G!vu@$}DjC{eOUgOxc0WV-q*IZJgLPpG$EHtIcJb zp>^imaRj277NIZw`q6S(s?ICU0c9#|{&rPO>Tem35e(fy&vC4SF3FM*x3OpAav9Ok zRZI;4fD1TdHD}5hdoNhCi9lH%P&bfx2`>jtCogNe*uYG#qg*w z{}f#RQ7oaL`M@3+#NP?ZgY;~ppqhKs#3U#Dn~0+prF!vlUhR|>O1MrDTWlo z(T>rW6cwaGfPCG?1aKDhD5zH(N8O>gZ8)c}?e{Jy$15nfC2+0LZq8F{c|iTXaFOfg z2|4rPLa6${bN-vUfH=-Wk;t{n*8mLL4Nl~*NA;?I3ki!WyMr6x)p`uU#I%1T+$QhA zbcrSJkJJ@LS`@>ce~3{skcyLT@5|@}g1P=_m!oh}hGu`#|EOOnuhJv-I9h4gx*f9W z1eNC*9zN8}J@&!pt+cj5h35N51^uJbIy3e^5??Ez{v#fe+_au25#(;=^N!u5DDf{R zSS|#u#47P+@lao4sjMewqHp0Vk}wSpYG-E`()4n52c6Fm0mEMu|4CdnjD$*pj))2t zE_pa5W$-Uj211(R2j{2GtShp`a)F}6Y<;S09IKc&0_`1>4Zjh@B)6)Tq__S`_~$RC z+V4JYRe7;7>{L-l7YpXqDT$hEX7diA#?G25?M15;|1QyERmc5DYWO)I>ZjpcYaK2X8&y4?(uHum{+$Q+haYGUW zf*-ydD&eBK(}7jALQ0hIakM2Lzx#E;&wF*_{!2s}REPV6DC_?pWk=+u$00pAANmRc z1dh`IgQB+Q?kP2P!nFJDmnwozS@u(NXULb|-4E`ZJ(x3DdnHM0J$ih)w~c*?x0Y8f ze~;E?1tH_tilBfROY9hxVAKINSrk=BF(sh-zP+f1(p7Vpz2exv*7D!M>LIYyaze1w z0%>uyj6zGe&)Q3QmN%xDzy!x>4<9b8rOkbHweQ#ZOf4!E>u2TMbkSOVmAP1GPlbnt z$KwO+djz{rEb5|IXTGH1Z|X57{+=?l4$`L3ZW(0cq7BV2^pIjSSfZz;G2j>)Q6y3| zFKP#nS*VQ}Fkhnn1swIkC353+L~=24duYc`_3weV?~LCv3-3Fxjjp8{XGq)?cb>0E z4I;I5K21&414Q(9qBWnS?WQ88(SKIF`)%8mowtc0WwmvWcMen9wwec@Y{(Azi z)@TS8r=_8iL?0xogh7$5^irRyhPqK)I8|)XbbkwXV_Y$a@ETHFXw9($hRU++;1KN6 zSL9Wi#U8D$=Q04@I(7@0Q*R>3%7p`0lZ_LVE9jNF;R_!Hgn=EeNBBb6)oT^X!!h2fJ`hqcH?d8CSY1bdfiM)}w zqK5dln3ET3h~)kD#U!|$q+)*+s#y4-FVk_}4n}k-X<$V#7DbM!E?6_GIwH*flovu6 zA7~2E9s71BD%&Oqr>KiE1D!?6k=Hl>8#!+;WW{v;wUBO+OcBE zTd^+O6aiOpug4-#8Nl~2^hEG5G>I&nx3-}~P7qz`Od;CC@^!bM`4@!w}r@iB}%5ipEQA^|Sx#KNx7hK6HmCzW<}G@1kjb>#oCm~JT%-uFNznT>xF3!c1*-=2l`ey80@A_+fXeS2ZS7Q_*izpqc_pJ*w zBk@XYP*nSoS)a2v_o&qKa6PS=A04#fX#cG89IaGo1ZG$s?9MnT-c)xNXH#r~gPs(i z{@N&tJ=KM2bA5qE|MCyxK5q95T$uL@i1?(|BP3HpAjp%BTXZ@~Sh!Br@wz#Ouf!>F zkie3OO@xmRcuAmXB{goCcB5G?N`1!u`CEIkSF%R2b$^APld(1puHwSGHy7oUQh(1; zi<#!nawgxzOVLH{9p~K2 zXHu*84CD1frBrWyYPsnF$k$+J&rbhm&^kYh_=rN9`>=k8ru&7+uw=dx*3@1DhQG{h z=o=&=YCKCm_8~xJbl`(MB##7tB#^^lPdYSPaA*!l-WVQ8fd~34O>vDbhj20+fn4t_ zyt6Vgkn0Vr^FP-+E2SHDg*S5?qqdY;5uDc82JsonArf zMGuorO*w!(v((spPvTmLK+s*V1-0h4#K66)!rT4LMmyaRp*W)1cF}k|4i}MMnum3i z^)_soyNj~3fkt{8&Sxz3Hf>zX=lj>$lKLNJ?%Ud3kTBiu2G-+4;;>CT=mD!iv#e>3 zcw3`&6%!$Mi-hbSr;A|H?Vqkk5HprS=;%ur+i?Nh-ERkNb^B=1{Gov{^xUn1OKq_p z#P;Z&mIe>sK-Zq|&(6j!CDoGfwIh>YF`5f_w!p3jGXfl>r0RKT3qeW zmoJOJ`CNaPeJk!#?l`%k#^|hk-!f}X_ex5Uf4+6@Pz!pa2lbB58;=6}x78iJ$oNUg1Y*69nAf6jB+T`_nHhys z(L~;F35P6xxB}YVI(gcFnyrTGWFh`|ks5F1rusM7!gwR|g{Cx{T~vsLi}4ks z6R7EIf@rO7eEr&Cgb)i%yL;+uW`OS>Bk@-+J!?ArAMtf;ww|P1w^-rfZKi|ARZ}Em|-NPw#^>hP+EJMp+H{pHV1Uy-TS!b zRN8XdImDw4BJBUQ4)qAkZ)DIxU-|f?_6bbAeE<|=zVH&wn~d=UO>|b#3xtE+UOxv+ z`3v>=oY+3Oyj&b!F5_)cVhD)c#rU^~7J zk@h#Ji)K~`(i7> zy=~IbLZJn>;h1ps4r^MifInp{IqwV)`LU3S*#%vA>bd7pdv5aN=FqU7ar*px-}m|5 z44O}hw+qlU+Lii2sWY*?ePQ1e9%cg;{Mso}3l*ID3#b@R_zmO{-=zS<7iSM%k0N8f z-&(4NA64=Z2VC{9*TeE;nM8N7VN@{#X_K?EO$?3=DT2W4 z$!7gEzJSql)G4&NZ;_nHx4StV`)!!3zBXA&R%pnTs;p7YYE`N-_1>0zAm;^RRz zTdfeDQwV^&N;S=MfyV%4QNi{p<}r~B|EYjg-62qH*7hjH@2Sw7U|eNgL0f-)fiuLu zX9hb<)GVxY3LB-Os-~n_T=V;v)KQ1-H6;7X|8+uDGTP7Iz$U+}6Wbo~$X*aRp6xI9 zk$oRf;QxlDl90A=G&&ZRSs}1#^cBA=1@-~>yH-3QJpgIN3$HmNy<5bSAHFHxSTVP} zeT=@tD$9G@P(!V;Us3aS_8B$BAY44LDzYlMsjAe8Y-|mL`vStS&HuV}RvNmkKK0u` zBck?MO|jq$xAUyndy#XU>g%ewr;wBMNc;3HItos`i1U{Y$;SGw_zwUu10sGW#0hA~ zI}hBbr3!>+ZTgRWDX^x0*F`2oVu|!*9nRYs_1##7Rxu{u6k_1&B`14ZQcaq4;PAu8 z>f&{LF0wZmy{|$QNaoia^+^F83My!;-&A^Y{WMt|c1fc4Q}abqDZBB6_!E*}Y`_cz zPxQAHet^n4D0t#+fPo`qs})cG`vKVLLroJ}jqh$Ng!djC&APkbW~vsKOV4(@Z7epd z^d+K2ppg`+kS8B1cD?u9J`cG5mn47{y%O|ehJWq8iyPL9qoWS>@#(1?Wb?Bf?p2=b zU16CNyP~fhKVe!Q*F8>No#HlZFmeVcBkXs%l}u45o2Sbt>89khGx@nU&w7yOWUmH( z|JOY!4SLcT@Xa_5%){;{ItjU|Y(jlDcL_PQeDXWR(w{9q>6MGlr`{CG`@do$wn!c} z8%Pg3n@BF)#C-YiriO{9v@+1B4C@R2gzAX$HO4*0huf*O(=`Gh>2b};j8ZFi)xx;F zNPm`IST=8QMJA%bysOkLl3?A%OMfTuA-HlaB{=R6OJ+QUD(#T&jyQ?c;=@3ln;1&M zQQ~4fk%TBQH=a(-4Qh5y@coAsnGQ5srKqK1foYS`YH^yV7xtl5@C z);v;89N=|-aGK(<#*at6Nius#IF+3+d3qYTCTi|uZStMd3{WOeH@`&@?_v9Gnb-Qq zcQX0m^d+KJ6PjfpW7_JX<^9#@*gKlV_y3QotB$Io>-vZw0s_(@rF3_9cXxwyOE-f` zN=Y|JcQ;6PcV0reyW_%lAAKL6_5E?zoHc9iIy3w1v-7w2>3VkCju$#Xc#^SH0IUNa zT$??7J+CMQ3N;ku*mla7-}b;=HP~D6f{@AXZ!-8vt|Ifdd5ZzClX>^DQzi%2#XbZW zRlizBB=FPXdA)e--eA>j9+c4aI`sas=J~wysp7@6b#_|~c6&<`h@?8m1Kjw4H}Z_X zl(jPKeq4oE@w1d&uHUr$*{;RIInTSnYn7|R!ZBjE*OPmMCeG-XSN~H@-fcb#sLCLthXSEl5(A(5 zA#Rgum!kZqg30<_s`BTxSOk2@LPd{W%{ayB8W@W~iyg`HEWw;^m}*^if)|f4(D|x= zsXzklpiF(rrc5pT)mb{|XXr`{KJoVuD$KP|ul;+KD9>dz<6*cprUQiME==U`ub??H zd@N;);XKdNEa7i!+g2!qN=Syh|i0zaM&=($Av`_Xo&W!#Z% zC=Jzk|M~>$&=Q!D<(c15Ak)I4tDT{?IZs6@4vg-Xu_OdO88ASr5X}YDz4`MNMRDJK*1Ghkb z?XLbe1b6JMf!;ij5Erg|tbLI0&4FODg|ny+=4DrwCEBSxeKNx$&-n9}!ja~1q4oH& zW6DYo3*eRD<|EXVH+lEN$tWXmzCMp>CMhMJjU|{fOWY-tgbDR9m_H07^%H@OD)_Ac zM@pm-my^yC_YcmS7+hLT6u^k-Aryo#`kR~Mh7CKowi%OPoo5luJqFJ4)m)U{59SDZ zs41xy#l~_DeWFGaNb2CW{u}ZX1!CgL+&+<4s3H<@Zb)`4m`f6Mg~9YaEy&2=$n*zbQve)!u1G zYpDFXKgWYkTASVb2adRE3{Ny>W-wds(v_V64Kr|07ic>9hjPF_MXnh5Nvy4bvfPlE zKb35(l!PuXtrDS*^QtJWn+vRLC3*g7`yFzWpCLEYg@w(&*+ zPk}y9Wykr-;4@GV#K2;of z@W&pdC{q|Jaf~e(4a~7eR%n?nA>dzF#QX5K5_s}u?~x$fDnqJ-<%K zzD2b!^1+`mSw)<1QJR`I8k966pj&VppJ0k&nL+oZ#^Dcof$2}A1cUha0KBF>{x6uI`YYILfUUa) z;ei}bOjicCG`()elO2Ici;m(h<|j+I*{eW!lES)v!RUR4+sPH zteV=Ujf3Y1h;3ot+PP)_vS#-DkswH}F9MEypRo&@2=_!`wRN{uTg6tJ;jmhO zuyrHzW#;pJBm;q&1x|-^=kV}cMtIYwJUtFhZfarsch(jxJHyN4_+ly`2$2LN<~^qDM}9 z_=;QTl4dSGm*duMCoMGAY1kxX+KaI}z z<#K%;(Ur}f`|KF%AC~PQVABO6!2Ke_JiZut`I}^DtR%ToHny1RHUegeBx>1IiR?j5 zROr12TztrXL6{W>ldMfV<_SnX@h6KCIo|#9v(t0e&FJS4y%F3V@A1}m`=Nlm7XKpd z7L{r1GNMH#dFvX+ag#wWYr+X!)c}*ZEnqlfaqA;y67?NaB>qRn3>wZ*epbsS{ef3Y z?JzCL_m(bcy-qXbXg`I5+s|5gszs2imjj(&uL)Q z2hF16;CvVY+#(^(1_V;P-C$W#$42U<;XJI`BolTxZM z|BJF8R-koU>B(INdKh0kr!b0lv)5gmk1>3%Bs@WkT_V_>Pl&9SNl2Ru>%_z~*$O@8 z#BS8FS58n4*(U+_c}RP7rEDvxFMNeFq58&ZwZ?aGWV5yO+0=En8tzJq&)sfcZ`eBW zM?L797(6Y2MTQ*$xnhx3XvV^HXO$T0sVnyBdPjFovv6zky*koDsTa2DU7z%UDkt9d8z5l++ESI9HoL+^-B2}?! zVN^@@mzkKgC2Xb2GV377h@BW&Rh>YF6%C(EslkWuh7^jVuW+0}S3aHOX6{viWjvQk z$eycH5w8yuw012u=^Y@)qcjI?MWK$7bROH&ME+UQ<{)4z3Ic%l5hT=tptU+*cYaeA zHAR0jO!I{`Dxn4qc8nTm!v4G!^;gZ0AFD_ZCh3b1Ld4SGF$5!W$nWiNM3p!UpN#88 z(KP}uCl2ZVn-x1Dl03*7d*Ix zCszpzir6FT64x}UblVnq`HPfK#6aF{W$-4Ct0`!o<~1MdB@179Jw1QRlt%SYKW z`{}1O%4^#u@lOAPBxhjhS9DsOdTj_nQ1D>L#=veF0sBTN4cCfgZ*yBse&t&0Iu-5C zo3^UgA()bq8XrY9N0anPcVvyY%n^pTru7ddQ1K@%<<#ff1tbVHxz|F%E zH%`k;DVaWQFDM*v!MRt=9*ciHVCiY6NgA+~vW89AMOPnZ|C^B1_3h^)tUo3m!7ZgD z`Fc7E+`mi~1e*Kn5#UvGhl`@6MK8Yu6;LY2Ug#1JBb1DkC`#XP_)*a+{!i%vkb3gN zz1ON!)~{6|JGF90^t09Nx**X4$55L~2ay#uX3Bc|Y!Fu}dibSbC%bymucLP1>EMUg z#r2aQ1f@SBG0O10RdVNwyx_d0le!Xm6K{$CpsXOFVd}Bc>;H;dE3>!e(x@QrpvDBwji~j)~!#Yr5g7Gk9 zoKx}bKmBy(m%T1qp1BU$Kz%RK)l%0&0isfn2-3~EPr}#59^D6mAY1k1yt*hsD;=~% z@2D788#Z!J=OfN1?uQfes}i#~&qct7JC}{3iKk5p?s%u$*{dn3O`kKzHS4lbDr^9k zAb8o~LpRe)kKJ)y`?Hna+GZIdY@J^Aj6^ptk)e3u`Axx z4(Bd^uCq~tO3BQp($0CRlqJjhDk`zN*TPKwbRB<%LqWq%ME7R-=oxaJT8_z84|ph5 z`C`E(6sb>7DEIs0j^1!RK?ejF`#Qfukh4XSIJFac4Fl_S{)^9yJ+v|^WJ=V<7!!G) zO*4Hc{JCgUw6LgO+;inr2;%r-0sjjdIW&;Gl`nt)7UH7!t)atquJO3v+{_6)Ii48B zlTTVm`{976`h3T*||Q04b0-rJh9Kfkv9VM&sIg4S4U*@jxWJ7 zuV~4T+h%cIHI~NW{9Y|wn0U1Oidar0$&jmShJj*M2^TV|$#Ou6SPEVYvsc%ogtYe3 z`bb$*`pv(|#BiMMD75^!?`T1v!fp)3>qT6#vxhrhYmgDuyqxoy6^FHP zJhkaySqX+(5y1YZ&VAaZZBJ);gx|Hzcj<8Mswq|usMZ7R-G}yq`mEPeeQAP*$^(gf z!s1rd0i{0~7jbV1&86(r~k7q zXxuPr_t-FMA+}B(b^1Tx5LN!wZ&y=`FhxDGn>xHzdepLtiqdEN#ROW(e> z!MQ z-hGWiyHKp?=DHme`4ig#>T|P*P0VRoQ$dv5CF`2`OA2XD{K48BM9)ejqA|bsz=w3* zdF&tcGh4qY@<9Xw>V9MN9!2CIQ1>DW_B6~DL>=!i6_zM!M@xsW+J5xZ5ByOfj``Q- zWb)5e%AFf82z+I!x53_7-uAkM@(%Z7mN**(yhtu^`Q*{I5O*$Q8~M@Ecj^mlI_k|k zeeXS6*!16y3SgyO(H`?kHMK4DwM^Ug&5<=bT5-aTWufrRcZ%Hg5@kviPO+L%8Pd>i zAJWlBO_iiu1aG;Z)U*C$1msV#1($fz(-3in&!`lFch($({NnJDXlJnD!O6h+Sy5~} zco=l(D$vu;Jr>-DJ6e=kKjZO7diMbB+zR*QKQ5-*m}CY-BjA@rPxbTdWh$LNcc|KlAPlkc;2VMmUXJs&`NP?=u{@z+$9 zRuiCWhT@+2eZY?aSuy>Q(`<%xvbtUr26a=Sg0Xks7o^;b zDAyeoHX?Zty3LaEmdV24E zw(>@WZzf(ZZ^PqnJ>g5;;KG2`zXdkl; zXu!Z)pA7Z?=c23`Eb~%WmmHJ4<~u-{s}_FQWn4g6j8^!wU@}W`u;?@>kczhZKd&&< zkEA#Li}zcYDxvpH1p@ zOjGqYQ@g)ZYirzL<26LvbcaUHr?03}{;~1#Um}W8(PHERFETBXO{KCLM3u>KCPdL< z=fn!1DPrI?MiMs5No9;O|1|E%im)_4E;VP^nfhXwv>g$v1Ot6c6yooI_~`} ztKRC75BBv3gIkG8UupVO@YC#EwVOe*Zh#uwP z!0h29@*z~PyB4zTqj2l8)HY+Os87qF4I8Kjy^JDX_|Et7IthxR9eO+%8?ytx9@Fm+ z-$U*wA|MJ{3Ib5tRWKLSG)e9kkw z_E4&iqhB+1OLA|_5m%o4e0M%$!#Sh%YnSWvG8sWAYy4;TMV>u94dWm#m7>arf_}t! z)3~-bBmrU-eq2cAcPlf@s5$wc;c&YW#aeAGnf#CM z2^N)dn(pCC<#M8nz7Sz+=%Ao&A~X&v6VmsbbK(II%)m!RZML3ghrY{cwg*pd(Z7n# zqN2S2xo1+3sr4rqTG{o%I?%`%#Uf$q=QM|2Q67>-xJ4)Y;Q6=rshF_EG*Q)qM6PBP zuDE}d5^i(0p4r?uJ;ZWhxei&}I_()l<|3+x=S>yivV|rH+AhG5Vlb7e8U?BcYCxAe z*f-DKZL2m{y*o3q&vP?3Oxf@tNcHboy+ium4wj=24ld34hNG={L8nZJ&KZLm~<&p##|~I>Qs%VU#wp-2mW$K zFc-cUGX(1ia6y8OPO_?`K_|cT-o-V%n?df6#3N6rVsHD_91F?iAhO_zzr_{ z3rNrJ*OR~~Pd+!od-$Oj)1K5JA#@8Y4(TYJm=qkGWlj@QVemcky`i?Zec>OpqK*}F zE{3+(?qcqT?klwgd~c0Z3L(dXoH(`s^$V>!_HGXxDSc_Z^{Dmsonouc7)nxrllM-w zT?)(L1D31}oI$tdBR|4gn&00;f`lI2V-+2b8ckcDaW)lOjGn`5|Uh82vd z{xF)kJ&H(slXWiBZ00A=|^tgbqC~v$I)%9G!Dd__o-K<279k~bF zwAdm;eRYBY=Eb<6G7W&GlMGkD6MQc;aI~RO_GV4x#=cy@w#dBYy)XEZm}ugDYU=BK zjvV2@{?xt0vLu>f<3y{u2;2FKfhyJJW$Q8B)&u*=dSxy@3y4NuSKs~=z8@UN#VBcE$`5vW##^VIvK^4> zi-enV5KrWsZnREFDOY2LXqJM(;-La1(<|9^ekh>LYh^;cp1{*Y6~^ zQXn8`&st%>#WoAcm2Jubku1EwoJOMaD9_-nWiD<-;uJ!twHr<*YPn zwn7prn#&SP-ymO|6M-y+S{QF)PTWw~=t^p37VYo&Y_Ni;a%2+B6ZBC}lct5?87ylF zyv&@qh<_RWPEej1D^$Ao+r{TjwQCaZAMM2Ni70vD1V6l!%lbkBCNq+WUt4OiDM5ErX4TJ`NM%2t zDeH@x?A=&a3mJm0miGuv2|3<3Qn5~k(7en4(#Yx)>*`g5@y4#?f?!zd#mxin==?G5 zVH#5Yg3pzIa=;$oiJ1@g4t!0t`y*w>K~8Ht#0lXWKA)KEqXr@#wA9f+8T=*s1T3+| zsz$kiN>AH4LL_f`i<+-Xv`qkmQr)FOt($QM&)8AYY5xE8IsdtZpno@0=v{Gr@^ z;6)r#D)fKBNnTV6*jTY#zg~|IYr4a)6-XH+`_V%r#o0_NZLnVctd&YMa+zg{2tSDC z1>D?zMkv?2>FM^SH^0H0A0s57$7gqZX;n?*#v{|Ub{Zw9u!6JUlv-xTzKE0v{*Xbm zczUaN=A;SYamjq()bVXSh`fqSnE8RW=;-opHj%(i&mP0_X$Sk{WVH>NVfu-ymSWw9 zf1vP%fq29BIlfJPaAo?pTmr&5rSehDdLS1}8~&-7;39!Y|FLT2IAg2p5KhZ?I%c88 z+myfLSlVYt&K3>uWqSv{Dxo{z^(wz^rf>RqFwUf-9wF|H`!eHWA}fnkA#aDUM5{1*-Apk2o zT?Pjvsf3HRmix$7n_krnyCo>SBw4TOTG=F}=j!YI59$M5U#3wrr#G(~;y<-~e!nRN{!V2c9VgjeC8#=4LZvhI zmX0P0QXDD_1?Tgr<;A~tEnu;!&3*MsQ?=zY=NxnDEzz3xt5@)i@oQZ8J&SNTNQCM& zkJ7Rl$?^NirN^l6?|p)UJ>QHEzVMGTB)W8O{KgC87(kzXWn1xTzO#6Kbdj2*=ZC%x z5lwQ#O5@F3{yYJ^TSP{hORQ~Xe(XF>S{tGkurwk4U{HfTH+4HTdj8n0xQ?yRnoPJ2WZw-5$&5btzz#U=Bw@9#C z3?9F$7O2AuUnp0))`35adqg~7+xM;j&EDaRIy6-1tL~6o9^3|~fj9Pq3=l9K>*=GY z&MSFJO67#!N(#KZ2?O2<^PAG3lNocZ3zwJ1Qnl1oe-P1C*AllZoP_ST^&2w%o8<2@ zjpNy3c2{i-D==kaRh_PaSmzZbfjdw|IJ9~qro1Pqr?v3OFgG_Mbb`%vAcQ_nwP8rMpWiN@r!_dGkU0KAg2* z?|r1z4$74M54dAWx?rumkyr2LFXVs+a2ny82^WvvtWZsC%=4`X!rk_*7e3#O<049X zJun=AnyR#GhQPbwuOcJOU0hjo#KyVgc#QX(w7B>b*HaCTB))FQwH-Q+z92`+E-qwV zIA0~M*zs~>6rVsiUW4!6CGy{FkB~f410XHoazBiGldXW3(wz-n&x?~yCoL$fiiXq} zq6^-^BF|~R_zMsk{i0$WATgsI;sjuQx#Itr8UPW>=I?poygu<|d*!Z;^pY1hs4OW&~lAP1scTe$mkya3j+59v{IVI7}d50m0^7Fph$>kN< zK$HD!xe_k_{+*-iTn6n`Yp>8%QdqQ}SR1LMo5o7Xu*ia2itv(tnZ1^?z9z77^LXt= z^h>s{;D(j&DTUB7Hr|9HCUKx@*m9m%a&f|y@kf$<)W-Ym)`%(eEU>*X) z`G*TGh0lv>B}b(+RLXJP!GOAQW(loRH+6E{&$nDNNU;R__gN4-_2fQsoKRjl+p95`hBCgV_Pzs)`q-E!e_fmS{S-O#2@IS*H zxXCRB6=T!$?~Wwox{pKAc$50(=5CHW9w{)a@b)ju$Mo9)?0^j#{;D1Sz}3cK{>X(d z_%>4xl_lUC@^Q>rM3b6V>!U15EAHvoD}(6j&-I7{<2+8Q7e90oHd?Rx#I9j>4zECM zntIv(xNWxZEXWCr8`yD-h+uA42(rDXmaJ+bA0^|uK#p!=2(v=GLv7Oihjg+m27@K2 zL8LNI?#BwSpPwacSyq3IW2}tn3nmXL&iPxAnaws>7~Pv)l+#nHv^J@2yRUDoN6JH~ z_GqnUSTU}Rd3y)xx};;ChKJl$7w8{Xo&ruN?MkhbM=3iRWPIbEHM+KLjH*D{xo@xI z{pNQNxRj8dzZY_sSJ9ic2eXHI>ou^!EP@dVZCXXIDCM9$!P=*lekX@U&;ROg5LkAS zioZ8o+N~$aq+xafmmC*|)+D;4@v`rvjvW(21(z(DXUJ7Cc3DC*OvIV-&Oxgzvk)lf zFV3UiKYXgz73lv6{(+si0N4=D*wvMp>s)1)Zk(Q)lK;~SG?x}2^p*-(^(Xwgx^OXa zB5C9Jc#FKyK!L#An!F(Q^+B*t{=TAf^AHRHYK45bypk-rNMtTP!G)(Ipo=1?3c2vU zn4`ISxE7>{Rboew66~{FhHL{lD|wjD%zW3*82l~JC?muEJV;H=C%a?Ij5iq5PA?%f zKK)IzFg|p|CoRC;@{Dy&>UMo;Qtw)_SQ7W(TE)>WAb4=&cXv zl==SZ{-2^=GzvnV`Hws0gakK&XRbxa zQFRGfL8N6=_rb|v8nmTX-0N(joF(-D-3!>?NoQA-`p?^+#K;K?`bDF^oaMFFl_a`q z;*Kh*o5O^}#?fww2{8l4oX8p`|8-V#JyA7TpDXUiz}x3-ZYyC{IjtK6-&ZHoZQ0E| z?kqcu#P322ip-UQ;cO5Z&c3$h4i!i}IEih*Z25yd?udyXU~GWrLESd_6=4+>V;+(7 z0%^5x65q*eB#~J*d_qc}CwR?+CI!vJ*DTm#gl~6vlN0->a%WnHUD_@Zvvb!MR~)bpvIv(4qA@ddOr;MZ)$ zkmU8w7aF0z8<%8ts1T;7Tmzn(b=sqK&J;6KSm0S^V}cbf+`jGr+!Tva{Xl;>d&~UN z2RJYIAhZLW^vpSC8j76}L}c=CV5e?ubY`i|!{X2SiB(tqg0Oo>T-U6yel?Xa<4Yv` z#CSdK!I46%xmUr`r%M}S8Kuj5du`LSBIRRlyyI-Lq?tBj5Dps)#lpu5TxzUw_f%u zY`X~Pam>;OP4T$8NLAF0uwDno8T%l&pzbi4tkOBk>u!6U!;r3?^joo>^uzYnIHIzj z-7n)38l)XM!~z;9NhisJmEx@>h&8l2spCV@3SJDX4a)qDfLLs~Q8SzY2Wt8VNG>ab zfEH|CaHHmsG_wdx;`(O|{!tBX$6@dgyQ<#0-e!(4mIr7Z=XZ3&Dhk&o>Ql!zNFVu; zpQ@PKRl=B~oLMd(qDV1Fl6D$5lS%@hF4I4CApC3NS(rr0cOVd|RS5GGRp02{pG&2@ z$q&ykipfkO0JdQ?P2JhA1*>L$aru5_SKxPMu@%Zcrd;6Gbv@#B$D&yqovE4h)m4d6BVc;J2aG8_uM@^jK@2%)`fFkgHx)z*HXp9ZE|>$7MM_n z134Jq7B~mnqDqOIb{wWtS1S$gLiLv zF2@hwNhkt7d`kdel#aT0`C@V;&2j|8eo<2m))0rZ;YIm5ZT{`~hZ@5P`NKbloJe(Q zv6(YUS(pitha`sYVZVTI^1n(HpTS9q-URlh^ zNYAb0lh((uU^ldXUKzB@X=$$X;^BJr>S93xpbo(hE6wlslrdujhSTt$J*z3{9HMl+ zXFt5w$)S`p-Uv>zHB;RBaQioUPQlEATW%C<(1uzpz{BW-fs+>p)2FvrWSlg)0x@Fn1&rB2Dw z=?yK?>GhIOm#|a`VYhr_&z0aGW&N`2rxc+i^uc)3I!U}xB`@lrzs7B5V<+KY94UGjXLLQ=e4^eFfCpzbJEisFwpFpZxu){*dt;0fb3?P!#0x!S# ziLn$c`rgN8^3|a)`9$ps425kDrzJ@(sjaG<;yG!VRy|&*7RFtwnp#Hd1b%>lE8QKvW>S_|Y`Yd&ia8oDC(>Et@U>qKZyX^?2%;#HMlLu0WD25s zuH4t32g_zz!%+e1H+h=NDcaL5eHHK#zV9mS=m=d@e6_3WEP6|jn$B>i2bkWz=aZ~# z!v1$bg^CKjR481^4~SdxTjwBOPV8bYh$5d+m9|L_mWp}EXe%_oIgnYF`TF2?6|k~- z<2eF&-JB6^*&C<_B>*wj{wxTR){7I5PksTyfD}=9@28esRuri-S9)@{*HHZGQm>mc zq?}6=I;1->Xy8>sqbuZ#8!lM+FV;mXcIRPa@w@zH^y5TJ3tG7I;{2)9(S-lEC~Kyy zWJdcrq|R5&H`8d^US?O!$Sq7CPkqGdJ8E(2U(O@kjowf?ippyHxubC&FaIt+*0iPF83n%iLn`?Yu4ZS1FdJGd= z(ae{d@0I9~HgNV040^xelEm0nNHd1wegOC7pTE7Hc#(~t{YBJCpbKF0AZg40IWapg z=G(i-l9J(I;djo0NVf5u0UmlJ7<~-=T6xqV|D@US;h#C;p2XN?Z?QvOKQl{+RpN({D@@geZeRZ4cC^Y z}!2(!c33U06@Y*e>Eg{c~CAXPWqM0pDl+&^9-Nh9zIT`k|)M6N|a+ zr+K^O_uzpUf+a4Txt7S9#W}C!{|N4Avi4GZs&-93S*0m2- zzNIdlEpDHh=mVreJK%qEwkyNp+`w1iuDq0q18^)poLdR?m0>SB3k%0;?bJ|*W-Nl0 zbE)R!7`;~wpH+eWb(&B^XagFR;zGPe^lPzgF*VI^NUo9y!*3#!XXo?IcVW7 zrGXbM21^z82?wU7F~(5XOXF4d`z8axG4T9gb#e0i007U0b}jW=AhlYA*1t{~0-jy0*%#=WUhtb!Hc6s%jvi!=q?Mr`mbTWo1M4Non$+ z{L2>4(=`{5>5Co^ws^WwANeW55Jp#`KI&5Fx#h!Y&ql!HJoEu*#K)7_0-caG{*;-T z=yTa>cdoabMk1tbdOw>M?ftGKBkv;2&Wovhr5u@)9?;vFtFRzgc^=iAxA{q;-h6po zg=Sfl6?_u;EEtdfqCRWPDw;P574N9@2VDASK-dOxkYCxI-X)pKgUh|mhxM~l%KgoY zFFX`WU5wYHC_xLrW~CG%K843=N;EI0{P{1=fv-Bzy#5UPlf}^LZd1Mn{k5h`k<{d! z6J`{zaEfXoL_?L2;4w>xL*bKStQqMK89k7Xjik zM|G0J6hkDXR@&Caq&^>N8lnGvq zCF^#Gf7=IW2`@#HO`o_lrO9_gew|r%#a)9{&j!n8eb}a;V7z|vPw{X66{J(K@nqd6 zNn|G0!?wvyY&`udi0cTieJmR_iT0yHR<1HF`_H?Yi7o`3pI0A@`ft80KHC(_J=|^N zuRfjng1r$Ac5mADn=8c@vMwT_5}NMc0N6FxVKqOgz51NfbUf_S zHl=ReUMoz07-9FPGhos_aWvU7K|Jb2U2bv z_+Ku^hLgX`Gb2t7XO|dS4SUB>^p)FWJ(g_pC<*7}T6XxPPS&^Hc%MV|@{ND>1TnW^ ztg-6%{>0BUHmts5Hmnc^XBjWmvbfe?B95NAra$kMo-%IQy~S_Z)t|lI58~P}V(=a= z-YL9D(5FjJP`=X5e4~*+)wRiP1Dx4;CArNpaO-|FyjhJLIfuN@ahv_%c?^=u(>wFK z5!6f$ysug%sA^qV71Ua49At>aoL0p@N_jWi9O8-ow=g5%`thpAZocYAn{ci>d+SJ> zC(uf0%A;GoXB?MfbqdUV`$WU~RUhw9lQ8rA?50A4%b2I75rhK;fWh8W;$9{PxIf)G zy5d+?!)cXnZdF|Q#y*RmFbA!}#@QaQ!u?EVps<-NyKbo6tbiUlLYsQyuszi+mlRNC z)R`|OdRxP#{bWWm_#>r9dHaIgP-)89dh+aoS&h7qCXhf*5Xr;uPq&@%|I}A)+wo9$7P2t!8Q0JW(v#6C;2!Q z{-)K((oC-P>HhqBEy4BbY)ZjE-9AITT7KMj6wJpfx6``3`>wNjKVFrkJF~8T`zkNA zqBhC8fW9OKbn=AZX!9WzJ4w}EN<2xmaIbn{3aEyQ!b^3ZrZ2iOrYtt!@4#OyVtEk7 zUKJ{vopi<2KfYcB~`oIAm_AmeP7SRm;CHR3_JQ6BObqB|7=V|;A8DcU(1t#ndx|Z z36St8<3h=2yM{0MuT;sSqk~gkVu724NR=8FYvi2L7YUZu{I2$iWrI&&&QR>z^q376 zR@d)Vs00x8?gRk!_xg!itP?)HYWeB$Q-K#k_&(9>*mSBmQlTksDnCkgES7{zuPv)6 zWr)Z8HfeKmRHR5#@J}3)R}ZcMg=Dg02bM5*o6f>^`26)ef0fVZ^04xpnDPEo{Cvbn z*+nVD>&MSj4|o%DE+#&{e$(xf)iCm$|LS4m_;ED(9zJw=+wjH_w0iQ?rmK&fN?YCy z#S6^Lbro@jYXXMj8QA`6QmYcgpO~5d zWnZW8_%Pbzq%a$Z3@mG8!(GV4mWF1IsJDX&3tgw2O~^7Qqql2S=JusRO^cr~mzEDl z{N&PM+2%gt=p)}A&|wp)ATNnL)$RVl^Zw!)aKG8uAKTK|aRhj{rnIbj2d0#9abufX zZCtr8JX7VOx4Ll66I6&65;5zn8Szc!pACXmPBp4xpex8NV>i^NrcXLXrG3W0XEv;&7lZ@ zl7(VM~Ej6<4o18U1fyVkaD<6P~^t9r&eNXZ-?SA_}MbJHz2Vw2KYR z&I85rjHU;V9mW=}SbfaMQa0jGr7s)+mC_fVt&v{qS_^7gAx+D9OuAL*|LSNe&)1m? zVKxM3S^{Q^teAQ=(!aD{{%akT9MovPTu-lkWfR_5dSF+|_G=vRZr~}@7_JPql-`}J z!rn7Op71^eWS+T|d>qmGNcj015R#@e4k|g}L(x$%O1`LaaOQ|Mlf?vnYA!YJUYqt4 z>J*?(XZ_;gxzv3gfL|n#GlgOj0!J)<#tH*b$Px= z34LV#Xo?e8QceiMjx5zdUSDk(efgJB64ZBuma0d;mNL~h9?Wv1V6!qt>=cqlXe&PN zG%t7ZJZ;G|1JnweT|@h~_j_BmS9=9*?>yHl-6WPHplQWP@u&sMesKvuaN z9!J-!8dGq!%=K~zJJ17D$G4W$%AdX=?+Ib6CBYrWbF)}nfZ8Yzy&~Vy_ZWu~z1Dpc zTvB}${Iw1TjV;@09IjaqR4FkSL z1BW*;x2nRaS8Ux{s=hUYll(a5*CPMA)?aIfeI3SzeIdG*|8{oRH%Q;P zIgU!Ze9$>^VwU*rBJm|awA-v-pX0XpzF7dL@`lXW{P{6xp6jP>!b@$GZ z6#(4t&NdR->dFn8mPe)(?14uW^Q-daHfw%wkB3v`wo-o9)dE0(JpIJ$K;#l{w{?^2 zz&gE}vg`x-Ao<6Z*V@v*ES`fd2H*eB+&Bfa^&1<^^&24`&$F8~?nK$= zt`nneV&58(W~yNU*B82p7vyitRBkW4#KA`2{Lo6jROkt{_d#uqL2G3^!HpwKtwTsF zf+E{*3Sj=2S=yYR0X%O!l*{8XE$e{CksyuZhY}bv1X@~MmdharyPjTy<`k}9_A|+6 z5(W~zeviAa0Ay|Fuci%B1He^1%JTC=zCfw(+=x?~j*q9_-t$^Y z*^I&SgIjTVTiw`40f<%bgT6;A0NY+nV*03}8*>lB$FE>*|<0wfm zA1czjd4;!gcovW5VNs+10S;-~?>M76;ECkD9Ag-WFvkYv7a9%ro*8767P&7RbhN8fP zi!9+G;;7H@Z3`McheM$1)>d%gF3Cogjh4Z+64rJWIqm`@(}3Z>VZnjhMN+3eVYpdH zARy@-A_3=B=kR=j*XK&oqgZL&A?sYlwYUfHQVe+y??IkfR2E>Of2RnWBWJpyxS-Iq z9Mc@lwrENqq5~F-Z4-Ts z=xt<225hoi4uFi^^MQ4`ct5X*-55{zO&cH$_?Pz&9C1DA)u*_Db?8o)0n$i;0 zA7eOG@2U-B1h76yePsJ;!L~lOIcO3(U!0H&y<-v@O^@fF3xW~|UdHkT71+E5 z=#3V${Gd5Q4u5cvd&WrZ6+(72V`TXv?0+uiPtO96E1q~P$Y*WO*wfM(+Wwdmzm^IO zRXa3ua&J?-Nt;bw!=Z@$_@SMtgfy^i)S#J7+-H)t6`(OlKCjhsd44$BaU}!dukYy1 z67QCsJYClZ_>o>PWW%&jneZk6-$`F;Ed$TuJj>|_qlxD-%6cB2X)EJ>jD!T0m&41E zZ*ap!3hWDo64cgh+e&R;-P(}k*uASWSjzm!SLK>lR5aY8*)q9RU-`3rkg^-SFxgU> z*V8DF>Tb%4<^KN&d+V?&yC-Z^MWsu+ySp2t8ziMe8lEmR35YQ$o5yy1Qco z(#_dyUi^OF>wC`mXLGTywO7nNbI&|$)|zJ=xyZILmgx0t_DQ&65s+vdV=SgPT9&=^ zUO{WVjHg~v3)uar%9!6ZptahpF6JJOT*9AGr^UFv(4v#o7oaZ9e8HW{X`37Q6*ntO zUW20PWzT%HCUn7gUumbTmwJ1|KxAjQ8+K*=+t?IN!AE!}O;>HO{M zldIi<>090_r^^=L`dFw^=%#;>#x&;oH{M8^mkK@${tsi#@CDmd|Dj(h)V*uqFuCYmgwrZfE6-}S< zGHyt+x4y4!gjt$&XM#OP|A_ZSZn>~|wm2k4G(C(#H7jPFs*DqBk+jOYzb^M?j#0;W zZqfZvg)H1rhZ&@nW<`J{=b;w(P6w#m?(6u$twE$`R__(R@7AL5IFW@a)*0Li;~&#P z=!h{7+YYlR0&@!f_$P}Zg?g0bHk&u0M-qoWUYp3NemBihn-STus1F#MN|nDnJ+&5? zBclU~wGV$EBGF2zmHc$PL6FdSt#@73TbU}9p>DN)5Mp9mM;3cx0Ju~uUygK=31Iiq z#%yRIKQEKPNaO!Pk*_)@+3juuw_QOa2cus+EHG`9DLnPDsX+MwV}6Z1w_-li7%e=9 zLjx|;nA#%|3aC%3#T#@e{+AddNCgfE^C)!KP6uf2GZRP(x5}~QgvX?&FZ&Wy77kwJ z1v12?d5FFM0*GEPb=TRC3q&gcSJPh@6KJq11)b$*}4AsePIb5oHgU|f- ztXCm332lC(shEnVy*Zq;WcW0+xdt=Ekhap6+*8JluoJMRx3p^prj%mC-As{@pOu*= z2h~f`lg$0;WFfA2tf(3F?!nWt#kU z0ufIp)!O9Y!Iv_&o?0(A4~7BsNFjk1>{XYf^uRmd@oy0FoCxUka!OE4+~?w`s)Ad1TkL(fpd%Ka|zNx~{M1 z#i~iKmX&{Z{naSnND&g!?Jq3^%{C9oXt19;G{l~-@tHJCUMCeMPhZVY)RSK)RlFBH zb)Bjz5a~$wC?2a3)Q8z&zv{@(jvo025UhMnadGC%0ToRezPh~2@YSfj>Pgo1fj*VITtVJbcj))Zu`AC_&UHz%f2TACXd-zXcQMk|q_go=f0_o!v z#r)cZu$M5?rm*$EM72(YaT4OD43xam)#&gS%d@@OV4C0lbhG{|Niq1oibkxx#Ys}4 z$65_~jM_j-*3|yi1T9ia3G{NMB<)pg3HM$X{RF?sd=B)9fENyi*m4Ebj5%kD>Drl>orU85ebX5Gg-7%*$+Y@24H{$J^i}4pQ@9UZ! z89jd4$YYa-m8s!?8kJ)E`&Xl!_UFUpSs@utU<_C$C!6oMnT{-u3bZ*NE$q>lKB6GV z|2pqaDY+J-hjMN*%x*1mX`56G^=D&u?1i&uwl4wnE$DN;!^hi(uW{wK&YN=!;>t`~ zV=kjE;Ze(?7;qhLV;3Xkye>KDp5)dvsW@8H%#IjMe(OC;wS7^s%d0QFS+@!tDy_Bk zFZ$KG#&uAJ{k+rXZC$&iz;HB4PuV4yJ=qsy@>PS|DaqpAYHUiQ-s`$kuTv373yGfzI}im8yC5+Q3$rf>scR!cQh{bo zQ|?4o+g>4+4G2AzNLzsw!sw;cx%`yP8N2xMGZ)D&CsVPQh-Vtwe>T6(2Fs5dqK2lM z%D6kXZ1?H0jv`O!k*Z#7alP9XULeNtzrltM7}o&gq1?YKrq(xS(@0A)<$bjXl!%u| zDNN~!JIFqXJ6Q$w496c4RoPWG2$iZ|a=~rWA3^uPA1Yvt2rxJxU}8;VG`ZF>U(NS~ zj2nL=b1Uc0^hdlHzM*Y!dj_kv))kjl!9pjemt7@CT%A)&2y%-U@m$|8ncRcn<2aBS z2#Em>ZscX$i0D?m3ZhRLWX_F7@zZOOG^U+*xh#i#fAbz`qP2DysfkPDdmQz6Y$b98FOgzYkO%n=E;gyva@Xk(V(&!zSWuS4X$g!@e1QP?pYVa`ZM**a~6V zu`I9XCA>D28z=I3VpU;Y30|tr+HB6R;WB#j@~IP2DCJIr*R~f@zwCtQ;}TYD zNJ=_@F4p2wBMYQ$Jf(!~Azu{+qP!?hJpH%}#LS9B{N|SH;Xc`}Cf)OlLyT&{=qV?G zBv%n$%V&Z3y2=Us^FNAQ`n%nJ&>LEw5MJH+bRjBqa10Za$IViBgl3tYk&1}38d_T! zc^*v&?`F&a*hH=zzbU29+cxQl3Y8+9kne_K;logQpQYjyEF_0a34NeSAVc8&tR+Y- zqkrR9eO!BE272Q46opVOhYOL=wdmeN>05t#xaQ2ymmt@drD*yIob-58Z*BJw)-hd9RrsIs>-hys_Et4PcimCZY zs-LVKzJoIryK?+oG4ZHxW~jhCWm8uDXrq1WZNMprxt1uu-yd@3!O_U6Qfvg+sLUz* zu^As?BWP%i?f3(oQCZ#3yDhR@dMFRH7VpD|uwdlG`LLyuuB~Er>7r~lJyl~r>5$Jm zUHF~^1wV{psKpiK@ad-G+q}#{s$_-NC1_gZn_nF4Da~LG{S$jLG z*^)wn?DO-;{?AaO->_JJf1CEtC=V2)5Nj@jReSm??pZ+S6Q@e~rvi=JR?aoKuMRJx zvuY;fd(q}suMa<-{)&5E%9-~OaKPL#*BsM#OQ_(ur80_f{PJmbc4rkW+DqnSy0li0SQL$_b z$a26Y`6;6V%{PU?&}0--4LN4xj#$u&Sp0&knA$#bD)u;y2Q$;DC69KA{&zlafo0=( z@1PzOo&AHl?Bgc9;Hr*#F+LWSI9{!0XSFAeFOg2SPgeNh2hWcI5#N?ive*8iuf7{h zF^eCp6&t_W?pYu$XeSGKtOzKGXp>PG?S3Fu=hO<|BWCg-dTn3{O1J4oFs%q0XqC1O zPuum6phF^GCP^v0Jhy+3A^A@DODJ#TZ!IQSg)P;O=BmEt;$GIAU(#w!d3u@I6|#du z=G$+=BDYtgk~v~;rlP}%^0lJ4e*OAR*po)^JoRHfP(Tk6x7O=$z+~`otT;5LW_h$= znO+;WI=|(|KtJhKC-|^hES90WpFAwn?l^&-w>pY`3cSqxMz!mmU+^?SO2UTW13FDt z;1{)^A1FICtq3#VsmQkb4)5A`k7GyGf3SbXqbEHfue%tp6CD3`f6cCX#3^Nlie$1T z^M-jY9gzL;lh@-A*J+B5-TTndn@3Kh$rT4FbyGD)YPj0c{kx!mEnMMsTVB&*#mx6S zgyNK0Ls#xr1j2l?0EijM{B%Egv^@zGk|OXup_I+zXPOZgsv}gh87YES`^UV{Yj&g; z!Xe+D6qp4(oKTYab+prze6&;PJd*|ZYMX3VK0hG3Js4e1%IN9aHcLv2_UTc!%`=^K zeEqd@W}FM-PzF(GZ9rdOGOa{E^>{i$&wqPlPQr}hjbJCZCZ=v6NN)p-MdsHt#@RN(Kl#^35wQHg{$fuj!ijhgsY$+63W z+-2kkk<>V|Ji0*0CA-8o^_FTvoxHs^%PzjB0mm1ZQ)TByuOwrF;%*Ile{QufMETo# z>K@{~z)HKF)c#tJH8#)ZsfZ-o-?6m^@m0s*gZxAW*IovL^Hp_6E$IuP*=blu5{PKR zk*q1~L9c@{FfGJAm ze@?`XO<+|g8k}V&cvl|Kvo;dA|AGO}j#K2t^1ENTVZC2kuw@4P8KYXzm)|yJV8fCoPk&@NBD5Yt0cc`4y}~C3O{5uV0&{jh;8Id3(j~*7JIRwm=N{ z-{r0KyVFz-*ACjZpq?!vqB(E9Yj!<^%NkD)z)D|Vok-{kq)M_Bf5NPhw`brGfY@i0 zd2vsK*z}`ufd|Z(x!$XO;9?;DZT7?PUNr`FZ)w*&EYJdkbqLYE{%BG5dI&=JLn%j* zcgaVqDjebiYSiLw_xcV9`&d#KZ4uiZZ*{?6eHIe3fCiW=?StpL?M|WqZ)2%8&La}z z(2@|+3U271O&Ume0Uc|P?n7Z*J0u^mXshCtN3Bjc;?~j3gjJ72J`nH3k}#O50UTu= z+pK~^6&+AXP>=oz&K<^4EO{O+Cck_17Q{ar-R2<8B&}~~WgwK4IS|&ZD5)GFguyXX zg>}#@D_@qW3lQ6>^Re`t4=!Uo@8G9NKWec3m>&9gcng{&@H9> zXt^JnLwfz=QtUCs&`0hS3%p^sW)cN>pMS^*Xo0q{c)XZA^yDo_r<}hgL#4dO9;Iq} z`TN)E!V2$cek76PAxAQ%U#sHowS(t2G?R}7^J_0`dJBKgt?jN5o8=dfVwfA2nWkxoO zhkjsBN>%IiOyD(jJpI^ajbKbVjPmoh|EhdJbA{1W<=&@@;W8m62bxT)7^;`FtQ>-q z8NtbLn*Q$RhJBZx6r`Mya|{(ZQvp7`eP@#l8NMl2KJhV~aqGH*r^|1?Qt3K!2#$Th zW`;#+|G<~Mhs5oagtNfhi=T91#0F&miI2Cq*@#=?AAh4@BL76IWLHu zE27W^kV=ZMUq`g;I{%7G87BPHbml6@56u|n{9FTV*MQK2pU<;^5+8C1(aeWqkz~v_ z08_p?kS-!xUjI93o@UipK6a5vf1ZtCPWM;A=jMI^9E%T$J8md>G{QM)G#jh+uFRKf z6v^L!WFJwQ!{1{xg0anV&2C5Sb+CrHpCZQJDGF1R6DFuT-h3h0757{-7;%3|=^)Xb z$&meWOf{M9_PBzpDXPrz!oqoP-|mNMWUo!A(&aRb;YeqrZ=9%x{@NEl8WqZl6`8G1 zz4Mb-F>>#$MZfNCytFtC8l5~*>=L#^5mZk`1Ryc;W$V@sN`9GW2=9;Ap$DCb}G*Tvqq-j@MUE??#a-Fap38;k#NP@J;*_pCEC_HjfNGQKFdICas?-gJZebcFX26hMh&%oUFCh z?16QzK4f_y?PYjWRxGb!*^CNId)PCQW8mPCG07b{sh%?V7uUko(g>qWZgAC$o^1u3 zfR05kPY=jEPJwO3dbu2Hb-+e{YP?kF;L=@7+Vl4MP^O(Piy$|jkHpz)D;&7GsShk{FG_o74o2(X5Z4$vSND1VNxLN79e*G?e)VfCqD;7cs;E}frwL! z%Vl56?S&FJ_%ZtsO1TU@@>mU(VsfUQJT_vwQ5%ctTmy#(;tKU%^mK~SlL5#KtOw;U zlsx3L*2L@M5T;7CtAl*hyl2U+7uuA>L-@gM{y1$}OV)#Z1=e?9pRISGeqLRVg=G`( zPnWS|FHg?pkSEc-)M-y&M#k2r>P8UJ+r!-dY(bS;7SonFgtxUB%~F&%o{-1dWDfNeSuq}~5YooW0x`T8STye*&C?54plTG8L^hJ#`nvdpzkIYk*z-ZB zk}9$~k@qq>tH3%{V5_$DgQM6Y93(s3AgD_!^Vw+i2%YV;HB-#wNc&rFi@YjNF$*;l z^o7QifhNZ^(K7-O*IGWci>au0n%lc}A}`&IHGSXZHB%~@`#*_Pc5-3#m|VTtoP+`- zlpDyfS`MCUy(BNAyfWV1xpbJ7l6Np0KT)2?|I{eR)oSwmkwf2pe4VZSTC{2E{NM%fZO$voJ$P+(XJQ8cx$V$x{J-mbOgDns`A~&`B z1X^~i3^jHV#N=MvzJUxyp`TI4_KQ+9pVKn{OCWK!Um$|_k8FxLV5huv_l%t8RiV+g2H>*sQhPP{iLeasz z@*%cbj2rr4UZD}+SAE1>x*wNRELQ?~KR8ZX=HT6gLwNnwX$Z0{6!l@`YQDYa$36Ju zI#&_$Y4sV3xwLS>k0+X#YQcLVpAnx71lB^MZoO9r=2nF0Z@p7j_vVgoDb+TKOlMJR zUjEh{FFyFB*I<`oRmr4-2(F_Zu-DckDae`m1md)af>db1uR}!DRHp4_{{(DjSZgw6 z?|K?f7Dq~==1&*H<$XT2w49P$iiUeI1<#CFWz<=k%x3VDUw9oyO!FN4<;z%M2@Ln` z6T`CMRhzHf=^1RMf_o27{4*ENiC|UX#;D2EcjZp?rdXs>LpU9+ddc}f zBc>iF?5yZZmg8KbfFO1VEPdF|_O|a*13Ij`E3#@yCujrmZUtXS(1GENzF_9B)o6Mi4vQ^8bVWUmwJnqzK5R1pHCqqzV@|P&!R7_ zI8+m33?yx-JFYeiUuZE9e5mpe_UspEdCNFvU!mVUf216bU7>q0W$A=4+x1e!V8Nxl za5gifam_-6vK>0bi3`!SgYDa)*1PzbEiIpELfZ4x0;A-|kuje_|9sRT_c|3AkL` ztr~*svDV)mzI>7pNr%&x6To8cUhKGL(tbO~^GLI?8!z*fsfwKd418zKw-Eu!yz|_y z%haTWsJs@Jo(hI7fA&$=@eTBGY+FD;DogZyyWj37nMKrqA6nCDV`lD&fMAGcPCDPG z&^Oua*r#+D#hBi1-<5BH&nR^eJ!_jVS{juN43Ee#?rspA^EzLOz=)rvV!@NjKC|QVz_zn0Rbb&R5>bSxd?{ zG2?caeoE``WOHsm$=^n0N!RuJltZ`jC_P}~`jUZ)wpK+U8jKCHtCd1@J(isphtLM= zX&s#a_o4=jNd6TDf{ERVy30H25;9e zKhpnp6nrc+_x1w28>BzC^S+j*C9%lXUMaM#W=VrVSx+jTA~9@xLU=Yq_t^^c2~|ci zd4IyYvn>24(BXXv;IsyMS`xWJP_Uhhs5Mxvl18D@p!#xy>~t zLr-KwCmqmC^Jf{{(hL;fWystugUZcHCR&t9Dm*Iy35&6BMuk^31DokvOa~>arngQv z&St)tu7#+l?TU#dY@)f4WqsCFGeZAjeQ1*`YM%&(STf0J4rTv~(&?c#9sy2Sm^Rz7ezY55tBKF>r}mE)Fu$TA_^W}3i? zyL7)O1-s!!o4yyNoOUKpejq4zg@mhh6|+l8BBN~%N~lF^jg@M=b&z}{oC1`28jrNXvf$EVb1CHL%{mYn*+_cjo~FF zvoKX483~?6usUbBEuRjDFEYif0h9H#VEi(##@@7{`{tPYEDwB&hyWaAinJmjrR|}U z;t%4Z@>M6qRWLoZ%GXQZh)YJc^zGOxMchho5R%(`352q7KG2+P}Nm?vO6=KP55F#tO|bVZ7jA~S!?Xu*p)A1db%+?6YaC_3NC?mjY)RYkYV+w zx%09Wn+8B=ndZan_djTH%6ewM#nk2-78KXT#)P)#{qf@ID3R`6@>oC%cLRU$lt|C} zqJrPg+4Mt2s$gS7z4w_o@?2sNK~yLSHu9zfbk>N29{&g?{K_%jnvyA z@y1Q=vkcoYRX_o{e2)mpmQj>?{Z6cND)(ckhX}Ur)z??@;{4Dn+;p1 zEf4!D!*)w5sVLI)G0BeVzjdZ6J+1&uRN9_;RZz(aSC2cD3UGPte7#)LM14t`lofeY zoB4y{wTAyz8VMZtwZA8!6Mqldf!Y+2Bmo9AKzg=3d_Z2EDB6nh0w(j_geN|mla6Vy z;_VY%Y1%4+Yu(rBHt`)RdiKmQEM=I2psjP1ipL69YoqL zjb1_#Btj{3#MS1qt<@9`eginrmGHT${#Erj?63k7mC~OBuq)-{!DkB6=#|bX(LT!w z?mltg{H?bFVp7cfW~l+${98?K*_5(Q@n~>}g&V$8ghLq3{yXPLjdryLH%@{2+4o1; za1)?)J8M($^{&T|NZF-{JCV43@@WZ0;!9J6V!haDhM+XS22002yv?wsEh0oOM%Dv9 zN&aCc&mVlJ19pke1Z`rfW>9-3!E|Bl+@@oE7R<-t2)IV zc{dTElaWSmJ>XVC%W4Ws_e+(h4-$e`4c|O^ilYHtms&z9bJNu=t<@#z35yG(3t(Pz)f3z;Q^w09|S?HX0e!8VK-EAAVeND3np z2YZx9=XR&DILYPt>~*R!N`@eiqc7xj?&zs)tv{#NqgDwFp2}`rJR`HZlp|ePf(vHJ zo*D7&OrJ9({TfY|_iCd$E3rRH8uc(LB_X^N+w@eLUsuOs`P8xg{5Z1Vtu3vM{9fzw>z6o6(+TmCN>tiP`#EmRhC1rXt;_S6r|M3vAyJd0S}~I!1l)$BNJn}Tu;1(g(&JQheD2&orw4w z*_@oEa=|g!5I($P_m`7UQ70MKE)87Y2^7d(mU zq-CzR^43lwVD^f!f2{=P&gqMd^Wr59Ml6JewMGs$<&z^NWSDw;hVq%A!B8&QSa(im zSR@ilCAMcLBld4R>?yZQn&S|3CA0EEcEIbMq?s(3j4c*GE%S4N*M(k#{@G3y+%zNA z-Chf2z{sbzT2YK_L^R~a4^#)P%HPL&DHRT&H!s;|Cs4A#)<0L!v@1^kIPUtk`#y)F z2bE1v&TT?cl0hHcSAsZ{XJSpPjOpe*$)L34qjrsIOiLT?P@LXM1OGsFu80gKBsD7C zAHbfHqPvg={zQ*HQ@o5JqEcT8przGW>j^g&iMvqIoGNj6GGA~raJqN-IkT>c5+;-n zN41a5?bKJ<`BTbEU7l^H{InvPSu_&r;e5Dce?wk9TJ%rig8e2Th?zVqg-cnj1gXTBo!$a8ad%E5|o(@zR3J7N?P`F%q!XIilE#86t$rZvt^T{>Bbh``7|Gg~U>9 zz~A)YcPlCO-szhL{qut9pyS%&N|UMpcZd>7;)Yeu>l)t(yO_p$=>2qc_-JkwZtDh(7N?r z*GC$<0uT+fLE7G;NSjF#f6Y{JSb#NJYLo1-1Mny5myLxdQu4dkXT>@@XuN)K0RD-? zj>lcej>nbGHjWNeTU!LRRT|s$+bf+z+Uqj%C?#0nx3R`2v+10BXG!JNswBrIF)F`{ z8Q`!ne23+WYD(%yk)9#(MoMsou>)Z==JQ;Cr;e9kN%;$wFbt~gXcqhtB7E) z+&2#1Q5zcPaU8&3yf(uNpCe0hi)a&6#8mj%ma&S<7)wW5_Vo}a+kaO{Pd#~Om$fU7wU0#Bq2I??5F^4sjHZ^%H4kle2378)kb_-lGJ-2v!z zqMyA=wVt)=lJSD-e2@cand#ApXkp5v%}V{KCDd|}wVRyW1^mIm;>mz91y)kbEcslP zVYj$UDstBU+{aD_-^boeEe zh+n8DPU?8_*qKqcl76w9T#5Pgjit_2tC9Hhy+4PgpHe6>=c@>;RB2=!&RQuDjQ!v= zFWcqHb<2uMAx~55Wuh^pwy#1z_0KUH(iTPYG|-Vknzc3`*F})_=*-yj3&$PcpyI~u zc>F}QN^QQAqDxMfxY1VaE6EFC{%MuIsFxe>L!SLQdA-SMM?~jye{N{u&11*lXTNgA z9}zs4R(>Yj>&kQ)BqL-dq!vtI3y zwbjDqUMg~GBYoI+GeGi{86DoO8~?Y)2IZu0GRlu*{B~LJpG6dBMb%MhjiJ|*mXNl+ zu=tUwd(~}3F?7Fr4EhL#5;5Kisf_&Hi0eEgO|{EdIRk<+4TPjOEOwTtP;nHeye*@lRZdlbwpYP17F#7>nW~~y zt<~U)F@L@>cvyUU0p)Y>;-B9wUTZ-;rnuh2cglqSyC4B4vc)4)Z=gmlcO^Ge7U`BX zVpOv~6Qz#le<+0xSdjZYodlo)m33}}j45*;<*_|?1N zA=xwSCgnMFSvQrC=qmX%=G?kyKWUW`>acJ*$4WyzY=5Oud~w~66OUpK{?tiPXQ#1s zr=lq;Oa|~~y9<@|w4tVuNP>SaT(!G@=SN1(0f}Y2PEHN8TNPYUEm%sNY%rwPw|A#v zQ`+a=aZEd6p7OYo5DJI=@J+eA_v@CG!C9??@;aWffbrZbdeLMo9;yP|N`R5Ef3qad z5E9cQqp2fiYj7lKskRud9A?RQj%AmZPzMPBlzFsoEO3I0k6g_xw2mX+j50s4dB3y@ zVz!GiA{etlp4mLyN*6^+9w+@md_UzGGr~6+zkkh3#S$$qQj-x98P~oNXKFh!Hs!LQ zpjTuWrc#seenq{_f|&gb0YqASGrm~JT^-o51%P4n3uHY+@ybTwxM5hD173>dF2oEh zMZ1JV{lqE=jZCOet2#h1658pN4+rRX|6H@ZvRaxuQdrUhTTj@nc3b_)E(03EYC=nm z=a=gj^Gfr)gob&mpYq7L_2;hkcL$~_&D{oPNg0OaJU46`uZ&EflVxI1#kyfz9{GY7 zPf>J?{SI3r)0e>mqh6!h;@82?+8+X=YAt!dAZbq8;H}lV#A}cIpA+9aP937Vmvim+ zRO`*?tITEAvRD_R$#BctM8U6plvrV&!wna5K|B4mmK8p_)(mmfl*OE{NxS7W%4;4g z;we>eY*(1kTh>MYKA_fEmGmwW*v>R7Py9Kh^N&d+{DA##;c%W@UIXSq9Y97|X9#Bq zZvwY^apucNa`M_$lXT8SrVWkOIed8;Dz)tMo66q?oQcP4Pp?{KB|$vDegx_ zohIP;T7czKLTxRhKGqQ#L{5Eeb3U=%*xA%wB8dKv#|Ul8+Y~)dKKcgsV~N8|n-l`U z16+^j4u8y67lLR3f4DjW_jZv>@T;&7)OtnOmoE&IQ?nx!Ya>ih#-!+!c_u|;@b{P9 zdrf1fpDx!rj=F?lZx)y*cG9#R!Kx3ez#o+*wd$grF*OCa)k^!k14qaM##p^63TdhBaw)@)V#nS4 zEJG8Od}HvhT9i=FzuA78PYoaTP+eFJ$M^~nJD)ikuOqSa|=XH#L68HU#f z`)s6MO<`#oZLMUO4ywBCxl^ma=py@YkCjdd;l^dQ8dVfP=(?7=z+_dUr<*}beXv{) zjf)2UnsUpQ943DMIstHsQgosZS0gwl1f>|C<-cEyqoe0#b(9@m?Lpm)luC5KFhXCyn}N4@^oj6_kU z>`3F4qU^kBdyI&U21#YU7DT7NE7Rz5oZc2xp9VN1 z$2O`|OgTHV7pcPz@0Z+X(++XpYaYNRXgRhCPVjhs3ckz*q(t`4#vy;bQK zS#lCNwWQFhQ1}YAdS2ev4KO0@1t z!i!}L*P(!84YSZ5n<#3+7U0>YA7>byGU|3E$fgf+!#ik2vwo5$s9}ZhaNB@sth{}O z^uqCXoAd0(vxbQ|qA9HDivE3(A2vEjEidN+m}LY_$4h@18o!&boVsHEe)gPe`5CLH zF(Q(o)Atr_XALa@^<;>QL3Zt1I$@(VGim)GTNhih#S$RvBvO#C#zZYTgWjf&7#%Tu z8D^)hnD@YsxO>2 zFx^?4{Eo1D!UFs-kk3o0@xIiR{2E(4Cy=-_@~ecXVwiJ5+p0!L4};ds(CKt-K`k(- zCr%R*X>)*S63;3mAC)6NP0hI3Gr>K!^Z+x<6bA!iRVR$D#1Gvd*Cz9-(*Qz{GehzA zf*^?CX?B(J^@r2)Qo&5j)SDdI?MAO_MZA3t)GY((fXBBQ;?$7X8;X!lgd**Eoj9sH zx_n!rQJbf}WBze#z6LPKi3p#bCEcBo{+OX*T?6$`NhzOk^lvlLRyCK$nckQCo2xt3 zRkH9**r!-d+wdT$nf!$dS|-MC{VH<+pdsILl^g2ApS`(fkjSu&#r56If;)vqT=^@@ zcu(q^O3^b%gzZp{5QWz{pA2JiB?jM?6=C^~igHAM2k@&=3$UGBLy&A%N`jT{_a9)? zLuJHjP($9Z!-;r@f}g@Fk2KKL8R+UW-U!o(X~54FlF&|lGH9cINK4EH{z6Z0md@B* zl6cFYyCT83jR}(2A#m@E=o_VCFV(qSm~k9H%{Wj@ciRfC=g*JxO~L(mMACmH0Q7kV zev}6Zit(#=LfAADT!bG@P>i%Wpcl2|bVEI(?y^B+7$-`+gWbeLAE9wN!Zm1}Ac{RJ zj`Rt<<^#L!lO%jr`do;-K z;YFTd`oe_}vxDpZ_&39AkHsEGi0h#jcOxsu`a9uQ878%NL=rA)p!|UYX8h^5W@*b! z_GVCXJG{i1`0Nw1nYnM~U#`@QU&WviZez$pXUn8<=$WzUnbacC^!gF(&Dl1(pPnCX zd0k$dB0K$9w6)GkGN85RMHl|RnsueSJHAfnRMQMCb+|M)sPc0poJcD=@PPDK(=dWw&HV8=~gA#IbX50DV0M=BD*Zj3LVSV_B;rlL&LP z_9*`{UMX-{zpbA|KU0uoZ6CDE?tQ|MI``-Yr+4p95-Ql5$Uqm2TS#_Z3f6C@8pDsb z*14K*&s!36`A5mhr|bxZ+{Pw}#_&L?J#qw&pgiv$;#FS-QgkMYB1bhSbv-1Ht~am% zyeKHv;Wv6XhW~vuMN`bIYG9aC3?rIP3l}+&uZfb47_!xE#1A907SKR+5M0$2p&kiK zkMIX)74zm-i>hTpm$gWo$59WX-IE6gxfswHu}VaKre zJRpeSzdWbfa~i}e7NxDxl>WtY;-(mQMI6i$ATxFun$Dbb4Gj$c8h*inU&ffG(U8JI zp{ibvn-51zmr#{*W<>ggpDTJYJMSjt@HlK^aNZgTz+RIlEi}v#%Tsh!ngVV^f`$_~ z;U%FPzOR--f1^^MZ*ty$gM_wjL@@!Odxa#84-CamwKd2mX5ZB!evB;p9O5IMYp#Lg zhH+SLq%7V6tYE|N{*X6-{d30!Et|3lQz0`zm#W_*xWxLCCRKk(s@!F4_IAy(*kxly zK`H#U+hQWIBH@Zf?@ulK!i4Yk6kf~B`3^%L<(58sKi9iH(;^Hf+8T8@SH2l(xG_Av zD=t!TezX~5J}cNLlgj9@uRvS+gNMC<)de`K#mApAQd@(}mlymMmWBxk53}R)4nQzFE*Z7)DU)ul?H1<*MQ^buve)b=c%R z%UNdbe?#A}I-~c71_^JxOgXE8UZ#%!O*@x^)s4)Y)MB59&F|g_pf;dcdN!-Z*lO}| z8F$w!o0s}m;qkqtlt=NGeWRPB2eqMd@s0PF+2b+Cr{k(lD#|+JCM{-K;`+)R+HoEu zk+n7P2yv3#?dEJ~t%tHbAx}#xV<21Dh_hDClJiX&NHYSg4VEwI6}Bi5!@SWdB&T?m zLm%D8!T>pIQdul2aZ<+V_x|$~>Bp7r1^tuXERX3=mU>V^c0meGaTQ;B(47RfZ!n=! z2%;D`$jJiMhLP8*SY7NPc0R)fU5>^}Hz)~{WmW=C`6auu|C5HOj za{c2N6~1MLu>CsV8lDK*B0kbs@?#0{BxFU6W7!tmBB$Qw-E5%lZtL=g#R_-`%|Z@2 zu-3^tU7YM)dkO`Ys*fX17%&2iJ?^@GA|$#Xmm!UXGB1t|Akf>#{=rl$+^M=nRz zep^6X+y=7^QQi&E0ZB~Fh#WVHj8s?T++J4(yP`Q@R$9+uJ>T*#7>~n+p)InQ+TR#m z84}}^3)9ZI>A0_eYXfCH!`ro^+W{g#dsOgAv!hV-nfalHO++SFj155%%h)a<;qv(0 z*{GuS3qj?1`szo-7FKqd?^q*n1g?BH2JV**HnFr71l2`w5i>aOK|AvinMZ)?U$Bd6aL z*23H#kF^&lwCm}5#ENqJssx}N*<1^{&|ubVO~ly>dASdh63`xf+d@3y3)JjPXaN%K z-EY}KqF&e_^5T*sY3d1?2h}5`9PHm**XZ@+MfvNj*7_6}R@KP<5Cv`D-QTxh?s}PK zrHd=a`YQ09MJ)NpHI29qqxF^qVu8ZM5B-_H{V9|{Tph)7J-iurt$scf%*+%|kQK#U zw`I{XDsM6m8AM7KkcbCFdf?x&TquxiLA~72Bpvd7Mg9qLOT5Lm#8iY_@ES9nLjo_f z5*x%kWfV;#7LQ`7kC7%9_^V7T1NNIc2BeOwKP+0GuhjEn1_`TBPHbzIDZ}y(YL!4% z5>>;yUwktQl0p+9z<|_aMnKC-fQ{H+)(#!Rwq~9J-juhPhbv{Fn26-?DS>|?GVmgT z(zhG+zH%$&N&@WQ@BJ$5LY66m@;38;LBe$K871F+M=kItjDW0I0!j*#QS@CoKIU(~ zFz})+fT#a2br0*m!%Wib3Ao{d)%j{UQvL*^^OwM2?Z6T@1O6qk_(%VRFQkXR z@Vy)6FMJ^#{2zS(ffq8^U+{uE0N($F?|)A>0xZ_BdjZ`SZwBl6y%_&xn%ul(V9UWz zh75UMoM(*^0o?XZH~+7;&AupJKsJh@2v~K~bZ+HRlNH3JYJ>KE=ko#o*hM5eus{b$u@Vfp(V0ZKR8{fMQ z{%sJDQU2F_0f_xVR`eIXcZ2pcKCnRm|LfW$AwB$U z5O>4;g)gLszwo^q?0@mShxe|7zu<+;7Wlt?6WlorL}=++W+xqcT)U|nEp}RyAdIZ3y^~y+F%+R?7tiTzdN+QnnD!j z16bsL5gz%!RRKZ>cO5*yd%yp2XTMSZ9}exso!suf9;%=C~3Gc3hzX(tHKi~xh{~zAII-sho zdmBMeNePh@>F$zNX=w>XL_&}T2`@?=X%PVtkQV8bkdnNVA}!J_A>AF9d%tr*XAqrv zedjmt_s^c~KF?Wu?e*-l_FC%<_e3Hk{LJq!)jd4WkOn$(pdropvtv4p#E?@SZd~v@ zDmiJ~lFpKXRU3`qfT20R3d!e+mV@kon0i{bd9~`|V8s@kl>;#M}K5 zz5f9Pj%2p7CV!9p0eZLFe zOnUPTy~NsbYe`?m835=liqX5JN(NPv*gA0r(Y%(M-$xiD;2Q}E}YKUrbYUNY(3#U6+;7~r*Z^jT=jwKPmpGN3a-wrsN8{V7~g_C8-t zZeHQ-NQt*rC;2Q?+ilW2i9PVjpp4fN@G&N&wZfDXAq2qxc#1r27w{g9D|O0h&9;bWs4>;Qzw~=M79fR&x)9zZN(VukZOHuE-=dim2+)9 zzFxWLnlEj2V7nY-SfGT6`@ERb7dS55wtXX>^ae|bAJg4A{*c`$ zX6a7Q$W{IL^}=??sicBbXQl4FOU5H~#6bPYcC44{<)<#m;$GH2)jKn=pHfnhe%rlD zCijdbhEA1M?wcrQ^%4wCdmEOm*G;hKM(NY@C?c+9BLxM5Vfkl!PYbxW=wtO_79kN+ z@#c$4UoSgE0_uPezB{FUs?An3?t;=+<&y#)O8UILs6`%DU4zk$6=_JRB)XF$8rCx3 z<_+3RvAcvyUd@n8YI#DZx(F%iu|`Wpddzcr_E4~JZ*Wq8K4C9* z(c?GzI{Zs1pNF;9tXZs}%@yedjJ+oyyAS|sRz~|Emsb7s<)!tPZ5JIvHJcFBjbseITPm(3>*dlTyCl4O|B})8R6TM6RC_c~O9Gi5gu^oO{kP zb8?snk`(?2nDCofzG(;isoqvf?tvx)oNG3ipa|qL+&Ul!s{CM{H8bX+Ci^@HP_Vp6mGa1za7Q|TyBmxb3WEJJn*PL})%F=;? zeV(n9&wt80h8qNRLJl40;-ACT!TEA&(Lut*s&R9HL*p@5{Y34-&@mhT`!L|xhWgD} z4^4~-^6KpI$G&?E?!_NBz~`p#_WRC60LX;F5hehuuJ2U*#Kch?@^J*20Ed2J;vd71 zOaQsG(%-1~#ss(rkJ|(}bexHQ3HF`;e=P2hiKjm@;q_NcfVTS1!~*!p`ceW%DFc1e zf)&zDZGyaAJHjm9&mQFh_!#dQ!@&pb1>|vT<&aJPqMR7`82{jqdxM=o<1U2nfUZiu zAL;Lq?r!6Vy8{j!sDZ3gq%-KlkZ9yn@y(<7{?ojvF?54SrKym034jB@9|CnMEX0lu9Uor`j3 zeq2UbdOzB z81U!Q^9$S|6FxsM!Sgc{$f4s*{3ZgeNF#h_;`5>$ z`tLDu42EO^Idq(fU%-Ih#2qr>{sR-3KQn^);xfVAm07Otd+eU6iC3?ei?9^nXt-be+{JXw81ma03W* z03)9YFtvfE4+j?<#?n5UDNeGVkH{O0o~4`tqg5v`P6CiZ4zsC%1*MI^q#vTyE|Je* z_Ok&hia^Tv7KIcGc8RT~4y4VEQ{8dM@Rv(Dx{@-pp2dT#@`#F#>Si{Xj|9WO1Y%g@duRg`{4&!-X5`162Qnr9 zfs^0PgTKXvVETR}jzi|WGP%H!@v1OjIqZN5AeiPm6^BgxoP7PeN&hiv-}wK>vmP?>A4>?wv-INV zO|WzYCW=SvFQ9MQEQ$i%)E?-o6FAe~ITOIfoLC%8o9Df!MQt}^*p@&9Bf)5YpgL309iUWtSJhGC& z*b5-fy)rX%$0TH~cw`x%ZyG>88w=nu8Fob8F&NT)B8QGghQA8~ew_7>S}pUBhs7_l zbmY)+r~Ti<0I&voP%-&;#C@0cnJ( zNyuFBH<&mELkdC;9cSWKFy#LK4cy`T3oti05B|EqL<^Ka60;Aoy6)qjwRA1yqAi8uJb zf!RO!ss+sT58saR{dGQnGzo^9nf=Ff9yrYBe|O1Lf3uV$E3xh`{OL9Hub&dY@z@LD zU%e0B>retV#;Hc22%d_))kR0>qpgl`l_uXHyk+lx)%cq8EVbg2+qoKymM&{uj;hRVI@IPprvWD{a%6xg?c?(c0;Nmxs` z?X}>=Nx1C7M!^fat6kqqgte*YRqmv2ffHC#ulz^{vNFZ_?ses+xcqnYD(Gjse(}svfY>&14m1g|?5KwjGi@*j4vN^Jnhu8oxvq#> z6}`OREt%AMz9fSkFw z(Xs@cAl2%!L{b6g)&~U1S}A-Dvakn%qxo*Siy*uu_iADhb@8rat-$!FO4}(3J5#EX zH9et%oWY$oihh$tm?Q3j$SFjuy2h(JObfT_Vs`_&PlV&rh^qy*}|W9z|1`=2f@h?pQ^!QsAxdp1W(3YKE_9XSq$ z6%K|C;blIE)@0YIc>ro}HX^jQbi3cN6)qCK8S8&AK874F*J_zPk6yhHvQplPvjnTh;K+5HAZi~p`y_kE(qE`o4%Uj zy5RdHOfW@DD!V+dg2v-(0P{;h8tvhTdyi-@3>l4b+Kjn{&b$;H>r~ z!*pYuOUMi1f@3pEOz>3>0K8IsBky6R^vY(@d1)?45s5Spq=;0S4^l)XEdVJZm%aok zqL3Db6j4fxLW(X(i$hYVMDU--GJjO2GdgdX>0c~(uFvn;yrL|GhE7ENMXX#yYk?7? z;agt*KEIfGMHL7QlZbj~tXyL&pD|;?TVBmRzpQ!18xR_{vSAK@er!QW2SURkq8=Xm zv8i?4m=QIf*SpWJZeH;&goZ~%Ju>!VbF0HW#;f_f$$fsE^NJP_8UYdY=-7`f9DT9Z z$}5;#mFY}OqVfsb`yyxOr67q8K41E zAvE_y)H7l~_UT_QB)medm{Bfb%6t!zawHJ+6{zl3>>uN0NCHr0a^w!M_?AE0vRK4 z3t%LB7pH2|aWP{A)e>0B-c_n99;sj*9)`npL0#dvcaZIcgO=l<6~EICfJ4g2fBd!{ z|1K7s|Nq;}I@0Zh6|S1!n|-0D*$cozo0@}_4G@@M;oPx^?DmU+!&IB}byUztz2Rp8 zl==c^BHe*#NYIZEr7~GilGzqhX;Cq>QmSV&WhimF-w1iTQc5G(UH?#-v3*x4rO~;) zutDPyXQ@CW%aU{tgZkGB5SLMYUN>4X4A@Gr2-)w*2HTm1I}TPn6+`~nO0lk*pl2;c z-nb4y-Z;Dn-qkd(Q-Fcsxl-1 zR130_8^GyqKD!(^NtW3J(gp#8pbb)jk;~_^`*B($vJ&L-X_3qSH^9Kbiq!3qmNn1* zrD&=H8tx+XaGOWc5QGHp<{`lnn@Ae!kxK9PB9;CJyQOAcdcZEu2dkJSP6vgk12qyS^FOYN4n|F$k9ec z5OCOaLw0BCk)uC$fp5d74$e^t@COL`*6$L4>ipMTmr4P@?3NTB@H-Qh;(F1b;vES{ z#o43&t_%9V|A6=o*xQHz1?`pYRK+&l@#d^n4t=IIEOp)ut#;CcR{w{EZ z^H#c28iG5H6+e^H%o0kRx0~=`GZXxWg=MKgCZ{FXHgQ^64&QOJy}PzK+e99n-I8G8 zKhw`vS`_hT7dX=Ym%68rye;UL3ixMJD)xZ8!4o+tgbPU|Zi)p+b+v;Pv98F$bij9X z(Gw(^_yA3VMC(W)(f%OXEt>pS!wy#XNFnSA7N87is@uXz2KX4cpFxn(SwDf?5u2x#HW{K-ZAtfZNi+g+=hfsSYjV4gDEN zU38GTm}Me0x67akm3N9b?4_d*MgFdpA>JdK>fCox+5ELx5fyEv-U~2~tpsGZyL z=5ACLptDvO<#f!RFj)P|w(B!h?=Q@r$J2XSUO?q`TTp33BBUEChz0qi9jQV;#bvB5>3QJSql=vm>TE?yt z4k`dPO7-?m`UfD(yR9WGtI5$@+2U@?+ehJ108OwS`1waO>wd+L%^KTR47HoCibd|? zi|gDQpbIxnX$spmzZPcHIIGD_CmKd%HEi0RcD*KCew1}uu?ybxxuHPD zu<3@><C0o6Tev_uZs}M0lYWdJOF?^t1s+J_8$TI6w zF3sDk;r#;dm}{m=RPbAF2_$H6-44LVq6g+ftWn~fpRg)M+(I$By9&>La-w`n;&Bsk zw;=pX86pMdZj5gJY!ma1$|=13j18G7b9BLU=(qtMlhK)p*8QPt=ig1SZ(t4s zO5CxmGWRu^Z($*7Fv1+FUSKm}&Fd2PFtPRYb~&{K)h^hKV>+H=#Z)(cha&P2YBXeF zd&fTitpOG$XX4{ETAR)t^d@5Q48>vt*@UyJi6*jVIYOg+j@_W}C8>2mGNvFa|4G;r zeD0IgP7zsSCm~brSKgiXa=(I=NKS6fw9TE&#!Gy|&NKhaguzta6ER1U&q>0%7G9&x zw1pb{^MzFwvf)-Q&gq5Np^3_0N7=!r+ek(|O?=at*Y$B0UUNie8mIo|V>1gS9W)0( z<>f4?XzH~R6i*ym=ONX1rCRu}_P`ImG@sJ415E`l;|&FQuZTrxe_NbdB= zwA?CfT%9%1MMv_p-a%CPNv#uCQ}hvP@3z~eF73R>#Pww?QF_e9B#Jkv;(|)a`|!RL z&`Kteu}$HOQqhK58U5*8Id83BU{!07w430(AS`WktF|@hd}-PF#5+|sMX_kO)40Q} z87ONb!mY)3XIjm>UhCPRs0cr_-nNBi704HxRWG3qPg+iqRzdFv7(k}KFRGu7k^J68n{E8$A^NBC*rw(?TnuLS zhn5p%u*_n8nPJcFM8H0N;vgt^?Y>)Env}boD6V2o{XuylIoo~W>m!=*$Oi~16(R|1 zdx}9!xIa3iDd=4}0he2rmz^xt%J}umJ8I8|YH?0$Qq8q=UN3q?TV;JaqNsUn%(EE4 zmTxGIY*A1P3$yNCs2SaxSl;KUYZNcL*%#v0*^sJ-(1Ep7RiuZ-CZ}XGiNbp8?XeSW z<#GinnWkZ;jkb8or(dW(-(CqDe@-{g*^&+9*{}Bo4dd+?FbdigIlT>H=f{SnwHlGc zkW!Tgq~{UYmwlDB4s2stRuhT7-Jk?qBP(=-nYP-W=kN}tTH3iozDOy-z!zyGk)yzs z#nP9>%mpK9>s7f>lO7R+tH@Y8IPi9byK|WUlS(qK8Km4XuRHTWWf*z7y&~J|$18V5 z>x;=W_oTR>Q>q`g@uTD~H0S26cYpXY7>kPvGh;t5oXT6iI85-B^sTaVeAF!q^&V?fX<5Ht6(@l=}4EDO~4H4VjXc97ZM2(6jVdowumDSs-zYj`?`5-%L z@KGqOGhM*H72ElXEV~a*;s81OyiaRwSjlGtOacjpyyB+wPMQjFrVBw_n1pwQ+dXR) z(^EIJjAR~s9on~V6`}Qx7{Q7I6wwD7Z#*T0uVav$Ui8yX%ODfW>*Ryig+JC0eA;t5 zo{KAm1ZPssyccuNtntfq0tz?7`BKZ!5$2c~Y<-$U1&Ip!sP+k_uXkCOY7?GU(0jP2 zyD%&EV!ou8k98Z95WV6V(ZDC1zKWP_97vG`qb;VsqsCCbFcrUQspl(r#DsfZqug z?!4-i(0O(``SL351>JqL${gTzV;0Y2zHXOCZ9&gerE`aFExeXV{Q^Y{i+-&V^;RcK zre7u$V-;G0jLRyfZD%yUg#$MSLI$cBjp>-3+k#5xv%9Sy2-xwnHEYN1(tc=DH{EHE zJRjy2xFIL&xYj7oA#=883)b7RIFFa+(bK2x^^pAZ&=aQQD{d31Xd85DXa$?8Gd!mh zm3=uNTVG{8?_7E3f#T}=KAgfpBRgNpi_P_grTkL|-Icpn+xo&jtbEi3aEkll8Sz-D z)hmPNSSwFroqsIxnl`U{FjLO~!L*LolYb}K4gD(x&@7NJ-tED$|D$nxY{|b3wuc>!Z z?&?HSpz_t26P#K}D$~19sW<`Q!oWDy%eslrOUVMUZx)>vmGi7xq;r=wdgDJiPMA&S zFrD%~BO@maY52qZU=kUG%k&L2VSLI^>Bt03((!o>*4w zaArn=*;jszy6^6#;qQB#nW$5Dh%79!&DdM!8#I{C@@R`45p4*FI@R=2L>KdbCNgw(PnH1`p>@wcxvT%AsX?qr?(-Sv5uLrOtA55h`<#u8%6TjJNKcnuw!ug_iTP_=h z;PVi2A*iV)(dMGE=+d)G?wmsQeq0Twi)@-sLU$HAnQ!mYzuh8`$QBe6b#c|*#+Rs$ z>An59Yl{a59pSeGMG>^nG$`ct_KU~N_a?2ut(cZPd3)4AFG)ow2)iq6>rK6~fsl3~ zNosUVAKhiQiTQz8@kI7BfISNX8vWZ_obnt^s;?ep6p1||s-WZ!HNEq3J?~8oUNB3i z)Fq18OP+K`k zDKf9=MS9n^1DCJ~Zr)3#sa?gEeofV-WvQCNuboaH@OC<3#=?i?Q$0}qrFDNFVv;Usv@}NjFBVYWk2Tw9N!_mNziwFq-WFSVqbH zK8UgivwFmvuX322_Xi&Jub@Kxcj`FbEYJ6mTyLI^3cL6=uEuZj8cwQNwrylW5am0S zfZdXe?#8cnH|gmx+PThPo}KD{A9HmV%`cXaK8j<+cDCkLL%BAiqzHGk0{Ajj4}4cT zZJ5wt-LhEaW#t^^H647}>dVl%g(NXtImS%8L<{v&N(<%d@BNtpdOd=*dLpCg~i$AABn=>AZ8qd)#KObYtc13oW>Egti%XCIN23eVQIgs>qckLj$>xpfIvE z5<-_PYmA|#Kx~%qtTEUM||zP)KD8{1R4OZ3t-M$`3Cm#*A?i%%kf>6}&- zW{Nl`nQV$0$vHx6YilS+#8Gg^oi{f4)<;!hVT?P2gWRD{hWh}OPYQ!pLHpU)YR05I za9bido))bTI2w39yAv40)Ka|c!Q1&_xMZZ1wxtYA5wsdT?!1JhH3yfVVO)UH?AX63 z()Kif@oOa1S|_l{7m_qe$|`o(e@LQ&b0I>U(O}p)?jwU^-f_zw2N8RU(A6=sg)IK{ zi`A!IB-Z*h166sS=-z%Fda{liY%mtK*R-HRx}&Cqzmy!U0pST9eIztAih zWg`RD^2jApt#O#sfpYDf6$JjL_2hRE>9?TavW+_6Y_fr??q?AVju~sNUl&9y;6_ zg~NG|%cX(h&K>>k5<04osN20oHMNfS!j8+7W`n1LKI`=IY4e>CORo)Zq8cDKRWg)ZI$%8&)$96 zP=S${_^3_pkSv?B;O>El&}kvbnK?>J*Rhl->PVB}@U|&bOn~!_K1BCc@q5E{WjpMh z-4C!yZnjhHK@79%vuxOme$S~MMbm^PGZ&-3(2l8Elv_%axclf$qO?WT=D`V|w+@vJUl+tQkdSa+c0nCd~EXHjv>|5L;JQ@g>l zGxxD~CGW2CH9CI+=Hdvy`jef?d0sHgVIDhrYs(K?JiT|$(7MS%H=5@;YTJ_`-bK*` zeu9tjqxEEr5Z$wWSGNOL=wXquoo0^wLr$;ca!$HQt@H^CSj&4|A=QXX!`DwkhqKT= zznkg9PeC1e;*tr|Mff28X{#F!fwLsEnjxArvmr;+^bN1ojOMKY1B;6EZC50GP)-Fbt-d>@&8&`4Zf|wb$&_woqREFoXx8uuXWmt5j7|B}!ZL=(@Y7ypFL#*@n*$LlF$22E?V)Tv;JH6Mmnd?URFs?c)BTPa3 zs#RU9C)Z3Wb0A+DZT&N<(Lo*jGHL2OXA0S_O*1RQ8^MB=mcHgBk;WugHn|S%c&KM0 zsYnOQ_Kh{;{g;~xmMY4w){M(eY#QHJ#I=9;@^*Vn{NvrP>j2vnHu~rKWbu&CuYyII z;xy?lxz)|BzM-4M=KpManz&GzialnG{iV$Y^rUc6sx3K%Zn`O#%x#&Sa+1chC7p9u zl=dHAa{OXObj_z`mNsv@;w5f7k!Sq7-MKBh2wshwc(Gl|>x&R$;vuZ8ky68}+1MNH zaW<2@8q!MyXFS*d>1pA1<24$qX?vUxa8+`%lRTYD5`$K?Sh$ZY!cV>r!moH~*B2A- zv|~*6zM1q|oXUI`^AM>!gZs+(B~Ghzye3R;@C+->N$liLq{W(%yrE#FrHIAe=lYzi z-JD1==grOdam=WAN__%Gi3IR#xZL(WjdORY8r@!Li1N7I2254N?qUbk)dnFZWbPSK z+Yge>%_MG{jmh4Fq{#Pbl&%*sh$mI4`VN&Cv}2Xkw#B@ob`icKRcP&KIM!Dby^ftv z*38zg)}s1)za;7P7G;$q`PBSFf6F3A^pNwuQV98F98U+KRm`Yy-cT1R=bgOgGxE4_ z^t{NBC)@aOJwPw?=9yBexHM+7CmzsJ%{bI$WKKqoVkz4@O12>Yo-D+(z%j@f-pb{$WnYmB0$un0n z*zFl|0GqxO7>}Q-H%93xuEM?d!kgucYy#MvjHt;kaolp^rrtAsHr=5~-*?ft_1Y_O zx1tQPS~ew>$8GXs_mY*V@Pzo(Nd2AE<+RN{Q%RNHSW&z>R=4+%>b7g3zr#+gZm6tQ zo@C1_pgSYI*mm`vz1G{!6-O}!*7N}9L5`0@G4VjszS(nPEyrxBoRepV7Tj7@$Hbpr zE)1|$qb3*`NK#Xdd@t>x59riL`?vIaa7NZOztSq~%6J)R=MD%4kNWlu2K8#vfQHwO4Y}S_DXV1jYo=Z7i;ffaZjqZ3rF#`daakd$bP^V5GAG^D6K^EwJsKq z(QH~qLT`>p-&aHtJ(lv@b+B!BBpc!&)LMy5CR%XdAa%C?eB5fM3;7TyE)H`pNVZ$zN69%I- zWL!D9RPBwkTDj(bp{ao0H=2-~(s|b|AC(;IV&BQVXama+@-3St9<0`(1r#`$i$wKj zGh_ zJ-h#54E*tZZ`?A$?zHVihjEV?thkPXFFu;;{^>yZEP2OaFbPd)N)e!AQSR(XG&fII zNaeJAE8tl1WDqj7f4iy3fsF8_`RfO@xlMIjS>|O1y`E#n(%OR91JdPJ)w*$NQvm!_ z{RfQgJ66=zBt_oan_o=?u|>qom4m^Hlejrv&kQU7Z3FP5L8y)owPE}HDyXFqSRTD zsf-gQx=&g}wr%}s2R|-9>A7TIrY4|7NKFf=&6TKD>rk+M*7_;0;Jy~40M>h(PsYPS zj4NCObarmfrjy!dZf3D*Fv{wUEpb?iPsCTFfO(hiaD3-!uK64H9Zr_cZtnmDezhnI#*4fOlJlQ0M|ouB&||m!)1ynf315hKSRe_rlr%hfmu+ z296#fb3gz)8)JtG%|w0awZ3)Y6Yya{em<*wuB!d^vRfG!WfV{+>MN9$4W`H~xFVdu z>akvy*p-x*Oo*=#bC<83e$;OiW~uAFsH8=Nwj$<7ND!X$(vNC$6{=@i&I|`G57xgX zT{2~fO>wEsU8z!goe^4zsWAE$pbuUdzrk5z77cM|y537#M1IMPh-z7B)b#a}6M-J~ zNj^`*7W-?Abck5f$GU}TWzadbaYnTs$5L$YNey98%i57_2WQ_P@$rsypnTu{TGoR~ z$hkqzf%w*GoKk94*C)>};J7I+(kD{qD|S|XII%|E;50<;qf2gYdEb*mBdFFg zZ9^hpa!HzbS&k&(4Bflpx^qx0J;UDN(Fq6WV>VvP^<{RkMQn2Zn5e!6?hBM6cYBLQ zU7qL9d{yMX-jR*v6HC$h&ffPfKt>(cCB5!r(B`ZD@r1d%*v!?%J28DVxqG#w`FmGc zy$v#-@Kz#AL>-pDvmvSth)y?D7!U;GFd+*rZA101-?%J#t#CF!W zogKM~Q|m)$!sdPBOc&R@s;&8H)VP3TCv0*}hqv4+Z|4h7x-5h@sxsTegv$Y7P%`C% zqV&;vy0PD*e@4}qr&Iqq*N$zmq;^5~EJ8nBR*?s6pQ;>TL5fa?ki@Xmyq9bMZVhdn*KCXA@r}_m$jQ16NL4&LHgOGI6Q2 zVzpatp^@B&{cK<&g}|rRk!&$DH{{Q!++@zrFfQyiJFCrbhBWiu8KQ?}>_7)U#SV$~ zg9Qh=%7Ld9SE$w2X!+~a@P^((EOc`jaqh<{hQFN&z$O!wz;K`tz2@a#86cc%XIT&` zB6ky0#?$zt|KRNu0(h>vT3^ty1V zWn+E!m}?iZZnu8gQOmN4?61qnuXbc-xYuR%h30)- zRzC_C6T`jaK}3tcAL;BA)Q+25av#BYrpMHV9jGD!f+yVBMG7=kAPa~9A z(%y#l0qzhMRq^E8mMx>W2=2#zJC<*jNESNRWbSdeyc3>}u1Sfu^;IJ+_F;uAeWj)-O#9=V~@;mYm(T z(e}%Ch6S0k3Z#iX&(cUYk7TTWbn;9PmC39ih0Ehhuxk+6#s#v65`KQvfNiRCIvE|0 zLckOpo*Xa6CIC%XY}WB9o#~)70W`-bN=Y{;5c1)Xj}qMN5`+P${EALth}i|y6Jr>=IIfLn{MNC=s z^fhO$T^+0UNO^ugWs~$({kBnfdai}v1}9g&#z3ErPt+_?*v93(z*8dW1!cJHPol%( z>vq#EM++SyQzdUy0zs9W`@U;ruZMYv43==auA;I#=vIsolG<=GRKVBQ3p_EJ@T`NX+{a-vg_r% zgS3zf4L-MHhq%}JFMNkY}=um<9_v$4dd=duY&Y*H)q4mBBRee4dUm< zz2ftBMs|KVaIH-776GxuwF2HZm&~HCR*m4ny-ZDEr}4kunC2xPq-ZsCzw?wuNcGhI z<5`6;atHM(49mP&fY{+7{N8frIe)7stZD{B1OD=Hf-Jg;>Af#=ljlEVExjnkY30-o zAe7_2ftx=`FqnwN)@Cd3NliLhJPmP&g@TU0bJ=-^CIf9b9 zt3CA(nKuhAYZf{#CsUU0bZto5Z9Ko-=K6Yo(W6wX;e70uJ74i`xLmk&|DL)wbK5qw zysXSgqQR5i4@1%&SjnG)bfbR>ji^M?O~trbA4P%ghMUom_(geiy09gdrK>+>mgI-$uHXC;6BAWG|Vyk<63z-FK@br_#0cldI3eO z&IAEFUv;kto06D&5DI4LWDfgvq{?i{vg4w`$?WD0!}%mj6qik&UFGW+yquR}Y89Q* z*q>a-sFqkGduJ47z*K`&hWrzr59`~f7f!ob&ZRjLs4o_udG$%xWGU~#36;H1S&x?l z7Nf^!8|89DC0$p-EA~*S0LuHJ81hERE9bX&StQR(PtDkCqNH-?4aYbhjS+Fir~KmNM(I$QM>HhnmWdBl zba2*BHAxY_yH5Y<#I^9bm+^+1)iA5beu4_wo1Q*c{P(hl&jtzQipv5H=$@JA%R&=2 z4(HG%DHnJXGTN`K`_GtC_216Cl^S7{_Z)Z^xjt>9zcKk~kyBI3D#%Y%i`yI7rkTzzF`atpEMIXNTodtYOjdABi) zC+D7HznOAu0#q5Db6AXT=H`lb+@_ZlcnrOml*}h@&6(o2U*n?iP7?gX8GcHV8@R&s zl#uP(#j+X;uNuw_+eB1_c3ZkQ+ed3$&@!1wUBhQ2cGL?FZLY#A>uPQHRs^igJ8Eo= zdOkdli4BV=@{Kh95J;B3Bp!GVKT9LOZ6tb+wnqb_h!fE3v-K$jxvZF9@<%MRXI^Y0 zgw~A^XC{2febF-9kwxw+T9e1SSh~|ZX8+QuudHM&p1_$7KJ2VjN_~H-Fi0ZKpqwYP z?G>HGGnBi8nmUoP5f37)x!p+pR&mg)Txh_*pHx3{%aK<^A{E2wr7;r+u>ni&^@icH z^fJ1;;Wj`Prj>3`ysgx*iP7$fNS@rO;T0HDkK=6|n4ETuqIQa1p&iarzqGu7N11V2 zEM?)FElrwi$(rnoHjeuRWJ}YUZNXy|#!O9O#{9Di##t&*-+eT7iE0$@rIXG+D)RxI zZRN&H&8`_rrO!-Ku#HPpiceGnW1#Jl68 zp3$Y3@f@2R*CJEyd!Swo^BXNEO)9(16|dEI>xBucszy|7mGO1Q#TJ7q#xQe%BY+?Cv6N2$3IWbL`7q;fo1+? z8WMW|)*3C&%FJu9kX1hF&_#dd36!+X&;D!( z@TN{8lzywy-|Xh82itCY>dBl{Rk#_`G@iW0xkH&wnF8+o!8W?)*^l?Jhl9$G_j*#T$DZvR|t;lg`rGGPf4iKX!lCX2XP^U*Cv~t?27yqm?}}0tGJf`i1MAK$8H{PJCgyvq0+V0jmye;HW<3bHgT+ zr1+%d``P_g%izF85udjmuU>7uIH}t=`dEQOV$8km!6yY74~C_|a_JCUJmoq@fP0$odK4B|32Pj6&nqAG2d zbF*Oo09=<&#OhMo=c~KqO2~$qTR0lbTSZ4&2(quiAN`;zNR?9Pwy&h-7nvI zne}%px(4-EtXXinzq1M09Ok&@@-;9ltH2R^fgZpVd3?O&@XqC$im7tn;i^;mJaVtZ+PkP6&l4uYaj!mc#12b^a@y!K z35#iE&aiA(Uwl|;)H3wGAa(1iQj<(VaEASj6FOh*%D5)mA&t$YiY%eIx(TXQz1e%` z{Zs$|)*&I-v&0kPMvZSzBX`RB)`oNqCS`;qs*g)0`ctEjYd0{-mHPAdjEA^GlVt?s zmoe)G=pJ&SR$pvird1fZi%TjTSBYk>tT7kCoIfIh)ixZV?vr?(Z@x5Q1pftTUFkJ> zBJ9ZLIauZjBl5yC0AbJqYGvhB=}Or!d4hpt;wP#MnY)yOG85+~WHkl}GGbJkCf84g zzd=Kz01_P$FK#lU;q5*NEUgf_0|U^)VPazyh$`cy;4}oG6s7b zvE;#0)z5FCJk{*N&>Z<#nFg9BddPuKmrz=*Mlk1DgM7!cc#^gIA#~!Wy`yC_RMS67 zK)9cdy3kYeB;mNjycWZ4dEd8buCkH99@e>!KLwBCJrd6N2mnwFwMwMje@@nm9 zCq@LIIW@q*y=sgnzQ;1RHyy0{kmm`mPpF1UfQS#~$0rvrg?bA4)+AEDR2mzVrS%~_ zgCFNaE#F2VNjk3HOugx2z;yRnZfR*%y!*X)kzj1Bp6l|$0UQh(6cy*1uU+=^Zg?=w zGjoe`+U|Z#-IMbp+(ewi=ufR(vEP=iY7Smf)Byx0x^21h#vbZ>Vyw|2a>o~_hfG2R zP!-4$r|@@tu#KNMwvV5|p#}dZ%i9upZN5$6UJt!Pa36-3P*psAbp3_oe4|pDl#o<` z#y=ei84N_bp-=PLjXEMzNryiEOo*yp!GmtJ zGa-y+K=lnJzG{7R!2+3aN=eO8-mWAjuPiSg-!sv(GV%W6A^c{nTpDK=i;15J=o6qt z4Gvoghmgjcto6RH{G_N8S{ytZ<%n(UnR(0R6RFoywCEGPP*J~D?g5%X2p!9-llNX* zzDh_+W(Z!MU}(Ei6Y}g5?P*e@%8U598$mH*=S6`Mw8dfnH-1;Ef;eJCfh^u!_b)|Q z`Z7#VQqdT!jeVP<=$R})?rXg>DPf}XPORX_we2xy)E#}L|mt0Ln$zDBJ zTs(@eC-0rXYWF{pZWnNp3+uMr$vz4K36?@og!FCwhGs>1&Wr2~m z0BJzy9YG=64F@L-$-Y}sUAA3c-Xs_-)8V}v+Ol%sa%Q+nzi3EMFoJ@qLbh^seAFB;_z=yU z?f}YUn+M@i@lpNl$Twaa&OW6@Wi7EcK8^ugCYoxk<$L}OJp^nJ4KKX1tBS<^Vv=9A z9a$de;m+BMk=nTdMVENl9dw>6Zr*53i zhhkN2tIzd|sU&q)zREKb!sQX4S&iq3d+kUes{xPbQWp)cW#e0%H9_}>BxRfIdt*xj z)N&f4q;=Qf%5L^PF(=Mz$|X*VGOPKvz1O(uD~Ueds(fl#Hf)qIw1CAl|HVigCEjHW zv;pFjmTYyLK^ZL^nQ-^)8O~g1Qu4X0?@Z_`$rP#fyIiGGg~XHE7~FI&(04Mpv%iBG zJ`A^cIcl6-$}(~%eP3b{h(HYLR#e*E06wmaHt_7e#5TInCMMa}kZ9prial-UWSXZI{POglzqop zEAEi)(!V;FP-&9pTH3=>$8TfpU-o z>HpW(bw)LztlN-KlzKoy4M95L(gK2@fQWP=28eVJ1JVTP2vUM_=v_)gAQBLiCPiux z!BC||2~tFm-h%XAANtl^_no)y{F#}(_V?}iIpy1HK&%)oYeuk^3w+IPw3>lJ*tlG@ zCf8^)`BIp`7@)iHCCawHi|-kK6OwoTN@cMhN9fKyfsP6%@fl_5S!+8?<;`a=G+R^c8Gixf z(;ITFM29-GOBHZGrY)e>kvv&JraFaEZhlO`9Lfq1EyY&jhg*di#QOq9>kjmtT_t9X zn^sB}6U1DUx_g@N26@v<5ifi*PhBT%Uq&#om}2lFL5gy8yEwdO;SIZCyZiChGPqG< z;s_X}CLt%kgeGPhjo8t_$|$RuJ->9%OJj2xY?kw+2-Xa2GB*n0#4$0zZg>*!#Z<495iCFX^J6Jtri>;eQ80Na1w9H9FUA-sJ_iP$2Y?-WzVK6M!40xU~83a zvETl*6CtAFi^wFuRfgx=^L|;}d#@;9IOr^w|0su9<$m<9NjyCDAoT~Dj9|Mg7P_6_ zZ&91({9G*B+6jHX-PqdnNr@9?l2Y}Bny{t&vehWauUfOSw`T38qEe-EK=w%g)v(T( zrIl9RY5JjgH0qW9^mN-}+n&71w^`R{=j7!8w-<8jfNEqrKrRqw-4g++Vm5?hMq3{y=5w}rdDM*m z1ouJI0cpR89hI0@Ove(RZ1x@N-^*NdIj$qRxNi%Y@Ue7?506Hd$FV8PeTYGtWN{4D z+3=FXQeb8xP}QQYzSs}t+!B?B%97czDK$guw;XRc!cyu3-oHBiIG(Ekp?7*WUA3&# zU76^~WZ7@O)chW>>8ODbs$4Gc<`(ql*t|Gtmev&Go#=z|R8>g`Xvos$e7@qw_WN~& z)shoZW83^Gep6J}#OEQthY>KADKQn);-DD#A(C0AX(ZtFYO8oOMC*Q1J*}+caJ8o~ z+UbgQg@&nvmbgyMNGpoOu1>AZWT_Ds7~m4VE3TS)ywCLQz#XH~$aCcPz@5j(TaG<> zJVhY5R#HIc=4b#}Gvktw!x!2e5S6w;sQ?lAtk!_tFyn<(7=Hqa@AShKT*slvYcN0O zb=->&esN$)gNxd_Ooew7YlK`uBex^Qo$?5|6FzArst&2BD!t*ibf`KJMWUb={I#0p zwwL2^i7`u4LpX-vJs^_q>Kx;)ZM{iE?;)+ZsWiAlvIikKX!)r6(t;dbEy|s?z;2ZY@)wBBER(umODPA8G+=m<1Uw?|~BaS9hB?tM!SOa>9ZBwevwwNb-4h3ma8I&3i--CMjJ?-wF#@?Jg0 zr^cwkd8o$4j1tRUgqaivAkg1ve#~e2uy;U}^nsXEB~IsdEo5w55$)RDnA`s8G-2kP zRiUpnouSgA;A6(rc9b2GQr@q`ou6)JOVo=MOEfFsrVQE@YCF}d{2;+GXz|J>jY|Ck2_UQRy7+M#F)C=8#S0HXz1t<(OP-YIrmdOKJ}F zrtFj#jO7q1E1lLEB`m|ju7>cMVn2-hw-e#!qpZtHQ;w~F=G)+i@}3;G)4SyHN3c1jmn)fsiG`jG-Ku&mDZ>RxH^I$fkh z7s@uG(brJBy|rC91?JIcrpj!*)IYZRqte-Qp7xaLGL7SBqD7*bB-WKm)VTozKKYzP zUQ6gc_;oZEwKp61$q05(-}vsTG$!@hy+M7oSVTniB{tX%ba>5xowXfx>hZ1zY;$MD zeHXplZB#cu61=^)(1u!JFFs_q)U=tN)@=SOG;b$ns+J+#=I4*g3j!Up#-)pY$IP`X z1X6ie*Rc8j9B>O3;kJg*Fa+;oWT@>tYwVjhxEkZ|Dq9qqKIy`t2vA zWk?Qq#s1@VH**nhp8U^X?~c|xH@?Q@@RK(4y^C#b3Ynd34F#b>-?P%4*UQd*PV0>q zOA7xG#jp{DfAQ|wYkuyAuuFmY4-n`R&@H~D4JNg+I!i5TYb6Q2BtXtx4F5q35=oHB zxT8@O;Ei)>Md}{5Crh_yXji6svMC-`!jocc&5x~Bn)q_?V*RL7VC=C+Ue0C4ySY=8 zEc(X_-6K@_uarlot~&cUgg1(rfWHrRjk-w~AhNk1v|c!KnUy_%U7d5Kd5m&3Rrg0S z1l&MoQu*Bz)YIvtib)W_$O~}6)ZZuM-~}RO2D|BStozv2XFbm!eP}VT~Z>g&bvDE#8)`Q>*?8mxD0X zJNt2rUj6kn-9do~Q+-u~NJP%j=Qctw@c*j`&IEzhSbVDz&vvrND-WDYtQ}vla;zAT#Vs_ye2asbu0_!fZ5r4kPT%STnqBntAQPNLd(orwRU8Hda)?<0ApoaI znPb*j5Ilu)g0h$iJ|%F~9PS^--kSiUWLD@*yN9?#PpiFt0ST|rQd*{@{?&nv z7X8{o_UhAgEa?)61EUze{-UitNh2iu^Gs(1bGW8@fMIf&k{8Z|Fn!|jk+fYp{6Mxx z96m}nzdTqTla~5kLYuBxXT=5@s{Ucd-ih;jU&k)O?uJJeM9>gdX79RH{A2NZ+G=?{ zwJIA}jDPs5GuwKL{@fvZi!_6mYgi)o@k`3PILAG7CUE>s0S3fx{uzB_1kf(eNzIeB zp!kJlZ?CV`Cx6*b5wZ&WmR4NVlmg=jjML5pZbMzBsw8=R-<2;;ykUW~S9G@9;1|+! za$nVU@u>P3>MYYmz8vlBFJRR?SBCoePQ`x0tWfW)FI0rW;u#AnI=OU|b#i>7HQQof zzl3F$;W>6Y#W>3Z?!|JLXIbjG+i zj5YV(bFVd5oRt=YmrI1Va*_~`7;oOZfqj$Zix~a36Ylk)maiyT2p2s|2uSuYV)S)L z?7OA#t$at+B2;omLGXd-YlvF5=qrE|&s%C>FVkvZ?&?poJ2}m;Mlfk&Mbb{MS`&QB z%W+U}rMW2W3fpBH*2e9H#Ty#Tmcq4J3wyqQJr93JcI|~jO!JKxmdvM<2W25RDdH0u zMc$L+=o>jSA&B>jYfPh*?SKIU==cTiT^g0kudBF&X8OYmVr*RbNBOqax7+e7_eAP& zCTf&}`4FgKG@0Rnc_9`Wifc4&@8(|Mvtk<=FT?sq(!?lrQfEl7P%)t_t$T#whc3|3>Aum48ZzKQz zcBuv)ydN6*_dYeD^4ij8fxoe3K=oaNZCHZ^W1<5PB9}hJoIZRGYKO7FEvmiql7#J!Q37c8p=vU2W*gl00e#j4U zei5MsfAj1nXy)iFskAll7 zPu&8v9yc5)>im)YGaPz4VQk`ms*ZWF%>W1B>b?tH=o9D*bv~>C z1{|J&X}GU=QSJA9j6^n36Qf5`#=#D>B;h*1t^QmGmRx@Bi7TvwFAQokGx?6yT?4V> zMO#OoO##m!CnJG*G9QG#ST{qI9EQ=K?2c!A0hdN)1A#nwSLs7x`}0@?YP0FIiWd2@ zn<~eTVn<1xH-aU5@_nL$=Hk2jrb&+#EzVstrF!i;thk zd%mLg2MT7@}vP4O}fQ2+%@T|78(l#=UiN>dZ-K<`(pd!~j}xB3D-c)$IP5%eo0$|)@g z-fS(6w=skEHW$T-QU#JxvN9h?2(aO5nkthSG#RzlnK2LFX8+`1hnctq-T6tFX-e3b ze2FV4zzrKHT$9*(wTmObYA}aVnqU6lG?L6!)4}@ab`Oj02IOT#RQBsqA^87Z8MK>l zz7@=%ZlvO%wdjYrDuFc{<((=R4%s}a@5#fWhpLxy@7HKCsLO1q`trl&Qx-OZ{Nc-c z1?7(wKA#VG>V0<>Uny%oX7gB@!1>`@wzDn94>tBu{;6QZoNDgR-m&yF6};I^0rxRG zP|kt!1xBhzBH_mxPYum$(LSDHLxJZ0!Z$Kv+eq=Dv5{74$xGH6V0k5pQfW49szm#P zJpS^Ls0bP6n%Ni(H2LDfg3Q2rb?E{G8?{R8hBD!Y?ayVC>=+~!Swufy>YuOA`%iVA z0zm^2aP4kaDkk?=r8nhe#vBVc{uV}a`lZn0{Ri3@l(wY4%%>t;T0n;!Qz0}r= zJ;h~olAIW{WU)WW%b*7h%s|Q0lH?ks19_A5_@4~A--PS7D?-wS@+4wL>3~hr^vamm ze@v4S%>PKA-&o5e!J>g1E#4JB@S#L&a+dx>Owpldf}QjLY@R%for?jc2zA-c4VZA0 zQDgj@v@j&Z z1O@T0h04AL)dFb}@Yd8+L`8WS-1={r88d}AV?Qt?;Zh`1b|ZqIYu;`sq5WgWT95>M zxiFdhaSWR?ak#M7T)30%L6L=Z+~}e5GKnFqy{qrlvHl@L`E72AG>YSOPZ-*2~RJzKY8KPb<|DCz!G zo5+=}I}DT_xaGzF)RZqcopMjqY}adwx7p>S^%`6`PpehirXDXlk%T&JWlk+Rw>EChS8brPSy|>#$I&%|ce5ACMy~`T0-MWAWgu~U2qK*p?6idIGY63B z;jmA(om+juu07?Wb4-j2jT*xG;1a4qf2?t(^}SkKK&6!#U)t-2_k`x+hZ;{RDf_YQ z&z_1uwvqKGKmhOZix>P!u_#*6LSGLk8GnJH_o(P_jID*Y=;)brb@feJ>|6^M2bHqf z&=UvdWT95_JIoo$?xOB|{6O=d^`RJUwLUVUwK1$10hT(kgS1cvSC;#iEc@h zVB+-3S0!Sk>Ho9$8j$3}y;9C3_}|XZnzL83tE7TB{cqp-rFS#!I zUUA(SiOeQ>CD5;{zM_GX(?JB0G;d3@ase?XpnGtYoaja@Gbe}aO+f~i==1Sw#qS+v z$NL6nQ%RoJnQ~%~(G^V+2REdq@WH3p%PgqjTFVZ@D9HEYKU!LnR+6^@XsSYWZuIan z*T^hf8_h~xKQEa{UHj(Jf32tnda8jw%%s8?=}KdO?<7QBh0^+?Z1f^tp+qLFD5ydo z&%B0yqre_!Vx(a|NZKhVU2Ckw_Tfj8kZeym`j;sfUF*wfrd~aqf2Z1lN{g-ymyo^4 zvvfr7XH;|uj4`*k7o}KJt1hT6)F;q19QeIqwa8pY8#^Yh{xVB6Zb);X{t3L6h3>A` zKR&BamgA$^1{Ak`wPZ4Gt;%mY(~d3wiWxM3+bKY3t=zVs4%qCc3>?vd!-djLx)Byi zYZCbDAY<{F*w^Eea7$Kdq^||91Da2mfZxAqzPFrVK+zlGtgA~efViGPl3@ywc>mGh z=lh{VZc2N7Htw{VY=TYH9u4@#tTy%6KzwHXgS=NDH45A!M;NorK&~$4E_jzYBaTtl zftj+I0y}i4)rA;o@!z4Zhx4bNNo2kKEdZQ|t%bC1AbSq6La711NKI-%G-MN17)u+i zMy-fEw>uc>`w3NzadQihsnFFEs+oqw!XK-P)N zUV-$eHx8ViT6LrNWa*h9x*B(fnhxR6*wIUfkq-VLp^D^Be_cD$E0O|t;z}W{h69yw zxpQ3#y0ciIHqoO&Wf7L+aylTNn$Jvs7rkR{^TYfXmT_&vwwK2*iEdh~E%5r$O`i{n zO|>oP>PFI(mG=;46J|0FwYF7C-Vm9S7pEqVVo+EX1$y>MC3ds@xeSVU^>8-x?13LI!hQ@`?0YLDki8_@Sw!`T=D53Dq3E!X?y(#3x{^t;`g zN}H5%->_M}ZmE_pkkRYdVs=Fhzk;+F@@;=;|BmZ(p!g|C@)q)Ekjg%uq-pd{~MZ%oxSc18_aJ3aO$cUaImB6!ZLXSdMSK$906 z51}iWZloRJAr(mfYO2+UNThq0cGWY^&vT({?qXIx$>mX|NGQ;HF6Q2=;0OD^i_Qx! z7UVj(MGEUzB#YWj)CG1)ypW;kj&1HYnfgUt5Rdq;5K$yV4M)k@lYm8?IcehcIU?L3 z9XK>iuM|VBL5@@*{MO>IaHj#))G&)o_yWW}<>_%BTN()xn_Ra<3;t*|$ZccoXU7^YwPqdGi!_V0_? zr6j+pyWEg%R36|TchD9k;zVUj(QVT@P1wQpEyZAfRzd7zx z3DO6*mIugRXVvK7J8W>D-$k5i#Jc=cz2jzzqOYFZ^Vqwl>}ce~`1P1$64Lf{TXTa* zOQ^JQWz6Jg45x9lAXG?Z8ke}U`zzJ{A0heBCte6kkxt@ce^3Pv4bx;>2}y|rw+qWmR`qd!a+~@mmP}Q zwP<}CHursBu<_#XP5mPc!$6Ky57ji|PHB#mF`j@32v4N#&1=L(Q}{39Muk`lQj@?I z6BO%OKMuQ71gm|oNeZ8L?bWmqg#R7nf&U5E5eMN5A832l_>5(UPR02 z#&cebgQX}fI#K*yk5M7mQV+cU5L>nG{Mm2wGpe@=W_dc49zi7~y0@l3G}5Lc4hzGz z4|h-xx6p-%7)aayuV?tq)?J!Iv;O(jGg#ef2dT)!;i^7qQuExb#S@` zrDa7Wykpm`6T_E>DXb-1^*lhliG{zK((?XBDHq|t`teE&$dxSM$*c_yO9aV_v>^=n zCF+0vLmoZ6(h%!!)FhSEg#+ncTpTsI{ERvu$U;2=Yq-Zli6mMnM@H@@@@s-piTGWE^N7zQq(+&w4I{3)EVFe zcB0TNJ?oR|xFPARleNEuS z-zutPZ#LD%L?xcVgn|+L@pMTdw|U3y!+Vm<>-^&N7ov)1d(d(n;Cy9D<6HwY9nz?^ zjvS^xuas(O;WgxV%m6aB&<`#5RzTNu=@^H*Uh=QNOu)@>ucx7>C;1Vq%W7Kyt;uD* zrqvq1DXoq)Vc?36hS+Cie5jjdd*7g*tit%P3q}H3LY4Nj+jz3&;jHjbl_#P)77sg^Py!l zrEzcZ`P@x)-d4qaDYe9Dy)hbZ2-{_3e{W7$WuLZ}A`uW@Z7sntCTZlxZPb2fM0+U| zxviG4%{0F9feB_<3^ehNBMH1D%{ervT1qX`5_f`8q0J|`)W;ethY%m;kNrKq3|QW} zfNTM2V6WhK=GeX3^UJx8p3uAx-Xd4~9OiWU%f7J#f83n3e5!bnNk_qTJ8iB)Ek@ug zXWxIAnttD(?K)_nt0bDwZPR#)Y5Rr_q{Kdq6G^FZ8AQ15&NV#GDJD^IWe#)%Jwvdm242gGo(VTt;(|06ASmRU-{;IxqHA5?wvl+^?yYMAkK)KqdQ}RMo;#2pN=JO)dg>n_=izzv8Os4b%Q)^4~z47@J{=Qj9X1^AWKAX{oN2Ek_Bw zlA0<=K%r$CS8^=2x0wtL`s@GwO`dTMgKR=7dO@$r^LJO`t=F;@hs@B@3lWlS*%yzZ zdM&Dac?HY)dIee~9^Y72Q)ijpP7`|`M;Ge(`q_N?h!(ZdO8K%4)MjPZA=UdB%lmH? zukO)N-70*)@uyBZ`*_F~JpUYRbii;%Ql9eF8)`RO)8TE_DuqocFbPNockWt(i{C=^ zqMj`qsl~O>(qHr2Oi0MVNZiYdyI`3Cmgk!Wf!D&`X9g|POwa|!=76FU zv8>@fOm-$y%O~!ghvmZ|NH-GdkRM2R<7wQ~-=iu1hJ>1N)C&w9IG0y89bXFW1UFmi zXVzVLHw4BJ@`lq^tr8>zG**mWmwLSbq5B(0=vP^B`}BsHujk>quQ1hjUi7X%S06m` z0ubaAKa#5q6WU)_wN8N29=j+)kwLW^W3gM74cnCemn}7ua#OdX5s1`Drkwb@V>qnz zXst#Z9vA$;^h1=2StANmD+R^jse=k7O0u zkrjhMr09ptZxE?{RHg3n4`I88z2L<9C(e#&{X1c7OfsMT zxwgA-*y39WKaAH@)e{>{VcG#3F}X!5PBXp++ob5-NM-!mL-X=gqXJBSZVbz@bD zrx}rC64njov!X8+|0Yr_lVvPOgEbxzBRdmA98tWlty`~s7dp(Y-_R2azN4}Sgt8;W z$TWua#}4qjL@XUKpK~i=j{0gS7Q0(y%cI4CSj9xMSxEWY7&K(-j0O+S+s|xNp^*vE zlUW)Ap0pNs=)%3q)NtsCVfVU*%GJ?U$SdQng!`2J>OsX8cW>vPX;C@!`#`zE?M%}l ziIcypXKnVyn451D8Ir#xy-5nu{2;$!XiGT?Y!9RiW}=B1j9@lxB6JC%CiS@KLbOF3{l#@u>aJ3K$AGYhy*w)(d4 z&c~)W$=eGs7b$tmI+RH=07hJ9EBK{TA zMJz?8*qRCR(93(tOkv=8!YQ{ISn~nl;XVIOzO~P$;@`WogCcsXWQ)an#Tv-Z>JlO3 zEKxCn=8wos(f-HK|PQq84Dnl$!})7Eo!yi_HiICw6mZqj5;&tA?d z8y5E+O3beB=$+GwnE!0LvXA(F0ZZX)kfJCeQVoOyEL8rLvKvSREiiGmnJiO*EHa@1 zJ(KwC-3|{+gRf)tI0uJ}51jZ(9y{0A)C@9qSDxu7^qeF!05+ht3KG)%c!m@9!tB`I zsG_;7;JEYUeicy`E*?rk zPK;o)d|0hh=rc$hqn$%b)+g5Z-{N;gx72L0T&`L9#9kMl>GryK&xo&jwm-^L7-1{{ zP>^!AtUFL-Nh~Y&Qb%BM?tqJ4cQqs9no^b$mozNDrP0O~U64AbliWsnwd^dG-|-_h z27kE4dd~z5;S=HXP5c3MV-8_Q$HX(fwt~geZ9lt}6)mN^JbzNX=3ubUb9E^7O1Pu! zV&d%9HWI_JqSGgD9)XvHu8v8qv{q>#ohvwU5-A0Lh50AF+Rzdi$SRR`;}|WiLDKps zJ+U*_ctEXphHeyl)Sb*u^@m@!Hzyw0sO5A4T^;k`RV2s&>f2 zTQr{ynie^$rU)9%O4ro$`D;~H_$xLI9+~rhPGlyMvVDs-Gl>S%6kqf486kWFhJc-T#I|fWS99THxC9%F9Hl@hh1@>~>jT%(y z-k3GoEivJfHI}v>lmx8o9p`FVk^fh@J*WSwAxo z--=b(hw%5J+KCWRPP;Sh8iB*ZRm)g=B>k&qTxw8XlG6J4ct=yCVM&fh zGbU+j*h$r$HvnP76Os{`@Pm&ZrI}Vtl3Km&I1GR67cf)jnYhBmDVCI$!*(mH8fr;X zaI$pRreI)hRN0TmmLn^Y86?*ZJ{9)+CQ)$Mt$?C0 zNe3pPp-^d#xcxYdE%#F(lF;z>h5yzABbfyO&e)o$u|gM&n36o6p;yXYQwk$sk3^1L zQb(@d00j~+1;uFR=ZcE?`LyOfHI;)TSZrNt^N_}R=sx~ee!DOPH>w1I1hMqJ#@q-H zJ6L)rdmH9EM{{sv-8p|-kY8}CDhJhQkEZZ&gL5Y%j;Y$1x!7|2r<4XYflf^ofCD&8 zXk0OMqR1jP|2`qBIL$-2d;v}Jx%nnvHY4KLhUgdVr<__}+r2d~$0#hFXOS0G^ZYt)ij zQ8OB8189jY-KG-ZmnK$Z$%bbdtg`vpk0o^p{l1(x=v=Q;Ji zCeABLitJV*undRJN<~|O5%;ndY$bnU*@-fgITVl^l-wD=*8ejFFp*3aP0_%u>#NTL zf$LFckwCZhY@MI%@QOYsGQ3fAcm==;_QU#Y#A!Z+(pwKQ3iG7{ZF=wyAGj}}KXVb< zMu`V6laQjp(z9__7rb3P^UVrv%=Rnie zp9$PkJvl?PgQty*8hkE*HxmC6YGDm))Wg!GaPU)B4QCerqLA}m;#xSwN!kOY0fl(t z++#k>OxH2s^3m7*)S@_t@%zU%2cNfXX~U@pz=_-{TPvg-tg^wq<@h0k>MWZD z8@jwZQs+a|+FfXU z(xKdAp+(e6phVT*q*$9K2N=vds&wTB7 zxB5X&@2W=+=?n}9jIf1&8FGI)G)wFzUQ$l10z0LADRwm-B(T?(^LJ%kK`dOt2>f;p zqPtyKUznW+H4;tD^6As{?RlB8!yR*nmtgO!0My|p-Vk8E zg90akHju;6?s~%ufS*wsSM7>@8}R+%_=SKYpK0lLSY^mUVfw$WZpT{qV>fnS&>;Ev zIf5jyezkvm%2<(Bj2@{fSc~oSNr*&OWtjyE;nS$++PPb*iY!AJyKCTAEU?c%Jj{D5 z_%V=!V~H@;<5iHsiG@#1o8J<`4l>u4f5EPt8Ta1NCO@v(d-o{RMz1LGwnHwl{Qw z#q_SqQ-0kdmYl5r8sFo4k=&cuFlE2DC`?kotlB?wY0%!}3Tb(SYI2R_OXKcbI=r0%`m?*BOXtaSh`j4jQbr=)^Z{^N?kMlf#h5%OA z5K30W4__1wtqGuO$}T`$W{Q%z=iU$D4oi5arVgLj*7!?!1?i_JKkZh;+TqkqJutS3 zcC?xia`)Ra6v$5G7K`yJiO5GA+RlGk5_Zw0l7q&Rczfvhm zH~ffyc)Z;qP1_AZlS$0%A_!)-02Kh0vp8I##<`0Ch4swd7Vk^%sYw4tddI?}GcZci znwhV|)iM0!eQWKSuRkcp#aSr5&K~8hsCr7hZ?z@)JnH)M>3IcVUlhqb@hb2pihe7* z1N}HX?K4&BNqYLhzT{yweW_LG<4k?~ww6G0IjY0#wL{{nupatoxuo*s&K3R^DB0~9 zcOM4OD5Zy@buE)R5-ASMZq4m8vV4jT&MwBDXTA{}(bQ@j@y$tcVbJ1S6=J#+VCGN* zXMu@ZMny9AGGuQj2vWD>u_0*Ap{0Ls+e={Lz=B&2WI(RG;ufAuHzHej@ zYh?EZg%_D#p(NtT^)t;UvfSmi zgE83ZT>A*IHUv1CrH7sJ7<^pbWL&bYv)RJRX?#3GNAGdHxhJ8kEl=(?e`EmqQ}7rt zE>NduRK8n=T(IH#W&&W~N&Qu9wVsFB&V7$tNoa#vGhThd>vHEo=~CWqx5@E~yKLxj zHtC_Av8wjfeLRTj-M_jIk6gwlA}yE17^{Y>4qnd~nv4yN^CjHR%}cHp_y@|KeAf+| z_>xnZ?VUGVW}Ots9X#wh-+>9YVHmlVtnrNIRPokI-Y_pPxe<3%ELs}PL=lnoTT3Gd zS#yHvA1Dx-|BVLVPH#+PUH1tg4v>%IOeX}qi=rE`eRHk2b6Qt(Oy05BiW$`(xp}xJ;Dtn#1u$8H#5TKS5Xv+M4FA<5Pv(hQ6 z5A%XhSw-O69>cOpMhMvj-%)cljX3x zOuU_7bM(v)(8=AjF|O%3?iN32qn$Cbn%k~^?d*At&Evd9-e7aXMC??X`KQ%*%nyA{ zZ&fQ6w$fyV!4;&zH+qI2&zz>p1McR?ljV953eD_CMy^78?`jgUu$dI?DAoyO>j zQ^aCU@x*KDE8R)kNk?Snu-yA>pQ2odhfFJs>@=!|iRyD!oxUEx?9S$r4Xp9FMqW;; zXQu4!R4f|Ka4KUs%B8xsm-R2<)#cMLVSu9n7G0|)E|&sZm3$=WZRVcy@t*+YfpRw>rlxq{+qXs@jZOJ?dDoPk?=P1K=BE+CX+`G^q+ z=>|_h@n&py3vY|ME#bLNZkP6q_p=WlN8jQ>+mD|O_J>A6*PbSAOnuQjwsvbDr`2Xo zqAlbxuRfx2u{Yp2cMVQHD31+P8tsG^;cpEp_K5OhHz6I#uGqsVgr9DUl07vN!q*D4 zoj;U_=zclyC3VlPVO7<4eF1_Q?6IIEe=8(C1|0WwC1&9|CoojR`7a!?q1!PvaY*v{ z48JbGe|*Vhus_p<`&)p#^v~6W+Z~3HlzVmU2-vSrx-|E7kGkO87l_| zyVmaM!<%WIi4`gPD~IM)>qc;y;&!*S#`iWltAh8B3qbJ%zi3LUEP^wCW=bwMdsXWL23em&O1&sPRkwp`#!p0!n7`FOOS0ZH^4AR#2zN`2`mZfjvY~xTIIbh@lKh>~3 zv65)V28jxV#jfDyHTWm?LZHa~nT~WBlz-!Mxeb9*^r}l@LSLU)KN}_ow&mvF<15x> zDBPlS76AG;w)0g3k)zoR%lXQxP!CF}UvqD^c-9}Kx6fS65yVzx>CJ9Wg`%;h7R8+U zVzj_YGfy^J6_u)oq@2GTLvAIV+MVvb&C!{mAJtMkg#;zy`s48}yS<-JQSYmE;=ygB zYAkfkN}P3T+}3I^%S}js;%!<)IOJ|ZI^!z}X8`PeJ+D;B3B2n-P@R;vwN7hm{7g2K z@hhkQc0*ZUwo=BwW<2(CroVtQCU?(A#1glhCL@^GctU#4YfLT66>PdwtBtRUp3{xo zYAXd(l)S1B?=l~Zcx=)O1qK<`1`Em$L~7H6QyFWrn}k3gP@@c}Va4d_5@Jdt!#N8KkoE+RoV5=6`j*c&oy6u#0vDtA zaHv;b1Z>jyiXVmlSxhe?8kch|^xx9PU9fy@z~y%C$KR)n9{T#k`c7n{c8m#HB#ita=b&8LCNmByTcu3|rcF!0z9Ywmo&G zK21%f@9RX~YBs$uPo;;Or1I2hTKuWw0EOH#fLJq3%=>O=n>Jj_`fMJ`SpLYzx1S#5 zeB>k4OCKi^*JMLX@j)BKUf|GDnVA^)#nKYQvzkQGVKu*J`})4p{|1AN=#4R2*4*#r zp@5P>JI%3;d8iyHYGS>YHVc_3L-zhTvms(QYFLj5#QDCBmVG6CRh-UsCx{mI9f;DK zEtZ@1o!ZutP*0c6R=I#NOYXOwj3Se`l@34dk6@|dO|BPZA;;I2`%@`Z-)Wyv^ zS?jNMB|W@!{vJu*iY{8d_DpNarchPIAig~A)ML8Yk`>ns5c!V4z(zq}XMKkEUjjeM zJqgS0)XwcJ^U)fSDO!!d?vCp*W1csG(GfJjy#^( z3}rLz7)u8?Cuf4`BK#9T6nIi$#Y3aQUYl7<#zFahE+>AW)P;7b2alQkJX34KgaB+> zIufca%$t$sHyj*XahpG$vs_KDV-ju8_b`pQ#M45Zux!pfddT@g?9LSj`4h0b6L;mu z{1o|Z+{SQje1bUIGtX%2Au57KJu!ASdrp32Ym6`FD}P3}34F)=NQB#IS=L()m%uU%{*)#K$`72!ld;SFuNqc7+C-YN^mM_>KC^|x z2HfOn<5)zPu0QdNa1d1cTFvo!`c-4va`VjGFRoZLaok}$q+XeOo_8jgdGzmEr8ZkE zG#6Wzwz-dTrp)+Q%QY#vGD&#yEz*0_mbzAa#qhEP$5cOLAenk-os#+?0@WrbtIT$F zUeirNh-cn4k&ahm80nXmH^4DfDBtb22e9Uqc`fr~W`+1))mttSMrz=*A`P=vRea9Q zvhg9i9141@tzuf$l8}=<pA^#zyqB7!tO9lCIZSA!SYZ3U);QO;WqBsb zZ!HefTJt2^Qb&*%EJ!8EJOGdPqYpOzOOWBXtL(Lz#oi}3^}3?teG?}y$ie`)jCB-Tt8Yty_qVD-z7nPMG?*Jj$-MU@D+aN-`6)&j-*vG%p(oP` z8?^_yJ2pk8cveGsbAVp^8MUYVn{P@^jf=EHTv=~iAv5F|=I{C9(&wF0Ro(3m1*I&{ zOHhut5-K@Ai&sDNl8V+N5{NbL9h?-EzAX*|+hA0xOk*{1J;$db=4;VoRuAHu-&j5D zU}dprR?(^(@_tBFjusa6k(|0|kz9Ae4qROkIco{+Ii*MHXaOJ}PcVbi?bfTgBfso$ zY4>hahN)Wa;xLHp-R>}3d-QydeiOJV|0ke^Lz3REJYAe|&1`XycIn@yo368>@l*aR zz4kWjmbn?!qq?u1(Jo&LitQh?FJbQu8P}31_(N02fY^O{nSvI`WCCn|LSYiU&Ra&l zF?}q6D`IpxZ8v)j9EGqZecgcb?};re1W7q{a3}wEBI$JGQ^i|45 z&)k?p){tGfsSy=BA7^Gyxi6K*LsM!?C*%j36UVf7K^u%(Yuo9vHNB+F8$BfQrmD3 zx$ffosM?V-7}rOqKenW{P4F0|=`PP-8JzXax zp!vRa-9#d<3i%ITGR!QWqjfTHBV1D$KQ+SoBpC+7d@OkKJLd1WHLMyI$!*>WK; zKX~;-fk|A7rpbE&duoiIB;!%kp8c#xg%RdxIwP5Q4}%BqXhS(qmbJzmDgu2K%z>=M z?+pQsMEIvK^6J5vD{s(oFTC$4zNuN~Qrg`jKAae`=I~e46Q~kA5ZWwtBH`@^+K_Tmp z#7^GGDhl<@p$7|TCPVJ#hQ(ocOuB2Q+s!4hRol92A`HZF`eJ8cfej<_&!tO=WfeVa z3&@vZw{E=(bo*1@+;2N2jBS9Cd z_U*LOF-1F+lANVnq6j(VN3^gqe(&Y+Zu}zxluQV>de3iM$K573=n|1RNb#q`y*I@~ zN^hGbL41s@LIpK?q9t}n2S{JPHFU7&bpZo+GRJy_;q#wSR7xnbcFK#@!9IW6BJ3QM zP0V!FF0~+>N42zfX!GDZ#B4!FoG{uyPjac1E)&MXwfm~hR9Z@aR3b2yW~#KP?_aCaTe z->gv5K7L~yN9RuC{MXSMXUjq2@nLZ-F(yqRRlrOztUb8vL(sXotmtTt` zNFOL%IHL_?elvC|4+P#g3esN(fZ*{C>^7#$uJKwbT9hI*=jqUEriw{B`QY5bkWy88}Ak9o9QrgtCN6Ec^J_76W`o_Ob z`=O|2x)_R%?3IJCU0wxOA(xSknC6|`(r9U=eL3=uV?$2+>zGop{oPQL!%l^QYf@Tf zJ)rkAyTuAkF0JKSHL+a!6Z`wZ)?9?xTyCUWd8=UN+k7v=KZ8nVptap~ zuS~Hwo+P1~?2bHGHWa$;u`sq^yTeeL`@IpTebM|#5ZriYLVw$gzJy?&1On+iGi$*+ zpM3dVarqY7jUvUSiWW5jh5I?1*&d}u<>f!-4N9gmb~vBlhe5k8c0bcO4aDoK(K%LC zqM+nIvTO}AWYsr=|Jn}pzV7=Gh--#SWW8(WJbU(3wsW4{XQ{^)=WrM^lCf}HUGDYq z{k zU$L2L$0Sqw$}mX``BL|;X7ob?(@|Vne)o#sqU=w%ns*FpL?j} zLwFjERO?K?YPH7IW2;O5jaYh(+asP)zn5MF;Xs2ZM?gL#`JctTvj(5KwCU$x3(L2- zWTb)&J^EC>Pcm+d_lyqD2djA(7tA=Pdug49`Zqzr>wz`?HKq^4U<)7)*VM+Ox3tte z_ablTJhIm)5|zJ*cyQ^_W_+;WEz4@Y9bde^Js#IxUKv%YTTp!e;)dRH@9B6`yh11G zbU;UjJMq7nwieRz|KG@~3rR|T=uC&3LqBrnq6*`t3FKzsDLzf}=?YCxcn5yQS5%d@ zxz#;DC3orPfvjfLj43bIZcf=8X~DDM!}zA;JY|&Cfa~)SY2Nsb^m(M)%|iIq5rY+P zrz}H(G>?p`;yC6&M-T+TP+dV~@@A0Fc?{QxqetRygxOMka^G;MV5jn_jxt$#MC~6@gvSR{x-snJh8pE_OYQ ztu1F{*l7-X6u=rx8*IyA5nUS4i7uiH+R-c{7|Z|HmREddQw;o6L)jCN(Q_G6E(vBy z1E1*brAktyLMZjCgY!KjRPC0+_nJu;#JMhin0ngP%wIGyHdbh6&Q4n9&pcBptNQTt zurMWsKg?`DqY+Y`^S_iR0!mDU2T$t?*8bx;54%17m_9>r5+Ss0A8J26LNzy1H|?u< zH1g)g(-O%C{_9~$5@eVDR7=|vNsy{_k04V_&sD}Vz}|YZ^6>|+s%RM6l~NRyIk1Pm zSKA*Zz(JReeuxCm?mp|NvvTn3KujxE_3Nd_c1nz6Yvz@eY4UKAiWSvmh@-`;f>I~9 zxw@MD0Lf;SA=m2Z@f?yDdL6flbQf4ESS|t}Ih5M!NBZ)%&?uV#BiV~4FGep<+s^wr z?_Ja|Ypw>1uU@`9srNMRz&*8BydPLxe6r(3ouq51Ap8Zc{&R)p{4N4H()e-Z7R*_G zAfv9NWYBnqV^cBgr~GP=`%dau5ni#P#SL(nao(W6c>LVGo;%eM_4c#jU90KMl^y^r zTV^_?b2yka?uOp=m!Dpy&#w~j3IuLpZ~xF@m`kh3XuD0lyuqFfjo=kkjH=A8s%Qwb z($*-qnh8JGt|rJ(MI?>i}Q9b^f!P328u$jB}pEYv(mA3+Q*1&V@hxeX;mH zPg;0Px-CM;8Ml>4rJs6SHZ7j3oo~=*I%Ti+j8eX&xN=*6)<^z4lFh?0I7ds5XL`zk z_w{Q#(dU|FqwPo!bL2v0c$sErZ9_N|OO0FfS1H|-N+^V4*`}q!yx{;zd8pUBAo{EyD7pPq4kdGO6Aby&e;jQtMS1(8R3`<$ z(~;`d3mQc!;My3;q!tx{-BVas_o!dTu^KX{{2f8EqAZv%*2?fDVfDO~^U=t|qZF$_ zR-;4VwENuW+b@@~p}Z(0dca;HK}7GnCNbLjLh|O$juZqh($n8sNwP1lz{|6mi5Y{f zHNqWGZ5-!IT7HUE5lQFdIIHu(G2FspdvXghmvsoZ(2&$~`;(5oswbUsE7aEKtEYst z@et()@}I1a4S@N~ceNL{Gya52VHjcVIQ&JIBtKpNVVPFfleP_oVKb~R_}!k<}0PwLf<+D=T&7~sD?y#t`_jS zhD0CHct3Q=glB&P_d`oqd|g9nvACbce*!o!^4LSHFMZ?7ipCnKSduGiT;(uwY}ZSJB-K*ZAY73MIIc zIEej4RW@uei}xko2g*a+&Y>n@+}BpMH1m5^6&;sLj?g0P28;4 zB{1hv9v}kTX%6jw!&>!x{#;udfkICMVoKpfiKtOx2|8hw0y_N>U^j-E-fZ_uPm3JJ zsqW6l5gZX(iS1UQ4{%rxd5;XkT0J;rXX!NtkShdf`b0nl$*rJ?H$K zEpf}bdv0yp^@u^Dwb`FugNS4;D5fjUCuiacl%lHMvyF0e9D=5zl)jSEMn#8PEc;$T zk(AN$lQ9y8w&N6wJ)fH{dmQ?BE?4WxLscc$vE#D3?Z0O{9AOlAt*cxu?ALe(YqA>L zaRJNEuEmd5@K0~fBUcWYY-`x5*Z1NVyc7vGH{I z#QS*j2*f%}6}1H?IQQ0PTI}J6L$?t8WPY6ASFt6_aOHpEaC^!aMOMdkpN_iMf7F&~ zj@Qu&06GD@7RXepI)7-uv^iqq!{(>KO2RrylkCgk$V@pLoJ3)!-Tf)1X)T`TnZQbv|bG zp&lw|wm_4wj|EdkK9#;_6SfPnZ9~v}&tS~4db?U})4_62}+CzWX>XzlsCk?pY8qG+Bx^C4^N-sC-3knHbt_JHFd(HBQOGbgw3D62Wk@8&P+j*sy9e9hN-cm=7lvGY-aoxe-RP z9s8G-ncDEd%p}ncm;0*8*S%3lgBY93{EK@6qk|$b0>o;rXx{sx1;g|D2u??Cd-rP- zZgb*K^b_`4hdbqZyR@0^nGST1wPDEuq@|rw>F{_`8!eaX?2mXhlW1~Qad&B~#Ha~f z{m%sk+2I$c#8%%DQQm!sCtKpc$p6+8#W8;&x%EkQc#S=g;Z1vx2bbiQwW+Kn)=J(p zX9oJy$K`hr4qCbBOC_du;t;kJa4bwX(rw-$AC8EZN2HtAt<82aRjXq<%Z z^@1Dc3bg2{3wEnJi&+2G^!3rE&k;>H`8VK)p082sW?lwO5$=6{vnYqQw}sDX{zq&o1Q~Q&M(MR?NWSIsBX~AUX83Ws_;||`#FV+5t;f#mc^Y#rEKGL(U65a!+mLg9O{?CVo zA>o>zW6U=B^zi&31Cw@{<;<5+)+)GeJFY9sx#&BlKQ~ifM4Ab|+7#l=TzstEEEJjk z*1AJ4qs!HJxi0+r{Jyrv%dIMXNHA|WiQI&1D2>ukL^ostnV0NCvdinvXsf>@A+dz0 zxRWjC>r{(mN{s%!;B1gz!(Hx7h&Es3kMBBX){on;#y8W`CVmF)J5&?B-BPOPCeCDG z_&634EN6QzOM##~a6qKlor<<3 z&k%~V=7u~Os)Cq;Y2E|K$5ZwY#{Ybx&7wp8p$Qw=6 z%fXgYAjKj%MV;9JAXLv5{Pc!xZ7LX*(@2jvm={kOV7LqCmZ-c=xC6e(~I^i1yFy5 ztlO0YUq?-QyB8e&3l~_IoqVQ_Mp*YyTJAX^bQ^tpx3ih8WUTm$h2z0~Cf>#gv<-(h zXdVf0l==!$@w&>U$^FB#;jn24|DeGyKu)J`$@q%$(1vtyLxwD&cWEw} z>UR1WX1kVu1la7Y?l{P#wZB&?HYTh+cM)F+rb*>0~kT0Hf>!Xo!qy9ytbsgCWx*(j#B*kf_Zhc_-=raHm zG_WsSVBk6DfApitD2H(1isW-st%*~5k66dh>wfGVhS2`=B)yw7>MHHQ-snBoa+W+T zPR_fhL#mEz(!Bqx{rJUYxa(WOcCI}1saZCMbkGqiu^l_V-1)9D&R$OyL4c!sCxB+{ zw4!+}tNvVSZ<~+z?sxtBb@x$_z^QlvY%r=aQKO>kd>cX%JoA~LM5^oKUKPXF1sVK& zqtUFJ>Q~p;EcD=3OubN{iz&;Ty6S|Oi$9cd-}l(j7XT=745$`tS|8f%p%yqv`o3(< zMj+l1W!?J1h!pwkY%jF)Ujd)OQ9#meCTuOj|}=>TrZ9^VqoH3)1aIDph2q%~=4 z8Bm23D-b&HbuW#qNgT)VXcFD9^|<00651h>~wiU74aPR&jCh*E@K9Ik;;Enab3ddveTkS zZQVAG#Y`Y;;Nf|vwc2y>q=KX>;Q+rv|4#26-#`?PbY3?B z6A&?*8SPJlB#br~hhmfb{Sk*KR-LdY7);VmMIcxn^jtfngpDGWX5-8`nh1#?vGYu!L?ETk zW};z(V{Bfz-0Cc<(zi@nO-<6K5pZ4~B`E|-b?QGOpdW>|0jQ#jQV6*jk_fr7R`o%k z(=;wZRvk|)f!1yx|MIb#e&*a##Bfp4HU0mWQ#waPL90MOP-4n7ni^Ws-#r;`czM2( zS~tIAbGY^9duI@FmPeKO0qr7=pXMRCu*F(;-K-*zC+Y5+yp)dQi`?h(?u3xZ&TL;T z`gr8`gAMC9g!T)C`fZ?8f5v0&L>HhoTym<3i#bi%N0OF*e7+Q^cjD@FhZF?tGCC5v zN$7Z1PdUwCSc`FYeQ7cKeQ(kDlXu;Yz!=?~_QjHPL0l~Vmq`T%NFabB_^&pY za>KmtE`g4LXhRa1T|B1A{cQ(P1aNqhy9w7)m7J`0yO z6%G8aM5-|&tM$m@2N@)Q*=l0+XK>`&r35~2Q z8*D%-eTX0L**ru`6MD6P=;!@TgKBh6V)LwFbraxYk)sb)&2wC?;Q ziYN9Kq_c};E6sWaloMce6j9y~$)Fx)ju9>o+ms{RCR}&H5w4>Xj!XKICX`n6kI|Q7 zHQengVRL+nJ$+07q}NtNxlms!%bd_vn=6~Y^V^5=o8Ct1&dQZd`?c|#E5c*E>J^l2 zI4zE9-ykJYB**ot|78{Uu*hTuDl96wspczNaw7JZ|1GZ5_$|?TOZKg+!qVp!(w+mf z;50quAoI6d{3TadmPkZ9Qx`o(D%)Fm<;YXWt)r5ms#tp#KF%UTR|gm%K|%(hcf zk9BZaH&7qtF9Cbkg-C#0fe@y^l(~+dP-WP&`Ez^m0v${`_8qiWaX>U4vZd=j9shfB zi-%%X>^d>jp*=&6vPg6h!iZZ<>sIBa8WkuIE<+f8;OU%~~ zUZJ+Oi3ty}w!8pH=bN4S!)p*r z+3mI7;|)x&qe)TAc*5Wi8B=QN*RM-IBm!lV-_M*|&3dC8uS+1<+&T#MvUmG3G;sTT zQ}XXy70?stY|Ei{)w6en=}}v;B{`QY(&$tKpgrS1M*;xJFDaTp!46>E$SLI(5^^kE zloVFGaaAT@ctrU3EJz~FIk^$dHmDo;Pn@ixw%X2|fCz{<0|gx;3gaYn9>1dz4x8i# zgxKq?^h0m&_9yz0aWQW0{;6f(``*~3dqcSsDfTAP=A2f1TX1QyhB^I+4&YKikG(Uq zam>#bBE&s_=}5(IeEohc%Z<}woqYY>0~^S4-6R*}1;r->mks;MFE(Iv9jzAX;kfVS zN4)IrTxvdk8)5xh*)C2rg@xm>F*(pzETGDkxWF!z-H>`uM87&?7r{wV0OM#{jEGaR zv6H;0i}|P#(VF|e+C$fIv!3^&YU{*B31de&#@mQ2k~)tzpRy5cEFH2ylYvP9`ICEn zw6~grtbbCkXx|{IR{^&H*85~h^g}{qGUVo?%{(#j?h&3yU?;~GtuCQ!aO^c=H^C~( zzt<2R1Q~>t_p&NNoJ522HeGjqd1mxLiS{o!o1(lun!POV1QmHEe7o=w_HIIJ$GG!A&mar`;=qpl|i|5?_Pw804_rQ`hW*_zgAJTZe57< zj<+G-1(MZyRCW(oaJ{iXnG^Xl>#%se#bQm5q z4u6UDJ7&ckX6Ai=39ILde3~KUw_f+GZ=k1kuv;{u4WAu27ZM-}_a35fcG!`6kMQP1 zgP=Qft;uUjlB;|^t3iAwc+Wo+teziiJ0{wlDBO|dZA7IDW(}Qv9?MJYOdxmY2FQ;X zarGuzC&dFY;-AP^h@jiYr@izbj?^7vQh5(Hi z7k_Y5KN6lSI0y9KvAkp>0tLud6h3_gwnQv%UJIeFKq0xE!r}) zh2L&Vi&bG}z0f9eg>6_hB)57BTVAyZC;m^Wt_(-a#BIPhAC6wDx6LSU!K7Rq?o=m( zLl@^21J5!NBrc{rdj8cPa|3$n2Aof&{H}?JUaHo;E}mJ6MuKl8@%;p(Zb63o9j8>z zSeyp4iT@PTiZvl{V5DM#;OVYZ65OEv0cX_=CpArtS)5jYV4PUj(I8 z6DGEA;?8*yV{xrr^V&@uC1dLR5JL4h&mH|z!z2Y!80=A{$sEG7d!#!V7(4gfkOSRXc$W{s>O zj}v@@$~2(UD2qasdEAex9u*3xTJOLs|NM?C&E@Y0al{g{MIKKli4||w$XLI+64wEF zf?pZFzOzvart8I&-pyBtFnALb{KuCfko1J{`xCOYC0pd0$~h-6~F{|SPoO?7P*bJ6Ku%5VM9XD8pEI6v1B?! z$)W^NF#0A6M->nnaHNEu*-=!;9}G#PLXjBD94MpR>e66tqth^@LLtpwxQ5cJ>HNuY zT_VDU0SN(rZ3_Yb)HShIVqgx58%a*0(sQjMOUYV!-=asjB6mojqb5zaS(k-vKN=hA zIUEJ#$Yg7?jEOi#Aq*b&WYnJ)>tkrgRf*!jkWPAg+b}-&ajm8NRz}YEfaJ|%n6{mh z5yQTg&x8L**gb$T+;tu`=_74_mTCYBm1?g`?;WUxPJJyjs?h{Xl+f5DV&nxo+o=6N z7>XI`Tz+N2gAcK^qAiTxRF2myyF*B-v&Drus=ub^_iE<$jkD|-UPM*%cGz^;WI3H& z-!`+MX)CnmTLIrVLYgW=60mcWvO3=Zj=0!UD$33x=G}AeR>@8`5eJ=_A9q0Uf;cn& z_&8l`^N>;hUd$9xSaM}Cg$sFcT|-n;PWhvWx&z*tZn;Y8?m-r7USOqBq$@0nF78Ql zL2S5#FO#7&pj?=b5N`yZ1wQ_dSB~u#%qMseZwRBjW}rT2g30lIo9|Rdt+IiRcgxj# zy)S}za{Va{#@^E*@}2N|q3 zpwEJ)DieJ8{`565Sk00P^W|fMzHt`m?G})IV>HIHp-v+c=En7jXJdhh)WyS8b_{<# z3;izzOZXGJ6?CU57lqb-a<) zjnt9X%3;g#eoRtiZxcAnIyuS_5-V<+@4rposw;~BCH`u*G)1iucZ6#Mqh z?WOMLo4<~3#y44ioAm+O2D*M2^hxyL{=+-Kudm3mBr_&KeW_-Y&HwVAm89?AByR2Eay5AoB$IJNmF2@!_*c z4f5#opf%v*>4N%s?WddI3jSZ0_)@XA@^+j=K^E5w-pTu~Oy+yeZBixGzqlf{mR)?< zD={OAzs>RYy=Pt$*4o*oFCpSY3mrQ_r*FNP;x0Vxbaro@r2|?7?Y<*xPGN)(_=B8F zdc3pYUIbvl5Dc#Oe~~0U;+dHM8p<()K5&@l=~C{~om2yaO0ix9{HqzF7wdq`Lmx7a zv`(j248l5(ZG}gy3bk1ALR4cPP+r*KIZ^A*H#hOxelB=043lqQ8q)TE^Ggmcq#Ng>@eSPa z1Zi$*Qp3Y%v3;*=o(>E2X<4)oj`_5L?3h^nncmjLpM=Zw9E<^CiUFlr6r3D^JgThN z87QE30g_^uW8GYlOGC?AF@lcfv_5hyI$tbWfm{eF{<-3Am#GbV6 z%)bWG`<8IGuho1#AZnjX#3H>Uth0<>e435D(im1xzgG`RLnEg+UngTnI8?r<&so}e zWxH&Hxs2XzY*h>MR$e=KEBn6EU0TjL6A)768N(b%hp)seYypZ zpkW&o2xx%^thxw3*KB$6m{t09nHzQwdq<3HFWhJVDF1bQi!-hJ;Nu-r(kTEzQ!}95 zj|4$Y4`n%K_43L2WU}tExs7<-y2o)e<=(Zr7E zQIr&Az}%{a*eRKuLd10MdobnhG2NcdAnu4Hy-nIs*KpWTz zBAu#R@+(q^myYh0k;(D@yypKdsL5od)5`9Fv^3_*QQIAg>_;Po^cvC=8ItIO1H!!N zM9TA{h>|3`N!G&|Mz%}5t|Mp5c)@k*n=?EJs0kfTE$*JYpO>}0}iO9a^A4xV(y z*USL08Id^xMO^TPd#(U!PQ*v$T6;_+dS01WV{W-nxX*Kr%0Y~JufNp)4oI8!Zia>JF}nUnSpCHPix?kNj9sd}u}w=0VlZh_yY7@xO$AsQL?l9ULh^c8wE zXi%CVF;a&sqoqi|7hCdb{+jMeW1~;#3s9}I)=~p4(vXEnhgPWWGJFWgRHGZL( zdM%llh*;jY$$3Das8g%uS2FyA-v)){qfvJxS@eNMdpd^J1A-7wk7zm3yZ>sA4 z7YGRDLpclhV4dTWdR8|@K|mxLk{=u)~Lkc8$d zCn2N#qzIWmr%m((c6J1+fq)WfS5ao$(|qnC?F)Q)Smc{c4?oRT_I_5*MST`SNNM__ zQvqH~#u7a~Hr7n+ts28U&z?!Yndgf9YAutP=BXSu1XjUeq~!m(xlV9@#nYFgA02P) z$oLZPJZ7j0PW?5^E9CYS=^Kc{A53KQUpVDL&&MwqSCriTtPGhCsESVgzX?^jugsKm zv(eLJ=2Ys=BI?u$u|fx1sMEj|eCQ05%|!a&zJkMHxl=CL#Gr?t&&^Q!M>rlfs7 z=}6P%PbGqcj#Y(3TBn9*xL;n>xr#~t9`?E|FyfZZbTEw>Ay~q#r=J#XX0XX^)5OKW z7_~k59@Y&FI!@0n_;@qm5)CDiRq9~*S^%?9*G>cm#=H2WdQD`N2N6M55`Q zO5Ovchzs5xTfaRzP!XTPT}nq4Xf0;2ZpK1&a1x2IA2hH7%QfjUlDyr~1S0%CtQZL8 z!!889ZPr|51-~O3d^?^=z_}!yf^;}FC|OU0o}cVGV8Y{Lx+d7bm{?RHIsjGux`;m* zaHfHUP=zQ|foQ*d?+95zXS$L97SQ>)!&z-yT8$tQqENnD3^$ujuckX{W+Ci;HUUwF2OJvIGew>WGU z-3I?~8t$4XZIEgJMF;N`+!BV~5ImTV5RH`^b9oQ;KZYrzqJ`75)LYN13ZO|MbKX^RW zd;G9lIvT9qW_?<0-QeNT2>nID<+Bs-Huzm~^BXHYiMD3OT+{S_8YI1%v#0tGNQMni2w<|H=<1Tf03E; z{D#Wi8t_r+f4b9>077eVA~y@Mg2-!E+H5xjE%+W!@vTIwdt9YU9&Iz&Y-tgUWa-DI z?WuC&%^21VzAt4hEXB zFNJG`W`WFG!kkCBU!6MxxPcDbV;F5sFiIuEP53X;BjF!%JgyM%{A!WS0q?L76n^1m z%f)7dhrch$Nbz*fxVH`JPld;H0SIrbVnmAx2;<=x3b3(~l~C(uocf9A>cY9KLieoH zk)vTgMVjo|Pm6w!fD!$L78Dd@5m>#fZ5m{;qU5%4a2_F9RO&?6ykN`?EtX{(IhBVJ zF9s0jnISZzBG+TT6#tlC*G#DU_FV9Axe(JqjeK)OmWvUi-Z6Li2uwMd`nGxfNN>4t zlSUW`(ulbzmMS7erx5>l#FpXh-c_S(TH-g*mvJ;L*7pk~U|GhnM$oiUbt+2Fj7;Xh zFYbs}HCP-wecRtLNW4x=q2{%HiZxE7*de8zabPl9nQz7+IOCANK# zaZjB(O&Y!dC1VNLp|V=Iq2-mil~Iz1xD`;{3oi#<7t2f1_nh`7F23=@N(*(P!$kNI z0$;d-xZ=0!$mXYaU6Rfc zoAQw-J*T_v9mRf=q0voc-YJ&?Z9$ zKN%7PjI_QJTe2Z4=TcS{cyyS|V@ZG13}-Sa-wvbT%uvveP$7QFMcPKPQKP?WBLPKt zq`s8y%velH?=}3rq7b1?yHe|7atyqdI;sgav8i1~GbrWAfUZZ>ovCZ5Gb7kJy}3`# ztR`;4*HLv9?swC30zEF-rFQ_|E zG7wb#_?YV4Tv@?cF$F5ElYKzEx1mLwj&yjVJzbr}++@<*E^GKJ^6|bcOLv0@yiw8W zVET4(>3cTw34>4pjD0rqw`bp=NwRxlTR23O#hi@DQaIs94SZ>Z#G2mLe`IQY-qS;G9bfuH=J{6z}j!e8>w_D_M`2Msl2 zUx?J6-g9AA&8OP4u@rl&@Mj;`bAMpIV(2TMexY*Umx}!8{Y&TStxI=Rne~W7erDP> zU0TJ7>9GpgsG18vZxhp9h0Yh!I=@d?0Vgccd{`JmjFDv!(ziapA9Jg_`%m}$XYUA{ z@~SvF=uuMuM@6I{t1F;_N*QOM%~dkvU7(Bt+-_V`7alU&v^~0*mc(k>%eISaWlD|k zYtg%r#iP{w!2BeQl>8q){7MVehC~w@JF2&<{qgbI7gSLt?u2>yL6Ug8J}@FN)xvRH zrwKqp1W&qRL@w9fXojaK=XnBE%TSFc2Y%X+30$Oxsw;p{c@XIeYCj`n0Tp1CN?r33 z>=z9P_WSz3e>!hpoU0m3cC`{l`!2Y!)y2k8tT&YgWVV8^dM5c=Oaa}hs&*P-US(Y$ zZJAwqV&re+<+fyRiMBA0v;qfYhfZ(}T9=>v1#(q?H;E=`)b6 zZ{g)G!@ponO$4a8+8-@kQW^i{sEMTO!=K#xW7Xnt6AeW>JMosbLo}-7H(!L2!eSoD zd;C5KIZ-`P7SRo4B=4(ohv^GpVA){DuplMK9|Q)E`Grv<^KfFK-MtjdMA<6t;r^E|ZK&*|(;xW(UK#q?vHn z^i8qf#kh<7Ka7EuJZ3I7OB_T>_!48e3g~3zSP&#Uh{x33D#*;vW2!3%E#q#!6;3Uv z2@xkurD=B(F9jbW!#j`Wj0v16VKFuA0aW%f8GlUM2r-Ob$5N^BbuUmZ`gyPKjD9eL4 zjYcTE1*0Jh+uzz+#}K(Wc=2^%5vDO8wapb&r}rikx>gzVGxjFTVLq|Qe*&)Her;%Z zx%u$)8ZasB2|cqF!=GplX`c;|CrwW>4f&@OcOP@fZl3TgB8RT*{$>=rgbi=aYZ_o2 za(kh>)$6`wn!kF^w(4bma@g}$0jwRJzQ(Boyp1wj=|-E#QFT4yLocc;H7??i+yCGW z5(u}ou;q_)tj~6ng$yOS!oyqp0ThV*0A0f6$~LoBSyx(io4bT#O_BV$nCii6l!BJ= zv@#LAG|q2Ucgq_4n%Meq9SZ9_ef0(RgZ2gFt{8~ZNg@9f>7K@Wf^Cp^tWTX3D??(UvHm?DZ`TAoM;TX_1+X* zq?H_>-oE(Us1RSqqQ}>I+n@qlmhf=1yho0Aj@_hlX+9BHHD>Maf7e)vF;^5HZ(U1> zhI|cR+`z8HsE}NZclqv9Eu9^MuJ$ezIU!G1qmav1IpAPOiVqDL^v^htAXGxGV^j~a z*d|IHfe$D|;FA{P=AB{oyt&2aw7eH_$fq5$-mcf1PGSEs{^dnO=?}2JN-e2@RBV7F z`x}H?r`lzHe#SNz=PEA`(8T1ux=U6)<~W& zLNHp7Y4@lR2j_XZjsRJ~YXJNvHjZ*yfwn5wobU*U`i_TOeKx(87=Hi^-2{?J{7B_je31?UsDK zXxu*0g0P3GO`Nu%mAiy^ZExR|`U!v}H9n>kZ((sNTyV-m0d!~%U4pJWW8%yi`F8!k z&25Wv#q=n9hc`XS>21W^CBk`BbCOsD`kZn@$KXO|Vn3=WPvVHi#DU|R^Apa^JaV>a z*0!}UAz;6Yyu zCm>6MNL;ZK!eJ$k>aI9CuqmrK#6R8qK(W~4Cz^b~%9(yrV^{yCik)CQbW*pBj3^cg zdi1xWbLAV1Voj!Z(uT2}Z~O29$IX|ebS|yre|{IvTg`yCvOKeocyM$}>Lq#2C?SfR zz)ONRld5d7Q_Z1P)Klbl1iuqcp$tm%oth?}A(Zc3zM#vJ=SMVrhc)cK`Ru@q)T>ar zyF%hg3``hX-Nz{LM3@^>d^gyQ)9|UKCI>&U2d~quDk%CLRAQ}ElKl5!DSq+LjQ9&k z3Aqp_yL*%3*=RJpiLg*`R3b<(r?zS7)ZUXE~ca>ZCI?VK*#D-Zk<=MF++U{DPgH zaace3{=??#V!VTI)YFuEe`^~iEt3j_XC|H`HTn#Senxr4+C$5Z!ozXVt^pV+-w^)b zrhgq26YOWN+D~zLN&)TMM~Y=@_nh+uJ##1@yS&nn4}?b{-U1tItIJ*)HggbrxR%pg zGaZf9m*8qBPD{1BM&bAJ#eNz%3tiz)R}6&QM|<8bOP0T_~nP{ zwo|OaetIaZNY_Lhrha_Br9*_^s=eV%h^3Jd&ih=$ArgA6+nM5H!VCYYFgb+{Y7D*u zL~qDVDF2}ctXBx?dbYHskrvx2h-~OZ~P@NmS z3!_Bjy8WG^;SqEbL@^h0A$EJkew?=n-PaxDM?<`7z--}%jf*y*N zVcF~mb(`E*hzhJj`!&A!&TQ0D&C zOX~e<!L7 zO>(-U$HrNSkgYF+VqqH!iq!yR9IbHo2YE6#(azJ>)DnQy1dA+_I>I6ayz1=cNw+bJ z4x_4XwdpaRjiJ`&5aGjk>p0KVl>LmoHtlOKoXV5i^d4~cB*((vTkP3a2fmBGBg|5|Z?vL(svK%`kMIqIMk7OjbEfkNDv-df zV#m)vaRE^#({+2{ifD^hg!y9}Xy-zPJe?%@!;y@=STV4rJ&J-rlFTu9^Z|sX=5tbA zl%ooHr+b~UuCd#P?QpIS2>l$b+YG0Ar(YeCWz(q|SAeB!FKz(Kwas&=!{P&;=GppaALufs$6ea`TA zWu-6)G#QzRJTF5?2>F3g&j#wrK81t(Ur>;?V~ayjD^~ADkVQ~Az{OL5qM$%x;1bXX6<(j&kv`MHij&2Hja(8DfZ5;BD z!@$c|_c`KNEJ2Ih$|Qkf|7?B;>{Zw@65rF#4zYLPDE5Zdo*NVkPifIt(Wm2Zza`|~ zL1>rC&1n>NTj1NXEWU`6Y-ynVwdoB~oIqloTyFNm-*w~U+Q?uUtoEHQ(7b6153x7j zNDLx!WKIltsyt!NUHd`Um(3w7@JRs|e~1#lG$xyf!=-0BrDlUM%w)HZjDqH%l{!M` z`RbA9fXZ+R+M)LlE?of(v5Jh>_xWrgN_)&d?p9TF?1>Z2phi6c2S75YUKg)JioC~c z3u%Vqa39NCicJg8&5y69=(d~Q0|By*3LaE-R@d5f$l$p_$@inGT%%6FH1HbSJg(XT z%bIXC;0@Fz4xjPug?f{8tGFoT8|+IFyNDW{zjkk}1$zGbVUH8UyKo4Pnlu+8qzzEU zr7wLd`6&-lJ(1^|wy<`Q{RxwwOS4WMh1nj&yWd_+T|j6j6Vg?-NJpectknG~OKma^ zy_%d>>~RS?Z;LOv695jsRP1O3s~uYfSWnv=J>1;yT-BCu_4FsHyxuYSh(yyMtMq~V0fqG&dTN{=4q?G9PZ9vst7PHmeH!ezk3+=Yx0Pg)S9{!8bR1%*M7#I(_j!_>pO5b6gw$V zq>-SK6y-M>&4gk#g-mF1n7sh^f^{Do%U@dtyoEYl`_k3&1f_4aheIv&EA=y^+xvdC zlvR9H8}w(tshcJqpY&j^8C_zr6DK#Y{@lpocL+ZfRHilFrgJB=9X$T41A4&1&9wwW zPONpEDf1S@QDjZ67Yvgz4qp~1g6fbx<0~O&!~w9GM#nNF~5&!|@D2U)u&kr|th^7!F94qb#MdWA~Wj7AS2N9uGSm!f6+N#gfEjd-U zzf`DRcAM~LI=z@p!xnC|(Ko9h_qtV->%v<^S`(~@n@ske9|1Ioc!l8`qm9Q z4m4{Z$-)|3gUKpmVMZ3h`P(9O%`KmJK}zp^sLF1zDapd$$zg-uqjxZQ(%ObvY}cw) z>P@oL*9If}1h0jzLpAUl5N#-!g`l075xIP`bUpgk_ z(2+wh65+i-#pf$OpAlaRfFl1YUHlEGI9<&R$ox)(GfT8f=ibb$x6GM`pr^rq$cr?= zc}dugO)0{MLT|(lcllG-4&BLm&h3Ex4&5^WY9W{wQ5`en14mkWhK=c_@;&dxrEhDc zv5P#D2H_y!Lh4`us)|BZ>~Dx&1>X%#in|mX0f}4<&976+0XiVDw=1&HaB9d?W~wg% zzU=$J`aR_K?mKS#wwf!1S)PDUk!BkiJA1lB6Pd!p!|=oi8~o77lcJ?L;D3siewh=cCPKji;_UhAdspG~In##<5Ek*4lr#!fcn zOa*5*+ns$Y`@95-1&_WxX#mfKo~N4t!nk2gB6q0-H*4w-ctqDTyXbyI@f$Gy@U!py z!}$`JS#?JU7*UI55lWT&mgFF=r*U-JCw*~~N`Pcq3@Br|E@R)KOMc2i0$w0L9lUuK zHq40E{ma81&nI|owpFcX47)W7vyb=%S;ZU_8BBUD-1N=BN&Hdpq3$XW0ET>FW=3a? zh>laL`uV^V%G|r{t$_E5XoLBt^a|GGdx^vf+nOL#%M`F*jo4;r+l(w_!ODSvm#@(V zeh`9B;|jrZsE!H;(861@(h#pQaUsB0!K`B4z)aJ3lZLZ3;6f3Wf2|NDdJtm-dNrEx zcYP!%2r5lh(`VQrTNS2LJ0Z+s#h|3q{CaP)E?F4`ewz?|o>MxUWZ$t&OnV^4HVl)z|=c57bP%PoJELX@2XM%3y4 zwEn`l{F@$=okmnpFxCHaSpCp;cuPoJ5H|{a;V$!Q0fCwbYUZ@ze!J?SfQO*Ko6FJA zu6Bm+C8yqlh3cYj;#4g9#9?UiFFN$YW{HL+0n0fCi!*<~fruwk;rs11U5G=6WF%7o z2e@kuYT_%pIi-2z+c6US;e>jw^7hulLK*wA2({^$F8(An(l0rKmK!W$okOvWAKSojO$eu|p=b+Td&8Srm%N$vtJ{$FyQ+yL9P_F$+*hb}?F z2bstLf310*Mp^;>x24d%b6u?kJ84|YTg{(6;xI^uLsYk?C#*rm=%jKg^UZSB#A_6| z*VhWfpwZ|12q6gsRNx?e&zq8{tkShSbx}&Rq$3YH@yr0m_-K6z4ck?gX@E8yQ+tlnXkNYg)cj`4pfTQcQb@H45`IM+rP zHO}Nv)I>(-PV<|GWCfaM!*mi~mq$Jw9()FtV6K z{?wybEiB`%QE1v$P47%}YpqG&WB%r!W8CygczO7A3*|!fhje6V2t=*6R4|C0m?hPm z+3}Ace8UR*e}h<-)mS$!J2BTaypAUdDE{VT|Oy0V(OY ztKcz-fULEMi?7a_CD3g691@iw!P0lsL2FA%Js(!xKp@eF&36Da)9B?_AGSs}tN(1U zS|Ia~B(o*9c7jO-!H-vAeY*MDU|eZe0}X^}tQCxU$p8PDpiMm}ehB9}(x*Kzf z2q&v%mQ#s%IOrnuVy6F;G;cKc#xtie6D|sF*nX&q*zFZM&%(92);MJ{?MT;UqEeBO z;3ZKy4_5UwxQ$4&#-<#+COa9qVXd`Zihq7w1axCQ{==4!gk$Te+9jvbGtMgLpah}x zb^|^Yt#F+-)HAw7!9=aTdoSz$S87$D#$4!Q+{NH4h)d{PsMtxFT!1jY)C(^VK7ElW zy)YfUV-S$tvJxXN2pBrNs4lvlt$HK0i0=Ysx^^<)%O?q|Z%P)^8L*gVls-<;^ZWW$ z-%Ix!?f)@#)nQq5PaC8}x*McJIv-kEIwYhU1nKSt0qI7%k(Ms$?v(EC?vC$KzgK^M zaXowOvggd6nR905o_mZV4sXSwCj1UGy=t6crLU(ZZ=k|cWIdhQXMbvSzWRNT<(cO^ zu&DvQ5)KnfhwJkO2ixJ@%P5=s41Uc_d^hG7#H;}2gi398up|*~)A?`XOyPg~J&TuA zRhhSRvDHnsWuboKql?0j8)up0d zrgi$WjXi?l1i$W7_#G=unz4AxAm*GE2iA1U%DP_k*|+gn5{)!Y`FP8hG1@9=;g>pu z4T~8+{ncH}${C!x!_8CJ9@-0tPTCLGAa~dDByoDWQ`9~%Cxy_15t3kwXSmj@Es!D8NNq?AjBT5-aEeaG4!Mfq39S+*e5gOB{^f9ZI0N(gfl z5?{z-%`zNMdRuHHKCIOM{(ZUF)l&-z_Q)aG{jO((D+zlS=^*#oW3!{a<6oV$CASV{RWi=5}-UNMjde$ZHTkdv6 zJLl772sH4VUn(9p&H?slq!p0-Wlh{9j;#eoFz$>;X4yl!OWKChyiAk3dSjJx=S7@$ z)R*0Pv>Dgpvl`g*HPay)x*ztNL%BlCo$((g4-E*ZvIOWh*XrJ(%~gZbB#tcM0Hzp7 z2@~y|Vr$d4LGp;(@@+O^f9bd_ZqxFYV{hqWj8_^WxX1}<|A_<#B{FMA?j0IfB-(uO z)MNxZ;)<#IS^S6L+S~`o8~e_N!yFaeo6KJe!ep1QBWy9j^VELf>!>BJSqHX~v?Vm}?!+}^iA9YTNoNP}`n zLd->YWN`Mhx@#+1NEvE>ar#J0{?@SUVH`8f&!N+i3%^~mMbhYdkEkah3*j}krDeV| z$GU&f^f>-ZWcZ6{F$h}(4uP|J+Ai`Gl{BHZ`ao$*udh_dW0jkV`vAbNnF= zT!x-I^`$p~a%TVHm$EmGE<+h335PLO;Szd05$dF^7(zSx>M##0* zxI}Pfcs#1VA8ZIMzK*t}?^Yz-+s^_*`Ea_xNPKXPQ@mR-1y{n>;6+!I@sVqJ=m$c0 z;|;pt*eDp&AVe{I)#hVz*K$APPmYC(^)R zy#4}a0}~E{^C@WZZ3QgU>CrK!=p>seu@TSz|x6 z`9#5H`Y;t;6W@@CQDo;W!9PWu@@@$_?p#(lY;=oE8CX_8YRxJw9zyGMX&mU1BYf4n zGW$`wEvLllc~g;av!%h$uRSn(Z(Bp=%zoBLgv1C5$C4UhR!tnMsXA7dci-z zFy-ez37jM2rY029U(Lr4E%Qz@3V3|&5_F!w+PPx-IdP4nzK61L-d$QRV$~2WwvlwF zp2QwG;Xa28ATrJ3%8>bw)g# zoRP7LS0Auqqav4BwYH9+I&ph!{w)UqC`9Vqw~=Zy0Uv{_MpQP2VD1%0uCEj^dY1Qn zccQ0?U>5X0xtm1LTr7non$hX*vb^dx^9)^e!b6^qBmzXXvN(s8oPXOFb9nDy=oUZGz3yV*u3+txVNo0-~DjRWc!lv;?c`wS@>sMlXq-t=6ghBt_+Jh9CkkHB^Fmb5J zkTfXJqbTOs@1*P=8IxJS-Gt+(yUv?pNt$_};`LUsgTZU8;d@?b4Gh%lY}5+3rX0oJ%~nUE)dZjv7*A zBDu(r&MD9-rO`{aa^dL@A3%D1@@vdEI!d>_W60Fj3TD86P{2N@Gb$>ZP&M8}^W)Dk zrJpUI=z@W?v;}c0{2PgD_rheXCBLR zF}7K2zIfc7kXfc?+Dv4jdlTCk>^;CSi)U7_ydV4QL*wJrAtj-KP!1f!&^bDCerF{F z)_mE3G$?~LPN&(lvq;&cKo9tujvbn(->0M_`aSSH6GLZ3@GGti^mXr7|G7E%?zDIi zbntDejZ@M_?my!5CHmTep6IV2j;eGw%rT?;HMDsqwHTJ~9FrM)&+R7j-h?zIYNa0s zaM*V_x7Mfhuq62GxxJM;4r|~)Bc|j3Xcl)pTBD{~|I@ujKLEJ?zHzej!On$gNDQy@ zvrw2>cLRU*}&jx*XF*ZjPZxd~B1g zNZ8FPIh|%C_8(r(z2?}@tLIKb-cCAJl7-oSRCOR$DP12}6?<7QcND<$4t+9E>!3NQ zkPi+>?&$kwv@jWgkc-jAaR$oI{WN%I0MFBGMS4=Zhx9x#k>eJSH7k`oRk(1~Ao?i# z{Vu~RMUy~W>gGMde5EP$ThlZPmG`HesZS2dSp$oSD-BHr}6i8DBrt$*ksNF9)VqPv!FxSOv%8FGx$u&>*@=dW5<_M{@4?jY$p zp@!TQ=rI#eNp@b~0$smj`uu#|vcHvn=j@(UR`GEmQu(upQvO9ojw=fZTt>7y1m-0> z@VHqNv>$cY1?eR=aXox?Xa(1RbaH&yfH7#Sa={ae*ldxzRVP2JJxOvmvV(7!KWD`< zBBD-3k13hIHFGr3@7bmoiAK?TIoV!zRW(f&F78sA25~SAjA);cQm_S4G|}o z{8_f>TKCp)MXJi?L|(I;nnY49cLNVf66@5ryeEWIcmtp;kL>ntAz{c+Ay9Ec|7hgR zG^W$iw2g^nOns<{?^n0ZrgkZtj|g9htJp_QL2+LP+bi<(ir1eXkAarQVgVxgx(Tc2 zS`fDG^V!38$1>-$_QQ1tO5U;-Z>it~k@IYVUV{=-ybcxxebm<^x8Z(Tv;P zsA|NO)6pe0N5rT*wYC26H*tf_*?1HO-jFR8ei3Glj2@FEDDl*g!_q>MOG$a$hH7Ga zO+vUvgJ9tiKy?4x%HadSJ$u!1%jH<&Dmh7-IX8Nqt_QjQ*7n2{fkCF&&FwxFm( z0^E&dLLOb-#dUY7RMJN7H^0fB_*$DchV;vc-ANyB^JC%H8HGIs`dW`3i$7P+Dvu`D zT%S!)0-Tsw@vinu$88(NRn!9T{2Khd?=01vfI@;WAE!5o)Eu?Y^ss4YY7AH!=d(+j z4LsJ%hZC>LZ;EI7R*&y6j9{O`uspBqj3~VgEq|{eAt;HdX!TzF%Zr7KOs~1RyR1p2 zXv@jFx>;h#2}cQJ!YJvNq9qp;+wIcon7MRz&}O}&D&6#7q>d#~zmVDm(6ym)D{BD% zk4p?9gc4;W-EVDTwNp6M4kYZ%p21u@Gn~N27<_|$Jg{wv(15h%!1{2M;&nsFn5)T> zn@_O-uk)}j(b)~+3Xnq4NHR4{36(a9vW1uHrUc=|D;O<|Y2NwM;D!z=pr}?ThYfvK z7O7MwXG0vc(p)wAf4l?$hUm`x8B~G5K?GZt%!i?b`ls`smIxCroOD3}FKBpyFAu*LC1ps^KG; zK-5&CKcBCGS$4#qh>Sku+M&p8@LUz6{e&_jIl4PgJ5tuNd-KD@2a-4Y#IZFr%Y35+ zwy$iV?ek4{`h9|N%D(0n_QJnV6Ozl=gff#dw=-k0hDN6Zy{66dGig`ay&pvAZwx*6*uDMA z%eRXAyZyy)RFhvGqH03&*M=F%uHN_nR#&pBUte+P=zBW*w&aaa^pq%tP z)Ycz9-AIl&!97D zWrC*akN=!wwpZEC^b3iFxpkye2ak;RzuDwSeLK_MNQ>joBedeEr`)&j$bf=Hk@C77 z<&}w0%YLsg$D8APWnM&ZqV0nRR7pZAQ?JMPG4_sS^O*AWIz3@+xW(4`4(YE=EN#f< zf;rKjSV>;j)@jaq4e69E91+NfHkFH8S8&qB|8X(9q7bGYUMkRBI8!f*!9acZV|=YQB?lS>Ib~S%uk! zYVApLGu_!8?mF%ps3DhH#_DbUnI9U&=^ezgx2Drc)7#|8G#d04@i~!*P#F{ge;!V z*p-o-;}A?lG4>l{1Oj7>z61ic-_id&p@cmqBbW7G41b`UB|g&KQ|xS+Fx0KrN?7Dh z#TRvi&pfBCdTjIjterQlf>5Bu>6_TV z&8eJ81s1vk6(fo#qf21yq)EC2F1eXGW?YvF{0}ppD{sU-_&4`j+5kYuvw<0yZ%qn} z4-*nz-y~t*SmxN}#0YozExbf{iTW}1cky81QKeK$(GC~Rvl)|xzgDCScvS8MqM-{k z`s{yXt#e`wtN#;RB5aC^o9S>cSa6Af5-e;{>8-@BS6!!a?#8K1x)zh0;->yEXT%5V z`^nVixNk0jr{2nkMKCGYh?b_OS8%8dXwUDrF{dJQlrqhftI>~7w7H<69L>(^9blL9 zge~Ilo^*?VuU;|~X1J!Sp7ZTWo0kE({i<&MbLKF?&yd(n{YhTYgkX{t{o(PX>yT=# zE}cUgT65VFvNj95kTf7d^tjppZc`%32{;`(_w#`D)|+FG z_CwBJ5B=w&*CGXeyBHQl2QSxJ?XN}q?O&}5eMmT7BF^>=Y0F$M0*A=^?$~*YQ9|6s zhm{__-+J%2Na~X)P3ZWHaemvG0-JEE)UKZj^2^jD3c=*uv_2a)X#=mXq0iUp^!eoV zUk_6H-t!w*BZ{sy1hrvG*!^=&)1fG+o7kd7YMk5BJF`i;6gT#I9^|L}j@Gf#H@Yw} zhW91_kQ4j&l$pa7@i6?GEBUYq>XYnG4c0gvRC*5l?W@ae9t^&U6P^!oYwU=>hofnW zPn9ax@ePC&v&JqXHOeg3cR2)#!wJ%8!eWM&;<%LIZ}U}><@Fb(|1!?}zp*Q%n5D!o zr1K4WENhBv&|Ux!=1klYAW?yIc|mc_t?3cB$bkEL37MykH7&^Q0oE{kg-@C%-t@P% zP|Y6PQZM75|Eb4ygMcAFf5p^Oe{)XqaO{Y&*Yb{BN|DLqUOHsKrBXL!U;z5ndrZl- zQphKL&yql_s3tlcd&4nIBtHxPK z@$t*f(+f$ADSQDWGg4 zc~+xQ*L`#yANeUiIwpCnblC8eR^ML_cYa-a_a@(HJOTflM>2+faHF}xF+%Sx-)`eu zZH;ed7raIS&@Q@!%~RV<=4Vk~3Z{mMCLS>&G%qi*8cv@P^`h;4m~SOfpePvmfsbZ# z-krZTgc=A*0a>_S&tk7oy1mQkxLF}$$9|&JA0nK?E;B$@{HYBYx9Uy#afhb|tfsB` zt>PE@Q=|OrwX>?&GK}rufEs-XzRv&jF2-dCX>HXrld8T6;q;`i(@K<&V$P)F17D&_) zK3-hi5E#f|W+%O4;x(ylRmT@aTh~9R>>PQcddj?ZTOk8=G#F@1;FN^Xm2dMWX^=2Z zl5pOPi?z4}W3S_{h_>}@&bye))79Bcx#-yJA)r|JWNjhS+ez- zd8|-hIBfbw3DmS&qd)Q5YIQO9&e&U^0e7ioae8Enj(Fa&6z)4fjjXNMDdIjSvPcs- z;qFBaH*!@vq2|_kG*kT=o1`K=mEbO>)SA#tK|@OVoD4}yT77rwo$r`Z)5a?(Xa+1l zGc-{jBU^Q#kaN!_P+#74}G4`sbncODHw0 zcNFaq{&HdaHXV*Xd?sbL#`$scV;8Y`2OFvr?=ZExe{^JTJDm=|hc8`BJmi0Q&>$(Y z)Wjmd|6v_dwA#Pa>yAb=s12zo`61y#Q9o7~sN08Pb(dJB*ZLLLInJ_)1J|-LzA^>Z zvNk}cz}!ZMkTF79%ETJ_>yf=Q-16tca^3S6O8n6j(ysoib@-pk8Et`+BhOWO@W)Zyd>FZ%_*8v1Enk-_KE<|V?O_`@kvhr zcTcDDwISD@O?LOUbB8)ZWO_P4MzhbDMdsVPkhQ9DlFQZ7?NrS7$108wpDZhIts5@% zV7__l5)L7d!kQ0W7^nChm-7xU3|O6u%Jx`lu>!czmKmq+r1`g*G4Hk&-s!nI zU9O_x`{oVGW1kh}zqVLo_YCrj*n!~7%wEHQe0Nseg2 zwmY+*tX^t}{dnb0v?U%{+!t)adi##hzU#fAP_X5_(`m$0pIQ9^B0XyxkQ}hK+k3lyk;a+ zdX$mNquFm;PXo1&9G`m*fzy53=_1y{Pgi0e=T5baABTdkiaw?#xTQZ{Rhh!V+DGWn zAO%T--8(L~O!jYIt%#Zw@GIiAvT=k&a#f<^#8TKGgm6*pBH#r}K1An@ZMi!BdE&q0 zK(-nPx9Lb)Wb9BIw<%vEkFJ#jhvbv9z}7x7)2IA70M>oMEg6rsUNDj7G~Xm~@7he$ zqDzipqCfW@>q(y9@SvhXmi#S$!t3^B4Oje!0fHDp-Gq?!XUg+u&F#Y;O9XZ0C)MN0 z!c)a0*$YGa=tVDXt?Ez6Ss~iY@K^C3r$abc`~q(iIFk>JAB$o7DtOp{iR2-9bn`Od zGS1Bxz-w#3>X_=SwzujN+0~WygmmOAegCJmU&q%jsMzVMvEoyRO%C@yER>fz<1c6t zzv^*-GRy8>~-eY(dv&R_kKXpNFMHlul@($`Zll7>kX2w8A#^^5L8q2YaRxK~S6nNR#=<;DGc|E# zSX6R2Xk(`4(s;M0ZbXVH2)C544PEd;T_-Ll6um75w~b688so1_QWB9*ktd2jk z1xYZ48*lXNjF7LcTn@xXbaWlA99fuf2IY4C7=i-sT{JHyzD+WX@NdN_Gt?+IUxW|D(3y4!pO2{UY04 zZ^(Z5!It9h~0WTXk%k_$#hjwIJ*&HDDRIeK27sIvDP)NAwxDRnSd%PAOjY zd@@5a4K%O6E85{#Ph4k<5nWz5m`rYr32EZN+EES5wmSb64*3-axU~r#P4-8d`=Y(o zfhQQD_wY(rRScZGI+H?Hhw+SKjOQM3rT@&1D&6d$^A0S(p#V0o{6Dz3K`uSup^=x( z%g7yPP=e3RHjqN_i@n3cxSqpz9Nqo(wI3?ki5_`WNtbJ@=kaD@e6_ANtjNEkpL`&^ z?IE&tzLd~&8`fd+-XE+d?}_u^2l$!v`4ka2(OwN_32%{Z^Id$~=0uU}{^y{%!WyMG zo3e(39W+;~esVyZe~S_C^e5tbi&MmS$A$HH?efGIpf76ksl@)~8}f!LUBiNjB`_tX zu|2tr2Z(k&xOAq-^Va)~dDtnJxl|;!2XZN%=UWxlzfZ+`zkb+U4Ux~(PB1|YKgPm{ zec$@(g38*evIU`@$fr-sxa!}0nXSB2a^s{!0qWq|T<`}02Ux<|FOo|ICe?;}M z8gc`^HpW@o85LSHMTXF@4GvH0S% zTtIW{XdmT!eJSGf+l+Q^LnXxeqFZskzp`(k%VL*ZFeb3*khA}lYW|aVwMQN$J|6yv z0(R=`(Ia%&sZS5`bRnv6mB6qnE-oA?aZy8TOgr6QE z_C$i0G3M!xm_!uGdPZ&luV>aY(kCjC?f2TpucK=2J{17+Uqg7FYL4DyIba4Y^!;qk z`{KB&DiNYUNi6p@wqN*A>9mmA79z=Y=`tN8E;HuhTi)oD= zzP1Vq245rg$)54Ggza%cL_SKO`J95aq|^(FvoYVU!4J>=>mvnC!h(XGO$q(MOJ*`q zf=MIHP4mNN{&^y?CU2!Lv(1eynQ&DFv;A%0ygy7i`fxYlZ%`du_)|j(!a2GtCt!`W2v$}>H$yze-*)lud1zc}m);Xej zC@gpP?$r#o#9hf<*$VQy$(178 zTahw+j`7NSzW9qy%v=&s1JU zlXl5VB%_Q^sb)A8{0kQo*}Z1amop=lY8^`3T^zKm_)#5`nN~3s-24F1$cKycVXm`P zT9J_1Liasq3-<}$q`S13vmcUDutFK78U-Dni`~y)tw>sZGKz!X#Wbn8bS4q>5x18Q z^$RV==0dgfi3;sE5@16bWZ^@pIr{9?SDK)kObVC`4R8j z5un4pD}$#kcSP0}apq(`AzCymr?%#~LI`iYu}AwevrB~2i|2*c{!p9(kTWxeZm>Q6 zp*^fd!g0js*;!h!&EDg}wFI`Uu>XZlWfwpY77x5ooM4l`;6k7WhzL&A2m8*JzdCC= zB)t#nL#QrA(acyG43UCbdil=vlNITsKIwA8r-lgXY6>qy)09YpoCd3bc)*4ix5w!B z^a(=^S)b@-zPQ~1!)+kHbqv&S{sB`PzCIUJYMIVG`MWjJ1>R70S_T1mR>iPF)NYp19`{nkvRRwfda0I#YBiRt0y`BiXx@DasMtX`0v& zUk~=_%;4fQb>Q}X&eAw#ja2Y?7>}6vH%$|pz!QCUPY)gmiKz$R@%ePsD^l4bkySUC zlA=>7`-ZhYk!g&bW&-raz-S!S)Z?ES@Q3Q|X(^OiQDOXsKB~azp(2lpqh!g)amn`0 z&;q+<8cv_-NU%V%?2teysVpj@KGqLXy=Avnb7*|q!D*4G>qu^c`%}gJm#hepw;K{d zvfMamz#o2t+)gx75(z(#7ij2a6*7&R(O=Qja=))71d)X%P=^>-X{jm_l7%P}qWz03 zzDGtSP1pORqc4?3ITl;G2XD|{bUxAwA2`f3%fLV~blDM+j??cLHbHgZ3VT3d{vZm|8wAV}7W#qFRg$m0r#tMj}lEW8F zOtdZL-SW;~rLU}=n3XRJaE?(Kc|329uO(k!Q z5<>=9xNEB*4FgAceX z%k8E-phnoeW*nP|C>r^4qHCjkTTv9-l8|; zu~j}+zKB9aBp>s0&OpDR5b;T4@VIDPZxD4j(%;ioxuq{8CnoCX&}B`IMwZ2WecBI8 z>FQInQZ1TQQKLqd{RQA>!L>qck-Yvnbiw{2R}I)5AA{O^&9YyXU-stuZS75?mib1Q zMrsmtII7u(oUmDI_HZ;}Z1#cuhT!4oL-=~B(T4lpJQ>w!n^y13-@xAbWiYU}<1gjBZt_|HE=4rW}EcCOA0sl8LUK8i^yGOA9CMD$)Et3BaQ*pB)Nlh; z)^TeAsWZ_bi#R_7O1;EEcs-jhP3ADMP47{cb=sFLwv|8jB$@DXwp1?<_tl)EBw{Xa zbB;Gpz3!#-C3l!Q&bEZH3GmKkG=-_&Y@mG%WRzl)pp z)cIHxyzQkSyBJ`aFZ@n$Ub#r^v%+GXKM27tqn$b`N$^MeUw-Z$zPGNG{Q zhP#he%^V6<=z9{ISvT8~VFR38ea9{;kq~eR`6zFZvg}Ez|6ugr@!=?V8@_||A(c!M zDY0+!z{?l2DwwJblCg`!_Cd`&S?`p9RU{PoXEa2RnZbfwv!BL~{us(mF^LC^MH)dl zxfLCNj(0FmU~usd@d`MuD^ct>w_81x@K-3%XPqsIXcGo#|7au5nk4XoknGjVz;~Tv z@lhHUb{x>GI`G4yYuoe}O?HVmLPt!C)H#s<%XEeShpK3URc~L6U}`67Wcm&V9qGFT zyj`_JRZ9}UWbN8fUEKq_zm?b55Lzti;Eg}Eb@q$g7VM@gfKV`3_!QoryiFqshz^PE zs>7dmfpC=?%QDK0)ls4{!++)M6b-Tco4xrDr;`E{G0l(Q_PQwrwy4(?Y~M0>CIlDf zPR4|Xz8~n#y@cO2a>vXwOB^|(#}pLYEd?AJ7=rBIZa8~~TiJ7iiKBmo_Qg}6UfCei zyar{w#w>uVEvfV7*)>io;@+w-fQcC3`>MFxH)9FD>7QKLkU<$Mbaz`CY{Q~Hy~B|v z6!^H|R`EmmY^)beO&&IqxF`}ny(1y`){M}<3F|b&0z}?IB0~Z&(9jgw-)Q11^s?w; zPtRCcj1AT)G=f>N2GHv$u~$%0{~lOytsx*`)H1oI@vW)gM4i5{6Hh{xs~t0~R7iGc z*t5w@n=MY)Z(MjOU0r^j9R#_2{>(%4-IQjwgy&i^Pr%z9J&?#2Iq(h@$4PMe^V^T5 zzXTisfLykk3+N`SBcid!tM|L;IP7~|JuVX|Gqs(F)zT{-_gAz%Kk+L@{NT2;IQ}eEUyw$JZPgcy zk6{p<4ByGH10*x~65{B;rs)}LiMrCq&|w|z#}Z0>`nON{LREcP1~7^<@yYo?IN(1Z zcZEg}0{d6ebkU!OKX+2c^XmEc97ZrMVCi0WtQwdOlcN?4V~ERkT)MJh7l|}@KDaq# zvlB{~^`eO5Ix@=t!LWt}pR*Hgn}OQKF>UdB%cK%dl#C}RUVcyt40JV)V&WH!N=pY< zSD&;0{-WUiBXVZoLTUMqC*LN zh*%*0yO8@YMy9FGKK$?)j+ED*>==FfnMA5L{D!7kyE9zcvAOJby({L4S{9n8PURn3KGqL>;;k2d#ofv7OD(sl zNBVe1&bXnsm|8?xnHbZ7v37Q4zes;&_sOY1@Co8M(Md*(0wi`vFQHI=~w!4Tf)9IP;?hO zMUhnh>td-k7eq?$m{voxRag4Z^|F(kmmLe*O2OcJ|5_!Gv$xTyJDEE8l^|!vuVNf! zpBI?S&6_PF?3TaYc$%Bjw7%8W$x>seM!n+)pdxc@opffvYQ| zr+eBgY(7ipU{Cm9Au7Oy9LrVey*=R^v!zZF+l<$xqffBOy~B4B0!2q#2*RVieeRsf zFjXfyXeNQT=Eztz&3zfLTcvi-RYlKLH#d3D*UwML>9W=LKtQ_J;L`~MI%%N1q*!2G z@50Sv51Iist0{q#*h|7h0%=A+4tis4S?LdIK>!;(%@MT#@w8?;g-BOEM=t-tn! zLKrcU+e_Xk-24Dc027~-jX&CeRzIQoNH6`K(#d^^!uu0Jom~6EF>hLU2KIUp;ZcTA zqcgxM+X!V!;(6acY*Lfy7LVk{HPh}bJFJhgj0-V+G}8S1@htEHxG#DZ>iW`FER)K0 zzR_y|5&08-BWuZ%-#XHPw=m4B;_J4xY*WPW8Q1r@`=wjiruWZUysQ(;Wmv)T9PdIYJ7m`h&)bug~!aL4P4X z>mRX@y*p0QT1h8ouzm&~pkNi}!>Vf6$TDY~ZP?Dwj3HlDiH>03X-*86Icz5PDhg)~ zoF^hQadWycR3|tUhp3>s)ykvaWr$c`LsGY8j)Xv?jg){*=a$3HAz+Y$ZHjQ&!5@6o zX*T0}6YsUAJUOr5qBpLJ*OVUE=W}Sez?;X-pzASJssJ)#azZp%&m2|x9_cOiyh5(hMNk5tEUc7T)#f2~6x{`V)$-!5BEPy0aK*x%T z%l&c-3O|x*c^>I-+82;JKKg;#2S(Rb z97t)7vE1DE^orxOTLrVRc~tM2@`Z=pl2deIgPJx<=-s{-57vfv2c;Mi32MQ4O@I_4*tzISfHFkG9C#gOJ_8+iEYMo zZ<@WAFVLm-GLtXfXlF^k0Vm>YG_5wk|LV>Zi$|mS=BE>}V@U*+^~Hpk1q=q4d+ME+ zV(AE_tw>5Il4;ZrQn|G+pdbQt3ai9df-(;Yu9CZKI&tRW<)NO~-GCyUF=kGh4T)0# zDCk!k(mx<39g@f&tNfB$U_;a>5Z?(NmV?Vup^%%JU{aE>`C#eLi7R52 z8J9>pkGQH+gmQ@{BtFL#9qJdw^zDVk_l&deSJ%;!6Qh{qiHb#h-dRcRve!=V)}JC8 z^RS~aETv+T0N@ipgh!?>T}mEoIl%kuK_mB+f&KdGXXkQwn#*4xpIIE;C?snK=!$k=wK@SS&?BmT=*Qu8ryoA3^M8_ z2rYSXRcn;1Q)t-+dxu~x!#dEnnH2Kw#a#?Ev8n$y;1BV_U*<-MSr0g9YviS0%V7Gu zwfJ>G?hq_tT;$+4P|**=cox7?>D%fJ@xlnLJqkMLk3_aG`DQF?c%eZ#qSTM(X1C_w zAEvBu@)jcPwK^rw@Wk|Fu=lPY9$lK6PdH2Y7t}@C28wjA()WToN!L*WLPcJ%!UF6x z$Sx&h%K1+cZ^u$tOL5DD;*f0uXbD-x|1Mi*4)4$ocj4||yDIpfuuQhj9i6q8=ARK+ zr0ktr>(|IS2u+z*_P7af*-23F*nYFMkZsx4Tg(xbZsu=9)LJxqxLLMbGID7Xe0op3 zjOfzlbm5pRop5KhH3EARQ0UD3heUEFy9%^R} z?>4i|w|zXE2SlO!!00OBAT&dL=@NkXq+EO# z)W{R7BA;(6PR&Cz@qwywyhJIt60lL($;}WV3+XD5T;H<9>?0+dH^|(sB2Mc|8}iI} zdAyz#Ya5uU7TWs7Gqx@5`ONqfIc{je>F6J7Zbq&Jn_M7m#CaaHf(4kURJMAFljt@u z{4(VLES|=r8XE+nv7B9DdUMWdr8mvORS+i6WY{N?m&EmV@66pe1QOltPvNrd%c`^0 zKk&|&xW|Uc+AJT>0*8!cNzRAU6*(Sbf=VuK7nPGOG$BnB1?Snv$UK(?Pj(eg6ldcr z6iScFMoJ&Kl`gaC{J%&nA0O-*m}NMhIlPYtk}YuHSnjUJJT`BqAofJ~))5{YU_$f8 zkR|L~9&x<1lT6FUkKIny4vODgK3{KGv!@}xPC=*-0PPSDzgQF@bU?8k<)?UiorQU4 zux6&%xOq`!~U&Y`e*QPL`!>`WVe=J~>Aw+$^HS}UZcL^T%*5@N-0BVLp zwNzM_&6jd1Af;`NtI^=@4sT`ra3J%b$t+7~XaNiH%3Pp-5s; z!asAwum3diwT5(U8`F!FN(Wx(Y?WJzo<6_bw_B|f$4G9WtTx)8IHLu?}^qs-n=aZ;zYqYO&El62p z3MHv`JqY>agFScCtZ3bG^I>{uQrhHl@paVNRAa-c7NXa~Fql>cK=7?aY9NCNZ;JpE zw>DEPH`+3ZufrK=t8aP!8Z78A$VlQvjCbH+QGFbQ87qJl(0DD3=W6PN z4uLa`CvdfO98k<+-gL5559=d8-4yiW4&c{I^CgmLemV)?BP=&09`dgvC)^4*XX^cD^i7Y~c@iPH%EPj9Ta(b9@eVf*LP*5v@|MfX?v+MWG}_vta;P zEN5Q8w3(eIs6Uzrtv`-z42SSw+3THDXl$%jUDmf5wtEOD_64VA$>8A7`00R8k3h?? zb-IeT|2oNa`|TFMt$VniWm%ug(|jkpQ94=p-F@*{y*avt-YcH1Rq1hPV|!#X^pIe? z%X5CAh*ZR(w7C>T@TfjrbiPk=P4_rl7a)HwV=}I*P?c!w`dKiLY_C6X??V)SBEmS)!6Fb>6we^b7e};#oYSZ zZ5zt3{cK}``;FS)0bS0PIK~^rCm5cup`rq%pz6z0l zP3cD7M-RRw=j4u~2Y>J5XXd1Z=EuJdpZ_Mf_ zQUo9R^~^qfH6hv!{2oyvIc4}&dn~Gia=-l5Qh)QhO;2&A!UUQsn?+0WqQ{H+4;zrC z4TW!b{9TiVQJ)tqWciQ9hwt}FTKw4ryp_Ez@)QvXrjy5K45fdq*Ymv z#!`>gH>X%7>5`4SP_Q1Lnv76!k`%0r+v}mjJ;J{JdC>KUF;Hv3lxlvgUsl8aezi(- zpPH!td-4JO>__F;klR&M<8bgb^Nzsb+_6%~^xtub8 z(zgB%Ijvn2E_f30DwtDAj7Jo@v4?ZD)L--^!NhOG&UZld(^Bz1|~X zGY8b}*g;=GMzh|fI^2rVMQlB~f-?{I12@#AhkFa8V7k|*vYyGi*IIVidAXm)>AbD% ziJC}?bFRq~mLgPt-lNGJOE5Q)kX|(VBnM`}y$s9t+aL=D0_*L~SdnIU$r6^}a**ha z%c`oSD#JgD9!pGryDsl%+zp%>yZ->Q9=?+nf4E~L+asAEC%x1(zffp4;Ya&;I|S!m z>Ze1vBPc7vppnLP0&~2?Q9E4QScFg+s*LmluU$CdhT+<>$(r3c<1W?y2i)Z3!33+- zJFDC`ywo~l07l)t>Lq2xmbg5`eMIK5IkI`t_oL&Sa9TK)Q5g}GnY{v^ByMx%_xvi? zK@}qNgK0B~nvrr5BVJ1BoAQsQU~sa4F%nn!Oc1;i=cwW~f=>23pSuwjA%U9*#w~W= zWT7|1Am&k$k_KVa;wE9#Hno>oDrzsuZvKy`tB$Ap>*LeiIn(W$n(3PE?ilxqVN6^- z4!Ss^2~9{0z>0{RKpPfIJrOCA z6IYCz2)o5gv+^wX7ZJSLY?}tMqG8GN9UNKMZ`l~rw80#cn2~4TqmoAvLfOmnER9i( zqMmiZJXKpb#N~u09h2-QX(SV7yhq=+e2~ZC*qc>FQS9a;+XgGVz3=wkT&`RJukOyz z53{z;>{~qVMut>@1F@T<0;+|(bE46{Qj8MHvX4V_DZDU&t>Y=B$#TA-q^W6ul!lms zP_f*_>kFCHFZ7hwQ9PLt#@GMpT3>|K(dPRafj_!7XfR7&@-se0FxRQxTfuJl9?b~eq?+ICo?R7E4Q73}kr0p$M_hr2Gies}Y| z5ie{bb|wQBW<=#9>#|-Pi z<0>i`!+p?T)+fp(9pL`Ng!kr{idnfW6jQ+jEkxbxl(TaBBnH9;16rzCVlEe;{8=qq zCxJmNRfYkXe%$!v!fLi0l{&dNceHPZJ;C99uF0KBJP+RHi!deE_d}l4*QK8@jG{iH zI0@+ZE+U`z_3ZX1uyt$3!O zXx+oneADoyNOP`htxu%hAuftqg$g--+W5wd0^c?SI{`0^k|nd0;D0RajCS8Ve@1zE zP&YzGQG}?t6~()Jz?-*5VX&_=XkUdhHR<8WHyE*Y-shHe;-}ZVI`aDWb=q?ypo!~; z;<@2CMYU+%?52h}&f@eHTnOf^4=+Va0Y$}HV!O^q8H3k?DY{W2)6S&*>A~Wg+IRq( zUfY_HL4s6NgWoD87L)_zv^}dk%%ue9KZcz2OmEiUW9pU+p~Jh!ND(R6MXMQ`UB>L^ zqI0);_J_PLG8+-k-=w#;0%tONscD;~g2WJ2cm4UP8jxeqg5pY)`>5xktE_nGCQ1!t zg#R^LJNjo3&zOd6JEF~QXOx74+CIQt_p~^s(BWkO2>-cdhvr2SdZ3?7DAf!F(#nSi z1z#`3!zMEc@~4gJ=)e*aiTP}ZVS{PTmS>bja!%1o#px49vLX4R;g%pc_|+LFB857i zH4hoL`~vul5b?413&Z1xg2|j{aES&T+X-QWXbq(Tfl>$V?-BngSBW6*&uv0*pwv+^HK8c*)}>t`YkUKMB8 z)FibQRYHJ^?1d)k%#OE6v*2V-VxmP8d+X&hP8=KC-NXq3aVgz?d1LG z&C$RwNe2-g%xx#Ct?3;0brrh?+Uu94crh-q&>PHZiqDbA4rU=3GoK5twzhg41{BJt z$ho9YfVVsI@58??AiXG^LaF&Nf|+CkpgphDE{aV$h2!)k?nE?*z_kk8;7&q83UwzX zFwjDhXZ}ck9MJ3k>;vS{(=9MO)&p82=c6569zcEGAxxNIG9|eDy>?aAq({|hGaUm(>gCA{_A3eIM_Y#$omWSC%%hDUpC=VRk4)go^Ao2I^&=$kmdYue8@r?cbUSRe%1&5%pW2 z_N&uL7IVoVfT;a9*YRADP{x@IoSS(15K7I*5lnZREvkFA%wpsNrYX0fc$WpH-m%=- zW9tp+YV46cH)^+r_%eP@I>dyezrdF$4_w*h$pMxJHmSOd6kQ=>3udvnQh?U) z^w7!;Nk)nOH>z)w_=Vna&rr1v+-9p*X{U#;t5G@U#2zM8h#vb!Jpo*N=Y zHOn7ZD!(_drI^I8=r(A}hdGLEZc-brxFJi_Nm?e)SfkLQ-Eh!0iDlKXzJ6>+B>zz7 zG?Bnh*f((hDWhgq72aeAd#6F>*<+nPZc)iBoO4W8HyaVKP{!U^uv%6+X4536m3=qW zdku5tYRx*M*_E9+z|6`1WU}TlfjxvRAeiGbF(sTKOa-#bl)8xxANQG-6qyUqd^O8z ze9FXrVk8m%j5ah4QK}wx_(uJrs?whO87bw%4!8{?f8x1fxg(aW!Yg3DLHWb_7;b?y z#9ASf&QXH))`9Oy3LKE%Whe4HG6xeM^z zT;@6hF>c(*8~1T4U z<-h>y8ZD#8Q|3PH%JD)lh^Fj^ENAUMNr{rF3+<9kVC(cTh<41vff215Xrv~lxkeVO zY79{s9V(H*#0KF@f3-$}GpG}c8B9Z}lCmoJk{d6gF#uVcHaJIb_=r|V1}|D)YgWJk z*^K`ouEFMy@q#+beV4$AMy52S6r*YZ3EVT}28R`zW$-K5Xi?wgjst2RS3EN*bdh!& zS;Oy9LNdV#C!HJnc~i=una1|<^|V1T@_n2^_Aeqs*5tv=eyt#o%c>ZSC#Ktb8^|GB zA{@)Uf)@!Qt_+xy6n&Ob{LfzeBMSjCSFB>>l2v?vwmh3rs7O@4*?}7;XsX9! zPOA(%=kSypz>U7Jy|S%Snb|fYB`Ub&)vmfVblgohY-sv~0+@5^`q$z;>6z@{0guB% ztjlA}DNfRI2&xf5*oRVy$&G8q8YR;Xe_>h=fNn~=oqw0ze~Ij`>jq%>+Gz&095Ur& zQ>no2I3w{D88{|qCJJ6LBMg^sTBEUB;MDt(GH`Z@?3LYN$s+S%UyJno3(E*svdL!R zbXD2eHsf`SJsIgXSPt`Ht3`LV*QH*9w)XY*~06=4}+HStN?9xrbK`L?R2@IG$z z&R({V^I9idjoqokZj0{ZR(q1^de>Qx`ml`)ARwH6s!jUOHtr;h5LuHcqd-ayB~Trf z_>qd;;-MivdtgC;Bgl)aykcf?Nc9P&C)O3QB782L9!3?HE1MWRFB{A|dBd&C;v?cW z*tLRt4Lt;o(M+aMsFkDF<{Ls%skvCSsM_c{>JMV27F{CnU8cS*ptQZic-X`V99;`T z1M;GuHdLOfGRD5W->dXYl8_~Xs9JrHlmj?Bfz&IO+MNh-?03Z;UzN!=;O~)393MRL z4i+FO%|L*lpMGqH*t(l;mzM8=0=^BT) zZuHMZs?rU^mfnCZ9hyaqT-e?p**lS6c83@=p}N@OVZ(=`R1biodj_kM9R6yr2e^a5 z7cCi)#wdW<3jYF$#jh!$T7!ehgIu>OT8cSGIHoyGgys!A0sDgjzskg0iZk+eXovY> zVGJ~q(sbjPOi1FAj&{lLukFs4Wk(scCz8!Ot($Hxxn6nLn^YC1GcS=4*ftw|!pCZX z7Z}rp6LN|-hzM+Gm^JjIqY@?5n9F|daFM8N7(|j2(P+`l#rVd?UuZZ<+h6?S>xDI9 z4gJ(3gFnI@m-v9hntal`p>laI7hEBJ$BhXv+gd&RSpdedDF(QW^S>lH0Xj$NAk` zf;gM5;4eD}E2_xC;2>1sh+~=+;y-V2i)3p6!(RCT7s-h0CinpWi`P;T+&($Su+X;!_e>Hi@(O#Q}?hDNvd_zr^wUc^=8V zuA@~>m?I^39VS0#c)$$t1J3214tXPA-v0Sdz^Dwg#n9Q$*i49b&%%pyi$WjMdSWtj z1CIcj9_MT=Mbi2UxW<6nZ_@g1+mqL_7bJ7dEXNF!c70fHcd-Cya$tk*1^ut4 zfKmQaR91YI-%U9aM=2ZVp6O|b>sAlS)HONiwQ4odTJf330L{*(iNe(|cWvRlZT?;) zOacK#j}O4_ars-n-qD@-lJ7Jpc4dk<+rFz2q2|q1EI$;UFP@Ma5C+Q6i#A5a#<`%3 zB3`d>4~5-;fpo$#fdHKvYBV!;wBoih{QYFwItgo7(wqu@z_&^ZUzK#*UX3cSbB#Z< zMP_rWN;S_~Fw6D|Gp%*IAP?sC{57GbI8M10w}XlF={YRTWsdnMpvWr;d5Xnmwv`jo zC2x#Jmc+g^k0no|r`=`zv}yE9F*lJR76AMF|K(@QwP;Kiq$K3BReVV{GwVv|@WIuO z)}5CF_P5YQbRIZ-;G%=vT=KTc`|ylZwb60ErPXU?`Ui3c?`F8@%ICxytUp95{y-k% zwd`BxjW9YC7W?Ta?v9HX5SEU=e*vvxl2W^nSEEmK3AF@${(?oX3uXcCYoQHnqz!xM ztLO%O40eVx@`#HV?JF|7#NZthRW0*sO!i~u$kEi+GNTxJaX`G5>U9focr>4Myive3(kw#B0HaUVsl*wonDck7QP(o3q=~;!} zCpDT+W#6QfyLA+O^-%v-7`YV#=@ehWVTc2);%v1MXyOAItwFD4O`1Cwy|1~PM0pBw z!+@Lor+w?A_GeEvzf4|{&T4}=W^fiiid`?}(%96yme;j)U1(LjiCR94IN*8|zy^CG zPd~T7wM!J`r<@Uqk);$a7uT2uonJ_w{^dwG-=%Hkw~^kJ=3UJzF=Hpv76y)t{J>5i zYIZ_lAm zgUzTy=Ez`p9o)8G4D|7r-RHr#SyDKtyHXe`QR45B-=OfuRhYlNXVI*$kJ6C-r^r=Q zO@fUk<`rR@z@1oPV^U12YafamTO^>QB$*KS43_^iU#{wLApzbqHhg=vI za~GOS2+`%s3M&5io|!<(+4*+gob`5KtD z0G?>Ls{)Fjvx(t6-nI54X@>GaxADos!|2O5`m%XPL@0x3qM?lgFJe%V{_7LLF6K9K zMT$Xz8EP^cg2yP73}u8Ye&y`upjQWzh3Atfx_!Y3?KO4z!56%+x#od zAH^vek}Xm$I=Sv~+B>ps%OiO)4`M3PZpKSrd5JLG4r+hZZAJGe%XDqQO}hH3 zRPLxbCcJ;LVKHN0&WjYvj4ty0^zf55xLf^tjO50XwV4P?3@~h1{}!^%0;w8u9gcgC1b;NO&>c&w1*LATqlSa|6mRq}gCj0_D#zBqRtAQY7RhCtB z0rSLk@)G~NJh1PEhj;4SS*maf+rLDu1>8mKF$E5X#EY!c*$euu#i#d^kaDo5}O4=wfH+o`nuD z&*R4#iKy_mVBtqc*4Ky}8K4dL={wMb1|&*8od)>sTr{5O6U#PJ&eLDre8blL32*jn zkSe*FX!p8fO%bR?U0tA?SOqG8!p7n{D(fax6R*mAk zhoj6>nPOX7aI+$Akt6XVukPJZXFiZSbbR5k^PK%LR_i{357xIhip+u9YA0Ls&ioBM)4Eurht$_}-9DgyJwgcyon2{KJg4k#2G0=B?X7$dj2Z@~iGf@7ZEhq(^Pv3f_%hzr50QG~XyGveDN<0TFI+ zL|x~QzshoT3qsMt&sm=6AJK6}O3rd@9dMtWdUJ;Yco@u7Zju3f+8S44Hbf*{MHP_;%qewa|fKZ41Y4~x1V8`hEFwm#4a#Pf1Y6ogDu+R!1 zv{&c+xK+$_9G~nDJvk9k9%>z4*QkC+<#6qg#1BGb7&QE)^NqbO{SJI*zB`y6#6a}W z+q-WD>w!J)u3iBQUmcWlp`>BSkgy;?5lLRqS^A* zM+J*i!hk*t3>G@>i~h1IG+21KYHuTFzHeZ0Uq$)|9FVnM-nS-bN1^TiT~)dg;0?B)aq<3>oJ5 zTS(?F`N0moDAQ2#rBeAbrEVR9_AZkDuSF0U!f`;>MWTcD8LKkpyrUluvN4hzHnCf| zXf&`EQTzBHugFJX^hOltRcj@&h}p;5X_DzbNTCeT%mko}@bW-Cl|G^#L8vWKmb7L7 zp?s7|phUya2^3YFr~X9c;K6x{^uSFWGKk3nPbEhwzO!IG?o~&BDt%?A3*7~qZE)K( z*~nzc)5AvSsC#?Hk;*3b>jqdKeRU;dwv}~9y?Bh>jch$LgP(7>swIovbk8o}kZTvn zh~c)hXOlwylj&$EcHpLxbS8CCm-;k3RRwi4=fr7BCF2`^p+s|EMhX1D#kS`jf+DH+ z5B>My1+2Y9=;#26vo*xDb@W>+@(#OQGkdQ9{9;WPj&TVUj_=30>{Wt)_loTYD;FLu z#j|^m>zF6jkK25XI(q^LJvtJ8GcsW$r6ef&W7=m^} zn+=sp2neO8hTzJzE8-^yy2iI-5?}#Iu`))uqvu1Pu{mP10o_B#cCLllSg{-NiXH$juhD{pjo(t9Ogo&}X zuOyj4j8YwRfy!&ILu%FSAkbVP)q5qcwC=abiGlTBP2#H`GCXLcc z=us(R%ZyOg9rL{%Qw!#-vJ#<-a*S)Y^2Uy25dP^?i z&l(?3X=sE0gly;cMbpdA>28uWwO2yJ-%ZHtlyU>%(E6#fzyP9CQ(uG7-(7T7%uop= z3;Gcv8|?%~{R_Xfw)H|B0-XoJOsYnpvfhye!1ly&({*Xq-gEf*yjAO+$G4*l(~CU>=-@Q#O2LX{B8hl{ z^=T;8zSP-oj7IL~t~y_vIF-zq7_Xj_A^ABplmpa838f!uaK-J!UY|e={1o*4!<@pln^d6h|u~!{=LUq6yEoZ_% zXVv@_wg0FBZVi%XG#36e;CBr46!qOqx~S#>Us&x%qwzB81<+E_Q1AB1Q@tv;@d&A^ z?j1iRE6-WJr4dLhzZu7`GYC=H97<#F)v0ft+!QZ$Z^1Pi;navac%Nes|H7?VNMkFZlDs7=m1iKw2 z?aEpYHN(te>R_WVJ#8a1pS*wzYJ5yFVsitT{>Diq(>bb(U@2_#jk8kyPmP$HlWd*t zdJ2$GQ2zPai0&>3c((+P;*lDY=-7^*1teJPpFC!X<5yUPX9|n+(`00>G(qUJ{ijGY z5n$dsGR`M3MWTQ;^RZyX9QFRgi5#!j=eNk0@)RkBn#mXJc4c6M-}A6n#q;M!Ne~+S zYh#|=gM&r{Qs@!n>yRupA2Isk8A7(in~m+!E~d~D354K85^VrhY6c6{T`p+Z@{nLQ z`2Ov@%=qqomuEcT5 zKF-|-ifx({yCcY#A=ypd@|4sLj?j?6il|FTTA)jAkhR}zU;Am5i52XFe`*E@KhK%F zwi$f`OW)nCXnqDIj#IupD{pYI3ntY?H%LR2^Yu}qk{PWmFjZWrMJ1d516sWh=&VFL zQoZnBI=$A0YE}n*A0N9r2^`lDIJ%bpI%6)Rb@p;DecxVddm_z~NNGFm5dBm|g+(ib zg@8jVX;BRK@Tz&XX{uGUxC#(jgNnu_Es{U+QgA+#xa%oFxfq`__B?}rc|>w`wL-sWY09YItR&rHO}6Rje=ji>}MX?~mi;!&xV`UJgqLKFt_A72d#~DW%!;^M2l4 zFR9jAd1EM9FCHXORa=TuwOn91hOp%)BxO8=$rU^kye0QfJ;!97^8hSCe3*K&d(lvb zie08+JO{->kFKb^s9y^R#9=3y2nt>BdyUrkn<$B1+Vsi(?KAFiURdSb?a$pc+TY!& zF9K2TY;yf%JeG@oy|zHbZitXVB0CV&)>QI_QC=JAzK3RmS{`rnFOuB z-f<|^qx)Ia(M9Y%^n;5i{P8|NF+!N@2F-kJ@eV376ba=;{zb2|&y}0g=?0x%+FsBt zSh4H*^`OOdZEYYEAoYV1waP0=vmDDiU6B7}@fX`eW%pD&Zp9ktuEY0v0j-Qi9-c z9AClNxxdWI_EkQn-! zH*vMVj5{D{J2kk6Wn#AUZov;o8-N>hHr?~+QMbufxmOWE^dLb5Dp$geXUOTjcBBp4 z!i+jmrt~D@^0ZlpAXKMTT-PKnAAOkzWptVdvA`^Ee`cC!v|AYXf=*{&*73ZwI(?x| znM%{1^eeK~i#Np+!1gM>k(b3t>~dbVH-#h8?}7P3Tz}x^{7gbc`fMBit67(b0D9PB z_pSF-Qp%@4`Q0;VQG+Tb|$hHrc>-@0m`uC6n^Y|n6Bkgl0t^FHA6%sq*M&! zl$XVQHE^veNs=jfz+Ex z^+%E(4}SgCFkS+Q5dzQ;3$WAa7=6N}^WA1o58m=oI6G&?Y6l}N#X~+5Y+Lp6_RK1y zc6x3$`ZF3~9QgjpOeX?3n@HMz8T+((X7-a2Jky2y4c*$5O<$c?mQ(kD7%^%~txVfV zkS_e2R3M1@+5D627o|>LH=~iT*cK+ezyPmuyoeE-a#{n8g@@q!Di$))#&NF` z;9dI3wCEzS$-)tV(d^ z#W%WXoDraG9E^)$GsnGefMM!;zvxTO5DWUWM%-D3U;QagneqG)-z6d$12&-jq{s}4 zh>8jvpQ$QPIQQTml7fA*Z|vP}-}UJc_vPUDB%){4yk7ehCnAcDl)OWy!d{w)sf(cBa6z5uGSU+t(blU9zcV zYhHbMb)0cznw~91c2mu~?Tz~;y<%0@Q1oKlO^0*mW;e0GyGK;op|36}3GQAIGav>% za=b!jHA-7L4AHF1p2p>Nvb_OovDB|6pJNxN_rP)Lb<|+~=PQ8sv#C*5kKbY$z?zU6 zLb;J}yAg?3!J?-8&poqwRlcl`UMb^5f#`U*%Z@$lm9xYSi6@`Cm*&~@k^FHM#P0{R zY`KzSZ!wl<`&w5Dxc0ZNaS~;=rf+np#Dq+|?oP8zNc*ro6ZyX)WCf=)n+L09qQ(V# zyl4V}rPYwarhzI~WI{%lhcb65H)*WkFh?KW&|S-odxJ06@B(;K zmQ$WGZ}xjmPd7*Cw0-O@i*FIAaYNvY_2)rv*Vr<6igFK_z2G9&)JO-iQIpK%_;R9X z(AXpd?Ack96KJCSKWRCBe`MdThYe!_@OK#2!zN&D)CMe|$3Ws~LzCp6c$G;NHUgqN zVn!Y_yQXWj25%yJ&T^Y=7;OHX5%KoTeu6H^N9b!e7%HsJ6r<*I+j}a1={N<#MfX1o6sZ0f^aB->4EM&dSi(*deW+G2LY< zi04lIEO6|kPgLw-pzKuMb20DyS%3ISAEV&ZFx?@xJka9a5@A_+Qa0yPNj$xt^acW# zXEedAOR-WRFK!D$5Y1WyQ!3|hf-D{wJLpZP7i5f(1nUz`dt*Qzm(E}L+kUAAZ1z_P zRmES!>mj+`JX5(djZ99KRX)>=*`#O2oxNDS1lwWz@Ba#1`6KjpLzAsGR@VE zmLsOma$mZv#Pe$P!|%b%rjm<{$I&MX2apBzwhtF5HFzV(2sRDm=uQI8M9Gp6_TUa9 zZ0Y)RP8>R84Vl6Lkc9MZJpBg{5M`X;l+|FNK9jqlo-**z8?W{Tcflm$0F#Kl>gyuA zx?2fC6jsZ|%5vg>6LDVY=z8zt6Y*nK(b~EX3FW! z&`Wo7dwNHA&0<+_HiQ=u>(Zkr9VCY@jnRjEg!@J48Ep&8)WRC`A06V zF}7fGNy+50^uvi>`h*;zY=N^l)fuL)%$Kor{+lx0tb-J5GS5<}mN@tCdPU%fAllNw zL>!LYr99YtOv*1%g}eHISYvwO*Y3dl<10eag{N}_j2}g0YCw8&Bncth3iCV6$#$|jT*%J~X`N5`& z_HQ=C%c)~dKZhFymW~bU&is`EXbmQp45XuV=r7^3GY!n+2q;Tjm06&hN&hpRCOjRf z3SXi>KD{YW56__d$B|gKIDdzF9nb4{=N{XqWuF$JO_}x$jGMh%S6(M?==}P8j+ufR zh@5_9Jga6Us74(abPNqQ*3-(!}WsCKk*5&I|ccYb17RgPs0)K zRq$@$YU^%yi-}SV&lHNvs~fvL{`}}nXL75OOj+`d+IoUN`3puPj%L-zE6z9z%q&1b zHOrd47`K)(*{uGTe7VL`_bS*$;k3of3Z?7lkawv6RXK(Rc{+kSY<^0@TvVD3jc7ok z=X5-TigZJYehlj@&AwZ(E^x4u3on3eBy!PH^c~4D5p8%T zG}xPSac9eX{JqjyZCKv5S{C1^8{c+{M?K2^W?7s6ey+?Js-WX2gg=}@w+=I%>ir5+ z`+!)fW$R`Z+SZ#%s2eA|GJT4EAyw7-wLx*lTF z*FcPbaR3v7jq$+aw`q96M8^J|Fk0*D^uIzNYj)lA3w`d+$r+JG_Bg)Ef(t^*t`e^! zZ`c1TDy=|FaQ0uTdtY^?QDyK^wYr>_vpD1TdK!Q3)Z7)pA2fw<_*^)!#r!R8QFXk~ zK}FD~fj94)sYy!^mjH_6G#j9iW*tSU@>?G2gB=|e^%PyG5bA%MddCm{sl(=xK1}de z4m2@=NjriU1Qt1xJNGcG(>@kir>kUhjF7BZ`R#IH1zqM*B!w6=-evPW>w#;*)|dH>x5@*A2d<@RcPP^ zQ(tQ3ocf?*NvOC>c;!5^Blc@}jq!D#lGORZe7VmeUKIQy`#=B#7W?|Bf-nRuS>*N} zP>&fG7hqkL6)i~VGdj=NZruE^hY&M3Mpw+- zgsdH)?Wg~iMkye1fRZk?uo{k8Wo@MgXr*MzGQIrCi#CV~QTA{6>A*&h_-7_ir>kgIRJkM?`}PiP{0Ry{Tn%}LgCRt6l z1-QCvA%XV2eRS<2u0$(Bdf-vEa!X;jkV#eG&G^JZlzPKab}L^N;K?2p$l0#A*_AH2 zRlH5=&({daKxg`DZ!VqDsrvr0sO|zk+rdHf0MT)|fTfGNb9amApR>u(n;wwC&BdikHfmJIIv9r96UrBPJ{xJt-jsE&=}Zs3|e`q&RB` zXhv1qQg*^Z2-uCH)snC1i=YkXL^N)6cw=AdP*lUfR{u0Qg3r%2$L58Q9z)6@@h3qT zR-$QKB+mEh?&WPs3ZX^bZ5==n$553$pghsW2lXx<-RZk4OTIbn**;o zV_vLpS*uc|Z#wj5{O(tKIp>ZtRQ&04pV~Qc z`VzDwss!NjOK-ka??cy+0;DAhNdf~HjAEFvrPg$`*BIKSkqG`xh_2V;`4YVJZ-X_L z$?I^N+WTj6utjD!^02M7@nmVyJM>La)#DcaU(3tXEo8HKZ06U=ZY-;GbBjQH>2QUpox?S|7dDiJYIdtHa>_?W(-< zAg$Tx=ei!%3&7bKErJhZZRw~Xk9v~y>5GDfYele$nzhJ|iuaQ{mpE?wlhVV?UysDG zx_d8BwJD;o#rlKQ)V!L|9Ia-XN89O!D=Ykn(pIif^@Bkarb;4!KZ9Q%=$Hc$rl5VG zd(`Qg!>LcyZmt~=qn&6N(uTph?9tM1M=Bj~VFyUz8(c^eIT(C7eNuv_r1KB~^>Mgp zOLA;twDlPDaH?WTJNmaMB?PWQt=*~i*0_EiY#7YmeXI5wImB^k9#p4G96m)H-hohJ z*er1$UDh%a|Lrg$e#ncfC@f?2;)*}hO&v*fgN+f^I@IcwlWlz@ zvA=E7*6ls$iZl{jv=dw4w@<6}pE7YrXc6Y`X@G8>ckJf{61Pl9Gwg@b3M1Q7|ycM&V?sC*i z!|Uy~iKY94K#2v1wQL>JW1mK)DST#NH~|P^d%Mn3jWm#}oQ?Dd=_8!_t@pX2XX6>V zIidg3k*Fs$vWGk|bTH@ch!IOyIjVMf*nYd>?4O@K z3VC|RhhLQiFTq*-2)q1BwC6mw3c0JiJAd9q;cZJXV(48z&LuNkqPDPQuv_P7iaLJb z(JG=}aNi#`_i{V~jg1T6mz` zJsI_gG33SH!UN!fNax2a!|5Xn?QjsvoF|*8Q zuJDbeBZ-P*7a>C)#vJgUTF2q*}={t_aEpBS|%r-BgbleP*($m&ZF%MH+Ct zo^e!mH@UBmDW%a%c$ov*dX8OEURo@@xqs{_h9v4za3oVIW2=3q2F*C}1SqY6?;YA- zcsIH$3OpnC6mqvq%6_o+-r^Q)o&^kCmVXoTunO~5HAsCsjj4lUGa{hW`({gN`kDUX zW>xo=am_~5Mq+$%pxZ~g;^?_NOA=_$ho~y;0U){6*~+JiBEPs&m1KuyGDrJwFOUUX z0}A?9Oe$U?!MBBSwo!v){E;7U=cr zLAtZ{m@5kvpgQl2i4Qyse_4}3PmWObG$Voe@UdgG*M4`WKX6>_+ph^HsRs>hXh8QF z*ISIBLQ~S5FuV{Dt~e=jdYpu}|957kwI+SCL5|!G0Hb8|h`=)?ku<3AUmP%`3jxXK zWpNx6YdjG|H{<{Av@X$q%lxW01IotQfBRG0JO0>n`w9edZ6R~FPglThEE60r#d*s) z?!o!Ib+qVL&c@8I$fK9z^Lwir*Z$;)NBI}uTRg}+2Z<)%p4&1S4;cNebp`;OPDGu9 z+7X<(kQh$9z6Sd(6e!53n7mkgKeq5!^D`CqIE1b0bD zNCKaH;9^tt6)uan;bM^-8#Ld2>J$>~ed*oy%T2afz-5vA^>~K|vPQZ0Rre#6`7@yb zK9wRL6qk0Dmo<-pAW40|%lNK8Yb)|24cV_%G>ex-5hc(bbXeZrQt8&+GxBF#<4@PG z48zRC5z&wY@}4$XBgsJqw4EH#qZA|cF*nqMe6?kS1!u2I0+U<$L4L1(;EfZ~)%24X zkQ8CnvTIOQvuj*m*V=a9sIc+e1s~<#otXkb@LN_B(uM;rAIU9`GN#XFEXhUtrEd`f z)Y5uoSUOg5C*KW5+Fa1w3-k-#da!82d-uVzhT>^t1$-j2GC1pcF>Qv2P*tmkdtV>HG6#Kz)oO?llo>E&Mbpt^ zU>A)QKP8NyZ~4$gBEIS&jrVE3CA$Os^j~!Z^LdBgw1u8plHlUbfb4e4m4F0l$-$Uh zy;b9CEhk+(-HEi*UY=}E>|V)CS;foPuwtGU~Ga7`_=&IbCk|A~L! zlTt{^)MOmrz0)`$Q(E9mX@a17X!f9;OuT0urlV*qpnZCpHwDtE>cAo}hBt=&%0CIr zhBQHvyZ0OBZFCj*gFa&%lWB~;9rL!;TBgjHuv`@u$?rpP`R%E*t76nEbq?(8pSuhT z9bQ(r^;S@PyZY>CJX3~3_gqhiYo|=w>fSHE79q`sa7uLI2J{U5=!ndX(MlBLL(K`G zw_}$TiMTN=bKPl2#d^>=efxmX%7L6SBfDl+i$#e!Bm*3lLZ%4qfrA>0pn%ks z*m4vD%I#ci7ho>T)3MZYE&`O;ym>mCrtMW&aB!5TAfgoIrk#+nrxW;?c(<9eq})R9 z?_RW1AP~;Z4&0!?U?eOjJ~b3iyligG07%Zj>3VcaS zxd|;XW)UZuWgjh;YoFt?dBuNv1v~#1V)9(+i#_&O8i>ADR9m-vTmE!>zp#ym9c8Am z=b~7s=(&f4uT@KFA7NU`Wyw;MbNRU&4>FE}!NH;qVdOQxVxqx_oe^nF`vN|!hw}pY zzWU!22=^En;Ta~Jd6}u73`j3=8TUD zfgd=B%lod(2d{2-*dsr#N6Z@JBJPb2;svRXCO?ubuO&slFNj1UnK5JbsFC_*2SBth z9bsLwWu$E3Lpftau2_Vm7&;mDoO$d(E>g*d3O~15Bqw1I&_-Zl`!uh`FuP?Uc){TF z{w3Q2{ivp#_$E~I+g($%vWMrDqj!A!+uE&~yQR&NTs6J8DrYeHJHBX=@(y;CwgvS9pZ+=Y=oyo7q000A z4yN>OqC)_YRXBRXF7DA>G3UjJE;o3z||00|5Qs|7?hQ)y(^RR2xvmi{dbsWyVgA53q5Md;YZ`n?Z!46t9a@P2vYF; z`{?9N9)Xp-gJFGC!b#0Sy6ZlQdH??D@5M?lLC7JST}#)*(j?ki3)E(y}w2nR)UHD_fvxrJw!Djep}Qy=6o$;>%8%urIw+yh2`Tg?_Wb3n<$hC`llT z%pYJ*Y=0g!?r8(^zh;Q+@0fzv1HnfOE=oZ)GeBMD)>Wa5_lun;Aqq{QVrm#@$^kwV zd{O|DBR`k{CT|BMj&+4o&nwxk_`@FjOILNN_cY(qkJvc88J5-F3+sTuzp@L2%Pi5# zm{o)0sDeIpT&TVK`D*vnKbEw#EahgBmh0Yg*HT4v(R1R*gXNUEXvLf*my^+wR}7Wp zB?wf%aD_Nct-(b~HUc+b`hSb>@=2J+vC?trd6CT7v*7y^O~m(SovWCb-(}B)_u>uP zme&k-ei(3>-5SMeWM0FSU!F+aOJ+GY<)gxE0JC)u))7Php5(d!e`WBcNk;TFnx{Uy zuEdn5WN0uNL_+IZQ7GTE8m3K@5kTG54Z;UVq5mx6D3UsPwLb``V6}PVWK{T zo=^U_y{lUXJ;td*iqKTt(|dNfFe!ba=j@B4rdMRI59yRDzwFoe!VUbQi_`s0^}Jlq z2>E$lgUEy;eEib~1hqbl*B57$YTmvr`J*8L+>V~#ys}ElR&=Kh8nF+9%aN4f6h;=OPY>O+u70z(=%>EomPMr&Ul85mHuA_#KBt zkM`2I4|bDg^6Y^EJ?Gdz+ao5YVe3nbB`y`6@KaPLF8!%`nO3--3UxVeSRB~R{q(%| zvQ737@oK&VeG3s6_Sf}B*CkO<`V8Fvnw^f{QX*oIE6XtdnZ63kl#tLBKN+%_jA9`^Upxe znVsF4o!89HZqA8tJ8jNw!murz+c=DDck411jV?^=gyAD)(NZ|>YzJ`)n=gx*MBStq z_n>XUnLE;0_v|T)tv(H2#3ijf01sdNN2+|x*vwRLX~M1DcG0Bnb~hd?UqSmxC42Fd zT+KFv6wWJFO?8(^^%|Gcd}9%+sgv8Yfz!7I1o^E{`|hybT^>B^R-Zk+*D>vIHN`l zXHq84*?C;m>-r@4ppWy~e46I`0aLQHk2IQVX*%ICdxZlB-`PbRnL0yW69Afk{dHL#F)#IM`saf_ zjo-tR*T9iA^2l3g7a4dgLU`V`nE%m0iyNas5sh*9YTg)PY0;@C?cza`dUjbXX~34WTTMSZpY?biSsY3X)JuqaTT2PYEJ zs8i{T%hHuC$tNmnsqC~Te{ANH-R6Drv1PE4Mn&e8TLouF?Pbfv`f{7N6>9HMRNI?T zGI8B2lMH(GEJfqMDcY}ZD$`hz&?shm?B3yNbZBsPe}mnAr`T($CHUE%cdA@!ldff% z5N-u7_vs0*1Ny1Pm#*N053%t)4B)U$d0_Mf^GF%^I9mqxaW)@crGtuNT&H^#!on#< zYKc@RBu67W@Wd-;Z`puf`L}iT`TEW(PFp-iTlJ8PE7Mo|a-OGLA>NKIlMkFad`pGk zS#powcQ#3}jRJ6vOXj!;c-DQiUzWGw@ zmMjBQa-`xS#rgda1ex6F-(IFRR%|y?Je|q?(0QHdO7V^8&GZ8@?va6b%r_v7JwXPu zN_i}WkC%rMAQdgIn2c5<-o+@IUn*P|xau0=^CI{-(Z~Z()tiLOcLKTEs7;2?njiGN zN=4AtKm`Di`Qm|;CPp6Z;6oiCJIUAQ6R&2xh)J!hiAJd3d+YI(L}kHAWTAZ4w$XcV zHKp$7xTNtveU@>M8|2EE=63>VThkL?Xn@9a%+k5PLPT~Qrz|gD*S?7We zpNqdz?|cpQIfQ4Fg*xo4G#8G1F)J<$xGXB` zwkx{Ktev6P#>b_0)gVGJXr$mRfr+#P;rZ^3?az0*H;#U?l8Tep4skg$JFAzGH75Rw zTgxEZn&eqt@RgmlQJ)rmr8^BJnf6UJe&At{`2Sd)<H!3hEPdnOlaQ=Er;84)= zwaWdo70U(3ts?9f(+fJUTppNvb!W2p9J1ulv#pq*YuhRMz$|3-R-^bRaIXdFKXwwL zNqLVMN^-IvH6tFMt4@$-XE=BiyWP`$^ogp_F_Xo^`Ei7ILzSlP3ca%uU3PxMlriurt^7>$EY*(^CL2qln_=0Cx&(;?lF0FeM1R+WNz5oa-zxL&st&SNU zSf_Yi@K9RNgVKk|G1?jQa4Y4~NvCL$RvP66tL*sQtd>Eg`#UPK7)2-g$~Xz!p#s+x zKx44h>mKd;>3eKa3b>)h}0PTDDj?VS7skPtyfqG1?Sxl`}c95${vXDlM$3P z7hE#urPZe_tXR2z^$@ITOv&7gC-X^@AG(&V_87IFryfwms4b80NKpU6@Yc=<1SqcQ z_&l&Y?N<9Z<^(mD-s38&0KfB$cpeT*19xAff41x^d*#$Pl2k%*SE=eB0?OfHp)th$@dXlT9 z6YxwG;YpJxqE21XPU^|8ihpP$04U!|%A&{#6KH%8Kc{I$5Oa2)yDjf{C>6_*S6)1L zTHLL?ktz<_-Ejv{9hyeE$KEa~?&prb7apb^t;?c3RvUL%R3>1#LVMfR!-vY&e!2y#81TuNN;!vjWn#ly8X&n6V6+@yEZE*pkCSwOO* z<*H@*9Min4TbhV6Q{hL4v8S&w)-shxr;pd%>wCAd5=J$waPv%{U0hn3NF|##SK!oKfa;RL8mRW9dwZ%L`HH^;Fk|XiRSqLTYKpXQTd|f$9X~oSDfp^ z&X9IT_!(5`hhF#ZeaB{#Gc?n*9IC%YCymgW71#Z+t&+I&1=l(Ecl3~W2dBqVUPt`L znd)xPCb`}@5LM_OdRW6NkupQhQk&qTbLiBM>T=EZEj_wco(%NlIaMO?m(4w`Cz}9M z5k7X8qsY_ewmb`|;ER28qcp4ZS_>`nPQ1NDE*39ZOawz~uM8Zfo$FZQ!)6g~+WO&j z4*y|BA;0+|ybE?>udm-qG7k*sZMw?f$xqKouE3u)_K634xdXv6U-ZuRdq{YP%$*+N z*!T3(8I-&#q$<7uK8+c0gzFZ7DoiSh?XzLM+UTU8G_ze^P1};_+@t8PT6#@?m1L98P6U< zurvzaN_;HK7Q@AMkkukJSMLZfrFImjR27gZ%W6lgdI!5&{9CkLMyJGQ+@zV7)claLk4+)L^t zD#Z)Fh~^qa9w7_djQ_$TSBfXVkC^b3alJ}{FVN$fTFAttx2g^=!|fZoOLfxZuv5u{ zbJrq+3H6%Dm`kTmbpj@$WL_l^qh&OQ3j)06G!qJkc^jP>0Uf9DyL2z!l6E_r&fdSn zGu(Dt24Z?yaQon+Hd6w++QNyd(aph&8;Mz=xg)Y%wqv4Pfv2rkugDZVu?~F+KYC~9 zNR(jzeMu3Yb4bE?`9Kred<%+M#UP1?sbwnWU7G8?Nkf?=fCm|E$vQ{;kE34j+i!Q4 zZe{D;BFJEKZl}(x?Z0v|=z(yV*;y6-OXwQa1TG2I@y`kyYPxObP(`t8kI3TI)wfL? z=ZK#SQ%2rJo!vOmqO)wIkZ5=-NS|`3b+ZTJNjd82sq*61RbRP;$q?v=ewz28M^^2% zBR{AB^#`###*zDd_>mlA;7f?_+&oRLQ_rkM$?}md?({o`Gevm(o`)5pLf(^7Lq0}) zH!}E5b!}M@xAyZhB+pe^8ov;$>dcd{#YUBKN(jg#)vpep?yerO%6a%Iw{5b1b}(>u z&i%!iWY^Hm4hET>4H<|J7Y$G|CUQXkUd&;y?33@xqMv)~@+&ooPmq%zthGO^M3o~U zwxIpy#}_Pmc|~72J$|G-A@WAC%~|s^OVQ?Y$Zs`|pU37g_lU*mwM7p+erI>qp6S{19)~*2VYlqQYcXFByKQhj5PA@?iN;uoUJHs^ zEGSn?1`>%6S!S>_&Zd*v&NmM^G%K9=BxgE!Hd_C{-IbbF&pN&-!ZmX1Wb2jE7$|qz|5l<#cgGN^f%wzXul=6jmlUcLB<^~`gPm$*(*20rvCv8i4^%qPcgy&6Y zOQ(xcO1fiaUY#h8wzpYFjI^MT%rLY~8f_iy3+{%@{yQF1FOxQkCu5nNHPWA*Dwl+Y zMBhZuTofGigIqT@xqn1sZj_HnA}_eQT}v5)cye^mV+(=T{5x%<>h))N7*74#Wp|_%}*ydq#-#u@t9>Y%f~m_iHy@0N*MX zlI_&W&(iaHyI{(y$Ub&k_O>sC86Uf7IfA51PHQ&B+tL^y z9WSQl*{&H_p5)#yJW*Yco~g_)#R` zoSCV^WZI#nI)` z4bQvDUc#oUo*w*yRO=eg-OB2Faf=!oQ4pwY8WL9M?Sh)-o_%f*u@XY;morfvN#thp z#Zz>jI$H0ls~ z81Ag02^*lAw*fZdP*P4vqIpfaPCyD)QQk6sYkR3=i&}1J3BeAvP93aUonc;4m=@TQ zLN9fX4y6qi`0MDQoXAJUCF~2wW1S1LlUi-p7MC^sAUx2*BT;3Z38H9vvUxr&(w{1l=sLAMBcMux_;lI{O-e3QFxA z+v$4-r#5DdZQJ{MUoEOT)B5aRrgB*oe1jYR^xQjnRCZm|R=-m#@hz7gxgu(j_B>R! zNOhsH865W#e^a zBnkra+_Ii8K#>#!K$JGn-{)Lh3?JF*@f>!!ibh3`ZalB#Mus_TOx`|9gkoH;lM5am zWkz|{k@dD-*dA`!O4wv4)9UXx71u2S7Eq7N$Ca!KHtie*vU-}v$1g|mrm*{aZLd!) z&0W`wy1%lHEbkkok%c~kHNr*EF@Ak{ZPQNHPYa+ zsVr}>v8_&B-9 zyGffRj{!ggs(H)I34x*q2;^Puyhh&9AT}@4qcTJ6g$87~R zmjV-}<>W$;4$dme<)hC$hLPSvB65Tw=$wI$2ou~6&4O(w$8G5*G7phR6Z4Mo`%c#L z2xMMyfy>(b2DdAFWX0fO67(ao<49jrzjLuY8bBi7(8JPv3+-J7HX&JZ0VUHz=9{B+ zkVTk=j^=zgyoOx@xxZMlY4q8PX-yFk=wYX4vtujwM?>zUZqkh!+Yy9VrdSUrL0*AB zIBKotKWJxvd2qWoo{j9R5Zqv+z}{Iw_PsH3t)$Foxr925Yn>rrtcdNBJ!t0XFN{@@ z09-Rt@-UEmRP)29Vl%wD9$h=Z(7D-mYwP8?#1xG@rOx5$PNfEG$DUqV)z<#fcGHSQ zs`Jkeg)+pyxoyrErT*cQQ)^wPOONmR8r))53N{pXVv(BNN!c@yeR?LZM7V!hYBOS< z@b!s;I$~Sr%@g)1WCyC1KDBAKPJ7JXfB^DCqk7=GJ)aKvkN9t|2rbb!|KVTo$E2bzRaAVxPxEP001-Mu` zZxB7^n1*k#(0;kWR-JU^)BHBtu=2eUJvY0WeVaPGq#!k|Cuw-r+Pb}81CsV6JbW>+ z$k;P{JB22x=fu_%I!*fnlaJ2blVqXdo#_gaXy7fmyp-3M4xkMg;Vb7f3boNsl&-s! zYNN9?;K0_TU6jszmZJeOK=eyPEufPI1>EY?^JcCsE;=RI6`ruQEv*rRKkc1NMS^b- zX;>y)m~+aC9(c42Epov%nTJMfPt2DV&oxf60^G&AreP@5o65Rn;W?OT$!FhA`*CNH z@MV`JokxoB9(Zo$8nMVkaeqIQs-X&hZCnYCT;6J3tUHZzIx;_(hc~$b^q?&Y8?xuq zAP|4JIPa?g+jjZo5+#|MGVxIkZJaPiBL~Oq5Q8CPa!UT1QGEC& ztcxDXFH5)G)!`zmytBxXTOaS+w%e3X&Y9geNqe)1AHE&FVenMW&!< zJ+(7s$zvYg?%S++K?8t2cZU=l9e1KOq%>f5^vGOOn(`_Vd8z^mfxsmCS7A+LpCe33 zw$Pi*TOA~t_Yj{tT_#~uYZ~|P&=0lafE5@^X@vpP>_7`~$X)JsV^zBF?ZiZr#4+3d*LQL0?r^ptn{YB68l1E`VeW!jWjEc1S1Bzzg$ylwLNp78XP3kCBj!$_Mp2@y zon(2Nn{Z8ytH2<5RP4+YjIci(rY%M8rz*TOOvXp zF*In=RW;gJ$watiQUP^nPyz#|Q%%}=)1cDnS80eNhIx|fuh?&B0u8nbYpY{-m6V1v zN=gkhAp;t|x*SUPRrB(!`@;7NJ08?r#@q4O8bCFUr)Vr`Yrbe~I!+GpDdiJ58y>20 zAugMvF&+|&>iu{Eji!sqH2RR{Ixc-C^T`O_u1&=LLi7*>QDq&`?_vRi z6`B|zW8qFAaLl{_QUFaaWgE>mUaPtS6f{ymBB1)`#eC)K&`fD%h&`6_;Kb zPjJm1E@~}F=>$4?m3VpcB56*v!b@7_@8^J=*9oM_@7#X3e&xA(Z|nA&dhhb51cya} z4{PdO%b!f)YAK;mU&NSpk%Nx&`vsIw$1r;n-559|g@#e#C-05V6tn-ED2zHEKB^k3Fx839)&nu~8~5Uzs1hoj2Yy zGHaebYhISHxt0(f*fY)EX-f}*$N^8nr|SX~>6X&O!bC7pOKfr%gnl z^jW;Jo24*|G#ASo^9kdyqBZzdg3@^97BYB!3235T0E&zI)9mol)7VCZpz-T->kCe^ zZvnf-_xD$4N+2-DSqGo4X=0~#Z8`L?($;)Du$WdZWt$IQ8-g9xM76qfRzjzlJ52Nz zgZO5Nm4;TT;vIUzdy@JiH2sTCBqeDJ_09NI4O-jw_>SSLiFFOJntuy5HatZX2_VEM z#zBY;&CaZ;KLHKt-?ZjR50q{&+tMV#*gHB*ITsDP;Vayl8*3o2$=^d&?oL9s*4#C_ zN-LXYO*QRI&~}!^DI3#0Nj(M=Y2CJIX=$m`xrK%FRf~m?)B&1UC`X(gNYzQs8rWuC!r~_+}F>mLpj8 z$r-S$WcgPy>WM$@!kxR|V790yeKeq)OM59)S6Z9#f+*_qn54?%r@=vOgp08O&%tHN zOP};Q`p6mZ`xMaonW41t2Lr0O?h~CjM=lDQ0iZbbMu+Kw=vSYA%Hc?ve06#G7n7+x zw%eLp*dWE4V7?P0^ESD5uBPq7u8m#BA~U3;?>KpZ^&R<;KFL>8#b+GyW&NdVeexk= zJ+M=;I!VCbv0bF=SKY1S%cn_Bd)H{c;;@(Ij8A`Y^pu94Kyl-ajiyPy&Ql5}ord1Y zUkxPCI%tjm37k-{#Ys$lV<!Q9m-D@1l6$C1=ZML{+iwiv-Z?N5uEXzez3vi#b6Z!QjCeLRg5bgv<6EcZ^mB^H{(DZGc3!M49ydGU8E)BkE^tdaNB0{Gp^|3-~} zrbX6EjALQ?5dg5U;*w}U3MW1|=AQzEL6p9=Za%lx3nBe4fII`>Rm` z2~U-DUH3W+dfw4fUrSnygYIGjv5sM&4@rTN_`Vf(*2C;&R|*DyU@|LFIr#j1hj z-YNOOxYtPX`&?j~?lQ9O``?X+zuQxQ|3-~}tp)INN}8?*Q-@t7#$I2S$AnczkujNZe>hUY_9w%WibBgQdnOZvc?B~bCzA&{+Sy8S_=SE5`sBnFEy|^18c9HoFR6% z#HFN(GX%Zw6h&4AZH8AUGtUv?BIih^3|^3)$siR&@eYJq}w9uXWFNc4U_b#lANspKNPX4G- zydF^}?N@m_R7BTu>q6t}obTnbj)Dn{HI{a0~yoF1`c7o~t- z#s^^JEjMB0?PI`>PkIxSheQ7B@VFmhhDTrw%A-EDBd={FtW5c7DAU+enF^tdu)CjS z8YmmD7J<6BKI9a>!$(f;UGdUHC;n>Gxn8fQ%J=*}i`5?q_woSx+N1|HvO(jh`S7%I zdW4f_Tt7dls4FlQRyMdx-l6Llc?b0|@))r4#N!o885JH#xaoTF-#cZFU8JA<3%Y}^el|J82J8#szQ7*qnYC9LmT;zFeVuPa882rkE+oHHz0In!S9ULaHz* zZ0rXc@Rg7IP9|eJI13=3o+Ky&iy^Lo7Y3l^e{nvr$1`A$I-nDPx4v6B;CCzU3=hM+ zGdx{z(ztg|8c^dW54P>j42uG%E?WHFjl4^(P7;YVeg_&TEGy33i~1~mekNX5(&o)8 za2A3aR={~aaACI^|5^*+zft3x?_tcf<9p)qGNp{%{}UPj78|?xu-Lc?&cbeJocbLa z$M=8+>25238y<%F2Q=EAgZ{r88<@6VvGE-mPkx7n!5+}~H(CJLz})rX|ER`pEp~hl zG}kw1bb~%GwFfkSJ+QHh4+D*yJ)ofi8gn-^Fac^8G}^!@v-j{Y%)k$9T=;#~Fl~23 z!(b0+1n&WjKhpwu@t>&iw_5CkWlTTcprKyMXuSgs;D4o!uYBLwu+Wg$0~(CKLqlK> zXwdC4GVncZV7Pz6#vW+{({?vB{C`9J;04LA>SjyFlyu3|QG$`+)w!RnvPW3Hw8v!Zl7?9* zJ^1dTz>k#;&F_<@&y6t+=Ee_XVA}3V&8PRsRW)F8*&X&U1KyRvftP#aG|Y&10S(*5 zPwSd*s|Wm8++vu2%mvpTM#ePVWxO}8zelO#J1zkHvbg=% zYW!<00G)WG-(G59!xY9|-!izsnBb@De-x#5vtfM2cMo7(18oWH%HaB^e-Be!f0e

p#o9eHQ|R^E4U#(yRbXl45|d9!~e?@oZ;GuzWf zzeK8HM&o#lF6}EA4R>mnL-z4@5@otx!1ucO4ris{C$MC;lTeYt4hdUvPKN%8JgP9o z-z!}(VTAXAx#L3kyD-roG2_>Q7yvg4eyxbVuloOeLHxUJ&mL z4^ut=$baqM(i*U{X@gx>W3~=0KWw02NHi+*Y8&2ue8{iv>$7)7y9Az*MBZ_0WS|sjM{U3`!gTNhFJvt z#|3dpJb>9*!j#WHu#xi(8$X;1yLGS|8esXp8yYHmK;!SV0KRW|{U7T39V`D&Exu0L zPtdSI0)B0~D%~I0_!Szv*f7xe4+>)7>#i|&#f(iGnDY6jw1KJhcR|B?kF}h@9?-zl zxVxdTTMOX7QR81|u`_7^W&`0{+JMbp-&N`U6*P9SVWIJ_3SwYqJNT!H_*+4|Gd@iD z`~w<@J)nVUx*Hl`^}ZV#m=bq))&R8tcJJZ;M|J(5Y5{;J7C-skPuO_nB!Q`>|KMcf zdolT=mc&%QyVw1@q+xn}c?$U5NB1bO-?V?L+J7M9zbTx7@8>CdRL=i+H{qXeCIG+h zChS(0D(ukjCE{O1sl6)6zb%M?AE!NEE8_oI5M!ehhWW=_U~BzdQ3_K_?@r*D>iyTX zEkK8@ad(BOf2_v8)&lrnYV3po%m%{OC^Z>6e|=Y_`&UtF7aPWhcNfF}=CtRRiuj)u z#5=>oRL?)66sFey3AR{xV|EU9MJY_#%LVK@X~fjHyTjBUsPV700CsjC|5S|~-}@e= zYNV$-yZo%S$pX*u{G`asbGf`l=fduRid?F+Ik|JPnk00mm{I!|?;E1i2ROOG%PH~L zDs$)Hyb&x!DSj6B3M{^Pu;rt$+d1RB|3~s3sElGx zwSQT%{M8XGmJRrERQt6e{yAvO^0&h10bzPrFQOFz0e~&!WdA@3ARtogz*j2hVdxT4 zzdT-mwsTywvPCa$l)!;?v#k}YwZ#x6fAr>(cI!fs{+8h4ToY^nqA9!ue)XRW+DkhC zC-a9EZ>*TvqRoJ{m9^GRXk_J9!f-jFb!)Q88Z`h*8$d5it(wl4%|cxGI)`l&nzoQz z-~bk21Mnh8^tRn*`8=QkEUrO?fmLd_`e=ASM3@%*@-SS=3EFN`s9;kFN5Z#-kmyBtKXhvu4Qz}~ z!r0M^J=Em~G-LWp%M914T-L8_txW7|l&}_9FKR_YyM~j(H=7`^C^+to=@?YqLJ>g2 zK5q{^s~7GCEY{GAiztFZl<4~U_W)#bUe z;hEj#d2H)y;mlS1t*aX|SFdedm3Fa6L->;?BtcArV5V^pvq%VF76&tngqg)b%p)P@ zaWL~pn0Xw;A`)T|2eXKTS;RpsBO#V?Fw01oWy&{tVViz>ymw?=?T=~i1cv_yeRhIm zE20M#aRS)+^S4wLdl#fdC=!qgnkOZ}EJI-0e?yrYZ$ih}pyje4MHh8Xj`xm__kz?L zqQ1euhNQ9iMuDF{eEolj1YtS1%sGRw#akk1HgOTM;rYPfA=G z&p^vHpn3r?Z48UvTiEh*SWHWkeKnf?_*R4`ip1BY(LMi2-1qBE%@gB7BYF>4Ea{gx zxquCRG9(SiDPjI(gWn%HP<{nEei1spzt_02$-cSCz8*^{*Ax+!^vjm?V5?p9ecyN| z@(S6PLo3s$Hxg!K8`dsujQPY{0?=vlpg>f*#LYVz;|aoUua{J^ac?SUjE@VuWiAOo z7s%U!I+1{v|Cb7Jf)gLSyq{Sgys>rGe14mo&$8t;+r@Vfrny1*wb7e4=gej@WlHeJ z**4n@%@#6mmEbe83$`1Ytz;^c;OntFQnC1CD#z5GEuuQ>8)T#u&7=5QQz4p9F~=zL z%Zzwc;${0}vAV>|&dFj;iI-iI#aa_DdnAi>CSLYR2E=+2FZ(8o4J2NEkt{ZxcsVFp zY&`LDShCo3;^oNX;{}Y-)?yLDZv%rSG^ox71wGWHdK(lpp-FW%IOw4k)!X2p2`#F# zAwdtdsosVJO=we{4GnsDkLqox0&63EV0~f$>!ITb6mA%Fk zT?>`H<`i9lGG(t-Mb}zouWj(R2b8_=m0Y`(y$&h44k>#bRdSuOx6kUBiEZXN+eqKm zB)L*TMA zl%MKUbss=H;*|@u-Lj}}n$U z4#|~jqQDMGt{S4Y4uimPyhaxc(Xgr{3hb23t|V&flw7GKqWmn$^^r*av!vBWqQK88 zfxt(iw$CcrABiZtRNBBBT`DW!jV=|+Dx&Nz6|O3xwk{RRYX?ZDniecTyLw^1s_x~zCd4>bU7tOhZ?UW_o#X{{vS}_e=-I8BVq`y zdP{7+@2acXY{q@PL=Ihl{+7>iCHk#X8=3HV7RcIFGM`$B?dGeoOBv9WFK?Yz$b^Mh z3Lla>7+?4w6!;US|A#!lAB^$;VfUoKE)&rslCPwth~H1yMJr=r+!HxD6FGlKeX*SX zn*tL#|C{MI9#ZU;|AGRT?*EM-Ck0T)upbKiAnepGG*c5`=ObZ zJC8;!)mj1`jb^E}v_2YLR%rFX&G>SfvDgj;e*W%H%!hz|)NUk8r{Bk&d|kvF z-I@FMbZMR%6gDvjPTcP_5_|nG>BCX5Rpd7cfFJq{?GwLzqHU>FZ8j9NZ#av+ec^BD zL=WaJma1Qnqlzf`>B7$CKc>J}Ie*;XpYs>zQm%B%YN!)A7&C9!5Q8*L6r7NN&KPiR z04k-|ZdoCnuU`{uj<&y@_@rbn%u=|npz-1v8xYj_ri@stvMW|fOMJkjMLhkrY2L)8 zyDfRDR;QBxz0NK{oAg${>j8l@! zt|3ksQQ|~*3Y3YI6vc4nJjQUc;<*AKt4TY^dIH4YjCkG@cpaq8QbJxP?J?B$6n%+T z*_TfjDtKy4+^|YIRMHkOp-AVD!Q7G}ux=qYG&4vn;*}-Ajs#f<9E{ojDFyy%gCG1U z_B^^&O!#5PejGX(ms&#bdad2qOhQ8o1CvvWVLtar~#5CH2JyR9b-|#^mPDw|# z37$jBi#{TdxrhpEXTu7Lm{A0!b)|rULC&v?V0Z4=?yg|ELtwjez;-8$?T#MX9T~Pe z0_^DaWVfqN$K0&~NF2e&-#-2PLH9GJA?FO(&(Otkj97Z?hu1o*m`*QY+C2=zbSi{p zt+@XL^MR`a!+P8hGXmcnOdlV+F@o;TVg{UnZF?8nHW|YX{6qe~VE@|rN;jr+O8; zD=R9v4znj6QudeF94_g2q#^iJ!|-w%omd(-w$XpU4*b6r|39T;^8f!&lr3c?`QB5h zBj$f6^s#0`fB<>u5@^gN;Rm2$M~bRJBU8>Z;x=lO24I=kX}~!_np~PNb_C5n;ftjy zSlWQ4vsg;%gt>bGOJy*0!Pu#ytDJXC+GzdEry^SW3f(i>zAfB`$}vm zOa7Vye}DTwy1V|#5a&JpN^ z@`O##1kdTB1c-)np~%*`ZHqNn6%=JA;H4=CLBQ4$$Q zdTrE~;hFVgstPwY8@UpnD0RfAJRp$kk?E*L$(qRLI-$4E7$(3Ls{nM~q~7)*M9x3sAakn*tF7vGjJbQ_SQqz3y<8!3ksBG z1DbQ*Ze+GD`uSc8SLEqoetnLOhTFsRKu>mIKVjEb7)%^ZsKtY|%J#*ftLFe6B#f2#DGrjxga~z^?nlbRwd*HKV z%_=RXeU`kHO>EC@P19M)9)D)M6OUPRnKpA!_6uuaD+i1y13&$UZs zfstdE@o1CG>lmeTaVCP3mzgu*Hrs7AL0c^sFLoXERuO(Z7=8Vf{RgicTK&fgWLwEv z1^bsiO%_TtZ{`lhcYfxZN@yH`Zl|NNHjk|f#tbZwXgIAEaUiO9}&PTo`%Chy|e zr1lYY`TG|4#9Kd#nb6Y_Czf^sDewC7CJGHnN3VSm^AoO&e^LXNww4VuBn1;PS0Awl0o(PRf zCz@$;BI1Hd;yIsnRUC=bhg~w<;88L$Hk7&HIwX;JF=F^GOxPQmZF8|Q_L*!-nP?sp4T}VpV)hu+EZ2B$*Zi!O9Kz) z=K1nNP;DD-W__6LaeDi~VVn4$99Y%SI|Rl2+oaAuLO`RfwG^ zc$DG2iX0NW9A>c%>Br`|4arZ4kMSE7JWy4$czvC~v5PZSG=)mQh``C6_c=~=(>u!j z4B~D`uQQG@l6Z{A(w>T$b}>P(iS2X0petT@i5+PkHJtt&xvw%(`Wg`(0Hp|YV@nxd zH;;^rd&7lPS3Bm32o$aKudjEMR#F(yUL%pZKXrFR>_JrD7ga<-r*SlgTXFfmlw!uw39@*(~CSt)#; zg*Zr)ReLJqrC#?^aoU0-dBD)UI3ofQwK2LVPH)eYWy`@9h||e-zKF9VGX&~qPSBk= zO&=*&xOK%=RXZ-?^C@2{p(>n{H^bYv z?l>Ye$qDEC9+?hz z$XMwbZHP`YyCLe=+1fu|kZ}PX%H<`P9dxbpTYaf!$)GuKfP-1XhSIFpp-e=aGtp4i zXDYg3SSCM*O+xU{MC^VMeM#+2eBM3}bz9#@^NHCx`R5cK1q)~vj>+aldAcZtd#dc~ z*Elsl^+*CYcGWS{`xfbWE+(h#S4VIib5g4$8*$ z4aaK+%{du4v8EoiSUc-uz$6PquxGzC%Iw7}D(@H|G_38HAYdwNGvUh+Agdvma*rIW zT7H}&k>Gwc#R!Qf6LAQ5N$j5XG3BuIiL1;pW(;=po9--97mu+fnq7A{$DvhJfv6wR zzOxT`t3-dQ`Fw4mf(-xjFm^6MxOVkubedUo@U^20G%RxP1g>2f zs`3#+rzv=ve|RX_g&Tr@Ts_fI;bqp#Q^Kz<@N8bCaBM~-BwQmaWUI&Z3OMosss3yr zJn{?kgs23bO%!fq0PNl4`uT8Rl2-DFne=!?b)Blq8$FRg*Pb>L_k%XV$2eY$ZL+`K zx5Ox{sgv4o!F;(gF_S)+P>|WB0f@~03QZp`yq+Y zRR-^bKG_fa)SM1>cAxj-j>RTkOg_yjZNfS8dM5Avl8bmSvq;Pap-TuAd~2gdnFFnS zKca|mtqT^N#S7KA8O`7F=CO#_yGL!ulE_dGKhfv*zMl$6ptW@RQf1Shnvj1aGM?MN zP*nc?q{Zl{3qw}idviVBG#sGHeUb<<-QNcJf1ymGB+jPuMx~& zVaW7HJv=-re(Zp#8W|gfd6f4_erW<>m#K_%qzH80Mbp9{bVV3 zg*{>!S!frB3+!$uEM0i@#F;dy=1|+5fZ^ts@t345t`)8992|x|_iN0oQ#s;M2WRRJ zx4%3w9aFX3xZtvR;C_tgaIv@!W$Oc04yCNo%B3yR!sAhYO1rc7+||L+lC~aVB$We0xk-mK-+T47oIO884Z!A`BQpoUKTxN zz8LCHy>v4A{vr>>bivzJF@gFk=i8i3YHu6Mul6Ls#XoRxIrg5lDW|xp5O+6Z?9}Ea zJ8XNUQ?p+oP-<*Q7 zNxjpaih^oeoA-q-UrJO7FLaVLC3JZ({q`yaV=nAcZw&c){F|~Dyp66ObRFQSQKt;= zSjpy_aC{OtW5?HD-m%Y{rkV)PFQ$L(gxj!0zQ|fU?wwBb4dJpPt+)+9_>FcB8?F@9 zMC8-$*?puM+xqQg9<%<`E_bt(-eX2TX`Rc*h~ zVbV(cBBW6WWqL^hq|)`s;V!oYqhH+ zM6?W=+;ICMAul-*X=3P*^wK+(L%w4!97l)Dt@+*N{EwEDbptA`{!6EZ>TAsF?J;p&nLfi7s8o0?ZN2@m>EYQC5MJ3 z49A4=->7~_ON~sf>@H`#vN(Jpi>=I!n&;KrI$z0i@Q2H|jr}jYq4Oe8GtxrRxc7Tr z3@d&V;axcsq`yAfIQn|Vs>v@@&z_iZ`fTNe-W|OLTNVoRc z_^qSw3aLpvGIY$-E~LKPP6G(zhO9hfugc$`%S^jrh6?o-huEgn9@gRrJS-DwKr)(s zF-p(i;N^k9YEJbCxiRh_apsHlhdXE@DfI0=+@uc&-|4KT@;*X+zDX8O*k$zz()IXQ=!aM7oKKxQMh3?zQ>Ckf5@!BhHr|)^P+rV?KbzMNk zq&}y*`^=9Kd9$vrXB2^_TTX6V@tk;4mh@J|vL0@DrG9TtyytAS38}hURLpJLTgOhg z1I=3{%R*t|9D&m!I>z+5YC!9;yQNN-s<`AIS2R5rcfNxffRqq*3r=1|ZQfHjO)G0; zkXAUnQq5>2n1QB$5Lt4*4&@evTFu~FJiAQu@m#JXZDz*7UYFS>m>h>j)0xJ|VhS-idmYFeTW_HZX95XXxOo~ZnW{6{%nVFfHnVFd#e}3LQ zyL-N!A2T{vt?C)gNL_VrRksV-B{^%L#(AWFyW>FZ%;CRm7EM;cbsK>g-(%`2#| z1mb6zp9>)bX!j(e&YII)`at~=59h^*5lt7hkF09E`z4&y-bb5xQ zs9)VOYkbl1^K%bGAQ4I<$2>Mw5bOG2Tsau1c>UMal|XuR^$uT1q`_W(9dn@WUtCwn zvFDR=r2zRiBDq`Pww?Mze5>>)Y^3`N59OS6kFe(Vl5e|yY}3($y+In7I?@;ANcmNN zXUSds)gHUzRR-xrn@`s_A{RE5LRVmJT22`#iBS^ym zuLGNB;}@w3^)lrrU;5Xb7(v%N#A7k+c_D%ETTj=Z!&*k^A8(<(r%+?s(h|US=dobt5h6DT`S5_sG+s!7vF9TdL$nT22nC&<&@%VkY1<^CCL5d=&iswv{ZRtwNgS3Y z9RG$0#U-@<(O8`HG!Lf}2Bem)^gYZG6NdED`loh|&fL}GBKcT#sKL3xp;eC?8Fn)q ze1M=ex%J-E5=SyAo~w`B#u}js&wFY-6m1DcHv9>UWTE|>>G#f5P{(Xl57y`X-}_Cx z3R5e0#+Q3=|6mg5U*>+mCYv-c#|?=tJ~rX&P_yTPex%Ty(; zSZXYC*X7x9xlErvGe+@7Woz=ukvTQT`SCJ|^tV}!!5_~^k(aI8u&0wi1{H;RTm;$6 zM}mzl5yF`PfGo9V@JE>$Ti=1aWV$y&>=t=qJfj&1vWKLv3#OHdEA`fid;>Sb5Xk3PWOlw zLM>o>U0zlx!IHhm?Tfb53;qolR+o=@6c#$Fg= zv2%0aMIyIrkNCkU(W@E7b0FHNx|L3*blQBjr+@LC7sTteKU-C=bfh1 zChwFC%rc2_3|%p??R79c!tK})XuFiDf#+7Vb>B_yXT&{Mi*JMf>YQ=^lD`8m;D&2o z7JKpi6KDxFzB%auo;FtgrTl|jZs=8}h*+nGh3P2%_sxGr;E5(@bwptf0k4eB7)B0F zi=1|8TNRr(!dte3qkup#!d66qo+bZg?4nfoLMJ=G0h?Su9_jkKWYU@58S{4p!T_H) zdg&}eB)6K!t??v{Z*~>w3TifCPMa;VVK4eMGt+`lbyoN7z=5Aw{aVdN&Ja^aGDszK z6#5F0QyC3c+T~+pHD$~=_Uy3x6sX#MW%fW}%?`jDwJkf64lZH^cU&*-AywS1iOZY@ zEIGCy!tT&pkC@1w{^9fHy`q}-#tBZw^1EpPyqo7WOaPHkym*!EA*YS5W5?|6 zxIW!$jcHK}@IC&{ODk8B6>WCfWI@-KpoC$9a{PUM{!cOzOsmC4k4CwAY35&B=Vf#8 z`|qWf{;bjfQlXMOBK)~u5Llbze@URf^ip!2pdo?VpTc0;umo(&%gRAITXx)unp&MG zp~GjhjuUXfe?YFEUc_tvyqX$i`-kF; zHefg%$El8VDfZr?II=v+-dvH&^~@6yBa9j&oSV9|g$7Vs)v|jaL`W$1jHWP%KPoaC zLDJ%V<%8I9!5wxmn+Bb}paYpR|Tf;okRU(jK` zNlMU245V+ZSqfO~sVu{HvZ8y!+O+XIaQbRjP!-jS+rB^BeTyGP;&kDUkO^{QEClY0 z6(s~!3=BegvZC;GT^<~n(1nXnyK;F9jx69qmlfmdU-417_(>Fu{M34p3|&3TVI}G} z&yZ-Ak{lJiQkPTl>!J2Quc9A;pXwDSB`V;Q7kPh2A3RslPfp)0PaGj(kwff@^TrF?IZ)U zT1ee)cQTQ8aJ^xZ9`U^4Vt?_f-j%G>U&Np=^m9FZiqtPh1faUa->>9n_D#lw5#~?Y z`-1XI9H20H%r}hz$S`lVJ!fG+!cIiHhL4;F(eM#SlX|x@W!_(z=3G@X%8#BPwt~6Y z@1XQUwBBzs$KprvsACh9R(?=&M$r$TU?U^=_a8mAX!X_ z)ne5R^5EiF=2(d}qnboe@`DjmeB_LG25BC!US&+Qzhh_o$t!Fzr55klRK`)gukr;1 zE3=6Ec#i+F&HFZ*p@fFBkjz9OWJ)dBv6#}t8n9pT^KNQ}a5yF0kUBz>fK-^75??ef z8=M=SUKZDET7)j>E?d+C#6rM_OrNWz0tIXjKAOzM&(_PwY zX^3ouz}XUH|5=MPabfBE8g_h2q3hRope~)SIy^fZxxpgzu5OMad z$ypQI-sz~n*K0Jfb}t^x|L6+wq{kcgTbEUBB`Y8-Ysbxow)$MNhx0%opLRu$b#5Rl zC*zn8*;#>tx}(mD%Njy&XC+*n?$qZrulzk%yY5S*%I$C9NppQ_TZ%1=pRM&meeD-i zf@bBO3fy=&nouP5vIG*w-}rPhLaxI~{V&ZyO=ewH;#N5IwYzL6mozfC*)-qy-J1DrXqv9;DwnYmqBpDsDY#Ojs>Xp1UTuE2 z)EV(Ku-*`86s0jFqG3$qRT@-0N`)bA3F#Jh(%WWAE%zSow>M}J9T;{JLYId4v?Zex zVX#jjxlShyiJXFDR%o!{U*?+YrgzuiV*T%mb&UB=v-^;diFmL5C+z4987Itw!6Qb* zFQfgtoIXveKqasX!6fp@8v$BSL-4ww{oX)tuffxkB9#DizDQ{Uv0F26Y z(WAb+4ImJ`gj#XXy$IG z#tRylKtOjS@^L8YJ1)M7am1Ce#$7og#fc@P;@&av0=@k6?P%=+cXHy^3hLL%7h~$j zOjm_1ml+@74R~9F3wWaE{W*A(cMh7~w|Fq?ozLwRyyv!}7o3Z+3*>?l2M0B@X-7J= z+(JQjrX>KK3J-fO5*%U(9-a#M+SD^kn)VmiK!i)neyJ0qoX@j*=c&N8S}XngZD@IM z)t6Eh08$^rlffw0PtZ*Ucirk%dq2?o^6W@1X|Q&lW?V_`A$&4U*H^o0ld{KxLmXLc zJyQ%wkz>!lS|jf9dM)7M5Hy{HH|VZSU$Bk_RtokQKA%dUpZuV$NA@C^(h*nYkSg_Pi6UNTAi%XH|>x z

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 Bb724g delta 105467 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�CE#PWn7j`td>-h1c4^JcM1NWh) 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 diff --git a/workbooks/alz_checklist.en_network_counters.json b/workbooks/alz_checklist.en_network_counters.json index 46f7d9e72..a20a4be38 100644 --- a/workbooks/alz_checklist.en_network_counters.json +++ b/workbooks/alz_checklist.en_network_counters.json @@ -777,7 +777,7 @@ "criteriaContext": { "operator": "Default", "resultValType": "expression", - "resultVal": "{Query0Stats:$.Success}+{Query1Stats:$.Success}+{Query2Stats:$.Success}+{Query3Stats:$.Success}" + "resultVal": "{Query14Stats:$.Success}+{Query15Stats:$.Success}+{Query16Stats:$.Success}+{Query17Stats:$.Success}+{Query18Stats:$.Success}" } } ] @@ -796,7 +796,7 @@ "criteriaContext": { "operator": "Default", "resultValType": "expression", - "resultVal": "{Query0Stats:$.Total}+{Query1Stats:$.Total}+{Query2Stats:$.Total}+{Query3Stats:$.Total}" + "resultVal": "{Query14Stats:$.Total}+{Query15Stats:$.Total}+{Query16Stats:$.Total}+{Query17Stats:$.Total}+{Query18Stats:$.Total}" } } ] @@ -834,7 +834,7 @@ "criteriaContext": { "operator": "Default", "resultValType": "expression", - "resultVal": "{Query24Stats:$.Success}" + "resultVal": "{Query4Stats:$.Success}+{Query5Stats:$.Success}" } } ] @@ -853,7 +853,7 @@ "criteriaContext": { "operator": "Default", "resultValType": "expression", - "resultVal": "{Query24Stats:$.Total}" + "resultVal": "{Query4Stats:$.Total}+{Query5Stats:$.Total}" } } ] @@ -891,7 +891,7 @@ "criteriaContext": { "operator": "Default", "resultValType": "expression", - "resultVal": "{Query6Stats:$.Success}" + "resultVal": "{Query0Stats:$.Success}+{Query1Stats:$.Success}+{Query2Stats:$.Success}+{Query3Stats:$.Success}" } } ] @@ -910,7 +910,7 @@ "criteriaContext": { "operator": "Default", "resultValType": "expression", - "resultVal": "{Query6Stats:$.Total}" + "resultVal": "{Query0Stats:$.Total}+{Query1Stats:$.Total}+{Query2Stats:$.Total}+{Query3Stats:$.Total}" } } ] @@ -948,7 +948,7 @@ "criteriaContext": { "operator": "Default", "resultValType": "expression", - "resultVal": "{Query14Stats:$.Success}+{Query15Stats:$.Success}+{Query16Stats:$.Success}+{Query17Stats:$.Success}+{Query18Stats:$.Success}" + "resultVal": "{Query19Stats:$.Success}+{Query21Stats:$.Success}+{Query22Stats:$.Success}+{Query23Stats:$.Success}" } } ] @@ -967,7 +967,7 @@ "criteriaContext": { "operator": "Default", "resultValType": "expression", - "resultVal": "{Query14Stats:$.Total}+{Query15Stats:$.Total}+{Query16Stats:$.Total}+{Query17Stats:$.Total}+{Query18Stats:$.Total}" + "resultVal": "{Query19Stats:$.Total}+{Query21Stats:$.Total}+{Query22Stats:$.Total}+{Query23Stats:$.Total}" } } ] @@ -1005,7 +1005,7 @@ "criteriaContext": { "operator": "Default", "resultValType": "expression", - "resultVal": "{Query7Stats:$.Success}+{Query8Stats:$.Success}+{Query9Stats:$.Success}+{Query10Stats:$.Success}+{Query11Stats:$.Success}+{Query12Stats:$.Success}+{Query13Stats:$.Success}" + "resultVal": "{Query24Stats:$.Success}" } } ] @@ -1024,7 +1024,7 @@ "criteriaContext": { "operator": "Default", "resultValType": "expression", - "resultVal": "{Query7Stats:$.Total}+{Query8Stats:$.Total}+{Query9Stats:$.Total}+{Query10Stats:$.Total}+{Query11Stats:$.Total}+{Query12Stats:$.Total}+{Query13Stats:$.Total}" + "resultVal": "{Query24Stats:$.Total}" } } ] @@ -1062,7 +1062,7 @@ "criteriaContext": { "operator": "Default", "resultValType": "expression", - "resultVal": "{Query19Stats:$.Success}+{Query21Stats:$.Success}+{Query22Stats:$.Success}+{Query23Stats:$.Success}" + "resultVal": "{Query7Stats:$.Success}+{Query8Stats:$.Success}+{Query9Stats:$.Success}+{Query10Stats:$.Success}+{Query11Stats:$.Success}+{Query12Stats:$.Success}+{Query13Stats:$.Success}" } } ] @@ -1081,7 +1081,7 @@ "criteriaContext": { "operator": "Default", "resultValType": "expression", - "resultVal": "{Query19Stats:$.Total}+{Query21Stats:$.Total}+{Query22Stats:$.Total}+{Query23Stats:$.Total}" + "resultVal": "{Query7Stats:$.Total}+{Query8Stats:$.Total}+{Query9Stats:$.Total}+{Query10Stats:$.Total}+{Query11Stats:$.Total}+{Query12Stats:$.Total}+{Query13Stats:$.Total}" } } ] @@ -1119,7 +1119,7 @@ "criteriaContext": { "operator": "Default", "resultValType": "expression", - "resultVal": "{Query4Stats:$.Success}+{Query5Stats:$.Success}" + "resultVal": "{Query6Stats:$.Success}" } } ] @@ -1138,7 +1138,7 @@ "criteriaContext": { "operator": "Default", "resultValType": "expression", - "resultVal": "{Query4Stats:$.Total}+{Query5Stats:$.Total}" + "resultVal": "{Query6Stats:$.Total}" } } ] @@ -1233,7 +1233,7 @@ "criteriaContext": { "operator": "Default", "resultValType": "expression", - "resultVal": "{Query0Stats:$.Total}+{Query1Stats:$.Total}+{Query2Stats:$.Total}+{Query3Stats:$.Total}+{Query24Stats:$.Total}+{Query6Stats:$.Total}+{Query14Stats:$.Total}+{Query15Stats:$.Total}+{Query16Stats:$.Total}+{Query17Stats:$.Total}+{Query18Stats:$.Total}+{Query7Stats:$.Total}+{Query8Stats:$.Total}+{Query9Stats:$.Total}+{Query10Stats:$.Total}+{Query11Stats:$.Total}+{Query12Stats:$.Total}+{Query13Stats:$.Total}+{Query19Stats:$.Total}+{Query21Stats:$.Total}+{Query22Stats:$.Total}+{Query23Stats:$.Total}+{Query4Stats:$.Total}+{Query5Stats:$.Total}+{Query20Stats:$.Total}" + "resultVal": "{Query14Stats:$.Total}+{Query15Stats:$.Total}+{Query16Stats:$.Total}+{Query17Stats:$.Total}+{Query18Stats:$.Total}+{Query4Stats:$.Total}+{Query5Stats:$.Total}+{Query0Stats:$.Total}+{Query1Stats:$.Total}+{Query2Stats:$.Total}+{Query3Stats:$.Total}+{Query19Stats:$.Total}+{Query21Stats:$.Total}+{Query22Stats:$.Total}+{Query23Stats:$.Total}+{Query24Stats:$.Total}+{Query7Stats:$.Total}+{Query8Stats:$.Total}+{Query9Stats:$.Total}+{Query10Stats:$.Total}+{Query11Stats:$.Total}+{Query12Stats:$.Total}+{Query13Stats:$.Total}+{Query6Stats:$.Total}+{Query20Stats:$.Total}" } } ] @@ -1252,7 +1252,7 @@ "criteriaContext": { "operator": "Default", "resultValType": "expression", - "resultVal": "{Query0Stats:$.Success}+{Query1Stats:$.Success}+{Query2Stats:$.Success}+{Query3Stats:$.Success}+{Query24Stats:$.Success}+{Query6Stats:$.Success}+{Query14Stats:$.Success}+{Query15Stats:$.Success}+{Query16Stats:$.Success}+{Query17Stats:$.Success}+{Query18Stats:$.Success}+{Query7Stats:$.Success}+{Query8Stats:$.Success}+{Query9Stats:$.Success}+{Query10Stats:$.Success}+{Query11Stats:$.Success}+{Query12Stats:$.Success}+{Query13Stats:$.Success}+{Query19Stats:$.Success}+{Query21Stats:$.Success}+{Query22Stats:$.Success}+{Query23Stats:$.Success}+{Query4Stats:$.Success}+{Query5Stats:$.Success}+{Query20Stats:$.Success}" + "resultVal": "{Query14Stats:$.Success}+{Query15Stats:$.Success}+{Query16Stats:$.Success}+{Query17Stats:$.Success}+{Query18Stats:$.Success}+{Query4Stats:$.Success}+{Query5Stats:$.Success}+{Query0Stats:$.Success}+{Query1Stats:$.Success}+{Query2Stats:$.Success}+{Query3Stats:$.Success}+{Query19Stats:$.Success}+{Query21Stats:$.Success}+{Query22Stats:$.Success}+{Query23Stats:$.Success}+{Query24Stats:$.Success}+{Query7Stats:$.Success}+{Query8Stats:$.Success}+{Query9Stats:$.Success}+{Query10Stats:$.Success}+{Query11Stats:$.Success}+{Query12Stats:$.Success}+{Query13Stats:$.Success}+{Query6Stats:$.Success}+{Query20Stats:$.Success}" } } ] @@ -1326,70 +1326,70 @@ "style": "tabs", "links": [ { - "id": "f75f8d7f-5d09-4f91-a404-46927ad56971", + "id": "02aa6311-8ba2-43ea-a75d-eb15de71b18a", "cellValue": "VisibleTab", "linkTarget": "parameter", - "linkLabel": "Hub and spoke ({Tab0Success:value}/{Tab0Total:value})", + "linkLabel": "Firewall ({Tab0Success:value}/{Tab0Total:value})", "subTarget": "tab0", - "preText": "Hub and spoke", + "preText": "Firewall", "style": "primary" }, { - "id": "3bfd864a-a233-4879-a2e0-cf93a2314784", + "id": "595adca4-994f-4ce4-85c4-0858ce5f7fae", "cellValue": "VisibleTab", "linkTarget": "parameter", - "linkLabel": "Virtual WAN ({Tab1Success:value}/{Tab1Total:value})", + "linkLabel": "IP plan ({Tab1Success:value}/{Tab1Total:value})", "subTarget": "tab1", - "preText": "Virtual WAN", + "preText": "IP plan", "style": "primary" }, { - "id": "5066dfc2-29a4-4cd6-bc73-c42375f5202e", + "id": "b35d7a26-c224-469d-a743-16ed3848552b", "cellValue": "VisibleTab", "linkTarget": "parameter", - "linkLabel": "Internet ({Tab2Success:value}/{Tab2Total:value})", + "linkLabel": "Hub and spoke ({Tab2Success:value}/{Tab2Total:value})", "subTarget": "tab2", - "preText": "Internet", + "preText": "Hub and spoke", "style": "primary" }, { - "id": "d5f37c45-5b55-4f28-b2f5-a8875ca0ae3e", + "id": "2682b5dc-9340-44c9-829b-dface0f1c611", "cellValue": "VisibleTab", "linkTarget": "parameter", - "linkLabel": "Firewall ({Tab3Success:value}/{Tab3Total:value})", + "linkLabel": "Segmentation ({Tab3Success:value}/{Tab3Total:value})", "subTarget": "tab3", - "preText": "Firewall", + "preText": "Segmentation", "style": "primary" }, { - "id": "01b600ce-86dc-4e27-a3cb-91233288117f", + "id": "a8fe010a-0e38-4f2d-b893-a22de17ac068", "cellValue": "VisibleTab", "linkTarget": "parameter", - "linkLabel": "Hybrid ({Tab4Success:value}/{Tab4Total:value})", + "linkLabel": "Virtual WAN ({Tab4Success:value}/{Tab4Total:value})", "subTarget": "tab4", - "preText": "Hybrid", + "preText": "Virtual WAN", "style": "primary" }, { - "id": "bdbbe1a8-2d25-4b5a-8c2d-ac374051534a", + "id": "0f9bc02a-8df6-4932-9d48-996c7f099d13", "cellValue": "VisibleTab", "linkTarget": "parameter", - "linkLabel": "Segmentation ({Tab5Success:value}/{Tab5Total:value})", + "linkLabel": "Hybrid ({Tab5Success:value}/{Tab5Total:value})", "subTarget": "tab5", - "preText": "Segmentation", + "preText": "Hybrid", "style": "primary" }, { - "id": "d0c3b52b-e070-4729-8990-1f2cf6464ad8", + "id": "6dfe377f-8cf9-4bdf-8dec-aba2532fead6", "cellValue": "VisibleTab", "linkTarget": "parameter", - "linkLabel": "IP plan ({Tab6Success:value}/{Tab6Total:value})", + "linkLabel": "Internet ({Tab6Success:value}/{Tab6Total:value})", "subTarget": "tab6", - "preText": "IP plan", + "preText": "Internet", "style": "primary" }, { - "id": "13c80d9c-4286-4014-9be5-84d919d27e03", + "id": "147aa5de-4935-4674-8e54-3f524aebac9f", "cellValue": "VisibleTab", "linkTarget": "parameter", "linkLabel": "PaaS ({Tab7Success:value}/{Tab7Total:value})", @@ -1410,22 +1410,22 @@ { "type": 1, "content": { - "json": "## Hub and spoke" + "json": "## Firewall" }, "name": "tab0title" }, { "type": 1, "content": { - "json": "If using Route Server, use a /27 prefix for the Route Server subnet. Check [this link](https://learn.microsoft.com/azure/route-server/quickstart-configure-route-server-portal#create-a-route-server-1) for further information." + "json": "Use application rules to filter outbound traffic on destination host name for supported protocols. Use FQDN-based network rules and Azure Firewall with DNS proxy to filter egress traffic to the Internet over other protocols. Check [this link](https://learn.microsoft.com/azure/firewall/fqdn-filtering-network-rules) for further information.. [This training](https://learn.microsoft.com/learn/paths/secure-networking-infrastructure/) can help to educate yourself on this." }, - "name": "querytext0" + "name": "querytext14" }, { "type": 3, "content": { "version": "KqlItem/1.0", - "query": "resources | where type=='microsoft.network/virtualnetworks' | project id,subnets=properties.subnets | mv-expand subnets | project id, subnetName = subnets.name, subnetPrefix = subnets.properties.addressPrefix | extend subnetPrefixLength = split(subnetPrefix, '/')[1] | where subnetName == 'RouteServerSubnet' | extend compliant = (subnetPrefixLength <= 27) | distinct id, compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed", + "query": "resources | where type=='microsoft.network/firewallpolicies' | extend compliant = (properties.dnsSettings.enableProxy == true) | distinct id,compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed", "size": 4, "queryType": 1, "resourceType": "microsoft.resourcegraph/resources", @@ -1474,20 +1474,20 @@ ] } }, - "name": "query0" + "name": "query14" }, { "type": 1, "content": { - "json": "If you have more than 400 spoke networks in a region, deploy an additional hub to bypass VNet peering limits (500) and the maximum number of prefixes that can be advertised via ExpressRoute (1000). Check [this link](https://learn.microsoft.com/azure/azure-resource-manager/management/azure-subscription-service-limits?toc=/azure/virtual-network/toc.json#azure-resource-manager-virtual-networking-limits) for further information." + "json": "Use Azure Firewall Premium to enable additional security features. Check [this link](https://learn.microsoft.com/azure/firewall/premium-features) for further information.. [This training](https://learn.microsoft.com/training/modules/introduction-azure-firewall/) can help to educate yourself on this." }, - "name": "querytext1" + "name": "querytext15" }, { "type": 3, "content": { "version": "KqlItem/1.0", - "query": "resources | where type == 'microsoft.network/virtualnetworks' | mvexpand properties.virtualNetworkPeerings | summarize peeringcount = count() by id | extend compliant = (peeringcount < 450) | distinct id,compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed", + "query": "resources | where type=='microsoft.network/firewallpolicies' | extend compliant = (properties.sku.tier == 'Premium') | distinct id,compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed", "size": 4, "queryType": 1, "resourceType": "microsoft.resourcegraph/resources", @@ -1536,20 +1536,20 @@ ] } }, - "name": "query1" + "name": "query15" }, { "type": 1, "content": { - "json": "Limit the number of routes per route table to 400. Check [this link](https://learn.microsoft.com/azure/azure-resource-manager/management/azure-subscription-service-limits?toc=/azure/virtual-network/toc.json#azure-resource-manager-virtual-networking-limits) for further information." + "json": "Configure Azure Firewall Threat Intelligence mode to Alert and Deny for additional protection. Check [this link](https://learn.microsoft.com/azure/firewall/premium-features#idps-signature-rules) for further information." }, - "name": "querytext2" + "name": "querytext16" }, { "type": 3, "content": { "version": "KqlItem/1.0", - "query": "resources | where type=='microsoft.network/routetables' | mvexpand properties.routes | summarize routeCount = count() by id | extend compliant = (routeCount < 360) | distinct id,compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed", + "query": "resources | where type=='microsoft.network/firewallpolicies' | extend compliant = (properties.threatIntelMode == 'Deny') | distinct id,compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed", "size": 4, "queryType": 1, "resourceType": "microsoft.resourcegraph/resources", @@ -1598,20 +1598,20 @@ ] } }, - "name": "query2" + "name": "query16" }, { "type": 1, "content": { - "json": "Use the setting 'Allow traffic to remote virtual network' when configuring VNet peerings. Check [this link](https://learn.microsoft.com/azure/virtual-network/virtual-network-manage-peering) for further information." + "json": "Configure Azure Firewall IDPS mode to Deny for additional protection. Check [this link](https://learn.microsoft.com/azure/firewall/premium-features#idps) for further information.. [This training](https://learn.microsoft.com/training/modules/introduction-azure-firewall/) can help to educate yourself on this." }, - "name": "querytext3" + "name": "querytext17" }, { "type": 3, "content": { "version": "KqlItem/1.0", - "query": "resources | where type == 'microsoft.network/virtualnetworks' | mvexpand properties.virtualNetworkPeerings | project id, peeringName=properties_virtualNetworkPeerings.name, compliant = (properties_virtualNetworkPeerings.properties.allowVirtualNetworkAccess == True) | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed", + "query": "resources | where type=='microsoft.network/firewallpolicies' | extend compliant = (properties.intrusionDetection.mode == 'Deny') | project id, compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed", "size": 4, "queryType": 1, "resourceType": "microsoft.resourcegraph/resources", @@ -1660,42 +1660,20 @@ ] } }, - "name": "query3" - } - ] - }, - "conditionalVisibility": { - "parameterName": "VisibleTab", - "comparison": "isEqualTo", - "value": "tab0" - }, - "name": "tab0" - }, - { - "type": 12, - "content": { - "version": "NotebookGroup/1.0", - "groupType": "editable", - "items": [ - { - "type": 1, - "content": { - "json": "## Virtual WAN" - }, - "name": "tab1title" + "name": "query17" }, { "type": 1, "content": { - "json": "For outbound Internet traffic protection and filtering, deploy Azure Firewall in secured hubs. Check [this link](https://learn.microsoft.com/azure/virtual-wan/howto-firewall) for further information.. [This training](https://learn.microsoft.com/learn/paths/secure-networking-infrastructure/) can help to educate yourself on this." + "json": "For subnets in VNets not connected to Virtual WAN, attach a route table so that Internet traffic is redirected to Azure Firewall or a Network Virtual Appliance. Check [this link](https://learn.microsoft.com/azure/virtual-network/virtual-networks-udr-overview) for further information." }, - "name": "querytext24" + "name": "querytext18" }, { "type": 3, "content": { "version": "KqlItem/1.0", - "query": "resources | where type=='microsoft.network/virtualhubs' | extend compliant = isnotnull(properties.azureFirewall.id) | project id, compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed", + "query": "resources | where type=='microsoft.network/virtualnetworks' | project id,resourceGroup,name,subnets=properties.subnets | mv-expand subnets | project id,name,subnetId=tostring(subnets.id), subnetName=tostring(subnets.name),subnetRT=subnets.properties.routeTable.id | where not (subnetName in ('GatewaySubnet', 'AzureFirewallSubnet', 'RouteServerSubnet', 'AzureBastionSubnet')) | extend hasRT = isnotnull(subnetRT) | distinct id, hasRT, subnetId | join kind=fullouter (resources | where type == 'microsoft.network/virtualnetworks' | mvexpand properties.virtualNetworkPeerings | extend isVWAN=(tolower(split(properties_virtualNetworkPeerings.name, '_')[0]) == 'remotevnettohubpeering') | mv-expand properties.subnets | project id, isVWAN, name, subnetId=tostring(properties_subnets.id), subnetName=tostring(properties_subnets.name) | summarize PeeredToVWAN=max(isVWAN) by id, subnetId | project id, subnetId, isVWANpeer = (PeeredToVWAN == true)) on subnetId | project id=iff(isnotempty(id), id, id1), subnetId=iff(isnotempty(subnetId), subnetId, subnetId1), hasRT, isVWANpeer | extend compliant = (hasRT==true or isVWANpeer==true) | distinct id, subnetId, compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed", "size": 4, "queryType": 1, "resourceType": "microsoft.resourcegraph/resources", @@ -1744,16 +1722,16 @@ ] } }, - "name": "query24" + "name": "query18" } ] }, "conditionalVisibility": { "parameterName": "VisibleTab", "comparison": "isEqualTo", - "value": "tab1" + "value": "tab0" }, - "name": "tab1" + "name": "tab0" }, { "type": 12, @@ -1764,22 +1742,22 @@ { "type": 1, "content": { - "json": "## Internet" + "json": "## IP plan" }, - "name": "tab2title" + "name": "tab1title" }, { "type": 1, "content": { - "json": "Use Azure Bastion in a subnet /26 or larger. Check [this link](https://learn.microsoft.com/azure/bastion/bastion-faq#subnet) for further information." + "json": "Use IP addresses from the address allocation ranges for private internets (RFC 1918). Check [this link](https://learn.microsoft.com/azure/cloud-adoption-framework/ready/azure-best-practices/plan-for-ip-addressing) for further information.. [This training](https://learn.microsoft.com/learn/paths/architect-network-infrastructure/) can help to educate yourself on this." }, - "name": "querytext6" + "name": "querytext4" }, { "type": 3, "content": { "version": "KqlItem/1.0", - "query": "resources | where type=='microsoft.network/virtualnetworks' | project id,subnets=properties.subnets | mv-expand subnets | project id, subnetName = subnets.name, subnetPrefix = subnets.properties.addressPrefix | extend subnetPrefixLength = split(subnetPrefix, '/')[1] | where subnetName == 'AzureBastionSubnet' | extend compliant = (subnetPrefixLength <= 26) | distinct id, compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed", + "query": "resources | where type == 'microsoft.network/virtualnetworks' | extend addressSpace = todynamic(properties.addressSpace) | extend addressPrefix = todynamic(properties.addressSpace.addressPrefixes) | mvexpand addressSpace | mvexpand addressPrefix | project name, id, location, resourceGroup, subscriptionId, cidr = addressPrefix | extend compliant = (cidr matches regex @'^(10\\.|172\\.(1[6-9]|2[0-9]|3[01])\\.|192\\.168\\.)') | project id, compliant, cidr | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed", "size": 4, "queryType": 1, "resourceType": "microsoft.resourcegraph/resources", @@ -1828,42 +1806,20 @@ ] } }, - "name": "query6" - } - ] - }, - "conditionalVisibility": { - "parameterName": "VisibleTab", - "comparison": "isEqualTo", - "value": "tab2" - }, - "name": "tab2" - }, - { - "type": 12, - "content": { - "version": "NotebookGroup/1.0", - "groupType": "editable", - "items": [ - { - "type": 1, - "content": { - "json": "## Firewall" - }, - "name": "tab3title" + "name": "query4" }, { "type": 1, "content": { - "json": "Use application rules to filter outbound traffic on destination host name for supported protocols. Use FQDN-based network rules and Azure Firewall with DNS proxy to filter egress traffic to the Internet over other protocols. Check [this link](https://learn.microsoft.com/azure/firewall/fqdn-filtering-network-rules) for further information." + "json": "Ensure that IP address space isn't wasted, don't create unnecessarily large virtual networks (for example /16). Check [this link](https://learn.microsoft.com/azure/cloud-adoption-framework/ready/azure-best-practices/plan-for-ip-addressing) for further information.. [This training](https://learn.microsoft.com/learn/paths/architect-network-infrastructure/) can help to educate yourself on this." }, - "name": "querytext14" + "name": "querytext5" }, { "type": 3, "content": { "version": "KqlItem/1.0", - "query": "resources | where type=='microsoft.network/firewallpolicies' | extend compliant = (properties.dnsSettings.enableProxy == true) | distinct id,compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed", + "query": "resources | where type == 'microsoft.network/virtualnetworks' | extend addressSpace = todynamic(properties.addressSpace) | extend addressPrefix = todynamic(properties.addressSpace.addressPrefixes) | mvexpand addressSpace | mvexpand addressPrefix | extend addressMask = split(addressPrefix,'/')[1] | extend compliant = addressMask > 16 | project name, id, subscriptionId, resourceGroup, addressPrefix, compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed", "size": 4, "queryType": 1, "resourceType": "microsoft.resourcegraph/resources", @@ -1912,20 +1868,42 @@ ] } }, - "name": "query14" + "name": "query5" + } + ] + }, + "conditionalVisibility": { + "parameterName": "VisibleTab", + "comparison": "isEqualTo", + "value": "tab1" + }, + "name": "tab1" + }, + { + "type": 12, + "content": { + "version": "NotebookGroup/1.0", + "groupType": "editable", + "items": [ + { + "type": 1, + "content": { + "json": "## Hub and spoke" + }, + "name": "tab2title" }, { "type": 1, "content": { - "json": "Use Azure Firewall Premium to enable additional security features. Check [this link](https://learn.microsoft.com/azure/firewall/premium-features) for further information." + "json": "If using Route Server, use a /27 prefix for the Route Server subnet. Check [this link](https://learn.microsoft.com/azure/route-server/quickstart-configure-route-server-portal#create-a-route-server-1) for further information.. [This training](https://learn.microsoft.com/training/modules/intro-to-azure-route-server/) can help to educate yourself on this." }, - "name": "querytext15" + "name": "querytext0" }, { "type": 3, "content": { "version": "KqlItem/1.0", - "query": "resources | where type=='microsoft.network/firewallpolicies' | extend compliant = (properties.sku.tier == 'Premium') | distinct id,compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed", + "query": "resources | where type=='microsoft.network/virtualnetworks' | project id,subnets=properties.subnets | mv-expand subnets | project id, subnetName = subnets.name, subnetPrefix = subnets.properties.addressPrefix | extend subnetPrefixLength = split(subnetPrefix, '/')[1] | where subnetName == 'RouteServerSubnet' | extend compliant = (subnetPrefixLength <= 27) | distinct id, compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed", "size": 4, "queryType": 1, "resourceType": "microsoft.resourcegraph/resources", @@ -1974,20 +1952,20 @@ ] } }, - "name": "query15" + "name": "query0" }, { "type": 1, "content": { - "json": "Configure Azure Firewall Threat Intelligence mode to Alert and Deny for additional protection. Check [this link](https://learn.microsoft.com/azure/firewall/premium-features#idps-signature-rules) for further information." + "json": "If you have more than 400 spoke networks in a region, deploy an additional hub to bypass VNet peering limits (500) and the maximum number of prefixes that can be advertised via ExpressRoute (1000). Check [this link](https://learn.microsoft.com/azure/azure-resource-manager/management/azure-subscription-service-limits?toc=/azure/virtual-network/toc.json#azure-resource-manager-virtual-networking-limits) for further information.. [This training](https://learn.microsoft.com/training/modules/hub-and-spoke-network-architecture/) can help to educate yourself on this." }, - "name": "querytext16" + "name": "querytext1" }, { "type": 3, "content": { "version": "KqlItem/1.0", - "query": "resources | where type=='microsoft.network/firewallpolicies' | extend compliant = (properties.threatIntelMode == 'Deny') | distinct id,compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed", + "query": "resources | where type == 'microsoft.network/virtualnetworks' | mvexpand properties.virtualNetworkPeerings | summarize peeringcount = count() by id | extend compliant = (peeringcount < 450) | distinct id,compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed", "size": 4, "queryType": 1, "resourceType": "microsoft.resourcegraph/resources", @@ -2036,20 +2014,20 @@ ] } }, - "name": "query16" + "name": "query1" }, { "type": 1, "content": { - "json": "Configure Azure Firewall IDPS mode to Deny for additional protection. Check [this link](https://learn.microsoft.com/azure/firewall/premium-features#idps) for further information." + "json": "Limit the number of routes per route table to 400. Check [this link](https://learn.microsoft.com/azure/azure-resource-manager/management/azure-subscription-service-limits?toc=/azure/virtual-network/toc.json#azure-resource-manager-virtual-networking-limits) for further information.. [This training](https://learn.microsoft.com/training/modules/hub-and-spoke-network-architecture/) can help to educate yourself on this." }, - "name": "querytext17" + "name": "querytext2" }, { "type": 3, "content": { "version": "KqlItem/1.0", - "query": "resources | where type=='microsoft.network/firewallpolicies' | extend compliant = (properties.intrusionDetection.mode == 'Deny') | project id, compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed", + "query": "resources | where type=='microsoft.network/routetables' | mvexpand properties.routes | summarize routeCount = count() by id | extend compliant = (routeCount < 360) | distinct id,compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed", "size": 4, "queryType": 1, "resourceType": "microsoft.resourcegraph/resources", @@ -2098,20 +2076,20 @@ ] } }, - "name": "query17" + "name": "query2" }, { "type": 1, "content": { - "json": "For subnets in VNets not connected to Virtual WAN, attach a route table so that Internet traffic is redirected to Azure Firewall or a Network Virtual Appliance. Check [this link](https://learn.microsoft.com/azure/virtual-network/virtual-networks-udr-overview) for further information." + "json": "Use the setting 'Allow traffic to remote virtual network' when configuring VNet peerings. Check [this link](https://learn.microsoft.com/azure/virtual-network/virtual-network-manage-peering) for further information.. [This training](https://learn.microsoft.com/training/modules/hub-and-spoke-network-architecture/) can help to educate yourself on this." }, - "name": "querytext18" + "name": "querytext3" }, { "type": 3, "content": { "version": "KqlItem/1.0", - "query": "resources | where type=='microsoft.network/virtualnetworks' | project id,resourceGroup,name,subnets=properties.subnets | mv-expand subnets | project id,name,subnetId=tostring(subnets.id), subnetName=tostring(subnets.name),subnetRT=subnets.properties.routeTable.id | where not (subnetName in ('GatewaySubnet', 'AzureFirewallSubnet', 'RouteServerSubnet', 'AzureBastionSubnet')) | extend hasRT = isnotnull(subnetRT) | distinct id, hasRT, subnetId | join kind=fullouter (resources | where type == 'microsoft.network/virtualnetworks' | mvexpand properties.virtualNetworkPeerings | extend isVWAN=(tolower(split(properties_virtualNetworkPeerings.name, '_')[0]) == 'remotevnettohubpeering') | mv-expand properties.subnets | project id, isVWAN, name, subnetId=tostring(properties_subnets.id), subnetName=tostring(properties_subnets.name) | summarize PeeredToVWAN=max(isVWAN) by id, subnetId | project id, subnetId, isVWANpeer = (PeeredToVWAN == true)) on subnetId | project id=iff(isnotempty(id), id, id1), subnetId=iff(isnotempty(subnetId), subnetId, subnetId1), hasRT, isVWANpeer | extend compliant = (hasRT==true or isVWANpeer==true) | distinct id, subnetId, compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed", + "query": "resources | where type == 'microsoft.network/virtualnetworks' | mvexpand properties.virtualNetworkPeerings | project id, peeringName=properties_virtualNetworkPeerings.name, compliant = (properties_virtualNetworkPeerings.properties.allowVirtualNetworkAccess == True) | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed", "size": 4, "queryType": 1, "resourceType": "microsoft.resourcegraph/resources", @@ -2160,16 +2138,16 @@ ] } }, - "name": "query18" + "name": "query3" } ] }, "conditionalVisibility": { "parameterName": "VisibleTab", "comparison": "isEqualTo", - "value": "tab3" + "value": "tab2" }, - "name": "tab3" + "name": "tab2" }, { "type": 12, @@ -2180,22 +2158,22 @@ { "type": 1, "content": { - "json": "## Hybrid" + "json": "## Segmentation" }, - "name": "tab4title" + "name": "tab3title" }, { "type": 1, "content": { - "json": "Select the right SKU for the ExpressRoute/VPN gateways based on bandwidth and performance requirements. Check [this link](https://learn.microsoft.com/azure/expressroute/expressroute-about-virtual-network-gateways?source=recommendations#gwsku) for further information.. [This training](https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/) can help to educate yourself on this." + "json": "Use a /26 prefix for your Azure Firewall subnets. Check [this link](https://learn.microsoft.com/azure/firewall/firewall-faq#why-does-azure-firewall-need-a--26-subnet-size) for further information.. [This training](https://learn.microsoft.com/training/modules/introduction-azure-firewall/) can help to educate yourself on this." }, - "name": "querytext7" + "name": "querytext19" }, { "type": 3, "content": { "version": "KqlItem/1.0", - "query": "resources| where type == 'microsoft.network/virtualnetworkgateways'| where properties.gatewayType =~ 'vpn' or properties.gatewayType == 'ExpressRoute'| extend SKUName = properties.sku.name, SKUTier = properties.sku.tier, Type = properties.gatewayType| extend compliant = SKUTier !in ('Basic', 'Standard')| project name, id, subscriptionId, resourceGroup, compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed", + "query": "resources | where type=='microsoft.network/virtualnetworks' | project id,subnets=properties.subnets | mv-expand subnets | project id, subnetName = subnets.name, subnetPrefix = subnets.properties.addressPrefix | extend subnetPrefixLength = split(subnetPrefix, '/')[1] | where subnetName == 'AzureFirewallSubnet' | extend compliant = (subnetPrefixLength == 26) | distinct id, compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed", "size": 4, "queryType": 1, "resourceType": "microsoft.resourcegraph/resources", @@ -2244,20 +2222,20 @@ ] } }, - "name": "query7" + "name": "query19" }, { "type": 1, "content": { - "json": "Ensure that you're using unlimited-data ExpressRoute circuits only if you reach the bandwidth that justifies their cost. Check [this link](https://learn.microsoft.com/azure/expressroute/plan-manage-cost) for further information." + "json": "Use at least a /27 prefix for your Gateway subnets. Check [this link](https://learn.microsoft.com/azure/expressroute/expressroute-howto-add-gateway-resource-manager#add-a-gateway) for further information." }, - "name": "querytext8" + "name": "querytext21" }, { "type": 3, "content": { "version": "KqlItem/1.0", - "query": "resources | where type=='microsoft.network/expressroutecircuits' | extend compliant = (tolower(sku.family) == 'metereddata' or tolower(sku.tier) == 'local') | distinct id,compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed", + "query": "resources | where type=='microsoft.network/virtualnetworks' | project id,subnets=properties.subnets | mv-expand subnets | project id, subnetName = subnets.name, subnetPrefix = subnets.properties.addressPrefix | extend subnetPrefixLength = split(subnetPrefix, '/')[1] | where subnetName == 'GatewaySubnet' | extend compliant = (subnetPrefixLength <= 27) | distinct id, compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed", "size": 4, "queryType": 1, "resourceType": "microsoft.resourcegraph/resources", @@ -2306,20 +2284,20 @@ ] } }, - "name": "query8" + "name": "query21" }, { "type": 1, "content": { - "json": "Leverage the Local SKU of ExpressRoute to reduce the cost of your circuits, if your circuit peering location supports your Azure regions for the Local SKU. Check [this link](https://learn.microsoft.com/azure/expressroute/expressroute-faqs#expressroute-local) for further information." + "json": "Don't rely on the NSG inbound default rules using the VirtualNetwork service tag to limit connectivity. Check [this link](https://learn.microsoft.com/azure/virtual-network/service-tags-overview#available-service-tags) for further information." }, - "name": "querytext9" + "name": "querytext22" }, { "type": 3, "content": { "version": "KqlItem/1.0", - "query": "resources | where type=='microsoft.network/connections' | where properties.connectionType == 'ExpressRoute' | project id, gwid=tostring(properties.virtualNetworkGateway1.id), circuitid=tostring(properties.peer.id) | join (resources | where type=='microsoft.network/expressroutecircuits' | project circuitid=tostring(id), circuitsku=sku.tier) on circuitid | project id=gwid, compliant = (circuitsku == 'Local') | summarize compliant=max(compliant) by id | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed", + "query": "resources | where type=='microsoft.network/networksecuritygroups' | mvexpand properties.securityRules | project id,name,ruleAction=properties_securityRules.properties.access,rulePriority=properties_securityRules.properties.priority,ruleDst=properties_securityRules.properties.destinationAddressPrefix,ruleSrc=properties_securityRules.properties.sourceAddressPrefix,ruleProt=properties_securityRules.properties.protocol,ruleDirection=properties_securityRules.properties.direction,rulePort=properties_securityRules.properties.destinationPortRange | summarize StarDenies=countif(ruleAction=='Deny' and ruleDst=='*' and ruleSrc=='*' and ruleProt=='*' and rulePort=='*') by id,tostring(ruleDirection) | where ruleDirection == 'Inbound' | project id,compliant=(StarDenies>0) | union (resources | where type=='microsoft.network/networksecuritygroups' | where array_length(properties.securityRules)==0 | extend compliant=false | project id,compliant) | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed", "size": 4, "queryType": 1, "resourceType": "microsoft.resourcegraph/resources", @@ -2368,20 +2346,20 @@ ] } }, - "name": "query9" + "name": "query22" }, { "type": 1, "content": { - "json": "Deploy a zone-redundant ExpressRoute gateway in the supported Azure regions. Check [this link](https://learn.microsoft.com/azure/expressroute/expressroute-about-virtual-network-gateways) for further information.. [This training](https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/) can help to educate yourself on this." + "json": "Do not implement more than 900 NSG rules per NSG, due to the limit of 1000 rules. Check [this link](https://learn.microsoft.com/azure/azure-resource-manager/management/azure-subscription-service-limits) for further information.. [This training](https://learn.microsoft.com/azure/virtual-network/network-security-group-how-it-works) can help to educate yourself on this." }, - "name": "querytext10" + "name": "querytext23" }, { "type": 3, "content": { "version": "KqlItem/1.0", - "query": "resources| where type == 'microsoft.network/virtualnetworkgateways'| where properties.gatewayType =~ 'vpn' or properties.gatewayType == 'ExpressRoute'| extend SKUName = properties.sku.name, SKUTier = properties.sku.tier, Type = properties.gatewayType| extend compliant = SKUTier contains 'AZ'| project name, id, subscriptionId, resourceGroup, Type, compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed", + "query": "resources | where type == 'microsoft.network/networksecuritygroups' | project id, rules = array_length(properties.securityRules) | project id, compliant = (rules < 900) | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed", "size": 4, "queryType": 1, "resourceType": "microsoft.resourcegraph/resources", @@ -2430,20 +2408,42 @@ ] } }, - "name": "query10" + "name": "query23" + } + ] + }, + "conditionalVisibility": { + "parameterName": "VisibleTab", + "comparison": "isEqualTo", + "value": "tab3" + }, + "name": "tab3" + }, + { + "type": 12, + "content": { + "version": "NotebookGroup/1.0", + "groupType": "editable", + "items": [ + { + "type": 1, + "content": { + "json": "## Virtual WAN" + }, + "name": "tab4title" }, { "type": 1, "content": { - "json": "Use zone-redundant VPN gateways to connect branches or remote locations to Azure (where available). Check [this link](https://learn.microsoft.com/azure/vpn-gateway/create-zone-redundant-vnet-gateway) for further information.. [This training](https://learn.microsoft.com/training/modules/intro-to-azure-vpn-gateway/) can help to educate yourself on this." + "json": "For outbound Internet traffic protection and filtering, deploy Azure Firewall in secured hubs. Check [this link](https://learn.microsoft.com/azure/virtual-wan/howto-firewall) for further information.. [This training](https://learn.microsoft.com/learn/paths/secure-networking-infrastructure/) can help to educate yourself on this." }, - "name": "querytext11" + "name": "querytext24" }, { "type": 3, "content": { "version": "KqlItem/1.0", - "query": "resources | where type=='microsoft.network/virtualnetworkgateways' | where properties.gatewayType == 'Vpn' | extend compliant = (tolower(properties.sku.name) contains 'az') | distinct id, compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed", + "query": "resources | where type=='microsoft.network/virtualhubs' | extend compliant = isnotnull(properties.azureFirewall.id) | project id, compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed", "size": 4, "queryType": 1, "resourceType": "microsoft.resourcegraph/resources", @@ -2492,20 +2492,42 @@ ] } }, - "name": "query11" + "name": "query24" + } + ] + }, + "conditionalVisibility": { + "parameterName": "VisibleTab", + "comparison": "isEqualTo", + "value": "tab4" + }, + "name": "tab4" + }, + { + "type": 12, + "content": { + "version": "NotebookGroup/1.0", + "groupType": "editable", + "items": [ + { + "type": 1, + "content": { + "json": "## Hybrid" + }, + "name": "tab5title" }, { "type": 1, "content": { - "json": "Use ExpressRoute circuits from different peering locations for redundancy. Check [this link](https://learn.microsoft.com/azure/expressroute/designing-for-disaster-recovery-with-expressroute-privatepeering#need-for-redundant-connectivity-solution) for further information.. [This training](https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/) can help to educate yourself on this." + "json": "Select the right SKU for the ExpressRoute/VPN gateways based on bandwidth and performance requirements. Check [this link](https://learn.microsoft.com/azure/expressroute/expressroute-about-virtual-network-gateways?source=recommendations#gwsku) for further information.. [This training](https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/) can help to educate yourself on this." }, - "name": "querytext12" + "name": "querytext7" }, { "type": 3, "content": { "version": "KqlItem/1.0", - "query": "resources | where type=='microsoft.network/connections' | where properties.connectionType == 'ExpressRoute' | project cxId=id, gwId=tostring(properties.virtualNetworkGateway1.id), circuitId=tostring(properties.peer.id) | join (resources | where type=='microsoft.network/expressroutecircuits' | project circuitId=tostring(id), circuitLocation=tostring(properties.serviceProviderProperties.peeringLocation)) on circuitId | distinct gwId, circuitLocation | summarize countErLocations=count() by id=gwId | extend compliant = (countErLocations >= 2) | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed", + "query": "resources| where type == 'microsoft.network/virtualnetworkgateways'| where properties.gatewayType =~ 'vpn' or properties.gatewayType == 'ExpressRoute'| extend SKUName = properties.sku.name, SKUTier = properties.sku.tier, Type = properties.gatewayType| extend compliant = SKUTier !in ('Basic', 'Standard')| project name, id, subscriptionId, resourceGroup, compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed", "size": 4, "queryType": 1, "resourceType": "microsoft.resourcegraph/resources", @@ -2554,20 +2576,20 @@ ] } }, - "name": "query12" + "name": "query7" }, { "type": 1, "content": { - "json": "If you are using a route table in the GatewaySubnet, make sure that gateway routes are propagated. Check [this link](https://learn.microsoft.com/azure/vpn-gateway/vpn-gateway-about-vpn-gateway-settings#gwsub) for further information." + "json": "Ensure that you're using unlimited-data ExpressRoute circuits only if you reach the bandwidth that justifies their cost. Check [this link](https://learn.microsoft.com/azure/expressroute/plan-manage-cost) for further information.. [This training](https://learn.microsoft.com/training/modules/design-implement-azure-expressroute/) can help to educate yourself on this." }, - "name": "querytext13" + "name": "querytext8" }, { "type": 3, "content": { "version": "KqlItem/1.0", - "query": "resources | where type=='microsoft.network/virtualnetworks' | project id,resourceGroup,name,subnets=properties.subnets | mv-expand subnets | project id,resourceGroup,name,subnetName=tostring(subnets.name),routeTableId=tostring(subnets.properties.routeTable.id) | where subnetName == 'GatewaySubnet' | join kind=leftouter (Resources | where type == 'microsoft.network/routetables' | project routeTableName=name,routeTableId=id, disableBgpRoutePropagation=properties.disableBgpRoutePropagation) on routeTableId | project id,compliant = (disableBgpRoutePropagation == False or isnull(disableBgpRoutePropagation)) | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed", + "query": "resources | where type=='microsoft.network/expressroutecircuits' | extend compliant = (tolower(sku.family) == 'metereddata' or tolower(sku.tier) == 'local') | distinct id,compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed", "size": 4, "queryType": 1, "resourceType": "microsoft.resourcegraph/resources", @@ -2616,42 +2638,20 @@ ] } }, - "name": "query13" - } - ] - }, - "conditionalVisibility": { - "parameterName": "VisibleTab", - "comparison": "isEqualTo", - "value": "tab4" - }, - "name": "tab4" - }, - { - "type": 12, - "content": { - "version": "NotebookGroup/1.0", - "groupType": "editable", - "items": [ - { - "type": 1, - "content": { - "json": "## Segmentation" - }, - "name": "tab5title" + "name": "query8" }, { "type": 1, "content": { - "json": "Use a /26 prefix for your Azure Firewall subnets. Check [this link](https://learn.microsoft.com/azure/firewall/firewall-faq#why-does-azure-firewall-need-a--26-subnet-size) for further information." + "json": "Leverage the Local SKU of ExpressRoute to reduce the cost of your circuits, if your circuit peering location supports your Azure regions for the Local SKU. Check [this link](https://learn.microsoft.com/azure/expressroute/expressroute-faqs#expressroute-local) for further information.. [This training](https://learn.microsoft.com/training/modules/design-implement-azure-expressroute/) can help to educate yourself on this." }, - "name": "querytext19" + "name": "querytext9" }, { "type": 3, "content": { "version": "KqlItem/1.0", - "query": "resources | where type=='microsoft.network/virtualnetworks' | project id,subnets=properties.subnets | mv-expand subnets | project id, subnetName = subnets.name, subnetPrefix = subnets.properties.addressPrefix | extend subnetPrefixLength = split(subnetPrefix, '/')[1] | where subnetName == 'AzureFirewallSubnet' | extend compliant = (subnetPrefixLength == 26) | distinct id, compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed", + "query": "resources | where type=='microsoft.network/connections' | where properties.connectionType == 'ExpressRoute' | project id, gwid=tostring(properties.virtualNetworkGateway1.id), circuitid=tostring(properties.peer.id) | join (resources | where type=='microsoft.network/expressroutecircuits' | project circuitid=tostring(id), circuitsku=sku.tier) on circuitid | project id=gwid, compliant = (circuitsku == 'Local') | summarize compliant=max(compliant) by id | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed", "size": 4, "queryType": 1, "resourceType": "microsoft.resourcegraph/resources", @@ -2700,20 +2700,20 @@ ] } }, - "name": "query19" + "name": "query9" }, { "type": 1, "content": { - "json": "Use at least a /27 prefix for your Gateway subnets. Check [this link](https://learn.microsoft.com/azure/expressroute/expressroute-howto-add-gateway-resource-manager#add-a-gateway) for further information." + "json": "Deploy a zone-redundant ExpressRoute gateway in the supported Azure regions. Check [this link](https://learn.microsoft.com/azure/expressroute/expressroute-about-virtual-network-gateways) for further information.. [This training](https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/) can help to educate yourself on this." }, - "name": "querytext21" + "name": "querytext10" }, { "type": 3, "content": { "version": "KqlItem/1.0", - "query": "resources | where type=='microsoft.network/virtualnetworks' | project id,subnets=properties.subnets | mv-expand subnets | project id, subnetName = subnets.name, subnetPrefix = subnets.properties.addressPrefix | extend subnetPrefixLength = split(subnetPrefix, '/')[1] | where subnetName == 'GatewaySubnet' | extend compliant = (subnetPrefixLength <= 27) | distinct id, compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed", + "query": "resources| where type == 'microsoft.network/virtualnetworkgateways'| where properties.gatewayType =~ 'vpn' or properties.gatewayType == 'ExpressRoute'| extend SKUName = properties.sku.name, SKUTier = properties.sku.tier, Type = properties.gatewayType| extend compliant = SKUTier contains 'AZ'| project name, id, subscriptionId, resourceGroup, Type, compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed", "size": 4, "queryType": 1, "resourceType": "microsoft.resourcegraph/resources", @@ -2762,20 +2762,20 @@ ] } }, - "name": "query21" + "name": "query10" }, { "type": 1, "content": { - "json": "Don't rely on the NSG inbound default rules using the VirtualNetwork service tag to limit connectivity. Check [this link](https://learn.microsoft.com/azure/virtual-network/service-tags-overview#available-service-tags) for further information." + "json": "Use zone-redundant VPN gateways to connect branches or remote locations to Azure (where available). Check [this link](https://learn.microsoft.com/azure/vpn-gateway/create-zone-redundant-vnet-gateway) for further information.. [This training](https://learn.microsoft.com/training/modules/intro-to-azure-vpn-gateway/) can help to educate yourself on this." }, - "name": "querytext22" + "name": "querytext11" }, { "type": 3, "content": { "version": "KqlItem/1.0", - "query": "resources | where type=='microsoft.network/networksecuritygroups' | mvexpand properties.securityRules | project id,name,ruleAction=properties_securityRules.properties.access,rulePriority=properties_securityRules.properties.priority,ruleDst=properties_securityRules.properties.destinationAddressPrefix,ruleSrc=properties_securityRules.properties.sourceAddressPrefix,ruleProt=properties_securityRules.properties.protocol,ruleDirection=properties_securityRules.properties.direction,rulePort=properties_securityRules.properties.destinationPortRange | summarize StarDenies=countif(ruleAction=='Deny' and ruleDst=='*' and ruleSrc=='*' and ruleProt=='*' and rulePort=='*') by id,tostring(ruleDirection) | where ruleDirection == 'Inbound' | project id,compliant=(StarDenies>0) | union (resources | where type=='microsoft.network/networksecuritygroups' | where array_length(properties.securityRules)==0 | extend compliant=false | project id,compliant) | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed", + "query": "resources | where type=='microsoft.network/virtualnetworkgateways' | where properties.gatewayType == 'Vpn' | extend compliant = (tolower(properties.sku.name) contains 'az') | distinct id, compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed", "size": 4, "queryType": 1, "resourceType": "microsoft.resourcegraph/resources", @@ -2824,20 +2824,20 @@ ] } }, - "name": "query22" + "name": "query11" }, { "type": 1, "content": { - "json": "Do not implement more than 900 NSG rules per NSG, due to the limit of 1000 rules. Check [this link](https://learn.microsoft.com/azure/azure-resource-manager/management/azure-subscription-service-limits) for further information.. [This training](https://learn.microsoft.com/azure/virtual-network/network-security-group-how-it-works) can help to educate yourself on this." + "json": "Use ExpressRoute circuits from different peering locations for redundancy. Check [this link](https://learn.microsoft.com/azure/expressroute/designing-for-disaster-recovery-with-expressroute-privatepeering#need-for-redundant-connectivity-solution) for further information.. [This training](https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/) can help to educate yourself on this." }, - "name": "querytext23" + "name": "querytext12" }, { "type": 3, "content": { "version": "KqlItem/1.0", - "query": "resources | where type == 'microsoft.network/networksecuritygroups' | project id, rules = array_length(properties.securityRules) | project id, compliant = (rules < 900) | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed", + "query": "resources | where type=='microsoft.network/connections' | where properties.connectionType == 'ExpressRoute' | project cxId=id, gwId=tostring(properties.virtualNetworkGateway1.id), circuitId=tostring(properties.peer.id) | join (resources | where type=='microsoft.network/expressroutecircuits' | project circuitId=tostring(id), circuitLocation=tostring(properties.serviceProviderProperties.peeringLocation)) on circuitId | distinct gwId, circuitLocation | summarize countErLocations=count() by id=gwId | extend compliant = (countErLocations >= 2) | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed", "size": 4, "queryType": 1, "resourceType": "microsoft.resourcegraph/resources", @@ -2886,42 +2886,20 @@ ] } }, - "name": "query23" - } - ] - }, - "conditionalVisibility": { - "parameterName": "VisibleTab", - "comparison": "isEqualTo", - "value": "tab5" - }, - "name": "tab5" - }, - { - "type": 12, - "content": { - "version": "NotebookGroup/1.0", - "groupType": "editable", - "items": [ - { - "type": 1, - "content": { - "json": "## IP plan" - }, - "name": "tab6title" + "name": "query12" }, { "type": 1, "content": { - "json": "Use IP addresses from the address allocation ranges for private internets (RFC 1918). Check [this link](https://learn.microsoft.com/azure/cloud-adoption-framework/ready/azure-best-practices/plan-for-ip-addressing) for further information.. [This training](https://learn.microsoft.com/learn/paths/architect-network-infrastructure/) can help to educate yourself on this." + "json": "If you are using a route table in the GatewaySubnet, make sure that gateway routes are propagated. Check [this link](https://learn.microsoft.com/azure/vpn-gateway/vpn-gateway-about-vpn-gateway-settings#gwsub) for further information." }, - "name": "querytext4" + "name": "querytext13" }, { "type": 3, "content": { "version": "KqlItem/1.0", - "query": "resources | where type == 'microsoft.network/virtualnetworks' | extend addressSpace = todynamic(properties.addressSpace) | extend addressPrefix = todynamic(properties.addressSpace.addressPrefixes) | mvexpand addressSpace | mvexpand addressPrefix | project name, id, location, resourceGroup, subscriptionId, cidr = addressPrefix | extend compliant = (cidr matches regex @'^(10\\.|172\\.(1[6-9]|2[0-9]|3[01])\\.|192\\.168\\.)') | project id, compliant, cidr | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed", + "query": "resources | where type=='microsoft.network/virtualnetworks' | project id,resourceGroup,name,subnets=properties.subnets | mv-expand subnets | project id,resourceGroup,name,subnetName=tostring(subnets.name),routeTableId=tostring(subnets.properties.routeTable.id) | where subnetName == 'GatewaySubnet' | join kind=leftouter (Resources | where type == 'microsoft.network/routetables' | project routeTableName=name,routeTableId=id, disableBgpRoutePropagation=properties.disableBgpRoutePropagation) on routeTableId | project id,compliant = (disableBgpRoutePropagation == False or isnull(disableBgpRoutePropagation)) | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed", "size": 4, "queryType": 1, "resourceType": "microsoft.resourcegraph/resources", @@ -2970,20 +2948,42 @@ ] } }, - "name": "query4" + "name": "query13" + } + ] + }, + "conditionalVisibility": { + "parameterName": "VisibleTab", + "comparison": "isEqualTo", + "value": "tab5" + }, + "name": "tab5" + }, + { + "type": 12, + "content": { + "version": "NotebookGroup/1.0", + "groupType": "editable", + "items": [ + { + "type": 1, + "content": { + "json": "## Internet" + }, + "name": "tab6title" }, { "type": 1, "content": { - "json": "Ensure that IP address space isn't wasted, don't create unnecessarily large virtual networks (for example /16). Check [this link](https://learn.microsoft.com/azure/cloud-adoption-framework/ready/azure-best-practices/plan-for-ip-addressing) for further information.. [This training](https://learn.microsoft.com/learn/paths/architect-network-infrastructure/) can help to educate yourself on this." + "json": "Use Azure Bastion in a subnet /26 or larger. Check [this link](https://learn.microsoft.com/azure/bastion/bastion-faq#subnet) for further information.. [This training](https://learn.microsoft.com/training/modules/intro-to-azure-bastion/) can help to educate yourself on this." }, - "name": "querytext5" + "name": "querytext6" }, { "type": 3, "content": { "version": "KqlItem/1.0", - "query": "resources | where type == 'microsoft.network/virtualnetworks' | extend addressSpace = todynamic(properties.addressSpace) | extend addressPrefix = todynamic(properties.addressSpace.addressPrefixes) | mvexpand addressSpace | mvexpand addressPrefix | extend addressMask = split(addressPrefix,'/')[1] | extend compliant = addressMask > 16 | project name, id, subscriptionId, resourceGroup, addressPrefix, compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed", + "query": "resources | where type=='microsoft.network/virtualnetworks' | project id,subnets=properties.subnets | mv-expand subnets | project id, subnetName = subnets.name, subnetPrefix = subnets.properties.addressPrefix | extend subnetPrefixLength = split(subnetPrefix, '/')[1] | where subnetName == 'AzureBastionSubnet' | extend compliant = (subnetPrefixLength <= 26) | distinct id, compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed", "size": 4, "queryType": 1, "resourceType": "microsoft.resourcegraph/resources", @@ -3032,7 +3032,7 @@ ] } }, - "name": "query5" + "name": "query6" } ] }, diff --git a/workbooks/alz_checklist.en_network_counters_template.json b/workbooks/alz_checklist.en_network_counters_template.json index fa1e3a91f..0dc22fbb1 100644 --- a/workbooks/alz_checklist.en_network_counters_template.json +++ b/workbooks/alz_checklist.en_network_counters_template.json @@ -41,7 +41,7 @@ "dependsOn": [], "properties": { "displayName": "[parameters('workbookDisplayName')]", - "serializedData": "{\n \"version\": \"Notebook/1.0\",\n \"items\": [\n {\n \"type\": 9,\n \"content\": {\n \"version\": \"KqlParameterItem/1.0\",\n \"parameters\": [\n {\n \"id\": \"497a107e-dde8-433e-b263-35ac8e8f7834\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Subscription\",\n \"type\": 6,\n \"multiSelect\": true,\n \"quote\": \"'\",\n \"delimiter\": \",\",\n \"typeSettings\": {\n \"additionalResourceOptions\": [\n \"value::all\"\n ],\n \"includeAll\": true,\n \"showDefault\": false\n },\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"value\": [\n \"value::all\"\n ]\n },\n {\n \"id\": \"844e4f4e-df51-4e3c-8eaf-0dc78b92c721\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"OnlyFailed\",\n \"label\": \"Only show failed\",\n \"type\": 2,\n \"typeSettings\": {\n \"additionalResourceOptions\": [],\n \"showDefault\": false\n },\n \"jsonData\": \"[\\r\\n { \\\"value\\\":true, \\\"label\\\":\\\"True\\\" },\\r\\n { \\\"value\\\":false, \\\"label\\\":\\\"False\\\", \\\"selected\\\":true }\\r\\n]\"\n }\n ],\n \"style\": \"pills\",\n \"queryType\": 0,\n \"resourceType\": \"microsoft.operationalinsights/workspaces\"\n },\n \"name\": \"WorkbookSelectors\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"If you set \\\"Only show failed\\\" to \\\"Yes\\\", the different queries will only show items that have failed their compliance checks.\",\n \"style\": \"info\"\n },\n \"name\": \"InfoBox\"\n },\n {\n \"type\": 9,\n \"content\": {\n \"version\": \"KqlParameterItem/1.0\",\n \"crossComponentResources\": [\n \"value::all\"\n ],\n \"parameters\": [\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query0Stats\",\n \"type\": 1,\n \"query\": \"resources | where type=='microsoft.network/virtualnetworks' | project id,subnets=properties.subnets | mv-expand subnets | project id, subnetName = subnets.name, subnetPrefix = subnets.properties.addressPrefix | extend subnetPrefixLength = split(subnetPrefix, '/')[1] | where subnetName == 'RouteServerSubnet' | extend compliant = (subnetPrefixLength <= 27) | distinct id, compliant| summarize Total = count(), Success = countif(compliant==1), Failed = countif(compliant==0) | extend SuccessPercent = iff(Total==0, 100, 100*toint(Success)/toint(Total)) | extend FullyCompliant = iff(SuccessPercent == 100, 'Yes', 'No') | project Query1Stats=tostring(pack_all())\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\"\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query0FullyCompliant\",\n \"type\": 1,\n \"query\": \"{\\\"version\\\":\\\"1.0.0\\\",\\\"content\\\":\\\"{\\\\\\\"value\\\\\\\": \\\\\\\"{Query0Stats:$.FullyCompliant}\\\\\\\"}\\\",\\\"transformers\\\":null}\",\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 8\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query1Stats\",\n \"type\": 1,\n \"query\": \"resources | where type == 'microsoft.network/virtualnetworks' | mvexpand properties.virtualNetworkPeerings | summarize peeringcount = count() by id | extend compliant = (peeringcount < 450) | distinct id,compliant| summarize Total = count(), Success = countif(compliant==1), Failed = countif(compliant==0) | extend SuccessPercent = iff(Total==0, 100, 100*toint(Success)/toint(Total)) | extend FullyCompliant = iff(SuccessPercent == 100, 'Yes', 'No') | project Query1Stats=tostring(pack_all())\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\"\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query1FullyCompliant\",\n \"type\": 1,\n \"query\": \"{\\\"version\\\":\\\"1.0.0\\\",\\\"content\\\":\\\"{\\\\\\\"value\\\\\\\": \\\\\\\"{Query1Stats:$.FullyCompliant}\\\\\\\"}\\\",\\\"transformers\\\":null}\",\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 8\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query2Stats\",\n \"type\": 1,\n \"query\": \"resources | where type=='microsoft.network/routetables' | mvexpand properties.routes | summarize routeCount = count() by id | extend compliant = (routeCount < 360) | distinct id,compliant| summarize Total = count(), Success = countif(compliant==1), Failed = countif(compliant==0) | extend SuccessPercent = iff(Total==0, 100, 100*toint(Success)/toint(Total)) | extend FullyCompliant = iff(SuccessPercent == 100, 'Yes', 'No') | project Query1Stats=tostring(pack_all())\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\"\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query2FullyCompliant\",\n \"type\": 1,\n \"query\": \"{\\\"version\\\":\\\"1.0.0\\\",\\\"content\\\":\\\"{\\\\\\\"value\\\\\\\": \\\\\\\"{Query2Stats:$.FullyCompliant}\\\\\\\"}\\\",\\\"transformers\\\":null}\",\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 8\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query3Stats\",\n \"type\": 1,\n \"query\": \"resources | where type == 'microsoft.network/virtualnetworks' | mvexpand properties.virtualNetworkPeerings | project id, peeringName=properties_virtualNetworkPeerings.name, compliant = (properties_virtualNetworkPeerings.properties.allowVirtualNetworkAccess == True)| summarize Total = count(), Success = countif(compliant==1), Failed = countif(compliant==0) | extend SuccessPercent = iff(Total==0, 100, 100*toint(Success)/toint(Total)) | extend FullyCompliant = iff(SuccessPercent == 100, 'Yes', 'No') | project Query1Stats=tostring(pack_all())\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\"\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query3FullyCompliant\",\n \"type\": 1,\n \"query\": \"{\\\"version\\\":\\\"1.0.0\\\",\\\"content\\\":\\\"{\\\\\\\"value\\\\\\\": \\\\\\\"{Query3Stats:$.FullyCompliant}\\\\\\\"}\\\",\\\"transformers\\\":null}\",\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 8\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query4Stats\",\n \"type\": 1,\n \"query\": \"resources | where type == 'microsoft.network/virtualnetworks' | extend addressSpace = todynamic(properties.addressSpace) | extend addressPrefix = todynamic(properties.addressSpace.addressPrefixes) | mvexpand addressSpace | mvexpand addressPrefix | project name, id, location, resourceGroup, subscriptionId, cidr = addressPrefix | extend compliant = (cidr matches regex @'^(10\\\\.|172\\\\.(1[6-9]|2[0-9]|3[01])\\\\.|192\\\\.168\\\\.)') | project id, compliant, cidr| summarize Total = count(), Success = countif(compliant==1), Failed = countif(compliant==0) | extend SuccessPercent = iff(Total==0, 100, 100*toint(Success)/toint(Total)) | extend FullyCompliant = iff(SuccessPercent == 100, 'Yes', 'No') | project Query1Stats=tostring(pack_all())\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\"\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query4FullyCompliant\",\n \"type\": 1,\n \"query\": \"{\\\"version\\\":\\\"1.0.0\\\",\\\"content\\\":\\\"{\\\\\\\"value\\\\\\\": \\\\\\\"{Query4Stats:$.FullyCompliant}\\\\\\\"}\\\",\\\"transformers\\\":null}\",\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 8\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query5Stats\",\n \"type\": 1,\n \"query\": \"resources | where type == 'microsoft.network/virtualnetworks' | extend addressSpace = todynamic(properties.addressSpace) | extend addressPrefix = todynamic(properties.addressSpace.addressPrefixes) | mvexpand addressSpace | mvexpand addressPrefix | extend addressMask = split(addressPrefix,'/')[1] | extend compliant = addressMask > 16 | project name, id, subscriptionId, resourceGroup, addressPrefix, compliant| summarize Total = count(), Success = countif(compliant==1), Failed = countif(compliant==0) | extend SuccessPercent = iff(Total==0, 100, 100*toint(Success)/toint(Total)) | extend FullyCompliant = iff(SuccessPercent == 100, 'Yes', 'No') | project Query1Stats=tostring(pack_all())\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\"\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query5FullyCompliant\",\n \"type\": 1,\n \"query\": \"{\\\"version\\\":\\\"1.0.0\\\",\\\"content\\\":\\\"{\\\\\\\"value\\\\\\\": \\\\\\\"{Query5Stats:$.FullyCompliant}\\\\\\\"}\\\",\\\"transformers\\\":null}\",\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 8\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query6Stats\",\n \"type\": 1,\n \"query\": \"resources | where type=='microsoft.network/virtualnetworks' | project id,subnets=properties.subnets | mv-expand subnets | project id, subnetName = subnets.name, subnetPrefix = subnets.properties.addressPrefix | extend subnetPrefixLength = split(subnetPrefix, '/')[1] | where subnetName == 'AzureBastionSubnet' | extend compliant = (subnetPrefixLength <= 26) | distinct id, compliant| summarize Total = count(), Success = countif(compliant==1), Failed = countif(compliant==0) | extend SuccessPercent = iff(Total==0, 100, 100*toint(Success)/toint(Total)) | extend FullyCompliant = iff(SuccessPercent == 100, 'Yes', 'No') | project Query1Stats=tostring(pack_all())\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\"\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query6FullyCompliant\",\n \"type\": 1,\n \"query\": \"{\\\"version\\\":\\\"1.0.0\\\",\\\"content\\\":\\\"{\\\\\\\"value\\\\\\\": \\\\\\\"{Query6Stats:$.FullyCompliant}\\\\\\\"}\\\",\\\"transformers\\\":null}\",\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 8\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query7Stats\",\n \"type\": 1,\n \"query\": \"resources| where type == 'microsoft.network/virtualnetworkgateways'| where properties.gatewayType =~ 'vpn' or properties.gatewayType == 'ExpressRoute'| extend SKUName = properties.sku.name, SKUTier = properties.sku.tier, Type = properties.gatewayType| extend compliant = SKUTier !in ('Basic', 'Standard')| project name, id, subscriptionId, resourceGroup, compliant| summarize Total = count(), Success = countif(compliant==1), Failed = countif(compliant==0) | extend SuccessPercent = iff(Total==0, 100, 100*toint(Success)/toint(Total)) | extend FullyCompliant = iff(SuccessPercent == 100, 'Yes', 'No') | project Query1Stats=tostring(pack_all())\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\"\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query7FullyCompliant\",\n \"type\": 1,\n \"query\": \"{\\\"version\\\":\\\"1.0.0\\\",\\\"content\\\":\\\"{\\\\\\\"value\\\\\\\": \\\\\\\"{Query7Stats:$.FullyCompliant}\\\\\\\"}\\\",\\\"transformers\\\":null}\",\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 8\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query8Stats\",\n \"type\": 1,\n \"query\": \"resources | where type=='microsoft.network/expressroutecircuits' | extend compliant = (tolower(sku.family) == 'metereddata' or tolower(sku.tier) == 'local') | distinct id,compliant| summarize Total = count(), Success = countif(compliant==1), Failed = countif(compliant==0) | extend SuccessPercent = iff(Total==0, 100, 100*toint(Success)/toint(Total)) | extend FullyCompliant = iff(SuccessPercent == 100, 'Yes', 'No') | project Query1Stats=tostring(pack_all())\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\"\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query8FullyCompliant\",\n \"type\": 1,\n \"query\": \"{\\\"version\\\":\\\"1.0.0\\\",\\\"content\\\":\\\"{\\\\\\\"value\\\\\\\": \\\\\\\"{Query8Stats:$.FullyCompliant}\\\\\\\"}\\\",\\\"transformers\\\":null}\",\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 8\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query9Stats\",\n \"type\": 1,\n \"query\": \"resources | where type=='microsoft.network/connections' | where properties.connectionType == 'ExpressRoute' | project id, gwid=tostring(properties.virtualNetworkGateway1.id), circuitid=tostring(properties.peer.id) | join (resources | where type=='microsoft.network/expressroutecircuits' | project circuitid=tostring(id), circuitsku=sku.tier) on circuitid | project id=gwid, compliant = (circuitsku == 'Local') | summarize compliant=max(compliant) by id| summarize Total = count(), Success = countif(compliant==1), Failed = countif(compliant==0) | extend SuccessPercent = iff(Total==0, 100, 100*toint(Success)/toint(Total)) | extend FullyCompliant = iff(SuccessPercent == 100, 'Yes', 'No') | project Query1Stats=tostring(pack_all())\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\"\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query9FullyCompliant\",\n \"type\": 1,\n \"query\": \"{\\\"version\\\":\\\"1.0.0\\\",\\\"content\\\":\\\"{\\\\\\\"value\\\\\\\": \\\\\\\"{Query9Stats:$.FullyCompliant}\\\\\\\"}\\\",\\\"transformers\\\":null}\",\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 8\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query10Stats\",\n \"type\": 1,\n \"query\": \"resources| where type == 'microsoft.network/virtualnetworkgateways'| where properties.gatewayType =~ 'vpn' or properties.gatewayType == 'ExpressRoute'| extend SKUName = properties.sku.name, SKUTier = properties.sku.tier, Type = properties.gatewayType| extend compliant = SKUTier contains 'AZ'| project name, id, subscriptionId, resourceGroup, Type, compliant| summarize Total = count(), Success = countif(compliant==1), Failed = countif(compliant==0) | extend SuccessPercent = iff(Total==0, 100, 100*toint(Success)/toint(Total)) | extend FullyCompliant = iff(SuccessPercent == 100, 'Yes', 'No') | project Query1Stats=tostring(pack_all())\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\"\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query10FullyCompliant\",\n \"type\": 1,\n \"query\": \"{\\\"version\\\":\\\"1.0.0\\\",\\\"content\\\":\\\"{\\\\\\\"value\\\\\\\": \\\\\\\"{Query10Stats:$.FullyCompliant}\\\\\\\"}\\\",\\\"transformers\\\":null}\",\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 8\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query11Stats\",\n \"type\": 1,\n \"query\": \"resources | where type=='microsoft.network/virtualnetworkgateways' | where properties.gatewayType == 'Vpn' | extend compliant = (tolower(properties.sku.name) contains 'az') | distinct id, compliant| summarize Total = count(), Success = countif(compliant==1), Failed = countif(compliant==0) | extend SuccessPercent = iff(Total==0, 100, 100*toint(Success)/toint(Total)) | extend FullyCompliant = iff(SuccessPercent == 100, 'Yes', 'No') | project Query1Stats=tostring(pack_all())\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\"\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query11FullyCompliant\",\n \"type\": 1,\n \"query\": \"{\\\"version\\\":\\\"1.0.0\\\",\\\"content\\\":\\\"{\\\\\\\"value\\\\\\\": \\\\\\\"{Query11Stats:$.FullyCompliant}\\\\\\\"}\\\",\\\"transformers\\\":null}\",\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 8\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query12Stats\",\n \"type\": 1,\n \"query\": \"resources | where type=='microsoft.network/connections' | where properties.connectionType == 'ExpressRoute' | project cxId=id, gwId=tostring(properties.virtualNetworkGateway1.id), circuitId=tostring(properties.peer.id) | join (resources | where type=='microsoft.network/expressroutecircuits' | project circuitId=tostring(id), circuitLocation=tostring(properties.serviceProviderProperties.peeringLocation)) on circuitId | distinct gwId, circuitLocation | summarize countErLocations=count() by id=gwId | extend compliant = (countErLocations >= 2)| summarize Total = count(), Success = countif(compliant==1), Failed = countif(compliant==0) | extend SuccessPercent = iff(Total==0, 100, 100*toint(Success)/toint(Total)) | extend FullyCompliant = iff(SuccessPercent == 100, 'Yes', 'No') | project Query1Stats=tostring(pack_all())\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\"\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query12FullyCompliant\",\n \"type\": 1,\n \"query\": \"{\\\"version\\\":\\\"1.0.0\\\",\\\"content\\\":\\\"{\\\\\\\"value\\\\\\\": \\\\\\\"{Query12Stats:$.FullyCompliant}\\\\\\\"}\\\",\\\"transformers\\\":null}\",\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 8\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query13Stats\",\n \"type\": 1,\n \"query\": \"resources | where type=='microsoft.network/virtualnetworks' | project id,resourceGroup,name,subnets=properties.subnets | mv-expand subnets | project id,resourceGroup,name,subnetName=tostring(subnets.name),routeTableId=tostring(subnets.properties.routeTable.id) | where subnetName == 'GatewaySubnet' | join kind=leftouter (Resources | where type == 'microsoft.network/routetables' | project routeTableName=name,routeTableId=id, disableBgpRoutePropagation=properties.disableBgpRoutePropagation) on routeTableId | project id,compliant = (disableBgpRoutePropagation == False or isnull(disableBgpRoutePropagation))| summarize Total = count(), Success = countif(compliant==1), Failed = countif(compliant==0) | extend SuccessPercent = iff(Total==0, 100, 100*toint(Success)/toint(Total)) | extend FullyCompliant = iff(SuccessPercent == 100, 'Yes', 'No') | project Query1Stats=tostring(pack_all())\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\"\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query13FullyCompliant\",\n \"type\": 1,\n \"query\": \"{\\\"version\\\":\\\"1.0.0\\\",\\\"content\\\":\\\"{\\\\\\\"value\\\\\\\": \\\\\\\"{Query13Stats:$.FullyCompliant}\\\\\\\"}\\\",\\\"transformers\\\":null}\",\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 8\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query14Stats\",\n \"type\": 1,\n \"query\": \"resources | where type=='microsoft.network/firewallpolicies' | extend compliant = (properties.dnsSettings.enableProxy == true) | distinct id,compliant| summarize Total = count(), Success = countif(compliant==1), Failed = countif(compliant==0) | extend SuccessPercent = iff(Total==0, 100, 100*toint(Success)/toint(Total)) | extend FullyCompliant = iff(SuccessPercent == 100, 'Yes', 'No') | project Query1Stats=tostring(pack_all())\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\"\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query14FullyCompliant\",\n \"type\": 1,\n \"query\": \"{\\\"version\\\":\\\"1.0.0\\\",\\\"content\\\":\\\"{\\\\\\\"value\\\\\\\": \\\\\\\"{Query14Stats:$.FullyCompliant}\\\\\\\"}\\\",\\\"transformers\\\":null}\",\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 8\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query15Stats\",\n \"type\": 1,\n \"query\": \"resources | where type=='microsoft.network/firewallpolicies' | extend compliant = (properties.sku.tier == 'Premium') | distinct id,compliant| summarize Total = count(), Success = countif(compliant==1), Failed = countif(compliant==0) | extend SuccessPercent = iff(Total==0, 100, 100*toint(Success)/toint(Total)) | extend FullyCompliant = iff(SuccessPercent == 100, 'Yes', 'No') | project Query1Stats=tostring(pack_all())\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\"\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query15FullyCompliant\",\n \"type\": 1,\n \"query\": \"{\\\"version\\\":\\\"1.0.0\\\",\\\"content\\\":\\\"{\\\\\\\"value\\\\\\\": \\\\\\\"{Query15Stats:$.FullyCompliant}\\\\\\\"}\\\",\\\"transformers\\\":null}\",\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 8\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query16Stats\",\n \"type\": 1,\n \"query\": \"resources | where type=='microsoft.network/firewallpolicies' | extend compliant = (properties.threatIntelMode == 'Deny') | distinct id,compliant| summarize Total = count(), Success = countif(compliant==1), Failed = countif(compliant==0) | extend SuccessPercent = iff(Total==0, 100, 100*toint(Success)/toint(Total)) | extend FullyCompliant = iff(SuccessPercent == 100, 'Yes', 'No') | project Query1Stats=tostring(pack_all())\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\"\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query16FullyCompliant\",\n \"type\": 1,\n \"query\": \"{\\\"version\\\":\\\"1.0.0\\\",\\\"content\\\":\\\"{\\\\\\\"value\\\\\\\": \\\\\\\"{Query16Stats:$.FullyCompliant}\\\\\\\"}\\\",\\\"transformers\\\":null}\",\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 8\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query17Stats\",\n \"type\": 1,\n \"query\": \"resources | where type=='microsoft.network/firewallpolicies' | extend compliant = (properties.intrusionDetection.mode == 'Deny') | project id, compliant| summarize Total = count(), Success = countif(compliant==1), Failed = countif(compliant==0) | extend SuccessPercent = iff(Total==0, 100, 100*toint(Success)/toint(Total)) | extend FullyCompliant = iff(SuccessPercent == 100, 'Yes', 'No') | project Query1Stats=tostring(pack_all())\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\"\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query17FullyCompliant\",\n \"type\": 1,\n \"query\": \"{\\\"version\\\":\\\"1.0.0\\\",\\\"content\\\":\\\"{\\\\\\\"value\\\\\\\": \\\\\\\"{Query17Stats:$.FullyCompliant}\\\\\\\"}\\\",\\\"transformers\\\":null}\",\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 8\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query18Stats\",\n \"type\": 1,\n \"query\": \"resources | where type=='microsoft.network/virtualnetworks' | project id,resourceGroup,name,subnets=properties.subnets | mv-expand subnets | project id,name,subnetId=tostring(subnets.id), subnetName=tostring(subnets.name),subnetRT=subnets.properties.routeTable.id | where not (subnetName in ('GatewaySubnet', 'AzureFirewallSubnet', 'RouteServerSubnet', 'AzureBastionSubnet')) | extend hasRT = isnotnull(subnetRT) | distinct id, hasRT, subnetId | join kind=fullouter (resources | where type == 'microsoft.network/virtualnetworks' | mvexpand properties.virtualNetworkPeerings | extend isVWAN=(tolower(split(properties_virtualNetworkPeerings.name, '_')[0]) == 'remotevnettohubpeering') | mv-expand properties.subnets | project id, isVWAN, name, subnetId=tostring(properties_subnets.id), subnetName=tostring(properties_subnets.name) | summarize PeeredToVWAN=max(isVWAN) by id, subnetId | project id, subnetId, isVWANpeer = (PeeredToVWAN == true)) on subnetId | project id=iff(isnotempty(id), id, id1), subnetId=iff(isnotempty(subnetId), subnetId, subnetId1), hasRT, isVWANpeer | extend compliant = (hasRT==true or isVWANpeer==true) | distinct id, subnetId, compliant| summarize Total = count(), Success = countif(compliant==1), Failed = countif(compliant==0) | extend SuccessPercent = iff(Total==0, 100, 100*toint(Success)/toint(Total)) | extend FullyCompliant = iff(SuccessPercent == 100, 'Yes', 'No') | project Query1Stats=tostring(pack_all())\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\"\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query18FullyCompliant\",\n \"type\": 1,\n \"query\": \"{\\\"version\\\":\\\"1.0.0\\\",\\\"content\\\":\\\"{\\\\\\\"value\\\\\\\": \\\\\\\"{Query18Stats:$.FullyCompliant}\\\\\\\"}\\\",\\\"transformers\\\":null}\",\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 8\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query19Stats\",\n \"type\": 1,\n \"query\": \"resources | where type=='microsoft.network/virtualnetworks' | project id,subnets=properties.subnets | mv-expand subnets | project id, subnetName = subnets.name, subnetPrefix = subnets.properties.addressPrefix | extend subnetPrefixLength = split(subnetPrefix, '/')[1] | where subnetName == 'AzureFirewallSubnet' | extend compliant = (subnetPrefixLength == 26) | distinct id, compliant| summarize Total = count(), Success = countif(compliant==1), Failed = countif(compliant==0) | extend SuccessPercent = iff(Total==0, 100, 100*toint(Success)/toint(Total)) | extend FullyCompliant = iff(SuccessPercent == 100, 'Yes', 'No') | project Query1Stats=tostring(pack_all())\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\"\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query19FullyCompliant\",\n \"type\": 1,\n \"query\": \"{\\\"version\\\":\\\"1.0.0\\\",\\\"content\\\":\\\"{\\\\\\\"value\\\\\\\": \\\\\\\"{Query19Stats:$.FullyCompliant}\\\\\\\"}\\\",\\\"transformers\\\":null}\",\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 8\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query20Stats\",\n \"type\": 1,\n \"query\": \"resources | where type =~ 'microsoft.network/virtualnetworks' | project id,resourceGroup,name,subnets = properties.subnets | mv-expand subnets | project id = subnets.id, resourceGroup, VNet = name, serviceEndpoints = subnets.properties.serviceEndpoints, compliant = (isnull(subnets.properties.serviceEndpoints) or array_length(subnets.properties.serviceEndpoints) == 0) | order by compliant asc| summarize Total = count(), Success = countif(compliant==1), Failed = countif(compliant==0) | extend SuccessPercent = iff(Total==0, 100, 100*toint(Success)/toint(Total)) | extend FullyCompliant = iff(SuccessPercent == 100, 'Yes', 'No') | project Query1Stats=tostring(pack_all())\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\"\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query20FullyCompliant\",\n \"type\": 1,\n \"query\": \"{\\\"version\\\":\\\"1.0.0\\\",\\\"content\\\":\\\"{\\\\\\\"value\\\\\\\": \\\\\\\"{Query20Stats:$.FullyCompliant}\\\\\\\"}\\\",\\\"transformers\\\":null}\",\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 8\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query21Stats\",\n \"type\": 1,\n \"query\": \"resources | where type=='microsoft.network/virtualnetworks' | project id,subnets=properties.subnets | mv-expand subnets | project id, subnetName = subnets.name, subnetPrefix = subnets.properties.addressPrefix | extend subnetPrefixLength = split(subnetPrefix, '/')[1] | where subnetName == 'GatewaySubnet' | extend compliant = (subnetPrefixLength <= 27) | distinct id, compliant| summarize Total = count(), Success = countif(compliant==1), Failed = countif(compliant==0) | extend SuccessPercent = iff(Total==0, 100, 100*toint(Success)/toint(Total)) | extend FullyCompliant = iff(SuccessPercent == 100, 'Yes', 'No') | project Query1Stats=tostring(pack_all())\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\"\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query21FullyCompliant\",\n \"type\": 1,\n \"query\": \"{\\\"version\\\":\\\"1.0.0\\\",\\\"content\\\":\\\"{\\\\\\\"value\\\\\\\": \\\\\\\"{Query21Stats:$.FullyCompliant}\\\\\\\"}\\\",\\\"transformers\\\":null}\",\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 8\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query22Stats\",\n \"type\": 1,\n \"query\": \"resources | where type=='microsoft.network/networksecuritygroups' | mvexpand properties.securityRules | project id,name,ruleAction=properties_securityRules.properties.access,rulePriority=properties_securityRules.properties.priority,ruleDst=properties_securityRules.properties.destinationAddressPrefix,ruleSrc=properties_securityRules.properties.sourceAddressPrefix,ruleProt=properties_securityRules.properties.protocol,ruleDirection=properties_securityRules.properties.direction,rulePort=properties_securityRules.properties.destinationPortRange | summarize StarDenies=countif(ruleAction=='Deny' and ruleDst=='*' and ruleSrc=='*' and ruleProt=='*' and rulePort=='*') by id,tostring(ruleDirection) | where ruleDirection == 'Inbound' | project id,compliant=(StarDenies>0) | union (resources | where type=='microsoft.network/networksecuritygroups' | where array_length(properties.securityRules)==0 | extend compliant=false | project id,compliant)| summarize Total = count(), Success = countif(compliant==1), Failed = countif(compliant==0) | extend SuccessPercent = iff(Total==0, 100, 100*toint(Success)/toint(Total)) | extend FullyCompliant = iff(SuccessPercent == 100, 'Yes', 'No') | project Query1Stats=tostring(pack_all())\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\"\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query22FullyCompliant\",\n \"type\": 1,\n \"query\": \"{\\\"version\\\":\\\"1.0.0\\\",\\\"content\\\":\\\"{\\\\\\\"value\\\\\\\": \\\\\\\"{Query22Stats:$.FullyCompliant}\\\\\\\"}\\\",\\\"transformers\\\":null}\",\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 8\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query23Stats\",\n \"type\": 1,\n \"query\": \"resources | where type == 'microsoft.network/networksecuritygroups' | project id, rules = array_length(properties.securityRules) | project id, compliant = (rules < 900)| summarize Total = count(), Success = countif(compliant==1), Failed = countif(compliant==0) | extend SuccessPercent = iff(Total==0, 100, 100*toint(Success)/toint(Total)) | extend FullyCompliant = iff(SuccessPercent == 100, 'Yes', 'No') | project Query1Stats=tostring(pack_all())\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\"\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query23FullyCompliant\",\n \"type\": 1,\n \"query\": \"{\\\"version\\\":\\\"1.0.0\\\",\\\"content\\\":\\\"{\\\\\\\"value\\\\\\\": \\\\\\\"{Query23Stats:$.FullyCompliant}\\\\\\\"}\\\",\\\"transformers\\\":null}\",\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 8\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query24Stats\",\n \"type\": 1,\n \"query\": \"resources | where type=='microsoft.network/virtualhubs' | extend compliant = isnotnull(properties.azureFirewall.id) | project id, compliant| summarize Total = count(), Success = countif(compliant==1), Failed = countif(compliant==0) | extend SuccessPercent = iff(Total==0, 100, 100*toint(Success)/toint(Total)) | extend FullyCompliant = iff(SuccessPercent == 100, 'Yes', 'No') | project Query1Stats=tostring(pack_all())\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\"\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query24FullyCompliant\",\n \"type\": 1,\n \"query\": \"{\\\"version\\\":\\\"1.0.0\\\",\\\"content\\\":\\\"{\\\\\\\"value\\\\\\\": \\\\\\\"{Query24Stats:$.FullyCompliant}\\\\\\\"}\\\",\\\"transformers\\\":null}\",\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 8\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Tab0Success\",\n \"type\": 1,\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"criteriaData\": [\n {\n \"criteriaContext\": {\n \"operator\": \"Default\",\n \"resultValType\": \"expression\",\n \"resultVal\": \"{Query0Stats:$.Success}+{Query1Stats:$.Success}+{Query2Stats:$.Success}+{Query3Stats:$.Success}\"\n }\n }\n ]\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Tab0Total\",\n \"type\": 1,\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"criteriaData\": [\n {\n \"criteriaContext\": {\n \"operator\": \"Default\",\n \"resultValType\": \"expression\",\n \"resultVal\": \"{Query0Stats:$.Total}+{Query1Stats:$.Total}+{Query2Stats:$.Total}+{Query3Stats:$.Total}\"\n }\n }\n ]\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Tab0Percent\",\n \"type\": 1,\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"criteriaData\": [\n {\n \"criteriaContext\": {\n \"operator\": \"Default\",\n \"resultValType\": \"expression\",\n \"resultVal\": \"round(100*{Tab0Success}/{Tab0Total})\"\n }\n }\n ]\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Tab1Success\",\n \"type\": 1,\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"criteriaData\": [\n {\n \"criteriaContext\": {\n \"operator\": \"Default\",\n \"resultValType\": \"expression\",\n \"resultVal\": \"{Query24Stats:$.Success}\"\n }\n }\n ]\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Tab1Total\",\n \"type\": 1,\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"criteriaData\": [\n {\n \"criteriaContext\": {\n \"operator\": \"Default\",\n \"resultValType\": \"expression\",\n \"resultVal\": \"{Query24Stats:$.Total}\"\n }\n }\n ]\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Tab1Percent\",\n \"type\": 1,\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"criteriaData\": [\n {\n \"criteriaContext\": {\n \"operator\": \"Default\",\n \"resultValType\": \"expression\",\n \"resultVal\": \"round(100*{Tab1Success}/{Tab1Total})\"\n }\n }\n ]\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Tab2Success\",\n \"type\": 1,\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"criteriaData\": [\n {\n \"criteriaContext\": {\n \"operator\": \"Default\",\n \"resultValType\": \"expression\",\n \"resultVal\": \"{Query6Stats:$.Success}\"\n }\n }\n ]\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Tab2Total\",\n \"type\": 1,\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"criteriaData\": [\n {\n \"criteriaContext\": {\n \"operator\": \"Default\",\n \"resultValType\": \"expression\",\n \"resultVal\": \"{Query6Stats:$.Total}\"\n }\n }\n ]\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Tab2Percent\",\n \"type\": 1,\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"criteriaData\": [\n {\n \"criteriaContext\": {\n \"operator\": \"Default\",\n \"resultValType\": \"expression\",\n \"resultVal\": \"round(100*{Tab2Success}/{Tab2Total})\"\n }\n }\n ]\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Tab3Success\",\n \"type\": 1,\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"criteriaData\": [\n {\n \"criteriaContext\": {\n \"operator\": \"Default\",\n \"resultValType\": \"expression\",\n \"resultVal\": \"{Query14Stats:$.Success}+{Query15Stats:$.Success}+{Query16Stats:$.Success}+{Query17Stats:$.Success}+{Query18Stats:$.Success}\"\n }\n }\n ]\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Tab3Total\",\n \"type\": 1,\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"criteriaData\": [\n {\n \"criteriaContext\": {\n \"operator\": \"Default\",\n \"resultValType\": \"expression\",\n \"resultVal\": \"{Query14Stats:$.Total}+{Query15Stats:$.Total}+{Query16Stats:$.Total}+{Query17Stats:$.Total}+{Query18Stats:$.Total}\"\n }\n }\n ]\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Tab3Percent\",\n \"type\": 1,\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"criteriaData\": [\n {\n \"criteriaContext\": {\n \"operator\": \"Default\",\n \"resultValType\": \"expression\",\n \"resultVal\": \"round(100*{Tab3Success}/{Tab3Total})\"\n }\n }\n ]\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Tab4Success\",\n \"type\": 1,\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"criteriaData\": [\n {\n \"criteriaContext\": {\n \"operator\": \"Default\",\n \"resultValType\": \"expression\",\n \"resultVal\": \"{Query7Stats:$.Success}+{Query8Stats:$.Success}+{Query9Stats:$.Success}+{Query10Stats:$.Success}+{Query11Stats:$.Success}+{Query12Stats:$.Success}+{Query13Stats:$.Success}\"\n }\n }\n ]\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Tab4Total\",\n \"type\": 1,\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"criteriaData\": [\n {\n \"criteriaContext\": {\n \"operator\": \"Default\",\n \"resultValType\": \"expression\",\n \"resultVal\": \"{Query7Stats:$.Total}+{Query8Stats:$.Total}+{Query9Stats:$.Total}+{Query10Stats:$.Total}+{Query11Stats:$.Total}+{Query12Stats:$.Total}+{Query13Stats:$.Total}\"\n }\n }\n ]\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Tab4Percent\",\n \"type\": 1,\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"criteriaData\": [\n {\n \"criteriaContext\": {\n \"operator\": \"Default\",\n \"resultValType\": \"expression\",\n \"resultVal\": \"round(100*{Tab4Success}/{Tab4Total})\"\n }\n }\n ]\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Tab5Success\",\n \"type\": 1,\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"criteriaData\": [\n {\n \"criteriaContext\": {\n \"operator\": \"Default\",\n \"resultValType\": \"expression\",\n \"resultVal\": \"{Query19Stats:$.Success}+{Query21Stats:$.Success}+{Query22Stats:$.Success}+{Query23Stats:$.Success}\"\n }\n }\n ]\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Tab5Total\",\n \"type\": 1,\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"criteriaData\": [\n {\n \"criteriaContext\": {\n \"operator\": \"Default\",\n \"resultValType\": \"expression\",\n \"resultVal\": \"{Query19Stats:$.Total}+{Query21Stats:$.Total}+{Query22Stats:$.Total}+{Query23Stats:$.Total}\"\n }\n }\n ]\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Tab5Percent\",\n \"type\": 1,\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"criteriaData\": [\n {\n \"criteriaContext\": {\n \"operator\": \"Default\",\n \"resultValType\": \"expression\",\n \"resultVal\": \"round(100*{Tab5Success}/{Tab5Total})\"\n }\n }\n ]\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Tab6Success\",\n \"type\": 1,\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"criteriaData\": [\n {\n \"criteriaContext\": {\n \"operator\": \"Default\",\n \"resultValType\": \"expression\",\n \"resultVal\": \"{Query4Stats:$.Success}+{Query5Stats:$.Success}\"\n }\n }\n ]\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Tab6Total\",\n \"type\": 1,\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"criteriaData\": [\n {\n \"criteriaContext\": {\n \"operator\": \"Default\",\n \"resultValType\": \"expression\",\n \"resultVal\": \"{Query4Stats:$.Total}+{Query5Stats:$.Total}\"\n }\n }\n ]\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Tab6Percent\",\n \"type\": 1,\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"criteriaData\": [\n {\n \"criteriaContext\": {\n \"operator\": \"Default\",\n \"resultValType\": \"expression\",\n \"resultVal\": \"round(100*{Tab6Success}/{Tab6Total})\"\n }\n }\n ]\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Tab7Success\",\n \"type\": 1,\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"criteriaData\": [\n {\n \"criteriaContext\": {\n \"operator\": \"Default\",\n \"resultValType\": \"expression\",\n \"resultVal\": \"{Query20Stats:$.Success}\"\n }\n }\n ]\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Tab7Total\",\n \"type\": 1,\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"criteriaData\": [\n {\n \"criteriaContext\": {\n \"operator\": \"Default\",\n \"resultValType\": \"expression\",\n \"resultVal\": \"{Query20Stats:$.Total}\"\n }\n }\n ]\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Tab7Percent\",\n \"type\": 1,\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"criteriaData\": [\n {\n \"criteriaContext\": {\n \"operator\": \"Default\",\n \"resultValType\": \"expression\",\n \"resultVal\": \"round(100*{Tab7Success}/{Tab7Total})\"\n }\n }\n ]\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"WorkbookTotal\",\n \"type\": 1,\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"criteriaData\": [\n {\n \"criteriaContext\": {\n \"operator\": \"Default\",\n \"resultValType\": \"expression\",\n \"resultVal\": \"{Query0Stats:$.Total}+{Query1Stats:$.Total}+{Query2Stats:$.Total}+{Query3Stats:$.Total}+{Query24Stats:$.Total}+{Query6Stats:$.Total}+{Query14Stats:$.Total}+{Query15Stats:$.Total}+{Query16Stats:$.Total}+{Query17Stats:$.Total}+{Query18Stats:$.Total}+{Query7Stats:$.Total}+{Query8Stats:$.Total}+{Query9Stats:$.Total}+{Query10Stats:$.Total}+{Query11Stats:$.Total}+{Query12Stats:$.Total}+{Query13Stats:$.Total}+{Query19Stats:$.Total}+{Query21Stats:$.Total}+{Query22Stats:$.Total}+{Query23Stats:$.Total}+{Query4Stats:$.Total}+{Query5Stats:$.Total}+{Query20Stats:$.Total}\"\n }\n }\n ]\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"WorkbookSuccess\",\n \"type\": 1,\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"criteriaData\": [\n {\n \"criteriaContext\": {\n \"operator\": \"Default\",\n \"resultValType\": \"expression\",\n \"resultVal\": \"{Query0Stats:$.Success}+{Query1Stats:$.Success}+{Query2Stats:$.Success}+{Query3Stats:$.Success}+{Query24Stats:$.Success}+{Query6Stats:$.Success}+{Query14Stats:$.Success}+{Query15Stats:$.Success}+{Query16Stats:$.Success}+{Query17Stats:$.Success}+{Query18Stats:$.Success}+{Query7Stats:$.Success}+{Query8Stats:$.Success}+{Query9Stats:$.Success}+{Query10Stats:$.Success}+{Query11Stats:$.Success}+{Query12Stats:$.Success}+{Query13Stats:$.Success}+{Query19Stats:$.Success}+{Query21Stats:$.Success}+{Query22Stats:$.Success}+{Query23Stats:$.Success}+{Query4Stats:$.Success}+{Query5Stats:$.Success}+{Query20Stats:$.Success}\"\n }\n }\n ]\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"WorkbookPercent\",\n \"type\": 1,\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"criteriaData\": [\n {\n \"criteriaContext\": {\n \"operator\": \"Default\",\n \"resultValType\": \"expression\",\n \"resultVal\": \"round(100*{WorkbookSuccess}/{WorkbookTotal})\"\n }\n }\n ]\n }\n ],\n \"style\": \"pills\",\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\"\n },\n \"name\": \"InvisibleParameters\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"## Azure Landing Zone Review - Network\\n\\n---\\n\\nThis workbook has been automatically generated out of the checklists in the [Azure Review Checklists repo](https://github.com/Azure/review-checklists). This repo contains best practices and recommendations around generic Landing Zones as well as specific services such as Azure Virtual Desktop, Azure Kubernetes Service or Azure VMware Solution, to name a few. This repository of best practices is curated by Azure engineers, but open to anybody to contribute.\\n\\nIf you see a problem in the queries that are part of this workbook, please open a Github issue [here](https://github.com/Azure/review-checklists/issues/new).\"\n },\n \"customWidth\": \"50\",\n \"name\": \"MarkdownHeader\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"{\\\"version\\\":\\\"1.0.0\\\",\\\"content\\\":\\\"{\\\\\\\"WorkbookPercent\\\\\\\": \\\\\\\"{WorkbookPercent}\\\\\\\", \\\\\\\"SubTitle\\\\\\\": \\\\\\\"Percent of successful checks\\\\\\\"}\\\",\\\"transformers\\\":null}\",\n \"size\": 4,\n \"queryType\": 8,\n \"visualization\": \"tiles\",\n \"tileSettings\": {\n \"titleContent\": {\n \"columnMatch\": \"WorkbookPercent\",\n \"formatter\": 4,\n \"formatOptions\": {\n \"min\": 0,\n \"max\": 100,\n \"palette\": \"redGreen\"\n }\n },\n \"subtitleContent\": {\n \"columnMatch\": \"SubTitle\",\n \"formatter\": 1\n },\n \"showBorder\": true\n }\n },\n \"customWidth\": \"50\",\n \"name\": \"ProgressTile\"\n },\n {\n \"type\": 11,\n \"content\": {\n \"version\": \"LinkItem/1.0\",\n \"style\": \"tabs\",\n \"links\": [\n {\n \"id\": \"f75f8d7f-5d09-4f91-a404-46927ad56971\",\n \"cellValue\": \"VisibleTab\",\n \"linkTarget\": \"parameter\",\n \"linkLabel\": \"Hub and spoke ({Tab0Success:value}/{Tab0Total:value})\",\n \"subTarget\": \"tab0\",\n \"preText\": \"Hub and spoke\",\n \"style\": \"primary\"\n },\n {\n \"id\": \"3bfd864a-a233-4879-a2e0-cf93a2314784\",\n \"cellValue\": \"VisibleTab\",\n \"linkTarget\": \"parameter\",\n \"linkLabel\": \"Virtual WAN ({Tab1Success:value}/{Tab1Total:value})\",\n \"subTarget\": \"tab1\",\n \"preText\": \"Virtual WAN\",\n \"style\": \"primary\"\n },\n {\n \"id\": \"5066dfc2-29a4-4cd6-bc73-c42375f5202e\",\n \"cellValue\": \"VisibleTab\",\n \"linkTarget\": \"parameter\",\n \"linkLabel\": \"Internet ({Tab2Success:value}/{Tab2Total:value})\",\n \"subTarget\": \"tab2\",\n \"preText\": \"Internet\",\n \"style\": \"primary\"\n },\n {\n \"id\": \"d5f37c45-5b55-4f28-b2f5-a8875ca0ae3e\",\n \"cellValue\": \"VisibleTab\",\n \"linkTarget\": \"parameter\",\n \"linkLabel\": \"Firewall ({Tab3Success:value}/{Tab3Total:value})\",\n \"subTarget\": \"tab3\",\n \"preText\": \"Firewall\",\n \"style\": \"primary\"\n },\n {\n \"id\": \"01b600ce-86dc-4e27-a3cb-91233288117f\",\n \"cellValue\": \"VisibleTab\",\n \"linkTarget\": \"parameter\",\n \"linkLabel\": \"Hybrid ({Tab4Success:value}/{Tab4Total:value})\",\n \"subTarget\": \"tab4\",\n \"preText\": \"Hybrid\",\n \"style\": \"primary\"\n },\n {\n \"id\": \"bdbbe1a8-2d25-4b5a-8c2d-ac374051534a\",\n \"cellValue\": \"VisibleTab\",\n \"linkTarget\": \"parameter\",\n \"linkLabel\": \"Segmentation ({Tab5Success:value}/{Tab5Total:value})\",\n \"subTarget\": \"tab5\",\n \"preText\": \"Segmentation\",\n \"style\": \"primary\"\n },\n {\n \"id\": \"d0c3b52b-e070-4729-8990-1f2cf6464ad8\",\n \"cellValue\": \"VisibleTab\",\n \"linkTarget\": \"parameter\",\n \"linkLabel\": \"IP plan ({Tab6Success:value}/{Tab6Total:value})\",\n \"subTarget\": \"tab6\",\n \"preText\": \"IP plan\",\n \"style\": \"primary\"\n },\n {\n \"id\": \"13c80d9c-4286-4014-9be5-84d919d27e03\",\n \"cellValue\": \"VisibleTab\",\n \"linkTarget\": \"parameter\",\n \"linkLabel\": \"PaaS ({Tab7Success:value}/{Tab7Total:value})\",\n \"subTarget\": \"tab7\",\n \"preText\": \"PaaS\",\n \"style\": \"primary\"\n }\n ]\n },\n \"name\": \"Tabs\"\n },\n {\n \"type\": 12,\n \"content\": {\n \"version\": \"NotebookGroup/1.0\",\n \"groupType\": \"editable\",\n \"items\": [\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"## Hub and spoke\"\n },\n \"name\": \"tab0title\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"If using Route Server, use a /27 prefix for the Route Server subnet. Check [this link](https://learn.microsoft.com/azure/route-server/quickstart-configure-route-server-portal#create-a-route-server-1) for further information.\"\n },\n \"name\": \"querytext0\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"resources | where type=='microsoft.network/virtualnetworks' | project id,subnets=properties.subnets | mv-expand subnets | project id, subnetName = subnets.name, subnetPrefix = subnets.properties.addressPrefix | extend subnetPrefixLength = split(subnetPrefix, '/')[1] | where subnetName == 'RouteServerSubnet' | extend compliant = (subnetPrefixLength <= 27) | distinct id, compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed\",\n \"size\": 4,\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"gridSettings\": {\n \"formatters\": [\n {\n \"columnMatch\": \"id\",\n \"formatter\": 0,\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n {\n \"columnMatch\": \"compliant\",\n \"formatter\": 18,\n \"formatOptions\": {\n \"thresholdsOptions\": \"icons\",\n \"thresholdsGrid\": [\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"1\",\n \"representation\": \"success\",\n \"text\": \"Success\"\n },\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"0\",\n \"representation\": \"failed\",\n \"text\": \"Failed\"\n },\n {\n \"operator\": \"Default\",\n \"thresholdValue\": null,\n \"representation\": \"unknown\",\n \"text\": \"Unknown\"\n }\n ]\n }\n }\n ]\n }\n },\n \"name\": \"query0\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"If you have more than 400 spoke networks in a region, deploy an additional hub to bypass VNet peering limits (500) and the maximum number of prefixes that can be advertised via ExpressRoute (1000). Check [this link](https://learn.microsoft.com/azure/azure-resource-manager/management/azure-subscription-service-limits?toc=/azure/virtual-network/toc.json#azure-resource-manager-virtual-networking-limits) for further information.\"\n },\n \"name\": \"querytext1\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"resources | where type == 'microsoft.network/virtualnetworks' | mvexpand properties.virtualNetworkPeerings | summarize peeringcount = count() by id | extend compliant = (peeringcount < 450) | distinct id,compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed\",\n \"size\": 4,\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"gridSettings\": {\n \"formatters\": [\n {\n \"columnMatch\": \"id\",\n \"formatter\": 0,\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n {\n \"columnMatch\": \"compliant\",\n \"formatter\": 18,\n \"formatOptions\": {\n \"thresholdsOptions\": \"icons\",\n \"thresholdsGrid\": [\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"1\",\n \"representation\": \"success\",\n \"text\": \"Success\"\n },\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"0\",\n \"representation\": \"failed\",\n \"text\": \"Failed\"\n },\n {\n \"operator\": \"Default\",\n \"thresholdValue\": null,\n \"representation\": \"unknown\",\n \"text\": \"Unknown\"\n }\n ]\n }\n }\n ]\n }\n },\n \"name\": \"query1\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"Limit the number of routes per route table to 400. Check [this link](https://learn.microsoft.com/azure/azure-resource-manager/management/azure-subscription-service-limits?toc=/azure/virtual-network/toc.json#azure-resource-manager-virtual-networking-limits) for further information.\"\n },\n \"name\": \"querytext2\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"resources | where type=='microsoft.network/routetables' | mvexpand properties.routes | summarize routeCount = count() by id | extend compliant = (routeCount < 360) | distinct id,compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed\",\n \"size\": 4,\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"gridSettings\": {\n \"formatters\": [\n {\n \"columnMatch\": \"id\",\n \"formatter\": 0,\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n {\n \"columnMatch\": \"compliant\",\n \"formatter\": 18,\n \"formatOptions\": {\n \"thresholdsOptions\": \"icons\",\n \"thresholdsGrid\": [\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"1\",\n \"representation\": \"success\",\n \"text\": \"Success\"\n },\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"0\",\n \"representation\": \"failed\",\n \"text\": \"Failed\"\n },\n {\n \"operator\": \"Default\",\n \"thresholdValue\": null,\n \"representation\": \"unknown\",\n \"text\": \"Unknown\"\n }\n ]\n }\n }\n ]\n }\n },\n \"name\": \"query2\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"Use the setting 'Allow traffic to remote virtual network' when configuring VNet peerings. Check [this link](https://learn.microsoft.com/azure/virtual-network/virtual-network-manage-peering) for further information.\"\n },\n \"name\": \"querytext3\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"resources | where type == 'microsoft.network/virtualnetworks' | mvexpand properties.virtualNetworkPeerings | project id, peeringName=properties_virtualNetworkPeerings.name, compliant = (properties_virtualNetworkPeerings.properties.allowVirtualNetworkAccess == True) | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed\",\n \"size\": 4,\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"gridSettings\": {\n \"formatters\": [\n {\n \"columnMatch\": \"id\",\n \"formatter\": 0,\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n {\n \"columnMatch\": \"compliant\",\n \"formatter\": 18,\n \"formatOptions\": {\n \"thresholdsOptions\": \"icons\",\n \"thresholdsGrid\": [\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"1\",\n \"representation\": \"success\",\n \"text\": \"Success\"\n },\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"0\",\n \"representation\": \"failed\",\n \"text\": \"Failed\"\n },\n {\n \"operator\": \"Default\",\n \"thresholdValue\": null,\n \"representation\": \"unknown\",\n \"text\": \"Unknown\"\n }\n ]\n }\n }\n ]\n }\n },\n \"name\": \"query3\"\n }\n ]\n },\n \"conditionalVisibility\": {\n \"parameterName\": \"VisibleTab\",\n \"comparison\": \"isEqualTo\",\n \"value\": \"tab0\"\n },\n \"name\": \"tab0\"\n },\n {\n \"type\": 12,\n \"content\": {\n \"version\": \"NotebookGroup/1.0\",\n \"groupType\": \"editable\",\n \"items\": [\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"## Virtual WAN\"\n },\n \"name\": \"tab1title\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"For outbound Internet traffic protection and filtering, deploy Azure Firewall in secured hubs. Check [this link](https://learn.microsoft.com/azure/virtual-wan/howto-firewall) for further information.. [This training](https://learn.microsoft.com/learn/paths/secure-networking-infrastructure/) can help to educate yourself on this.\"\n },\n \"name\": \"querytext24\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"resources | where type=='microsoft.network/virtualhubs' | extend compliant = isnotnull(properties.azureFirewall.id) | project id, compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed\",\n \"size\": 4,\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"gridSettings\": {\n \"formatters\": [\n {\n \"columnMatch\": \"id\",\n \"formatter\": 0,\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n {\n \"columnMatch\": \"compliant\",\n \"formatter\": 18,\n \"formatOptions\": {\n \"thresholdsOptions\": \"icons\",\n \"thresholdsGrid\": [\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"1\",\n \"representation\": \"success\",\n \"text\": \"Success\"\n },\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"0\",\n \"representation\": \"failed\",\n \"text\": \"Failed\"\n },\n {\n \"operator\": \"Default\",\n \"thresholdValue\": null,\n \"representation\": \"unknown\",\n \"text\": \"Unknown\"\n }\n ]\n }\n }\n ]\n }\n },\n \"name\": \"query24\"\n }\n ]\n },\n \"conditionalVisibility\": {\n \"parameterName\": \"VisibleTab\",\n \"comparison\": \"isEqualTo\",\n \"value\": \"tab1\"\n },\n \"name\": \"tab1\"\n },\n {\n \"type\": 12,\n \"content\": {\n \"version\": \"NotebookGroup/1.0\",\n \"groupType\": \"editable\",\n \"items\": [\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"## Internet\"\n },\n \"name\": \"tab2title\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"Use Azure Bastion in a subnet /26 or larger. Check [this link](https://learn.microsoft.com/azure/bastion/bastion-faq#subnet) for further information.\"\n },\n \"name\": \"querytext6\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"resources | where type=='microsoft.network/virtualnetworks' | project id,subnets=properties.subnets | mv-expand subnets | project id, subnetName = subnets.name, subnetPrefix = subnets.properties.addressPrefix | extend subnetPrefixLength = split(subnetPrefix, '/')[1] | where subnetName == 'AzureBastionSubnet' | extend compliant = (subnetPrefixLength <= 26) | distinct id, compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed\",\n \"size\": 4,\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"gridSettings\": {\n \"formatters\": [\n {\n \"columnMatch\": \"id\",\n \"formatter\": 0,\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n {\n \"columnMatch\": \"compliant\",\n \"formatter\": 18,\n \"formatOptions\": {\n \"thresholdsOptions\": \"icons\",\n \"thresholdsGrid\": [\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"1\",\n \"representation\": \"success\",\n \"text\": \"Success\"\n },\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"0\",\n \"representation\": \"failed\",\n \"text\": \"Failed\"\n },\n {\n \"operator\": \"Default\",\n \"thresholdValue\": null,\n \"representation\": \"unknown\",\n \"text\": \"Unknown\"\n }\n ]\n }\n }\n ]\n }\n },\n \"name\": \"query6\"\n }\n ]\n },\n \"conditionalVisibility\": {\n \"parameterName\": \"VisibleTab\",\n \"comparison\": \"isEqualTo\",\n \"value\": \"tab2\"\n },\n \"name\": \"tab2\"\n },\n {\n \"type\": 12,\n \"content\": {\n \"version\": \"NotebookGroup/1.0\",\n \"groupType\": \"editable\",\n \"items\": [\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"## Firewall\"\n },\n \"name\": \"tab3title\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"Use application rules to filter outbound traffic on destination host name for supported protocols. Use FQDN-based network rules and Azure Firewall with DNS proxy to filter egress traffic to the Internet over other protocols. Check [this link](https://learn.microsoft.com/azure/firewall/fqdn-filtering-network-rules) for further information.\"\n },\n \"name\": \"querytext14\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"resources | where type=='microsoft.network/firewallpolicies' | extend compliant = (properties.dnsSettings.enableProxy == true) | distinct id,compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed\",\n \"size\": 4,\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"gridSettings\": {\n \"formatters\": [\n {\n \"columnMatch\": \"id\",\n \"formatter\": 0,\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n {\n \"columnMatch\": \"compliant\",\n \"formatter\": 18,\n \"formatOptions\": {\n \"thresholdsOptions\": \"icons\",\n \"thresholdsGrid\": [\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"1\",\n \"representation\": \"success\",\n \"text\": \"Success\"\n },\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"0\",\n \"representation\": \"failed\",\n \"text\": \"Failed\"\n },\n {\n \"operator\": \"Default\",\n \"thresholdValue\": null,\n \"representation\": \"unknown\",\n \"text\": \"Unknown\"\n }\n ]\n }\n }\n ]\n }\n },\n \"name\": \"query14\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"Use Azure Firewall Premium to enable additional security features. Check [this link](https://learn.microsoft.com/azure/firewall/premium-features) for further information.\"\n },\n \"name\": \"querytext15\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"resources | where type=='microsoft.network/firewallpolicies' | extend compliant = (properties.sku.tier == 'Premium') | distinct id,compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed\",\n \"size\": 4,\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"gridSettings\": {\n \"formatters\": [\n {\n \"columnMatch\": \"id\",\n \"formatter\": 0,\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n {\n \"columnMatch\": \"compliant\",\n \"formatter\": 18,\n \"formatOptions\": {\n \"thresholdsOptions\": \"icons\",\n \"thresholdsGrid\": [\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"1\",\n \"representation\": \"success\",\n \"text\": \"Success\"\n },\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"0\",\n \"representation\": \"failed\",\n \"text\": \"Failed\"\n },\n {\n \"operator\": \"Default\",\n \"thresholdValue\": null,\n \"representation\": \"unknown\",\n \"text\": \"Unknown\"\n }\n ]\n }\n }\n ]\n }\n },\n \"name\": \"query15\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"Configure Azure Firewall Threat Intelligence mode to Alert and Deny for additional protection. Check [this link](https://learn.microsoft.com/azure/firewall/premium-features#idps-signature-rules) for further information.\"\n },\n \"name\": \"querytext16\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"resources | where type=='microsoft.network/firewallpolicies' | extend compliant = (properties.threatIntelMode == 'Deny') | distinct id,compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed\",\n \"size\": 4,\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"gridSettings\": {\n \"formatters\": [\n {\n \"columnMatch\": \"id\",\n \"formatter\": 0,\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n {\n \"columnMatch\": \"compliant\",\n \"formatter\": 18,\n \"formatOptions\": {\n \"thresholdsOptions\": \"icons\",\n \"thresholdsGrid\": [\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"1\",\n \"representation\": \"success\",\n \"text\": \"Success\"\n },\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"0\",\n \"representation\": \"failed\",\n \"text\": \"Failed\"\n },\n {\n \"operator\": \"Default\",\n \"thresholdValue\": null,\n \"representation\": \"unknown\",\n \"text\": \"Unknown\"\n }\n ]\n }\n }\n ]\n }\n },\n \"name\": \"query16\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"Configure Azure Firewall IDPS mode to Deny for additional protection. Check [this link](https://learn.microsoft.com/azure/firewall/premium-features#idps) for further information.\"\n },\n \"name\": \"querytext17\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"resources | where type=='microsoft.network/firewallpolicies' | extend compliant = (properties.intrusionDetection.mode == 'Deny') | project id, compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed\",\n \"size\": 4,\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"gridSettings\": {\n \"formatters\": [\n {\n \"columnMatch\": \"id\",\n \"formatter\": 0,\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n {\n \"columnMatch\": \"compliant\",\n \"formatter\": 18,\n \"formatOptions\": {\n \"thresholdsOptions\": \"icons\",\n \"thresholdsGrid\": [\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"1\",\n \"representation\": \"success\",\n \"text\": \"Success\"\n },\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"0\",\n \"representation\": \"failed\",\n \"text\": \"Failed\"\n },\n {\n \"operator\": \"Default\",\n \"thresholdValue\": null,\n \"representation\": \"unknown\",\n \"text\": \"Unknown\"\n }\n ]\n }\n }\n ]\n }\n },\n \"name\": \"query17\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"For subnets in VNets not connected to Virtual WAN, attach a route table so that Internet traffic is redirected to Azure Firewall or a Network Virtual Appliance. Check [this link](https://learn.microsoft.com/azure/virtual-network/virtual-networks-udr-overview) for further information.\"\n },\n \"name\": \"querytext18\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"resources | where type=='microsoft.network/virtualnetworks' | project id,resourceGroup,name,subnets=properties.subnets | mv-expand subnets | project id,name,subnetId=tostring(subnets.id), subnetName=tostring(subnets.name),subnetRT=subnets.properties.routeTable.id | where not (subnetName in ('GatewaySubnet', 'AzureFirewallSubnet', 'RouteServerSubnet', 'AzureBastionSubnet')) | extend hasRT = isnotnull(subnetRT) | distinct id, hasRT, subnetId | join kind=fullouter (resources | where type == 'microsoft.network/virtualnetworks' | mvexpand properties.virtualNetworkPeerings | extend isVWAN=(tolower(split(properties_virtualNetworkPeerings.name, '_')[0]) == 'remotevnettohubpeering') | mv-expand properties.subnets | project id, isVWAN, name, subnetId=tostring(properties_subnets.id), subnetName=tostring(properties_subnets.name) | summarize PeeredToVWAN=max(isVWAN) by id, subnetId | project id, subnetId, isVWANpeer = (PeeredToVWAN == true)) on subnetId | project id=iff(isnotempty(id), id, id1), subnetId=iff(isnotempty(subnetId), subnetId, subnetId1), hasRT, isVWANpeer | extend compliant = (hasRT==true or isVWANpeer==true) | distinct id, subnetId, compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed\",\n \"size\": 4,\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"gridSettings\": {\n \"formatters\": [\n {\n \"columnMatch\": \"id\",\n \"formatter\": 0,\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n {\n \"columnMatch\": \"compliant\",\n \"formatter\": 18,\n \"formatOptions\": {\n \"thresholdsOptions\": \"icons\",\n \"thresholdsGrid\": [\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"1\",\n \"representation\": \"success\",\n \"text\": \"Success\"\n },\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"0\",\n \"representation\": \"failed\",\n \"text\": \"Failed\"\n },\n {\n \"operator\": \"Default\",\n \"thresholdValue\": null,\n \"representation\": \"unknown\",\n \"text\": \"Unknown\"\n }\n ]\n }\n }\n ]\n }\n },\n \"name\": \"query18\"\n }\n ]\n },\n \"conditionalVisibility\": {\n \"parameterName\": \"VisibleTab\",\n \"comparison\": \"isEqualTo\",\n \"value\": \"tab3\"\n },\n \"name\": \"tab3\"\n },\n {\n \"type\": 12,\n \"content\": {\n \"version\": \"NotebookGroup/1.0\",\n \"groupType\": \"editable\",\n \"items\": [\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"## Hybrid\"\n },\n \"name\": \"tab4title\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"Select the right SKU for the ExpressRoute/VPN gateways based on bandwidth and performance requirements. Check [this link](https://learn.microsoft.com/azure/expressroute/expressroute-about-virtual-network-gateways?source=recommendations#gwsku) for further information.. [This training](https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/) can help to educate yourself on this.\"\n },\n \"name\": \"querytext7\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"resources| where type == 'microsoft.network/virtualnetworkgateways'| where properties.gatewayType =~ 'vpn' or properties.gatewayType == 'ExpressRoute'| extend SKUName = properties.sku.name, SKUTier = properties.sku.tier, Type = properties.gatewayType| extend compliant = SKUTier !in ('Basic', 'Standard')| project name, id, subscriptionId, resourceGroup, compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed\",\n \"size\": 4,\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"gridSettings\": {\n \"formatters\": [\n {\n \"columnMatch\": \"id\",\n \"formatter\": 0,\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n {\n \"columnMatch\": \"compliant\",\n \"formatter\": 18,\n \"formatOptions\": {\n \"thresholdsOptions\": \"icons\",\n \"thresholdsGrid\": [\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"1\",\n \"representation\": \"success\",\n \"text\": \"Success\"\n },\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"0\",\n \"representation\": \"failed\",\n \"text\": \"Failed\"\n },\n {\n \"operator\": \"Default\",\n \"thresholdValue\": null,\n \"representation\": \"unknown\",\n \"text\": \"Unknown\"\n }\n ]\n }\n }\n ]\n }\n },\n \"name\": \"query7\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"Ensure that you're using unlimited-data ExpressRoute circuits only if you reach the bandwidth that justifies their cost. Check [this link](https://learn.microsoft.com/azure/expressroute/plan-manage-cost) for further information.\"\n },\n \"name\": \"querytext8\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"resources | where type=='microsoft.network/expressroutecircuits' | extend compliant = (tolower(sku.family) == 'metereddata' or tolower(sku.tier) == 'local') | distinct id,compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed\",\n \"size\": 4,\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"gridSettings\": {\n \"formatters\": [\n {\n \"columnMatch\": \"id\",\n \"formatter\": 0,\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n {\n \"columnMatch\": \"compliant\",\n \"formatter\": 18,\n \"formatOptions\": {\n \"thresholdsOptions\": \"icons\",\n \"thresholdsGrid\": [\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"1\",\n \"representation\": \"success\",\n \"text\": \"Success\"\n },\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"0\",\n \"representation\": \"failed\",\n \"text\": \"Failed\"\n },\n {\n \"operator\": \"Default\",\n \"thresholdValue\": null,\n \"representation\": \"unknown\",\n \"text\": \"Unknown\"\n }\n ]\n }\n }\n ]\n }\n },\n \"name\": \"query8\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"Leverage the Local SKU of ExpressRoute to reduce the cost of your circuits, if your circuit peering location supports your Azure regions for the Local SKU. Check [this link](https://learn.microsoft.com/azure/expressroute/expressroute-faqs#expressroute-local) for further information.\"\n },\n \"name\": \"querytext9\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"resources | where type=='microsoft.network/connections' | where properties.connectionType == 'ExpressRoute' | project id, gwid=tostring(properties.virtualNetworkGateway1.id), circuitid=tostring(properties.peer.id) | join (resources | where type=='microsoft.network/expressroutecircuits' | project circuitid=tostring(id), circuitsku=sku.tier) on circuitid | project id=gwid, compliant = (circuitsku == 'Local') | summarize compliant=max(compliant) by id | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed\",\n \"size\": 4,\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"gridSettings\": {\n \"formatters\": [\n {\n \"columnMatch\": \"id\",\n \"formatter\": 0,\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n {\n \"columnMatch\": \"compliant\",\n \"formatter\": 18,\n \"formatOptions\": {\n \"thresholdsOptions\": \"icons\",\n \"thresholdsGrid\": [\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"1\",\n \"representation\": \"success\",\n \"text\": \"Success\"\n },\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"0\",\n \"representation\": \"failed\",\n \"text\": \"Failed\"\n },\n {\n \"operator\": \"Default\",\n \"thresholdValue\": null,\n \"representation\": \"unknown\",\n \"text\": \"Unknown\"\n }\n ]\n }\n }\n ]\n }\n },\n \"name\": \"query9\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"Deploy a zone-redundant ExpressRoute gateway in the supported Azure regions. Check [this link](https://learn.microsoft.com/azure/expressroute/expressroute-about-virtual-network-gateways) for further information.. [This training](https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/) can help to educate yourself on this.\"\n },\n \"name\": \"querytext10\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"resources| where type == 'microsoft.network/virtualnetworkgateways'| where properties.gatewayType =~ 'vpn' or properties.gatewayType == 'ExpressRoute'| extend SKUName = properties.sku.name, SKUTier = properties.sku.tier, Type = properties.gatewayType| extend compliant = SKUTier contains 'AZ'| project name, id, subscriptionId, resourceGroup, Type, compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed\",\n \"size\": 4,\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"gridSettings\": {\n \"formatters\": [\n {\n \"columnMatch\": \"id\",\n \"formatter\": 0,\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n {\n \"columnMatch\": \"compliant\",\n \"formatter\": 18,\n \"formatOptions\": {\n \"thresholdsOptions\": \"icons\",\n \"thresholdsGrid\": [\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"1\",\n \"representation\": \"success\",\n \"text\": \"Success\"\n },\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"0\",\n \"representation\": \"failed\",\n \"text\": \"Failed\"\n },\n {\n \"operator\": \"Default\",\n \"thresholdValue\": null,\n \"representation\": \"unknown\",\n \"text\": \"Unknown\"\n }\n ]\n }\n }\n ]\n }\n },\n \"name\": \"query10\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"Use zone-redundant VPN gateways to connect branches or remote locations to Azure (where available). Check [this link](https://learn.microsoft.com/azure/vpn-gateway/create-zone-redundant-vnet-gateway) for further information.. [This training](https://learn.microsoft.com/training/modules/intro-to-azure-vpn-gateway/) can help to educate yourself on this.\"\n },\n \"name\": \"querytext11\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"resources | where type=='microsoft.network/virtualnetworkgateways' | where properties.gatewayType == 'Vpn' | extend compliant = (tolower(properties.sku.name) contains 'az') | distinct id, compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed\",\n \"size\": 4,\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"gridSettings\": {\n \"formatters\": [\n {\n \"columnMatch\": \"id\",\n \"formatter\": 0,\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n {\n \"columnMatch\": \"compliant\",\n \"formatter\": 18,\n \"formatOptions\": {\n \"thresholdsOptions\": \"icons\",\n \"thresholdsGrid\": [\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"1\",\n \"representation\": \"success\",\n \"text\": \"Success\"\n },\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"0\",\n \"representation\": \"failed\",\n \"text\": \"Failed\"\n },\n {\n \"operator\": \"Default\",\n \"thresholdValue\": null,\n \"representation\": \"unknown\",\n \"text\": \"Unknown\"\n }\n ]\n }\n }\n ]\n }\n },\n \"name\": \"query11\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"Use ExpressRoute circuits from different peering locations for redundancy. Check [this link](https://learn.microsoft.com/azure/expressroute/designing-for-disaster-recovery-with-expressroute-privatepeering#need-for-redundant-connectivity-solution) for further information.. [This training](https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/) can help to educate yourself on this.\"\n },\n \"name\": \"querytext12\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"resources | where type=='microsoft.network/connections' | where properties.connectionType == 'ExpressRoute' | project cxId=id, gwId=tostring(properties.virtualNetworkGateway1.id), circuitId=tostring(properties.peer.id) | join (resources | where type=='microsoft.network/expressroutecircuits' | project circuitId=tostring(id), circuitLocation=tostring(properties.serviceProviderProperties.peeringLocation)) on circuitId | distinct gwId, circuitLocation | summarize countErLocations=count() by id=gwId | extend compliant = (countErLocations >= 2) | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed\",\n \"size\": 4,\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"gridSettings\": {\n \"formatters\": [\n {\n \"columnMatch\": \"id\",\n \"formatter\": 0,\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n {\n \"columnMatch\": \"compliant\",\n \"formatter\": 18,\n \"formatOptions\": {\n \"thresholdsOptions\": \"icons\",\n \"thresholdsGrid\": [\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"1\",\n \"representation\": \"success\",\n \"text\": \"Success\"\n },\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"0\",\n \"representation\": \"failed\",\n \"text\": \"Failed\"\n },\n {\n \"operator\": \"Default\",\n \"thresholdValue\": null,\n \"representation\": \"unknown\",\n \"text\": \"Unknown\"\n }\n ]\n }\n }\n ]\n }\n },\n \"name\": \"query12\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"If you are using a route table in the GatewaySubnet, make sure that gateway routes are propagated. Check [this link](https://learn.microsoft.com/azure/vpn-gateway/vpn-gateway-about-vpn-gateway-settings#gwsub) for further information.\"\n },\n \"name\": \"querytext13\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"resources | where type=='microsoft.network/virtualnetworks' | project id,resourceGroup,name,subnets=properties.subnets | mv-expand subnets | project id,resourceGroup,name,subnetName=tostring(subnets.name),routeTableId=tostring(subnets.properties.routeTable.id) | where subnetName == 'GatewaySubnet' | join kind=leftouter (Resources | where type == 'microsoft.network/routetables' | project routeTableName=name,routeTableId=id, disableBgpRoutePropagation=properties.disableBgpRoutePropagation) on routeTableId | project id,compliant = (disableBgpRoutePropagation == False or isnull(disableBgpRoutePropagation)) | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed\",\n \"size\": 4,\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"gridSettings\": {\n \"formatters\": [\n {\n \"columnMatch\": \"id\",\n \"formatter\": 0,\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n {\n \"columnMatch\": \"compliant\",\n \"formatter\": 18,\n \"formatOptions\": {\n \"thresholdsOptions\": \"icons\",\n \"thresholdsGrid\": [\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"1\",\n \"representation\": \"success\",\n \"text\": \"Success\"\n },\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"0\",\n \"representation\": \"failed\",\n \"text\": \"Failed\"\n },\n {\n \"operator\": \"Default\",\n \"thresholdValue\": null,\n \"representation\": \"unknown\",\n \"text\": \"Unknown\"\n }\n ]\n }\n }\n ]\n }\n },\n \"name\": \"query13\"\n }\n ]\n },\n \"conditionalVisibility\": {\n \"parameterName\": \"VisibleTab\",\n \"comparison\": \"isEqualTo\",\n \"value\": \"tab4\"\n },\n \"name\": \"tab4\"\n },\n {\n \"type\": 12,\n \"content\": {\n \"version\": \"NotebookGroup/1.0\",\n \"groupType\": \"editable\",\n \"items\": [\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"## Segmentation\"\n },\n \"name\": \"tab5title\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"Use a /26 prefix for your Azure Firewall subnets. Check [this link](https://learn.microsoft.com/azure/firewall/firewall-faq#why-does-azure-firewall-need-a--26-subnet-size) for further information.\"\n },\n \"name\": \"querytext19\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"resources | where type=='microsoft.network/virtualnetworks' | project id,subnets=properties.subnets | mv-expand subnets | project id, subnetName = subnets.name, subnetPrefix = subnets.properties.addressPrefix | extend subnetPrefixLength = split(subnetPrefix, '/')[1] | where subnetName == 'AzureFirewallSubnet' | extend compliant = (subnetPrefixLength == 26) | distinct id, compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed\",\n \"size\": 4,\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"gridSettings\": {\n \"formatters\": [\n {\n \"columnMatch\": \"id\",\n \"formatter\": 0,\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n {\n \"columnMatch\": \"compliant\",\n \"formatter\": 18,\n \"formatOptions\": {\n \"thresholdsOptions\": \"icons\",\n \"thresholdsGrid\": [\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"1\",\n \"representation\": \"success\",\n \"text\": \"Success\"\n },\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"0\",\n \"representation\": \"failed\",\n \"text\": \"Failed\"\n },\n {\n \"operator\": \"Default\",\n \"thresholdValue\": null,\n \"representation\": \"unknown\",\n \"text\": \"Unknown\"\n }\n ]\n }\n }\n ]\n }\n },\n \"name\": \"query19\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"Use at least a /27 prefix for your Gateway subnets. Check [this link](https://learn.microsoft.com/azure/expressroute/expressroute-howto-add-gateway-resource-manager#add-a-gateway) for further information.\"\n },\n \"name\": \"querytext21\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"resources | where type=='microsoft.network/virtualnetworks' | project id,subnets=properties.subnets | mv-expand subnets | project id, subnetName = subnets.name, subnetPrefix = subnets.properties.addressPrefix | extend subnetPrefixLength = split(subnetPrefix, '/')[1] | where subnetName == 'GatewaySubnet' | extend compliant = (subnetPrefixLength <= 27) | distinct id, compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed\",\n \"size\": 4,\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"gridSettings\": {\n \"formatters\": [\n {\n \"columnMatch\": \"id\",\n \"formatter\": 0,\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n {\n \"columnMatch\": \"compliant\",\n \"formatter\": 18,\n \"formatOptions\": {\n \"thresholdsOptions\": \"icons\",\n \"thresholdsGrid\": [\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"1\",\n \"representation\": \"success\",\n \"text\": \"Success\"\n },\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"0\",\n \"representation\": \"failed\",\n \"text\": \"Failed\"\n },\n {\n \"operator\": \"Default\",\n \"thresholdValue\": null,\n \"representation\": \"unknown\",\n \"text\": \"Unknown\"\n }\n ]\n }\n }\n ]\n }\n },\n \"name\": \"query21\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"Don't rely on the NSG inbound default rules using the VirtualNetwork service tag to limit connectivity. Check [this link](https://learn.microsoft.com/azure/virtual-network/service-tags-overview#available-service-tags) for further information.\"\n },\n \"name\": \"querytext22\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"resources | where type=='microsoft.network/networksecuritygroups' | mvexpand properties.securityRules | project id,name,ruleAction=properties_securityRules.properties.access,rulePriority=properties_securityRules.properties.priority,ruleDst=properties_securityRules.properties.destinationAddressPrefix,ruleSrc=properties_securityRules.properties.sourceAddressPrefix,ruleProt=properties_securityRules.properties.protocol,ruleDirection=properties_securityRules.properties.direction,rulePort=properties_securityRules.properties.destinationPortRange | summarize StarDenies=countif(ruleAction=='Deny' and ruleDst=='*' and ruleSrc=='*' and ruleProt=='*' and rulePort=='*') by id,tostring(ruleDirection) | where ruleDirection == 'Inbound' | project id,compliant=(StarDenies>0) | union (resources | where type=='microsoft.network/networksecuritygroups' | where array_length(properties.securityRules)==0 | extend compliant=false | project id,compliant) | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed\",\n \"size\": 4,\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"gridSettings\": {\n \"formatters\": [\n {\n \"columnMatch\": \"id\",\n \"formatter\": 0,\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n {\n \"columnMatch\": \"compliant\",\n \"formatter\": 18,\n \"formatOptions\": {\n \"thresholdsOptions\": \"icons\",\n \"thresholdsGrid\": [\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"1\",\n \"representation\": \"success\",\n \"text\": \"Success\"\n },\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"0\",\n \"representation\": \"failed\",\n \"text\": \"Failed\"\n },\n {\n \"operator\": \"Default\",\n \"thresholdValue\": null,\n \"representation\": \"unknown\",\n \"text\": \"Unknown\"\n }\n ]\n }\n }\n ]\n }\n },\n \"name\": \"query22\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"Do not implement more than 900 NSG rules per NSG, due to the limit of 1000 rules. Check [this link](https://learn.microsoft.com/azure/azure-resource-manager/management/azure-subscription-service-limits) for further information.. [This training](https://learn.microsoft.com/azure/virtual-network/network-security-group-how-it-works) can help to educate yourself on this.\"\n },\n \"name\": \"querytext23\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"resources | where type == 'microsoft.network/networksecuritygroups' | project id, rules = array_length(properties.securityRules) | project id, compliant = (rules < 900) | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed\",\n \"size\": 4,\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"gridSettings\": {\n \"formatters\": [\n {\n \"columnMatch\": \"id\",\n \"formatter\": 0,\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n {\n \"columnMatch\": \"compliant\",\n \"formatter\": 18,\n \"formatOptions\": {\n \"thresholdsOptions\": \"icons\",\n \"thresholdsGrid\": [\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"1\",\n \"representation\": \"success\",\n \"text\": \"Success\"\n },\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"0\",\n \"representation\": \"failed\",\n \"text\": \"Failed\"\n },\n {\n \"operator\": \"Default\",\n \"thresholdValue\": null,\n \"representation\": \"unknown\",\n \"text\": \"Unknown\"\n }\n ]\n }\n }\n ]\n }\n },\n \"name\": \"query23\"\n }\n ]\n },\n \"conditionalVisibility\": {\n \"parameterName\": \"VisibleTab\",\n \"comparison\": \"isEqualTo\",\n \"value\": \"tab5\"\n },\n \"name\": \"tab5\"\n },\n {\n \"type\": 12,\n \"content\": {\n \"version\": \"NotebookGroup/1.0\",\n \"groupType\": \"editable\",\n \"items\": [\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"## IP plan\"\n },\n \"name\": \"tab6title\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"Use IP addresses from the address allocation ranges for private internets (RFC 1918). Check [this link](https://learn.microsoft.com/azure/cloud-adoption-framework/ready/azure-best-practices/plan-for-ip-addressing) for further information.. [This training](https://learn.microsoft.com/learn/paths/architect-network-infrastructure/) can help to educate yourself on this.\"\n },\n \"name\": \"querytext4\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"resources | where type == 'microsoft.network/virtualnetworks' | extend addressSpace = todynamic(properties.addressSpace) | extend addressPrefix = todynamic(properties.addressSpace.addressPrefixes) | mvexpand addressSpace | mvexpand addressPrefix | project name, id, location, resourceGroup, subscriptionId, cidr = addressPrefix | extend compliant = (cidr matches regex @'^(10\\\\.|172\\\\.(1[6-9]|2[0-9]|3[01])\\\\.|192\\\\.168\\\\.)') | project id, compliant, cidr | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed\",\n \"size\": 4,\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"gridSettings\": {\n \"formatters\": [\n {\n \"columnMatch\": \"id\",\n \"formatter\": 0,\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n {\n \"columnMatch\": \"compliant\",\n \"formatter\": 18,\n \"formatOptions\": {\n \"thresholdsOptions\": \"icons\",\n \"thresholdsGrid\": [\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"1\",\n \"representation\": \"success\",\n \"text\": \"Success\"\n },\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"0\",\n \"representation\": \"failed\",\n \"text\": \"Failed\"\n },\n {\n \"operator\": \"Default\",\n \"thresholdValue\": null,\n \"representation\": \"unknown\",\n \"text\": \"Unknown\"\n }\n ]\n }\n }\n ]\n }\n },\n \"name\": \"query4\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"Ensure that IP address space isn't wasted, don't create unnecessarily large virtual networks (for example /16). Check [this link](https://learn.microsoft.com/azure/cloud-adoption-framework/ready/azure-best-practices/plan-for-ip-addressing) for further information.. [This training](https://learn.microsoft.com/learn/paths/architect-network-infrastructure/) can help to educate yourself on this.\"\n },\n \"name\": \"querytext5\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"resources | where type == 'microsoft.network/virtualnetworks' | extend addressSpace = todynamic(properties.addressSpace) | extend addressPrefix = todynamic(properties.addressSpace.addressPrefixes) | mvexpand addressSpace | mvexpand addressPrefix | extend addressMask = split(addressPrefix,'/')[1] | extend compliant = addressMask > 16 | project name, id, subscriptionId, resourceGroup, addressPrefix, compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed\",\n \"size\": 4,\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"gridSettings\": {\n \"formatters\": [\n {\n \"columnMatch\": \"id\",\n \"formatter\": 0,\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n {\n \"columnMatch\": \"compliant\",\n \"formatter\": 18,\n \"formatOptions\": {\n \"thresholdsOptions\": \"icons\",\n \"thresholdsGrid\": [\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"1\",\n \"representation\": \"success\",\n \"text\": \"Success\"\n },\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"0\",\n \"representation\": \"failed\",\n \"text\": \"Failed\"\n },\n {\n \"operator\": \"Default\",\n \"thresholdValue\": null,\n \"representation\": \"unknown\",\n \"text\": \"Unknown\"\n }\n ]\n }\n }\n ]\n }\n },\n \"name\": \"query5\"\n }\n ]\n },\n \"conditionalVisibility\": {\n \"parameterName\": \"VisibleTab\",\n \"comparison\": \"isEqualTo\",\n \"value\": \"tab6\"\n },\n \"name\": \"tab6\"\n },\n {\n \"type\": 12,\n \"content\": {\n \"version\": \"NotebookGroup/1.0\",\n \"groupType\": \"editable\",\n \"items\": [\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"## PaaS\"\n },\n \"name\": \"tab7title\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"Don't enable virtual network service endpoints by default on all subnets. Check [this link](https://learn.microsoft.com/azure/virtual-network/virtual-network-service-endpoints-overview) for further information.. [This training](https://learn.microsoft.com/learn/paths/implement-network-security/?source=learn) can help to educate yourself on this.\"\n },\n \"name\": \"querytext20\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"resources | where type =~ 'microsoft.network/virtualnetworks' | project id,resourceGroup,name,subnets = properties.subnets | mv-expand subnets | project id = subnets.id, resourceGroup, VNet = name, serviceEndpoints = subnets.properties.serviceEndpoints, compliant = (isnull(subnets.properties.serviceEndpoints) or array_length(subnets.properties.serviceEndpoints) == 0) | order by compliant asc | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed\",\n \"size\": 4,\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"gridSettings\": {\n \"formatters\": [\n {\n \"columnMatch\": \"id\",\n \"formatter\": 0,\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n {\n \"columnMatch\": \"compliant\",\n \"formatter\": 18,\n \"formatOptions\": {\n \"thresholdsOptions\": \"icons\",\n \"thresholdsGrid\": [\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"1\",\n \"representation\": \"success\",\n \"text\": \"Success\"\n },\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"0\",\n \"representation\": \"failed\",\n \"text\": \"Failed\"\n },\n {\n \"operator\": \"Default\",\n \"thresholdValue\": null,\n \"representation\": \"unknown\",\n \"text\": \"Unknown\"\n }\n ]\n }\n }\n ]\n }\n },\n \"name\": \"query20\"\n }\n ]\n },\n \"conditionalVisibility\": {\n \"parameterName\": \"VisibleTab\",\n \"comparison\": \"isEqualTo\",\n \"value\": \"tab7\"\n },\n \"name\": \"tab7\"\n }\n ],\n \"$schema\": \"https://github.com/Microsoft/Application-Insights-Workbooks/blob/master/schema/workbook.json\"\n}", + "serializedData": "{\n \"version\": \"Notebook/1.0\",\n \"items\": [\n {\n \"type\": 9,\n \"content\": {\n \"version\": \"KqlParameterItem/1.0\",\n \"parameters\": [\n {\n \"id\": \"497a107e-dde8-433e-b263-35ac8e8f7834\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Subscription\",\n \"type\": 6,\n \"multiSelect\": true,\n \"quote\": \"'\",\n \"delimiter\": \",\",\n \"typeSettings\": {\n \"additionalResourceOptions\": [\n \"value::all\"\n ],\n \"includeAll\": true,\n \"showDefault\": false\n },\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"value\": [\n \"value::all\"\n ]\n },\n {\n \"id\": \"844e4f4e-df51-4e3c-8eaf-0dc78b92c721\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"OnlyFailed\",\n \"label\": \"Only show failed\",\n \"type\": 2,\n \"typeSettings\": {\n \"additionalResourceOptions\": [],\n \"showDefault\": false\n },\n \"jsonData\": \"[\\r\\n { \\\"value\\\":true, \\\"label\\\":\\\"True\\\" },\\r\\n { \\\"value\\\":false, \\\"label\\\":\\\"False\\\", \\\"selected\\\":true }\\r\\n]\"\n }\n ],\n \"style\": \"pills\",\n \"queryType\": 0,\n \"resourceType\": \"microsoft.operationalinsights/workspaces\"\n },\n \"name\": \"WorkbookSelectors\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"If you set \\\"Only show failed\\\" to \\\"Yes\\\", the different queries will only show items that have failed their compliance checks.\",\n \"style\": \"info\"\n },\n \"name\": \"InfoBox\"\n },\n {\n \"type\": 9,\n \"content\": {\n \"version\": \"KqlParameterItem/1.0\",\n \"crossComponentResources\": [\n \"value::all\"\n ],\n \"parameters\": [\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query0Stats\",\n \"type\": 1,\n \"query\": \"resources | where type=='microsoft.network/virtualnetworks' | project id,subnets=properties.subnets | mv-expand subnets | project id, subnetName = subnets.name, subnetPrefix = subnets.properties.addressPrefix | extend subnetPrefixLength = split(subnetPrefix, '/')[1] | where subnetName == 'RouteServerSubnet' | extend compliant = (subnetPrefixLength <= 27) | distinct id, compliant| summarize Total = count(), Success = countif(compliant==1), Failed = countif(compliant==0) | extend SuccessPercent = iff(Total==0, 100, 100*toint(Success)/toint(Total)) | extend FullyCompliant = iff(SuccessPercent == 100, 'Yes', 'No') | project Query1Stats=tostring(pack_all())\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\"\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query0FullyCompliant\",\n \"type\": 1,\n \"query\": \"{\\\"version\\\":\\\"1.0.0\\\",\\\"content\\\":\\\"{\\\\\\\"value\\\\\\\": \\\\\\\"{Query0Stats:$.FullyCompliant}\\\\\\\"}\\\",\\\"transformers\\\":null}\",\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 8\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query1Stats\",\n \"type\": 1,\n \"query\": \"resources | where type == 'microsoft.network/virtualnetworks' | mvexpand properties.virtualNetworkPeerings | summarize peeringcount = count() by id | extend compliant = (peeringcount < 450) | distinct id,compliant| summarize Total = count(), Success = countif(compliant==1), Failed = countif(compliant==0) | extend SuccessPercent = iff(Total==0, 100, 100*toint(Success)/toint(Total)) | extend FullyCompliant = iff(SuccessPercent == 100, 'Yes', 'No') | project Query1Stats=tostring(pack_all())\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\"\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query1FullyCompliant\",\n \"type\": 1,\n \"query\": \"{\\\"version\\\":\\\"1.0.0\\\",\\\"content\\\":\\\"{\\\\\\\"value\\\\\\\": \\\\\\\"{Query1Stats:$.FullyCompliant}\\\\\\\"}\\\",\\\"transformers\\\":null}\",\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 8\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query2Stats\",\n \"type\": 1,\n \"query\": \"resources | where type=='microsoft.network/routetables' | mvexpand properties.routes | summarize routeCount = count() by id | extend compliant = (routeCount < 360) | distinct id,compliant| summarize Total = count(), Success = countif(compliant==1), Failed = countif(compliant==0) | extend SuccessPercent = iff(Total==0, 100, 100*toint(Success)/toint(Total)) | extend FullyCompliant = iff(SuccessPercent == 100, 'Yes', 'No') | project Query1Stats=tostring(pack_all())\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\"\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query2FullyCompliant\",\n \"type\": 1,\n \"query\": \"{\\\"version\\\":\\\"1.0.0\\\",\\\"content\\\":\\\"{\\\\\\\"value\\\\\\\": \\\\\\\"{Query2Stats:$.FullyCompliant}\\\\\\\"}\\\",\\\"transformers\\\":null}\",\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 8\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query3Stats\",\n \"type\": 1,\n \"query\": \"resources | where type == 'microsoft.network/virtualnetworks' | mvexpand properties.virtualNetworkPeerings | project id, peeringName=properties_virtualNetworkPeerings.name, compliant = (properties_virtualNetworkPeerings.properties.allowVirtualNetworkAccess == True)| summarize Total = count(), Success = countif(compliant==1), Failed = countif(compliant==0) | extend SuccessPercent = iff(Total==0, 100, 100*toint(Success)/toint(Total)) | extend FullyCompliant = iff(SuccessPercent == 100, 'Yes', 'No') | project Query1Stats=tostring(pack_all())\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\"\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query3FullyCompliant\",\n \"type\": 1,\n \"query\": \"{\\\"version\\\":\\\"1.0.0\\\",\\\"content\\\":\\\"{\\\\\\\"value\\\\\\\": \\\\\\\"{Query3Stats:$.FullyCompliant}\\\\\\\"}\\\",\\\"transformers\\\":null}\",\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 8\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query4Stats\",\n \"type\": 1,\n \"query\": \"resources | where type == 'microsoft.network/virtualnetworks' | extend addressSpace = todynamic(properties.addressSpace) | extend addressPrefix = todynamic(properties.addressSpace.addressPrefixes) | mvexpand addressSpace | mvexpand addressPrefix | project name, id, location, resourceGroup, subscriptionId, cidr = addressPrefix | extend compliant = (cidr matches regex @'^(10\\\\.|172\\\\.(1[6-9]|2[0-9]|3[01])\\\\.|192\\\\.168\\\\.)') | project id, compliant, cidr| summarize Total = count(), Success = countif(compliant==1), Failed = countif(compliant==0) | extend SuccessPercent = iff(Total==0, 100, 100*toint(Success)/toint(Total)) | extend FullyCompliant = iff(SuccessPercent == 100, 'Yes', 'No') | project Query1Stats=tostring(pack_all())\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\"\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query4FullyCompliant\",\n \"type\": 1,\n \"query\": \"{\\\"version\\\":\\\"1.0.0\\\",\\\"content\\\":\\\"{\\\\\\\"value\\\\\\\": \\\\\\\"{Query4Stats:$.FullyCompliant}\\\\\\\"}\\\",\\\"transformers\\\":null}\",\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 8\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query5Stats\",\n \"type\": 1,\n \"query\": \"resources | where type == 'microsoft.network/virtualnetworks' | extend addressSpace = todynamic(properties.addressSpace) | extend addressPrefix = todynamic(properties.addressSpace.addressPrefixes) | mvexpand addressSpace | mvexpand addressPrefix | extend addressMask = split(addressPrefix,'/')[1] | extend compliant = addressMask > 16 | project name, id, subscriptionId, resourceGroup, addressPrefix, compliant| summarize Total = count(), Success = countif(compliant==1), Failed = countif(compliant==0) | extend SuccessPercent = iff(Total==0, 100, 100*toint(Success)/toint(Total)) | extend FullyCompliant = iff(SuccessPercent == 100, 'Yes', 'No') | project Query1Stats=tostring(pack_all())\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\"\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query5FullyCompliant\",\n \"type\": 1,\n \"query\": \"{\\\"version\\\":\\\"1.0.0\\\",\\\"content\\\":\\\"{\\\\\\\"value\\\\\\\": \\\\\\\"{Query5Stats:$.FullyCompliant}\\\\\\\"}\\\",\\\"transformers\\\":null}\",\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 8\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query6Stats\",\n \"type\": 1,\n \"query\": \"resources | where type=='microsoft.network/virtualnetworks' | project id,subnets=properties.subnets | mv-expand subnets | project id, subnetName = subnets.name, subnetPrefix = subnets.properties.addressPrefix | extend subnetPrefixLength = split(subnetPrefix, '/')[1] | where subnetName == 'AzureBastionSubnet' | extend compliant = (subnetPrefixLength <= 26) | distinct id, compliant| summarize Total = count(), Success = countif(compliant==1), Failed = countif(compliant==0) | extend SuccessPercent = iff(Total==0, 100, 100*toint(Success)/toint(Total)) | extend FullyCompliant = iff(SuccessPercent == 100, 'Yes', 'No') | project Query1Stats=tostring(pack_all())\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\"\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query6FullyCompliant\",\n \"type\": 1,\n \"query\": \"{\\\"version\\\":\\\"1.0.0\\\",\\\"content\\\":\\\"{\\\\\\\"value\\\\\\\": \\\\\\\"{Query6Stats:$.FullyCompliant}\\\\\\\"}\\\",\\\"transformers\\\":null}\",\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 8\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query7Stats\",\n \"type\": 1,\n \"query\": \"resources| where type == 'microsoft.network/virtualnetworkgateways'| where properties.gatewayType =~ 'vpn' or properties.gatewayType == 'ExpressRoute'| extend SKUName = properties.sku.name, SKUTier = properties.sku.tier, Type = properties.gatewayType| extend compliant = SKUTier !in ('Basic', 'Standard')| project name, id, subscriptionId, resourceGroup, compliant| summarize Total = count(), Success = countif(compliant==1), Failed = countif(compliant==0) | extend SuccessPercent = iff(Total==0, 100, 100*toint(Success)/toint(Total)) | extend FullyCompliant = iff(SuccessPercent == 100, 'Yes', 'No') | project Query1Stats=tostring(pack_all())\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\"\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query7FullyCompliant\",\n \"type\": 1,\n \"query\": \"{\\\"version\\\":\\\"1.0.0\\\",\\\"content\\\":\\\"{\\\\\\\"value\\\\\\\": \\\\\\\"{Query7Stats:$.FullyCompliant}\\\\\\\"}\\\",\\\"transformers\\\":null}\",\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 8\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query8Stats\",\n \"type\": 1,\n \"query\": \"resources | where type=='microsoft.network/expressroutecircuits' | extend compliant = (tolower(sku.family) == 'metereddata' or tolower(sku.tier) == 'local') | distinct id,compliant| summarize Total = count(), Success = countif(compliant==1), Failed = countif(compliant==0) | extend SuccessPercent = iff(Total==0, 100, 100*toint(Success)/toint(Total)) | extend FullyCompliant = iff(SuccessPercent == 100, 'Yes', 'No') | project Query1Stats=tostring(pack_all())\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\"\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query8FullyCompliant\",\n \"type\": 1,\n \"query\": \"{\\\"version\\\":\\\"1.0.0\\\",\\\"content\\\":\\\"{\\\\\\\"value\\\\\\\": \\\\\\\"{Query8Stats:$.FullyCompliant}\\\\\\\"}\\\",\\\"transformers\\\":null}\",\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 8\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query9Stats\",\n \"type\": 1,\n \"query\": \"resources | where type=='microsoft.network/connections' | where properties.connectionType == 'ExpressRoute' | project id, gwid=tostring(properties.virtualNetworkGateway1.id), circuitid=tostring(properties.peer.id) | join (resources | where type=='microsoft.network/expressroutecircuits' | project circuitid=tostring(id), circuitsku=sku.tier) on circuitid | project id=gwid, compliant = (circuitsku == 'Local') | summarize compliant=max(compliant) by id| summarize Total = count(), Success = countif(compliant==1), Failed = countif(compliant==0) | extend SuccessPercent = iff(Total==0, 100, 100*toint(Success)/toint(Total)) | extend FullyCompliant = iff(SuccessPercent == 100, 'Yes', 'No') | project Query1Stats=tostring(pack_all())\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\"\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query9FullyCompliant\",\n \"type\": 1,\n \"query\": \"{\\\"version\\\":\\\"1.0.0\\\",\\\"content\\\":\\\"{\\\\\\\"value\\\\\\\": \\\\\\\"{Query9Stats:$.FullyCompliant}\\\\\\\"}\\\",\\\"transformers\\\":null}\",\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 8\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query10Stats\",\n \"type\": 1,\n \"query\": \"resources| where type == 'microsoft.network/virtualnetworkgateways'| where properties.gatewayType =~ 'vpn' or properties.gatewayType == 'ExpressRoute'| extend SKUName = properties.sku.name, SKUTier = properties.sku.tier, Type = properties.gatewayType| extend compliant = SKUTier contains 'AZ'| project name, id, subscriptionId, resourceGroup, Type, compliant| summarize Total = count(), Success = countif(compliant==1), Failed = countif(compliant==0) | extend SuccessPercent = iff(Total==0, 100, 100*toint(Success)/toint(Total)) | extend FullyCompliant = iff(SuccessPercent == 100, 'Yes', 'No') | project Query1Stats=tostring(pack_all())\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\"\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query10FullyCompliant\",\n \"type\": 1,\n \"query\": \"{\\\"version\\\":\\\"1.0.0\\\",\\\"content\\\":\\\"{\\\\\\\"value\\\\\\\": \\\\\\\"{Query10Stats:$.FullyCompliant}\\\\\\\"}\\\",\\\"transformers\\\":null}\",\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 8\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query11Stats\",\n \"type\": 1,\n \"query\": \"resources | where type=='microsoft.network/virtualnetworkgateways' | where properties.gatewayType == 'Vpn' | extend compliant = (tolower(properties.sku.name) contains 'az') | distinct id, compliant| summarize Total = count(), Success = countif(compliant==1), Failed = countif(compliant==0) | extend SuccessPercent = iff(Total==0, 100, 100*toint(Success)/toint(Total)) | extend FullyCompliant = iff(SuccessPercent == 100, 'Yes', 'No') | project Query1Stats=tostring(pack_all())\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\"\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query11FullyCompliant\",\n \"type\": 1,\n \"query\": \"{\\\"version\\\":\\\"1.0.0\\\",\\\"content\\\":\\\"{\\\\\\\"value\\\\\\\": \\\\\\\"{Query11Stats:$.FullyCompliant}\\\\\\\"}\\\",\\\"transformers\\\":null}\",\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 8\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query12Stats\",\n \"type\": 1,\n \"query\": \"resources | where type=='microsoft.network/connections' | where properties.connectionType == 'ExpressRoute' | project cxId=id, gwId=tostring(properties.virtualNetworkGateway1.id), circuitId=tostring(properties.peer.id) | join (resources | where type=='microsoft.network/expressroutecircuits' | project circuitId=tostring(id), circuitLocation=tostring(properties.serviceProviderProperties.peeringLocation)) on circuitId | distinct gwId, circuitLocation | summarize countErLocations=count() by id=gwId | extend compliant = (countErLocations >= 2)| summarize Total = count(), Success = countif(compliant==1), Failed = countif(compliant==0) | extend SuccessPercent = iff(Total==0, 100, 100*toint(Success)/toint(Total)) | extend FullyCompliant = iff(SuccessPercent == 100, 'Yes', 'No') | project Query1Stats=tostring(pack_all())\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\"\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query12FullyCompliant\",\n \"type\": 1,\n \"query\": \"{\\\"version\\\":\\\"1.0.0\\\",\\\"content\\\":\\\"{\\\\\\\"value\\\\\\\": \\\\\\\"{Query12Stats:$.FullyCompliant}\\\\\\\"}\\\",\\\"transformers\\\":null}\",\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 8\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query13Stats\",\n \"type\": 1,\n \"query\": \"resources | where type=='microsoft.network/virtualnetworks' | project id,resourceGroup,name,subnets=properties.subnets | mv-expand subnets | project id,resourceGroup,name,subnetName=tostring(subnets.name),routeTableId=tostring(subnets.properties.routeTable.id) | where subnetName == 'GatewaySubnet' | join kind=leftouter (Resources | where type == 'microsoft.network/routetables' | project routeTableName=name,routeTableId=id, disableBgpRoutePropagation=properties.disableBgpRoutePropagation) on routeTableId | project id,compliant = (disableBgpRoutePropagation == False or isnull(disableBgpRoutePropagation))| summarize Total = count(), Success = countif(compliant==1), Failed = countif(compliant==0) | extend SuccessPercent = iff(Total==0, 100, 100*toint(Success)/toint(Total)) | extend FullyCompliant = iff(SuccessPercent == 100, 'Yes', 'No') | project Query1Stats=tostring(pack_all())\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\"\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query13FullyCompliant\",\n \"type\": 1,\n \"query\": \"{\\\"version\\\":\\\"1.0.0\\\",\\\"content\\\":\\\"{\\\\\\\"value\\\\\\\": \\\\\\\"{Query13Stats:$.FullyCompliant}\\\\\\\"}\\\",\\\"transformers\\\":null}\",\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 8\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query14Stats\",\n \"type\": 1,\n \"query\": \"resources | where type=='microsoft.network/firewallpolicies' | extend compliant = (properties.dnsSettings.enableProxy == true) | distinct id,compliant| summarize Total = count(), Success = countif(compliant==1), Failed = countif(compliant==0) | extend SuccessPercent = iff(Total==0, 100, 100*toint(Success)/toint(Total)) | extend FullyCompliant = iff(SuccessPercent == 100, 'Yes', 'No') | project Query1Stats=tostring(pack_all())\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\"\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query14FullyCompliant\",\n \"type\": 1,\n \"query\": \"{\\\"version\\\":\\\"1.0.0\\\",\\\"content\\\":\\\"{\\\\\\\"value\\\\\\\": \\\\\\\"{Query14Stats:$.FullyCompliant}\\\\\\\"}\\\",\\\"transformers\\\":null}\",\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 8\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query15Stats\",\n \"type\": 1,\n \"query\": \"resources | where type=='microsoft.network/firewallpolicies' | extend compliant = (properties.sku.tier == 'Premium') | distinct id,compliant| summarize Total = count(), Success = countif(compliant==1), Failed = countif(compliant==0) | extend SuccessPercent = iff(Total==0, 100, 100*toint(Success)/toint(Total)) | extend FullyCompliant = iff(SuccessPercent == 100, 'Yes', 'No') | project Query1Stats=tostring(pack_all())\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\"\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query15FullyCompliant\",\n \"type\": 1,\n \"query\": \"{\\\"version\\\":\\\"1.0.0\\\",\\\"content\\\":\\\"{\\\\\\\"value\\\\\\\": \\\\\\\"{Query15Stats:$.FullyCompliant}\\\\\\\"}\\\",\\\"transformers\\\":null}\",\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 8\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query16Stats\",\n \"type\": 1,\n \"query\": \"resources | where type=='microsoft.network/firewallpolicies' | extend compliant = (properties.threatIntelMode == 'Deny') | distinct id,compliant| summarize Total = count(), Success = countif(compliant==1), Failed = countif(compliant==0) | extend SuccessPercent = iff(Total==0, 100, 100*toint(Success)/toint(Total)) | extend FullyCompliant = iff(SuccessPercent == 100, 'Yes', 'No') | project Query1Stats=tostring(pack_all())\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\"\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query16FullyCompliant\",\n \"type\": 1,\n \"query\": \"{\\\"version\\\":\\\"1.0.0\\\",\\\"content\\\":\\\"{\\\\\\\"value\\\\\\\": \\\\\\\"{Query16Stats:$.FullyCompliant}\\\\\\\"}\\\",\\\"transformers\\\":null}\",\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 8\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query17Stats\",\n \"type\": 1,\n \"query\": \"resources | where type=='microsoft.network/firewallpolicies' | extend compliant = (properties.intrusionDetection.mode == 'Deny') | project id, compliant| summarize Total = count(), Success = countif(compliant==1), Failed = countif(compliant==0) | extend SuccessPercent = iff(Total==0, 100, 100*toint(Success)/toint(Total)) | extend FullyCompliant = iff(SuccessPercent == 100, 'Yes', 'No') | project Query1Stats=tostring(pack_all())\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\"\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query17FullyCompliant\",\n \"type\": 1,\n \"query\": \"{\\\"version\\\":\\\"1.0.0\\\",\\\"content\\\":\\\"{\\\\\\\"value\\\\\\\": \\\\\\\"{Query17Stats:$.FullyCompliant}\\\\\\\"}\\\",\\\"transformers\\\":null}\",\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 8\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query18Stats\",\n \"type\": 1,\n \"query\": \"resources | where type=='microsoft.network/virtualnetworks' | project id,resourceGroup,name,subnets=properties.subnets | mv-expand subnets | project id,name,subnetId=tostring(subnets.id), subnetName=tostring(subnets.name),subnetRT=subnets.properties.routeTable.id | where not (subnetName in ('GatewaySubnet', 'AzureFirewallSubnet', 'RouteServerSubnet', 'AzureBastionSubnet')) | extend hasRT = isnotnull(subnetRT) | distinct id, hasRT, subnetId | join kind=fullouter (resources | where type == 'microsoft.network/virtualnetworks' | mvexpand properties.virtualNetworkPeerings | extend isVWAN=(tolower(split(properties_virtualNetworkPeerings.name, '_')[0]) == 'remotevnettohubpeering') | mv-expand properties.subnets | project id, isVWAN, name, subnetId=tostring(properties_subnets.id), subnetName=tostring(properties_subnets.name) | summarize PeeredToVWAN=max(isVWAN) by id, subnetId | project id, subnetId, isVWANpeer = (PeeredToVWAN == true)) on subnetId | project id=iff(isnotempty(id), id, id1), subnetId=iff(isnotempty(subnetId), subnetId, subnetId1), hasRT, isVWANpeer | extend compliant = (hasRT==true or isVWANpeer==true) | distinct id, subnetId, compliant| summarize Total = count(), Success = countif(compliant==1), Failed = countif(compliant==0) | extend SuccessPercent = iff(Total==0, 100, 100*toint(Success)/toint(Total)) | extend FullyCompliant = iff(SuccessPercent == 100, 'Yes', 'No') | project Query1Stats=tostring(pack_all())\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\"\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query18FullyCompliant\",\n \"type\": 1,\n \"query\": \"{\\\"version\\\":\\\"1.0.0\\\",\\\"content\\\":\\\"{\\\\\\\"value\\\\\\\": \\\\\\\"{Query18Stats:$.FullyCompliant}\\\\\\\"}\\\",\\\"transformers\\\":null}\",\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 8\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query19Stats\",\n \"type\": 1,\n \"query\": \"resources | where type=='microsoft.network/virtualnetworks' | project id,subnets=properties.subnets | mv-expand subnets | project id, subnetName = subnets.name, subnetPrefix = subnets.properties.addressPrefix | extend subnetPrefixLength = split(subnetPrefix, '/')[1] | where subnetName == 'AzureFirewallSubnet' | extend compliant = (subnetPrefixLength == 26) | distinct id, compliant| summarize Total = count(), Success = countif(compliant==1), Failed = countif(compliant==0) | extend SuccessPercent = iff(Total==0, 100, 100*toint(Success)/toint(Total)) | extend FullyCompliant = iff(SuccessPercent == 100, 'Yes', 'No') | project Query1Stats=tostring(pack_all())\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\"\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query19FullyCompliant\",\n \"type\": 1,\n \"query\": \"{\\\"version\\\":\\\"1.0.0\\\",\\\"content\\\":\\\"{\\\\\\\"value\\\\\\\": \\\\\\\"{Query19Stats:$.FullyCompliant}\\\\\\\"}\\\",\\\"transformers\\\":null}\",\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 8\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query20Stats\",\n \"type\": 1,\n \"query\": \"resources | where type =~ 'microsoft.network/virtualnetworks' | project id,resourceGroup,name,subnets = properties.subnets | mv-expand subnets | project id = subnets.id, resourceGroup, VNet = name, serviceEndpoints = subnets.properties.serviceEndpoints, compliant = (isnull(subnets.properties.serviceEndpoints) or array_length(subnets.properties.serviceEndpoints) == 0) | order by compliant asc| summarize Total = count(), Success = countif(compliant==1), Failed = countif(compliant==0) | extend SuccessPercent = iff(Total==0, 100, 100*toint(Success)/toint(Total)) | extend FullyCompliant = iff(SuccessPercent == 100, 'Yes', 'No') | project Query1Stats=tostring(pack_all())\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\"\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query20FullyCompliant\",\n \"type\": 1,\n \"query\": \"{\\\"version\\\":\\\"1.0.0\\\",\\\"content\\\":\\\"{\\\\\\\"value\\\\\\\": \\\\\\\"{Query20Stats:$.FullyCompliant}\\\\\\\"}\\\",\\\"transformers\\\":null}\",\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 8\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query21Stats\",\n \"type\": 1,\n \"query\": \"resources | where type=='microsoft.network/virtualnetworks' | project id,subnets=properties.subnets | mv-expand subnets | project id, subnetName = subnets.name, subnetPrefix = subnets.properties.addressPrefix | extend subnetPrefixLength = split(subnetPrefix, '/')[1] | where subnetName == 'GatewaySubnet' | extend compliant = (subnetPrefixLength <= 27) | distinct id, compliant| summarize Total = count(), Success = countif(compliant==1), Failed = countif(compliant==0) | extend SuccessPercent = iff(Total==0, 100, 100*toint(Success)/toint(Total)) | extend FullyCompliant = iff(SuccessPercent == 100, 'Yes', 'No') | project Query1Stats=tostring(pack_all())\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\"\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query21FullyCompliant\",\n \"type\": 1,\n \"query\": \"{\\\"version\\\":\\\"1.0.0\\\",\\\"content\\\":\\\"{\\\\\\\"value\\\\\\\": \\\\\\\"{Query21Stats:$.FullyCompliant}\\\\\\\"}\\\",\\\"transformers\\\":null}\",\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 8\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query22Stats\",\n \"type\": 1,\n \"query\": \"resources | where type=='microsoft.network/networksecuritygroups' | mvexpand properties.securityRules | project id,name,ruleAction=properties_securityRules.properties.access,rulePriority=properties_securityRules.properties.priority,ruleDst=properties_securityRules.properties.destinationAddressPrefix,ruleSrc=properties_securityRules.properties.sourceAddressPrefix,ruleProt=properties_securityRules.properties.protocol,ruleDirection=properties_securityRules.properties.direction,rulePort=properties_securityRules.properties.destinationPortRange | summarize StarDenies=countif(ruleAction=='Deny' and ruleDst=='*' and ruleSrc=='*' and ruleProt=='*' and rulePort=='*') by id,tostring(ruleDirection) | where ruleDirection == 'Inbound' | project id,compliant=(StarDenies>0) | union (resources | where type=='microsoft.network/networksecuritygroups' | where array_length(properties.securityRules)==0 | extend compliant=false | project id,compliant)| summarize Total = count(), Success = countif(compliant==1), Failed = countif(compliant==0) | extend SuccessPercent = iff(Total==0, 100, 100*toint(Success)/toint(Total)) | extend FullyCompliant = iff(SuccessPercent == 100, 'Yes', 'No') | project Query1Stats=tostring(pack_all())\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\"\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query22FullyCompliant\",\n \"type\": 1,\n \"query\": \"{\\\"version\\\":\\\"1.0.0\\\",\\\"content\\\":\\\"{\\\\\\\"value\\\\\\\": \\\\\\\"{Query22Stats:$.FullyCompliant}\\\\\\\"}\\\",\\\"transformers\\\":null}\",\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 8\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query23Stats\",\n \"type\": 1,\n \"query\": \"resources | where type == 'microsoft.network/networksecuritygroups' | project id, rules = array_length(properties.securityRules) | project id, compliant = (rules < 900)| summarize Total = count(), Success = countif(compliant==1), Failed = countif(compliant==0) | extend SuccessPercent = iff(Total==0, 100, 100*toint(Success)/toint(Total)) | extend FullyCompliant = iff(SuccessPercent == 100, 'Yes', 'No') | project Query1Stats=tostring(pack_all())\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\"\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query23FullyCompliant\",\n \"type\": 1,\n \"query\": \"{\\\"version\\\":\\\"1.0.0\\\",\\\"content\\\":\\\"{\\\\\\\"value\\\\\\\": \\\\\\\"{Query23Stats:$.FullyCompliant}\\\\\\\"}\\\",\\\"transformers\\\":null}\",\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 8\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query24Stats\",\n \"type\": 1,\n \"query\": \"resources | where type=='microsoft.network/virtualhubs' | extend compliant = isnotnull(properties.azureFirewall.id) | project id, compliant| summarize Total = count(), Success = countif(compliant==1), Failed = countif(compliant==0) | extend SuccessPercent = iff(Total==0, 100, 100*toint(Success)/toint(Total)) | extend FullyCompliant = iff(SuccessPercent == 100, 'Yes', 'No') | project Query1Stats=tostring(pack_all())\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\"\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query24FullyCompliant\",\n \"type\": 1,\n \"query\": \"{\\\"version\\\":\\\"1.0.0\\\",\\\"content\\\":\\\"{\\\\\\\"value\\\\\\\": \\\\\\\"{Query24Stats:$.FullyCompliant}\\\\\\\"}\\\",\\\"transformers\\\":null}\",\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 8\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Tab0Success\",\n \"type\": 1,\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"criteriaData\": [\n {\n \"criteriaContext\": {\n \"operator\": \"Default\",\n \"resultValType\": \"expression\",\n \"resultVal\": \"{Query14Stats:$.Success}+{Query15Stats:$.Success}+{Query16Stats:$.Success}+{Query17Stats:$.Success}+{Query18Stats:$.Success}\"\n }\n }\n ]\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Tab0Total\",\n \"type\": 1,\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"criteriaData\": [\n {\n \"criteriaContext\": {\n \"operator\": \"Default\",\n \"resultValType\": \"expression\",\n \"resultVal\": \"{Query14Stats:$.Total}+{Query15Stats:$.Total}+{Query16Stats:$.Total}+{Query17Stats:$.Total}+{Query18Stats:$.Total}\"\n }\n }\n ]\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Tab0Percent\",\n \"type\": 1,\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"criteriaData\": [\n {\n \"criteriaContext\": {\n \"operator\": \"Default\",\n \"resultValType\": \"expression\",\n \"resultVal\": \"round(100*{Tab0Success}/{Tab0Total})\"\n }\n }\n ]\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Tab1Success\",\n \"type\": 1,\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"criteriaData\": [\n {\n \"criteriaContext\": {\n \"operator\": \"Default\",\n \"resultValType\": \"expression\",\n \"resultVal\": \"{Query4Stats:$.Success}+{Query5Stats:$.Success}\"\n }\n }\n ]\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Tab1Total\",\n \"type\": 1,\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"criteriaData\": [\n {\n \"criteriaContext\": {\n \"operator\": \"Default\",\n \"resultValType\": \"expression\",\n \"resultVal\": \"{Query4Stats:$.Total}+{Query5Stats:$.Total}\"\n }\n }\n ]\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Tab1Percent\",\n \"type\": 1,\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"criteriaData\": [\n {\n \"criteriaContext\": {\n \"operator\": \"Default\",\n \"resultValType\": \"expression\",\n \"resultVal\": \"round(100*{Tab1Success}/{Tab1Total})\"\n }\n }\n ]\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Tab2Success\",\n \"type\": 1,\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"criteriaData\": [\n {\n \"criteriaContext\": {\n \"operator\": \"Default\",\n \"resultValType\": \"expression\",\n \"resultVal\": \"{Query0Stats:$.Success}+{Query1Stats:$.Success}+{Query2Stats:$.Success}+{Query3Stats:$.Success}\"\n }\n }\n ]\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Tab2Total\",\n \"type\": 1,\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"criteriaData\": [\n {\n \"criteriaContext\": {\n \"operator\": \"Default\",\n \"resultValType\": \"expression\",\n \"resultVal\": \"{Query0Stats:$.Total}+{Query1Stats:$.Total}+{Query2Stats:$.Total}+{Query3Stats:$.Total}\"\n }\n }\n ]\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Tab2Percent\",\n \"type\": 1,\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"criteriaData\": [\n {\n \"criteriaContext\": {\n \"operator\": \"Default\",\n \"resultValType\": \"expression\",\n \"resultVal\": \"round(100*{Tab2Success}/{Tab2Total})\"\n }\n }\n ]\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Tab3Success\",\n \"type\": 1,\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"criteriaData\": [\n {\n \"criteriaContext\": {\n \"operator\": \"Default\",\n \"resultValType\": \"expression\",\n \"resultVal\": \"{Query19Stats:$.Success}+{Query21Stats:$.Success}+{Query22Stats:$.Success}+{Query23Stats:$.Success}\"\n }\n }\n ]\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Tab3Total\",\n \"type\": 1,\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"criteriaData\": [\n {\n \"criteriaContext\": {\n \"operator\": \"Default\",\n \"resultValType\": \"expression\",\n \"resultVal\": \"{Query19Stats:$.Total}+{Query21Stats:$.Total}+{Query22Stats:$.Total}+{Query23Stats:$.Total}\"\n }\n }\n ]\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Tab3Percent\",\n \"type\": 1,\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"criteriaData\": [\n {\n \"criteriaContext\": {\n \"operator\": \"Default\",\n \"resultValType\": \"expression\",\n \"resultVal\": \"round(100*{Tab3Success}/{Tab3Total})\"\n }\n }\n ]\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Tab4Success\",\n \"type\": 1,\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"criteriaData\": [\n {\n \"criteriaContext\": {\n \"operator\": \"Default\",\n \"resultValType\": \"expression\",\n \"resultVal\": \"{Query24Stats:$.Success}\"\n }\n }\n ]\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Tab4Total\",\n \"type\": 1,\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"criteriaData\": [\n {\n \"criteriaContext\": {\n \"operator\": \"Default\",\n \"resultValType\": \"expression\",\n \"resultVal\": \"{Query24Stats:$.Total}\"\n }\n }\n ]\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Tab4Percent\",\n \"type\": 1,\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"criteriaData\": [\n {\n \"criteriaContext\": {\n \"operator\": \"Default\",\n \"resultValType\": \"expression\",\n \"resultVal\": \"round(100*{Tab4Success}/{Tab4Total})\"\n }\n }\n ]\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Tab5Success\",\n \"type\": 1,\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"criteriaData\": [\n {\n \"criteriaContext\": {\n \"operator\": \"Default\",\n \"resultValType\": \"expression\",\n \"resultVal\": \"{Query7Stats:$.Success}+{Query8Stats:$.Success}+{Query9Stats:$.Success}+{Query10Stats:$.Success}+{Query11Stats:$.Success}+{Query12Stats:$.Success}+{Query13Stats:$.Success}\"\n }\n }\n ]\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Tab5Total\",\n \"type\": 1,\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"criteriaData\": [\n {\n \"criteriaContext\": {\n \"operator\": \"Default\",\n \"resultValType\": \"expression\",\n \"resultVal\": \"{Query7Stats:$.Total}+{Query8Stats:$.Total}+{Query9Stats:$.Total}+{Query10Stats:$.Total}+{Query11Stats:$.Total}+{Query12Stats:$.Total}+{Query13Stats:$.Total}\"\n }\n }\n ]\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Tab5Percent\",\n \"type\": 1,\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"criteriaData\": [\n {\n \"criteriaContext\": {\n \"operator\": \"Default\",\n \"resultValType\": \"expression\",\n \"resultVal\": \"round(100*{Tab5Success}/{Tab5Total})\"\n }\n }\n ]\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Tab6Success\",\n \"type\": 1,\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"criteriaData\": [\n {\n \"criteriaContext\": {\n \"operator\": \"Default\",\n \"resultValType\": \"expression\",\n \"resultVal\": \"{Query6Stats:$.Success}\"\n }\n }\n ]\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Tab6Total\",\n \"type\": 1,\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"criteriaData\": [\n {\n \"criteriaContext\": {\n \"operator\": \"Default\",\n \"resultValType\": \"expression\",\n \"resultVal\": \"{Query6Stats:$.Total}\"\n }\n }\n ]\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Tab6Percent\",\n \"type\": 1,\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"criteriaData\": [\n {\n \"criteriaContext\": {\n \"operator\": \"Default\",\n \"resultValType\": \"expression\",\n \"resultVal\": \"round(100*{Tab6Success}/{Tab6Total})\"\n }\n }\n ]\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Tab7Success\",\n \"type\": 1,\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"criteriaData\": [\n {\n \"criteriaContext\": {\n \"operator\": \"Default\",\n \"resultValType\": \"expression\",\n \"resultVal\": \"{Query20Stats:$.Success}\"\n }\n }\n ]\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Tab7Total\",\n \"type\": 1,\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"criteriaData\": [\n {\n \"criteriaContext\": {\n \"operator\": \"Default\",\n \"resultValType\": \"expression\",\n \"resultVal\": \"{Query20Stats:$.Total}\"\n }\n }\n ]\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Tab7Percent\",\n \"type\": 1,\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"criteriaData\": [\n {\n \"criteriaContext\": {\n \"operator\": \"Default\",\n \"resultValType\": \"expression\",\n \"resultVal\": \"round(100*{Tab7Success}/{Tab7Total})\"\n }\n }\n ]\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"WorkbookTotal\",\n \"type\": 1,\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"criteriaData\": [\n {\n \"criteriaContext\": {\n \"operator\": \"Default\",\n \"resultValType\": \"expression\",\n \"resultVal\": \"{Query14Stats:$.Total}+{Query15Stats:$.Total}+{Query16Stats:$.Total}+{Query17Stats:$.Total}+{Query18Stats:$.Total}+{Query4Stats:$.Total}+{Query5Stats:$.Total}+{Query0Stats:$.Total}+{Query1Stats:$.Total}+{Query2Stats:$.Total}+{Query3Stats:$.Total}+{Query19Stats:$.Total}+{Query21Stats:$.Total}+{Query22Stats:$.Total}+{Query23Stats:$.Total}+{Query24Stats:$.Total}+{Query7Stats:$.Total}+{Query8Stats:$.Total}+{Query9Stats:$.Total}+{Query10Stats:$.Total}+{Query11Stats:$.Total}+{Query12Stats:$.Total}+{Query13Stats:$.Total}+{Query6Stats:$.Total}+{Query20Stats:$.Total}\"\n }\n }\n ]\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"WorkbookSuccess\",\n \"type\": 1,\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"criteriaData\": [\n {\n \"criteriaContext\": {\n \"operator\": \"Default\",\n \"resultValType\": \"expression\",\n \"resultVal\": \"{Query14Stats:$.Success}+{Query15Stats:$.Success}+{Query16Stats:$.Success}+{Query17Stats:$.Success}+{Query18Stats:$.Success}+{Query4Stats:$.Success}+{Query5Stats:$.Success}+{Query0Stats:$.Success}+{Query1Stats:$.Success}+{Query2Stats:$.Success}+{Query3Stats:$.Success}+{Query19Stats:$.Success}+{Query21Stats:$.Success}+{Query22Stats:$.Success}+{Query23Stats:$.Success}+{Query24Stats:$.Success}+{Query7Stats:$.Success}+{Query8Stats:$.Success}+{Query9Stats:$.Success}+{Query10Stats:$.Success}+{Query11Stats:$.Success}+{Query12Stats:$.Success}+{Query13Stats:$.Success}+{Query6Stats:$.Success}+{Query20Stats:$.Success}\"\n }\n }\n ]\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"WorkbookPercent\",\n \"type\": 1,\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"criteriaData\": [\n {\n \"criteriaContext\": {\n \"operator\": \"Default\",\n \"resultValType\": \"expression\",\n \"resultVal\": \"round(100*{WorkbookSuccess}/{WorkbookTotal})\"\n }\n }\n ]\n }\n ],\n \"style\": \"pills\",\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\"\n },\n \"name\": \"InvisibleParameters\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"## Azure Landing Zone Review - Network\\n\\n---\\n\\nThis workbook has been automatically generated out of the checklists in the [Azure Review Checklists repo](https://github.com/Azure/review-checklists). This repo contains best practices and recommendations around generic Landing Zones as well as specific services such as Azure Virtual Desktop, Azure Kubernetes Service or Azure VMware Solution, to name a few. This repository of best practices is curated by Azure engineers, but open to anybody to contribute.\\n\\nIf you see a problem in the queries that are part of this workbook, please open a Github issue [here](https://github.com/Azure/review-checklists/issues/new).\"\n },\n \"customWidth\": \"50\",\n \"name\": \"MarkdownHeader\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"{\\\"version\\\":\\\"1.0.0\\\",\\\"content\\\":\\\"{\\\\\\\"WorkbookPercent\\\\\\\": \\\\\\\"{WorkbookPercent}\\\\\\\", \\\\\\\"SubTitle\\\\\\\": \\\\\\\"Percent of successful checks\\\\\\\"}\\\",\\\"transformers\\\":null}\",\n \"size\": 4,\n \"queryType\": 8,\n \"visualization\": \"tiles\",\n \"tileSettings\": {\n \"titleContent\": {\n \"columnMatch\": \"WorkbookPercent\",\n \"formatter\": 4,\n \"formatOptions\": {\n \"min\": 0,\n \"max\": 100,\n \"palette\": \"redGreen\"\n }\n },\n \"subtitleContent\": {\n \"columnMatch\": \"SubTitle\",\n \"formatter\": 1\n },\n \"showBorder\": true\n }\n },\n \"customWidth\": \"50\",\n \"name\": \"ProgressTile\"\n },\n {\n \"type\": 11,\n \"content\": {\n \"version\": \"LinkItem/1.0\",\n \"style\": \"tabs\",\n \"links\": [\n {\n \"id\": \"02aa6311-8ba2-43ea-a75d-eb15de71b18a\",\n \"cellValue\": \"VisibleTab\",\n \"linkTarget\": \"parameter\",\n \"linkLabel\": \"Firewall ({Tab0Success:value}/{Tab0Total:value})\",\n \"subTarget\": \"tab0\",\n \"preText\": \"Firewall\",\n \"style\": \"primary\"\n },\n {\n \"id\": \"595adca4-994f-4ce4-85c4-0858ce5f7fae\",\n \"cellValue\": \"VisibleTab\",\n \"linkTarget\": \"parameter\",\n \"linkLabel\": \"IP plan ({Tab1Success:value}/{Tab1Total:value})\",\n \"subTarget\": \"tab1\",\n \"preText\": \"IP plan\",\n \"style\": \"primary\"\n },\n {\n \"id\": \"b35d7a26-c224-469d-a743-16ed3848552b\",\n \"cellValue\": \"VisibleTab\",\n \"linkTarget\": \"parameter\",\n \"linkLabel\": \"Hub and spoke ({Tab2Success:value}/{Tab2Total:value})\",\n \"subTarget\": \"tab2\",\n \"preText\": \"Hub and spoke\",\n \"style\": \"primary\"\n },\n {\n \"id\": \"2682b5dc-9340-44c9-829b-dface0f1c611\",\n \"cellValue\": \"VisibleTab\",\n \"linkTarget\": \"parameter\",\n \"linkLabel\": \"Segmentation ({Tab3Success:value}/{Tab3Total:value})\",\n \"subTarget\": \"tab3\",\n \"preText\": \"Segmentation\",\n \"style\": \"primary\"\n },\n {\n \"id\": \"a8fe010a-0e38-4f2d-b893-a22de17ac068\",\n \"cellValue\": \"VisibleTab\",\n \"linkTarget\": \"parameter\",\n \"linkLabel\": \"Virtual WAN ({Tab4Success:value}/{Tab4Total:value})\",\n \"subTarget\": \"tab4\",\n \"preText\": \"Virtual WAN\",\n \"style\": \"primary\"\n },\n {\n \"id\": \"0f9bc02a-8df6-4932-9d48-996c7f099d13\",\n \"cellValue\": \"VisibleTab\",\n \"linkTarget\": \"parameter\",\n \"linkLabel\": \"Hybrid ({Tab5Success:value}/{Tab5Total:value})\",\n \"subTarget\": \"tab5\",\n \"preText\": \"Hybrid\",\n \"style\": \"primary\"\n },\n {\n \"id\": \"6dfe377f-8cf9-4bdf-8dec-aba2532fead6\",\n \"cellValue\": \"VisibleTab\",\n \"linkTarget\": \"parameter\",\n \"linkLabel\": \"Internet ({Tab6Success:value}/{Tab6Total:value})\",\n \"subTarget\": \"tab6\",\n \"preText\": \"Internet\",\n \"style\": \"primary\"\n },\n {\n \"id\": \"147aa5de-4935-4674-8e54-3f524aebac9f\",\n \"cellValue\": \"VisibleTab\",\n \"linkTarget\": \"parameter\",\n \"linkLabel\": \"PaaS ({Tab7Success:value}/{Tab7Total:value})\",\n \"subTarget\": \"tab7\",\n \"preText\": \"PaaS\",\n \"style\": \"primary\"\n }\n ]\n },\n \"name\": \"Tabs\"\n },\n {\n \"type\": 12,\n \"content\": {\n \"version\": \"NotebookGroup/1.0\",\n \"groupType\": \"editable\",\n \"items\": [\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"## Firewall\"\n },\n \"name\": \"tab0title\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"Use application rules to filter outbound traffic on destination host name for supported protocols. Use FQDN-based network rules and Azure Firewall with DNS proxy to filter egress traffic to the Internet over other protocols. Check [this link](https://learn.microsoft.com/azure/firewall/fqdn-filtering-network-rules) for further information.. [This training](https://learn.microsoft.com/learn/paths/secure-networking-infrastructure/) can help to educate yourself on this.\"\n },\n \"name\": \"querytext14\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"resources | where type=='microsoft.network/firewallpolicies' | extend compliant = (properties.dnsSettings.enableProxy == true) | distinct id,compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed\",\n \"size\": 4,\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"gridSettings\": {\n \"formatters\": [\n {\n \"columnMatch\": \"id\",\n \"formatter\": 0,\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n {\n \"columnMatch\": \"compliant\",\n \"formatter\": 18,\n \"formatOptions\": {\n \"thresholdsOptions\": \"icons\",\n \"thresholdsGrid\": [\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"1\",\n \"representation\": \"success\",\n \"text\": \"Success\"\n },\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"0\",\n \"representation\": \"failed\",\n \"text\": \"Failed\"\n },\n {\n \"operator\": \"Default\",\n \"thresholdValue\": null,\n \"representation\": \"unknown\",\n \"text\": \"Unknown\"\n }\n ]\n }\n }\n ]\n }\n },\n \"name\": \"query14\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"Use Azure Firewall Premium to enable additional security features. Check [this link](https://learn.microsoft.com/azure/firewall/premium-features) for further information.. [This training](https://learn.microsoft.com/training/modules/introduction-azure-firewall/) can help to educate yourself on this.\"\n },\n \"name\": \"querytext15\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"resources | where type=='microsoft.network/firewallpolicies' | extend compliant = (properties.sku.tier == 'Premium') | distinct id,compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed\",\n \"size\": 4,\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"gridSettings\": {\n \"formatters\": [\n {\n \"columnMatch\": \"id\",\n \"formatter\": 0,\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n {\n \"columnMatch\": \"compliant\",\n \"formatter\": 18,\n \"formatOptions\": {\n \"thresholdsOptions\": \"icons\",\n \"thresholdsGrid\": [\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"1\",\n \"representation\": \"success\",\n \"text\": \"Success\"\n },\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"0\",\n \"representation\": \"failed\",\n \"text\": \"Failed\"\n },\n {\n \"operator\": \"Default\",\n \"thresholdValue\": null,\n \"representation\": \"unknown\",\n \"text\": \"Unknown\"\n }\n ]\n }\n }\n ]\n }\n },\n \"name\": \"query15\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"Configure Azure Firewall Threat Intelligence mode to Alert and Deny for additional protection. Check [this link](https://learn.microsoft.com/azure/firewall/premium-features#idps-signature-rules) for further information.\"\n },\n \"name\": \"querytext16\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"resources | where type=='microsoft.network/firewallpolicies' | extend compliant = (properties.threatIntelMode == 'Deny') | distinct id,compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed\",\n \"size\": 4,\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"gridSettings\": {\n \"formatters\": [\n {\n \"columnMatch\": \"id\",\n \"formatter\": 0,\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n {\n \"columnMatch\": \"compliant\",\n \"formatter\": 18,\n \"formatOptions\": {\n \"thresholdsOptions\": \"icons\",\n \"thresholdsGrid\": [\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"1\",\n \"representation\": \"success\",\n \"text\": \"Success\"\n },\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"0\",\n \"representation\": \"failed\",\n \"text\": \"Failed\"\n },\n {\n \"operator\": \"Default\",\n \"thresholdValue\": null,\n \"representation\": \"unknown\",\n \"text\": \"Unknown\"\n }\n ]\n }\n }\n ]\n }\n },\n \"name\": \"query16\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"Configure Azure Firewall IDPS mode to Deny for additional protection. Check [this link](https://learn.microsoft.com/azure/firewall/premium-features#idps) for further information.. [This training](https://learn.microsoft.com/training/modules/introduction-azure-firewall/) can help to educate yourself on this.\"\n },\n \"name\": \"querytext17\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"resources | where type=='microsoft.network/firewallpolicies' | extend compliant = (properties.intrusionDetection.mode == 'Deny') | project id, compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed\",\n \"size\": 4,\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"gridSettings\": {\n \"formatters\": [\n {\n \"columnMatch\": \"id\",\n \"formatter\": 0,\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n {\n \"columnMatch\": \"compliant\",\n \"formatter\": 18,\n \"formatOptions\": {\n \"thresholdsOptions\": \"icons\",\n \"thresholdsGrid\": [\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"1\",\n \"representation\": \"success\",\n \"text\": \"Success\"\n },\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"0\",\n \"representation\": \"failed\",\n \"text\": \"Failed\"\n },\n {\n \"operator\": \"Default\",\n \"thresholdValue\": null,\n \"representation\": \"unknown\",\n \"text\": \"Unknown\"\n }\n ]\n }\n }\n ]\n }\n },\n \"name\": \"query17\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"For subnets in VNets not connected to Virtual WAN, attach a route table so that Internet traffic is redirected to Azure Firewall or a Network Virtual Appliance. Check [this link](https://learn.microsoft.com/azure/virtual-network/virtual-networks-udr-overview) for further information.\"\n },\n \"name\": \"querytext18\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"resources | where type=='microsoft.network/virtualnetworks' | project id,resourceGroup,name,subnets=properties.subnets | mv-expand subnets | project id,name,subnetId=tostring(subnets.id), subnetName=tostring(subnets.name),subnetRT=subnets.properties.routeTable.id | where not (subnetName in ('GatewaySubnet', 'AzureFirewallSubnet', 'RouteServerSubnet', 'AzureBastionSubnet')) | extend hasRT = isnotnull(subnetRT) | distinct id, hasRT, subnetId | join kind=fullouter (resources | where type == 'microsoft.network/virtualnetworks' | mvexpand properties.virtualNetworkPeerings | extend isVWAN=(tolower(split(properties_virtualNetworkPeerings.name, '_')[0]) == 'remotevnettohubpeering') | mv-expand properties.subnets | project id, isVWAN, name, subnetId=tostring(properties_subnets.id), subnetName=tostring(properties_subnets.name) | summarize PeeredToVWAN=max(isVWAN) by id, subnetId | project id, subnetId, isVWANpeer = (PeeredToVWAN == true)) on subnetId | project id=iff(isnotempty(id), id, id1), subnetId=iff(isnotempty(subnetId), subnetId, subnetId1), hasRT, isVWANpeer | extend compliant = (hasRT==true or isVWANpeer==true) | distinct id, subnetId, compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed\",\n \"size\": 4,\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"gridSettings\": {\n \"formatters\": [\n {\n \"columnMatch\": \"id\",\n \"formatter\": 0,\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n {\n \"columnMatch\": \"compliant\",\n \"formatter\": 18,\n \"formatOptions\": {\n \"thresholdsOptions\": \"icons\",\n \"thresholdsGrid\": [\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"1\",\n \"representation\": \"success\",\n \"text\": \"Success\"\n },\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"0\",\n \"representation\": \"failed\",\n \"text\": \"Failed\"\n },\n {\n \"operator\": \"Default\",\n \"thresholdValue\": null,\n \"representation\": \"unknown\",\n \"text\": \"Unknown\"\n }\n ]\n }\n }\n ]\n }\n },\n \"name\": \"query18\"\n }\n ]\n },\n \"conditionalVisibility\": {\n \"parameterName\": \"VisibleTab\",\n \"comparison\": \"isEqualTo\",\n \"value\": \"tab0\"\n },\n \"name\": \"tab0\"\n },\n {\n \"type\": 12,\n \"content\": {\n \"version\": \"NotebookGroup/1.0\",\n \"groupType\": \"editable\",\n \"items\": [\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"## IP plan\"\n },\n \"name\": \"tab1title\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"Use IP addresses from the address allocation ranges for private internets (RFC 1918). Check [this link](https://learn.microsoft.com/azure/cloud-adoption-framework/ready/azure-best-practices/plan-for-ip-addressing) for further information.. [This training](https://learn.microsoft.com/learn/paths/architect-network-infrastructure/) can help to educate yourself on this.\"\n },\n \"name\": \"querytext4\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"resources | where type == 'microsoft.network/virtualnetworks' | extend addressSpace = todynamic(properties.addressSpace) | extend addressPrefix = todynamic(properties.addressSpace.addressPrefixes) | mvexpand addressSpace | mvexpand addressPrefix | project name, id, location, resourceGroup, subscriptionId, cidr = addressPrefix | extend compliant = (cidr matches regex @'^(10\\\\.|172\\\\.(1[6-9]|2[0-9]|3[01])\\\\.|192\\\\.168\\\\.)') | project id, compliant, cidr | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed\",\n \"size\": 4,\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"gridSettings\": {\n \"formatters\": [\n {\n \"columnMatch\": \"id\",\n \"formatter\": 0,\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n {\n \"columnMatch\": \"compliant\",\n \"formatter\": 18,\n \"formatOptions\": {\n \"thresholdsOptions\": \"icons\",\n \"thresholdsGrid\": [\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"1\",\n \"representation\": \"success\",\n \"text\": \"Success\"\n },\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"0\",\n \"representation\": \"failed\",\n \"text\": \"Failed\"\n },\n {\n \"operator\": \"Default\",\n \"thresholdValue\": null,\n \"representation\": \"unknown\",\n \"text\": \"Unknown\"\n }\n ]\n }\n }\n ]\n }\n },\n \"name\": \"query4\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"Ensure that IP address space isn't wasted, don't create unnecessarily large virtual networks (for example /16). Check [this link](https://learn.microsoft.com/azure/cloud-adoption-framework/ready/azure-best-practices/plan-for-ip-addressing) for further information.. [This training](https://learn.microsoft.com/learn/paths/architect-network-infrastructure/) can help to educate yourself on this.\"\n },\n \"name\": \"querytext5\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"resources | where type == 'microsoft.network/virtualnetworks' | extend addressSpace = todynamic(properties.addressSpace) | extend addressPrefix = todynamic(properties.addressSpace.addressPrefixes) | mvexpand addressSpace | mvexpand addressPrefix | extend addressMask = split(addressPrefix,'/')[1] | extend compliant = addressMask > 16 | project name, id, subscriptionId, resourceGroup, addressPrefix, compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed\",\n \"size\": 4,\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"gridSettings\": {\n \"formatters\": [\n {\n \"columnMatch\": \"id\",\n \"formatter\": 0,\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n {\n \"columnMatch\": \"compliant\",\n \"formatter\": 18,\n \"formatOptions\": {\n \"thresholdsOptions\": \"icons\",\n \"thresholdsGrid\": [\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"1\",\n \"representation\": \"success\",\n \"text\": \"Success\"\n },\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"0\",\n \"representation\": \"failed\",\n \"text\": \"Failed\"\n },\n {\n \"operator\": \"Default\",\n \"thresholdValue\": null,\n \"representation\": \"unknown\",\n \"text\": \"Unknown\"\n }\n ]\n }\n }\n ]\n }\n },\n \"name\": \"query5\"\n }\n ]\n },\n \"conditionalVisibility\": {\n \"parameterName\": \"VisibleTab\",\n \"comparison\": \"isEqualTo\",\n \"value\": \"tab1\"\n },\n \"name\": \"tab1\"\n },\n {\n \"type\": 12,\n \"content\": {\n \"version\": \"NotebookGroup/1.0\",\n \"groupType\": \"editable\",\n \"items\": [\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"## Hub and spoke\"\n },\n \"name\": \"tab2title\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"If using Route Server, use a /27 prefix for the Route Server subnet. Check [this link](https://learn.microsoft.com/azure/route-server/quickstart-configure-route-server-portal#create-a-route-server-1) for further information.. [This training](https://learn.microsoft.com/training/modules/intro-to-azure-route-server/) can help to educate yourself on this.\"\n },\n \"name\": \"querytext0\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"resources | where type=='microsoft.network/virtualnetworks' | project id,subnets=properties.subnets | mv-expand subnets | project id, subnetName = subnets.name, subnetPrefix = subnets.properties.addressPrefix | extend subnetPrefixLength = split(subnetPrefix, '/')[1] | where subnetName == 'RouteServerSubnet' | extend compliant = (subnetPrefixLength <= 27) | distinct id, compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed\",\n \"size\": 4,\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"gridSettings\": {\n \"formatters\": [\n {\n \"columnMatch\": \"id\",\n \"formatter\": 0,\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n {\n \"columnMatch\": \"compliant\",\n \"formatter\": 18,\n \"formatOptions\": {\n \"thresholdsOptions\": \"icons\",\n \"thresholdsGrid\": [\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"1\",\n \"representation\": \"success\",\n \"text\": \"Success\"\n },\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"0\",\n \"representation\": \"failed\",\n \"text\": \"Failed\"\n },\n {\n \"operator\": \"Default\",\n \"thresholdValue\": null,\n \"representation\": \"unknown\",\n \"text\": \"Unknown\"\n }\n ]\n }\n }\n ]\n }\n },\n \"name\": \"query0\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"If you have more than 400 spoke networks in a region, deploy an additional hub to bypass VNet peering limits (500) and the maximum number of prefixes that can be advertised via ExpressRoute (1000). Check [this link](https://learn.microsoft.com/azure/azure-resource-manager/management/azure-subscription-service-limits?toc=/azure/virtual-network/toc.json#azure-resource-manager-virtual-networking-limits) for further information.. [This training](https://learn.microsoft.com/training/modules/hub-and-spoke-network-architecture/) can help to educate yourself on this.\"\n },\n \"name\": \"querytext1\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"resources | where type == 'microsoft.network/virtualnetworks' | mvexpand properties.virtualNetworkPeerings | summarize peeringcount = count() by id | extend compliant = (peeringcount < 450) | distinct id,compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed\",\n \"size\": 4,\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"gridSettings\": {\n \"formatters\": [\n {\n \"columnMatch\": \"id\",\n \"formatter\": 0,\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n {\n \"columnMatch\": \"compliant\",\n \"formatter\": 18,\n \"formatOptions\": {\n \"thresholdsOptions\": \"icons\",\n \"thresholdsGrid\": [\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"1\",\n \"representation\": \"success\",\n \"text\": \"Success\"\n },\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"0\",\n \"representation\": \"failed\",\n \"text\": \"Failed\"\n },\n {\n \"operator\": \"Default\",\n \"thresholdValue\": null,\n \"representation\": \"unknown\",\n \"text\": \"Unknown\"\n }\n ]\n }\n }\n ]\n }\n },\n \"name\": \"query1\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"Limit the number of routes per route table to 400. Check [this link](https://learn.microsoft.com/azure/azure-resource-manager/management/azure-subscription-service-limits?toc=/azure/virtual-network/toc.json#azure-resource-manager-virtual-networking-limits) for further information.. [This training](https://learn.microsoft.com/training/modules/hub-and-spoke-network-architecture/) can help to educate yourself on this.\"\n },\n \"name\": \"querytext2\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"resources | where type=='microsoft.network/routetables' | mvexpand properties.routes | summarize routeCount = count() by id | extend compliant = (routeCount < 360) | distinct id,compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed\",\n \"size\": 4,\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"gridSettings\": {\n \"formatters\": [\n {\n \"columnMatch\": \"id\",\n \"formatter\": 0,\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n {\n \"columnMatch\": \"compliant\",\n \"formatter\": 18,\n \"formatOptions\": {\n \"thresholdsOptions\": \"icons\",\n \"thresholdsGrid\": [\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"1\",\n \"representation\": \"success\",\n \"text\": \"Success\"\n },\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"0\",\n \"representation\": \"failed\",\n \"text\": \"Failed\"\n },\n {\n \"operator\": \"Default\",\n \"thresholdValue\": null,\n \"representation\": \"unknown\",\n \"text\": \"Unknown\"\n }\n ]\n }\n }\n ]\n }\n },\n \"name\": \"query2\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"Use the setting 'Allow traffic to remote virtual network' when configuring VNet peerings. Check [this link](https://learn.microsoft.com/azure/virtual-network/virtual-network-manage-peering) for further information.. [This training](https://learn.microsoft.com/training/modules/hub-and-spoke-network-architecture/) can help to educate yourself on this.\"\n },\n \"name\": \"querytext3\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"resources | where type == 'microsoft.network/virtualnetworks' | mvexpand properties.virtualNetworkPeerings | project id, peeringName=properties_virtualNetworkPeerings.name, compliant = (properties_virtualNetworkPeerings.properties.allowVirtualNetworkAccess == True) | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed\",\n \"size\": 4,\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"gridSettings\": {\n \"formatters\": [\n {\n \"columnMatch\": \"id\",\n \"formatter\": 0,\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n {\n \"columnMatch\": \"compliant\",\n \"formatter\": 18,\n \"formatOptions\": {\n \"thresholdsOptions\": \"icons\",\n \"thresholdsGrid\": [\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"1\",\n \"representation\": \"success\",\n \"text\": \"Success\"\n },\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"0\",\n \"representation\": \"failed\",\n \"text\": \"Failed\"\n },\n {\n \"operator\": \"Default\",\n \"thresholdValue\": null,\n \"representation\": \"unknown\",\n \"text\": \"Unknown\"\n }\n ]\n }\n }\n ]\n }\n },\n \"name\": \"query3\"\n }\n ]\n },\n \"conditionalVisibility\": {\n \"parameterName\": \"VisibleTab\",\n \"comparison\": \"isEqualTo\",\n \"value\": \"tab2\"\n },\n \"name\": \"tab2\"\n },\n {\n \"type\": 12,\n \"content\": {\n \"version\": \"NotebookGroup/1.0\",\n \"groupType\": \"editable\",\n \"items\": [\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"## Segmentation\"\n },\n \"name\": \"tab3title\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"Use a /26 prefix for your Azure Firewall subnets. Check [this link](https://learn.microsoft.com/azure/firewall/firewall-faq#why-does-azure-firewall-need-a--26-subnet-size) for further information.. [This training](https://learn.microsoft.com/training/modules/introduction-azure-firewall/) can help to educate yourself on this.\"\n },\n \"name\": \"querytext19\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"resources | where type=='microsoft.network/virtualnetworks' | project id,subnets=properties.subnets | mv-expand subnets | project id, subnetName = subnets.name, subnetPrefix = subnets.properties.addressPrefix | extend subnetPrefixLength = split(subnetPrefix, '/')[1] | where subnetName == 'AzureFirewallSubnet' | extend compliant = (subnetPrefixLength == 26) | distinct id, compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed\",\n \"size\": 4,\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"gridSettings\": {\n \"formatters\": [\n {\n \"columnMatch\": \"id\",\n \"formatter\": 0,\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n {\n \"columnMatch\": \"compliant\",\n \"formatter\": 18,\n \"formatOptions\": {\n \"thresholdsOptions\": \"icons\",\n \"thresholdsGrid\": [\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"1\",\n \"representation\": \"success\",\n \"text\": \"Success\"\n },\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"0\",\n \"representation\": \"failed\",\n \"text\": \"Failed\"\n },\n {\n \"operator\": \"Default\",\n \"thresholdValue\": null,\n \"representation\": \"unknown\",\n \"text\": \"Unknown\"\n }\n ]\n }\n }\n ]\n }\n },\n \"name\": \"query19\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"Use at least a /27 prefix for your Gateway subnets. Check [this link](https://learn.microsoft.com/azure/expressroute/expressroute-howto-add-gateway-resource-manager#add-a-gateway) for further information.\"\n },\n \"name\": \"querytext21\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"resources | where type=='microsoft.network/virtualnetworks' | project id,subnets=properties.subnets | mv-expand subnets | project id, subnetName = subnets.name, subnetPrefix = subnets.properties.addressPrefix | extend subnetPrefixLength = split(subnetPrefix, '/')[1] | where subnetName == 'GatewaySubnet' | extend compliant = (subnetPrefixLength <= 27) | distinct id, compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed\",\n \"size\": 4,\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"gridSettings\": {\n \"formatters\": [\n {\n \"columnMatch\": \"id\",\n \"formatter\": 0,\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n {\n \"columnMatch\": \"compliant\",\n \"formatter\": 18,\n \"formatOptions\": {\n \"thresholdsOptions\": \"icons\",\n \"thresholdsGrid\": [\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"1\",\n \"representation\": \"success\",\n \"text\": \"Success\"\n },\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"0\",\n \"representation\": \"failed\",\n \"text\": \"Failed\"\n },\n {\n \"operator\": \"Default\",\n \"thresholdValue\": null,\n \"representation\": \"unknown\",\n \"text\": \"Unknown\"\n }\n ]\n }\n }\n ]\n }\n },\n \"name\": \"query21\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"Don't rely on the NSG inbound default rules using the VirtualNetwork service tag to limit connectivity. Check [this link](https://learn.microsoft.com/azure/virtual-network/service-tags-overview#available-service-tags) for further information.\"\n },\n \"name\": \"querytext22\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"resources | where type=='microsoft.network/networksecuritygroups' | mvexpand properties.securityRules | project id,name,ruleAction=properties_securityRules.properties.access,rulePriority=properties_securityRules.properties.priority,ruleDst=properties_securityRules.properties.destinationAddressPrefix,ruleSrc=properties_securityRules.properties.sourceAddressPrefix,ruleProt=properties_securityRules.properties.protocol,ruleDirection=properties_securityRules.properties.direction,rulePort=properties_securityRules.properties.destinationPortRange | summarize StarDenies=countif(ruleAction=='Deny' and ruleDst=='*' and ruleSrc=='*' and ruleProt=='*' and rulePort=='*') by id,tostring(ruleDirection) | where ruleDirection == 'Inbound' | project id,compliant=(StarDenies>0) | union (resources | where type=='microsoft.network/networksecuritygroups' | where array_length(properties.securityRules)==0 | extend compliant=false | project id,compliant) | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed\",\n \"size\": 4,\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"gridSettings\": {\n \"formatters\": [\n {\n \"columnMatch\": \"id\",\n \"formatter\": 0,\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n {\n \"columnMatch\": \"compliant\",\n \"formatter\": 18,\n \"formatOptions\": {\n \"thresholdsOptions\": \"icons\",\n \"thresholdsGrid\": [\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"1\",\n \"representation\": \"success\",\n \"text\": \"Success\"\n },\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"0\",\n \"representation\": \"failed\",\n \"text\": \"Failed\"\n },\n {\n \"operator\": \"Default\",\n \"thresholdValue\": null,\n \"representation\": \"unknown\",\n \"text\": \"Unknown\"\n }\n ]\n }\n }\n ]\n }\n },\n \"name\": \"query22\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"Do not implement more than 900 NSG rules per NSG, due to the limit of 1000 rules. Check [this link](https://learn.microsoft.com/azure/azure-resource-manager/management/azure-subscription-service-limits) for further information.. [This training](https://learn.microsoft.com/azure/virtual-network/network-security-group-how-it-works) can help to educate yourself on this.\"\n },\n \"name\": \"querytext23\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"resources | where type == 'microsoft.network/networksecuritygroups' | project id, rules = array_length(properties.securityRules) | project id, compliant = (rules < 900) | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed\",\n \"size\": 4,\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"gridSettings\": {\n \"formatters\": [\n {\n \"columnMatch\": \"id\",\n \"formatter\": 0,\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n {\n \"columnMatch\": \"compliant\",\n \"formatter\": 18,\n \"formatOptions\": {\n \"thresholdsOptions\": \"icons\",\n \"thresholdsGrid\": [\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"1\",\n \"representation\": \"success\",\n \"text\": \"Success\"\n },\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"0\",\n \"representation\": \"failed\",\n \"text\": \"Failed\"\n },\n {\n \"operator\": \"Default\",\n \"thresholdValue\": null,\n \"representation\": \"unknown\",\n \"text\": \"Unknown\"\n }\n ]\n }\n }\n ]\n }\n },\n \"name\": \"query23\"\n }\n ]\n },\n \"conditionalVisibility\": {\n \"parameterName\": \"VisibleTab\",\n \"comparison\": \"isEqualTo\",\n \"value\": \"tab3\"\n },\n \"name\": \"tab3\"\n },\n {\n \"type\": 12,\n \"content\": {\n \"version\": \"NotebookGroup/1.0\",\n \"groupType\": \"editable\",\n \"items\": [\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"## Virtual WAN\"\n },\n \"name\": \"tab4title\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"For outbound Internet traffic protection and filtering, deploy Azure Firewall in secured hubs. Check [this link](https://learn.microsoft.com/azure/virtual-wan/howto-firewall) for further information.. [This training](https://learn.microsoft.com/learn/paths/secure-networking-infrastructure/) can help to educate yourself on this.\"\n },\n \"name\": \"querytext24\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"resources | where type=='microsoft.network/virtualhubs' | extend compliant = isnotnull(properties.azureFirewall.id) | project id, compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed\",\n \"size\": 4,\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"gridSettings\": {\n \"formatters\": [\n {\n \"columnMatch\": \"id\",\n \"formatter\": 0,\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n {\n \"columnMatch\": \"compliant\",\n \"formatter\": 18,\n \"formatOptions\": {\n \"thresholdsOptions\": \"icons\",\n \"thresholdsGrid\": [\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"1\",\n \"representation\": \"success\",\n \"text\": \"Success\"\n },\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"0\",\n \"representation\": \"failed\",\n \"text\": \"Failed\"\n },\n {\n \"operator\": \"Default\",\n \"thresholdValue\": null,\n \"representation\": \"unknown\",\n \"text\": \"Unknown\"\n }\n ]\n }\n }\n ]\n }\n },\n \"name\": \"query24\"\n }\n ]\n },\n \"conditionalVisibility\": {\n \"parameterName\": \"VisibleTab\",\n \"comparison\": \"isEqualTo\",\n \"value\": \"tab4\"\n },\n \"name\": \"tab4\"\n },\n {\n \"type\": 12,\n \"content\": {\n \"version\": \"NotebookGroup/1.0\",\n \"groupType\": \"editable\",\n \"items\": [\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"## Hybrid\"\n },\n \"name\": \"tab5title\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"Select the right SKU for the ExpressRoute/VPN gateways based on bandwidth and performance requirements. Check [this link](https://learn.microsoft.com/azure/expressroute/expressroute-about-virtual-network-gateways?source=recommendations#gwsku) for further information.. [This training](https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/) can help to educate yourself on this.\"\n },\n \"name\": \"querytext7\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"resources| where type == 'microsoft.network/virtualnetworkgateways'| where properties.gatewayType =~ 'vpn' or properties.gatewayType == 'ExpressRoute'| extend SKUName = properties.sku.name, SKUTier = properties.sku.tier, Type = properties.gatewayType| extend compliant = SKUTier !in ('Basic', 'Standard')| project name, id, subscriptionId, resourceGroup, compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed\",\n \"size\": 4,\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"gridSettings\": {\n \"formatters\": [\n {\n \"columnMatch\": \"id\",\n \"formatter\": 0,\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n {\n \"columnMatch\": \"compliant\",\n \"formatter\": 18,\n \"formatOptions\": {\n \"thresholdsOptions\": \"icons\",\n \"thresholdsGrid\": [\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"1\",\n \"representation\": \"success\",\n \"text\": \"Success\"\n },\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"0\",\n \"representation\": \"failed\",\n \"text\": \"Failed\"\n },\n {\n \"operator\": \"Default\",\n \"thresholdValue\": null,\n \"representation\": \"unknown\",\n \"text\": \"Unknown\"\n }\n ]\n }\n }\n ]\n }\n },\n \"name\": \"query7\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"Ensure that you're using unlimited-data ExpressRoute circuits only if you reach the bandwidth that justifies their cost. Check [this link](https://learn.microsoft.com/azure/expressroute/plan-manage-cost) for further information.. [This training](https://learn.microsoft.com/training/modules/design-implement-azure-expressroute/) can help to educate yourself on this.\"\n },\n \"name\": \"querytext8\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"resources | where type=='microsoft.network/expressroutecircuits' | extend compliant = (tolower(sku.family) == 'metereddata' or tolower(sku.tier) == 'local') | distinct id,compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed\",\n \"size\": 4,\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"gridSettings\": {\n \"formatters\": [\n {\n \"columnMatch\": \"id\",\n \"formatter\": 0,\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n {\n \"columnMatch\": \"compliant\",\n \"formatter\": 18,\n \"formatOptions\": {\n \"thresholdsOptions\": \"icons\",\n \"thresholdsGrid\": [\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"1\",\n \"representation\": \"success\",\n \"text\": \"Success\"\n },\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"0\",\n \"representation\": \"failed\",\n \"text\": \"Failed\"\n },\n {\n \"operator\": \"Default\",\n \"thresholdValue\": null,\n \"representation\": \"unknown\",\n \"text\": \"Unknown\"\n }\n ]\n }\n }\n ]\n }\n },\n \"name\": \"query8\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"Leverage the Local SKU of ExpressRoute to reduce the cost of your circuits, if your circuit peering location supports your Azure regions for the Local SKU. Check [this link](https://learn.microsoft.com/azure/expressroute/expressroute-faqs#expressroute-local) for further information.. [This training](https://learn.microsoft.com/training/modules/design-implement-azure-expressroute/) can help to educate yourself on this.\"\n },\n \"name\": \"querytext9\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"resources | where type=='microsoft.network/connections' | where properties.connectionType == 'ExpressRoute' | project id, gwid=tostring(properties.virtualNetworkGateway1.id), circuitid=tostring(properties.peer.id) | join (resources | where type=='microsoft.network/expressroutecircuits' | project circuitid=tostring(id), circuitsku=sku.tier) on circuitid | project id=gwid, compliant = (circuitsku == 'Local') | summarize compliant=max(compliant) by id | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed\",\n \"size\": 4,\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"gridSettings\": {\n \"formatters\": [\n {\n \"columnMatch\": \"id\",\n \"formatter\": 0,\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n {\n \"columnMatch\": \"compliant\",\n \"formatter\": 18,\n \"formatOptions\": {\n \"thresholdsOptions\": \"icons\",\n \"thresholdsGrid\": [\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"1\",\n \"representation\": \"success\",\n \"text\": \"Success\"\n },\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"0\",\n \"representation\": \"failed\",\n \"text\": \"Failed\"\n },\n {\n \"operator\": \"Default\",\n \"thresholdValue\": null,\n \"representation\": \"unknown\",\n \"text\": \"Unknown\"\n }\n ]\n }\n }\n ]\n }\n },\n \"name\": \"query9\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"Deploy a zone-redundant ExpressRoute gateway in the supported Azure regions. Check [this link](https://learn.microsoft.com/azure/expressroute/expressroute-about-virtual-network-gateways) for further information.. [This training](https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/) can help to educate yourself on this.\"\n },\n \"name\": \"querytext10\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"resources| where type == 'microsoft.network/virtualnetworkgateways'| where properties.gatewayType =~ 'vpn' or properties.gatewayType == 'ExpressRoute'| extend SKUName = properties.sku.name, SKUTier = properties.sku.tier, Type = properties.gatewayType| extend compliant = SKUTier contains 'AZ'| project name, id, subscriptionId, resourceGroup, Type, compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed\",\n \"size\": 4,\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"gridSettings\": {\n \"formatters\": [\n {\n \"columnMatch\": \"id\",\n \"formatter\": 0,\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n {\n \"columnMatch\": \"compliant\",\n \"formatter\": 18,\n \"formatOptions\": {\n \"thresholdsOptions\": \"icons\",\n \"thresholdsGrid\": [\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"1\",\n \"representation\": \"success\",\n \"text\": \"Success\"\n },\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"0\",\n \"representation\": \"failed\",\n \"text\": \"Failed\"\n },\n {\n \"operator\": \"Default\",\n \"thresholdValue\": null,\n \"representation\": \"unknown\",\n \"text\": \"Unknown\"\n }\n ]\n }\n }\n ]\n }\n },\n \"name\": \"query10\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"Use zone-redundant VPN gateways to connect branches or remote locations to Azure (where available). Check [this link](https://learn.microsoft.com/azure/vpn-gateway/create-zone-redundant-vnet-gateway) for further information.. [This training](https://learn.microsoft.com/training/modules/intro-to-azure-vpn-gateway/) can help to educate yourself on this.\"\n },\n \"name\": \"querytext11\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"resources | where type=='microsoft.network/virtualnetworkgateways' | where properties.gatewayType == 'Vpn' | extend compliant = (tolower(properties.sku.name) contains 'az') | distinct id, compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed\",\n \"size\": 4,\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"gridSettings\": {\n \"formatters\": [\n {\n \"columnMatch\": \"id\",\n \"formatter\": 0,\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n {\n \"columnMatch\": \"compliant\",\n \"formatter\": 18,\n \"formatOptions\": {\n \"thresholdsOptions\": \"icons\",\n \"thresholdsGrid\": [\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"1\",\n \"representation\": \"success\",\n \"text\": \"Success\"\n },\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"0\",\n \"representation\": \"failed\",\n \"text\": \"Failed\"\n },\n {\n \"operator\": \"Default\",\n \"thresholdValue\": null,\n \"representation\": \"unknown\",\n \"text\": \"Unknown\"\n }\n ]\n }\n }\n ]\n }\n },\n \"name\": \"query11\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"Use ExpressRoute circuits from different peering locations for redundancy. Check [this link](https://learn.microsoft.com/azure/expressroute/designing-for-disaster-recovery-with-expressroute-privatepeering#need-for-redundant-connectivity-solution) for further information.. [This training](https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/) can help to educate yourself on this.\"\n },\n \"name\": \"querytext12\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"resources | where type=='microsoft.network/connections' | where properties.connectionType == 'ExpressRoute' | project cxId=id, gwId=tostring(properties.virtualNetworkGateway1.id), circuitId=tostring(properties.peer.id) | join (resources | where type=='microsoft.network/expressroutecircuits' | project circuitId=tostring(id), circuitLocation=tostring(properties.serviceProviderProperties.peeringLocation)) on circuitId | distinct gwId, circuitLocation | summarize countErLocations=count() by id=gwId | extend compliant = (countErLocations >= 2) | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed\",\n \"size\": 4,\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"gridSettings\": {\n \"formatters\": [\n {\n \"columnMatch\": \"id\",\n \"formatter\": 0,\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n {\n \"columnMatch\": \"compliant\",\n \"formatter\": 18,\n \"formatOptions\": {\n \"thresholdsOptions\": \"icons\",\n \"thresholdsGrid\": [\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"1\",\n \"representation\": \"success\",\n \"text\": \"Success\"\n },\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"0\",\n \"representation\": \"failed\",\n \"text\": \"Failed\"\n },\n {\n \"operator\": \"Default\",\n \"thresholdValue\": null,\n \"representation\": \"unknown\",\n \"text\": \"Unknown\"\n }\n ]\n }\n }\n ]\n }\n },\n \"name\": \"query12\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"If you are using a route table in the GatewaySubnet, make sure that gateway routes are propagated. Check [this link](https://learn.microsoft.com/azure/vpn-gateway/vpn-gateway-about-vpn-gateway-settings#gwsub) for further information.\"\n },\n \"name\": \"querytext13\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"resources | where type=='microsoft.network/virtualnetworks' | project id,resourceGroup,name,subnets=properties.subnets | mv-expand subnets | project id,resourceGroup,name,subnetName=tostring(subnets.name),routeTableId=tostring(subnets.properties.routeTable.id) | where subnetName == 'GatewaySubnet' | join kind=leftouter (Resources | where type == 'microsoft.network/routetables' | project routeTableName=name,routeTableId=id, disableBgpRoutePropagation=properties.disableBgpRoutePropagation) on routeTableId | project id,compliant = (disableBgpRoutePropagation == False or isnull(disableBgpRoutePropagation)) | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed\",\n \"size\": 4,\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"gridSettings\": {\n \"formatters\": [\n {\n \"columnMatch\": \"id\",\n \"formatter\": 0,\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n {\n \"columnMatch\": \"compliant\",\n \"formatter\": 18,\n \"formatOptions\": {\n \"thresholdsOptions\": \"icons\",\n \"thresholdsGrid\": [\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"1\",\n \"representation\": \"success\",\n \"text\": \"Success\"\n },\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"0\",\n \"representation\": \"failed\",\n \"text\": \"Failed\"\n },\n {\n \"operator\": \"Default\",\n \"thresholdValue\": null,\n \"representation\": \"unknown\",\n \"text\": \"Unknown\"\n }\n ]\n }\n }\n ]\n }\n },\n \"name\": \"query13\"\n }\n ]\n },\n \"conditionalVisibility\": {\n \"parameterName\": \"VisibleTab\",\n \"comparison\": \"isEqualTo\",\n \"value\": \"tab5\"\n },\n \"name\": \"tab5\"\n },\n {\n \"type\": 12,\n \"content\": {\n \"version\": \"NotebookGroup/1.0\",\n \"groupType\": \"editable\",\n \"items\": [\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"## Internet\"\n },\n \"name\": \"tab6title\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"Use Azure Bastion in a subnet /26 or larger. Check [this link](https://learn.microsoft.com/azure/bastion/bastion-faq#subnet) for further information.. [This training](https://learn.microsoft.com/training/modules/intro-to-azure-bastion/) can help to educate yourself on this.\"\n },\n \"name\": \"querytext6\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"resources | where type=='microsoft.network/virtualnetworks' | project id,subnets=properties.subnets | mv-expand subnets | project id, subnetName = subnets.name, subnetPrefix = subnets.properties.addressPrefix | extend subnetPrefixLength = split(subnetPrefix, '/')[1] | where subnetName == 'AzureBastionSubnet' | extend compliant = (subnetPrefixLength <= 26) | distinct id, compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed\",\n \"size\": 4,\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"gridSettings\": {\n \"formatters\": [\n {\n \"columnMatch\": \"id\",\n \"formatter\": 0,\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n {\n \"columnMatch\": \"compliant\",\n \"formatter\": 18,\n \"formatOptions\": {\n \"thresholdsOptions\": \"icons\",\n \"thresholdsGrid\": [\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"1\",\n \"representation\": \"success\",\n \"text\": \"Success\"\n },\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"0\",\n \"representation\": \"failed\",\n \"text\": \"Failed\"\n },\n {\n \"operator\": \"Default\",\n \"thresholdValue\": null,\n \"representation\": \"unknown\",\n \"text\": \"Unknown\"\n }\n ]\n }\n }\n ]\n }\n },\n \"name\": \"query6\"\n }\n ]\n },\n \"conditionalVisibility\": {\n \"parameterName\": \"VisibleTab\",\n \"comparison\": \"isEqualTo\",\n \"value\": \"tab6\"\n },\n \"name\": \"tab6\"\n },\n {\n \"type\": 12,\n \"content\": {\n \"version\": \"NotebookGroup/1.0\",\n \"groupType\": \"editable\",\n \"items\": [\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"## PaaS\"\n },\n \"name\": \"tab7title\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"Don't enable virtual network service endpoints by default on all subnets. Check [this link](https://learn.microsoft.com/azure/virtual-network/virtual-network-service-endpoints-overview) for further information.. [This training](https://learn.microsoft.com/learn/paths/implement-network-security/?source=learn) can help to educate yourself on this.\"\n },\n \"name\": \"querytext20\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"resources | where type =~ 'microsoft.network/virtualnetworks' | project id,resourceGroup,name,subnets = properties.subnets | mv-expand subnets | project id = subnets.id, resourceGroup, VNet = name, serviceEndpoints = subnets.properties.serviceEndpoints, compliant = (isnull(subnets.properties.serviceEndpoints) or array_length(subnets.properties.serviceEndpoints) == 0) | order by compliant asc | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed\",\n \"size\": 4,\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"gridSettings\": {\n \"formatters\": [\n {\n \"columnMatch\": \"id\",\n \"formatter\": 0,\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n {\n \"columnMatch\": \"compliant\",\n \"formatter\": 18,\n \"formatOptions\": {\n \"thresholdsOptions\": \"icons\",\n \"thresholdsGrid\": [\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"1\",\n \"representation\": \"success\",\n \"text\": \"Success\"\n },\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"0\",\n \"representation\": \"failed\",\n \"text\": \"Failed\"\n },\n {\n \"operator\": \"Default\",\n \"thresholdValue\": null,\n \"representation\": \"unknown\",\n \"text\": \"Unknown\"\n }\n ]\n }\n }\n ]\n }\n },\n \"name\": \"query20\"\n }\n ]\n },\n \"conditionalVisibility\": {\n \"parameterName\": \"VisibleTab\",\n \"comparison\": \"isEqualTo\",\n \"value\": \"tab7\"\n },\n \"name\": \"tab7\"\n }\n ],\n \"$schema\": \"https://github.com/Microsoft/Application-Insights-Workbooks/blob/master/schema/workbook.json\"\n}", "version": "1.0", "sourceId": "[parameters('workbookSourceId')]", "category": "[parameters('workbookType')]" diff --git a/workbooks/alz_checklist.en_network_tabcounters.json b/workbooks/alz_checklist.en_network_tabcounters.json index f5eeece20..759bd398e 100644 --- a/workbooks/alz_checklist.en_network_tabcounters.json +++ b/workbooks/alz_checklist.en_network_tabcounters.json @@ -70,25 +70,25 @@ "style": "tabs", "links": [ { - "id": "a133c15c-e49d-47cb-8b97-ffdf564e4c9d", + "id": "7fa4ae01-6e28-4e40-a83d-87622bac7c8c", "cellValue": "VisibleTab", "linkTarget": "parameter", - "linkLabel": "IP plan", + "linkLabel": "Internet", "subTarget": "tab0", - "preText": "IP plan", + "preText": "Internet", "style": "primary" }, { - "id": "1a90fe1a-16b0-4150-a881-03106bd53197", + "id": "15c25825-0033-4fe9-8636-696d760e2789", "cellValue": "VisibleTab", "linkTarget": "parameter", - "linkLabel": "Firewall", + "linkLabel": "Hybrid", "subTarget": "tab1", - "preText": "Firewall", + "preText": "Hybrid", "style": "primary" }, { - "id": "953c4465-f7e2-49c8-8ec5-8c68c3ac24bd", + "id": "08fa3598-b03d-41b0-971d-befb063f6191", "cellValue": "VisibleTab", "linkTarget": "parameter", "linkLabel": "Hub and spoke", @@ -97,16 +97,16 @@ "style": "primary" }, { - "id": "2d4ade89-52f2-4c98-8b38-275f70e14b97", + "id": "25d23d11-3b3c-4d71-b331-91869ac7c509", "cellValue": "VisibleTab", "linkTarget": "parameter", - "linkLabel": "Hybrid", + "linkLabel": "Firewall", "subTarget": "tab3", - "preText": "Hybrid", + "preText": "Firewall", "style": "primary" }, { - "id": "39ceaf48-7e1b-4ed8-88b5-e0c6498b19aa", + "id": "e3f6794c-465e-4266-beb6-64187fc630c9", "cellValue": "VisibleTab", "linkTarget": "parameter", "linkLabel": "PaaS", @@ -115,30 +115,30 @@ "style": "primary" }, { - "id": "73469dff-dff9-414c-969a-565c72c5d323", + "id": "52a3f5cc-2a29-4686-9b7f-6a391edf22d3", "cellValue": "VisibleTab", "linkTarget": "parameter", - "linkLabel": "Segmentation", + "linkLabel": "Virtual WAN", "subTarget": "tab5", - "preText": "Segmentation", + "preText": "Virtual WAN", "style": "primary" }, { - "id": "bd1779f4-ab82-479f-95b9-0b9f3a6a76bf", + "id": "623cbeea-0055-429a-8db4-58a5fff1cf20", "cellValue": "VisibleTab", "linkTarget": "parameter", - "linkLabel": "Virtual WAN", + "linkLabel": "Segmentation", "subTarget": "tab6", - "preText": "Virtual WAN", + "preText": "Segmentation", "style": "primary" }, { - "id": "2c6f8942-4bd4-48fe-b802-68d1a58b7a4e", + "id": "60eec08a-97d0-4bf8-a558-c31af15406f5", "cellValue": "VisibleTab", "linkTarget": "parameter", - "linkLabel": "Internet", + "linkLabel": "IP plan", "subTarget": "tab7", - "preText": "Internet", + "preText": "IP plan", "style": "primary" } ] @@ -162,37 +162,9 @@ { "id": "daf05c62-1d5b-4325-b241-d7ee468f23eb", "version": "KqlParameterItem/1.0", - "name": "Query4Stats", - "type": 1, - "query": "resources | where type == 'microsoft.network/virtualnetworks' | extend addressSpace = todynamic(properties.addressSpace) | extend addressPrefix = todynamic(properties.addressSpace.addressPrefixes) | mvexpand addressSpace | mvexpand addressPrefix | project name, id, location, resourceGroup, subscriptionId, cidr = addressPrefix | extend compliant = (cidr matches regex @'^(10\\.|172\\.(1[6-9]|2[0-9]|3[01])\\.|192\\.168\\.)') | project id, compliant, cidr| summarize Total = count(), Success = countif(compliant==1), Failed = countif(compliant==0) | extend SuccessPercent = iff(Total==0, 100, 100*toint(Success)/toint(Total)) | extend FullyCompliant = iff(SuccessPercent == 100, 'Yes', 'No') | project Query1Stats=tostring(pack_all())", - "crossComponentResources": [ - "{Subscription}" - ], - "isHiddenWhenLocked": true, - "timeContext": { - "durationMs": 86400000 - }, - "queryType": 1, - "resourceType": "microsoft.resourcegraph/resources" - }, - { - "id": "daf05c62-1d5b-4325-b241-d7ee468f23eb", - "version": "KqlParameterItem/1.0", - "name": "Query4FullyCompliant", - "type": 1, - "query": "{\"version\":\"1.0.0\",\"content\":\"{\\\"value\\\": \\\"{Query4Stats:$.FullyCompliant}\\\"}\",\"transformers\":null}", - "isHiddenWhenLocked": true, - "timeContext": { - "durationMs": 86400000 - }, - "queryType": 8 - }, - { - "id": "daf05c62-1d5b-4325-b241-d7ee468f23eb", - "version": "KqlParameterItem/1.0", - "name": "Query5Stats", + "name": "Query6Stats", "type": 1, - "query": "resources | where type == 'microsoft.network/virtualnetworks' | extend addressSpace = todynamic(properties.addressSpace) | extend addressPrefix = todynamic(properties.addressSpace.addressPrefixes) | mvexpand addressSpace | mvexpand addressPrefix | extend addressMask = split(addressPrefix,'/')[1] | extend compliant = addressMask > 16 | project name, id, subscriptionId, resourceGroup, addressPrefix, compliant| summarize Total = count(), Success = countif(compliant==1), Failed = countif(compliant==0) | extend SuccessPercent = iff(Total==0, 100, 100*toint(Success)/toint(Total)) | extend FullyCompliant = iff(SuccessPercent == 100, 'Yes', 'No') | project Query1Stats=tostring(pack_all())", + "query": "resources | where type=='microsoft.network/virtualnetworks' | project id,subnets=properties.subnets | mv-expand subnets | project id, subnetName = subnets.name, subnetPrefix = subnets.properties.addressPrefix | extend subnetPrefixLength = split(subnetPrefix, '/')[1] | where subnetName == 'AzureBastionSubnet' | extend compliant = (subnetPrefixLength <= 26) | distinct id, compliant| summarize Total = count(), Success = countif(compliant==1), Failed = countif(compliant==0) | extend SuccessPercent = iff(Total==0, 100, 100*toint(Success)/toint(Total)) | extend FullyCompliant = iff(SuccessPercent == 100, 'Yes', 'No') | project Query1Stats=tostring(pack_all())", "crossComponentResources": [ "{Subscription}" ], @@ -206,9 +178,9 @@ { "id": "daf05c62-1d5b-4325-b241-d7ee468f23eb", "version": "KqlParameterItem/1.0", - "name": "Query5FullyCompliant", + "name": "Query6FullyCompliant", "type": 1, - "query": "{\"version\":\"1.0.0\",\"content\":\"{\\\"value\\\": \\\"{Query5Stats:$.FullyCompliant}\\\"}\",\"transformers\":null}", + "query": "{\"version\":\"1.0.0\",\"content\":\"{\\\"value\\\": \\\"{Query6Stats:$.FullyCompliant}\\\"}\",\"transformers\":null}", "isHiddenWhenLocked": true, "timeContext": { "durationMs": 86400000 @@ -229,7 +201,7 @@ "criteriaContext": { "operator": "Default", "resultValType": "expression", - "resultVal": "{Query4Stats:$.Success}+{Query5Stats:$.Success}" + "resultVal": "{Query6Stats:$.Success}" } } ] @@ -248,7 +220,7 @@ "criteriaContext": { "operator": "Default", "resultValType": "expression", - "resultVal": "{Query4Stats:$.Total}+{Query5Stats:$.Total}" + "resultVal": "{Query6Stats:$.Total}" } } ] @@ -282,7 +254,7 @@ { "type": 1, "content": { - "json": "## IP plan" + "json": "## Internet" }, "customWidth": "50", "name": "tab0title" @@ -323,77 +295,15 @@ { "type": 1, "content": { - "json": "Use IP addresses from the address allocation ranges for private internets (RFC 1918). Check [this link](https://learn.microsoft.com/azure/cloud-adoption-framework/ready/azure-best-practices/plan-for-ip-addressing) for further information.. [This training](https://learn.microsoft.com/learn/paths/architect-network-infrastructure/) can help to educate yourself on this." - }, - "name": "querytext4" - }, - { - "type": 3, - "content": { - "version": "KqlItem/1.0", - "query": "resources | where type == 'microsoft.network/virtualnetworks' | extend addressSpace = todynamic(properties.addressSpace) | extend addressPrefix = todynamic(properties.addressSpace.addressPrefixes) | mvexpand addressSpace | mvexpand addressPrefix | project name, id, location, resourceGroup, subscriptionId, cidr = addressPrefix | extend compliant = (cidr matches regex @'^(10\\.|172\\.(1[6-9]|2[0-9]|3[01])\\.|192\\.168\\.)') | project id, compliant, cidr | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed", - "size": 4, - "queryType": 1, - "resourceType": "microsoft.resourcegraph/resources", - "crossComponentResources": [ - "{Subscription}" - ], - "gridSettings": { - "formatters": [ - { - "columnMatch": "id", - "formatter": 0, - "numberFormat": { - "unit": 0, - "options": { - "style": "decimal" - } - } - }, - { - "columnMatch": "compliant", - "formatter": 18, - "formatOptions": { - "thresholdsOptions": "icons", - "thresholdsGrid": [ - { - "operator": "==", - "thresholdValue": "1", - "representation": "success", - "text": "Success" - }, - { - "operator": "==", - "thresholdValue": "0", - "representation": "failed", - "text": "Failed" - }, - { - "operator": "Default", - "thresholdValue": null, - "representation": "unknown", - "text": "Unknown" - } - ] - } - } - ] - } - }, - "name": "query4" - }, - { - "type": 1, - "content": { - "json": "Ensure that IP address space isn't wasted, don't create unnecessarily large virtual networks (for example /16). Check [this link](https://learn.microsoft.com/azure/cloud-adoption-framework/ready/azure-best-practices/plan-for-ip-addressing) for further information.. [This training](https://learn.microsoft.com/learn/paths/architect-network-infrastructure/) can help to educate yourself on this." + "json": "Use Azure Bastion in a subnet /26 or larger. Check [this link](https://learn.microsoft.com/azure/bastion/bastion-faq#subnet) for further information.. [This training](https://learn.microsoft.com/training/modules/intro-to-azure-bastion/) can help to educate yourself on this." }, - "name": "querytext5" + "name": "querytext6" }, { "type": 3, "content": { "version": "KqlItem/1.0", - "query": "resources | where type == 'microsoft.network/virtualnetworks' | extend addressSpace = todynamic(properties.addressSpace) | extend addressPrefix = todynamic(properties.addressSpace.addressPrefixes) | mvexpand addressSpace | mvexpand addressPrefix | extend addressMask = split(addressPrefix,'/')[1] | extend compliant = addressMask > 16 | project name, id, subscriptionId, resourceGroup, addressPrefix, compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed", + "query": "resources | where type=='microsoft.network/virtualnetworks' | project id,subnets=properties.subnets | mv-expand subnets | project id, subnetName = subnets.name, subnetPrefix = subnets.properties.addressPrefix | extend subnetPrefixLength = split(subnetPrefix, '/')[1] | where subnetName == 'AzureBastionSubnet' | extend compliant = (subnetPrefixLength <= 26) | distinct id, compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed", "size": 4, "queryType": 1, "resourceType": "microsoft.resourcegraph/resources", @@ -442,7 +352,7 @@ ] } }, - "name": "query5" + "name": "query6" } ] }, @@ -470,9 +380,9 @@ { "id": "daf05c62-1d5b-4325-b241-d7ee468f23eb", "version": "KqlParameterItem/1.0", - "name": "Query14Stats", + "name": "Query7Stats", "type": 1, - "query": "resources | where type=='microsoft.network/firewallpolicies' | extend compliant = (properties.dnsSettings.enableProxy == true) | distinct id,compliant| summarize Total = count(), Success = countif(compliant==1), Failed = countif(compliant==0) | extend SuccessPercent = iff(Total==0, 100, 100*toint(Success)/toint(Total)) | extend FullyCompliant = iff(SuccessPercent == 100, 'Yes', 'No') | project Query1Stats=tostring(pack_all())", + "query": "resources| where type == 'microsoft.network/virtualnetworkgateways'| where properties.gatewayType =~ 'vpn' or properties.gatewayType == 'ExpressRoute'| extend SKUName = properties.sku.name, SKUTier = properties.sku.tier, Type = properties.gatewayType| extend compliant = SKUTier !in ('Basic', 'Standard')| project name, id, subscriptionId, resourceGroup, compliant| summarize Total = count(), Success = countif(compliant==1), Failed = countif(compliant==0) | extend SuccessPercent = iff(Total==0, 100, 100*toint(Success)/toint(Total)) | extend FullyCompliant = iff(SuccessPercent == 100, 'Yes', 'No') | project Query1Stats=tostring(pack_all())", "crossComponentResources": [ "{Subscription}" ], @@ -486,9 +396,9 @@ { "id": "daf05c62-1d5b-4325-b241-d7ee468f23eb", "version": "KqlParameterItem/1.0", - "name": "Query14FullyCompliant", + "name": "Query7FullyCompliant", "type": 1, - "query": "{\"version\":\"1.0.0\",\"content\":\"{\\\"value\\\": \\\"{Query14Stats:$.FullyCompliant}\\\"}\",\"transformers\":null}", + "query": "{\"version\":\"1.0.0\",\"content\":\"{\\\"value\\\": \\\"{Query7Stats:$.FullyCompliant}\\\"}\",\"transformers\":null}", "isHiddenWhenLocked": true, "timeContext": { "durationMs": 86400000 @@ -498,9 +408,9 @@ { "id": "daf05c62-1d5b-4325-b241-d7ee468f23eb", "version": "KqlParameterItem/1.0", - "name": "Query15Stats", + "name": "Query8Stats", "type": 1, - "query": "resources | where type=='microsoft.network/firewallpolicies' | extend compliant = (properties.sku.tier == 'Premium') | distinct id,compliant| summarize Total = count(), Success = countif(compliant==1), Failed = countif(compliant==0) | extend SuccessPercent = iff(Total==0, 100, 100*toint(Success)/toint(Total)) | extend FullyCompliant = iff(SuccessPercent == 100, 'Yes', 'No') | project Query1Stats=tostring(pack_all())", + "query": "resources | where type=='microsoft.network/expressroutecircuits' | extend compliant = (tolower(sku.family) == 'metereddata' or tolower(sku.tier) == 'local') | distinct id,compliant| summarize Total = count(), Success = countif(compliant==1), Failed = countif(compliant==0) | extend SuccessPercent = iff(Total==0, 100, 100*toint(Success)/toint(Total)) | extend FullyCompliant = iff(SuccessPercent == 100, 'Yes', 'No') | project Query1Stats=tostring(pack_all())", "crossComponentResources": [ "{Subscription}" ], @@ -514,9 +424,9 @@ { "id": "daf05c62-1d5b-4325-b241-d7ee468f23eb", "version": "KqlParameterItem/1.0", - "name": "Query15FullyCompliant", + "name": "Query8FullyCompliant", "type": 1, - "query": "{\"version\":\"1.0.0\",\"content\":\"{\\\"value\\\": \\\"{Query15Stats:$.FullyCompliant}\\\"}\",\"transformers\":null}", + "query": "{\"version\":\"1.0.0\",\"content\":\"{\\\"value\\\": \\\"{Query8Stats:$.FullyCompliant}\\\"}\",\"transformers\":null}", "isHiddenWhenLocked": true, "timeContext": { "durationMs": 86400000 @@ -526,9 +436,9 @@ { "id": "daf05c62-1d5b-4325-b241-d7ee468f23eb", "version": "KqlParameterItem/1.0", - "name": "Query16Stats", + "name": "Query9Stats", "type": 1, - "query": "resources | where type=='microsoft.network/firewallpolicies' | extend compliant = (properties.threatIntelMode == 'Deny') | distinct id,compliant| summarize Total = count(), Success = countif(compliant==1), Failed = countif(compliant==0) | extend SuccessPercent = iff(Total==0, 100, 100*toint(Success)/toint(Total)) | extend FullyCompliant = iff(SuccessPercent == 100, 'Yes', 'No') | project Query1Stats=tostring(pack_all())", + "query": "resources | where type=='microsoft.network/connections' | where properties.connectionType == 'ExpressRoute' | project id, gwid=tostring(properties.virtualNetworkGateway1.id), circuitid=tostring(properties.peer.id) | join (resources | where type=='microsoft.network/expressroutecircuits' | project circuitid=tostring(id), circuitsku=sku.tier) on circuitid | project id=gwid, compliant = (circuitsku == 'Local') | summarize compliant=max(compliant) by id| summarize Total = count(), Success = countif(compliant==1), Failed = countif(compliant==0) | extend SuccessPercent = iff(Total==0, 100, 100*toint(Success)/toint(Total)) | extend FullyCompliant = iff(SuccessPercent == 100, 'Yes', 'No') | project Query1Stats=tostring(pack_all())", "crossComponentResources": [ "{Subscription}" ], @@ -542,9 +452,9 @@ { "id": "daf05c62-1d5b-4325-b241-d7ee468f23eb", "version": "KqlParameterItem/1.0", - "name": "Query16FullyCompliant", + "name": "Query9FullyCompliant", "type": 1, - "query": "{\"version\":\"1.0.0\",\"content\":\"{\\\"value\\\": \\\"{Query16Stats:$.FullyCompliant}\\\"}\",\"transformers\":null}", + "query": "{\"version\":\"1.0.0\",\"content\":\"{\\\"value\\\": \\\"{Query9Stats:$.FullyCompliant}\\\"}\",\"transformers\":null}", "isHiddenWhenLocked": true, "timeContext": { "durationMs": 86400000 @@ -554,9 +464,9 @@ { "id": "daf05c62-1d5b-4325-b241-d7ee468f23eb", "version": "KqlParameterItem/1.0", - "name": "Query17Stats", + "name": "Query10Stats", "type": 1, - "query": "resources | where type=='microsoft.network/firewallpolicies' | extend compliant = (properties.intrusionDetection.mode == 'Deny') | project id, compliant| summarize Total = count(), Success = countif(compliant==1), Failed = countif(compliant==0) | extend SuccessPercent = iff(Total==0, 100, 100*toint(Success)/toint(Total)) | extend FullyCompliant = iff(SuccessPercent == 100, 'Yes', 'No') | project Query1Stats=tostring(pack_all())", + "query": "resources| where type == 'microsoft.network/virtualnetworkgateways'| where properties.gatewayType =~ 'vpn' or properties.gatewayType == 'ExpressRoute'| extend SKUName = properties.sku.name, SKUTier = properties.sku.tier, Type = properties.gatewayType| extend compliant = SKUTier contains 'AZ'| project name, id, subscriptionId, resourceGroup, Type, compliant| summarize Total = count(), Success = countif(compliant==1), Failed = countif(compliant==0) | extend SuccessPercent = iff(Total==0, 100, 100*toint(Success)/toint(Total)) | extend FullyCompliant = iff(SuccessPercent == 100, 'Yes', 'No') | project Query1Stats=tostring(pack_all())", "crossComponentResources": [ "{Subscription}" ], @@ -570,9 +480,9 @@ { "id": "daf05c62-1d5b-4325-b241-d7ee468f23eb", "version": "KqlParameterItem/1.0", - "name": "Query17FullyCompliant", + "name": "Query10FullyCompliant", "type": 1, - "query": "{\"version\":\"1.0.0\",\"content\":\"{\\\"value\\\": \\\"{Query17Stats:$.FullyCompliant}\\\"}\",\"transformers\":null}", + "query": "{\"version\":\"1.0.0\",\"content\":\"{\\\"value\\\": \\\"{Query10Stats:$.FullyCompliant}\\\"}\",\"transformers\":null}", "isHiddenWhenLocked": true, "timeContext": { "durationMs": 86400000 @@ -582,9 +492,9 @@ { "id": "daf05c62-1d5b-4325-b241-d7ee468f23eb", "version": "KqlParameterItem/1.0", - "name": "Query18Stats", + "name": "Query11Stats", "type": 1, - "query": "resources | where type=='microsoft.network/virtualnetworks' | project id,resourceGroup,name,subnets=properties.subnets | mv-expand subnets | project id,name,subnetId=tostring(subnets.id), subnetName=tostring(subnets.name),subnetRT=subnets.properties.routeTable.id | where not (subnetName in ('GatewaySubnet', 'AzureFirewallSubnet', 'RouteServerSubnet', 'AzureBastionSubnet')) | extend hasRT = isnotnull(subnetRT) | distinct id, hasRT, subnetId | join kind=fullouter (resources | where type == 'microsoft.network/virtualnetworks' | mvexpand properties.virtualNetworkPeerings | extend isVWAN=(tolower(split(properties_virtualNetworkPeerings.name, '_')[0]) == 'remotevnettohubpeering') | mv-expand properties.subnets | project id, isVWAN, name, subnetId=tostring(properties_subnets.id), subnetName=tostring(properties_subnets.name) | summarize PeeredToVWAN=max(isVWAN) by id, subnetId | project id, subnetId, isVWANpeer = (PeeredToVWAN == true)) on subnetId | project id=iff(isnotempty(id), id, id1), subnetId=iff(isnotempty(subnetId), subnetId, subnetId1), hasRT, isVWANpeer | extend compliant = (hasRT==true or isVWANpeer==true) | distinct id, subnetId, compliant| summarize Total = count(), Success = countif(compliant==1), Failed = countif(compliant==0) | extend SuccessPercent = iff(Total==0, 100, 100*toint(Success)/toint(Total)) | extend FullyCompliant = iff(SuccessPercent == 100, 'Yes', 'No') | project Query1Stats=tostring(pack_all())", + "query": "resources | where type=='microsoft.network/virtualnetworkgateways' | where properties.gatewayType == 'Vpn' | extend compliant = (tolower(properties.sku.name) contains 'az') | distinct id, compliant| summarize Total = count(), Success = countif(compliant==1), Failed = countif(compliant==0) | extend SuccessPercent = iff(Total==0, 100, 100*toint(Success)/toint(Total)) | extend FullyCompliant = iff(SuccessPercent == 100, 'Yes', 'No') | project Query1Stats=tostring(pack_all())", "crossComponentResources": [ "{Subscription}" ], @@ -598,9 +508,65 @@ { "id": "daf05c62-1d5b-4325-b241-d7ee468f23eb", "version": "KqlParameterItem/1.0", - "name": "Query18FullyCompliant", + "name": "Query11FullyCompliant", "type": 1, - "query": "{\"version\":\"1.0.0\",\"content\":\"{\\\"value\\\": \\\"{Query18Stats:$.FullyCompliant}\\\"}\",\"transformers\":null}", + "query": "{\"version\":\"1.0.0\",\"content\":\"{\\\"value\\\": \\\"{Query11Stats:$.FullyCompliant}\\\"}\",\"transformers\":null}", + "isHiddenWhenLocked": true, + "timeContext": { + "durationMs": 86400000 + }, + "queryType": 8 + }, + { + "id": "daf05c62-1d5b-4325-b241-d7ee468f23eb", + "version": "KqlParameterItem/1.0", + "name": "Query12Stats", + "type": 1, + "query": "resources | where type=='microsoft.network/connections' | where properties.connectionType == 'ExpressRoute' | project cxId=id, gwId=tostring(properties.virtualNetworkGateway1.id), circuitId=tostring(properties.peer.id) | join (resources | where type=='microsoft.network/expressroutecircuits' | project circuitId=tostring(id), circuitLocation=tostring(properties.serviceProviderProperties.peeringLocation)) on circuitId | distinct gwId, circuitLocation | summarize countErLocations=count() by id=gwId | extend compliant = (countErLocations >= 2)| summarize Total = count(), Success = countif(compliant==1), Failed = countif(compliant==0) | extend SuccessPercent = iff(Total==0, 100, 100*toint(Success)/toint(Total)) | extend FullyCompliant = iff(SuccessPercent == 100, 'Yes', 'No') | project Query1Stats=tostring(pack_all())", + "crossComponentResources": [ + "{Subscription}" + ], + "isHiddenWhenLocked": true, + "timeContext": { + "durationMs": 86400000 + }, + "queryType": 1, + "resourceType": "microsoft.resourcegraph/resources" + }, + { + "id": "daf05c62-1d5b-4325-b241-d7ee468f23eb", + "version": "KqlParameterItem/1.0", + "name": "Query12FullyCompliant", + "type": 1, + "query": "{\"version\":\"1.0.0\",\"content\":\"{\\\"value\\\": \\\"{Query12Stats:$.FullyCompliant}\\\"}\",\"transformers\":null}", + "isHiddenWhenLocked": true, + "timeContext": { + "durationMs": 86400000 + }, + "queryType": 8 + }, + { + "id": "daf05c62-1d5b-4325-b241-d7ee468f23eb", + "version": "KqlParameterItem/1.0", + "name": "Query13Stats", + "type": 1, + "query": "resources | where type=='microsoft.network/virtualnetworks' | project id,resourceGroup,name,subnets=properties.subnets | mv-expand subnets | project id,resourceGroup,name,subnetName=tostring(subnets.name),routeTableId=tostring(subnets.properties.routeTable.id) | where subnetName == 'GatewaySubnet' | join kind=leftouter (Resources | where type == 'microsoft.network/routetables' | project routeTableName=name,routeTableId=id, disableBgpRoutePropagation=properties.disableBgpRoutePropagation) on routeTableId | project id,compliant = (disableBgpRoutePropagation == False or isnull(disableBgpRoutePropagation))| summarize Total = count(), Success = countif(compliant==1), Failed = countif(compliant==0) | extend SuccessPercent = iff(Total==0, 100, 100*toint(Success)/toint(Total)) | extend FullyCompliant = iff(SuccessPercent == 100, 'Yes', 'No') | project Query1Stats=tostring(pack_all())", + "crossComponentResources": [ + "{Subscription}" + ], + "isHiddenWhenLocked": true, + "timeContext": { + "durationMs": 86400000 + }, + "queryType": 1, + "resourceType": "microsoft.resourcegraph/resources" + }, + { + "id": "daf05c62-1d5b-4325-b241-d7ee468f23eb", + "version": "KqlParameterItem/1.0", + "name": "Query13FullyCompliant", + "type": 1, + "query": "{\"version\":\"1.0.0\",\"content\":\"{\\\"value\\\": \\\"{Query13Stats:$.FullyCompliant}\\\"}\",\"transformers\":null}", "isHiddenWhenLocked": true, "timeContext": { "durationMs": 86400000 @@ -621,7 +587,7 @@ "criteriaContext": { "operator": "Default", "resultValType": "expression", - "resultVal": "{Query14Stats:$.Success}+{Query15Stats:$.Success}+{Query16Stats:$.Success}+{Query17Stats:$.Success}+{Query18Stats:$.Success}" + "resultVal": "{Query7Stats:$.Success}+{Query8Stats:$.Success}+{Query9Stats:$.Success}+{Query10Stats:$.Success}+{Query11Stats:$.Success}+{Query12Stats:$.Success}+{Query13Stats:$.Success}" } } ] @@ -640,7 +606,7 @@ "criteriaContext": { "operator": "Default", "resultValType": "expression", - "resultVal": "{Query14Stats:$.Total}+{Query15Stats:$.Total}+{Query16Stats:$.Total}+{Query17Stats:$.Total}+{Query18Stats:$.Total}" + "resultVal": "{Query7Stats:$.Total}+{Query8Stats:$.Total}+{Query9Stats:$.Total}+{Query10Stats:$.Total}+{Query11Stats:$.Total}+{Query12Stats:$.Total}+{Query13Stats:$.Total}" } } ] @@ -674,7 +640,7 @@ { "type": 1, "content": { - "json": "## Firewall" + "json": "## Hybrid" }, "customWidth": "50", "name": "tab1title" @@ -715,15 +681,15 @@ { "type": 1, "content": { - "json": "Use application rules to filter outbound traffic on destination host name for supported protocols. Use FQDN-based network rules and Azure Firewall with DNS proxy to filter egress traffic to the Internet over other protocols. Check [this link](https://learn.microsoft.com/azure/firewall/fqdn-filtering-network-rules) for further information." + "json": "Select the right SKU for the ExpressRoute/VPN gateways based on bandwidth and performance requirements. Check [this link](https://learn.microsoft.com/azure/expressroute/expressroute-about-virtual-network-gateways?source=recommendations#gwsku) for further information.. [This training](https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/) can help to educate yourself on this." }, - "name": "querytext14" + "name": "querytext7" }, { "type": 3, "content": { "version": "KqlItem/1.0", - "query": "resources | where type=='microsoft.network/firewallpolicies' | extend compliant = (properties.dnsSettings.enableProxy == true) | distinct id,compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed", + "query": "resources| where type == 'microsoft.network/virtualnetworkgateways'| where properties.gatewayType =~ 'vpn' or properties.gatewayType == 'ExpressRoute'| extend SKUName = properties.sku.name, SKUTier = properties.sku.tier, Type = properties.gatewayType| extend compliant = SKUTier !in ('Basic', 'Standard')| project name, id, subscriptionId, resourceGroup, compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed", "size": 4, "queryType": 1, "resourceType": "microsoft.resourcegraph/resources", @@ -772,20 +738,20 @@ ] } }, - "name": "query14" + "name": "query7" }, { "type": 1, "content": { - "json": "Use Azure Firewall Premium to enable additional security features. Check [this link](https://learn.microsoft.com/azure/firewall/premium-features) for further information." + "json": "Ensure that you're using unlimited-data ExpressRoute circuits only if you reach the bandwidth that justifies their cost. Check [this link](https://learn.microsoft.com/azure/expressroute/plan-manage-cost) for further information.. [This training](https://learn.microsoft.com/training/modules/design-implement-azure-expressroute/) can help to educate yourself on this." }, - "name": "querytext15" + "name": "querytext8" }, { "type": 3, "content": { "version": "KqlItem/1.0", - "query": "resources | where type=='microsoft.network/firewallpolicies' | extend compliant = (properties.sku.tier == 'Premium') | distinct id,compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed", + "query": "resources | where type=='microsoft.network/expressroutecircuits' | extend compliant = (tolower(sku.family) == 'metereddata' or tolower(sku.tier) == 'local') | distinct id,compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed", "size": 4, "queryType": 1, "resourceType": "microsoft.resourcegraph/resources", @@ -834,20 +800,20 @@ ] } }, - "name": "query15" + "name": "query8" }, { "type": 1, "content": { - "json": "Configure Azure Firewall Threat Intelligence mode to Alert and Deny for additional protection. Check [this link](https://learn.microsoft.com/azure/firewall/premium-features#idps-signature-rules) for further information." + "json": "Leverage the Local SKU of ExpressRoute to reduce the cost of your circuits, if your circuit peering location supports your Azure regions for the Local SKU. Check [this link](https://learn.microsoft.com/azure/expressroute/expressroute-faqs#expressroute-local) for further information.. [This training](https://learn.microsoft.com/training/modules/design-implement-azure-expressroute/) can help to educate yourself on this." }, - "name": "querytext16" + "name": "querytext9" }, { "type": 3, "content": { "version": "KqlItem/1.0", - "query": "resources | where type=='microsoft.network/firewallpolicies' | extend compliant = (properties.threatIntelMode == 'Deny') | distinct id,compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed", + "query": "resources | where type=='microsoft.network/connections' | where properties.connectionType == 'ExpressRoute' | project id, gwid=tostring(properties.virtualNetworkGateway1.id), circuitid=tostring(properties.peer.id) | join (resources | where type=='microsoft.network/expressroutecircuits' | project circuitid=tostring(id), circuitsku=sku.tier) on circuitid | project id=gwid, compliant = (circuitsku == 'Local') | summarize compliant=max(compliant) by id | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed", "size": 4, "queryType": 1, "resourceType": "microsoft.resourcegraph/resources", @@ -896,20 +862,20 @@ ] } }, - "name": "query16" + "name": "query9" }, { "type": 1, "content": { - "json": "Configure Azure Firewall IDPS mode to Deny for additional protection. Check [this link](https://learn.microsoft.com/azure/firewall/premium-features#idps) for further information." + "json": "Deploy a zone-redundant ExpressRoute gateway in the supported Azure regions. Check [this link](https://learn.microsoft.com/azure/expressroute/expressroute-about-virtual-network-gateways) for further information.. [This training](https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/) can help to educate yourself on this." }, - "name": "querytext17" + "name": "querytext10" }, { "type": 3, "content": { "version": "KqlItem/1.0", - "query": "resources | where type=='microsoft.network/firewallpolicies' | extend compliant = (properties.intrusionDetection.mode == 'Deny') | project id, compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed", + "query": "resources| where type == 'microsoft.network/virtualnetworkgateways'| where properties.gatewayType =~ 'vpn' or properties.gatewayType == 'ExpressRoute'| extend SKUName = properties.sku.name, SKUTier = properties.sku.tier, Type = properties.gatewayType| extend compliant = SKUTier contains 'AZ'| project name, id, subscriptionId, resourceGroup, Type, compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed", "size": 4, "queryType": 1, "resourceType": "microsoft.resourcegraph/resources", @@ -958,20 +924,20 @@ ] } }, - "name": "query17" + "name": "query10" }, { "type": 1, "content": { - "json": "For subnets in VNets not connected to Virtual WAN, attach a route table so that Internet traffic is redirected to Azure Firewall or a Network Virtual Appliance. Check [this link](https://learn.microsoft.com/azure/virtual-network/virtual-networks-udr-overview) for further information." + "json": "Use zone-redundant VPN gateways to connect branches or remote locations to Azure (where available). Check [this link](https://learn.microsoft.com/azure/vpn-gateway/create-zone-redundant-vnet-gateway) for further information.. [This training](https://learn.microsoft.com/training/modules/intro-to-azure-vpn-gateway/) can help to educate yourself on this." }, - "name": "querytext18" + "name": "querytext11" }, { "type": 3, "content": { "version": "KqlItem/1.0", - "query": "resources | where type=='microsoft.network/virtualnetworks' | project id,resourceGroup,name,subnets=properties.subnets | mv-expand subnets | project id,name,subnetId=tostring(subnets.id), subnetName=tostring(subnets.name),subnetRT=subnets.properties.routeTable.id | where not (subnetName in ('GatewaySubnet', 'AzureFirewallSubnet', 'RouteServerSubnet', 'AzureBastionSubnet')) | extend hasRT = isnotnull(subnetRT) | distinct id, hasRT, subnetId | join kind=fullouter (resources | where type == 'microsoft.network/virtualnetworks' | mvexpand properties.virtualNetworkPeerings | extend isVWAN=(tolower(split(properties_virtualNetworkPeerings.name, '_')[0]) == 'remotevnettohubpeering') | mv-expand properties.subnets | project id, isVWAN, name, subnetId=tostring(properties_subnets.id), subnetName=tostring(properties_subnets.name) | summarize PeeredToVWAN=max(isVWAN) by id, subnetId | project id, subnetId, isVWANpeer = (PeeredToVWAN == true)) on subnetId | project id=iff(isnotempty(id), id, id1), subnetId=iff(isnotempty(subnetId), subnetId, subnetId1), hasRT, isVWANpeer | extend compliant = (hasRT==true or isVWANpeer==true) | distinct id, subnetId, compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed", + "query": "resources | where type=='microsoft.network/virtualnetworkgateways' | where properties.gatewayType == 'Vpn' | extend compliant = (tolower(properties.sku.name) contains 'az') | distinct id, compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed", "size": 4, "queryType": 1, "resourceType": "microsoft.resourcegraph/resources", @@ -1020,7 +986,131 @@ ] } }, - "name": "query18" + "name": "query11" + }, + { + "type": 1, + "content": { + "json": "Use ExpressRoute circuits from different peering locations for redundancy. Check [this link](https://learn.microsoft.com/azure/expressroute/designing-for-disaster-recovery-with-expressroute-privatepeering#need-for-redundant-connectivity-solution) for further information.. [This training](https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/) can help to educate yourself on this." + }, + "name": "querytext12" + }, + { + "type": 3, + "content": { + "version": "KqlItem/1.0", + "query": "resources | where type=='microsoft.network/connections' | where properties.connectionType == 'ExpressRoute' | project cxId=id, gwId=tostring(properties.virtualNetworkGateway1.id), circuitId=tostring(properties.peer.id) | join (resources | where type=='microsoft.network/expressroutecircuits' | project circuitId=tostring(id), circuitLocation=tostring(properties.serviceProviderProperties.peeringLocation)) on circuitId | distinct gwId, circuitLocation | summarize countErLocations=count() by id=gwId | extend compliant = (countErLocations >= 2) | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed", + "size": 4, + "queryType": 1, + "resourceType": "microsoft.resourcegraph/resources", + "crossComponentResources": [ + "{Subscription}" + ], + "gridSettings": { + "formatters": [ + { + "columnMatch": "id", + "formatter": 0, + "numberFormat": { + "unit": 0, + "options": { + "style": "decimal" + } + } + }, + { + "columnMatch": "compliant", + "formatter": 18, + "formatOptions": { + "thresholdsOptions": "icons", + "thresholdsGrid": [ + { + "operator": "==", + "thresholdValue": "1", + "representation": "success", + "text": "Success" + }, + { + "operator": "==", + "thresholdValue": "0", + "representation": "failed", + "text": "Failed" + }, + { + "operator": "Default", + "thresholdValue": null, + "representation": "unknown", + "text": "Unknown" + } + ] + } + } + ] + } + }, + "name": "query12" + }, + { + "type": 1, + "content": { + "json": "If you are using a route table in the GatewaySubnet, make sure that gateway routes are propagated. Check [this link](https://learn.microsoft.com/azure/vpn-gateway/vpn-gateway-about-vpn-gateway-settings#gwsub) for further information." + }, + "name": "querytext13" + }, + { + "type": 3, + "content": { + "version": "KqlItem/1.0", + "query": "resources | where type=='microsoft.network/virtualnetworks' | project id,resourceGroup,name,subnets=properties.subnets | mv-expand subnets | project id,resourceGroup,name,subnetName=tostring(subnets.name),routeTableId=tostring(subnets.properties.routeTable.id) | where subnetName == 'GatewaySubnet' | join kind=leftouter (Resources | where type == 'microsoft.network/routetables' | project routeTableName=name,routeTableId=id, disableBgpRoutePropagation=properties.disableBgpRoutePropagation) on routeTableId | project id,compliant = (disableBgpRoutePropagation == False or isnull(disableBgpRoutePropagation)) | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed", + "size": 4, + "queryType": 1, + "resourceType": "microsoft.resourcegraph/resources", + "crossComponentResources": [ + "{Subscription}" + ], + "gridSettings": { + "formatters": [ + { + "columnMatch": "id", + "formatter": 0, + "numberFormat": { + "unit": 0, + "options": { + "style": "decimal" + } + } + }, + { + "columnMatch": "compliant", + "formatter": 18, + "formatOptions": { + "thresholdsOptions": "icons", + "thresholdsGrid": [ + { + "operator": "==", + "thresholdValue": "1", + "representation": "success", + "text": "Success" + }, + { + "operator": "==", + "thresholdValue": "0", + "representation": "failed", + "text": "Failed" + }, + { + "operator": "Default", + "thresholdValue": null, + "representation": "unknown", + "text": "Unknown" + } + ] + } + } + ] + } + }, + "name": "query13" } ] }, @@ -1265,7 +1355,7 @@ { "type": 1, "content": { - "json": "If using Route Server, use a /27 prefix for the Route Server subnet. Check [this link](https://learn.microsoft.com/azure/route-server/quickstart-configure-route-server-portal#create-a-route-server-1) for further information." + "json": "If using Route Server, use a /27 prefix for the Route Server subnet. Check [this link](https://learn.microsoft.com/azure/route-server/quickstart-configure-route-server-portal#create-a-route-server-1) for further information.. [This training](https://learn.microsoft.com/training/modules/intro-to-azure-route-server/) can help to educate yourself on this." }, "name": "querytext0" }, @@ -1327,7 +1417,7 @@ { "type": 1, "content": { - "json": "If you have more than 400 spoke networks in a region, deploy an additional hub to bypass VNet peering limits (500) and the maximum number of prefixes that can be advertised via ExpressRoute (1000). Check [this link](https://learn.microsoft.com/azure/azure-resource-manager/management/azure-subscription-service-limits?toc=/azure/virtual-network/toc.json#azure-resource-manager-virtual-networking-limits) for further information." + "json": "If you have more than 400 spoke networks in a region, deploy an additional hub to bypass VNet peering limits (500) and the maximum number of prefixes that can be advertised via ExpressRoute (1000). Check [this link](https://learn.microsoft.com/azure/azure-resource-manager/management/azure-subscription-service-limits?toc=/azure/virtual-network/toc.json#azure-resource-manager-virtual-networking-limits) for further information.. [This training](https://learn.microsoft.com/training/modules/hub-and-spoke-network-architecture/) can help to educate yourself on this." }, "name": "querytext1" }, @@ -1389,7 +1479,7 @@ { "type": 1, "content": { - "json": "Limit the number of routes per route table to 400. Check [this link](https://learn.microsoft.com/azure/azure-resource-manager/management/azure-subscription-service-limits?toc=/azure/virtual-network/toc.json#azure-resource-manager-virtual-networking-limits) for further information." + "json": "Limit the number of routes per route table to 400. Check [this link](https://learn.microsoft.com/azure/azure-resource-manager/management/azure-subscription-service-limits?toc=/azure/virtual-network/toc.json#azure-resource-manager-virtual-networking-limits) for further information.. [This training](https://learn.microsoft.com/training/modules/hub-and-spoke-network-architecture/) can help to educate yourself on this." }, "name": "querytext2" }, @@ -1451,7 +1541,7 @@ { "type": 1, "content": { - "json": "Use the setting 'Allow traffic to remote virtual network' when configuring VNet peerings. Check [this link](https://learn.microsoft.com/azure/virtual-network/virtual-network-manage-peering) for further information." + "json": "Use the setting 'Allow traffic to remote virtual network' when configuring VNet peerings. Check [this link](https://learn.microsoft.com/azure/virtual-network/virtual-network-manage-peering) for further information.. [This training](https://learn.microsoft.com/training/modules/hub-and-spoke-network-architecture/) can help to educate yourself on this." }, "name": "querytext3" }, @@ -1536,65 +1626,9 @@ { "id": "daf05c62-1d5b-4325-b241-d7ee468f23eb", "version": "KqlParameterItem/1.0", - "name": "Query7Stats", - "type": 1, - "query": "resources| where type == 'microsoft.network/virtualnetworkgateways'| where properties.gatewayType =~ 'vpn' or properties.gatewayType == 'ExpressRoute'| extend SKUName = properties.sku.name, SKUTier = properties.sku.tier, Type = properties.gatewayType| extend compliant = SKUTier !in ('Basic', 'Standard')| project name, id, subscriptionId, resourceGroup, compliant| summarize Total = count(), Success = countif(compliant==1), Failed = countif(compliant==0) | extend SuccessPercent = iff(Total==0, 100, 100*toint(Success)/toint(Total)) | extend FullyCompliant = iff(SuccessPercent == 100, 'Yes', 'No') | project Query1Stats=tostring(pack_all())", - "crossComponentResources": [ - "{Subscription}" - ], - "isHiddenWhenLocked": true, - "timeContext": { - "durationMs": 86400000 - }, - "queryType": 1, - "resourceType": "microsoft.resourcegraph/resources" - }, - { - "id": "daf05c62-1d5b-4325-b241-d7ee468f23eb", - "version": "KqlParameterItem/1.0", - "name": "Query7FullyCompliant", - "type": 1, - "query": "{\"version\":\"1.0.0\",\"content\":\"{\\\"value\\\": \\\"{Query7Stats:$.FullyCompliant}\\\"}\",\"transformers\":null}", - "isHiddenWhenLocked": true, - "timeContext": { - "durationMs": 86400000 - }, - "queryType": 8 - }, - { - "id": "daf05c62-1d5b-4325-b241-d7ee468f23eb", - "version": "KqlParameterItem/1.0", - "name": "Query8Stats", - "type": 1, - "query": "resources | where type=='microsoft.network/expressroutecircuits' | extend compliant = (tolower(sku.family) == 'metereddata' or tolower(sku.tier) == 'local') | distinct id,compliant| summarize Total = count(), Success = countif(compliant==1), Failed = countif(compliant==0) | extend SuccessPercent = iff(Total==0, 100, 100*toint(Success)/toint(Total)) | extend FullyCompliant = iff(SuccessPercent == 100, 'Yes', 'No') | project Query1Stats=tostring(pack_all())", - "crossComponentResources": [ - "{Subscription}" - ], - "isHiddenWhenLocked": true, - "timeContext": { - "durationMs": 86400000 - }, - "queryType": 1, - "resourceType": "microsoft.resourcegraph/resources" - }, - { - "id": "daf05c62-1d5b-4325-b241-d7ee468f23eb", - "version": "KqlParameterItem/1.0", - "name": "Query8FullyCompliant", - "type": 1, - "query": "{\"version\":\"1.0.0\",\"content\":\"{\\\"value\\\": \\\"{Query8Stats:$.FullyCompliant}\\\"}\",\"transformers\":null}", - "isHiddenWhenLocked": true, - "timeContext": { - "durationMs": 86400000 - }, - "queryType": 8 - }, - { - "id": "daf05c62-1d5b-4325-b241-d7ee468f23eb", - "version": "KqlParameterItem/1.0", - "name": "Query9Stats", + "name": "Query14Stats", "type": 1, - "query": "resources | where type=='microsoft.network/connections' | where properties.connectionType == 'ExpressRoute' | project id, gwid=tostring(properties.virtualNetworkGateway1.id), circuitid=tostring(properties.peer.id) | join (resources | where type=='microsoft.network/expressroutecircuits' | project circuitid=tostring(id), circuitsku=sku.tier) on circuitid | project id=gwid, compliant = (circuitsku == 'Local') | summarize compliant=max(compliant) by id| summarize Total = count(), Success = countif(compliant==1), Failed = countif(compliant==0) | extend SuccessPercent = iff(Total==0, 100, 100*toint(Success)/toint(Total)) | extend FullyCompliant = iff(SuccessPercent == 100, 'Yes', 'No') | project Query1Stats=tostring(pack_all())", + "query": "resources | where type=='microsoft.network/firewallpolicies' | extend compliant = (properties.dnsSettings.enableProxy == true) | distinct id,compliant| summarize Total = count(), Success = countif(compliant==1), Failed = countif(compliant==0) | extend SuccessPercent = iff(Total==0, 100, 100*toint(Success)/toint(Total)) | extend FullyCompliant = iff(SuccessPercent == 100, 'Yes', 'No') | project Query1Stats=tostring(pack_all())", "crossComponentResources": [ "{Subscription}" ], @@ -1608,9 +1642,9 @@ { "id": "daf05c62-1d5b-4325-b241-d7ee468f23eb", "version": "KqlParameterItem/1.0", - "name": "Query9FullyCompliant", + "name": "Query14FullyCompliant", "type": 1, - "query": "{\"version\":\"1.0.0\",\"content\":\"{\\\"value\\\": \\\"{Query9Stats:$.FullyCompliant}\\\"}\",\"transformers\":null}", + "query": "{\"version\":\"1.0.0\",\"content\":\"{\\\"value\\\": \\\"{Query14Stats:$.FullyCompliant}\\\"}\",\"transformers\":null}", "isHiddenWhenLocked": true, "timeContext": { "durationMs": 86400000 @@ -1620,9 +1654,9 @@ { "id": "daf05c62-1d5b-4325-b241-d7ee468f23eb", "version": "KqlParameterItem/1.0", - "name": "Query10Stats", + "name": "Query15Stats", "type": 1, - "query": "resources| where type == 'microsoft.network/virtualnetworkgateways'| where properties.gatewayType =~ 'vpn' or properties.gatewayType == 'ExpressRoute'| extend SKUName = properties.sku.name, SKUTier = properties.sku.tier, Type = properties.gatewayType| extend compliant = SKUTier contains 'AZ'| project name, id, subscriptionId, resourceGroup, Type, compliant| summarize Total = count(), Success = countif(compliant==1), Failed = countif(compliant==0) | extend SuccessPercent = iff(Total==0, 100, 100*toint(Success)/toint(Total)) | extend FullyCompliant = iff(SuccessPercent == 100, 'Yes', 'No') | project Query1Stats=tostring(pack_all())", + "query": "resources | where type=='microsoft.network/firewallpolicies' | extend compliant = (properties.sku.tier == 'Premium') | distinct id,compliant| summarize Total = count(), Success = countif(compliant==1), Failed = countif(compliant==0) | extend SuccessPercent = iff(Total==0, 100, 100*toint(Success)/toint(Total)) | extend FullyCompliant = iff(SuccessPercent == 100, 'Yes', 'No') | project Query1Stats=tostring(pack_all())", "crossComponentResources": [ "{Subscription}" ], @@ -1636,9 +1670,9 @@ { "id": "daf05c62-1d5b-4325-b241-d7ee468f23eb", "version": "KqlParameterItem/1.0", - "name": "Query10FullyCompliant", + "name": "Query15FullyCompliant", "type": 1, - "query": "{\"version\":\"1.0.0\",\"content\":\"{\\\"value\\\": \\\"{Query10Stats:$.FullyCompliant}\\\"}\",\"transformers\":null}", + "query": "{\"version\":\"1.0.0\",\"content\":\"{\\\"value\\\": \\\"{Query15Stats:$.FullyCompliant}\\\"}\",\"transformers\":null}", "isHiddenWhenLocked": true, "timeContext": { "durationMs": 86400000 @@ -1648,9 +1682,9 @@ { "id": "daf05c62-1d5b-4325-b241-d7ee468f23eb", "version": "KqlParameterItem/1.0", - "name": "Query11Stats", + "name": "Query16Stats", "type": 1, - "query": "resources | where type=='microsoft.network/virtualnetworkgateways' | where properties.gatewayType == 'Vpn' | extend compliant = (tolower(properties.sku.name) contains 'az') | distinct id, compliant| summarize Total = count(), Success = countif(compliant==1), Failed = countif(compliant==0) | extend SuccessPercent = iff(Total==0, 100, 100*toint(Success)/toint(Total)) | extend FullyCompliant = iff(SuccessPercent == 100, 'Yes', 'No') | project Query1Stats=tostring(pack_all())", + "query": "resources | where type=='microsoft.network/firewallpolicies' | extend compliant = (properties.threatIntelMode == 'Deny') | distinct id,compliant| summarize Total = count(), Success = countif(compliant==1), Failed = countif(compliant==0) | extend SuccessPercent = iff(Total==0, 100, 100*toint(Success)/toint(Total)) | extend FullyCompliant = iff(SuccessPercent == 100, 'Yes', 'No') | project Query1Stats=tostring(pack_all())", "crossComponentResources": [ "{Subscription}" ], @@ -1664,9 +1698,9 @@ { "id": "daf05c62-1d5b-4325-b241-d7ee468f23eb", "version": "KqlParameterItem/1.0", - "name": "Query11FullyCompliant", + "name": "Query16FullyCompliant", "type": 1, - "query": "{\"version\":\"1.0.0\",\"content\":\"{\\\"value\\\": \\\"{Query11Stats:$.FullyCompliant}\\\"}\",\"transformers\":null}", + "query": "{\"version\":\"1.0.0\",\"content\":\"{\\\"value\\\": \\\"{Query16Stats:$.FullyCompliant}\\\"}\",\"transformers\":null}", "isHiddenWhenLocked": true, "timeContext": { "durationMs": 86400000 @@ -1676,9 +1710,9 @@ { "id": "daf05c62-1d5b-4325-b241-d7ee468f23eb", "version": "KqlParameterItem/1.0", - "name": "Query12Stats", + "name": "Query17Stats", "type": 1, - "query": "resources | where type=='microsoft.network/connections' | where properties.connectionType == 'ExpressRoute' | project cxId=id, gwId=tostring(properties.virtualNetworkGateway1.id), circuitId=tostring(properties.peer.id) | join (resources | where type=='microsoft.network/expressroutecircuits' | project circuitId=tostring(id), circuitLocation=tostring(properties.serviceProviderProperties.peeringLocation)) on circuitId | distinct gwId, circuitLocation | summarize countErLocations=count() by id=gwId | extend compliant = (countErLocations >= 2)| summarize Total = count(), Success = countif(compliant==1), Failed = countif(compliant==0) | extend SuccessPercent = iff(Total==0, 100, 100*toint(Success)/toint(Total)) | extend FullyCompliant = iff(SuccessPercent == 100, 'Yes', 'No') | project Query1Stats=tostring(pack_all())", + "query": "resources | where type=='microsoft.network/firewallpolicies' | extend compliant = (properties.intrusionDetection.mode == 'Deny') | project id, compliant| summarize Total = count(), Success = countif(compliant==1), Failed = countif(compliant==0) | extend SuccessPercent = iff(Total==0, 100, 100*toint(Success)/toint(Total)) | extend FullyCompliant = iff(SuccessPercent == 100, 'Yes', 'No') | project Query1Stats=tostring(pack_all())", "crossComponentResources": [ "{Subscription}" ], @@ -1692,9 +1726,9 @@ { "id": "daf05c62-1d5b-4325-b241-d7ee468f23eb", "version": "KqlParameterItem/1.0", - "name": "Query12FullyCompliant", + "name": "Query17FullyCompliant", "type": 1, - "query": "{\"version\":\"1.0.0\",\"content\":\"{\\\"value\\\": \\\"{Query12Stats:$.FullyCompliant}\\\"}\",\"transformers\":null}", + "query": "{\"version\":\"1.0.0\",\"content\":\"{\\\"value\\\": \\\"{Query17Stats:$.FullyCompliant}\\\"}\",\"transformers\":null}", "isHiddenWhenLocked": true, "timeContext": { "durationMs": 86400000 @@ -1704,9 +1738,9 @@ { "id": "daf05c62-1d5b-4325-b241-d7ee468f23eb", "version": "KqlParameterItem/1.0", - "name": "Query13Stats", + "name": "Query18Stats", "type": 1, - "query": "resources | where type=='microsoft.network/virtualnetworks' | project id,resourceGroup,name,subnets=properties.subnets | mv-expand subnets | project id,resourceGroup,name,subnetName=tostring(subnets.name),routeTableId=tostring(subnets.properties.routeTable.id) | where subnetName == 'GatewaySubnet' | join kind=leftouter (Resources | where type == 'microsoft.network/routetables' | project routeTableName=name,routeTableId=id, disableBgpRoutePropagation=properties.disableBgpRoutePropagation) on routeTableId | project id,compliant = (disableBgpRoutePropagation == False or isnull(disableBgpRoutePropagation))| summarize Total = count(), Success = countif(compliant==1), Failed = countif(compliant==0) | extend SuccessPercent = iff(Total==0, 100, 100*toint(Success)/toint(Total)) | extend FullyCompliant = iff(SuccessPercent == 100, 'Yes', 'No') | project Query1Stats=tostring(pack_all())", + "query": "resources | where type=='microsoft.network/virtualnetworks' | project id,resourceGroup,name,subnets=properties.subnets | mv-expand subnets | project id,name,subnetId=tostring(subnets.id), subnetName=tostring(subnets.name),subnetRT=subnets.properties.routeTable.id | where not (subnetName in ('GatewaySubnet', 'AzureFirewallSubnet', 'RouteServerSubnet', 'AzureBastionSubnet')) | extend hasRT = isnotnull(subnetRT) | distinct id, hasRT, subnetId | join kind=fullouter (resources | where type == 'microsoft.network/virtualnetworks' | mvexpand properties.virtualNetworkPeerings | extend isVWAN=(tolower(split(properties_virtualNetworkPeerings.name, '_')[0]) == 'remotevnettohubpeering') | mv-expand properties.subnets | project id, isVWAN, name, subnetId=tostring(properties_subnets.id), subnetName=tostring(properties_subnets.name) | summarize PeeredToVWAN=max(isVWAN) by id, subnetId | project id, subnetId, isVWANpeer = (PeeredToVWAN == true)) on subnetId | project id=iff(isnotempty(id), id, id1), subnetId=iff(isnotempty(subnetId), subnetId, subnetId1), hasRT, isVWANpeer | extend compliant = (hasRT==true or isVWANpeer==true) | distinct id, subnetId, compliant| summarize Total = count(), Success = countif(compliant==1), Failed = countif(compliant==0) | extend SuccessPercent = iff(Total==0, 100, 100*toint(Success)/toint(Total)) | extend FullyCompliant = iff(SuccessPercent == 100, 'Yes', 'No') | project Query1Stats=tostring(pack_all())", "crossComponentResources": [ "{Subscription}" ], @@ -1720,9 +1754,9 @@ { "id": "daf05c62-1d5b-4325-b241-d7ee468f23eb", "version": "KqlParameterItem/1.0", - "name": "Query13FullyCompliant", + "name": "Query18FullyCompliant", "type": 1, - "query": "{\"version\":\"1.0.0\",\"content\":\"{\\\"value\\\": \\\"{Query13Stats:$.FullyCompliant}\\\"}\",\"transformers\":null}", + "query": "{\"version\":\"1.0.0\",\"content\":\"{\\\"value\\\": \\\"{Query18Stats:$.FullyCompliant}\\\"}\",\"transformers\":null}", "isHiddenWhenLocked": true, "timeContext": { "durationMs": 86400000 @@ -1743,7 +1777,7 @@ "criteriaContext": { "operator": "Default", "resultValType": "expression", - "resultVal": "{Query7Stats:$.Success}+{Query8Stats:$.Success}+{Query9Stats:$.Success}+{Query10Stats:$.Success}+{Query11Stats:$.Success}+{Query12Stats:$.Success}+{Query13Stats:$.Success}" + "resultVal": "{Query14Stats:$.Success}+{Query15Stats:$.Success}+{Query16Stats:$.Success}+{Query17Stats:$.Success}+{Query18Stats:$.Success}" } } ] @@ -1762,7 +1796,7 @@ "criteriaContext": { "operator": "Default", "resultValType": "expression", - "resultVal": "{Query7Stats:$.Total}+{Query8Stats:$.Total}+{Query9Stats:$.Total}+{Query10Stats:$.Total}+{Query11Stats:$.Total}+{Query12Stats:$.Total}+{Query13Stats:$.Total}" + "resultVal": "{Query14Stats:$.Total}+{Query15Stats:$.Total}+{Query16Stats:$.Total}+{Query17Stats:$.Total}+{Query18Stats:$.Total}" } } ] @@ -1796,7 +1830,7 @@ { "type": 1, "content": { - "json": "## Hybrid" + "json": "## Firewall" }, "customWidth": "50", "name": "tab3title" @@ -1837,15 +1871,15 @@ { "type": 1, "content": { - "json": "Select the right SKU for the ExpressRoute/VPN gateways based on bandwidth and performance requirements. Check [this link](https://learn.microsoft.com/azure/expressroute/expressroute-about-virtual-network-gateways?source=recommendations#gwsku) for further information.. [This training](https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/) can help to educate yourself on this." + "json": "Use application rules to filter outbound traffic on destination host name for supported protocols. Use FQDN-based network rules and Azure Firewall with DNS proxy to filter egress traffic to the Internet over other protocols. Check [this link](https://learn.microsoft.com/azure/firewall/fqdn-filtering-network-rules) for further information.. [This training](https://learn.microsoft.com/learn/paths/secure-networking-infrastructure/) can help to educate yourself on this." }, - "name": "querytext7" + "name": "querytext14" }, { "type": 3, "content": { "version": "KqlItem/1.0", - "query": "resources| where type == 'microsoft.network/virtualnetworkgateways'| where properties.gatewayType =~ 'vpn' or properties.gatewayType == 'ExpressRoute'| extend SKUName = properties.sku.name, SKUTier = properties.sku.tier, Type = properties.gatewayType| extend compliant = SKUTier !in ('Basic', 'Standard')| project name, id, subscriptionId, resourceGroup, compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed", + "query": "resources | where type=='microsoft.network/firewallpolicies' | extend compliant = (properties.dnsSettings.enableProxy == true) | distinct id,compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed", "size": 4, "queryType": 1, "resourceType": "microsoft.resourcegraph/resources", @@ -1894,20 +1928,20 @@ ] } }, - "name": "query7" + "name": "query14" }, { "type": 1, "content": { - "json": "Ensure that you're using unlimited-data ExpressRoute circuits only if you reach the bandwidth that justifies their cost. Check [this link](https://learn.microsoft.com/azure/expressroute/plan-manage-cost) for further information." + "json": "Use Azure Firewall Premium to enable additional security features. Check [this link](https://learn.microsoft.com/azure/firewall/premium-features) for further information.. [This training](https://learn.microsoft.com/training/modules/introduction-azure-firewall/) can help to educate yourself on this." }, - "name": "querytext8" + "name": "querytext15" }, { "type": 3, "content": { "version": "KqlItem/1.0", - "query": "resources | where type=='microsoft.network/expressroutecircuits' | extend compliant = (tolower(sku.family) == 'metereddata' or tolower(sku.tier) == 'local') | distinct id,compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed", + "query": "resources | where type=='microsoft.network/firewallpolicies' | extend compliant = (properties.sku.tier == 'Premium') | distinct id,compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed", "size": 4, "queryType": 1, "resourceType": "microsoft.resourcegraph/resources", @@ -1956,20 +1990,20 @@ ] } }, - "name": "query8" + "name": "query15" }, { "type": 1, "content": { - "json": "Leverage the Local SKU of ExpressRoute to reduce the cost of your circuits, if your circuit peering location supports your Azure regions for the Local SKU. Check [this link](https://learn.microsoft.com/azure/expressroute/expressroute-faqs#expressroute-local) for further information." + "json": "Configure Azure Firewall Threat Intelligence mode to Alert and Deny for additional protection. Check [this link](https://learn.microsoft.com/azure/firewall/premium-features#idps-signature-rules) for further information." }, - "name": "querytext9" + "name": "querytext16" }, { "type": 3, "content": { "version": "KqlItem/1.0", - "query": "resources | where type=='microsoft.network/connections' | where properties.connectionType == 'ExpressRoute' | project id, gwid=tostring(properties.virtualNetworkGateway1.id), circuitid=tostring(properties.peer.id) | join (resources | where type=='microsoft.network/expressroutecircuits' | project circuitid=tostring(id), circuitsku=sku.tier) on circuitid | project id=gwid, compliant = (circuitsku == 'Local') | summarize compliant=max(compliant) by id | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed", + "query": "resources | where type=='microsoft.network/firewallpolicies' | extend compliant = (properties.threatIntelMode == 'Deny') | distinct id,compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed", "size": 4, "queryType": 1, "resourceType": "microsoft.resourcegraph/resources", @@ -2018,20 +2052,20 @@ ] } }, - "name": "query9" + "name": "query16" }, { "type": 1, "content": { - "json": "Deploy a zone-redundant ExpressRoute gateway in the supported Azure regions. Check [this link](https://learn.microsoft.com/azure/expressroute/expressroute-about-virtual-network-gateways) for further information.. [This training](https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/) can help to educate yourself on this." + "json": "Configure Azure Firewall IDPS mode to Deny for additional protection. Check [this link](https://learn.microsoft.com/azure/firewall/premium-features#idps) for further information.. [This training](https://learn.microsoft.com/training/modules/introduction-azure-firewall/) can help to educate yourself on this." }, - "name": "querytext10" + "name": "querytext17" }, { "type": 3, "content": { "version": "KqlItem/1.0", - "query": "resources| where type == 'microsoft.network/virtualnetworkgateways'| where properties.gatewayType =~ 'vpn' or properties.gatewayType == 'ExpressRoute'| extend SKUName = properties.sku.name, SKUTier = properties.sku.tier, Type = properties.gatewayType| extend compliant = SKUTier contains 'AZ'| project name, id, subscriptionId, resourceGroup, Type, compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed", + "query": "resources | where type=='microsoft.network/firewallpolicies' | extend compliant = (properties.intrusionDetection.mode == 'Deny') | project id, compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed", "size": 4, "queryType": 1, "resourceType": "microsoft.resourcegraph/resources", @@ -2080,20 +2114,20 @@ ] } }, - "name": "query10" + "name": "query17" }, { "type": 1, "content": { - "json": "Use zone-redundant VPN gateways to connect branches or remote locations to Azure (where available). Check [this link](https://learn.microsoft.com/azure/vpn-gateway/create-zone-redundant-vnet-gateway) for further information.. [This training](https://learn.microsoft.com/training/modules/intro-to-azure-vpn-gateway/) can help to educate yourself on this." + "json": "For subnets in VNets not connected to Virtual WAN, attach a route table so that Internet traffic is redirected to Azure Firewall or a Network Virtual Appliance. Check [this link](https://learn.microsoft.com/azure/virtual-network/virtual-networks-udr-overview) for further information." }, - "name": "querytext11" + "name": "querytext18" }, { "type": 3, "content": { "version": "KqlItem/1.0", - "query": "resources | where type=='microsoft.network/virtualnetworkgateways' | where properties.gatewayType == 'Vpn' | extend compliant = (tolower(properties.sku.name) contains 'az') | distinct id, compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed", + "query": "resources | where type=='microsoft.network/virtualnetworks' | project id,resourceGroup,name,subnets=properties.subnets | mv-expand subnets | project id,name,subnetId=tostring(subnets.id), subnetName=tostring(subnets.name),subnetRT=subnets.properties.routeTable.id | where not (subnetName in ('GatewaySubnet', 'AzureFirewallSubnet', 'RouteServerSubnet', 'AzureBastionSubnet')) | extend hasRT = isnotnull(subnetRT) | distinct id, hasRT, subnetId | join kind=fullouter (resources | where type == 'microsoft.network/virtualnetworks' | mvexpand properties.virtualNetworkPeerings | extend isVWAN=(tolower(split(properties_virtualNetworkPeerings.name, '_')[0]) == 'remotevnettohubpeering') | mv-expand properties.subnets | project id, isVWAN, name, subnetId=tostring(properties_subnets.id), subnetName=tostring(properties_subnets.name) | summarize PeeredToVWAN=max(isVWAN) by id, subnetId | project id, subnetId, isVWANpeer = (PeeredToVWAN == true)) on subnetId | project id=iff(isnotempty(id), id, id1), subnetId=iff(isnotempty(subnetId), subnetId, subnetId1), hasRT, isVWANpeer | extend compliant = (hasRT==true or isVWANpeer==true) | distinct id, subnetId, compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed", "size": 4, "queryType": 1, "resourceType": "microsoft.resourcegraph/resources", @@ -2142,82 +2176,176 @@ ] } }, - "name": "query11" + "name": "query18" + } + ] + }, + "conditionalVisibility": { + "parameterName": "VisibleTab", + "comparison": "isEqualTo", + "value": "tab3" + }, + "name": "tab3" + }, + { + "type": 12, + "content": { + "version": "NotebookGroup/1.0", + "groupType": "editable", + "items": [ + { + "type": 9, + "content": { + "version": "KqlParameterItem/1.0", + "crossComponentResources": [ + "{Subscription}" + ], + "parameters": [ + { + "id": "daf05c62-1d5b-4325-b241-d7ee468f23eb", + "version": "KqlParameterItem/1.0", + "name": "Query20Stats", + "type": 1, + "query": "resources | where type =~ 'microsoft.network/virtualnetworks' | project id,resourceGroup,name,subnets = properties.subnets | mv-expand subnets | project id = subnets.id, resourceGroup, VNet = name, serviceEndpoints = subnets.properties.serviceEndpoints, compliant = (isnull(subnets.properties.serviceEndpoints) or array_length(subnets.properties.serviceEndpoints) == 0) | order by compliant asc| summarize Total = count(), Success = countif(compliant==1), Failed = countif(compliant==0) | extend SuccessPercent = iff(Total==0, 100, 100*toint(Success)/toint(Total)) | extend FullyCompliant = iff(SuccessPercent == 100, 'Yes', 'No') | project Query1Stats=tostring(pack_all())", + "crossComponentResources": [ + "{Subscription}" + ], + "isHiddenWhenLocked": true, + "timeContext": { + "durationMs": 86400000 + }, + "queryType": 1, + "resourceType": "microsoft.resourcegraph/resources" + }, + { + "id": "daf05c62-1d5b-4325-b241-d7ee468f23eb", + "version": "KqlParameterItem/1.0", + "name": "Query20FullyCompliant", + "type": 1, + "query": "{\"version\":\"1.0.0\",\"content\":\"{\\\"value\\\": \\\"{Query20Stats:$.FullyCompliant}\\\"}\",\"transformers\":null}", + "isHiddenWhenLocked": true, + "timeContext": { + "durationMs": 86400000 + }, + "queryType": 8 + }, + { + "id": "daf05c62-1d5b-4325-b241-d7ee468f23eb", + "version": "KqlParameterItem/1.0", + "name": "Tab4Success", + "type": 1, + "isHiddenWhenLocked": true, + "timeContext": { + "durationMs": 86400000 + }, + "criteriaData": [ + { + "criteriaContext": { + "operator": "Default", + "resultValType": "expression", + "resultVal": "{Query20Stats:$.Success}" + } + } + ] + }, + { + "id": "daf05c62-1d5b-4325-b241-d7ee468f23eb", + "version": "KqlParameterItem/1.0", + "name": "Tab4Total", + "type": 1, + "isHiddenWhenLocked": true, + "timeContext": { + "durationMs": 86400000 + }, + "criteriaData": [ + { + "criteriaContext": { + "operator": "Default", + "resultValType": "expression", + "resultVal": "{Query20Stats:$.Total}" + } + } + ] + }, + { + "id": "daf05c62-1d5b-4325-b241-d7ee468f23eb", + "version": "KqlParameterItem/1.0", + "name": "Tab4Percent", + "type": 1, + "isHiddenWhenLocked": true, + "timeContext": { + "durationMs": 86400000 + }, + "criteriaData": [ + { + "criteriaContext": { + "operator": "Default", + "resultValType": "expression", + "resultVal": "round(100*{Tab4Success}/{Tab4Total})" + } + } + ] + } + ], + "style": "pills", + "queryType": 1, + "resourceType": "microsoft.resourcegraph/resources" + }, + "name": "TabInvisibleParameters" }, { "type": 1, "content": { - "json": "Use ExpressRoute circuits from different peering locations for redundancy. Check [this link](https://learn.microsoft.com/azure/expressroute/designing-for-disaster-recovery-with-expressroute-privatepeering#need-for-redundant-connectivity-solution) for further information.. [This training](https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/) can help to educate yourself on this." + "json": "## PaaS" }, - "name": "querytext12" + "customWidth": "50", + "name": "tab4title" }, { "type": 3, "content": { "version": "KqlItem/1.0", - "query": "resources | where type=='microsoft.network/connections' | where properties.connectionType == 'ExpressRoute' | project cxId=id, gwId=tostring(properties.virtualNetworkGateway1.id), circuitId=tostring(properties.peer.id) | join (resources | where type=='microsoft.network/expressroutecircuits' | project circuitId=tostring(id), circuitLocation=tostring(properties.serviceProviderProperties.peeringLocation)) on circuitId | distinct gwId, circuitLocation | summarize countErLocations=count() by id=gwId | extend compliant = (countErLocations >= 2) | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed", - "size": 4, - "queryType": 1, - "resourceType": "microsoft.resourcegraph/resources", - "crossComponentResources": [ - "{Subscription}" - ], - "gridSettings": { - "formatters": [ - { - "columnMatch": "id", - "formatter": 0, - "numberFormat": { - "unit": 0, - "options": { - "style": "decimal" - } - } + "query": "{\"version\":\"1.0.0\",\"content\":\"{\\\"Column1\\\": \\\"{Tab4Percent}\\\", \\\"Column2\\\": \\\"Percent of successful checks\\\"}\",\"transformers\":null}", + "size": 3, + "queryType": 8, + "visualization": "tiles", + "tileSettings": { + "titleContent": { + "columnMatch": "Column1", + "formatter": 4, + "formatOptions": { + "min": 0, + "max": 100, + "palette": "redGreen" }, - { - "columnMatch": "compliant", - "formatter": 18, - "formatOptions": { - "thresholdsOptions": "icons", - "thresholdsGrid": [ - { - "operator": "==", - "thresholdValue": "1", - "representation": "success", - "text": "Success" - }, - { - "operator": "==", - "thresholdValue": "0", - "representation": "failed", - "text": "Failed" - }, - { - "operator": "Default", - "thresholdValue": null, - "representation": "unknown", - "text": "Unknown" - } - ] + "numberFormat": { + "unit": 0, + "options": { + "style": "decimal" } } - ] + }, + "subtitleContent": { + "columnMatch": "Column2" + }, + "showBorder": true } }, - "name": "query12" + "customWidth": "50", + "name": "TabPercentTile" }, { "type": 1, "content": { - "json": "If you are using a route table in the GatewaySubnet, make sure that gateway routes are propagated. Check [this link](https://learn.microsoft.com/azure/vpn-gateway/vpn-gateway-about-vpn-gateway-settings#gwsub) for further information." + "json": "Don't enable virtual network service endpoints by default on all subnets. Check [this link](https://learn.microsoft.com/azure/virtual-network/virtual-network-service-endpoints-overview) for further information.. [This training](https://learn.microsoft.com/learn/paths/implement-network-security/?source=learn) can help to educate yourself on this." }, - "name": "querytext13" + "name": "querytext20" }, { "type": 3, "content": { "version": "KqlItem/1.0", - "query": "resources | where type=='microsoft.network/virtualnetworks' | project id,resourceGroup,name,subnets=properties.subnets | mv-expand subnets | project id,resourceGroup,name,subnetName=tostring(subnets.name),routeTableId=tostring(subnets.properties.routeTable.id) | where subnetName == 'GatewaySubnet' | join kind=leftouter (Resources | where type == 'microsoft.network/routetables' | project routeTableName=name,routeTableId=id, disableBgpRoutePropagation=properties.disableBgpRoutePropagation) on routeTableId | project id,compliant = (disableBgpRoutePropagation == False or isnull(disableBgpRoutePropagation)) | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed", + "query": "resources | where type =~ 'microsoft.network/virtualnetworks' | project id,resourceGroup,name,subnets = properties.subnets | mv-expand subnets | project id = subnets.id, resourceGroup, VNet = name, serviceEndpoints = subnets.properties.serviceEndpoints, compliant = (isnull(subnets.properties.serviceEndpoints) or array_length(subnets.properties.serviceEndpoints) == 0) | order by compliant asc | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed", "size": 4, "queryType": 1, "resourceType": "microsoft.resourcegraph/resources", @@ -2266,16 +2394,16 @@ ] } }, - "name": "query13" + "name": "query20" } ] }, "conditionalVisibility": { "parameterName": "VisibleTab", "comparison": "isEqualTo", - "value": "tab3" + "value": "tab4" }, - "name": "tab3" + "name": "tab4" }, { "type": 12, @@ -2294,9 +2422,9 @@ { "id": "daf05c62-1d5b-4325-b241-d7ee468f23eb", "version": "KqlParameterItem/1.0", - "name": "Query20Stats", + "name": "Query24Stats", "type": 1, - "query": "resources | where type =~ 'microsoft.network/virtualnetworks' | project id,resourceGroup,name,subnets = properties.subnets | mv-expand subnets | project id = subnets.id, resourceGroup, VNet = name, serviceEndpoints = subnets.properties.serviceEndpoints, compliant = (isnull(subnets.properties.serviceEndpoints) or array_length(subnets.properties.serviceEndpoints) == 0) | order by compliant asc| summarize Total = count(), Success = countif(compliant==1), Failed = countif(compliant==0) | extend SuccessPercent = iff(Total==0, 100, 100*toint(Success)/toint(Total)) | extend FullyCompliant = iff(SuccessPercent == 100, 'Yes', 'No') | project Query1Stats=tostring(pack_all())", + "query": "resources | where type=='microsoft.network/virtualhubs' | extend compliant = isnotnull(properties.azureFirewall.id) | project id, compliant| summarize Total = count(), Success = countif(compliant==1), Failed = countif(compliant==0) | extend SuccessPercent = iff(Total==0, 100, 100*toint(Success)/toint(Total)) | extend FullyCompliant = iff(SuccessPercent == 100, 'Yes', 'No') | project Query1Stats=tostring(pack_all())", "crossComponentResources": [ "{Subscription}" ], @@ -2310,9 +2438,9 @@ { "id": "daf05c62-1d5b-4325-b241-d7ee468f23eb", "version": "KqlParameterItem/1.0", - "name": "Query20FullyCompliant", + "name": "Query24FullyCompliant", "type": 1, - "query": "{\"version\":\"1.0.0\",\"content\":\"{\\\"value\\\": \\\"{Query20Stats:$.FullyCompliant}\\\"}\",\"transformers\":null}", + "query": "{\"version\":\"1.0.0\",\"content\":\"{\\\"value\\\": \\\"{Query24Stats:$.FullyCompliant}\\\"}\",\"transformers\":null}", "isHiddenWhenLocked": true, "timeContext": { "durationMs": 86400000 @@ -2322,7 +2450,7 @@ { "id": "daf05c62-1d5b-4325-b241-d7ee468f23eb", "version": "KqlParameterItem/1.0", - "name": "Tab4Success", + "name": "Tab5Success", "type": 1, "isHiddenWhenLocked": true, "timeContext": { @@ -2333,7 +2461,7 @@ "criteriaContext": { "operator": "Default", "resultValType": "expression", - "resultVal": "{Query20Stats:$.Success}" + "resultVal": "{Query24Stats:$.Success}" } } ] @@ -2341,7 +2469,7 @@ { "id": "daf05c62-1d5b-4325-b241-d7ee468f23eb", "version": "KqlParameterItem/1.0", - "name": "Tab4Total", + "name": "Tab5Total", "type": 1, "isHiddenWhenLocked": true, "timeContext": { @@ -2352,7 +2480,7 @@ "criteriaContext": { "operator": "Default", "resultValType": "expression", - "resultVal": "{Query20Stats:$.Total}" + "resultVal": "{Query24Stats:$.Total}" } } ] @@ -2360,7 +2488,7 @@ { "id": "daf05c62-1d5b-4325-b241-d7ee468f23eb", "version": "KqlParameterItem/1.0", - "name": "Tab4Percent", + "name": "Tab5Percent", "type": 1, "isHiddenWhenLocked": true, "timeContext": { @@ -2371,7 +2499,7 @@ "criteriaContext": { "operator": "Default", "resultValType": "expression", - "resultVal": "round(100*{Tab4Success}/{Tab4Total})" + "resultVal": "round(100*{Tab5Success}/{Tab5Total})" } } ] @@ -2386,16 +2514,16 @@ { "type": 1, "content": { - "json": "## PaaS" + "json": "## Virtual WAN" }, "customWidth": "50", - "name": "tab4title" + "name": "tab5title" }, { "type": 3, "content": { "version": "KqlItem/1.0", - "query": "{\"version\":\"1.0.0\",\"content\":\"{\\\"Column1\\\": \\\"{Tab4Percent}\\\", \\\"Column2\\\": \\\"Percent of successful checks\\\"}\",\"transformers\":null}", + "query": "{\"version\":\"1.0.0\",\"content\":\"{\\\"Column1\\\": \\\"{Tab5Percent}\\\", \\\"Column2\\\": \\\"Percent of successful checks\\\"}\",\"transformers\":null}", "size": 3, "queryType": 8, "visualization": "tiles", @@ -2427,15 +2555,15 @@ { "type": 1, "content": { - "json": "Don't enable virtual network service endpoints by default on all subnets. Check [this link](https://learn.microsoft.com/azure/virtual-network/virtual-network-service-endpoints-overview) for further information.. [This training](https://learn.microsoft.com/learn/paths/implement-network-security/?source=learn) can help to educate yourself on this." + "json": "For outbound Internet traffic protection and filtering, deploy Azure Firewall in secured hubs. Check [this link](https://learn.microsoft.com/azure/virtual-wan/howto-firewall) for further information.. [This training](https://learn.microsoft.com/learn/paths/secure-networking-infrastructure/) can help to educate yourself on this." }, - "name": "querytext20" + "name": "querytext24" }, { "type": 3, "content": { "version": "KqlItem/1.0", - "query": "resources | where type =~ 'microsoft.network/virtualnetworks' | project id,resourceGroup,name,subnets = properties.subnets | mv-expand subnets | project id = subnets.id, resourceGroup, VNet = name, serviceEndpoints = subnets.properties.serviceEndpoints, compliant = (isnull(subnets.properties.serviceEndpoints) or array_length(subnets.properties.serviceEndpoints) == 0) | order by compliant asc | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed", + "query": "resources | where type=='microsoft.network/virtualhubs' | extend compliant = isnotnull(properties.azureFirewall.id) | project id, compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed", "size": 4, "queryType": 1, "resourceType": "microsoft.resourcegraph/resources", @@ -2484,16 +2612,16 @@ ] } }, - "name": "query20" + "name": "query24" } ] }, "conditionalVisibility": { "parameterName": "VisibleTab", "comparison": "isEqualTo", - "value": "tab4" + "value": "tab5" }, - "name": "tab4" + "name": "tab5" }, { "type": 12, @@ -2624,7 +2752,7 @@ { "id": "daf05c62-1d5b-4325-b241-d7ee468f23eb", "version": "KqlParameterItem/1.0", - "name": "Tab5Success", + "name": "Tab6Success", "type": 1, "isHiddenWhenLocked": true, "timeContext": { @@ -2643,7 +2771,7 @@ { "id": "daf05c62-1d5b-4325-b241-d7ee468f23eb", "version": "KqlParameterItem/1.0", - "name": "Tab5Total", + "name": "Tab6Total", "type": 1, "isHiddenWhenLocked": true, "timeContext": { @@ -2662,7 +2790,7 @@ { "id": "daf05c62-1d5b-4325-b241-d7ee468f23eb", "version": "KqlParameterItem/1.0", - "name": "Tab5Percent", + "name": "Tab6Percent", "type": 1, "isHiddenWhenLocked": true, "timeContext": { @@ -2673,7 +2801,7 @@ "criteriaContext": { "operator": "Default", "resultValType": "expression", - "resultVal": "round(100*{Tab5Success}/{Tab5Total})" + "resultVal": "round(100*{Tab6Success}/{Tab6Total})" } } ] @@ -2691,13 +2819,13 @@ "json": "## Segmentation" }, "customWidth": "50", - "name": "tab5title" + "name": "tab6title" }, { "type": 3, "content": { "version": "KqlItem/1.0", - "query": "{\"version\":\"1.0.0\",\"content\":\"{\\\"Column1\\\": \\\"{Tab5Percent}\\\", \\\"Column2\\\": \\\"Percent of successful checks\\\"}\",\"transformers\":null}", + "query": "{\"version\":\"1.0.0\",\"content\":\"{\\\"Column1\\\": \\\"{Tab6Percent}\\\", \\\"Column2\\\": \\\"Percent of successful checks\\\"}\",\"transformers\":null}", "size": 3, "queryType": 8, "visualization": "tiles", @@ -2729,7 +2857,7 @@ { "type": 1, "content": { - "json": "Use a /26 prefix for your Azure Firewall subnets. Check [this link](https://learn.microsoft.com/azure/firewall/firewall-faq#why-does-azure-firewall-need-a--26-subnet-size) for further information." + "json": "Use a /26 prefix for your Azure Firewall subnets. Check [this link](https://learn.microsoft.com/azure/firewall/firewall-faq#why-does-azure-firewall-need-a--26-subnet-size) for further information.. [This training](https://learn.microsoft.com/training/modules/introduction-azure-firewall/) can help to educate yourself on this." }, "name": "querytext19" }, @@ -2979,9 +3107,9 @@ "conditionalVisibility": { "parameterName": "VisibleTab", "comparison": "isEqualTo", - "value": "tab5" + "value": "tab6" }, - "name": "tab5" + "name": "tab6" }, { "type": 12, @@ -3000,9 +3128,9 @@ { "id": "daf05c62-1d5b-4325-b241-d7ee468f23eb", "version": "KqlParameterItem/1.0", - "name": "Query24Stats", + "name": "Query4Stats", "type": 1, - "query": "resources | where type=='microsoft.network/virtualhubs' | extend compliant = isnotnull(properties.azureFirewall.id) | project id, compliant| summarize Total = count(), Success = countif(compliant==1), Failed = countif(compliant==0) | extend SuccessPercent = iff(Total==0, 100, 100*toint(Success)/toint(Total)) | extend FullyCompliant = iff(SuccessPercent == 100, 'Yes', 'No') | project Query1Stats=tostring(pack_all())", + "query": "resources | where type == 'microsoft.network/virtualnetworks' | extend addressSpace = todynamic(properties.addressSpace) | extend addressPrefix = todynamic(properties.addressSpace.addressPrefixes) | mvexpand addressSpace | mvexpand addressPrefix | project name, id, location, resourceGroup, subscriptionId, cidr = addressPrefix | extend compliant = (cidr matches regex @'^(10\\.|172\\.(1[6-9]|2[0-9]|3[01])\\.|192\\.168\\.)') | project id, compliant, cidr| summarize Total = count(), Success = countif(compliant==1), Failed = countif(compliant==0) | extend SuccessPercent = iff(Total==0, 100, 100*toint(Success)/toint(Total)) | extend FullyCompliant = iff(SuccessPercent == 100, 'Yes', 'No') | project Query1Stats=tostring(pack_all())", "crossComponentResources": [ "{Subscription}" ], @@ -3016,9 +3144,9 @@ { "id": "daf05c62-1d5b-4325-b241-d7ee468f23eb", "version": "KqlParameterItem/1.0", - "name": "Query24FullyCompliant", + "name": "Query4FullyCompliant", "type": 1, - "query": "{\"version\":\"1.0.0\",\"content\":\"{\\\"value\\\": \\\"{Query24Stats:$.FullyCompliant}\\\"}\",\"transformers\":null}", + "query": "{\"version\":\"1.0.0\",\"content\":\"{\\\"value\\\": \\\"{Query4Stats:$.FullyCompliant}\\\"}\",\"transformers\":null}", "isHiddenWhenLocked": true, "timeContext": { "durationMs": 86400000 @@ -3028,7 +3156,35 @@ { "id": "daf05c62-1d5b-4325-b241-d7ee468f23eb", "version": "KqlParameterItem/1.0", - "name": "Tab6Success", + "name": "Query5Stats", + "type": 1, + "query": "resources | where type == 'microsoft.network/virtualnetworks' | extend addressSpace = todynamic(properties.addressSpace) | extend addressPrefix = todynamic(properties.addressSpace.addressPrefixes) | mvexpand addressSpace | mvexpand addressPrefix | extend addressMask = split(addressPrefix,'/')[1] | extend compliant = addressMask > 16 | project name, id, subscriptionId, resourceGroup, addressPrefix, compliant| summarize Total = count(), Success = countif(compliant==1), Failed = countif(compliant==0) | extend SuccessPercent = iff(Total==0, 100, 100*toint(Success)/toint(Total)) | extend FullyCompliant = iff(SuccessPercent == 100, 'Yes', 'No') | project Query1Stats=tostring(pack_all())", + "crossComponentResources": [ + "{Subscription}" + ], + "isHiddenWhenLocked": true, + "timeContext": { + "durationMs": 86400000 + }, + "queryType": 1, + "resourceType": "microsoft.resourcegraph/resources" + }, + { + "id": "daf05c62-1d5b-4325-b241-d7ee468f23eb", + "version": "KqlParameterItem/1.0", + "name": "Query5FullyCompliant", + "type": 1, + "query": "{\"version\":\"1.0.0\",\"content\":\"{\\\"value\\\": \\\"{Query5Stats:$.FullyCompliant}\\\"}\",\"transformers\":null}", + "isHiddenWhenLocked": true, + "timeContext": { + "durationMs": 86400000 + }, + "queryType": 8 + }, + { + "id": "daf05c62-1d5b-4325-b241-d7ee468f23eb", + "version": "KqlParameterItem/1.0", + "name": "Tab7Success", "type": 1, "isHiddenWhenLocked": true, "timeContext": { @@ -3039,7 +3195,7 @@ "criteriaContext": { "operator": "Default", "resultValType": "expression", - "resultVal": "{Query24Stats:$.Success}" + "resultVal": "{Query4Stats:$.Success}+{Query5Stats:$.Success}" } } ] @@ -3047,7 +3203,7 @@ { "id": "daf05c62-1d5b-4325-b241-d7ee468f23eb", "version": "KqlParameterItem/1.0", - "name": "Tab6Total", + "name": "Tab7Total", "type": 1, "isHiddenWhenLocked": true, "timeContext": { @@ -3058,7 +3214,7 @@ "criteriaContext": { "operator": "Default", "resultValType": "expression", - "resultVal": "{Query24Stats:$.Total}" + "resultVal": "{Query4Stats:$.Total}+{Query5Stats:$.Total}" } } ] @@ -3066,7 +3222,7 @@ { "id": "daf05c62-1d5b-4325-b241-d7ee468f23eb", "version": "KqlParameterItem/1.0", - "name": "Tab6Percent", + "name": "Tab7Percent", "type": 1, "isHiddenWhenLocked": true, "timeContext": { @@ -3077,7 +3233,7 @@ "criteriaContext": { "operator": "Default", "resultValType": "expression", - "resultVal": "round(100*{Tab6Success}/{Tab6Total})" + "resultVal": "round(100*{Tab7Success}/{Tab7Total})" } } ] @@ -3092,16 +3248,16 @@ { "type": 1, "content": { - "json": "## Virtual WAN" + "json": "## IP plan" }, "customWidth": "50", - "name": "tab6title" + "name": "tab7title" }, { "type": 3, "content": { "version": "KqlItem/1.0", - "query": "{\"version\":\"1.0.0\",\"content\":\"{\\\"Column1\\\": \\\"{Tab6Percent}\\\", \\\"Column2\\\": \\\"Percent of successful checks\\\"}\",\"transformers\":null}", + "query": "{\"version\":\"1.0.0\",\"content\":\"{\\\"Column1\\\": \\\"{Tab7Percent}\\\", \\\"Column2\\\": \\\"Percent of successful checks\\\"}\",\"transformers\":null}", "size": 3, "queryType": 8, "visualization": "tiles", @@ -3133,15 +3289,15 @@ { "type": 1, "content": { - "json": "For outbound Internet traffic protection and filtering, deploy Azure Firewall in secured hubs. Check [this link](https://learn.microsoft.com/azure/virtual-wan/howto-firewall) for further information.. [This training](https://learn.microsoft.com/learn/paths/secure-networking-infrastructure/) can help to educate yourself on this." + "json": "Use IP addresses from the address allocation ranges for private internets (RFC 1918). Check [this link](https://learn.microsoft.com/azure/cloud-adoption-framework/ready/azure-best-practices/plan-for-ip-addressing) for further information.. [This training](https://learn.microsoft.com/learn/paths/architect-network-infrastructure/) can help to educate yourself on this." }, - "name": "querytext24" + "name": "querytext4" }, { "type": 3, "content": { "version": "KqlItem/1.0", - "query": "resources | where type=='microsoft.network/virtualhubs' | extend compliant = isnotnull(properties.azureFirewall.id) | project id, compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed", + "query": "resources | where type == 'microsoft.network/virtualnetworks' | extend addressSpace = todynamic(properties.addressSpace) | extend addressPrefix = todynamic(properties.addressSpace.addressPrefixes) | mvexpand addressSpace | mvexpand addressPrefix | project name, id, location, resourceGroup, subscriptionId, cidr = addressPrefix | extend compliant = (cidr matches regex @'^(10\\.|172\\.(1[6-9]|2[0-9]|3[01])\\.|192\\.168\\.)') | project id, compliant, cidr | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed", "size": 4, "queryType": 1, "resourceType": "microsoft.resourcegraph/resources", @@ -3190,176 +3346,20 @@ ] } }, - "name": "query24" - } - ] - }, - "conditionalVisibility": { - "parameterName": "VisibleTab", - "comparison": "isEqualTo", - "value": "tab6" - }, - "name": "tab6" - }, - { - "type": 12, - "content": { - "version": "NotebookGroup/1.0", - "groupType": "editable", - "items": [ - { - "type": 9, - "content": { - "version": "KqlParameterItem/1.0", - "crossComponentResources": [ - "{Subscription}" - ], - "parameters": [ - { - "id": "daf05c62-1d5b-4325-b241-d7ee468f23eb", - "version": "KqlParameterItem/1.0", - "name": "Query6Stats", - "type": 1, - "query": "resources | where type=='microsoft.network/virtualnetworks' | project id,subnets=properties.subnets | mv-expand subnets | project id, subnetName = subnets.name, subnetPrefix = subnets.properties.addressPrefix | extend subnetPrefixLength = split(subnetPrefix, '/')[1] | where subnetName == 'AzureBastionSubnet' | extend compliant = (subnetPrefixLength <= 26) | distinct id, compliant| summarize Total = count(), Success = countif(compliant==1), Failed = countif(compliant==0) | extend SuccessPercent = iff(Total==0, 100, 100*toint(Success)/toint(Total)) | extend FullyCompliant = iff(SuccessPercent == 100, 'Yes', 'No') | project Query1Stats=tostring(pack_all())", - "crossComponentResources": [ - "{Subscription}" - ], - "isHiddenWhenLocked": true, - "timeContext": { - "durationMs": 86400000 - }, - "queryType": 1, - "resourceType": "microsoft.resourcegraph/resources" - }, - { - "id": "daf05c62-1d5b-4325-b241-d7ee468f23eb", - "version": "KqlParameterItem/1.0", - "name": "Query6FullyCompliant", - "type": 1, - "query": "{\"version\":\"1.0.0\",\"content\":\"{\\\"value\\\": \\\"{Query6Stats:$.FullyCompliant}\\\"}\",\"transformers\":null}", - "isHiddenWhenLocked": true, - "timeContext": { - "durationMs": 86400000 - }, - "queryType": 8 - }, - { - "id": "daf05c62-1d5b-4325-b241-d7ee468f23eb", - "version": "KqlParameterItem/1.0", - "name": "Tab7Success", - "type": 1, - "isHiddenWhenLocked": true, - "timeContext": { - "durationMs": 86400000 - }, - "criteriaData": [ - { - "criteriaContext": { - "operator": "Default", - "resultValType": "expression", - "resultVal": "{Query6Stats:$.Success}" - } - } - ] - }, - { - "id": "daf05c62-1d5b-4325-b241-d7ee468f23eb", - "version": "KqlParameterItem/1.0", - "name": "Tab7Total", - "type": 1, - "isHiddenWhenLocked": true, - "timeContext": { - "durationMs": 86400000 - }, - "criteriaData": [ - { - "criteriaContext": { - "operator": "Default", - "resultValType": "expression", - "resultVal": "{Query6Stats:$.Total}" - } - } - ] - }, - { - "id": "daf05c62-1d5b-4325-b241-d7ee468f23eb", - "version": "KqlParameterItem/1.0", - "name": "Tab7Percent", - "type": 1, - "isHiddenWhenLocked": true, - "timeContext": { - "durationMs": 86400000 - }, - "criteriaData": [ - { - "criteriaContext": { - "operator": "Default", - "resultValType": "expression", - "resultVal": "round(100*{Tab7Success}/{Tab7Total})" - } - } - ] - } - ], - "style": "pills", - "queryType": 1, - "resourceType": "microsoft.resourcegraph/resources" - }, - "name": "TabInvisibleParameters" - }, - { - "type": 1, - "content": { - "json": "## Internet" - }, - "customWidth": "50", - "name": "tab7title" - }, - { - "type": 3, - "content": { - "version": "KqlItem/1.0", - "query": "{\"version\":\"1.0.0\",\"content\":\"{\\\"Column1\\\": \\\"{Tab7Percent}\\\", \\\"Column2\\\": \\\"Percent of successful checks\\\"}\",\"transformers\":null}", - "size": 3, - "queryType": 8, - "visualization": "tiles", - "tileSettings": { - "titleContent": { - "columnMatch": "Column1", - "formatter": 4, - "formatOptions": { - "min": 0, - "max": 100, - "palette": "redGreen" - }, - "numberFormat": { - "unit": 0, - "options": { - "style": "decimal" - } - } - }, - "subtitleContent": { - "columnMatch": "Column2" - }, - "showBorder": true - } - }, - "customWidth": "50", - "name": "TabPercentTile" + "name": "query4" }, { "type": 1, "content": { - "json": "Use Azure Bastion in a subnet /26 or larger. Check [this link](https://learn.microsoft.com/azure/bastion/bastion-faq#subnet) for further information." + "json": "Ensure that IP address space isn't wasted, don't create unnecessarily large virtual networks (for example /16). Check [this link](https://learn.microsoft.com/azure/cloud-adoption-framework/ready/azure-best-practices/plan-for-ip-addressing) for further information.. [This training](https://learn.microsoft.com/learn/paths/architect-network-infrastructure/) can help to educate yourself on this." }, - "name": "querytext6" + "name": "querytext5" }, { "type": 3, "content": { "version": "KqlItem/1.0", - "query": "resources | where type=='microsoft.network/virtualnetworks' | project id,subnets=properties.subnets | mv-expand subnets | project id, subnetName = subnets.name, subnetPrefix = subnets.properties.addressPrefix | extend subnetPrefixLength = split(subnetPrefix, '/')[1] | where subnetName == 'AzureBastionSubnet' | extend compliant = (subnetPrefixLength <= 26) | distinct id, compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed", + "query": "resources | where type == 'microsoft.network/virtualnetworks' | extend addressSpace = todynamic(properties.addressSpace) | extend addressPrefix = todynamic(properties.addressSpace.addressPrefixes) | mvexpand addressSpace | mvexpand addressPrefix | extend addressMask = split(addressPrefix,'/')[1] | extend compliant = addressMask > 16 | project name, id, subscriptionId, resourceGroup, addressPrefix, compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed", "size": 4, "queryType": 1, "resourceType": "microsoft.resourcegraph/resources", @@ -3408,7 +3408,7 @@ ] } }, - "name": "query6" + "name": "query5" } ] }, diff --git a/workbooks/alz_checklist.en_network_tabcounters_template.json b/workbooks/alz_checklist.en_network_tabcounters_template.json index 9afcd0bd5..40cf7047a 100644 --- a/workbooks/alz_checklist.en_network_tabcounters_template.json +++ b/workbooks/alz_checklist.en_network_tabcounters_template.json @@ -41,7 +41,7 @@ "dependsOn": [], "properties": { "displayName": "[parameters('workbookDisplayName')]", - "serializedData": "{\n \"version\": \"Notebook/1.0\",\n \"items\": [\n {\n \"type\": 9,\n \"content\": {\n \"version\": \"KqlParameterItem/1.0\",\n \"parameters\": [\n {\n \"id\": \"497a107e-dde8-433e-b263-35ac8e8f7834\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Subscription\",\n \"type\": 6,\n \"multiSelect\": true,\n \"quote\": \"'\",\n \"delimiter\": \",\",\n \"typeSettings\": {\n \"additionalResourceOptions\": [\n \"value::all\"\n ],\n \"includeAll\": true,\n \"showDefault\": false\n },\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"value\": [\n \"value::all\"\n ]\n },\n {\n \"id\": \"844e4f4e-df51-4e3c-8eaf-0dc78b92c721\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"OnlyFailed\",\n \"label\": \"Only show failed\",\n \"type\": 2,\n \"typeSettings\": {\n \"additionalResourceOptions\": [],\n \"showDefault\": false\n },\n \"jsonData\": \"[\\r\\n { \\\"value\\\":true, \\\"label\\\":\\\"True\\\" },\\r\\n { \\\"value\\\":false, \\\"label\\\":\\\"False\\\", \\\"selected\\\":true }\\r\\n]\"\n }\n ],\n \"style\": \"pills\",\n \"queryType\": 0,\n \"resourceType\": \"microsoft.operationalinsights/workspaces\"\n },\n \"name\": \"WorkbookSelectors\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"If you set \\\"Only show failed\\\" to \\\"Yes\\\", the different queries will only show items that have failed their compliance checks.\",\n \"style\": \"info\"\n },\n \"name\": \"InfoBox\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"## Azure Landing Zone Review - Network\\n\\n---\\n\\nThis workbook has been automatically generated out of the checklists in the [Azure Review Checklists repo](https://github.com/Azure/review-checklists). This repo contains best practices and recommendations around generic Landing Zones as well as specific services such as Azure Virtual Desktop, Azure Kubernetes Service or Azure VMware Solution, to name a few. This repository of best practices is curated by Azure engineers, but open to anybody to contribute.\\n\\nIf you see a problem in the queries that are part of this workbook, please open a Github issue [here](https://github.com/Azure/review-checklists/issues/new).\"\n },\n \"customWidth\": \"100\",\n \"name\": \"MarkdownHeader\"\n },\n {\n \"type\": 11,\n \"content\": {\n \"version\": \"LinkItem/1.0\",\n \"style\": \"tabs\",\n \"links\": [\n {\n \"id\": \"a133c15c-e49d-47cb-8b97-ffdf564e4c9d\",\n \"cellValue\": \"VisibleTab\",\n \"linkTarget\": \"parameter\",\n \"linkLabel\": \"IP plan\",\n \"subTarget\": \"tab0\",\n \"preText\": \"IP plan\",\n \"style\": \"primary\"\n },\n {\n \"id\": \"1a90fe1a-16b0-4150-a881-03106bd53197\",\n \"cellValue\": \"VisibleTab\",\n \"linkTarget\": \"parameter\",\n \"linkLabel\": \"Firewall\",\n \"subTarget\": \"tab1\",\n \"preText\": \"Firewall\",\n \"style\": \"primary\"\n },\n {\n \"id\": \"953c4465-f7e2-49c8-8ec5-8c68c3ac24bd\",\n \"cellValue\": \"VisibleTab\",\n \"linkTarget\": \"parameter\",\n \"linkLabel\": \"Hub and spoke\",\n \"subTarget\": \"tab2\",\n \"preText\": \"Hub and spoke\",\n \"style\": \"primary\"\n },\n {\n \"id\": \"2d4ade89-52f2-4c98-8b38-275f70e14b97\",\n \"cellValue\": \"VisibleTab\",\n \"linkTarget\": \"parameter\",\n \"linkLabel\": \"Hybrid\",\n \"subTarget\": \"tab3\",\n \"preText\": \"Hybrid\",\n \"style\": \"primary\"\n },\n {\n \"id\": \"39ceaf48-7e1b-4ed8-88b5-e0c6498b19aa\",\n \"cellValue\": \"VisibleTab\",\n \"linkTarget\": \"parameter\",\n \"linkLabel\": \"PaaS\",\n \"subTarget\": \"tab4\",\n \"preText\": \"PaaS\",\n \"style\": \"primary\"\n },\n {\n \"id\": \"73469dff-dff9-414c-969a-565c72c5d323\",\n \"cellValue\": \"VisibleTab\",\n \"linkTarget\": \"parameter\",\n \"linkLabel\": \"Segmentation\",\n \"subTarget\": \"tab5\",\n \"preText\": \"Segmentation\",\n \"style\": \"primary\"\n },\n {\n \"id\": \"bd1779f4-ab82-479f-95b9-0b9f3a6a76bf\",\n \"cellValue\": \"VisibleTab\",\n \"linkTarget\": \"parameter\",\n \"linkLabel\": \"Virtual WAN\",\n \"subTarget\": \"tab6\",\n \"preText\": \"Virtual WAN\",\n \"style\": \"primary\"\n },\n {\n \"id\": \"2c6f8942-4bd4-48fe-b802-68d1a58b7a4e\",\n \"cellValue\": \"VisibleTab\",\n \"linkTarget\": \"parameter\",\n \"linkLabel\": \"Internet\",\n \"subTarget\": \"tab7\",\n \"preText\": \"Internet\",\n \"style\": \"primary\"\n }\n ]\n },\n \"name\": \"Tabs\"\n },\n {\n \"type\": 12,\n \"content\": {\n \"version\": \"NotebookGroup/1.0\",\n \"groupType\": \"editable\",\n \"items\": [\n {\n \"type\": 9,\n \"content\": {\n \"version\": \"KqlParameterItem/1.0\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"parameters\": [\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query4Stats\",\n \"type\": 1,\n \"query\": \"resources | where type == 'microsoft.network/virtualnetworks' | extend addressSpace = todynamic(properties.addressSpace) | extend addressPrefix = todynamic(properties.addressSpace.addressPrefixes) | mvexpand addressSpace | mvexpand addressPrefix | project name, id, location, resourceGroup, subscriptionId, cidr = addressPrefix | extend compliant = (cidr matches regex @'^(10\\\\.|172\\\\.(1[6-9]|2[0-9]|3[01])\\\\.|192\\\\.168\\\\.)') | project id, compliant, cidr| summarize Total = count(), Success = countif(compliant==1), Failed = countif(compliant==0) | extend SuccessPercent = iff(Total==0, 100, 100*toint(Success)/toint(Total)) | extend FullyCompliant = iff(SuccessPercent == 100, 'Yes', 'No') | project Query1Stats=tostring(pack_all())\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\"\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query4FullyCompliant\",\n \"type\": 1,\n \"query\": \"{\\\"version\\\":\\\"1.0.0\\\",\\\"content\\\":\\\"{\\\\\\\"value\\\\\\\": \\\\\\\"{Query4Stats:$.FullyCompliant}\\\\\\\"}\\\",\\\"transformers\\\":null}\",\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 8\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query5Stats\",\n \"type\": 1,\n \"query\": \"resources | where type == 'microsoft.network/virtualnetworks' | extend addressSpace = todynamic(properties.addressSpace) | extend addressPrefix = todynamic(properties.addressSpace.addressPrefixes) | mvexpand addressSpace | mvexpand addressPrefix | extend addressMask = split(addressPrefix,'/')[1] | extend compliant = addressMask > 16 | project name, id, subscriptionId, resourceGroup, addressPrefix, compliant| summarize Total = count(), Success = countif(compliant==1), Failed = countif(compliant==0) | extend SuccessPercent = iff(Total==0, 100, 100*toint(Success)/toint(Total)) | extend FullyCompliant = iff(SuccessPercent == 100, 'Yes', 'No') | project Query1Stats=tostring(pack_all())\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\"\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query5FullyCompliant\",\n \"type\": 1,\n \"query\": \"{\\\"version\\\":\\\"1.0.0\\\",\\\"content\\\":\\\"{\\\\\\\"value\\\\\\\": \\\\\\\"{Query5Stats:$.FullyCompliant}\\\\\\\"}\\\",\\\"transformers\\\":null}\",\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 8\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Tab0Success\",\n \"type\": 1,\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"criteriaData\": [\n {\n \"criteriaContext\": {\n \"operator\": \"Default\",\n \"resultValType\": \"expression\",\n \"resultVal\": \"{Query4Stats:$.Success}+{Query5Stats:$.Success}\"\n }\n }\n ]\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Tab0Total\",\n \"type\": 1,\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"criteriaData\": [\n {\n \"criteriaContext\": {\n \"operator\": \"Default\",\n \"resultValType\": \"expression\",\n \"resultVal\": \"{Query4Stats:$.Total}+{Query5Stats:$.Total}\"\n }\n }\n ]\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Tab0Percent\",\n \"type\": 1,\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"criteriaData\": [\n {\n \"criteriaContext\": {\n \"operator\": \"Default\",\n \"resultValType\": \"expression\",\n \"resultVal\": \"round(100*{Tab0Success}/{Tab0Total})\"\n }\n }\n ]\n }\n ],\n \"style\": \"pills\",\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\"\n },\n \"name\": \"TabInvisibleParameters\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"## IP plan\"\n },\n \"customWidth\": \"50\",\n \"name\": \"tab0title\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"{\\\"version\\\":\\\"1.0.0\\\",\\\"content\\\":\\\"{\\\\\\\"Column1\\\\\\\": \\\\\\\"{Tab0Percent}\\\\\\\", \\\\\\\"Column2\\\\\\\": \\\\\\\"Percent of successful checks\\\\\\\"}\\\",\\\"transformers\\\":null}\",\n \"size\": 3,\n \"queryType\": 8,\n \"visualization\": \"tiles\",\n \"tileSettings\": {\n \"titleContent\": {\n \"columnMatch\": \"Column1\",\n \"formatter\": 4,\n \"formatOptions\": {\n \"min\": 0,\n \"max\": 100,\n \"palette\": \"redGreen\"\n },\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n \"subtitleContent\": {\n \"columnMatch\": \"Column2\"\n },\n \"showBorder\": true\n }\n },\n \"customWidth\": \"50\",\n \"name\": \"TabPercentTile\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"Use IP addresses from the address allocation ranges for private internets (RFC 1918). Check [this link](https://learn.microsoft.com/azure/cloud-adoption-framework/ready/azure-best-practices/plan-for-ip-addressing) for further information.. [This training](https://learn.microsoft.com/learn/paths/architect-network-infrastructure/) can help to educate yourself on this.\"\n },\n \"name\": \"querytext4\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"resources | where type == 'microsoft.network/virtualnetworks' | extend addressSpace = todynamic(properties.addressSpace) | extend addressPrefix = todynamic(properties.addressSpace.addressPrefixes) | mvexpand addressSpace | mvexpand addressPrefix | project name, id, location, resourceGroup, subscriptionId, cidr = addressPrefix | extend compliant = (cidr matches regex @'^(10\\\\.|172\\\\.(1[6-9]|2[0-9]|3[01])\\\\.|192\\\\.168\\\\.)') | project id, compliant, cidr | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed\",\n \"size\": 4,\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"gridSettings\": {\n \"formatters\": [\n {\n \"columnMatch\": \"id\",\n \"formatter\": 0,\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n {\n \"columnMatch\": \"compliant\",\n \"formatter\": 18,\n \"formatOptions\": {\n \"thresholdsOptions\": \"icons\",\n \"thresholdsGrid\": [\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"1\",\n \"representation\": \"success\",\n \"text\": \"Success\"\n },\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"0\",\n \"representation\": \"failed\",\n \"text\": \"Failed\"\n },\n {\n \"operator\": \"Default\",\n \"thresholdValue\": null,\n \"representation\": \"unknown\",\n \"text\": \"Unknown\"\n }\n ]\n }\n }\n ]\n }\n },\n \"name\": \"query4\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"Ensure that IP address space isn't wasted, don't create unnecessarily large virtual networks (for example /16). Check [this link](https://learn.microsoft.com/azure/cloud-adoption-framework/ready/azure-best-practices/plan-for-ip-addressing) for further information.. [This training](https://learn.microsoft.com/learn/paths/architect-network-infrastructure/) can help to educate yourself on this.\"\n },\n \"name\": \"querytext5\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"resources | where type == 'microsoft.network/virtualnetworks' | extend addressSpace = todynamic(properties.addressSpace) | extend addressPrefix = todynamic(properties.addressSpace.addressPrefixes) | mvexpand addressSpace | mvexpand addressPrefix | extend addressMask = split(addressPrefix,'/')[1] | extend compliant = addressMask > 16 | project name, id, subscriptionId, resourceGroup, addressPrefix, compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed\",\n \"size\": 4,\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"gridSettings\": {\n \"formatters\": [\n {\n \"columnMatch\": \"id\",\n \"formatter\": 0,\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n {\n \"columnMatch\": \"compliant\",\n \"formatter\": 18,\n \"formatOptions\": {\n \"thresholdsOptions\": \"icons\",\n \"thresholdsGrid\": [\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"1\",\n \"representation\": \"success\",\n \"text\": \"Success\"\n },\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"0\",\n \"representation\": \"failed\",\n \"text\": \"Failed\"\n },\n {\n \"operator\": \"Default\",\n \"thresholdValue\": null,\n \"representation\": \"unknown\",\n \"text\": \"Unknown\"\n }\n ]\n }\n }\n ]\n }\n },\n \"name\": \"query5\"\n }\n ]\n },\n \"conditionalVisibility\": {\n \"parameterName\": \"VisibleTab\",\n \"comparison\": \"isEqualTo\",\n \"value\": \"tab0\"\n },\n \"name\": \"tab0\"\n },\n {\n \"type\": 12,\n \"content\": {\n \"version\": \"NotebookGroup/1.0\",\n \"groupType\": \"editable\",\n \"items\": [\n {\n \"type\": 9,\n \"content\": {\n \"version\": \"KqlParameterItem/1.0\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"parameters\": [\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query14Stats\",\n \"type\": 1,\n \"query\": \"resources | where type=='microsoft.network/firewallpolicies' | extend compliant = (properties.dnsSettings.enableProxy == true) | distinct id,compliant| summarize Total = count(), Success = countif(compliant==1), Failed = countif(compliant==0) | extend SuccessPercent = iff(Total==0, 100, 100*toint(Success)/toint(Total)) | extend FullyCompliant = iff(SuccessPercent == 100, 'Yes', 'No') | project Query1Stats=tostring(pack_all())\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\"\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query14FullyCompliant\",\n \"type\": 1,\n \"query\": \"{\\\"version\\\":\\\"1.0.0\\\",\\\"content\\\":\\\"{\\\\\\\"value\\\\\\\": \\\\\\\"{Query14Stats:$.FullyCompliant}\\\\\\\"}\\\",\\\"transformers\\\":null}\",\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 8\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query15Stats\",\n \"type\": 1,\n \"query\": \"resources | where type=='microsoft.network/firewallpolicies' | extend compliant = (properties.sku.tier == 'Premium') | distinct id,compliant| summarize Total = count(), Success = countif(compliant==1), Failed = countif(compliant==0) | extend SuccessPercent = iff(Total==0, 100, 100*toint(Success)/toint(Total)) | extend FullyCompliant = iff(SuccessPercent == 100, 'Yes', 'No') | project Query1Stats=tostring(pack_all())\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\"\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query15FullyCompliant\",\n \"type\": 1,\n \"query\": \"{\\\"version\\\":\\\"1.0.0\\\",\\\"content\\\":\\\"{\\\\\\\"value\\\\\\\": \\\\\\\"{Query15Stats:$.FullyCompliant}\\\\\\\"}\\\",\\\"transformers\\\":null}\",\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 8\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query16Stats\",\n \"type\": 1,\n \"query\": \"resources | where type=='microsoft.network/firewallpolicies' | extend compliant = (properties.threatIntelMode == 'Deny') | distinct id,compliant| summarize Total = count(), Success = countif(compliant==1), Failed = countif(compliant==0) | extend SuccessPercent = iff(Total==0, 100, 100*toint(Success)/toint(Total)) | extend FullyCompliant = iff(SuccessPercent == 100, 'Yes', 'No') | project Query1Stats=tostring(pack_all())\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\"\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query16FullyCompliant\",\n \"type\": 1,\n \"query\": \"{\\\"version\\\":\\\"1.0.0\\\",\\\"content\\\":\\\"{\\\\\\\"value\\\\\\\": \\\\\\\"{Query16Stats:$.FullyCompliant}\\\\\\\"}\\\",\\\"transformers\\\":null}\",\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 8\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query17Stats\",\n \"type\": 1,\n \"query\": \"resources | where type=='microsoft.network/firewallpolicies' | extend compliant = (properties.intrusionDetection.mode == 'Deny') | project id, compliant| summarize Total = count(), Success = countif(compliant==1), Failed = countif(compliant==0) | extend SuccessPercent = iff(Total==0, 100, 100*toint(Success)/toint(Total)) | extend FullyCompliant = iff(SuccessPercent == 100, 'Yes', 'No') | project Query1Stats=tostring(pack_all())\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\"\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query17FullyCompliant\",\n \"type\": 1,\n \"query\": \"{\\\"version\\\":\\\"1.0.0\\\",\\\"content\\\":\\\"{\\\\\\\"value\\\\\\\": \\\\\\\"{Query17Stats:$.FullyCompliant}\\\\\\\"}\\\",\\\"transformers\\\":null}\",\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 8\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query18Stats\",\n \"type\": 1,\n \"query\": \"resources | where type=='microsoft.network/virtualnetworks' | project id,resourceGroup,name,subnets=properties.subnets | mv-expand subnets | project id,name,subnetId=tostring(subnets.id), subnetName=tostring(subnets.name),subnetRT=subnets.properties.routeTable.id | where not (subnetName in ('GatewaySubnet', 'AzureFirewallSubnet', 'RouteServerSubnet', 'AzureBastionSubnet')) | extend hasRT = isnotnull(subnetRT) | distinct id, hasRT, subnetId | join kind=fullouter (resources | where type == 'microsoft.network/virtualnetworks' | mvexpand properties.virtualNetworkPeerings | extend isVWAN=(tolower(split(properties_virtualNetworkPeerings.name, '_')[0]) == 'remotevnettohubpeering') | mv-expand properties.subnets | project id, isVWAN, name, subnetId=tostring(properties_subnets.id), subnetName=tostring(properties_subnets.name) | summarize PeeredToVWAN=max(isVWAN) by id, subnetId | project id, subnetId, isVWANpeer = (PeeredToVWAN == true)) on subnetId | project id=iff(isnotempty(id), id, id1), subnetId=iff(isnotempty(subnetId), subnetId, subnetId1), hasRT, isVWANpeer | extend compliant = (hasRT==true or isVWANpeer==true) | distinct id, subnetId, compliant| summarize Total = count(), Success = countif(compliant==1), Failed = countif(compliant==0) | extend SuccessPercent = iff(Total==0, 100, 100*toint(Success)/toint(Total)) | extend FullyCompliant = iff(SuccessPercent == 100, 'Yes', 'No') | project Query1Stats=tostring(pack_all())\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\"\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query18FullyCompliant\",\n \"type\": 1,\n \"query\": \"{\\\"version\\\":\\\"1.0.0\\\",\\\"content\\\":\\\"{\\\\\\\"value\\\\\\\": \\\\\\\"{Query18Stats:$.FullyCompliant}\\\\\\\"}\\\",\\\"transformers\\\":null}\",\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 8\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Tab1Success\",\n \"type\": 1,\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"criteriaData\": [\n {\n \"criteriaContext\": {\n \"operator\": \"Default\",\n \"resultValType\": \"expression\",\n \"resultVal\": \"{Query14Stats:$.Success}+{Query15Stats:$.Success}+{Query16Stats:$.Success}+{Query17Stats:$.Success}+{Query18Stats:$.Success}\"\n }\n }\n ]\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Tab1Total\",\n \"type\": 1,\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"criteriaData\": [\n {\n \"criteriaContext\": {\n \"operator\": \"Default\",\n \"resultValType\": \"expression\",\n \"resultVal\": \"{Query14Stats:$.Total}+{Query15Stats:$.Total}+{Query16Stats:$.Total}+{Query17Stats:$.Total}+{Query18Stats:$.Total}\"\n }\n }\n ]\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Tab1Percent\",\n \"type\": 1,\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"criteriaData\": [\n {\n \"criteriaContext\": {\n \"operator\": \"Default\",\n \"resultValType\": \"expression\",\n \"resultVal\": \"round(100*{Tab1Success}/{Tab1Total})\"\n }\n }\n ]\n }\n ],\n \"style\": \"pills\",\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\"\n },\n \"name\": \"TabInvisibleParameters\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"## Firewall\"\n },\n \"customWidth\": \"50\",\n \"name\": \"tab1title\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"{\\\"version\\\":\\\"1.0.0\\\",\\\"content\\\":\\\"{\\\\\\\"Column1\\\\\\\": \\\\\\\"{Tab1Percent}\\\\\\\", \\\\\\\"Column2\\\\\\\": \\\\\\\"Percent of successful checks\\\\\\\"}\\\",\\\"transformers\\\":null}\",\n \"size\": 3,\n \"queryType\": 8,\n \"visualization\": \"tiles\",\n \"tileSettings\": {\n \"titleContent\": {\n \"columnMatch\": \"Column1\",\n \"formatter\": 4,\n \"formatOptions\": {\n \"min\": 0,\n \"max\": 100,\n \"palette\": \"redGreen\"\n },\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n \"subtitleContent\": {\n \"columnMatch\": \"Column2\"\n },\n \"showBorder\": true\n }\n },\n \"customWidth\": \"50\",\n \"name\": \"TabPercentTile\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"Use application rules to filter outbound traffic on destination host name for supported protocols. Use FQDN-based network rules and Azure Firewall with DNS proxy to filter egress traffic to the Internet over other protocols. Check [this link](https://learn.microsoft.com/azure/firewall/fqdn-filtering-network-rules) for further information.\"\n },\n \"name\": \"querytext14\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"resources | where type=='microsoft.network/firewallpolicies' | extend compliant = (properties.dnsSettings.enableProxy == true) | distinct id,compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed\",\n \"size\": 4,\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"gridSettings\": {\n \"formatters\": [\n {\n \"columnMatch\": \"id\",\n \"formatter\": 0,\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n {\n \"columnMatch\": \"compliant\",\n \"formatter\": 18,\n \"formatOptions\": {\n \"thresholdsOptions\": \"icons\",\n \"thresholdsGrid\": [\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"1\",\n \"representation\": \"success\",\n \"text\": \"Success\"\n },\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"0\",\n \"representation\": \"failed\",\n \"text\": \"Failed\"\n },\n {\n \"operator\": \"Default\",\n \"thresholdValue\": null,\n \"representation\": \"unknown\",\n \"text\": \"Unknown\"\n }\n ]\n }\n }\n ]\n }\n },\n \"name\": \"query14\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"Use Azure Firewall Premium to enable additional security features. Check [this link](https://learn.microsoft.com/azure/firewall/premium-features) for further information.\"\n },\n \"name\": \"querytext15\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"resources | where type=='microsoft.network/firewallpolicies' | extend compliant = (properties.sku.tier == 'Premium') | distinct id,compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed\",\n \"size\": 4,\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"gridSettings\": {\n \"formatters\": [\n {\n \"columnMatch\": \"id\",\n \"formatter\": 0,\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n {\n \"columnMatch\": \"compliant\",\n \"formatter\": 18,\n \"formatOptions\": {\n \"thresholdsOptions\": \"icons\",\n \"thresholdsGrid\": [\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"1\",\n \"representation\": \"success\",\n \"text\": \"Success\"\n },\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"0\",\n \"representation\": \"failed\",\n \"text\": \"Failed\"\n },\n {\n \"operator\": \"Default\",\n \"thresholdValue\": null,\n \"representation\": \"unknown\",\n \"text\": \"Unknown\"\n }\n ]\n }\n }\n ]\n }\n },\n \"name\": \"query15\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"Configure Azure Firewall Threat Intelligence mode to Alert and Deny for additional protection. Check [this link](https://learn.microsoft.com/azure/firewall/premium-features#idps-signature-rules) for further information.\"\n },\n \"name\": \"querytext16\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"resources | where type=='microsoft.network/firewallpolicies' | extend compliant = (properties.threatIntelMode == 'Deny') | distinct id,compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed\",\n \"size\": 4,\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"gridSettings\": {\n \"formatters\": [\n {\n \"columnMatch\": \"id\",\n \"formatter\": 0,\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n {\n \"columnMatch\": \"compliant\",\n \"formatter\": 18,\n \"formatOptions\": {\n \"thresholdsOptions\": \"icons\",\n \"thresholdsGrid\": [\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"1\",\n \"representation\": \"success\",\n \"text\": \"Success\"\n },\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"0\",\n \"representation\": \"failed\",\n \"text\": \"Failed\"\n },\n {\n \"operator\": \"Default\",\n \"thresholdValue\": null,\n \"representation\": \"unknown\",\n \"text\": \"Unknown\"\n }\n ]\n }\n }\n ]\n }\n },\n \"name\": \"query16\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"Configure Azure Firewall IDPS mode to Deny for additional protection. Check [this link](https://learn.microsoft.com/azure/firewall/premium-features#idps) for further information.\"\n },\n \"name\": \"querytext17\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"resources | where type=='microsoft.network/firewallpolicies' | extend compliant = (properties.intrusionDetection.mode == 'Deny') | project id, compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed\",\n \"size\": 4,\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"gridSettings\": {\n \"formatters\": [\n {\n \"columnMatch\": \"id\",\n \"formatter\": 0,\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n {\n \"columnMatch\": \"compliant\",\n \"formatter\": 18,\n \"formatOptions\": {\n \"thresholdsOptions\": \"icons\",\n \"thresholdsGrid\": [\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"1\",\n \"representation\": \"success\",\n \"text\": \"Success\"\n },\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"0\",\n \"representation\": \"failed\",\n \"text\": \"Failed\"\n },\n {\n \"operator\": \"Default\",\n \"thresholdValue\": null,\n \"representation\": \"unknown\",\n \"text\": \"Unknown\"\n }\n ]\n }\n }\n ]\n }\n },\n \"name\": \"query17\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"For subnets in VNets not connected to Virtual WAN, attach a route table so that Internet traffic is redirected to Azure Firewall or a Network Virtual Appliance. Check [this link](https://learn.microsoft.com/azure/virtual-network/virtual-networks-udr-overview) for further information.\"\n },\n \"name\": \"querytext18\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"resources | where type=='microsoft.network/virtualnetworks' | project id,resourceGroup,name,subnets=properties.subnets | mv-expand subnets | project id,name,subnetId=tostring(subnets.id), subnetName=tostring(subnets.name),subnetRT=subnets.properties.routeTable.id | where not (subnetName in ('GatewaySubnet', 'AzureFirewallSubnet', 'RouteServerSubnet', 'AzureBastionSubnet')) | extend hasRT = isnotnull(subnetRT) | distinct id, hasRT, subnetId | join kind=fullouter (resources | where type == 'microsoft.network/virtualnetworks' | mvexpand properties.virtualNetworkPeerings | extend isVWAN=(tolower(split(properties_virtualNetworkPeerings.name, '_')[0]) == 'remotevnettohubpeering') | mv-expand properties.subnets | project id, isVWAN, name, subnetId=tostring(properties_subnets.id), subnetName=tostring(properties_subnets.name) | summarize PeeredToVWAN=max(isVWAN) by id, subnetId | project id, subnetId, isVWANpeer = (PeeredToVWAN == true)) on subnetId | project id=iff(isnotempty(id), id, id1), subnetId=iff(isnotempty(subnetId), subnetId, subnetId1), hasRT, isVWANpeer | extend compliant = (hasRT==true or isVWANpeer==true) | distinct id, subnetId, compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed\",\n \"size\": 4,\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"gridSettings\": {\n \"formatters\": [\n {\n \"columnMatch\": \"id\",\n \"formatter\": 0,\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n {\n \"columnMatch\": \"compliant\",\n \"formatter\": 18,\n \"formatOptions\": {\n \"thresholdsOptions\": \"icons\",\n \"thresholdsGrid\": [\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"1\",\n \"representation\": \"success\",\n \"text\": \"Success\"\n },\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"0\",\n \"representation\": \"failed\",\n \"text\": \"Failed\"\n },\n {\n \"operator\": \"Default\",\n \"thresholdValue\": null,\n \"representation\": \"unknown\",\n \"text\": \"Unknown\"\n }\n ]\n }\n }\n ]\n }\n },\n \"name\": \"query18\"\n }\n ]\n },\n \"conditionalVisibility\": {\n \"parameterName\": \"VisibleTab\",\n \"comparison\": \"isEqualTo\",\n \"value\": \"tab1\"\n },\n \"name\": \"tab1\"\n },\n {\n \"type\": 12,\n \"content\": {\n \"version\": \"NotebookGroup/1.0\",\n \"groupType\": \"editable\",\n \"items\": [\n {\n \"type\": 9,\n \"content\": {\n \"version\": \"KqlParameterItem/1.0\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"parameters\": [\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query0Stats\",\n \"type\": 1,\n \"query\": \"resources | where type=='microsoft.network/virtualnetworks' | project id,subnets=properties.subnets | mv-expand subnets | project id, subnetName = subnets.name, subnetPrefix = subnets.properties.addressPrefix | extend subnetPrefixLength = split(subnetPrefix, '/')[1] | where subnetName == 'RouteServerSubnet' | extend compliant = (subnetPrefixLength <= 27) | distinct id, compliant| summarize Total = count(), Success = countif(compliant==1), Failed = countif(compliant==0) | extend SuccessPercent = iff(Total==0, 100, 100*toint(Success)/toint(Total)) | extend FullyCompliant = iff(SuccessPercent == 100, 'Yes', 'No') | project Query1Stats=tostring(pack_all())\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\"\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query0FullyCompliant\",\n \"type\": 1,\n \"query\": \"{\\\"version\\\":\\\"1.0.0\\\",\\\"content\\\":\\\"{\\\\\\\"value\\\\\\\": \\\\\\\"{Query0Stats:$.FullyCompliant}\\\\\\\"}\\\",\\\"transformers\\\":null}\",\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 8\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query1Stats\",\n \"type\": 1,\n \"query\": \"resources | where type == 'microsoft.network/virtualnetworks' | mvexpand properties.virtualNetworkPeerings | summarize peeringcount = count() by id | extend compliant = (peeringcount < 450) | distinct id,compliant| summarize Total = count(), Success = countif(compliant==1), Failed = countif(compliant==0) | extend SuccessPercent = iff(Total==0, 100, 100*toint(Success)/toint(Total)) | extend FullyCompliant = iff(SuccessPercent == 100, 'Yes', 'No') | project Query1Stats=tostring(pack_all())\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\"\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query1FullyCompliant\",\n \"type\": 1,\n \"query\": \"{\\\"version\\\":\\\"1.0.0\\\",\\\"content\\\":\\\"{\\\\\\\"value\\\\\\\": \\\\\\\"{Query1Stats:$.FullyCompliant}\\\\\\\"}\\\",\\\"transformers\\\":null}\",\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 8\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query2Stats\",\n \"type\": 1,\n \"query\": \"resources | where type=='microsoft.network/routetables' | mvexpand properties.routes | summarize routeCount = count() by id | extend compliant = (routeCount < 360) | distinct id,compliant| summarize Total = count(), Success = countif(compliant==1), Failed = countif(compliant==0) | extend SuccessPercent = iff(Total==0, 100, 100*toint(Success)/toint(Total)) | extend FullyCompliant = iff(SuccessPercent == 100, 'Yes', 'No') | project Query1Stats=tostring(pack_all())\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\"\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query2FullyCompliant\",\n \"type\": 1,\n \"query\": \"{\\\"version\\\":\\\"1.0.0\\\",\\\"content\\\":\\\"{\\\\\\\"value\\\\\\\": \\\\\\\"{Query2Stats:$.FullyCompliant}\\\\\\\"}\\\",\\\"transformers\\\":null}\",\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 8\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query3Stats\",\n \"type\": 1,\n \"query\": \"resources | where type == 'microsoft.network/virtualnetworks' | mvexpand properties.virtualNetworkPeerings | project id, peeringName=properties_virtualNetworkPeerings.name, compliant = (properties_virtualNetworkPeerings.properties.allowVirtualNetworkAccess == True)| summarize Total = count(), Success = countif(compliant==1), Failed = countif(compliant==0) | extend SuccessPercent = iff(Total==0, 100, 100*toint(Success)/toint(Total)) | extend FullyCompliant = iff(SuccessPercent == 100, 'Yes', 'No') | project Query1Stats=tostring(pack_all())\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\"\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query3FullyCompliant\",\n \"type\": 1,\n \"query\": \"{\\\"version\\\":\\\"1.0.0\\\",\\\"content\\\":\\\"{\\\\\\\"value\\\\\\\": \\\\\\\"{Query3Stats:$.FullyCompliant}\\\\\\\"}\\\",\\\"transformers\\\":null}\",\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 8\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Tab2Success\",\n \"type\": 1,\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"criteriaData\": [\n {\n \"criteriaContext\": {\n \"operator\": \"Default\",\n \"resultValType\": \"expression\",\n \"resultVal\": \"{Query0Stats:$.Success}+{Query1Stats:$.Success}+{Query2Stats:$.Success}+{Query3Stats:$.Success}\"\n }\n }\n ]\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Tab2Total\",\n \"type\": 1,\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"criteriaData\": [\n {\n \"criteriaContext\": {\n \"operator\": \"Default\",\n \"resultValType\": \"expression\",\n \"resultVal\": \"{Query0Stats:$.Total}+{Query1Stats:$.Total}+{Query2Stats:$.Total}+{Query3Stats:$.Total}\"\n }\n }\n ]\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Tab2Percent\",\n \"type\": 1,\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"criteriaData\": [\n {\n \"criteriaContext\": {\n \"operator\": \"Default\",\n \"resultValType\": \"expression\",\n \"resultVal\": \"round(100*{Tab2Success}/{Tab2Total})\"\n }\n }\n ]\n }\n ],\n \"style\": \"pills\",\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\"\n },\n \"name\": \"TabInvisibleParameters\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"## Hub and spoke\"\n },\n \"customWidth\": \"50\",\n \"name\": \"tab2title\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"{\\\"version\\\":\\\"1.0.0\\\",\\\"content\\\":\\\"{\\\\\\\"Column1\\\\\\\": \\\\\\\"{Tab2Percent}\\\\\\\", \\\\\\\"Column2\\\\\\\": \\\\\\\"Percent of successful checks\\\\\\\"}\\\",\\\"transformers\\\":null}\",\n \"size\": 3,\n \"queryType\": 8,\n \"visualization\": \"tiles\",\n \"tileSettings\": {\n \"titleContent\": {\n \"columnMatch\": \"Column1\",\n \"formatter\": 4,\n \"formatOptions\": {\n \"min\": 0,\n \"max\": 100,\n \"palette\": \"redGreen\"\n },\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n \"subtitleContent\": {\n \"columnMatch\": \"Column2\"\n },\n \"showBorder\": true\n }\n },\n \"customWidth\": \"50\",\n \"name\": \"TabPercentTile\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"If using Route Server, use a /27 prefix for the Route Server subnet. Check [this link](https://learn.microsoft.com/azure/route-server/quickstart-configure-route-server-portal#create-a-route-server-1) for further information.\"\n },\n \"name\": \"querytext0\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"resources | where type=='microsoft.network/virtualnetworks' | project id,subnets=properties.subnets | mv-expand subnets | project id, subnetName = subnets.name, subnetPrefix = subnets.properties.addressPrefix | extend subnetPrefixLength = split(subnetPrefix, '/')[1] | where subnetName == 'RouteServerSubnet' | extend compliant = (subnetPrefixLength <= 27) | distinct id, compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed\",\n \"size\": 4,\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"gridSettings\": {\n \"formatters\": [\n {\n \"columnMatch\": \"id\",\n \"formatter\": 0,\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n {\n \"columnMatch\": \"compliant\",\n \"formatter\": 18,\n \"formatOptions\": {\n \"thresholdsOptions\": \"icons\",\n \"thresholdsGrid\": [\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"1\",\n \"representation\": \"success\",\n \"text\": \"Success\"\n },\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"0\",\n \"representation\": \"failed\",\n \"text\": \"Failed\"\n },\n {\n \"operator\": \"Default\",\n \"thresholdValue\": null,\n \"representation\": \"unknown\",\n \"text\": \"Unknown\"\n }\n ]\n }\n }\n ]\n }\n },\n \"name\": \"query0\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"If you have more than 400 spoke networks in a region, deploy an additional hub to bypass VNet peering limits (500) and the maximum number of prefixes that can be advertised via ExpressRoute (1000). Check [this link](https://learn.microsoft.com/azure/azure-resource-manager/management/azure-subscription-service-limits?toc=/azure/virtual-network/toc.json#azure-resource-manager-virtual-networking-limits) for further information.\"\n },\n \"name\": \"querytext1\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"resources | where type == 'microsoft.network/virtualnetworks' | mvexpand properties.virtualNetworkPeerings | summarize peeringcount = count() by id | extend compliant = (peeringcount < 450) | distinct id,compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed\",\n \"size\": 4,\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"gridSettings\": {\n \"formatters\": [\n {\n \"columnMatch\": \"id\",\n \"formatter\": 0,\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n {\n \"columnMatch\": \"compliant\",\n \"formatter\": 18,\n \"formatOptions\": {\n \"thresholdsOptions\": \"icons\",\n \"thresholdsGrid\": [\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"1\",\n \"representation\": \"success\",\n \"text\": \"Success\"\n },\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"0\",\n \"representation\": \"failed\",\n \"text\": \"Failed\"\n },\n {\n \"operator\": \"Default\",\n \"thresholdValue\": null,\n \"representation\": \"unknown\",\n \"text\": \"Unknown\"\n }\n ]\n }\n }\n ]\n }\n },\n \"name\": \"query1\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"Limit the number of routes per route table to 400. Check [this link](https://learn.microsoft.com/azure/azure-resource-manager/management/azure-subscription-service-limits?toc=/azure/virtual-network/toc.json#azure-resource-manager-virtual-networking-limits) for further information.\"\n },\n \"name\": \"querytext2\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"resources | where type=='microsoft.network/routetables' | mvexpand properties.routes | summarize routeCount = count() by id | extend compliant = (routeCount < 360) | distinct id,compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed\",\n \"size\": 4,\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"gridSettings\": {\n \"formatters\": [\n {\n \"columnMatch\": \"id\",\n \"formatter\": 0,\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n {\n \"columnMatch\": \"compliant\",\n \"formatter\": 18,\n \"formatOptions\": {\n \"thresholdsOptions\": \"icons\",\n \"thresholdsGrid\": [\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"1\",\n \"representation\": \"success\",\n \"text\": \"Success\"\n },\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"0\",\n \"representation\": \"failed\",\n \"text\": \"Failed\"\n },\n {\n \"operator\": \"Default\",\n \"thresholdValue\": null,\n \"representation\": \"unknown\",\n \"text\": \"Unknown\"\n }\n ]\n }\n }\n ]\n }\n },\n \"name\": \"query2\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"Use the setting 'Allow traffic to remote virtual network' when configuring VNet peerings. Check [this link](https://learn.microsoft.com/azure/virtual-network/virtual-network-manage-peering) for further information.\"\n },\n \"name\": \"querytext3\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"resources | where type == 'microsoft.network/virtualnetworks' | mvexpand properties.virtualNetworkPeerings | project id, peeringName=properties_virtualNetworkPeerings.name, compliant = (properties_virtualNetworkPeerings.properties.allowVirtualNetworkAccess == True) | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed\",\n \"size\": 4,\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"gridSettings\": {\n \"formatters\": [\n {\n \"columnMatch\": \"id\",\n \"formatter\": 0,\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n {\n \"columnMatch\": \"compliant\",\n \"formatter\": 18,\n \"formatOptions\": {\n \"thresholdsOptions\": \"icons\",\n \"thresholdsGrid\": [\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"1\",\n \"representation\": \"success\",\n \"text\": \"Success\"\n },\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"0\",\n \"representation\": \"failed\",\n \"text\": \"Failed\"\n },\n {\n \"operator\": \"Default\",\n \"thresholdValue\": null,\n \"representation\": \"unknown\",\n \"text\": \"Unknown\"\n }\n ]\n }\n }\n ]\n }\n },\n \"name\": \"query3\"\n }\n ]\n },\n \"conditionalVisibility\": {\n \"parameterName\": \"VisibleTab\",\n \"comparison\": \"isEqualTo\",\n \"value\": \"tab2\"\n },\n \"name\": \"tab2\"\n },\n {\n \"type\": 12,\n \"content\": {\n \"version\": \"NotebookGroup/1.0\",\n \"groupType\": \"editable\",\n \"items\": [\n {\n \"type\": 9,\n \"content\": {\n \"version\": \"KqlParameterItem/1.0\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"parameters\": [\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query7Stats\",\n \"type\": 1,\n \"query\": \"resources| where type == 'microsoft.network/virtualnetworkgateways'| where properties.gatewayType =~ 'vpn' or properties.gatewayType == 'ExpressRoute'| extend SKUName = properties.sku.name, SKUTier = properties.sku.tier, Type = properties.gatewayType| extend compliant = SKUTier !in ('Basic', 'Standard')| project name, id, subscriptionId, resourceGroup, compliant| summarize Total = count(), Success = countif(compliant==1), Failed = countif(compliant==0) | extend SuccessPercent = iff(Total==0, 100, 100*toint(Success)/toint(Total)) | extend FullyCompliant = iff(SuccessPercent == 100, 'Yes', 'No') | project Query1Stats=tostring(pack_all())\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\"\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query7FullyCompliant\",\n \"type\": 1,\n \"query\": \"{\\\"version\\\":\\\"1.0.0\\\",\\\"content\\\":\\\"{\\\\\\\"value\\\\\\\": \\\\\\\"{Query7Stats:$.FullyCompliant}\\\\\\\"}\\\",\\\"transformers\\\":null}\",\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 8\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query8Stats\",\n \"type\": 1,\n \"query\": \"resources | where type=='microsoft.network/expressroutecircuits' | extend compliant = (tolower(sku.family) == 'metereddata' or tolower(sku.tier) == 'local') | distinct id,compliant| summarize Total = count(), Success = countif(compliant==1), Failed = countif(compliant==0) | extend SuccessPercent = iff(Total==0, 100, 100*toint(Success)/toint(Total)) | extend FullyCompliant = iff(SuccessPercent == 100, 'Yes', 'No') | project Query1Stats=tostring(pack_all())\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\"\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query8FullyCompliant\",\n \"type\": 1,\n \"query\": \"{\\\"version\\\":\\\"1.0.0\\\",\\\"content\\\":\\\"{\\\\\\\"value\\\\\\\": \\\\\\\"{Query8Stats:$.FullyCompliant}\\\\\\\"}\\\",\\\"transformers\\\":null}\",\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 8\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query9Stats\",\n \"type\": 1,\n \"query\": \"resources | where type=='microsoft.network/connections' | where properties.connectionType == 'ExpressRoute' | project id, gwid=tostring(properties.virtualNetworkGateway1.id), circuitid=tostring(properties.peer.id) | join (resources | where type=='microsoft.network/expressroutecircuits' | project circuitid=tostring(id), circuitsku=sku.tier) on circuitid | project id=gwid, compliant = (circuitsku == 'Local') | summarize compliant=max(compliant) by id| summarize Total = count(), Success = countif(compliant==1), Failed = countif(compliant==0) | extend SuccessPercent = iff(Total==0, 100, 100*toint(Success)/toint(Total)) | extend FullyCompliant = iff(SuccessPercent == 100, 'Yes', 'No') | project Query1Stats=tostring(pack_all())\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\"\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query9FullyCompliant\",\n \"type\": 1,\n \"query\": \"{\\\"version\\\":\\\"1.0.0\\\",\\\"content\\\":\\\"{\\\\\\\"value\\\\\\\": \\\\\\\"{Query9Stats:$.FullyCompliant}\\\\\\\"}\\\",\\\"transformers\\\":null}\",\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 8\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query10Stats\",\n \"type\": 1,\n \"query\": \"resources| where type == 'microsoft.network/virtualnetworkgateways'| where properties.gatewayType =~ 'vpn' or properties.gatewayType == 'ExpressRoute'| extend SKUName = properties.sku.name, SKUTier = properties.sku.tier, Type = properties.gatewayType| extend compliant = SKUTier contains 'AZ'| project name, id, subscriptionId, resourceGroup, Type, compliant| summarize Total = count(), Success = countif(compliant==1), Failed = countif(compliant==0) | extend SuccessPercent = iff(Total==0, 100, 100*toint(Success)/toint(Total)) | extend FullyCompliant = iff(SuccessPercent == 100, 'Yes', 'No') | project Query1Stats=tostring(pack_all())\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\"\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query10FullyCompliant\",\n \"type\": 1,\n \"query\": \"{\\\"version\\\":\\\"1.0.0\\\",\\\"content\\\":\\\"{\\\\\\\"value\\\\\\\": \\\\\\\"{Query10Stats:$.FullyCompliant}\\\\\\\"}\\\",\\\"transformers\\\":null}\",\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 8\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query11Stats\",\n \"type\": 1,\n \"query\": \"resources | where type=='microsoft.network/virtualnetworkgateways' | where properties.gatewayType == 'Vpn' | extend compliant = (tolower(properties.sku.name) contains 'az') | distinct id, compliant| summarize Total = count(), Success = countif(compliant==1), Failed = countif(compliant==0) | extend SuccessPercent = iff(Total==0, 100, 100*toint(Success)/toint(Total)) | extend FullyCompliant = iff(SuccessPercent == 100, 'Yes', 'No') | project Query1Stats=tostring(pack_all())\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\"\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query11FullyCompliant\",\n \"type\": 1,\n \"query\": \"{\\\"version\\\":\\\"1.0.0\\\",\\\"content\\\":\\\"{\\\\\\\"value\\\\\\\": \\\\\\\"{Query11Stats:$.FullyCompliant}\\\\\\\"}\\\",\\\"transformers\\\":null}\",\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 8\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query12Stats\",\n \"type\": 1,\n \"query\": \"resources | where type=='microsoft.network/connections' | where properties.connectionType == 'ExpressRoute' | project cxId=id, gwId=tostring(properties.virtualNetworkGateway1.id), circuitId=tostring(properties.peer.id) | join (resources | where type=='microsoft.network/expressroutecircuits' | project circuitId=tostring(id), circuitLocation=tostring(properties.serviceProviderProperties.peeringLocation)) on circuitId | distinct gwId, circuitLocation | summarize countErLocations=count() by id=gwId | extend compliant = (countErLocations >= 2)| summarize Total = count(), Success = countif(compliant==1), Failed = countif(compliant==0) | extend SuccessPercent = iff(Total==0, 100, 100*toint(Success)/toint(Total)) | extend FullyCompliant = iff(SuccessPercent == 100, 'Yes', 'No') | project Query1Stats=tostring(pack_all())\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\"\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query12FullyCompliant\",\n \"type\": 1,\n \"query\": \"{\\\"version\\\":\\\"1.0.0\\\",\\\"content\\\":\\\"{\\\\\\\"value\\\\\\\": \\\\\\\"{Query12Stats:$.FullyCompliant}\\\\\\\"}\\\",\\\"transformers\\\":null}\",\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 8\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query13Stats\",\n \"type\": 1,\n \"query\": \"resources | where type=='microsoft.network/virtualnetworks' | project id,resourceGroup,name,subnets=properties.subnets | mv-expand subnets | project id,resourceGroup,name,subnetName=tostring(subnets.name),routeTableId=tostring(subnets.properties.routeTable.id) | where subnetName == 'GatewaySubnet' | join kind=leftouter (Resources | where type == 'microsoft.network/routetables' | project routeTableName=name,routeTableId=id, disableBgpRoutePropagation=properties.disableBgpRoutePropagation) on routeTableId | project id,compliant = (disableBgpRoutePropagation == False or isnull(disableBgpRoutePropagation))| summarize Total = count(), Success = countif(compliant==1), Failed = countif(compliant==0) | extend SuccessPercent = iff(Total==0, 100, 100*toint(Success)/toint(Total)) | extend FullyCompliant = iff(SuccessPercent == 100, 'Yes', 'No') | project Query1Stats=tostring(pack_all())\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\"\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query13FullyCompliant\",\n \"type\": 1,\n \"query\": \"{\\\"version\\\":\\\"1.0.0\\\",\\\"content\\\":\\\"{\\\\\\\"value\\\\\\\": \\\\\\\"{Query13Stats:$.FullyCompliant}\\\\\\\"}\\\",\\\"transformers\\\":null}\",\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 8\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Tab3Success\",\n \"type\": 1,\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"criteriaData\": [\n {\n \"criteriaContext\": {\n \"operator\": \"Default\",\n \"resultValType\": \"expression\",\n \"resultVal\": \"{Query7Stats:$.Success}+{Query8Stats:$.Success}+{Query9Stats:$.Success}+{Query10Stats:$.Success}+{Query11Stats:$.Success}+{Query12Stats:$.Success}+{Query13Stats:$.Success}\"\n }\n }\n ]\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Tab3Total\",\n \"type\": 1,\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"criteriaData\": [\n {\n \"criteriaContext\": {\n \"operator\": \"Default\",\n \"resultValType\": \"expression\",\n \"resultVal\": \"{Query7Stats:$.Total}+{Query8Stats:$.Total}+{Query9Stats:$.Total}+{Query10Stats:$.Total}+{Query11Stats:$.Total}+{Query12Stats:$.Total}+{Query13Stats:$.Total}\"\n }\n }\n ]\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Tab3Percent\",\n \"type\": 1,\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"criteriaData\": [\n {\n \"criteriaContext\": {\n \"operator\": \"Default\",\n \"resultValType\": \"expression\",\n \"resultVal\": \"round(100*{Tab3Success}/{Tab3Total})\"\n }\n }\n ]\n }\n ],\n \"style\": \"pills\",\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\"\n },\n \"name\": \"TabInvisibleParameters\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"## Hybrid\"\n },\n \"customWidth\": \"50\",\n \"name\": \"tab3title\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"{\\\"version\\\":\\\"1.0.0\\\",\\\"content\\\":\\\"{\\\\\\\"Column1\\\\\\\": \\\\\\\"{Tab3Percent}\\\\\\\", \\\\\\\"Column2\\\\\\\": \\\\\\\"Percent of successful checks\\\\\\\"}\\\",\\\"transformers\\\":null}\",\n \"size\": 3,\n \"queryType\": 8,\n \"visualization\": \"tiles\",\n \"tileSettings\": {\n \"titleContent\": {\n \"columnMatch\": \"Column1\",\n \"formatter\": 4,\n \"formatOptions\": {\n \"min\": 0,\n \"max\": 100,\n \"palette\": \"redGreen\"\n },\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n \"subtitleContent\": {\n \"columnMatch\": \"Column2\"\n },\n \"showBorder\": true\n }\n },\n \"customWidth\": \"50\",\n \"name\": \"TabPercentTile\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"Select the right SKU for the ExpressRoute/VPN gateways based on bandwidth and performance requirements. Check [this link](https://learn.microsoft.com/azure/expressroute/expressroute-about-virtual-network-gateways?source=recommendations#gwsku) for further information.. [This training](https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/) can help to educate yourself on this.\"\n },\n \"name\": \"querytext7\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"resources| where type == 'microsoft.network/virtualnetworkgateways'| where properties.gatewayType =~ 'vpn' or properties.gatewayType == 'ExpressRoute'| extend SKUName = properties.sku.name, SKUTier = properties.sku.tier, Type = properties.gatewayType| extend compliant = SKUTier !in ('Basic', 'Standard')| project name, id, subscriptionId, resourceGroup, compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed\",\n \"size\": 4,\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"gridSettings\": {\n \"formatters\": [\n {\n \"columnMatch\": \"id\",\n \"formatter\": 0,\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n {\n \"columnMatch\": \"compliant\",\n \"formatter\": 18,\n \"formatOptions\": {\n \"thresholdsOptions\": \"icons\",\n \"thresholdsGrid\": [\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"1\",\n \"representation\": \"success\",\n \"text\": \"Success\"\n },\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"0\",\n \"representation\": \"failed\",\n \"text\": \"Failed\"\n },\n {\n \"operator\": \"Default\",\n \"thresholdValue\": null,\n \"representation\": \"unknown\",\n \"text\": \"Unknown\"\n }\n ]\n }\n }\n ]\n }\n },\n \"name\": \"query7\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"Ensure that you're using unlimited-data ExpressRoute circuits only if you reach the bandwidth that justifies their cost. Check [this link](https://learn.microsoft.com/azure/expressroute/plan-manage-cost) for further information.\"\n },\n \"name\": \"querytext8\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"resources | where type=='microsoft.network/expressroutecircuits' | extend compliant = (tolower(sku.family) == 'metereddata' or tolower(sku.tier) == 'local') | distinct id,compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed\",\n \"size\": 4,\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"gridSettings\": {\n \"formatters\": [\n {\n \"columnMatch\": \"id\",\n \"formatter\": 0,\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n {\n \"columnMatch\": \"compliant\",\n \"formatter\": 18,\n \"formatOptions\": {\n \"thresholdsOptions\": \"icons\",\n \"thresholdsGrid\": [\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"1\",\n \"representation\": \"success\",\n \"text\": \"Success\"\n },\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"0\",\n \"representation\": \"failed\",\n \"text\": \"Failed\"\n },\n {\n \"operator\": \"Default\",\n \"thresholdValue\": null,\n \"representation\": \"unknown\",\n \"text\": \"Unknown\"\n }\n ]\n }\n }\n ]\n }\n },\n \"name\": \"query8\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"Leverage the Local SKU of ExpressRoute to reduce the cost of your circuits, if your circuit peering location supports your Azure regions for the Local SKU. Check [this link](https://learn.microsoft.com/azure/expressroute/expressroute-faqs#expressroute-local) for further information.\"\n },\n \"name\": \"querytext9\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"resources | where type=='microsoft.network/connections' | where properties.connectionType == 'ExpressRoute' | project id, gwid=tostring(properties.virtualNetworkGateway1.id), circuitid=tostring(properties.peer.id) | join (resources | where type=='microsoft.network/expressroutecircuits' | project circuitid=tostring(id), circuitsku=sku.tier) on circuitid | project id=gwid, compliant = (circuitsku == 'Local') | summarize compliant=max(compliant) by id | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed\",\n \"size\": 4,\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"gridSettings\": {\n \"formatters\": [\n {\n \"columnMatch\": \"id\",\n \"formatter\": 0,\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n {\n \"columnMatch\": \"compliant\",\n \"formatter\": 18,\n \"formatOptions\": {\n \"thresholdsOptions\": \"icons\",\n \"thresholdsGrid\": [\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"1\",\n \"representation\": \"success\",\n \"text\": \"Success\"\n },\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"0\",\n \"representation\": \"failed\",\n \"text\": \"Failed\"\n },\n {\n \"operator\": \"Default\",\n \"thresholdValue\": null,\n \"representation\": \"unknown\",\n \"text\": \"Unknown\"\n }\n ]\n }\n }\n ]\n }\n },\n \"name\": \"query9\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"Deploy a zone-redundant ExpressRoute gateway in the supported Azure regions. Check [this link](https://learn.microsoft.com/azure/expressroute/expressroute-about-virtual-network-gateways) for further information.. [This training](https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/) can help to educate yourself on this.\"\n },\n \"name\": \"querytext10\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"resources| where type == 'microsoft.network/virtualnetworkgateways'| where properties.gatewayType =~ 'vpn' or properties.gatewayType == 'ExpressRoute'| extend SKUName = properties.sku.name, SKUTier = properties.sku.tier, Type = properties.gatewayType| extend compliant = SKUTier contains 'AZ'| project name, id, subscriptionId, resourceGroup, Type, compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed\",\n \"size\": 4,\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"gridSettings\": {\n \"formatters\": [\n {\n \"columnMatch\": \"id\",\n \"formatter\": 0,\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n {\n \"columnMatch\": \"compliant\",\n \"formatter\": 18,\n \"formatOptions\": {\n \"thresholdsOptions\": \"icons\",\n \"thresholdsGrid\": [\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"1\",\n \"representation\": \"success\",\n \"text\": \"Success\"\n },\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"0\",\n \"representation\": \"failed\",\n \"text\": \"Failed\"\n },\n {\n \"operator\": \"Default\",\n \"thresholdValue\": null,\n \"representation\": \"unknown\",\n \"text\": \"Unknown\"\n }\n ]\n }\n }\n ]\n }\n },\n \"name\": \"query10\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"Use zone-redundant VPN gateways to connect branches or remote locations to Azure (where available). Check [this link](https://learn.microsoft.com/azure/vpn-gateway/create-zone-redundant-vnet-gateway) for further information.. [This training](https://learn.microsoft.com/training/modules/intro-to-azure-vpn-gateway/) can help to educate yourself on this.\"\n },\n \"name\": \"querytext11\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"resources | where type=='microsoft.network/virtualnetworkgateways' | where properties.gatewayType == 'Vpn' | extend compliant = (tolower(properties.sku.name) contains 'az') | distinct id, compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed\",\n \"size\": 4,\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"gridSettings\": {\n \"formatters\": [\n {\n \"columnMatch\": \"id\",\n \"formatter\": 0,\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n {\n \"columnMatch\": \"compliant\",\n \"formatter\": 18,\n \"formatOptions\": {\n \"thresholdsOptions\": \"icons\",\n \"thresholdsGrid\": [\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"1\",\n \"representation\": \"success\",\n \"text\": \"Success\"\n },\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"0\",\n \"representation\": \"failed\",\n \"text\": \"Failed\"\n },\n {\n \"operator\": \"Default\",\n \"thresholdValue\": null,\n \"representation\": \"unknown\",\n \"text\": \"Unknown\"\n }\n ]\n }\n }\n ]\n }\n },\n \"name\": \"query11\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"Use ExpressRoute circuits from different peering locations for redundancy. Check [this link](https://learn.microsoft.com/azure/expressroute/designing-for-disaster-recovery-with-expressroute-privatepeering#need-for-redundant-connectivity-solution) for further information.. [This training](https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/) can help to educate yourself on this.\"\n },\n \"name\": \"querytext12\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"resources | where type=='microsoft.network/connections' | where properties.connectionType == 'ExpressRoute' | project cxId=id, gwId=tostring(properties.virtualNetworkGateway1.id), circuitId=tostring(properties.peer.id) | join (resources | where type=='microsoft.network/expressroutecircuits' | project circuitId=tostring(id), circuitLocation=tostring(properties.serviceProviderProperties.peeringLocation)) on circuitId | distinct gwId, circuitLocation | summarize countErLocations=count() by id=gwId | extend compliant = (countErLocations >= 2) | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed\",\n \"size\": 4,\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"gridSettings\": {\n \"formatters\": [\n {\n \"columnMatch\": \"id\",\n \"formatter\": 0,\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n {\n \"columnMatch\": \"compliant\",\n \"formatter\": 18,\n \"formatOptions\": {\n \"thresholdsOptions\": \"icons\",\n \"thresholdsGrid\": [\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"1\",\n \"representation\": \"success\",\n \"text\": \"Success\"\n },\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"0\",\n \"representation\": \"failed\",\n \"text\": \"Failed\"\n },\n {\n \"operator\": \"Default\",\n \"thresholdValue\": null,\n \"representation\": \"unknown\",\n \"text\": \"Unknown\"\n }\n ]\n }\n }\n ]\n }\n },\n \"name\": \"query12\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"If you are using a route table in the GatewaySubnet, make sure that gateway routes are propagated. Check [this link](https://learn.microsoft.com/azure/vpn-gateway/vpn-gateway-about-vpn-gateway-settings#gwsub) for further information.\"\n },\n \"name\": \"querytext13\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"resources | where type=='microsoft.network/virtualnetworks' | project id,resourceGroup,name,subnets=properties.subnets | mv-expand subnets | project id,resourceGroup,name,subnetName=tostring(subnets.name),routeTableId=tostring(subnets.properties.routeTable.id) | where subnetName == 'GatewaySubnet' | join kind=leftouter (Resources | where type == 'microsoft.network/routetables' | project routeTableName=name,routeTableId=id, disableBgpRoutePropagation=properties.disableBgpRoutePropagation) on routeTableId | project id,compliant = (disableBgpRoutePropagation == False or isnull(disableBgpRoutePropagation)) | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed\",\n \"size\": 4,\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"gridSettings\": {\n \"formatters\": [\n {\n \"columnMatch\": \"id\",\n \"formatter\": 0,\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n {\n \"columnMatch\": \"compliant\",\n \"formatter\": 18,\n \"formatOptions\": {\n \"thresholdsOptions\": \"icons\",\n \"thresholdsGrid\": [\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"1\",\n \"representation\": \"success\",\n \"text\": \"Success\"\n },\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"0\",\n \"representation\": \"failed\",\n \"text\": \"Failed\"\n },\n {\n \"operator\": \"Default\",\n \"thresholdValue\": null,\n \"representation\": \"unknown\",\n \"text\": \"Unknown\"\n }\n ]\n }\n }\n ]\n }\n },\n \"name\": \"query13\"\n }\n ]\n },\n \"conditionalVisibility\": {\n \"parameterName\": \"VisibleTab\",\n \"comparison\": \"isEqualTo\",\n \"value\": \"tab3\"\n },\n \"name\": \"tab3\"\n },\n {\n \"type\": 12,\n \"content\": {\n \"version\": \"NotebookGroup/1.0\",\n \"groupType\": \"editable\",\n \"items\": [\n {\n \"type\": 9,\n \"content\": {\n \"version\": \"KqlParameterItem/1.0\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"parameters\": [\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query20Stats\",\n \"type\": 1,\n \"query\": \"resources | where type =~ 'microsoft.network/virtualnetworks' | project id,resourceGroup,name,subnets = properties.subnets | mv-expand subnets | project id = subnets.id, resourceGroup, VNet = name, serviceEndpoints = subnets.properties.serviceEndpoints, compliant = (isnull(subnets.properties.serviceEndpoints) or array_length(subnets.properties.serviceEndpoints) == 0) | order by compliant asc| summarize Total = count(), Success = countif(compliant==1), Failed = countif(compliant==0) | extend SuccessPercent = iff(Total==0, 100, 100*toint(Success)/toint(Total)) | extend FullyCompliant = iff(SuccessPercent == 100, 'Yes', 'No') | project Query1Stats=tostring(pack_all())\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\"\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query20FullyCompliant\",\n \"type\": 1,\n \"query\": \"{\\\"version\\\":\\\"1.0.0\\\",\\\"content\\\":\\\"{\\\\\\\"value\\\\\\\": \\\\\\\"{Query20Stats:$.FullyCompliant}\\\\\\\"}\\\",\\\"transformers\\\":null}\",\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 8\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Tab4Success\",\n \"type\": 1,\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"criteriaData\": [\n {\n \"criteriaContext\": {\n \"operator\": \"Default\",\n \"resultValType\": \"expression\",\n \"resultVal\": \"{Query20Stats:$.Success}\"\n }\n }\n ]\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Tab4Total\",\n \"type\": 1,\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"criteriaData\": [\n {\n \"criteriaContext\": {\n \"operator\": \"Default\",\n \"resultValType\": \"expression\",\n \"resultVal\": \"{Query20Stats:$.Total}\"\n }\n }\n ]\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Tab4Percent\",\n \"type\": 1,\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"criteriaData\": [\n {\n \"criteriaContext\": {\n \"operator\": \"Default\",\n \"resultValType\": \"expression\",\n \"resultVal\": \"round(100*{Tab4Success}/{Tab4Total})\"\n }\n }\n ]\n }\n ],\n \"style\": \"pills\",\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\"\n },\n \"name\": \"TabInvisibleParameters\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"## PaaS\"\n },\n \"customWidth\": \"50\",\n \"name\": \"tab4title\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"{\\\"version\\\":\\\"1.0.0\\\",\\\"content\\\":\\\"{\\\\\\\"Column1\\\\\\\": \\\\\\\"{Tab4Percent}\\\\\\\", \\\\\\\"Column2\\\\\\\": \\\\\\\"Percent of successful checks\\\\\\\"}\\\",\\\"transformers\\\":null}\",\n \"size\": 3,\n \"queryType\": 8,\n \"visualization\": \"tiles\",\n \"tileSettings\": {\n \"titleContent\": {\n \"columnMatch\": \"Column1\",\n \"formatter\": 4,\n \"formatOptions\": {\n \"min\": 0,\n \"max\": 100,\n \"palette\": \"redGreen\"\n },\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n \"subtitleContent\": {\n \"columnMatch\": \"Column2\"\n },\n \"showBorder\": true\n }\n },\n \"customWidth\": \"50\",\n \"name\": \"TabPercentTile\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"Don't enable virtual network service endpoints by default on all subnets. Check [this link](https://learn.microsoft.com/azure/virtual-network/virtual-network-service-endpoints-overview) for further information.. [This training](https://learn.microsoft.com/learn/paths/implement-network-security/?source=learn) can help to educate yourself on this.\"\n },\n \"name\": \"querytext20\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"resources | where type =~ 'microsoft.network/virtualnetworks' | project id,resourceGroup,name,subnets = properties.subnets | mv-expand subnets | project id = subnets.id, resourceGroup, VNet = name, serviceEndpoints = subnets.properties.serviceEndpoints, compliant = (isnull(subnets.properties.serviceEndpoints) or array_length(subnets.properties.serviceEndpoints) == 0) | order by compliant asc | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed\",\n \"size\": 4,\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"gridSettings\": {\n \"formatters\": [\n {\n \"columnMatch\": \"id\",\n \"formatter\": 0,\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n {\n \"columnMatch\": \"compliant\",\n \"formatter\": 18,\n \"formatOptions\": {\n \"thresholdsOptions\": \"icons\",\n \"thresholdsGrid\": [\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"1\",\n \"representation\": \"success\",\n \"text\": \"Success\"\n },\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"0\",\n \"representation\": \"failed\",\n \"text\": \"Failed\"\n },\n {\n \"operator\": \"Default\",\n \"thresholdValue\": null,\n \"representation\": \"unknown\",\n \"text\": \"Unknown\"\n }\n ]\n }\n }\n ]\n }\n },\n \"name\": \"query20\"\n }\n ]\n },\n \"conditionalVisibility\": {\n \"parameterName\": \"VisibleTab\",\n \"comparison\": \"isEqualTo\",\n \"value\": \"tab4\"\n },\n \"name\": \"tab4\"\n },\n {\n \"type\": 12,\n \"content\": {\n \"version\": \"NotebookGroup/1.0\",\n \"groupType\": \"editable\",\n \"items\": [\n {\n \"type\": 9,\n \"content\": {\n \"version\": \"KqlParameterItem/1.0\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"parameters\": [\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query19Stats\",\n \"type\": 1,\n \"query\": \"resources | where type=='microsoft.network/virtualnetworks' | project id,subnets=properties.subnets | mv-expand subnets | project id, subnetName = subnets.name, subnetPrefix = subnets.properties.addressPrefix | extend subnetPrefixLength = split(subnetPrefix, '/')[1] | where subnetName == 'AzureFirewallSubnet' | extend compliant = (subnetPrefixLength == 26) | distinct id, compliant| summarize Total = count(), Success = countif(compliant==1), Failed = countif(compliant==0) | extend SuccessPercent = iff(Total==0, 100, 100*toint(Success)/toint(Total)) | extend FullyCompliant = iff(SuccessPercent == 100, 'Yes', 'No') | project Query1Stats=tostring(pack_all())\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\"\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query19FullyCompliant\",\n \"type\": 1,\n \"query\": \"{\\\"version\\\":\\\"1.0.0\\\",\\\"content\\\":\\\"{\\\\\\\"value\\\\\\\": \\\\\\\"{Query19Stats:$.FullyCompliant}\\\\\\\"}\\\",\\\"transformers\\\":null}\",\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 8\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query21Stats\",\n \"type\": 1,\n \"query\": \"resources | where type=='microsoft.network/virtualnetworks' | project id,subnets=properties.subnets | mv-expand subnets | project id, subnetName = subnets.name, subnetPrefix = subnets.properties.addressPrefix | extend subnetPrefixLength = split(subnetPrefix, '/')[1] | where subnetName == 'GatewaySubnet' | extend compliant = (subnetPrefixLength <= 27) | distinct id, compliant| summarize Total = count(), Success = countif(compliant==1), Failed = countif(compliant==0) | extend SuccessPercent = iff(Total==0, 100, 100*toint(Success)/toint(Total)) | extend FullyCompliant = iff(SuccessPercent == 100, 'Yes', 'No') | project Query1Stats=tostring(pack_all())\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\"\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query21FullyCompliant\",\n \"type\": 1,\n \"query\": \"{\\\"version\\\":\\\"1.0.0\\\",\\\"content\\\":\\\"{\\\\\\\"value\\\\\\\": \\\\\\\"{Query21Stats:$.FullyCompliant}\\\\\\\"}\\\",\\\"transformers\\\":null}\",\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 8\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query22Stats\",\n \"type\": 1,\n \"query\": \"resources | where type=='microsoft.network/networksecuritygroups' | mvexpand properties.securityRules | project id,name,ruleAction=properties_securityRules.properties.access,rulePriority=properties_securityRules.properties.priority,ruleDst=properties_securityRules.properties.destinationAddressPrefix,ruleSrc=properties_securityRules.properties.sourceAddressPrefix,ruleProt=properties_securityRules.properties.protocol,ruleDirection=properties_securityRules.properties.direction,rulePort=properties_securityRules.properties.destinationPortRange | summarize StarDenies=countif(ruleAction=='Deny' and ruleDst=='*' and ruleSrc=='*' and ruleProt=='*' and rulePort=='*') by id,tostring(ruleDirection) | where ruleDirection == 'Inbound' | project id,compliant=(StarDenies>0) | union (resources | where type=='microsoft.network/networksecuritygroups' | where array_length(properties.securityRules)==0 | extend compliant=false | project id,compliant)| summarize Total = count(), Success = countif(compliant==1), Failed = countif(compliant==0) | extend SuccessPercent = iff(Total==0, 100, 100*toint(Success)/toint(Total)) | extend FullyCompliant = iff(SuccessPercent == 100, 'Yes', 'No') | project Query1Stats=tostring(pack_all())\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\"\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query22FullyCompliant\",\n \"type\": 1,\n \"query\": \"{\\\"version\\\":\\\"1.0.0\\\",\\\"content\\\":\\\"{\\\\\\\"value\\\\\\\": \\\\\\\"{Query22Stats:$.FullyCompliant}\\\\\\\"}\\\",\\\"transformers\\\":null}\",\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 8\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query23Stats\",\n \"type\": 1,\n \"query\": \"resources | where type == 'microsoft.network/networksecuritygroups' | project id, rules = array_length(properties.securityRules) | project id, compliant = (rules < 900)| summarize Total = count(), Success = countif(compliant==1), Failed = countif(compliant==0) | extend SuccessPercent = iff(Total==0, 100, 100*toint(Success)/toint(Total)) | extend FullyCompliant = iff(SuccessPercent == 100, 'Yes', 'No') | project Query1Stats=tostring(pack_all())\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\"\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query23FullyCompliant\",\n \"type\": 1,\n \"query\": \"{\\\"version\\\":\\\"1.0.0\\\",\\\"content\\\":\\\"{\\\\\\\"value\\\\\\\": \\\\\\\"{Query23Stats:$.FullyCompliant}\\\\\\\"}\\\",\\\"transformers\\\":null}\",\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 8\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Tab5Success\",\n \"type\": 1,\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"criteriaData\": [\n {\n \"criteriaContext\": {\n \"operator\": \"Default\",\n \"resultValType\": \"expression\",\n \"resultVal\": \"{Query19Stats:$.Success}+{Query21Stats:$.Success}+{Query22Stats:$.Success}+{Query23Stats:$.Success}\"\n }\n }\n ]\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Tab5Total\",\n \"type\": 1,\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"criteriaData\": [\n {\n \"criteriaContext\": {\n \"operator\": \"Default\",\n \"resultValType\": \"expression\",\n \"resultVal\": \"{Query19Stats:$.Total}+{Query21Stats:$.Total}+{Query22Stats:$.Total}+{Query23Stats:$.Total}\"\n }\n }\n ]\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Tab5Percent\",\n \"type\": 1,\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"criteriaData\": [\n {\n \"criteriaContext\": {\n \"operator\": \"Default\",\n \"resultValType\": \"expression\",\n \"resultVal\": \"round(100*{Tab5Success}/{Tab5Total})\"\n }\n }\n ]\n }\n ],\n \"style\": \"pills\",\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\"\n },\n \"name\": \"TabInvisibleParameters\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"## Segmentation\"\n },\n \"customWidth\": \"50\",\n \"name\": \"tab5title\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"{\\\"version\\\":\\\"1.0.0\\\",\\\"content\\\":\\\"{\\\\\\\"Column1\\\\\\\": \\\\\\\"{Tab5Percent}\\\\\\\", \\\\\\\"Column2\\\\\\\": \\\\\\\"Percent of successful checks\\\\\\\"}\\\",\\\"transformers\\\":null}\",\n \"size\": 3,\n \"queryType\": 8,\n \"visualization\": \"tiles\",\n \"tileSettings\": {\n \"titleContent\": {\n \"columnMatch\": \"Column1\",\n \"formatter\": 4,\n \"formatOptions\": {\n \"min\": 0,\n \"max\": 100,\n \"palette\": \"redGreen\"\n },\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n \"subtitleContent\": {\n \"columnMatch\": \"Column2\"\n },\n \"showBorder\": true\n }\n },\n \"customWidth\": \"50\",\n \"name\": \"TabPercentTile\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"Use a /26 prefix for your Azure Firewall subnets. Check [this link](https://learn.microsoft.com/azure/firewall/firewall-faq#why-does-azure-firewall-need-a--26-subnet-size) for further information.\"\n },\n \"name\": \"querytext19\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"resources | where type=='microsoft.network/virtualnetworks' | project id,subnets=properties.subnets | mv-expand subnets | project id, subnetName = subnets.name, subnetPrefix = subnets.properties.addressPrefix | extend subnetPrefixLength = split(subnetPrefix, '/')[1] | where subnetName == 'AzureFirewallSubnet' | extend compliant = (subnetPrefixLength == 26) | distinct id, compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed\",\n \"size\": 4,\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"gridSettings\": {\n \"formatters\": [\n {\n \"columnMatch\": \"id\",\n \"formatter\": 0,\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n {\n \"columnMatch\": \"compliant\",\n \"formatter\": 18,\n \"formatOptions\": {\n \"thresholdsOptions\": \"icons\",\n \"thresholdsGrid\": [\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"1\",\n \"representation\": \"success\",\n \"text\": \"Success\"\n },\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"0\",\n \"representation\": \"failed\",\n \"text\": \"Failed\"\n },\n {\n \"operator\": \"Default\",\n \"thresholdValue\": null,\n \"representation\": \"unknown\",\n \"text\": \"Unknown\"\n }\n ]\n }\n }\n ]\n }\n },\n \"name\": \"query19\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"Use at least a /27 prefix for your Gateway subnets. Check [this link](https://learn.microsoft.com/azure/expressroute/expressroute-howto-add-gateway-resource-manager#add-a-gateway) for further information.\"\n },\n \"name\": \"querytext21\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"resources | where type=='microsoft.network/virtualnetworks' | project id,subnets=properties.subnets | mv-expand subnets | project id, subnetName = subnets.name, subnetPrefix = subnets.properties.addressPrefix | extend subnetPrefixLength = split(subnetPrefix, '/')[1] | where subnetName == 'GatewaySubnet' | extend compliant = (subnetPrefixLength <= 27) | distinct id, compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed\",\n \"size\": 4,\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"gridSettings\": {\n \"formatters\": [\n {\n \"columnMatch\": \"id\",\n \"formatter\": 0,\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n {\n \"columnMatch\": \"compliant\",\n \"formatter\": 18,\n \"formatOptions\": {\n \"thresholdsOptions\": \"icons\",\n \"thresholdsGrid\": [\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"1\",\n \"representation\": \"success\",\n \"text\": \"Success\"\n },\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"0\",\n \"representation\": \"failed\",\n \"text\": \"Failed\"\n },\n {\n \"operator\": \"Default\",\n \"thresholdValue\": null,\n \"representation\": \"unknown\",\n \"text\": \"Unknown\"\n }\n ]\n }\n }\n ]\n }\n },\n \"name\": \"query21\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"Don't rely on the NSG inbound default rules using the VirtualNetwork service tag to limit connectivity. Check [this link](https://learn.microsoft.com/azure/virtual-network/service-tags-overview#available-service-tags) for further information.\"\n },\n \"name\": \"querytext22\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"resources | where type=='microsoft.network/networksecuritygroups' | mvexpand properties.securityRules | project id,name,ruleAction=properties_securityRules.properties.access,rulePriority=properties_securityRules.properties.priority,ruleDst=properties_securityRules.properties.destinationAddressPrefix,ruleSrc=properties_securityRules.properties.sourceAddressPrefix,ruleProt=properties_securityRules.properties.protocol,ruleDirection=properties_securityRules.properties.direction,rulePort=properties_securityRules.properties.destinationPortRange | summarize StarDenies=countif(ruleAction=='Deny' and ruleDst=='*' and ruleSrc=='*' and ruleProt=='*' and rulePort=='*') by id,tostring(ruleDirection) | where ruleDirection == 'Inbound' | project id,compliant=(StarDenies>0) | union (resources | where type=='microsoft.network/networksecuritygroups' | where array_length(properties.securityRules)==0 | extend compliant=false | project id,compliant) | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed\",\n \"size\": 4,\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"gridSettings\": {\n \"formatters\": [\n {\n \"columnMatch\": \"id\",\n \"formatter\": 0,\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n {\n \"columnMatch\": \"compliant\",\n \"formatter\": 18,\n \"formatOptions\": {\n \"thresholdsOptions\": \"icons\",\n \"thresholdsGrid\": [\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"1\",\n \"representation\": \"success\",\n \"text\": \"Success\"\n },\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"0\",\n \"representation\": \"failed\",\n \"text\": \"Failed\"\n },\n {\n \"operator\": \"Default\",\n \"thresholdValue\": null,\n \"representation\": \"unknown\",\n \"text\": \"Unknown\"\n }\n ]\n }\n }\n ]\n }\n },\n \"name\": \"query22\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"Do not implement more than 900 NSG rules per NSG, due to the limit of 1000 rules. Check [this link](https://learn.microsoft.com/azure/azure-resource-manager/management/azure-subscription-service-limits) for further information.. [This training](https://learn.microsoft.com/azure/virtual-network/network-security-group-how-it-works) can help to educate yourself on this.\"\n },\n \"name\": \"querytext23\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"resources | where type == 'microsoft.network/networksecuritygroups' | project id, rules = array_length(properties.securityRules) | project id, compliant = (rules < 900) | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed\",\n \"size\": 4,\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"gridSettings\": {\n \"formatters\": [\n {\n \"columnMatch\": \"id\",\n \"formatter\": 0,\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n {\n \"columnMatch\": \"compliant\",\n \"formatter\": 18,\n \"formatOptions\": {\n \"thresholdsOptions\": \"icons\",\n \"thresholdsGrid\": [\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"1\",\n \"representation\": \"success\",\n \"text\": \"Success\"\n },\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"0\",\n \"representation\": \"failed\",\n \"text\": \"Failed\"\n },\n {\n \"operator\": \"Default\",\n \"thresholdValue\": null,\n \"representation\": \"unknown\",\n \"text\": \"Unknown\"\n }\n ]\n }\n }\n ]\n }\n },\n \"name\": \"query23\"\n }\n ]\n },\n \"conditionalVisibility\": {\n \"parameterName\": \"VisibleTab\",\n \"comparison\": \"isEqualTo\",\n \"value\": \"tab5\"\n },\n \"name\": \"tab5\"\n },\n {\n \"type\": 12,\n \"content\": {\n \"version\": \"NotebookGroup/1.0\",\n \"groupType\": \"editable\",\n \"items\": [\n {\n \"type\": 9,\n \"content\": {\n \"version\": \"KqlParameterItem/1.0\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"parameters\": [\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query24Stats\",\n \"type\": 1,\n \"query\": \"resources | where type=='microsoft.network/virtualhubs' | extend compliant = isnotnull(properties.azureFirewall.id) | project id, compliant| summarize Total = count(), Success = countif(compliant==1), Failed = countif(compliant==0) | extend SuccessPercent = iff(Total==0, 100, 100*toint(Success)/toint(Total)) | extend FullyCompliant = iff(SuccessPercent == 100, 'Yes', 'No') | project Query1Stats=tostring(pack_all())\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\"\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query24FullyCompliant\",\n \"type\": 1,\n \"query\": \"{\\\"version\\\":\\\"1.0.0\\\",\\\"content\\\":\\\"{\\\\\\\"value\\\\\\\": \\\\\\\"{Query24Stats:$.FullyCompliant}\\\\\\\"}\\\",\\\"transformers\\\":null}\",\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 8\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Tab6Success\",\n \"type\": 1,\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"criteriaData\": [\n {\n \"criteriaContext\": {\n \"operator\": \"Default\",\n \"resultValType\": \"expression\",\n \"resultVal\": \"{Query24Stats:$.Success}\"\n }\n }\n ]\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Tab6Total\",\n \"type\": 1,\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"criteriaData\": [\n {\n \"criteriaContext\": {\n \"operator\": \"Default\",\n \"resultValType\": \"expression\",\n \"resultVal\": \"{Query24Stats:$.Total}\"\n }\n }\n ]\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Tab6Percent\",\n \"type\": 1,\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"criteriaData\": [\n {\n \"criteriaContext\": {\n \"operator\": \"Default\",\n \"resultValType\": \"expression\",\n \"resultVal\": \"round(100*{Tab6Success}/{Tab6Total})\"\n }\n }\n ]\n }\n ],\n \"style\": \"pills\",\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\"\n },\n \"name\": \"TabInvisibleParameters\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"## Virtual WAN\"\n },\n \"customWidth\": \"50\",\n \"name\": \"tab6title\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"{\\\"version\\\":\\\"1.0.0\\\",\\\"content\\\":\\\"{\\\\\\\"Column1\\\\\\\": \\\\\\\"{Tab6Percent}\\\\\\\", \\\\\\\"Column2\\\\\\\": \\\\\\\"Percent of successful checks\\\\\\\"}\\\",\\\"transformers\\\":null}\",\n \"size\": 3,\n \"queryType\": 8,\n \"visualization\": \"tiles\",\n \"tileSettings\": {\n \"titleContent\": {\n \"columnMatch\": \"Column1\",\n \"formatter\": 4,\n \"formatOptions\": {\n \"min\": 0,\n \"max\": 100,\n \"palette\": \"redGreen\"\n },\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n \"subtitleContent\": {\n \"columnMatch\": \"Column2\"\n },\n \"showBorder\": true\n }\n },\n \"customWidth\": \"50\",\n \"name\": \"TabPercentTile\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"For outbound Internet traffic protection and filtering, deploy Azure Firewall in secured hubs. Check [this link](https://learn.microsoft.com/azure/virtual-wan/howto-firewall) for further information.. [This training](https://learn.microsoft.com/learn/paths/secure-networking-infrastructure/) can help to educate yourself on this.\"\n },\n \"name\": \"querytext24\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"resources | where type=='microsoft.network/virtualhubs' | extend compliant = isnotnull(properties.azureFirewall.id) | project id, compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed\",\n \"size\": 4,\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"gridSettings\": {\n \"formatters\": [\n {\n \"columnMatch\": \"id\",\n \"formatter\": 0,\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n {\n \"columnMatch\": \"compliant\",\n \"formatter\": 18,\n \"formatOptions\": {\n \"thresholdsOptions\": \"icons\",\n \"thresholdsGrid\": [\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"1\",\n \"representation\": \"success\",\n \"text\": \"Success\"\n },\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"0\",\n \"representation\": \"failed\",\n \"text\": \"Failed\"\n },\n {\n \"operator\": \"Default\",\n \"thresholdValue\": null,\n \"representation\": \"unknown\",\n \"text\": \"Unknown\"\n }\n ]\n }\n }\n ]\n }\n },\n \"name\": \"query24\"\n }\n ]\n },\n \"conditionalVisibility\": {\n \"parameterName\": \"VisibleTab\",\n \"comparison\": \"isEqualTo\",\n \"value\": \"tab6\"\n },\n \"name\": \"tab6\"\n },\n {\n \"type\": 12,\n \"content\": {\n \"version\": \"NotebookGroup/1.0\",\n \"groupType\": \"editable\",\n \"items\": [\n {\n \"type\": 9,\n \"content\": {\n \"version\": \"KqlParameterItem/1.0\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"parameters\": [\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query6Stats\",\n \"type\": 1,\n \"query\": \"resources | where type=='microsoft.network/virtualnetworks' | project id,subnets=properties.subnets | mv-expand subnets | project id, subnetName = subnets.name, subnetPrefix = subnets.properties.addressPrefix | extend subnetPrefixLength = split(subnetPrefix, '/')[1] | where subnetName == 'AzureBastionSubnet' | extend compliant = (subnetPrefixLength <= 26) | distinct id, compliant| summarize Total = count(), Success = countif(compliant==1), Failed = countif(compliant==0) | extend SuccessPercent = iff(Total==0, 100, 100*toint(Success)/toint(Total)) | extend FullyCompliant = iff(SuccessPercent == 100, 'Yes', 'No') | project Query1Stats=tostring(pack_all())\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\"\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query6FullyCompliant\",\n \"type\": 1,\n \"query\": \"{\\\"version\\\":\\\"1.0.0\\\",\\\"content\\\":\\\"{\\\\\\\"value\\\\\\\": \\\\\\\"{Query6Stats:$.FullyCompliant}\\\\\\\"}\\\",\\\"transformers\\\":null}\",\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 8\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Tab7Success\",\n \"type\": 1,\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"criteriaData\": [\n {\n \"criteriaContext\": {\n \"operator\": \"Default\",\n \"resultValType\": \"expression\",\n \"resultVal\": \"{Query6Stats:$.Success}\"\n }\n }\n ]\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Tab7Total\",\n \"type\": 1,\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"criteriaData\": [\n {\n \"criteriaContext\": {\n \"operator\": \"Default\",\n \"resultValType\": \"expression\",\n \"resultVal\": \"{Query6Stats:$.Total}\"\n }\n }\n ]\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Tab7Percent\",\n \"type\": 1,\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"criteriaData\": [\n {\n \"criteriaContext\": {\n \"operator\": \"Default\",\n \"resultValType\": \"expression\",\n \"resultVal\": \"round(100*{Tab7Success}/{Tab7Total})\"\n }\n }\n ]\n }\n ],\n \"style\": \"pills\",\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\"\n },\n \"name\": \"TabInvisibleParameters\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"## Internet\"\n },\n \"customWidth\": \"50\",\n \"name\": \"tab7title\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"{\\\"version\\\":\\\"1.0.0\\\",\\\"content\\\":\\\"{\\\\\\\"Column1\\\\\\\": \\\\\\\"{Tab7Percent}\\\\\\\", \\\\\\\"Column2\\\\\\\": \\\\\\\"Percent of successful checks\\\\\\\"}\\\",\\\"transformers\\\":null}\",\n \"size\": 3,\n \"queryType\": 8,\n \"visualization\": \"tiles\",\n \"tileSettings\": {\n \"titleContent\": {\n \"columnMatch\": \"Column1\",\n \"formatter\": 4,\n \"formatOptions\": {\n \"min\": 0,\n \"max\": 100,\n \"palette\": \"redGreen\"\n },\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n \"subtitleContent\": {\n \"columnMatch\": \"Column2\"\n },\n \"showBorder\": true\n }\n },\n \"customWidth\": \"50\",\n \"name\": \"TabPercentTile\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"Use Azure Bastion in a subnet /26 or larger. Check [this link](https://learn.microsoft.com/azure/bastion/bastion-faq#subnet) for further information.\"\n },\n \"name\": \"querytext6\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"resources | where type=='microsoft.network/virtualnetworks' | project id,subnets=properties.subnets | mv-expand subnets | project id, subnetName = subnets.name, subnetPrefix = subnets.properties.addressPrefix | extend subnetPrefixLength = split(subnetPrefix, '/')[1] | where subnetName == 'AzureBastionSubnet' | extend compliant = (subnetPrefixLength <= 26) | distinct id, compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed\",\n \"size\": 4,\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"gridSettings\": {\n \"formatters\": [\n {\n \"columnMatch\": \"id\",\n \"formatter\": 0,\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n {\n \"columnMatch\": \"compliant\",\n \"formatter\": 18,\n \"formatOptions\": {\n \"thresholdsOptions\": \"icons\",\n \"thresholdsGrid\": [\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"1\",\n \"representation\": \"success\",\n \"text\": \"Success\"\n },\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"0\",\n \"representation\": \"failed\",\n \"text\": \"Failed\"\n },\n {\n \"operator\": \"Default\",\n \"thresholdValue\": null,\n \"representation\": \"unknown\",\n \"text\": \"Unknown\"\n }\n ]\n }\n }\n ]\n }\n },\n \"name\": \"query6\"\n }\n ]\n },\n \"conditionalVisibility\": {\n \"parameterName\": \"VisibleTab\",\n \"comparison\": \"isEqualTo\",\n \"value\": \"tab7\"\n },\n \"name\": \"tab7\"\n }\n ],\n \"$schema\": \"https://github.com/Microsoft/Application-Insights-Workbooks/blob/master/schema/workbook.json\"\n}", + "serializedData": "{\n \"version\": \"Notebook/1.0\",\n \"items\": [\n {\n \"type\": 9,\n \"content\": {\n \"version\": \"KqlParameterItem/1.0\",\n \"parameters\": [\n {\n \"id\": \"497a107e-dde8-433e-b263-35ac8e8f7834\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Subscription\",\n \"type\": 6,\n \"multiSelect\": true,\n \"quote\": \"'\",\n \"delimiter\": \",\",\n \"typeSettings\": {\n \"additionalResourceOptions\": [\n \"value::all\"\n ],\n \"includeAll\": true,\n \"showDefault\": false\n },\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"value\": [\n \"value::all\"\n ]\n },\n {\n \"id\": \"844e4f4e-df51-4e3c-8eaf-0dc78b92c721\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"OnlyFailed\",\n \"label\": \"Only show failed\",\n \"type\": 2,\n \"typeSettings\": {\n \"additionalResourceOptions\": [],\n \"showDefault\": false\n },\n \"jsonData\": \"[\\r\\n { \\\"value\\\":true, \\\"label\\\":\\\"True\\\" },\\r\\n { \\\"value\\\":false, \\\"label\\\":\\\"False\\\", \\\"selected\\\":true }\\r\\n]\"\n }\n ],\n \"style\": \"pills\",\n \"queryType\": 0,\n \"resourceType\": \"microsoft.operationalinsights/workspaces\"\n },\n \"name\": \"WorkbookSelectors\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"If you set \\\"Only show failed\\\" to \\\"Yes\\\", the different queries will only show items that have failed their compliance checks.\",\n \"style\": \"info\"\n },\n \"name\": \"InfoBox\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"## Azure Landing Zone Review - Network\\n\\n---\\n\\nThis workbook has been automatically generated out of the checklists in the [Azure Review Checklists repo](https://github.com/Azure/review-checklists). This repo contains best practices and recommendations around generic Landing Zones as well as specific services such as Azure Virtual Desktop, Azure Kubernetes Service or Azure VMware Solution, to name a few. This repository of best practices is curated by Azure engineers, but open to anybody to contribute.\\n\\nIf you see a problem in the queries that are part of this workbook, please open a Github issue [here](https://github.com/Azure/review-checklists/issues/new).\"\n },\n \"customWidth\": \"100\",\n \"name\": \"MarkdownHeader\"\n },\n {\n \"type\": 11,\n \"content\": {\n \"version\": \"LinkItem/1.0\",\n \"style\": \"tabs\",\n \"links\": [\n {\n \"id\": \"7fa4ae01-6e28-4e40-a83d-87622bac7c8c\",\n \"cellValue\": \"VisibleTab\",\n \"linkTarget\": \"parameter\",\n \"linkLabel\": \"Internet\",\n \"subTarget\": \"tab0\",\n \"preText\": \"Internet\",\n \"style\": \"primary\"\n },\n {\n \"id\": \"15c25825-0033-4fe9-8636-696d760e2789\",\n \"cellValue\": \"VisibleTab\",\n \"linkTarget\": \"parameter\",\n \"linkLabel\": \"Hybrid\",\n \"subTarget\": \"tab1\",\n \"preText\": \"Hybrid\",\n \"style\": \"primary\"\n },\n {\n \"id\": \"08fa3598-b03d-41b0-971d-befb063f6191\",\n \"cellValue\": \"VisibleTab\",\n \"linkTarget\": \"parameter\",\n \"linkLabel\": \"Hub and spoke\",\n \"subTarget\": \"tab2\",\n \"preText\": \"Hub and spoke\",\n \"style\": \"primary\"\n },\n {\n \"id\": \"25d23d11-3b3c-4d71-b331-91869ac7c509\",\n \"cellValue\": \"VisibleTab\",\n \"linkTarget\": \"parameter\",\n \"linkLabel\": \"Firewall\",\n \"subTarget\": \"tab3\",\n \"preText\": \"Firewall\",\n \"style\": \"primary\"\n },\n {\n \"id\": \"e3f6794c-465e-4266-beb6-64187fc630c9\",\n \"cellValue\": \"VisibleTab\",\n \"linkTarget\": \"parameter\",\n \"linkLabel\": \"PaaS\",\n \"subTarget\": \"tab4\",\n \"preText\": \"PaaS\",\n \"style\": \"primary\"\n },\n {\n \"id\": \"52a3f5cc-2a29-4686-9b7f-6a391edf22d3\",\n \"cellValue\": \"VisibleTab\",\n \"linkTarget\": \"parameter\",\n \"linkLabel\": \"Virtual WAN\",\n \"subTarget\": \"tab5\",\n \"preText\": \"Virtual WAN\",\n \"style\": \"primary\"\n },\n {\n \"id\": \"623cbeea-0055-429a-8db4-58a5fff1cf20\",\n \"cellValue\": \"VisibleTab\",\n \"linkTarget\": \"parameter\",\n \"linkLabel\": \"Segmentation\",\n \"subTarget\": \"tab6\",\n \"preText\": \"Segmentation\",\n \"style\": \"primary\"\n },\n {\n \"id\": \"60eec08a-97d0-4bf8-a558-c31af15406f5\",\n \"cellValue\": \"VisibleTab\",\n \"linkTarget\": \"parameter\",\n \"linkLabel\": \"IP plan\",\n \"subTarget\": \"tab7\",\n \"preText\": \"IP plan\",\n \"style\": \"primary\"\n }\n ]\n },\n \"name\": \"Tabs\"\n },\n {\n \"type\": 12,\n \"content\": {\n \"version\": \"NotebookGroup/1.0\",\n \"groupType\": \"editable\",\n \"items\": [\n {\n \"type\": 9,\n \"content\": {\n \"version\": \"KqlParameterItem/1.0\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"parameters\": [\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query6Stats\",\n \"type\": 1,\n \"query\": \"resources | where type=='microsoft.network/virtualnetworks' | project id,subnets=properties.subnets | mv-expand subnets | project id, subnetName = subnets.name, subnetPrefix = subnets.properties.addressPrefix | extend subnetPrefixLength = split(subnetPrefix, '/')[1] | where subnetName == 'AzureBastionSubnet' | extend compliant = (subnetPrefixLength <= 26) | distinct id, compliant| summarize Total = count(), Success = countif(compliant==1), Failed = countif(compliant==0) | extend SuccessPercent = iff(Total==0, 100, 100*toint(Success)/toint(Total)) | extend FullyCompliant = iff(SuccessPercent == 100, 'Yes', 'No') | project Query1Stats=tostring(pack_all())\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\"\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query6FullyCompliant\",\n \"type\": 1,\n \"query\": \"{\\\"version\\\":\\\"1.0.0\\\",\\\"content\\\":\\\"{\\\\\\\"value\\\\\\\": \\\\\\\"{Query6Stats:$.FullyCompliant}\\\\\\\"}\\\",\\\"transformers\\\":null}\",\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 8\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Tab0Success\",\n \"type\": 1,\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"criteriaData\": [\n {\n \"criteriaContext\": {\n \"operator\": \"Default\",\n \"resultValType\": \"expression\",\n \"resultVal\": \"{Query6Stats:$.Success}\"\n }\n }\n ]\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Tab0Total\",\n \"type\": 1,\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"criteriaData\": [\n {\n \"criteriaContext\": {\n \"operator\": \"Default\",\n \"resultValType\": \"expression\",\n \"resultVal\": \"{Query6Stats:$.Total}\"\n }\n }\n ]\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Tab0Percent\",\n \"type\": 1,\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"criteriaData\": [\n {\n \"criteriaContext\": {\n \"operator\": \"Default\",\n \"resultValType\": \"expression\",\n \"resultVal\": \"round(100*{Tab0Success}/{Tab0Total})\"\n }\n }\n ]\n }\n ],\n \"style\": \"pills\",\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\"\n },\n \"name\": \"TabInvisibleParameters\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"## Internet\"\n },\n \"customWidth\": \"50\",\n \"name\": \"tab0title\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"{\\\"version\\\":\\\"1.0.0\\\",\\\"content\\\":\\\"{\\\\\\\"Column1\\\\\\\": \\\\\\\"{Tab0Percent}\\\\\\\", \\\\\\\"Column2\\\\\\\": \\\\\\\"Percent of successful checks\\\\\\\"}\\\",\\\"transformers\\\":null}\",\n \"size\": 3,\n \"queryType\": 8,\n \"visualization\": \"tiles\",\n \"tileSettings\": {\n \"titleContent\": {\n \"columnMatch\": \"Column1\",\n \"formatter\": 4,\n \"formatOptions\": {\n \"min\": 0,\n \"max\": 100,\n \"palette\": \"redGreen\"\n },\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n \"subtitleContent\": {\n \"columnMatch\": \"Column2\"\n },\n \"showBorder\": true\n }\n },\n \"customWidth\": \"50\",\n \"name\": \"TabPercentTile\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"Use Azure Bastion in a subnet /26 or larger. Check [this link](https://learn.microsoft.com/azure/bastion/bastion-faq#subnet) for further information.. [This training](https://learn.microsoft.com/training/modules/intro-to-azure-bastion/) can help to educate yourself on this.\"\n },\n \"name\": \"querytext6\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"resources | where type=='microsoft.network/virtualnetworks' | project id,subnets=properties.subnets | mv-expand subnets | project id, subnetName = subnets.name, subnetPrefix = subnets.properties.addressPrefix | extend subnetPrefixLength = split(subnetPrefix, '/')[1] | where subnetName == 'AzureBastionSubnet' | extend compliant = (subnetPrefixLength <= 26) | distinct id, compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed\",\n \"size\": 4,\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"gridSettings\": {\n \"formatters\": [\n {\n \"columnMatch\": \"id\",\n \"formatter\": 0,\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n {\n \"columnMatch\": \"compliant\",\n \"formatter\": 18,\n \"formatOptions\": {\n \"thresholdsOptions\": \"icons\",\n \"thresholdsGrid\": [\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"1\",\n \"representation\": \"success\",\n \"text\": \"Success\"\n },\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"0\",\n \"representation\": \"failed\",\n \"text\": \"Failed\"\n },\n {\n \"operator\": \"Default\",\n \"thresholdValue\": null,\n \"representation\": \"unknown\",\n \"text\": \"Unknown\"\n }\n ]\n }\n }\n ]\n }\n },\n \"name\": \"query6\"\n }\n ]\n },\n \"conditionalVisibility\": {\n \"parameterName\": \"VisibleTab\",\n \"comparison\": \"isEqualTo\",\n \"value\": \"tab0\"\n },\n \"name\": \"tab0\"\n },\n {\n \"type\": 12,\n \"content\": {\n \"version\": \"NotebookGroup/1.0\",\n \"groupType\": \"editable\",\n \"items\": [\n {\n \"type\": 9,\n \"content\": {\n \"version\": \"KqlParameterItem/1.0\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"parameters\": [\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query7Stats\",\n \"type\": 1,\n \"query\": \"resources| where type == 'microsoft.network/virtualnetworkgateways'| where properties.gatewayType =~ 'vpn' or properties.gatewayType == 'ExpressRoute'| extend SKUName = properties.sku.name, SKUTier = properties.sku.tier, Type = properties.gatewayType| extend compliant = SKUTier !in ('Basic', 'Standard')| project name, id, subscriptionId, resourceGroup, compliant| summarize Total = count(), Success = countif(compliant==1), Failed = countif(compliant==0) | extend SuccessPercent = iff(Total==0, 100, 100*toint(Success)/toint(Total)) | extend FullyCompliant = iff(SuccessPercent == 100, 'Yes', 'No') | project Query1Stats=tostring(pack_all())\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\"\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query7FullyCompliant\",\n \"type\": 1,\n \"query\": \"{\\\"version\\\":\\\"1.0.0\\\",\\\"content\\\":\\\"{\\\\\\\"value\\\\\\\": \\\\\\\"{Query7Stats:$.FullyCompliant}\\\\\\\"}\\\",\\\"transformers\\\":null}\",\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 8\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query8Stats\",\n \"type\": 1,\n \"query\": \"resources | where type=='microsoft.network/expressroutecircuits' | extend compliant = (tolower(sku.family) == 'metereddata' or tolower(sku.tier) == 'local') | distinct id,compliant| summarize Total = count(), Success = countif(compliant==1), Failed = countif(compliant==0) | extend SuccessPercent = iff(Total==0, 100, 100*toint(Success)/toint(Total)) | extend FullyCompliant = iff(SuccessPercent == 100, 'Yes', 'No') | project Query1Stats=tostring(pack_all())\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\"\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query8FullyCompliant\",\n \"type\": 1,\n \"query\": \"{\\\"version\\\":\\\"1.0.0\\\",\\\"content\\\":\\\"{\\\\\\\"value\\\\\\\": \\\\\\\"{Query8Stats:$.FullyCompliant}\\\\\\\"}\\\",\\\"transformers\\\":null}\",\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 8\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query9Stats\",\n \"type\": 1,\n \"query\": \"resources | where type=='microsoft.network/connections' | where properties.connectionType == 'ExpressRoute' | project id, gwid=tostring(properties.virtualNetworkGateway1.id), circuitid=tostring(properties.peer.id) | join (resources | where type=='microsoft.network/expressroutecircuits' | project circuitid=tostring(id), circuitsku=sku.tier) on circuitid | project id=gwid, compliant = (circuitsku == 'Local') | summarize compliant=max(compliant) by id| summarize Total = count(), Success = countif(compliant==1), Failed = countif(compliant==0) | extend SuccessPercent = iff(Total==0, 100, 100*toint(Success)/toint(Total)) | extend FullyCompliant = iff(SuccessPercent == 100, 'Yes', 'No') | project Query1Stats=tostring(pack_all())\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\"\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query9FullyCompliant\",\n \"type\": 1,\n \"query\": \"{\\\"version\\\":\\\"1.0.0\\\",\\\"content\\\":\\\"{\\\\\\\"value\\\\\\\": \\\\\\\"{Query9Stats:$.FullyCompliant}\\\\\\\"}\\\",\\\"transformers\\\":null}\",\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 8\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query10Stats\",\n \"type\": 1,\n \"query\": \"resources| where type == 'microsoft.network/virtualnetworkgateways'| where properties.gatewayType =~ 'vpn' or properties.gatewayType == 'ExpressRoute'| extend SKUName = properties.sku.name, SKUTier = properties.sku.tier, Type = properties.gatewayType| extend compliant = SKUTier contains 'AZ'| project name, id, subscriptionId, resourceGroup, Type, compliant| summarize Total = count(), Success = countif(compliant==1), Failed = countif(compliant==0) | extend SuccessPercent = iff(Total==0, 100, 100*toint(Success)/toint(Total)) | extend FullyCompliant = iff(SuccessPercent == 100, 'Yes', 'No') | project Query1Stats=tostring(pack_all())\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\"\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query10FullyCompliant\",\n \"type\": 1,\n \"query\": \"{\\\"version\\\":\\\"1.0.0\\\",\\\"content\\\":\\\"{\\\\\\\"value\\\\\\\": \\\\\\\"{Query10Stats:$.FullyCompliant}\\\\\\\"}\\\",\\\"transformers\\\":null}\",\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 8\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query11Stats\",\n \"type\": 1,\n \"query\": \"resources | where type=='microsoft.network/virtualnetworkgateways' | where properties.gatewayType == 'Vpn' | extend compliant = (tolower(properties.sku.name) contains 'az') | distinct id, compliant| summarize Total = count(), Success = countif(compliant==1), Failed = countif(compliant==0) | extend SuccessPercent = iff(Total==0, 100, 100*toint(Success)/toint(Total)) | extend FullyCompliant = iff(SuccessPercent == 100, 'Yes', 'No') | project Query1Stats=tostring(pack_all())\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\"\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query11FullyCompliant\",\n \"type\": 1,\n \"query\": \"{\\\"version\\\":\\\"1.0.0\\\",\\\"content\\\":\\\"{\\\\\\\"value\\\\\\\": \\\\\\\"{Query11Stats:$.FullyCompliant}\\\\\\\"}\\\",\\\"transformers\\\":null}\",\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 8\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query12Stats\",\n \"type\": 1,\n \"query\": \"resources | where type=='microsoft.network/connections' | where properties.connectionType == 'ExpressRoute' | project cxId=id, gwId=tostring(properties.virtualNetworkGateway1.id), circuitId=tostring(properties.peer.id) | join (resources | where type=='microsoft.network/expressroutecircuits' | project circuitId=tostring(id), circuitLocation=tostring(properties.serviceProviderProperties.peeringLocation)) on circuitId | distinct gwId, circuitLocation | summarize countErLocations=count() by id=gwId | extend compliant = (countErLocations >= 2)| summarize Total = count(), Success = countif(compliant==1), Failed = countif(compliant==0) | extend SuccessPercent = iff(Total==0, 100, 100*toint(Success)/toint(Total)) | extend FullyCompliant = iff(SuccessPercent == 100, 'Yes', 'No') | project Query1Stats=tostring(pack_all())\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\"\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query12FullyCompliant\",\n \"type\": 1,\n \"query\": \"{\\\"version\\\":\\\"1.0.0\\\",\\\"content\\\":\\\"{\\\\\\\"value\\\\\\\": \\\\\\\"{Query12Stats:$.FullyCompliant}\\\\\\\"}\\\",\\\"transformers\\\":null}\",\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 8\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query13Stats\",\n \"type\": 1,\n \"query\": \"resources | where type=='microsoft.network/virtualnetworks' | project id,resourceGroup,name,subnets=properties.subnets | mv-expand subnets | project id,resourceGroup,name,subnetName=tostring(subnets.name),routeTableId=tostring(subnets.properties.routeTable.id) | where subnetName == 'GatewaySubnet' | join kind=leftouter (Resources | where type == 'microsoft.network/routetables' | project routeTableName=name,routeTableId=id, disableBgpRoutePropagation=properties.disableBgpRoutePropagation) on routeTableId | project id,compliant = (disableBgpRoutePropagation == False or isnull(disableBgpRoutePropagation))| summarize Total = count(), Success = countif(compliant==1), Failed = countif(compliant==0) | extend SuccessPercent = iff(Total==0, 100, 100*toint(Success)/toint(Total)) | extend FullyCompliant = iff(SuccessPercent == 100, 'Yes', 'No') | project Query1Stats=tostring(pack_all())\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\"\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query13FullyCompliant\",\n \"type\": 1,\n \"query\": \"{\\\"version\\\":\\\"1.0.0\\\",\\\"content\\\":\\\"{\\\\\\\"value\\\\\\\": \\\\\\\"{Query13Stats:$.FullyCompliant}\\\\\\\"}\\\",\\\"transformers\\\":null}\",\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 8\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Tab1Success\",\n \"type\": 1,\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"criteriaData\": [\n {\n \"criteriaContext\": {\n \"operator\": \"Default\",\n \"resultValType\": \"expression\",\n \"resultVal\": \"{Query7Stats:$.Success}+{Query8Stats:$.Success}+{Query9Stats:$.Success}+{Query10Stats:$.Success}+{Query11Stats:$.Success}+{Query12Stats:$.Success}+{Query13Stats:$.Success}\"\n }\n }\n ]\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Tab1Total\",\n \"type\": 1,\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"criteriaData\": [\n {\n \"criteriaContext\": {\n \"operator\": \"Default\",\n \"resultValType\": \"expression\",\n \"resultVal\": \"{Query7Stats:$.Total}+{Query8Stats:$.Total}+{Query9Stats:$.Total}+{Query10Stats:$.Total}+{Query11Stats:$.Total}+{Query12Stats:$.Total}+{Query13Stats:$.Total}\"\n }\n }\n ]\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Tab1Percent\",\n \"type\": 1,\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"criteriaData\": [\n {\n \"criteriaContext\": {\n \"operator\": \"Default\",\n \"resultValType\": \"expression\",\n \"resultVal\": \"round(100*{Tab1Success}/{Tab1Total})\"\n }\n }\n ]\n }\n ],\n \"style\": \"pills\",\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\"\n },\n \"name\": \"TabInvisibleParameters\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"## Hybrid\"\n },\n \"customWidth\": \"50\",\n \"name\": \"tab1title\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"{\\\"version\\\":\\\"1.0.0\\\",\\\"content\\\":\\\"{\\\\\\\"Column1\\\\\\\": \\\\\\\"{Tab1Percent}\\\\\\\", \\\\\\\"Column2\\\\\\\": \\\\\\\"Percent of successful checks\\\\\\\"}\\\",\\\"transformers\\\":null}\",\n \"size\": 3,\n \"queryType\": 8,\n \"visualization\": \"tiles\",\n \"tileSettings\": {\n \"titleContent\": {\n \"columnMatch\": \"Column1\",\n \"formatter\": 4,\n \"formatOptions\": {\n \"min\": 0,\n \"max\": 100,\n \"palette\": \"redGreen\"\n },\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n \"subtitleContent\": {\n \"columnMatch\": \"Column2\"\n },\n \"showBorder\": true\n }\n },\n \"customWidth\": \"50\",\n \"name\": \"TabPercentTile\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"Select the right SKU for the ExpressRoute/VPN gateways based on bandwidth and performance requirements. Check [this link](https://learn.microsoft.com/azure/expressroute/expressroute-about-virtual-network-gateways?source=recommendations#gwsku) for further information.. [This training](https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/) can help to educate yourself on this.\"\n },\n \"name\": \"querytext7\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"resources| where type == 'microsoft.network/virtualnetworkgateways'| where properties.gatewayType =~ 'vpn' or properties.gatewayType == 'ExpressRoute'| extend SKUName = properties.sku.name, SKUTier = properties.sku.tier, Type = properties.gatewayType| extend compliant = SKUTier !in ('Basic', 'Standard')| project name, id, subscriptionId, resourceGroup, compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed\",\n \"size\": 4,\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"gridSettings\": {\n \"formatters\": [\n {\n \"columnMatch\": \"id\",\n \"formatter\": 0,\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n {\n \"columnMatch\": \"compliant\",\n \"formatter\": 18,\n \"formatOptions\": {\n \"thresholdsOptions\": \"icons\",\n \"thresholdsGrid\": [\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"1\",\n \"representation\": \"success\",\n \"text\": \"Success\"\n },\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"0\",\n \"representation\": \"failed\",\n \"text\": \"Failed\"\n },\n {\n \"operator\": \"Default\",\n \"thresholdValue\": null,\n \"representation\": \"unknown\",\n \"text\": \"Unknown\"\n }\n ]\n }\n }\n ]\n }\n },\n \"name\": \"query7\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"Ensure that you're using unlimited-data ExpressRoute circuits only if you reach the bandwidth that justifies their cost. Check [this link](https://learn.microsoft.com/azure/expressroute/plan-manage-cost) for further information.. [This training](https://learn.microsoft.com/training/modules/design-implement-azure-expressroute/) can help to educate yourself on this.\"\n },\n \"name\": \"querytext8\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"resources | where type=='microsoft.network/expressroutecircuits' | extend compliant = (tolower(sku.family) == 'metereddata' or tolower(sku.tier) == 'local') | distinct id,compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed\",\n \"size\": 4,\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"gridSettings\": {\n \"formatters\": [\n {\n \"columnMatch\": \"id\",\n \"formatter\": 0,\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n {\n \"columnMatch\": \"compliant\",\n \"formatter\": 18,\n \"formatOptions\": {\n \"thresholdsOptions\": \"icons\",\n \"thresholdsGrid\": [\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"1\",\n \"representation\": \"success\",\n \"text\": \"Success\"\n },\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"0\",\n \"representation\": \"failed\",\n \"text\": \"Failed\"\n },\n {\n \"operator\": \"Default\",\n \"thresholdValue\": null,\n \"representation\": \"unknown\",\n \"text\": \"Unknown\"\n }\n ]\n }\n }\n ]\n }\n },\n \"name\": \"query8\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"Leverage the Local SKU of ExpressRoute to reduce the cost of your circuits, if your circuit peering location supports your Azure regions for the Local SKU. Check [this link](https://learn.microsoft.com/azure/expressroute/expressroute-faqs#expressroute-local) for further information.. [This training](https://learn.microsoft.com/training/modules/design-implement-azure-expressroute/) can help to educate yourself on this.\"\n },\n \"name\": \"querytext9\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"resources | where type=='microsoft.network/connections' | where properties.connectionType == 'ExpressRoute' | project id, gwid=tostring(properties.virtualNetworkGateway1.id), circuitid=tostring(properties.peer.id) | join (resources | where type=='microsoft.network/expressroutecircuits' | project circuitid=tostring(id), circuitsku=sku.tier) on circuitid | project id=gwid, compliant = (circuitsku == 'Local') | summarize compliant=max(compliant) by id | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed\",\n \"size\": 4,\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"gridSettings\": {\n \"formatters\": [\n {\n \"columnMatch\": \"id\",\n \"formatter\": 0,\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n {\n \"columnMatch\": \"compliant\",\n \"formatter\": 18,\n \"formatOptions\": {\n \"thresholdsOptions\": \"icons\",\n \"thresholdsGrid\": [\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"1\",\n \"representation\": \"success\",\n \"text\": \"Success\"\n },\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"0\",\n \"representation\": \"failed\",\n \"text\": \"Failed\"\n },\n {\n \"operator\": \"Default\",\n \"thresholdValue\": null,\n \"representation\": \"unknown\",\n \"text\": \"Unknown\"\n }\n ]\n }\n }\n ]\n }\n },\n \"name\": \"query9\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"Deploy a zone-redundant ExpressRoute gateway in the supported Azure regions. Check [this link](https://learn.microsoft.com/azure/expressroute/expressroute-about-virtual-network-gateways) for further information.. [This training](https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/) can help to educate yourself on this.\"\n },\n \"name\": \"querytext10\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"resources| where type == 'microsoft.network/virtualnetworkgateways'| where properties.gatewayType =~ 'vpn' or properties.gatewayType == 'ExpressRoute'| extend SKUName = properties.sku.name, SKUTier = properties.sku.tier, Type = properties.gatewayType| extend compliant = SKUTier contains 'AZ'| project name, id, subscriptionId, resourceGroup, Type, compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed\",\n \"size\": 4,\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"gridSettings\": {\n \"formatters\": [\n {\n \"columnMatch\": \"id\",\n \"formatter\": 0,\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n {\n \"columnMatch\": \"compliant\",\n \"formatter\": 18,\n \"formatOptions\": {\n \"thresholdsOptions\": \"icons\",\n \"thresholdsGrid\": [\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"1\",\n \"representation\": \"success\",\n \"text\": \"Success\"\n },\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"0\",\n \"representation\": \"failed\",\n \"text\": \"Failed\"\n },\n {\n \"operator\": \"Default\",\n \"thresholdValue\": null,\n \"representation\": \"unknown\",\n \"text\": \"Unknown\"\n }\n ]\n }\n }\n ]\n }\n },\n \"name\": \"query10\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"Use zone-redundant VPN gateways to connect branches or remote locations to Azure (where available). Check [this link](https://learn.microsoft.com/azure/vpn-gateway/create-zone-redundant-vnet-gateway) for further information.. [This training](https://learn.microsoft.com/training/modules/intro-to-azure-vpn-gateway/) can help to educate yourself on this.\"\n },\n \"name\": \"querytext11\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"resources | where type=='microsoft.network/virtualnetworkgateways' | where properties.gatewayType == 'Vpn' | extend compliant = (tolower(properties.sku.name) contains 'az') | distinct id, compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed\",\n \"size\": 4,\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"gridSettings\": {\n \"formatters\": [\n {\n \"columnMatch\": \"id\",\n \"formatter\": 0,\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n {\n \"columnMatch\": \"compliant\",\n \"formatter\": 18,\n \"formatOptions\": {\n \"thresholdsOptions\": \"icons\",\n \"thresholdsGrid\": [\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"1\",\n \"representation\": \"success\",\n \"text\": \"Success\"\n },\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"0\",\n \"representation\": \"failed\",\n \"text\": \"Failed\"\n },\n {\n \"operator\": \"Default\",\n \"thresholdValue\": null,\n \"representation\": \"unknown\",\n \"text\": \"Unknown\"\n }\n ]\n }\n }\n ]\n }\n },\n \"name\": \"query11\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"Use ExpressRoute circuits from different peering locations for redundancy. Check [this link](https://learn.microsoft.com/azure/expressroute/designing-for-disaster-recovery-with-expressroute-privatepeering#need-for-redundant-connectivity-solution) for further information.. [This training](https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/) can help to educate yourself on this.\"\n },\n \"name\": \"querytext12\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"resources | where type=='microsoft.network/connections' | where properties.connectionType == 'ExpressRoute' | project cxId=id, gwId=tostring(properties.virtualNetworkGateway1.id), circuitId=tostring(properties.peer.id) | join (resources | where type=='microsoft.network/expressroutecircuits' | project circuitId=tostring(id), circuitLocation=tostring(properties.serviceProviderProperties.peeringLocation)) on circuitId | distinct gwId, circuitLocation | summarize countErLocations=count() by id=gwId | extend compliant = (countErLocations >= 2) | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed\",\n \"size\": 4,\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"gridSettings\": {\n \"formatters\": [\n {\n \"columnMatch\": \"id\",\n \"formatter\": 0,\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n {\n \"columnMatch\": \"compliant\",\n \"formatter\": 18,\n \"formatOptions\": {\n \"thresholdsOptions\": \"icons\",\n \"thresholdsGrid\": [\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"1\",\n \"representation\": \"success\",\n \"text\": \"Success\"\n },\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"0\",\n \"representation\": \"failed\",\n \"text\": \"Failed\"\n },\n {\n \"operator\": \"Default\",\n \"thresholdValue\": null,\n \"representation\": \"unknown\",\n \"text\": \"Unknown\"\n }\n ]\n }\n }\n ]\n }\n },\n \"name\": \"query12\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"If you are using a route table in the GatewaySubnet, make sure that gateway routes are propagated. Check [this link](https://learn.microsoft.com/azure/vpn-gateway/vpn-gateway-about-vpn-gateway-settings#gwsub) for further information.\"\n },\n \"name\": \"querytext13\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"resources | where type=='microsoft.network/virtualnetworks' | project id,resourceGroup,name,subnets=properties.subnets | mv-expand subnets | project id,resourceGroup,name,subnetName=tostring(subnets.name),routeTableId=tostring(subnets.properties.routeTable.id) | where subnetName == 'GatewaySubnet' | join kind=leftouter (Resources | where type == 'microsoft.network/routetables' | project routeTableName=name,routeTableId=id, disableBgpRoutePropagation=properties.disableBgpRoutePropagation) on routeTableId | project id,compliant = (disableBgpRoutePropagation == False or isnull(disableBgpRoutePropagation)) | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed\",\n \"size\": 4,\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"gridSettings\": {\n \"formatters\": [\n {\n \"columnMatch\": \"id\",\n \"formatter\": 0,\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n {\n \"columnMatch\": \"compliant\",\n \"formatter\": 18,\n \"formatOptions\": {\n \"thresholdsOptions\": \"icons\",\n \"thresholdsGrid\": [\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"1\",\n \"representation\": \"success\",\n \"text\": \"Success\"\n },\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"0\",\n \"representation\": \"failed\",\n \"text\": \"Failed\"\n },\n {\n \"operator\": \"Default\",\n \"thresholdValue\": null,\n \"representation\": \"unknown\",\n \"text\": \"Unknown\"\n }\n ]\n }\n }\n ]\n }\n },\n \"name\": \"query13\"\n }\n ]\n },\n \"conditionalVisibility\": {\n \"parameterName\": \"VisibleTab\",\n \"comparison\": \"isEqualTo\",\n \"value\": \"tab1\"\n },\n \"name\": \"tab1\"\n },\n {\n \"type\": 12,\n \"content\": {\n \"version\": \"NotebookGroup/1.0\",\n \"groupType\": \"editable\",\n \"items\": [\n {\n \"type\": 9,\n \"content\": {\n \"version\": \"KqlParameterItem/1.0\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"parameters\": [\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query0Stats\",\n \"type\": 1,\n \"query\": \"resources | where type=='microsoft.network/virtualnetworks' | project id,subnets=properties.subnets | mv-expand subnets | project id, subnetName = subnets.name, subnetPrefix = subnets.properties.addressPrefix | extend subnetPrefixLength = split(subnetPrefix, '/')[1] | where subnetName == 'RouteServerSubnet' | extend compliant = (subnetPrefixLength <= 27) | distinct id, compliant| summarize Total = count(), Success = countif(compliant==1), Failed = countif(compliant==0) | extend SuccessPercent = iff(Total==0, 100, 100*toint(Success)/toint(Total)) | extend FullyCompliant = iff(SuccessPercent == 100, 'Yes', 'No') | project Query1Stats=tostring(pack_all())\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\"\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query0FullyCompliant\",\n \"type\": 1,\n \"query\": \"{\\\"version\\\":\\\"1.0.0\\\",\\\"content\\\":\\\"{\\\\\\\"value\\\\\\\": \\\\\\\"{Query0Stats:$.FullyCompliant}\\\\\\\"}\\\",\\\"transformers\\\":null}\",\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 8\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query1Stats\",\n \"type\": 1,\n \"query\": \"resources | where type == 'microsoft.network/virtualnetworks' | mvexpand properties.virtualNetworkPeerings | summarize peeringcount = count() by id | extend compliant = (peeringcount < 450) | distinct id,compliant| summarize Total = count(), Success = countif(compliant==1), Failed = countif(compliant==0) | extend SuccessPercent = iff(Total==0, 100, 100*toint(Success)/toint(Total)) | extend FullyCompliant = iff(SuccessPercent == 100, 'Yes', 'No') | project Query1Stats=tostring(pack_all())\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\"\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query1FullyCompliant\",\n \"type\": 1,\n \"query\": \"{\\\"version\\\":\\\"1.0.0\\\",\\\"content\\\":\\\"{\\\\\\\"value\\\\\\\": \\\\\\\"{Query1Stats:$.FullyCompliant}\\\\\\\"}\\\",\\\"transformers\\\":null}\",\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 8\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query2Stats\",\n \"type\": 1,\n \"query\": \"resources | where type=='microsoft.network/routetables' | mvexpand properties.routes | summarize routeCount = count() by id | extend compliant = (routeCount < 360) | distinct id,compliant| summarize Total = count(), Success = countif(compliant==1), Failed = countif(compliant==0) | extend SuccessPercent = iff(Total==0, 100, 100*toint(Success)/toint(Total)) | extend FullyCompliant = iff(SuccessPercent == 100, 'Yes', 'No') | project Query1Stats=tostring(pack_all())\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\"\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query2FullyCompliant\",\n \"type\": 1,\n \"query\": \"{\\\"version\\\":\\\"1.0.0\\\",\\\"content\\\":\\\"{\\\\\\\"value\\\\\\\": \\\\\\\"{Query2Stats:$.FullyCompliant}\\\\\\\"}\\\",\\\"transformers\\\":null}\",\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 8\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query3Stats\",\n \"type\": 1,\n \"query\": \"resources | where type == 'microsoft.network/virtualnetworks' | mvexpand properties.virtualNetworkPeerings | project id, peeringName=properties_virtualNetworkPeerings.name, compliant = (properties_virtualNetworkPeerings.properties.allowVirtualNetworkAccess == True)| summarize Total = count(), Success = countif(compliant==1), Failed = countif(compliant==0) | extend SuccessPercent = iff(Total==0, 100, 100*toint(Success)/toint(Total)) | extend FullyCompliant = iff(SuccessPercent == 100, 'Yes', 'No') | project Query1Stats=tostring(pack_all())\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\"\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query3FullyCompliant\",\n \"type\": 1,\n \"query\": \"{\\\"version\\\":\\\"1.0.0\\\",\\\"content\\\":\\\"{\\\\\\\"value\\\\\\\": \\\\\\\"{Query3Stats:$.FullyCompliant}\\\\\\\"}\\\",\\\"transformers\\\":null}\",\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 8\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Tab2Success\",\n \"type\": 1,\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"criteriaData\": [\n {\n \"criteriaContext\": {\n \"operator\": \"Default\",\n \"resultValType\": \"expression\",\n \"resultVal\": \"{Query0Stats:$.Success}+{Query1Stats:$.Success}+{Query2Stats:$.Success}+{Query3Stats:$.Success}\"\n }\n }\n ]\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Tab2Total\",\n \"type\": 1,\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"criteriaData\": [\n {\n \"criteriaContext\": {\n \"operator\": \"Default\",\n \"resultValType\": \"expression\",\n \"resultVal\": \"{Query0Stats:$.Total}+{Query1Stats:$.Total}+{Query2Stats:$.Total}+{Query3Stats:$.Total}\"\n }\n }\n ]\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Tab2Percent\",\n \"type\": 1,\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"criteriaData\": [\n {\n \"criteriaContext\": {\n \"operator\": \"Default\",\n \"resultValType\": \"expression\",\n \"resultVal\": \"round(100*{Tab2Success}/{Tab2Total})\"\n }\n }\n ]\n }\n ],\n \"style\": \"pills\",\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\"\n },\n \"name\": \"TabInvisibleParameters\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"## Hub and spoke\"\n },\n \"customWidth\": \"50\",\n \"name\": \"tab2title\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"{\\\"version\\\":\\\"1.0.0\\\",\\\"content\\\":\\\"{\\\\\\\"Column1\\\\\\\": \\\\\\\"{Tab2Percent}\\\\\\\", \\\\\\\"Column2\\\\\\\": \\\\\\\"Percent of successful checks\\\\\\\"}\\\",\\\"transformers\\\":null}\",\n \"size\": 3,\n \"queryType\": 8,\n \"visualization\": \"tiles\",\n \"tileSettings\": {\n \"titleContent\": {\n \"columnMatch\": \"Column1\",\n \"formatter\": 4,\n \"formatOptions\": {\n \"min\": 0,\n \"max\": 100,\n \"palette\": \"redGreen\"\n },\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n \"subtitleContent\": {\n \"columnMatch\": \"Column2\"\n },\n \"showBorder\": true\n }\n },\n \"customWidth\": \"50\",\n \"name\": \"TabPercentTile\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"If using Route Server, use a /27 prefix for the Route Server subnet. Check [this link](https://learn.microsoft.com/azure/route-server/quickstart-configure-route-server-portal#create-a-route-server-1) for further information.. [This training](https://learn.microsoft.com/training/modules/intro-to-azure-route-server/) can help to educate yourself on this.\"\n },\n \"name\": \"querytext0\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"resources | where type=='microsoft.network/virtualnetworks' | project id,subnets=properties.subnets | mv-expand subnets | project id, subnetName = subnets.name, subnetPrefix = subnets.properties.addressPrefix | extend subnetPrefixLength = split(subnetPrefix, '/')[1] | where subnetName == 'RouteServerSubnet' | extend compliant = (subnetPrefixLength <= 27) | distinct id, compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed\",\n \"size\": 4,\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"gridSettings\": {\n \"formatters\": [\n {\n \"columnMatch\": \"id\",\n \"formatter\": 0,\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n {\n \"columnMatch\": \"compliant\",\n \"formatter\": 18,\n \"formatOptions\": {\n \"thresholdsOptions\": \"icons\",\n \"thresholdsGrid\": [\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"1\",\n \"representation\": \"success\",\n \"text\": \"Success\"\n },\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"0\",\n \"representation\": \"failed\",\n \"text\": \"Failed\"\n },\n {\n \"operator\": \"Default\",\n \"thresholdValue\": null,\n \"representation\": \"unknown\",\n \"text\": \"Unknown\"\n }\n ]\n }\n }\n ]\n }\n },\n \"name\": \"query0\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"If you have more than 400 spoke networks in a region, deploy an additional hub to bypass VNet peering limits (500) and the maximum number of prefixes that can be advertised via ExpressRoute (1000). Check [this link](https://learn.microsoft.com/azure/azure-resource-manager/management/azure-subscription-service-limits?toc=/azure/virtual-network/toc.json#azure-resource-manager-virtual-networking-limits) for further information.. [This training](https://learn.microsoft.com/training/modules/hub-and-spoke-network-architecture/) can help to educate yourself on this.\"\n },\n \"name\": \"querytext1\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"resources | where type == 'microsoft.network/virtualnetworks' | mvexpand properties.virtualNetworkPeerings | summarize peeringcount = count() by id | extend compliant = (peeringcount < 450) | distinct id,compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed\",\n \"size\": 4,\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"gridSettings\": {\n \"formatters\": [\n {\n \"columnMatch\": \"id\",\n \"formatter\": 0,\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n {\n \"columnMatch\": \"compliant\",\n \"formatter\": 18,\n \"formatOptions\": {\n \"thresholdsOptions\": \"icons\",\n \"thresholdsGrid\": [\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"1\",\n \"representation\": \"success\",\n \"text\": \"Success\"\n },\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"0\",\n \"representation\": \"failed\",\n \"text\": \"Failed\"\n },\n {\n \"operator\": \"Default\",\n \"thresholdValue\": null,\n \"representation\": \"unknown\",\n \"text\": \"Unknown\"\n }\n ]\n }\n }\n ]\n }\n },\n \"name\": \"query1\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"Limit the number of routes per route table to 400. Check [this link](https://learn.microsoft.com/azure/azure-resource-manager/management/azure-subscription-service-limits?toc=/azure/virtual-network/toc.json#azure-resource-manager-virtual-networking-limits) for further information.. [This training](https://learn.microsoft.com/training/modules/hub-and-spoke-network-architecture/) can help to educate yourself on this.\"\n },\n \"name\": \"querytext2\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"resources | where type=='microsoft.network/routetables' | mvexpand properties.routes | summarize routeCount = count() by id | extend compliant = (routeCount < 360) | distinct id,compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed\",\n \"size\": 4,\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"gridSettings\": {\n \"formatters\": [\n {\n \"columnMatch\": \"id\",\n \"formatter\": 0,\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n {\n \"columnMatch\": \"compliant\",\n \"formatter\": 18,\n \"formatOptions\": {\n \"thresholdsOptions\": \"icons\",\n \"thresholdsGrid\": [\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"1\",\n \"representation\": \"success\",\n \"text\": \"Success\"\n },\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"0\",\n \"representation\": \"failed\",\n \"text\": \"Failed\"\n },\n {\n \"operator\": \"Default\",\n \"thresholdValue\": null,\n \"representation\": \"unknown\",\n \"text\": \"Unknown\"\n }\n ]\n }\n }\n ]\n }\n },\n \"name\": \"query2\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"Use the setting 'Allow traffic to remote virtual network' when configuring VNet peerings. Check [this link](https://learn.microsoft.com/azure/virtual-network/virtual-network-manage-peering) for further information.. [This training](https://learn.microsoft.com/training/modules/hub-and-spoke-network-architecture/) can help to educate yourself on this.\"\n },\n \"name\": \"querytext3\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"resources | where type == 'microsoft.network/virtualnetworks' | mvexpand properties.virtualNetworkPeerings | project id, peeringName=properties_virtualNetworkPeerings.name, compliant = (properties_virtualNetworkPeerings.properties.allowVirtualNetworkAccess == True) | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed\",\n \"size\": 4,\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"gridSettings\": {\n \"formatters\": [\n {\n \"columnMatch\": \"id\",\n \"formatter\": 0,\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n {\n \"columnMatch\": \"compliant\",\n \"formatter\": 18,\n \"formatOptions\": {\n \"thresholdsOptions\": \"icons\",\n \"thresholdsGrid\": [\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"1\",\n \"representation\": \"success\",\n \"text\": \"Success\"\n },\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"0\",\n \"representation\": \"failed\",\n \"text\": \"Failed\"\n },\n {\n \"operator\": \"Default\",\n \"thresholdValue\": null,\n \"representation\": \"unknown\",\n \"text\": \"Unknown\"\n }\n ]\n }\n }\n ]\n }\n },\n \"name\": \"query3\"\n }\n ]\n },\n \"conditionalVisibility\": {\n \"parameterName\": \"VisibleTab\",\n \"comparison\": \"isEqualTo\",\n \"value\": \"tab2\"\n },\n \"name\": \"tab2\"\n },\n {\n \"type\": 12,\n \"content\": {\n \"version\": \"NotebookGroup/1.0\",\n \"groupType\": \"editable\",\n \"items\": [\n {\n \"type\": 9,\n \"content\": {\n \"version\": \"KqlParameterItem/1.0\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"parameters\": [\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query14Stats\",\n \"type\": 1,\n \"query\": \"resources | where type=='microsoft.network/firewallpolicies' | extend compliant = (properties.dnsSettings.enableProxy == true) | distinct id,compliant| summarize Total = count(), Success = countif(compliant==1), Failed = countif(compliant==0) | extend SuccessPercent = iff(Total==0, 100, 100*toint(Success)/toint(Total)) | extend FullyCompliant = iff(SuccessPercent == 100, 'Yes', 'No') | project Query1Stats=tostring(pack_all())\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\"\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query14FullyCompliant\",\n \"type\": 1,\n \"query\": \"{\\\"version\\\":\\\"1.0.0\\\",\\\"content\\\":\\\"{\\\\\\\"value\\\\\\\": \\\\\\\"{Query14Stats:$.FullyCompliant}\\\\\\\"}\\\",\\\"transformers\\\":null}\",\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 8\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query15Stats\",\n \"type\": 1,\n \"query\": \"resources | where type=='microsoft.network/firewallpolicies' | extend compliant = (properties.sku.tier == 'Premium') | distinct id,compliant| summarize Total = count(), Success = countif(compliant==1), Failed = countif(compliant==0) | extend SuccessPercent = iff(Total==0, 100, 100*toint(Success)/toint(Total)) | extend FullyCompliant = iff(SuccessPercent == 100, 'Yes', 'No') | project Query1Stats=tostring(pack_all())\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\"\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query15FullyCompliant\",\n \"type\": 1,\n \"query\": \"{\\\"version\\\":\\\"1.0.0\\\",\\\"content\\\":\\\"{\\\\\\\"value\\\\\\\": \\\\\\\"{Query15Stats:$.FullyCompliant}\\\\\\\"}\\\",\\\"transformers\\\":null}\",\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 8\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query16Stats\",\n \"type\": 1,\n \"query\": \"resources | where type=='microsoft.network/firewallpolicies' | extend compliant = (properties.threatIntelMode == 'Deny') | distinct id,compliant| summarize Total = count(), Success = countif(compliant==1), Failed = countif(compliant==0) | extend SuccessPercent = iff(Total==0, 100, 100*toint(Success)/toint(Total)) | extend FullyCompliant = iff(SuccessPercent == 100, 'Yes', 'No') | project Query1Stats=tostring(pack_all())\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\"\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query16FullyCompliant\",\n \"type\": 1,\n \"query\": \"{\\\"version\\\":\\\"1.0.0\\\",\\\"content\\\":\\\"{\\\\\\\"value\\\\\\\": \\\\\\\"{Query16Stats:$.FullyCompliant}\\\\\\\"}\\\",\\\"transformers\\\":null}\",\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 8\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query17Stats\",\n \"type\": 1,\n \"query\": \"resources | where type=='microsoft.network/firewallpolicies' | extend compliant = (properties.intrusionDetection.mode == 'Deny') | project id, compliant| summarize Total = count(), Success = countif(compliant==1), Failed = countif(compliant==0) | extend SuccessPercent = iff(Total==0, 100, 100*toint(Success)/toint(Total)) | extend FullyCompliant = iff(SuccessPercent == 100, 'Yes', 'No') | project Query1Stats=tostring(pack_all())\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\"\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query17FullyCompliant\",\n \"type\": 1,\n \"query\": \"{\\\"version\\\":\\\"1.0.0\\\",\\\"content\\\":\\\"{\\\\\\\"value\\\\\\\": \\\\\\\"{Query17Stats:$.FullyCompliant}\\\\\\\"}\\\",\\\"transformers\\\":null}\",\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 8\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query18Stats\",\n \"type\": 1,\n \"query\": \"resources | where type=='microsoft.network/virtualnetworks' | project id,resourceGroup,name,subnets=properties.subnets | mv-expand subnets | project id,name,subnetId=tostring(subnets.id), subnetName=tostring(subnets.name),subnetRT=subnets.properties.routeTable.id | where not (subnetName in ('GatewaySubnet', 'AzureFirewallSubnet', 'RouteServerSubnet', 'AzureBastionSubnet')) | extend hasRT = isnotnull(subnetRT) | distinct id, hasRT, subnetId | join kind=fullouter (resources | where type == 'microsoft.network/virtualnetworks' | mvexpand properties.virtualNetworkPeerings | extend isVWAN=(tolower(split(properties_virtualNetworkPeerings.name, '_')[0]) == 'remotevnettohubpeering') | mv-expand properties.subnets | project id, isVWAN, name, subnetId=tostring(properties_subnets.id), subnetName=tostring(properties_subnets.name) | summarize PeeredToVWAN=max(isVWAN) by id, subnetId | project id, subnetId, isVWANpeer = (PeeredToVWAN == true)) on subnetId | project id=iff(isnotempty(id), id, id1), subnetId=iff(isnotempty(subnetId), subnetId, subnetId1), hasRT, isVWANpeer | extend compliant = (hasRT==true or isVWANpeer==true) | distinct id, subnetId, compliant| summarize Total = count(), Success = countif(compliant==1), Failed = countif(compliant==0) | extend SuccessPercent = iff(Total==0, 100, 100*toint(Success)/toint(Total)) | extend FullyCompliant = iff(SuccessPercent == 100, 'Yes', 'No') | project Query1Stats=tostring(pack_all())\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\"\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query18FullyCompliant\",\n \"type\": 1,\n \"query\": \"{\\\"version\\\":\\\"1.0.0\\\",\\\"content\\\":\\\"{\\\\\\\"value\\\\\\\": \\\\\\\"{Query18Stats:$.FullyCompliant}\\\\\\\"}\\\",\\\"transformers\\\":null}\",\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 8\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Tab3Success\",\n \"type\": 1,\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"criteriaData\": [\n {\n \"criteriaContext\": {\n \"operator\": \"Default\",\n \"resultValType\": \"expression\",\n \"resultVal\": \"{Query14Stats:$.Success}+{Query15Stats:$.Success}+{Query16Stats:$.Success}+{Query17Stats:$.Success}+{Query18Stats:$.Success}\"\n }\n }\n ]\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Tab3Total\",\n \"type\": 1,\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"criteriaData\": [\n {\n \"criteriaContext\": {\n \"operator\": \"Default\",\n \"resultValType\": \"expression\",\n \"resultVal\": \"{Query14Stats:$.Total}+{Query15Stats:$.Total}+{Query16Stats:$.Total}+{Query17Stats:$.Total}+{Query18Stats:$.Total}\"\n }\n }\n ]\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Tab3Percent\",\n \"type\": 1,\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"criteriaData\": [\n {\n \"criteriaContext\": {\n \"operator\": \"Default\",\n \"resultValType\": \"expression\",\n \"resultVal\": \"round(100*{Tab3Success}/{Tab3Total})\"\n }\n }\n ]\n }\n ],\n \"style\": \"pills\",\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\"\n },\n \"name\": \"TabInvisibleParameters\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"## Firewall\"\n },\n \"customWidth\": \"50\",\n \"name\": \"tab3title\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"{\\\"version\\\":\\\"1.0.0\\\",\\\"content\\\":\\\"{\\\\\\\"Column1\\\\\\\": \\\\\\\"{Tab3Percent}\\\\\\\", \\\\\\\"Column2\\\\\\\": \\\\\\\"Percent of successful checks\\\\\\\"}\\\",\\\"transformers\\\":null}\",\n \"size\": 3,\n \"queryType\": 8,\n \"visualization\": \"tiles\",\n \"tileSettings\": {\n \"titleContent\": {\n \"columnMatch\": \"Column1\",\n \"formatter\": 4,\n \"formatOptions\": {\n \"min\": 0,\n \"max\": 100,\n \"palette\": \"redGreen\"\n },\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n \"subtitleContent\": {\n \"columnMatch\": \"Column2\"\n },\n \"showBorder\": true\n }\n },\n \"customWidth\": \"50\",\n \"name\": \"TabPercentTile\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"Use application rules to filter outbound traffic on destination host name for supported protocols. Use FQDN-based network rules and Azure Firewall with DNS proxy to filter egress traffic to the Internet over other protocols. Check [this link](https://learn.microsoft.com/azure/firewall/fqdn-filtering-network-rules) for further information.. [This training](https://learn.microsoft.com/learn/paths/secure-networking-infrastructure/) can help to educate yourself on this.\"\n },\n \"name\": \"querytext14\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"resources | where type=='microsoft.network/firewallpolicies' | extend compliant = (properties.dnsSettings.enableProxy == true) | distinct id,compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed\",\n \"size\": 4,\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"gridSettings\": {\n \"formatters\": [\n {\n \"columnMatch\": \"id\",\n \"formatter\": 0,\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n {\n \"columnMatch\": \"compliant\",\n \"formatter\": 18,\n \"formatOptions\": {\n \"thresholdsOptions\": \"icons\",\n \"thresholdsGrid\": [\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"1\",\n \"representation\": \"success\",\n \"text\": \"Success\"\n },\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"0\",\n \"representation\": \"failed\",\n \"text\": \"Failed\"\n },\n {\n \"operator\": \"Default\",\n \"thresholdValue\": null,\n \"representation\": \"unknown\",\n \"text\": \"Unknown\"\n }\n ]\n }\n }\n ]\n }\n },\n \"name\": \"query14\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"Use Azure Firewall Premium to enable additional security features. Check [this link](https://learn.microsoft.com/azure/firewall/premium-features) for further information.. [This training](https://learn.microsoft.com/training/modules/introduction-azure-firewall/) can help to educate yourself on this.\"\n },\n \"name\": \"querytext15\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"resources | where type=='microsoft.network/firewallpolicies' | extend compliant = (properties.sku.tier == 'Premium') | distinct id,compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed\",\n \"size\": 4,\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"gridSettings\": {\n \"formatters\": [\n {\n \"columnMatch\": \"id\",\n \"formatter\": 0,\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n {\n \"columnMatch\": \"compliant\",\n \"formatter\": 18,\n \"formatOptions\": {\n \"thresholdsOptions\": \"icons\",\n \"thresholdsGrid\": [\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"1\",\n \"representation\": \"success\",\n \"text\": \"Success\"\n },\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"0\",\n \"representation\": \"failed\",\n \"text\": \"Failed\"\n },\n {\n \"operator\": \"Default\",\n \"thresholdValue\": null,\n \"representation\": \"unknown\",\n \"text\": \"Unknown\"\n }\n ]\n }\n }\n ]\n }\n },\n \"name\": \"query15\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"Configure Azure Firewall Threat Intelligence mode to Alert and Deny for additional protection. Check [this link](https://learn.microsoft.com/azure/firewall/premium-features#idps-signature-rules) for further information.\"\n },\n \"name\": \"querytext16\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"resources | where type=='microsoft.network/firewallpolicies' | extend compliant = (properties.threatIntelMode == 'Deny') | distinct id,compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed\",\n \"size\": 4,\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"gridSettings\": {\n \"formatters\": [\n {\n \"columnMatch\": \"id\",\n \"formatter\": 0,\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n {\n \"columnMatch\": \"compliant\",\n \"formatter\": 18,\n \"formatOptions\": {\n \"thresholdsOptions\": \"icons\",\n \"thresholdsGrid\": [\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"1\",\n \"representation\": \"success\",\n \"text\": \"Success\"\n },\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"0\",\n \"representation\": \"failed\",\n \"text\": \"Failed\"\n },\n {\n \"operator\": \"Default\",\n \"thresholdValue\": null,\n \"representation\": \"unknown\",\n \"text\": \"Unknown\"\n }\n ]\n }\n }\n ]\n }\n },\n \"name\": \"query16\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"Configure Azure Firewall IDPS mode to Deny for additional protection. Check [this link](https://learn.microsoft.com/azure/firewall/premium-features#idps) for further information.. [This training](https://learn.microsoft.com/training/modules/introduction-azure-firewall/) can help to educate yourself on this.\"\n },\n \"name\": \"querytext17\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"resources | where type=='microsoft.network/firewallpolicies' | extend compliant = (properties.intrusionDetection.mode == 'Deny') | project id, compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed\",\n \"size\": 4,\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"gridSettings\": {\n \"formatters\": [\n {\n \"columnMatch\": \"id\",\n \"formatter\": 0,\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n {\n \"columnMatch\": \"compliant\",\n \"formatter\": 18,\n \"formatOptions\": {\n \"thresholdsOptions\": \"icons\",\n \"thresholdsGrid\": [\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"1\",\n \"representation\": \"success\",\n \"text\": \"Success\"\n },\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"0\",\n \"representation\": \"failed\",\n \"text\": \"Failed\"\n },\n {\n \"operator\": \"Default\",\n \"thresholdValue\": null,\n \"representation\": \"unknown\",\n \"text\": \"Unknown\"\n }\n ]\n }\n }\n ]\n }\n },\n \"name\": \"query17\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"For subnets in VNets not connected to Virtual WAN, attach a route table so that Internet traffic is redirected to Azure Firewall or a Network Virtual Appliance. Check [this link](https://learn.microsoft.com/azure/virtual-network/virtual-networks-udr-overview) for further information.\"\n },\n \"name\": \"querytext18\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"resources | where type=='microsoft.network/virtualnetworks' | project id,resourceGroup,name,subnets=properties.subnets | mv-expand subnets | project id,name,subnetId=tostring(subnets.id), subnetName=tostring(subnets.name),subnetRT=subnets.properties.routeTable.id | where not (subnetName in ('GatewaySubnet', 'AzureFirewallSubnet', 'RouteServerSubnet', 'AzureBastionSubnet')) | extend hasRT = isnotnull(subnetRT) | distinct id, hasRT, subnetId | join kind=fullouter (resources | where type == 'microsoft.network/virtualnetworks' | mvexpand properties.virtualNetworkPeerings | extend isVWAN=(tolower(split(properties_virtualNetworkPeerings.name, '_')[0]) == 'remotevnettohubpeering') | mv-expand properties.subnets | project id, isVWAN, name, subnetId=tostring(properties_subnets.id), subnetName=tostring(properties_subnets.name) | summarize PeeredToVWAN=max(isVWAN) by id, subnetId | project id, subnetId, isVWANpeer = (PeeredToVWAN == true)) on subnetId | project id=iff(isnotempty(id), id, id1), subnetId=iff(isnotempty(subnetId), subnetId, subnetId1), hasRT, isVWANpeer | extend compliant = (hasRT==true or isVWANpeer==true) | distinct id, subnetId, compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed\",\n \"size\": 4,\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"gridSettings\": {\n \"formatters\": [\n {\n \"columnMatch\": \"id\",\n \"formatter\": 0,\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n {\n \"columnMatch\": \"compliant\",\n \"formatter\": 18,\n \"formatOptions\": {\n \"thresholdsOptions\": \"icons\",\n \"thresholdsGrid\": [\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"1\",\n \"representation\": \"success\",\n \"text\": \"Success\"\n },\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"0\",\n \"representation\": \"failed\",\n \"text\": \"Failed\"\n },\n {\n \"operator\": \"Default\",\n \"thresholdValue\": null,\n \"representation\": \"unknown\",\n \"text\": \"Unknown\"\n }\n ]\n }\n }\n ]\n }\n },\n \"name\": \"query18\"\n }\n ]\n },\n \"conditionalVisibility\": {\n \"parameterName\": \"VisibleTab\",\n \"comparison\": \"isEqualTo\",\n \"value\": \"tab3\"\n },\n \"name\": \"tab3\"\n },\n {\n \"type\": 12,\n \"content\": {\n \"version\": \"NotebookGroup/1.0\",\n \"groupType\": \"editable\",\n \"items\": [\n {\n \"type\": 9,\n \"content\": {\n \"version\": \"KqlParameterItem/1.0\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"parameters\": [\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query20Stats\",\n \"type\": 1,\n \"query\": \"resources | where type =~ 'microsoft.network/virtualnetworks' | project id,resourceGroup,name,subnets = properties.subnets | mv-expand subnets | project id = subnets.id, resourceGroup, VNet = name, serviceEndpoints = subnets.properties.serviceEndpoints, compliant = (isnull(subnets.properties.serviceEndpoints) or array_length(subnets.properties.serviceEndpoints) == 0) | order by compliant asc| summarize Total = count(), Success = countif(compliant==1), Failed = countif(compliant==0) | extend SuccessPercent = iff(Total==0, 100, 100*toint(Success)/toint(Total)) | extend FullyCompliant = iff(SuccessPercent == 100, 'Yes', 'No') | project Query1Stats=tostring(pack_all())\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\"\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query20FullyCompliant\",\n \"type\": 1,\n \"query\": \"{\\\"version\\\":\\\"1.0.0\\\",\\\"content\\\":\\\"{\\\\\\\"value\\\\\\\": \\\\\\\"{Query20Stats:$.FullyCompliant}\\\\\\\"}\\\",\\\"transformers\\\":null}\",\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 8\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Tab4Success\",\n \"type\": 1,\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"criteriaData\": [\n {\n \"criteriaContext\": {\n \"operator\": \"Default\",\n \"resultValType\": \"expression\",\n \"resultVal\": \"{Query20Stats:$.Success}\"\n }\n }\n ]\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Tab4Total\",\n \"type\": 1,\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"criteriaData\": [\n {\n \"criteriaContext\": {\n \"operator\": \"Default\",\n \"resultValType\": \"expression\",\n \"resultVal\": \"{Query20Stats:$.Total}\"\n }\n }\n ]\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Tab4Percent\",\n \"type\": 1,\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"criteriaData\": [\n {\n \"criteriaContext\": {\n \"operator\": \"Default\",\n \"resultValType\": \"expression\",\n \"resultVal\": \"round(100*{Tab4Success}/{Tab4Total})\"\n }\n }\n ]\n }\n ],\n \"style\": \"pills\",\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\"\n },\n \"name\": \"TabInvisibleParameters\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"## PaaS\"\n },\n \"customWidth\": \"50\",\n \"name\": \"tab4title\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"{\\\"version\\\":\\\"1.0.0\\\",\\\"content\\\":\\\"{\\\\\\\"Column1\\\\\\\": \\\\\\\"{Tab4Percent}\\\\\\\", \\\\\\\"Column2\\\\\\\": \\\\\\\"Percent of successful checks\\\\\\\"}\\\",\\\"transformers\\\":null}\",\n \"size\": 3,\n \"queryType\": 8,\n \"visualization\": \"tiles\",\n \"tileSettings\": {\n \"titleContent\": {\n \"columnMatch\": \"Column1\",\n \"formatter\": 4,\n \"formatOptions\": {\n \"min\": 0,\n \"max\": 100,\n \"palette\": \"redGreen\"\n },\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n \"subtitleContent\": {\n \"columnMatch\": \"Column2\"\n },\n \"showBorder\": true\n }\n },\n \"customWidth\": \"50\",\n \"name\": \"TabPercentTile\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"Don't enable virtual network service endpoints by default on all subnets. Check [this link](https://learn.microsoft.com/azure/virtual-network/virtual-network-service-endpoints-overview) for further information.. [This training](https://learn.microsoft.com/learn/paths/implement-network-security/?source=learn) can help to educate yourself on this.\"\n },\n \"name\": \"querytext20\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"resources | where type =~ 'microsoft.network/virtualnetworks' | project id,resourceGroup,name,subnets = properties.subnets | mv-expand subnets | project id = subnets.id, resourceGroup, VNet = name, serviceEndpoints = subnets.properties.serviceEndpoints, compliant = (isnull(subnets.properties.serviceEndpoints) or array_length(subnets.properties.serviceEndpoints) == 0) | order by compliant asc | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed\",\n \"size\": 4,\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"gridSettings\": {\n \"formatters\": [\n {\n \"columnMatch\": \"id\",\n \"formatter\": 0,\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n {\n \"columnMatch\": \"compliant\",\n \"formatter\": 18,\n \"formatOptions\": {\n \"thresholdsOptions\": \"icons\",\n \"thresholdsGrid\": [\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"1\",\n \"representation\": \"success\",\n \"text\": \"Success\"\n },\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"0\",\n \"representation\": \"failed\",\n \"text\": \"Failed\"\n },\n {\n \"operator\": \"Default\",\n \"thresholdValue\": null,\n \"representation\": \"unknown\",\n \"text\": \"Unknown\"\n }\n ]\n }\n }\n ]\n }\n },\n \"name\": \"query20\"\n }\n ]\n },\n \"conditionalVisibility\": {\n \"parameterName\": \"VisibleTab\",\n \"comparison\": \"isEqualTo\",\n \"value\": \"tab4\"\n },\n \"name\": \"tab4\"\n },\n {\n \"type\": 12,\n \"content\": {\n \"version\": \"NotebookGroup/1.0\",\n \"groupType\": \"editable\",\n \"items\": [\n {\n \"type\": 9,\n \"content\": {\n \"version\": \"KqlParameterItem/1.0\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"parameters\": [\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query24Stats\",\n \"type\": 1,\n \"query\": \"resources | where type=='microsoft.network/virtualhubs' | extend compliant = isnotnull(properties.azureFirewall.id) | project id, compliant| summarize Total = count(), Success = countif(compliant==1), Failed = countif(compliant==0) | extend SuccessPercent = iff(Total==0, 100, 100*toint(Success)/toint(Total)) | extend FullyCompliant = iff(SuccessPercent == 100, 'Yes', 'No') | project Query1Stats=tostring(pack_all())\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\"\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query24FullyCompliant\",\n \"type\": 1,\n \"query\": \"{\\\"version\\\":\\\"1.0.0\\\",\\\"content\\\":\\\"{\\\\\\\"value\\\\\\\": \\\\\\\"{Query24Stats:$.FullyCompliant}\\\\\\\"}\\\",\\\"transformers\\\":null}\",\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 8\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Tab5Success\",\n \"type\": 1,\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"criteriaData\": [\n {\n \"criteriaContext\": {\n \"operator\": \"Default\",\n \"resultValType\": \"expression\",\n \"resultVal\": \"{Query24Stats:$.Success}\"\n }\n }\n ]\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Tab5Total\",\n \"type\": 1,\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"criteriaData\": [\n {\n \"criteriaContext\": {\n \"operator\": \"Default\",\n \"resultValType\": \"expression\",\n \"resultVal\": \"{Query24Stats:$.Total}\"\n }\n }\n ]\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Tab5Percent\",\n \"type\": 1,\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"criteriaData\": [\n {\n \"criteriaContext\": {\n \"operator\": \"Default\",\n \"resultValType\": \"expression\",\n \"resultVal\": \"round(100*{Tab5Success}/{Tab5Total})\"\n }\n }\n ]\n }\n ],\n \"style\": \"pills\",\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\"\n },\n \"name\": \"TabInvisibleParameters\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"## Virtual WAN\"\n },\n \"customWidth\": \"50\",\n \"name\": \"tab5title\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"{\\\"version\\\":\\\"1.0.0\\\",\\\"content\\\":\\\"{\\\\\\\"Column1\\\\\\\": \\\\\\\"{Tab5Percent}\\\\\\\", \\\\\\\"Column2\\\\\\\": \\\\\\\"Percent of successful checks\\\\\\\"}\\\",\\\"transformers\\\":null}\",\n \"size\": 3,\n \"queryType\": 8,\n \"visualization\": \"tiles\",\n \"tileSettings\": {\n \"titleContent\": {\n \"columnMatch\": \"Column1\",\n \"formatter\": 4,\n \"formatOptions\": {\n \"min\": 0,\n \"max\": 100,\n \"palette\": \"redGreen\"\n },\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n \"subtitleContent\": {\n \"columnMatch\": \"Column2\"\n },\n \"showBorder\": true\n }\n },\n \"customWidth\": \"50\",\n \"name\": \"TabPercentTile\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"For outbound Internet traffic protection and filtering, deploy Azure Firewall in secured hubs. Check [this link](https://learn.microsoft.com/azure/virtual-wan/howto-firewall) for further information.. [This training](https://learn.microsoft.com/learn/paths/secure-networking-infrastructure/) can help to educate yourself on this.\"\n },\n \"name\": \"querytext24\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"resources | where type=='microsoft.network/virtualhubs' | extend compliant = isnotnull(properties.azureFirewall.id) | project id, compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed\",\n \"size\": 4,\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"gridSettings\": {\n \"formatters\": [\n {\n \"columnMatch\": \"id\",\n \"formatter\": 0,\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n {\n \"columnMatch\": \"compliant\",\n \"formatter\": 18,\n \"formatOptions\": {\n \"thresholdsOptions\": \"icons\",\n \"thresholdsGrid\": [\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"1\",\n \"representation\": \"success\",\n \"text\": \"Success\"\n },\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"0\",\n \"representation\": \"failed\",\n \"text\": \"Failed\"\n },\n {\n \"operator\": \"Default\",\n \"thresholdValue\": null,\n \"representation\": \"unknown\",\n \"text\": \"Unknown\"\n }\n ]\n }\n }\n ]\n }\n },\n \"name\": \"query24\"\n }\n ]\n },\n \"conditionalVisibility\": {\n \"parameterName\": \"VisibleTab\",\n \"comparison\": \"isEqualTo\",\n \"value\": \"tab5\"\n },\n \"name\": \"tab5\"\n },\n {\n \"type\": 12,\n \"content\": {\n \"version\": \"NotebookGroup/1.0\",\n \"groupType\": \"editable\",\n \"items\": [\n {\n \"type\": 9,\n \"content\": {\n \"version\": \"KqlParameterItem/1.0\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"parameters\": [\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query19Stats\",\n \"type\": 1,\n \"query\": \"resources | where type=='microsoft.network/virtualnetworks' | project id,subnets=properties.subnets | mv-expand subnets | project id, subnetName = subnets.name, subnetPrefix = subnets.properties.addressPrefix | extend subnetPrefixLength = split(subnetPrefix, '/')[1] | where subnetName == 'AzureFirewallSubnet' | extend compliant = (subnetPrefixLength == 26) | distinct id, compliant| summarize Total = count(), Success = countif(compliant==1), Failed = countif(compliant==0) | extend SuccessPercent = iff(Total==0, 100, 100*toint(Success)/toint(Total)) | extend FullyCompliant = iff(SuccessPercent == 100, 'Yes', 'No') | project Query1Stats=tostring(pack_all())\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\"\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query19FullyCompliant\",\n \"type\": 1,\n \"query\": \"{\\\"version\\\":\\\"1.0.0\\\",\\\"content\\\":\\\"{\\\\\\\"value\\\\\\\": \\\\\\\"{Query19Stats:$.FullyCompliant}\\\\\\\"}\\\",\\\"transformers\\\":null}\",\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 8\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query21Stats\",\n \"type\": 1,\n \"query\": \"resources | where type=='microsoft.network/virtualnetworks' | project id,subnets=properties.subnets | mv-expand subnets | project id, subnetName = subnets.name, subnetPrefix = subnets.properties.addressPrefix | extend subnetPrefixLength = split(subnetPrefix, '/')[1] | where subnetName == 'GatewaySubnet' | extend compliant = (subnetPrefixLength <= 27) | distinct id, compliant| summarize Total = count(), Success = countif(compliant==1), Failed = countif(compliant==0) | extend SuccessPercent = iff(Total==0, 100, 100*toint(Success)/toint(Total)) | extend FullyCompliant = iff(SuccessPercent == 100, 'Yes', 'No') | project Query1Stats=tostring(pack_all())\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\"\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query21FullyCompliant\",\n \"type\": 1,\n \"query\": \"{\\\"version\\\":\\\"1.0.0\\\",\\\"content\\\":\\\"{\\\\\\\"value\\\\\\\": \\\\\\\"{Query21Stats:$.FullyCompliant}\\\\\\\"}\\\",\\\"transformers\\\":null}\",\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 8\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query22Stats\",\n \"type\": 1,\n \"query\": \"resources | where type=='microsoft.network/networksecuritygroups' | mvexpand properties.securityRules | project id,name,ruleAction=properties_securityRules.properties.access,rulePriority=properties_securityRules.properties.priority,ruleDst=properties_securityRules.properties.destinationAddressPrefix,ruleSrc=properties_securityRules.properties.sourceAddressPrefix,ruleProt=properties_securityRules.properties.protocol,ruleDirection=properties_securityRules.properties.direction,rulePort=properties_securityRules.properties.destinationPortRange | summarize StarDenies=countif(ruleAction=='Deny' and ruleDst=='*' and ruleSrc=='*' and ruleProt=='*' and rulePort=='*') by id,tostring(ruleDirection) | where ruleDirection == 'Inbound' | project id,compliant=(StarDenies>0) | union (resources | where type=='microsoft.network/networksecuritygroups' | where array_length(properties.securityRules)==0 | extend compliant=false | project id,compliant)| summarize Total = count(), Success = countif(compliant==1), Failed = countif(compliant==0) | extend SuccessPercent = iff(Total==0, 100, 100*toint(Success)/toint(Total)) | extend FullyCompliant = iff(SuccessPercent == 100, 'Yes', 'No') | project Query1Stats=tostring(pack_all())\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\"\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query22FullyCompliant\",\n \"type\": 1,\n \"query\": \"{\\\"version\\\":\\\"1.0.0\\\",\\\"content\\\":\\\"{\\\\\\\"value\\\\\\\": \\\\\\\"{Query22Stats:$.FullyCompliant}\\\\\\\"}\\\",\\\"transformers\\\":null}\",\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 8\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query23Stats\",\n \"type\": 1,\n \"query\": \"resources | where type == 'microsoft.network/networksecuritygroups' | project id, rules = array_length(properties.securityRules) | project id, compliant = (rules < 900)| summarize Total = count(), Success = countif(compliant==1), Failed = countif(compliant==0) | extend SuccessPercent = iff(Total==0, 100, 100*toint(Success)/toint(Total)) | extend FullyCompliant = iff(SuccessPercent == 100, 'Yes', 'No') | project Query1Stats=tostring(pack_all())\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\"\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query23FullyCompliant\",\n \"type\": 1,\n \"query\": \"{\\\"version\\\":\\\"1.0.0\\\",\\\"content\\\":\\\"{\\\\\\\"value\\\\\\\": \\\\\\\"{Query23Stats:$.FullyCompliant}\\\\\\\"}\\\",\\\"transformers\\\":null}\",\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 8\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Tab6Success\",\n \"type\": 1,\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"criteriaData\": [\n {\n \"criteriaContext\": {\n \"operator\": \"Default\",\n \"resultValType\": \"expression\",\n \"resultVal\": \"{Query19Stats:$.Success}+{Query21Stats:$.Success}+{Query22Stats:$.Success}+{Query23Stats:$.Success}\"\n }\n }\n ]\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Tab6Total\",\n \"type\": 1,\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"criteriaData\": [\n {\n \"criteriaContext\": {\n \"operator\": \"Default\",\n \"resultValType\": \"expression\",\n \"resultVal\": \"{Query19Stats:$.Total}+{Query21Stats:$.Total}+{Query22Stats:$.Total}+{Query23Stats:$.Total}\"\n }\n }\n ]\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Tab6Percent\",\n \"type\": 1,\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"criteriaData\": [\n {\n \"criteriaContext\": {\n \"operator\": \"Default\",\n \"resultValType\": \"expression\",\n \"resultVal\": \"round(100*{Tab6Success}/{Tab6Total})\"\n }\n }\n ]\n }\n ],\n \"style\": \"pills\",\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\"\n },\n \"name\": \"TabInvisibleParameters\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"## Segmentation\"\n },\n \"customWidth\": \"50\",\n \"name\": \"tab6title\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"{\\\"version\\\":\\\"1.0.0\\\",\\\"content\\\":\\\"{\\\\\\\"Column1\\\\\\\": \\\\\\\"{Tab6Percent}\\\\\\\", \\\\\\\"Column2\\\\\\\": \\\\\\\"Percent of successful checks\\\\\\\"}\\\",\\\"transformers\\\":null}\",\n \"size\": 3,\n \"queryType\": 8,\n \"visualization\": \"tiles\",\n \"tileSettings\": {\n \"titleContent\": {\n \"columnMatch\": \"Column1\",\n \"formatter\": 4,\n \"formatOptions\": {\n \"min\": 0,\n \"max\": 100,\n \"palette\": \"redGreen\"\n },\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n \"subtitleContent\": {\n \"columnMatch\": \"Column2\"\n },\n \"showBorder\": true\n }\n },\n \"customWidth\": \"50\",\n \"name\": \"TabPercentTile\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"Use a /26 prefix for your Azure Firewall subnets. Check [this link](https://learn.microsoft.com/azure/firewall/firewall-faq#why-does-azure-firewall-need-a--26-subnet-size) for further information.. [This training](https://learn.microsoft.com/training/modules/introduction-azure-firewall/) can help to educate yourself on this.\"\n },\n \"name\": \"querytext19\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"resources | where type=='microsoft.network/virtualnetworks' | project id,subnets=properties.subnets | mv-expand subnets | project id, subnetName = subnets.name, subnetPrefix = subnets.properties.addressPrefix | extend subnetPrefixLength = split(subnetPrefix, '/')[1] | where subnetName == 'AzureFirewallSubnet' | extend compliant = (subnetPrefixLength == 26) | distinct id, compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed\",\n \"size\": 4,\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"gridSettings\": {\n \"formatters\": [\n {\n \"columnMatch\": \"id\",\n \"formatter\": 0,\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n {\n \"columnMatch\": \"compliant\",\n \"formatter\": 18,\n \"formatOptions\": {\n \"thresholdsOptions\": \"icons\",\n \"thresholdsGrid\": [\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"1\",\n \"representation\": \"success\",\n \"text\": \"Success\"\n },\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"0\",\n \"representation\": \"failed\",\n \"text\": \"Failed\"\n },\n {\n \"operator\": \"Default\",\n \"thresholdValue\": null,\n \"representation\": \"unknown\",\n \"text\": \"Unknown\"\n }\n ]\n }\n }\n ]\n }\n },\n \"name\": \"query19\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"Use at least a /27 prefix for your Gateway subnets. Check [this link](https://learn.microsoft.com/azure/expressroute/expressroute-howto-add-gateway-resource-manager#add-a-gateway) for further information.\"\n },\n \"name\": \"querytext21\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"resources | where type=='microsoft.network/virtualnetworks' | project id,subnets=properties.subnets | mv-expand subnets | project id, subnetName = subnets.name, subnetPrefix = subnets.properties.addressPrefix | extend subnetPrefixLength = split(subnetPrefix, '/')[1] | where subnetName == 'GatewaySubnet' | extend compliant = (subnetPrefixLength <= 27) | distinct id, compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed\",\n \"size\": 4,\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"gridSettings\": {\n \"formatters\": [\n {\n \"columnMatch\": \"id\",\n \"formatter\": 0,\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n {\n \"columnMatch\": \"compliant\",\n \"formatter\": 18,\n \"formatOptions\": {\n \"thresholdsOptions\": \"icons\",\n \"thresholdsGrid\": [\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"1\",\n \"representation\": \"success\",\n \"text\": \"Success\"\n },\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"0\",\n \"representation\": \"failed\",\n \"text\": \"Failed\"\n },\n {\n \"operator\": \"Default\",\n \"thresholdValue\": null,\n \"representation\": \"unknown\",\n \"text\": \"Unknown\"\n }\n ]\n }\n }\n ]\n }\n },\n \"name\": \"query21\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"Don't rely on the NSG inbound default rules using the VirtualNetwork service tag to limit connectivity. Check [this link](https://learn.microsoft.com/azure/virtual-network/service-tags-overview#available-service-tags) for further information.\"\n },\n \"name\": \"querytext22\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"resources | where type=='microsoft.network/networksecuritygroups' | mvexpand properties.securityRules | project id,name,ruleAction=properties_securityRules.properties.access,rulePriority=properties_securityRules.properties.priority,ruleDst=properties_securityRules.properties.destinationAddressPrefix,ruleSrc=properties_securityRules.properties.sourceAddressPrefix,ruleProt=properties_securityRules.properties.protocol,ruleDirection=properties_securityRules.properties.direction,rulePort=properties_securityRules.properties.destinationPortRange | summarize StarDenies=countif(ruleAction=='Deny' and ruleDst=='*' and ruleSrc=='*' and ruleProt=='*' and rulePort=='*') by id,tostring(ruleDirection) | where ruleDirection == 'Inbound' | project id,compliant=(StarDenies>0) | union (resources | where type=='microsoft.network/networksecuritygroups' | where array_length(properties.securityRules)==0 | extend compliant=false | project id,compliant) | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed\",\n \"size\": 4,\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"gridSettings\": {\n \"formatters\": [\n {\n \"columnMatch\": \"id\",\n \"formatter\": 0,\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n {\n \"columnMatch\": \"compliant\",\n \"formatter\": 18,\n \"formatOptions\": {\n \"thresholdsOptions\": \"icons\",\n \"thresholdsGrid\": [\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"1\",\n \"representation\": \"success\",\n \"text\": \"Success\"\n },\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"0\",\n \"representation\": \"failed\",\n \"text\": \"Failed\"\n },\n {\n \"operator\": \"Default\",\n \"thresholdValue\": null,\n \"representation\": \"unknown\",\n \"text\": \"Unknown\"\n }\n ]\n }\n }\n ]\n }\n },\n \"name\": \"query22\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"Do not implement more than 900 NSG rules per NSG, due to the limit of 1000 rules. Check [this link](https://learn.microsoft.com/azure/azure-resource-manager/management/azure-subscription-service-limits) for further information.. [This training](https://learn.microsoft.com/azure/virtual-network/network-security-group-how-it-works) can help to educate yourself on this.\"\n },\n \"name\": \"querytext23\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"resources | where type == 'microsoft.network/networksecuritygroups' | project id, rules = array_length(properties.securityRules) | project id, compliant = (rules < 900) | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed\",\n \"size\": 4,\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"gridSettings\": {\n \"formatters\": [\n {\n \"columnMatch\": \"id\",\n \"formatter\": 0,\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n {\n \"columnMatch\": \"compliant\",\n \"formatter\": 18,\n \"formatOptions\": {\n \"thresholdsOptions\": \"icons\",\n \"thresholdsGrid\": [\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"1\",\n \"representation\": \"success\",\n \"text\": \"Success\"\n },\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"0\",\n \"representation\": \"failed\",\n \"text\": \"Failed\"\n },\n {\n \"operator\": \"Default\",\n \"thresholdValue\": null,\n \"representation\": \"unknown\",\n \"text\": \"Unknown\"\n }\n ]\n }\n }\n ]\n }\n },\n \"name\": \"query23\"\n }\n ]\n },\n \"conditionalVisibility\": {\n \"parameterName\": \"VisibleTab\",\n \"comparison\": \"isEqualTo\",\n \"value\": \"tab6\"\n },\n \"name\": \"tab6\"\n },\n {\n \"type\": 12,\n \"content\": {\n \"version\": \"NotebookGroup/1.0\",\n \"groupType\": \"editable\",\n \"items\": [\n {\n \"type\": 9,\n \"content\": {\n \"version\": \"KqlParameterItem/1.0\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"parameters\": [\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query4Stats\",\n \"type\": 1,\n \"query\": \"resources | where type == 'microsoft.network/virtualnetworks' | extend addressSpace = todynamic(properties.addressSpace) | extend addressPrefix = todynamic(properties.addressSpace.addressPrefixes) | mvexpand addressSpace | mvexpand addressPrefix | project name, id, location, resourceGroup, subscriptionId, cidr = addressPrefix | extend compliant = (cidr matches regex @'^(10\\\\.|172\\\\.(1[6-9]|2[0-9]|3[01])\\\\.|192\\\\.168\\\\.)') | project id, compliant, cidr| summarize Total = count(), Success = countif(compliant==1), Failed = countif(compliant==0) | extend SuccessPercent = iff(Total==0, 100, 100*toint(Success)/toint(Total)) | extend FullyCompliant = iff(SuccessPercent == 100, 'Yes', 'No') | project Query1Stats=tostring(pack_all())\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\"\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query4FullyCompliant\",\n \"type\": 1,\n \"query\": \"{\\\"version\\\":\\\"1.0.0\\\",\\\"content\\\":\\\"{\\\\\\\"value\\\\\\\": \\\\\\\"{Query4Stats:$.FullyCompliant}\\\\\\\"}\\\",\\\"transformers\\\":null}\",\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 8\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query5Stats\",\n \"type\": 1,\n \"query\": \"resources | where type == 'microsoft.network/virtualnetworks' | extend addressSpace = todynamic(properties.addressSpace) | extend addressPrefix = todynamic(properties.addressSpace.addressPrefixes) | mvexpand addressSpace | mvexpand addressPrefix | extend addressMask = split(addressPrefix,'/')[1] | extend compliant = addressMask > 16 | project name, id, subscriptionId, resourceGroup, addressPrefix, compliant| summarize Total = count(), Success = countif(compliant==1), Failed = countif(compliant==0) | extend SuccessPercent = iff(Total==0, 100, 100*toint(Success)/toint(Total)) | extend FullyCompliant = iff(SuccessPercent == 100, 'Yes', 'No') | project Query1Stats=tostring(pack_all())\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\"\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query5FullyCompliant\",\n \"type\": 1,\n \"query\": \"{\\\"version\\\":\\\"1.0.0\\\",\\\"content\\\":\\\"{\\\\\\\"value\\\\\\\": \\\\\\\"{Query5Stats:$.FullyCompliant}\\\\\\\"}\\\",\\\"transformers\\\":null}\",\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 8\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Tab7Success\",\n \"type\": 1,\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"criteriaData\": [\n {\n \"criteriaContext\": {\n \"operator\": \"Default\",\n \"resultValType\": \"expression\",\n \"resultVal\": \"{Query4Stats:$.Success}+{Query5Stats:$.Success}\"\n }\n }\n ]\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Tab7Total\",\n \"type\": 1,\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"criteriaData\": [\n {\n \"criteriaContext\": {\n \"operator\": \"Default\",\n \"resultValType\": \"expression\",\n \"resultVal\": \"{Query4Stats:$.Total}+{Query5Stats:$.Total}\"\n }\n }\n ]\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Tab7Percent\",\n \"type\": 1,\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"criteriaData\": [\n {\n \"criteriaContext\": {\n \"operator\": \"Default\",\n \"resultValType\": \"expression\",\n \"resultVal\": \"round(100*{Tab7Success}/{Tab7Total})\"\n }\n }\n ]\n }\n ],\n \"style\": \"pills\",\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\"\n },\n \"name\": \"TabInvisibleParameters\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"## IP plan\"\n },\n \"customWidth\": \"50\",\n \"name\": \"tab7title\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"{\\\"version\\\":\\\"1.0.0\\\",\\\"content\\\":\\\"{\\\\\\\"Column1\\\\\\\": \\\\\\\"{Tab7Percent}\\\\\\\", \\\\\\\"Column2\\\\\\\": \\\\\\\"Percent of successful checks\\\\\\\"}\\\",\\\"transformers\\\":null}\",\n \"size\": 3,\n \"queryType\": 8,\n \"visualization\": \"tiles\",\n \"tileSettings\": {\n \"titleContent\": {\n \"columnMatch\": \"Column1\",\n \"formatter\": 4,\n \"formatOptions\": {\n \"min\": 0,\n \"max\": 100,\n \"palette\": \"redGreen\"\n },\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n \"subtitleContent\": {\n \"columnMatch\": \"Column2\"\n },\n \"showBorder\": true\n }\n },\n \"customWidth\": \"50\",\n \"name\": \"TabPercentTile\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"Use IP addresses from the address allocation ranges for private internets (RFC 1918). Check [this link](https://learn.microsoft.com/azure/cloud-adoption-framework/ready/azure-best-practices/plan-for-ip-addressing) for further information.. [This training](https://learn.microsoft.com/learn/paths/architect-network-infrastructure/) can help to educate yourself on this.\"\n },\n \"name\": \"querytext4\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"resources | where type == 'microsoft.network/virtualnetworks' | extend addressSpace = todynamic(properties.addressSpace) | extend addressPrefix = todynamic(properties.addressSpace.addressPrefixes) | mvexpand addressSpace | mvexpand addressPrefix | project name, id, location, resourceGroup, subscriptionId, cidr = addressPrefix | extend compliant = (cidr matches regex @'^(10\\\\.|172\\\\.(1[6-9]|2[0-9]|3[01])\\\\.|192\\\\.168\\\\.)') | project id, compliant, cidr | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed\",\n \"size\": 4,\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"gridSettings\": {\n \"formatters\": [\n {\n \"columnMatch\": \"id\",\n \"formatter\": 0,\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n {\n \"columnMatch\": \"compliant\",\n \"formatter\": 18,\n \"formatOptions\": {\n \"thresholdsOptions\": \"icons\",\n \"thresholdsGrid\": [\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"1\",\n \"representation\": \"success\",\n \"text\": \"Success\"\n },\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"0\",\n \"representation\": \"failed\",\n \"text\": \"Failed\"\n },\n {\n \"operator\": \"Default\",\n \"thresholdValue\": null,\n \"representation\": \"unknown\",\n \"text\": \"Unknown\"\n }\n ]\n }\n }\n ]\n }\n },\n \"name\": \"query4\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"Ensure that IP address space isn't wasted, don't create unnecessarily large virtual networks (for example /16). Check [this link](https://learn.microsoft.com/azure/cloud-adoption-framework/ready/azure-best-practices/plan-for-ip-addressing) for further information.. [This training](https://learn.microsoft.com/learn/paths/architect-network-infrastructure/) can help to educate yourself on this.\"\n },\n \"name\": \"querytext5\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"resources | where type == 'microsoft.network/virtualnetworks' | extend addressSpace = todynamic(properties.addressSpace) | extend addressPrefix = todynamic(properties.addressSpace.addressPrefixes) | mvexpand addressSpace | mvexpand addressPrefix | extend addressMask = split(addressPrefix,'/')[1] | extend compliant = addressMask > 16 | project name, id, subscriptionId, resourceGroup, addressPrefix, compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed\",\n \"size\": 4,\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"gridSettings\": {\n \"formatters\": [\n {\n \"columnMatch\": \"id\",\n \"formatter\": 0,\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n {\n \"columnMatch\": \"compliant\",\n \"formatter\": 18,\n \"formatOptions\": {\n \"thresholdsOptions\": \"icons\",\n \"thresholdsGrid\": [\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"1\",\n \"representation\": \"success\",\n \"text\": \"Success\"\n },\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"0\",\n \"representation\": \"failed\",\n \"text\": \"Failed\"\n },\n {\n \"operator\": \"Default\",\n \"thresholdValue\": null,\n \"representation\": \"unknown\",\n \"text\": \"Unknown\"\n }\n ]\n }\n }\n ]\n }\n },\n \"name\": \"query5\"\n }\n ]\n },\n \"conditionalVisibility\": {\n \"parameterName\": \"VisibleTab\",\n \"comparison\": \"isEqualTo\",\n \"value\": \"tab7\"\n },\n \"name\": \"tab7\"\n }\n ],\n \"$schema\": \"https://github.com/Microsoft/Application-Insights-Workbooks/blob/master/schema/workbook.json\"\n}", "version": "1.0", "sourceId": "[parameters('workbookSourceId')]", "category": "[parameters('workbookType')]" diff --git a/workbooks/alz_checklist.en_network_workbook.json b/workbooks/alz_checklist.en_network_workbook.json index 3ac5b5820..ca9a8aaf7 100644 --- a/workbooks/alz_checklist.en_network_workbook.json +++ b/workbooks/alz_checklist.en_network_workbook.json @@ -70,34 +70,34 @@ "style": "tabs", "links": [ { - "id": "724a6206-8fa8-47bb-8a6f-36ad0b9602f1", + "id": "87a147f8-995c-4a70-a074-7adb8e7edea5", "cellValue": "VisibleTab", "linkTarget": "parameter", - "linkLabel": "PaaS", + "linkLabel": "IP plan", "subTarget": "tab0", - "preText": "PaaS", + "preText": "IP plan", "style": "primary" }, { - "id": "e35a272b-0003-45e3-9785-dcaa314cfe51", + "id": "8856bd09-4876-45f8-92b7-394da81de578", "cellValue": "VisibleTab", "linkTarget": "parameter", - "linkLabel": "IP plan", + "linkLabel": "Hub and spoke", "subTarget": "tab1", - "preText": "IP plan", + "preText": "Hub and spoke", "style": "primary" }, { - "id": "ddbef687-4ed9-46bf-b9ae-6179249e4bf8", + "id": "c9767a8e-b7e6-4f0b-beed-3ec653839908", "cellValue": "VisibleTab", "linkTarget": "parameter", - "linkLabel": "Internet", + "linkLabel": "Segmentation", "subTarget": "tab2", - "preText": "Internet", + "preText": "Segmentation", "style": "primary" }, { - "id": "d7eca0df-b9ff-4125-a232-1f86168676e8", + "id": "be0e92d2-cad0-4085-965a-f47e82a6d204", "cellValue": "VisibleTab", "linkTarget": "parameter", "linkLabel": "Virtual WAN", @@ -106,39 +106,39 @@ "style": "primary" }, { - "id": "ad29c45d-0bf8-4740-aaab-6d2d5095fe66", + "id": "8b83300e-51ba-4c2b-bd93-0ec0396c329d", "cellValue": "VisibleTab", "linkTarget": "parameter", - "linkLabel": "Segmentation", + "linkLabel": "Hybrid", "subTarget": "tab4", - "preText": "Segmentation", + "preText": "Hybrid", "style": "primary" }, { - "id": "582857c2-778c-4bcd-a34e-ebd3f5292e47", + "id": "a93e1629-85aa-4ed9-9c69-7562e844e762", "cellValue": "VisibleTab", "linkTarget": "parameter", - "linkLabel": "Hub and spoke", + "linkLabel": "Firewall", "subTarget": "tab5", - "preText": "Hub and spoke", + "preText": "Firewall", "style": "primary" }, { - "id": "c61cf934-abcf-4b10-9861-b1b13a1b5a89", + "id": "cb3b9213-cc5c-430a-a4fe-f0e90fce0aa8", "cellValue": "VisibleTab", "linkTarget": "parameter", - "linkLabel": "Firewall", + "linkLabel": "PaaS", "subTarget": "tab6", - "preText": "Firewall", + "preText": "PaaS", "style": "primary" }, { - "id": "281a8b23-6cdc-4616-acc5-e84fef3a06f2", + "id": "9f04eca6-37f9-4ffe-b646-e9fd67e1281d", "cellValue": "VisibleTab", "linkTarget": "parameter", - "linkLabel": "Hybrid", + "linkLabel": "Internet", "subTarget": "tab7", - "preText": "Hybrid", + "preText": "Internet", "style": "primary" } ] @@ -154,22 +154,22 @@ { "type": 1, "content": { - "json": "## PaaS" + "json": "## IP plan" }, "name": "tab0title" }, { "type": 1, "content": { - "json": "Don't enable virtual network service endpoints by default on all subnets. Check [this link](https://learn.microsoft.com/azure/virtual-network/virtual-network-service-endpoints-overview) for further information.. [This training](https://learn.microsoft.com/learn/paths/implement-network-security/?source=learn) can help to educate yourself on this." + "json": "Use IP addresses from the address allocation ranges for private internets (RFC 1918). Check [this link](https://learn.microsoft.com/azure/cloud-adoption-framework/ready/azure-best-practices/plan-for-ip-addressing) for further information.. [This training](https://learn.microsoft.com/learn/paths/architect-network-infrastructure/) can help to educate yourself on this." }, - "name": "querytext20" + "name": "querytext4" }, { "type": 3, "content": { "version": "KqlItem/1.0", - "query": "resources | where type =~ 'microsoft.network/virtualnetworks' | project id,resourceGroup,name,subnets = properties.subnets | mv-expand subnets | project id = subnets.id, resourceGroup, VNet = name, serviceEndpoints = subnets.properties.serviceEndpoints, compliant = (isnull(subnets.properties.serviceEndpoints) or array_length(subnets.properties.serviceEndpoints) == 0) | order by compliant asc | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed", + "query": "resources | where type == 'microsoft.network/virtualnetworks' | extend addressSpace = todynamic(properties.addressSpace) | extend addressPrefix = todynamic(properties.addressSpace.addressPrefixes) | mvexpand addressSpace | mvexpand addressPrefix | project name, id, location, resourceGroup, subscriptionId, cidr = addressPrefix | extend compliant = (cidr matches regex @'^(10\\.|172\\.(1[6-9]|2[0-9]|3[01])\\.|192\\.168\\.)') | project id, compliant, cidr | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed", "size": 0, "queryType": 1, "resourceType": "microsoft.resourcegraph/resources", @@ -218,7 +218,69 @@ ] } }, - "name": "query20" + "name": "query4" + }, + { + "type": 1, + "content": { + "json": "Ensure that IP address space isn't wasted, don't create unnecessarily large virtual networks (for example /16). Check [this link](https://learn.microsoft.com/azure/cloud-adoption-framework/ready/azure-best-practices/plan-for-ip-addressing) for further information.. [This training](https://learn.microsoft.com/learn/paths/architect-network-infrastructure/) can help to educate yourself on this." + }, + "name": "querytext5" + }, + { + "type": 3, + "content": { + "version": "KqlItem/1.0", + "query": "resources | where type == 'microsoft.network/virtualnetworks' | extend addressSpace = todynamic(properties.addressSpace) | extend addressPrefix = todynamic(properties.addressSpace.addressPrefixes) | mvexpand addressSpace | mvexpand addressPrefix | extend addressMask = split(addressPrefix,'/')[1] | extend compliant = addressMask > 16 | project name, id, subscriptionId, resourceGroup, addressPrefix, compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed", + "size": 0, + "queryType": 1, + "resourceType": "microsoft.resourcegraph/resources", + "crossComponentResources": [ + "{Subscription}" + ], + "gridSettings": { + "formatters": [ + { + "columnMatch": "id", + "formatter": 0, + "numberFormat": { + "unit": 0, + "options": { + "style": "decimal" + } + } + }, + { + "columnMatch": "compliant", + "formatter": 18, + "formatOptions": { + "thresholdsOptions": "icons", + "thresholdsGrid": [ + { + "operator": "==", + "thresholdValue": "1", + "representation": "success", + "text": "Success" + }, + { + "operator": "==", + "thresholdValue": "0", + "representation": "failed", + "text": "Failed" + }, + { + "operator": "Default", + "thresholdValue": null, + "representation": "unknown", + "text": "Unknown" + } + ] + } + } + ] + } + }, + "name": "query5" } ] }, @@ -238,22 +300,22 @@ { "type": 1, "content": { - "json": "## IP plan" + "json": "## Hub and spoke" }, "name": "tab1title" }, { "type": 1, "content": { - "json": "Use IP addresses from the address allocation ranges for private internets (RFC 1918). Check [this link](https://learn.microsoft.com/azure/cloud-adoption-framework/ready/azure-best-practices/plan-for-ip-addressing) for further information.. [This training](https://learn.microsoft.com/learn/paths/architect-network-infrastructure/) can help to educate yourself on this." + "json": "If using Route Server, use a /27 prefix for the Route Server subnet. Check [this link](https://learn.microsoft.com/azure/route-server/quickstart-configure-route-server-portal#create-a-route-server-1) for further information.. [This training](https://learn.microsoft.com/training/modules/intro-to-azure-route-server/) can help to educate yourself on this." }, - "name": "querytext4" + "name": "querytext0" }, { "type": 3, "content": { "version": "KqlItem/1.0", - "query": "resources | where type == 'microsoft.network/virtualnetworks' | extend addressSpace = todynamic(properties.addressSpace) | extend addressPrefix = todynamic(properties.addressSpace.addressPrefixes) | mvexpand addressSpace | mvexpand addressPrefix | project name, id, location, resourceGroup, subscriptionId, cidr = addressPrefix | extend compliant = (cidr matches regex @'^(10\\.|172\\.(1[6-9]|2[0-9]|3[01])\\.|192\\.168\\.)') | project id, compliant, cidr | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed", + "query": "resources | where type=='microsoft.network/virtualnetworks' | project id,subnets=properties.subnets | mv-expand subnets | project id, subnetName = subnets.name, subnetPrefix = subnets.properties.addressPrefix | extend subnetPrefixLength = split(subnetPrefix, '/')[1] | where subnetName == 'RouteServerSubnet' | extend compliant = (subnetPrefixLength <= 27) | distinct id, compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed", "size": 0, "queryType": 1, "resourceType": "microsoft.resourcegraph/resources", @@ -302,20 +364,20 @@ ] } }, - "name": "query4" + "name": "query0" }, { "type": 1, "content": { - "json": "Ensure that IP address space isn't wasted, don't create unnecessarily large virtual networks (for example /16). Check [this link](https://learn.microsoft.com/azure/cloud-adoption-framework/ready/azure-best-practices/plan-for-ip-addressing) for further information.. [This training](https://learn.microsoft.com/learn/paths/architect-network-infrastructure/) can help to educate yourself on this." + "json": "If you have more than 400 spoke networks in a region, deploy an additional hub to bypass VNet peering limits (500) and the maximum number of prefixes that can be advertised via ExpressRoute (1000). Check [this link](https://learn.microsoft.com/azure/azure-resource-manager/management/azure-subscription-service-limits?toc=/azure/virtual-network/toc.json#azure-resource-manager-virtual-networking-limits) for further information.. [This training](https://learn.microsoft.com/training/modules/hub-and-spoke-network-architecture/) can help to educate yourself on this." }, - "name": "querytext5" + "name": "querytext1" }, { "type": 3, "content": { "version": "KqlItem/1.0", - "query": "resources | where type == 'microsoft.network/virtualnetworks' | extend addressSpace = todynamic(properties.addressSpace) | extend addressPrefix = todynamic(properties.addressSpace.addressPrefixes) | mvexpand addressSpace | mvexpand addressPrefix | extend addressMask = split(addressPrefix,'/')[1] | extend compliant = addressMask > 16 | project name, id, subscriptionId, resourceGroup, addressPrefix, compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed", + "query": "resources | where type == 'microsoft.network/virtualnetworks' | mvexpand properties.virtualNetworkPeerings | summarize peeringcount = count() by id | extend compliant = (peeringcount < 450) | distinct id,compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed", "size": 0, "queryType": 1, "resourceType": "microsoft.resourcegraph/resources", @@ -364,42 +426,20 @@ ] } }, - "name": "query5" - } - ] - }, - "conditionalVisibility": { - "parameterName": "VisibleTab", - "comparison": "isEqualTo", - "value": "tab1" - }, - "name": "tab1" - }, - { - "type": 12, - "content": { - "version": "NotebookGroup/1.0", - "groupType": "editable", - "items": [ - { - "type": 1, - "content": { - "json": "## Internet" - }, - "name": "tab2title" + "name": "query1" }, { "type": 1, "content": { - "json": "Use Azure Bastion in a subnet /26 or larger. Check [this link](https://learn.microsoft.com/azure/bastion/bastion-faq#subnet) for further information." + "json": "Limit the number of routes per route table to 400. Check [this link](https://learn.microsoft.com/azure/azure-resource-manager/management/azure-subscription-service-limits?toc=/azure/virtual-network/toc.json#azure-resource-manager-virtual-networking-limits) for further information.. [This training](https://learn.microsoft.com/training/modules/hub-and-spoke-network-architecture/) can help to educate yourself on this." }, - "name": "querytext6" + "name": "querytext2" }, { "type": 3, "content": { "version": "KqlItem/1.0", - "query": "resources | where type=='microsoft.network/virtualnetworks' | project id,subnets=properties.subnets | mv-expand subnets | project id, subnetName = subnets.name, subnetPrefix = subnets.properties.addressPrefix | extend subnetPrefixLength = split(subnetPrefix, '/')[1] | where subnetName == 'AzureBastionSubnet' | extend compliant = (subnetPrefixLength <= 26) | distinct id, compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed", + "query": "resources | where type=='microsoft.network/routetables' | mvexpand properties.routes | summarize routeCount = count() by id | extend compliant = (routeCount < 360) | distinct id,compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed", "size": 0, "queryType": 1, "resourceType": "microsoft.resourcegraph/resources", @@ -448,42 +488,20 @@ ] } }, - "name": "query6" - } - ] - }, - "conditionalVisibility": { - "parameterName": "VisibleTab", - "comparison": "isEqualTo", - "value": "tab2" - }, - "name": "tab2" - }, - { - "type": 12, - "content": { - "version": "NotebookGroup/1.0", - "groupType": "editable", - "items": [ - { - "type": 1, - "content": { - "json": "## Virtual WAN" - }, - "name": "tab3title" + "name": "query2" }, { "type": 1, "content": { - "json": "For outbound Internet traffic protection and filtering, deploy Azure Firewall in secured hubs. Check [this link](https://learn.microsoft.com/azure/virtual-wan/howto-firewall) for further information.. [This training](https://learn.microsoft.com/learn/paths/secure-networking-infrastructure/) can help to educate yourself on this." + "json": "Use the setting 'Allow traffic to remote virtual network' when configuring VNet peerings. Check [this link](https://learn.microsoft.com/azure/virtual-network/virtual-network-manage-peering) for further information.. [This training](https://learn.microsoft.com/training/modules/hub-and-spoke-network-architecture/) can help to educate yourself on this." }, - "name": "querytext24" + "name": "querytext3" }, { "type": 3, "content": { "version": "KqlItem/1.0", - "query": "resources | where type=='microsoft.network/virtualhubs' | extend compliant = isnotnull(properties.azureFirewall.id) | project id, compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed", + "query": "resources | where type == 'microsoft.network/virtualnetworks' | mvexpand properties.virtualNetworkPeerings | project id, peeringName=properties_virtualNetworkPeerings.name, compliant = (properties_virtualNetworkPeerings.properties.allowVirtualNetworkAccess == True) | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed", "size": 0, "queryType": 1, "resourceType": "microsoft.resourcegraph/resources", @@ -532,16 +550,16 @@ ] } }, - "name": "query24" + "name": "query3" } ] }, "conditionalVisibility": { "parameterName": "VisibleTab", "comparison": "isEqualTo", - "value": "tab3" + "value": "tab1" }, - "name": "tab3" + "name": "tab1" }, { "type": 12, @@ -554,12 +572,12 @@ "content": { "json": "## Segmentation" }, - "name": "tab4title" + "name": "tab2title" }, { "type": 1, "content": { - "json": "Use a /26 prefix for your Azure Firewall subnets. Check [this link](https://learn.microsoft.com/azure/firewall/firewall-faq#why-does-azure-firewall-need-a--26-subnet-size) for further information." + "json": "Use a /26 prefix for your Azure Firewall subnets. Check [this link](https://learn.microsoft.com/azure/firewall/firewall-faq#why-does-azure-firewall-need-a--26-subnet-size) for further information.. [This training](https://learn.microsoft.com/training/modules/introduction-azure-firewall/) can help to educate yourself on this." }, "name": "querytext19" }, @@ -809,9 +827,9 @@ "conditionalVisibility": { "parameterName": "VisibleTab", "comparison": "isEqualTo", - "value": "tab4" + "value": "tab2" }, - "name": "tab4" + "name": "tab2" }, { "type": 12, @@ -822,22 +840,22 @@ { "type": 1, "content": { - "json": "## Hub and spoke" + "json": "## Virtual WAN" }, - "name": "tab5title" + "name": "tab3title" }, { "type": 1, "content": { - "json": "If using Route Server, use a /27 prefix for the Route Server subnet. Check [this link](https://learn.microsoft.com/azure/route-server/quickstart-configure-route-server-portal#create-a-route-server-1) for further information." + "json": "For outbound Internet traffic protection and filtering, deploy Azure Firewall in secured hubs. Check [this link](https://learn.microsoft.com/azure/virtual-wan/howto-firewall) for further information.. [This training](https://learn.microsoft.com/learn/paths/secure-networking-infrastructure/) can help to educate yourself on this." }, - "name": "querytext0" + "name": "querytext24" }, { "type": 3, "content": { "version": "KqlItem/1.0", - "query": "resources | where type=='microsoft.network/virtualnetworks' | project id,subnets=properties.subnets | mv-expand subnets | project id, subnetName = subnets.name, subnetPrefix = subnets.properties.addressPrefix | extend subnetPrefixLength = split(subnetPrefix, '/')[1] | where subnetName == 'RouteServerSubnet' | extend compliant = (subnetPrefixLength <= 27) | distinct id, compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed", + "query": "resources | where type=='microsoft.network/virtualhubs' | extend compliant = isnotnull(properties.azureFirewall.id) | project id, compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed", "size": 0, "queryType": 1, "resourceType": "microsoft.resourcegraph/resources", @@ -886,82 +904,42 @@ ] } }, - "name": "query0" - }, + "name": "query24" + } + ] + }, + "conditionalVisibility": { + "parameterName": "VisibleTab", + "comparison": "isEqualTo", + "value": "tab3" + }, + "name": "tab3" + }, + { + "type": 12, + "content": { + "version": "NotebookGroup/1.0", + "groupType": "editable", + "items": [ { "type": 1, "content": { - "json": "If you have more than 400 spoke networks in a region, deploy an additional hub to bypass VNet peering limits (500) and the maximum number of prefixes that can be advertised via ExpressRoute (1000). Check [this link](https://learn.microsoft.com/azure/azure-resource-manager/management/azure-subscription-service-limits?toc=/azure/virtual-network/toc.json#azure-resource-manager-virtual-networking-limits) for further information." - }, - "name": "querytext1" - }, - { - "type": 3, - "content": { - "version": "KqlItem/1.0", - "query": "resources | where type == 'microsoft.network/virtualnetworks' | mvexpand properties.virtualNetworkPeerings | summarize peeringcount = count() by id | extend compliant = (peeringcount < 450) | distinct id,compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed", - "size": 0, - "queryType": 1, - "resourceType": "microsoft.resourcegraph/resources", - "crossComponentResources": [ - "{Subscription}" - ], - "gridSettings": { - "formatters": [ - { - "columnMatch": "id", - "formatter": 0, - "numberFormat": { - "unit": 0, - "options": { - "style": "decimal" - } - } - }, - { - "columnMatch": "compliant", - "formatter": 18, - "formatOptions": { - "thresholdsOptions": "icons", - "thresholdsGrid": [ - { - "operator": "==", - "thresholdValue": "1", - "representation": "success", - "text": "Success" - }, - { - "operator": "==", - "thresholdValue": "0", - "representation": "failed", - "text": "Failed" - }, - { - "operator": "Default", - "thresholdValue": null, - "representation": "unknown", - "text": "Unknown" - } - ] - } - } - ] - } + "json": "## Hybrid" }, - "name": "query1" + "name": "tab4title" }, { "type": 1, "content": { - "json": "Limit the number of routes per route table to 400. Check [this link](https://learn.microsoft.com/azure/azure-resource-manager/management/azure-subscription-service-limits?toc=/azure/virtual-network/toc.json#azure-resource-manager-virtual-networking-limits) for further information." + "json": "Select the right SKU for the ExpressRoute/VPN gateways based on bandwidth and performance requirements. Check [this link](https://learn.microsoft.com/azure/expressroute/expressroute-about-virtual-network-gateways?source=recommendations#gwsku) for further information.. [This training](https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/) can help to educate yourself on this." }, - "name": "querytext2" + "name": "querytext7" }, { "type": 3, "content": { "version": "KqlItem/1.0", - "query": "resources | where type=='microsoft.network/routetables' | mvexpand properties.routes | summarize routeCount = count() by id | extend compliant = (routeCount < 360) | distinct id,compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed", + "query": "resources| where type == 'microsoft.network/virtualnetworkgateways'| where properties.gatewayType =~ 'vpn' or properties.gatewayType == 'ExpressRoute'| extend SKUName = properties.sku.name, SKUTier = properties.sku.tier, Type = properties.gatewayType| extend compliant = SKUTier !in ('Basic', 'Standard')| project name, id, subscriptionId, resourceGroup, compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed", "size": 0, "queryType": 1, "resourceType": "microsoft.resourcegraph/resources", @@ -1010,20 +988,20 @@ ] } }, - "name": "query2" + "name": "query7" }, { "type": 1, "content": { - "json": "Use the setting 'Allow traffic to remote virtual network' when configuring VNet peerings. Check [this link](https://learn.microsoft.com/azure/virtual-network/virtual-network-manage-peering) for further information." + "json": "Ensure that you're using unlimited-data ExpressRoute circuits only if you reach the bandwidth that justifies their cost. Check [this link](https://learn.microsoft.com/azure/expressroute/plan-manage-cost) for further information.. [This training](https://learn.microsoft.com/training/modules/design-implement-azure-expressroute/) can help to educate yourself on this." }, - "name": "querytext3" + "name": "querytext8" }, { "type": 3, "content": { "version": "KqlItem/1.0", - "query": "resources | where type == 'microsoft.network/virtualnetworks' | mvexpand properties.virtualNetworkPeerings | project id, peeringName=properties_virtualNetworkPeerings.name, compliant = (properties_virtualNetworkPeerings.properties.allowVirtualNetworkAccess == True) | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed", + "query": "resources | where type=='microsoft.network/expressroutecircuits' | extend compliant = (tolower(sku.family) == 'metereddata' or tolower(sku.tier) == 'local') | distinct id,compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed", "size": 0, "queryType": 1, "resourceType": "microsoft.resourcegraph/resources", @@ -1072,42 +1050,20 @@ ] } }, - "name": "query3" - } - ] - }, - "conditionalVisibility": { - "parameterName": "VisibleTab", - "comparison": "isEqualTo", - "value": "tab5" - }, - "name": "tab5" - }, - { - "type": 12, - "content": { - "version": "NotebookGroup/1.0", - "groupType": "editable", - "items": [ - { - "type": 1, - "content": { - "json": "## Firewall" - }, - "name": "tab6title" + "name": "query8" }, { "type": 1, "content": { - "json": "Use application rules to filter outbound traffic on destination host name for supported protocols. Use FQDN-based network rules and Azure Firewall with DNS proxy to filter egress traffic to the Internet over other protocols. Check [this link](https://learn.microsoft.com/azure/firewall/fqdn-filtering-network-rules) for further information." + "json": "Leverage the Local SKU of ExpressRoute to reduce the cost of your circuits, if your circuit peering location supports your Azure regions for the Local SKU. Check [this link](https://learn.microsoft.com/azure/expressroute/expressroute-faqs#expressroute-local) for further information.. [This training](https://learn.microsoft.com/training/modules/design-implement-azure-expressroute/) can help to educate yourself on this." }, - "name": "querytext14" + "name": "querytext9" }, { "type": 3, "content": { "version": "KqlItem/1.0", - "query": "resources | where type=='microsoft.network/firewallpolicies' | extend compliant = (properties.dnsSettings.enableProxy == true) | distinct id,compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed", + "query": "resources | where type=='microsoft.network/connections' | where properties.connectionType == 'ExpressRoute' | project id, gwid=tostring(properties.virtualNetworkGateway1.id), circuitid=tostring(properties.peer.id) | join (resources | where type=='microsoft.network/expressroutecircuits' | project circuitid=tostring(id), circuitsku=sku.tier) on circuitid | project id=gwid, compliant = (circuitsku == 'Local') | summarize compliant=max(compliant) by id | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed", "size": 0, "queryType": 1, "resourceType": "microsoft.resourcegraph/resources", @@ -1156,20 +1112,20 @@ ] } }, - "name": "query14" + "name": "query9" }, { "type": 1, "content": { - "json": "Use Azure Firewall Premium to enable additional security features. Check [this link](https://learn.microsoft.com/azure/firewall/premium-features) for further information." + "json": "Deploy a zone-redundant ExpressRoute gateway in the supported Azure regions. Check [this link](https://learn.microsoft.com/azure/expressroute/expressroute-about-virtual-network-gateways) for further information.. [This training](https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/) can help to educate yourself on this." }, - "name": "querytext15" + "name": "querytext10" }, { "type": 3, "content": { "version": "KqlItem/1.0", - "query": "resources | where type=='microsoft.network/firewallpolicies' | extend compliant = (properties.sku.tier == 'Premium') | distinct id,compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed", + "query": "resources| where type == 'microsoft.network/virtualnetworkgateways'| where properties.gatewayType =~ 'vpn' or properties.gatewayType == 'ExpressRoute'| extend SKUName = properties.sku.name, SKUTier = properties.sku.tier, Type = properties.gatewayType| extend compliant = SKUTier contains 'AZ'| project name, id, subscriptionId, resourceGroup, Type, compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed", "size": 0, "queryType": 1, "resourceType": "microsoft.resourcegraph/resources", @@ -1218,20 +1174,20 @@ ] } }, - "name": "query15" + "name": "query10" }, { "type": 1, "content": { - "json": "Configure Azure Firewall Threat Intelligence mode to Alert and Deny for additional protection. Check [this link](https://learn.microsoft.com/azure/firewall/premium-features#idps-signature-rules) for further information." + "json": "Use zone-redundant VPN gateways to connect branches or remote locations to Azure (where available). Check [this link](https://learn.microsoft.com/azure/vpn-gateway/create-zone-redundant-vnet-gateway) for further information.. [This training](https://learn.microsoft.com/training/modules/intro-to-azure-vpn-gateway/) can help to educate yourself on this." }, - "name": "querytext16" + "name": "querytext11" }, { "type": 3, "content": { "version": "KqlItem/1.0", - "query": "resources | where type=='microsoft.network/firewallpolicies' | extend compliant = (properties.threatIntelMode == 'Deny') | distinct id,compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed", + "query": "resources | where type=='microsoft.network/virtualnetworkgateways' | where properties.gatewayType == 'Vpn' | extend compliant = (tolower(properties.sku.name) contains 'az') | distinct id, compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed", "size": 0, "queryType": 1, "resourceType": "microsoft.resourcegraph/resources", @@ -1280,20 +1236,20 @@ ] } }, - "name": "query16" + "name": "query11" }, { "type": 1, "content": { - "json": "Configure Azure Firewall IDPS mode to Deny for additional protection. Check [this link](https://learn.microsoft.com/azure/firewall/premium-features#idps) for further information." + "json": "Use ExpressRoute circuits from different peering locations for redundancy. Check [this link](https://learn.microsoft.com/azure/expressroute/designing-for-disaster-recovery-with-expressroute-privatepeering#need-for-redundant-connectivity-solution) for further information.. [This training](https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/) can help to educate yourself on this." }, - "name": "querytext17" + "name": "querytext12" }, { "type": 3, "content": { "version": "KqlItem/1.0", - "query": "resources | where type=='microsoft.network/firewallpolicies' | extend compliant = (properties.intrusionDetection.mode == 'Deny') | project id, compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed", + "query": "resources | where type=='microsoft.network/connections' | where properties.connectionType == 'ExpressRoute' | project cxId=id, gwId=tostring(properties.virtualNetworkGateway1.id), circuitId=tostring(properties.peer.id) | join (resources | where type=='microsoft.network/expressroutecircuits' | project circuitId=tostring(id), circuitLocation=tostring(properties.serviceProviderProperties.peeringLocation)) on circuitId | distinct gwId, circuitLocation | summarize countErLocations=count() by id=gwId | extend compliant = (countErLocations >= 2) | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed", "size": 0, "queryType": 1, "resourceType": "microsoft.resourcegraph/resources", @@ -1342,20 +1298,20 @@ ] } }, - "name": "query17" + "name": "query12" }, { "type": 1, "content": { - "json": "For subnets in VNets not connected to Virtual WAN, attach a route table so that Internet traffic is redirected to Azure Firewall or a Network Virtual Appliance. Check [this link](https://learn.microsoft.com/azure/virtual-network/virtual-networks-udr-overview) for further information." + "json": "If you are using a route table in the GatewaySubnet, make sure that gateway routes are propagated. Check [this link](https://learn.microsoft.com/azure/vpn-gateway/vpn-gateway-about-vpn-gateway-settings#gwsub) for further information." }, - "name": "querytext18" + "name": "querytext13" }, { "type": 3, "content": { "version": "KqlItem/1.0", - "query": "resources | where type=='microsoft.network/virtualnetworks' | project id,resourceGroup,name,subnets=properties.subnets | mv-expand subnets | project id,name,subnetId=tostring(subnets.id), subnetName=tostring(subnets.name),subnetRT=subnets.properties.routeTable.id | where not (subnetName in ('GatewaySubnet', 'AzureFirewallSubnet', 'RouteServerSubnet', 'AzureBastionSubnet')) | extend hasRT = isnotnull(subnetRT) | distinct id, hasRT, subnetId | join kind=fullouter (resources | where type == 'microsoft.network/virtualnetworks' | mvexpand properties.virtualNetworkPeerings | extend isVWAN=(tolower(split(properties_virtualNetworkPeerings.name, '_')[0]) == 'remotevnettohubpeering') | mv-expand properties.subnets | project id, isVWAN, name, subnetId=tostring(properties_subnets.id), subnetName=tostring(properties_subnets.name) | summarize PeeredToVWAN=max(isVWAN) by id, subnetId | project id, subnetId, isVWANpeer = (PeeredToVWAN == true)) on subnetId | project id=iff(isnotempty(id), id, id1), subnetId=iff(isnotempty(subnetId), subnetId, subnetId1), hasRT, isVWANpeer | extend compliant = (hasRT==true or isVWANpeer==true) | distinct id, subnetId, compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed", + "query": "resources | where type=='microsoft.network/virtualnetworks' | project id,resourceGroup,name,subnets=properties.subnets | mv-expand subnets | project id,resourceGroup,name,subnetName=tostring(subnets.name),routeTableId=tostring(subnets.properties.routeTable.id) | where subnetName == 'GatewaySubnet' | join kind=leftouter (Resources | where type == 'microsoft.network/routetables' | project routeTableName=name,routeTableId=id, disableBgpRoutePropagation=properties.disableBgpRoutePropagation) on routeTableId | project id,compliant = (disableBgpRoutePropagation == False or isnull(disableBgpRoutePropagation)) | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed", "size": 0, "queryType": 1, "resourceType": "microsoft.resourcegraph/resources", @@ -1404,16 +1360,16 @@ ] } }, - "name": "query18" + "name": "query13" } ] }, "conditionalVisibility": { "parameterName": "VisibleTab", "comparison": "isEqualTo", - "value": "tab6" + "value": "tab4" }, - "name": "tab6" + "name": "tab4" }, { "type": 12, @@ -1424,22 +1380,22 @@ { "type": 1, "content": { - "json": "## Hybrid" + "json": "## Firewall" }, - "name": "tab7title" + "name": "tab5title" }, { "type": 1, "content": { - "json": "Select the right SKU for the ExpressRoute/VPN gateways based on bandwidth and performance requirements. Check [this link](https://learn.microsoft.com/azure/expressroute/expressroute-about-virtual-network-gateways?source=recommendations#gwsku) for further information.. [This training](https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/) can help to educate yourself on this." + "json": "Use application rules to filter outbound traffic on destination host name for supported protocols. Use FQDN-based network rules and Azure Firewall with DNS proxy to filter egress traffic to the Internet over other protocols. Check [this link](https://learn.microsoft.com/azure/firewall/fqdn-filtering-network-rules) for further information.. [This training](https://learn.microsoft.com/learn/paths/secure-networking-infrastructure/) can help to educate yourself on this." }, - "name": "querytext7" + "name": "querytext14" }, { "type": 3, "content": { "version": "KqlItem/1.0", - "query": "resources| where type == 'microsoft.network/virtualnetworkgateways'| where properties.gatewayType =~ 'vpn' or properties.gatewayType == 'ExpressRoute'| extend SKUName = properties.sku.name, SKUTier = properties.sku.tier, Type = properties.gatewayType| extend compliant = SKUTier !in ('Basic', 'Standard')| project name, id, subscriptionId, resourceGroup, compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed", + "query": "resources | where type=='microsoft.network/firewallpolicies' | extend compliant = (properties.dnsSettings.enableProxy == true) | distinct id,compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed", "size": 0, "queryType": 1, "resourceType": "microsoft.resourcegraph/resources", @@ -1488,20 +1444,20 @@ ] } }, - "name": "query7" + "name": "query14" }, { "type": 1, "content": { - "json": "Ensure that you're using unlimited-data ExpressRoute circuits only if you reach the bandwidth that justifies their cost. Check [this link](https://learn.microsoft.com/azure/expressroute/plan-manage-cost) for further information." + "json": "Use Azure Firewall Premium to enable additional security features. Check [this link](https://learn.microsoft.com/azure/firewall/premium-features) for further information.. [This training](https://learn.microsoft.com/training/modules/introduction-azure-firewall/) can help to educate yourself on this." }, - "name": "querytext8" + "name": "querytext15" }, { "type": 3, "content": { "version": "KqlItem/1.0", - "query": "resources | where type=='microsoft.network/expressroutecircuits' | extend compliant = (tolower(sku.family) == 'metereddata' or tolower(sku.tier) == 'local') | distinct id,compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed", + "query": "resources | where type=='microsoft.network/firewallpolicies' | extend compliant = (properties.sku.tier == 'Premium') | distinct id,compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed", "size": 0, "queryType": 1, "resourceType": "microsoft.resourcegraph/resources", @@ -1550,20 +1506,20 @@ ] } }, - "name": "query8" + "name": "query15" }, { "type": 1, "content": { - "json": "Leverage the Local SKU of ExpressRoute to reduce the cost of your circuits, if your circuit peering location supports your Azure regions for the Local SKU. Check [this link](https://learn.microsoft.com/azure/expressroute/expressroute-faqs#expressroute-local) for further information." + "json": "Configure Azure Firewall Threat Intelligence mode to Alert and Deny for additional protection. Check [this link](https://learn.microsoft.com/azure/firewall/premium-features#idps-signature-rules) for further information." }, - "name": "querytext9" + "name": "querytext16" }, { "type": 3, "content": { "version": "KqlItem/1.0", - "query": "resources | where type=='microsoft.network/connections' | where properties.connectionType == 'ExpressRoute' | project id, gwid=tostring(properties.virtualNetworkGateway1.id), circuitid=tostring(properties.peer.id) | join (resources | where type=='microsoft.network/expressroutecircuits' | project circuitid=tostring(id), circuitsku=sku.tier) on circuitid | project id=gwid, compliant = (circuitsku == 'Local') | summarize compliant=max(compliant) by id | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed", + "query": "resources | where type=='microsoft.network/firewallpolicies' | extend compliant = (properties.threatIntelMode == 'Deny') | distinct id,compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed", "size": 0, "queryType": 1, "resourceType": "microsoft.resourcegraph/resources", @@ -1612,20 +1568,20 @@ ] } }, - "name": "query9" + "name": "query16" }, { "type": 1, "content": { - "json": "Deploy a zone-redundant ExpressRoute gateway in the supported Azure regions. Check [this link](https://learn.microsoft.com/azure/expressroute/expressroute-about-virtual-network-gateways) for further information.. [This training](https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/) can help to educate yourself on this." + "json": "Configure Azure Firewall IDPS mode to Deny for additional protection. Check [this link](https://learn.microsoft.com/azure/firewall/premium-features#idps) for further information.. [This training](https://learn.microsoft.com/training/modules/introduction-azure-firewall/) can help to educate yourself on this." }, - "name": "querytext10" + "name": "querytext17" }, { "type": 3, "content": { "version": "KqlItem/1.0", - "query": "resources| where type == 'microsoft.network/virtualnetworkgateways'| where properties.gatewayType =~ 'vpn' or properties.gatewayType == 'ExpressRoute'| extend SKUName = properties.sku.name, SKUTier = properties.sku.tier, Type = properties.gatewayType| extend compliant = SKUTier contains 'AZ'| project name, id, subscriptionId, resourceGroup, Type, compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed", + "query": "resources | where type=='microsoft.network/firewallpolicies' | extend compliant = (properties.intrusionDetection.mode == 'Deny') | project id, compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed", "size": 0, "queryType": 1, "resourceType": "microsoft.resourcegraph/resources", @@ -1674,20 +1630,20 @@ ] } }, - "name": "query10" + "name": "query17" }, { "type": 1, "content": { - "json": "Use zone-redundant VPN gateways to connect branches or remote locations to Azure (where available). Check [this link](https://learn.microsoft.com/azure/vpn-gateway/create-zone-redundant-vnet-gateway) for further information.. [This training](https://learn.microsoft.com/training/modules/intro-to-azure-vpn-gateway/) can help to educate yourself on this." + "json": "For subnets in VNets not connected to Virtual WAN, attach a route table so that Internet traffic is redirected to Azure Firewall or a Network Virtual Appliance. Check [this link](https://learn.microsoft.com/azure/virtual-network/virtual-networks-udr-overview) for further information." }, - "name": "querytext11" + "name": "querytext18" }, { "type": 3, "content": { "version": "KqlItem/1.0", - "query": "resources | where type=='microsoft.network/virtualnetworkgateways' | where properties.gatewayType == 'Vpn' | extend compliant = (tolower(properties.sku.name) contains 'az') | distinct id, compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed", + "query": "resources | where type=='microsoft.network/virtualnetworks' | project id,resourceGroup,name,subnets=properties.subnets | mv-expand subnets | project id,name,subnetId=tostring(subnets.id), subnetName=tostring(subnets.name),subnetRT=subnets.properties.routeTable.id | where not (subnetName in ('GatewaySubnet', 'AzureFirewallSubnet', 'RouteServerSubnet', 'AzureBastionSubnet')) | extend hasRT = isnotnull(subnetRT) | distinct id, hasRT, subnetId | join kind=fullouter (resources | where type == 'microsoft.network/virtualnetworks' | mvexpand properties.virtualNetworkPeerings | extend isVWAN=(tolower(split(properties_virtualNetworkPeerings.name, '_')[0]) == 'remotevnettohubpeering') | mv-expand properties.subnets | project id, isVWAN, name, subnetId=tostring(properties_subnets.id), subnetName=tostring(properties_subnets.name) | summarize PeeredToVWAN=max(isVWAN) by id, subnetId | project id, subnetId, isVWANpeer = (PeeredToVWAN == true)) on subnetId | project id=iff(isnotempty(id), id, id1), subnetId=iff(isnotempty(subnetId), subnetId, subnetId1), hasRT, isVWANpeer | extend compliant = (hasRT==true or isVWANpeer==true) | distinct id, subnetId, compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed", "size": 0, "queryType": 1, "resourceType": "microsoft.resourcegraph/resources", @@ -1736,20 +1692,42 @@ ] } }, - "name": "query11" + "name": "query18" + } + ] + }, + "conditionalVisibility": { + "parameterName": "VisibleTab", + "comparison": "isEqualTo", + "value": "tab5" + }, + "name": "tab5" + }, + { + "type": 12, + "content": { + "version": "NotebookGroup/1.0", + "groupType": "editable", + "items": [ + { + "type": 1, + "content": { + "json": "## PaaS" + }, + "name": "tab6title" }, { "type": 1, "content": { - "json": "Use ExpressRoute circuits from different peering locations for redundancy. Check [this link](https://learn.microsoft.com/azure/expressroute/designing-for-disaster-recovery-with-expressroute-privatepeering#need-for-redundant-connectivity-solution) for further information.. [This training](https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/) can help to educate yourself on this." + "json": "Don't enable virtual network service endpoints by default on all subnets. Check [this link](https://learn.microsoft.com/azure/virtual-network/virtual-network-service-endpoints-overview) for further information.. [This training](https://learn.microsoft.com/learn/paths/implement-network-security/?source=learn) can help to educate yourself on this." }, - "name": "querytext12" + "name": "querytext20" }, { "type": 3, "content": { "version": "KqlItem/1.0", - "query": "resources | where type=='microsoft.network/connections' | where properties.connectionType == 'ExpressRoute' | project cxId=id, gwId=tostring(properties.virtualNetworkGateway1.id), circuitId=tostring(properties.peer.id) | join (resources | where type=='microsoft.network/expressroutecircuits' | project circuitId=tostring(id), circuitLocation=tostring(properties.serviceProviderProperties.peeringLocation)) on circuitId | distinct gwId, circuitLocation | summarize countErLocations=count() by id=gwId | extend compliant = (countErLocations >= 2) | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed", + "query": "resources | where type =~ 'microsoft.network/virtualnetworks' | project id,resourceGroup,name,subnets = properties.subnets | mv-expand subnets | project id = subnets.id, resourceGroup, VNet = name, serviceEndpoints = subnets.properties.serviceEndpoints, compliant = (isnull(subnets.properties.serviceEndpoints) or array_length(subnets.properties.serviceEndpoints) == 0) | order by compliant asc | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed", "size": 0, "queryType": 1, "resourceType": "microsoft.resourcegraph/resources", @@ -1798,20 +1776,42 @@ ] } }, - "name": "query12" + "name": "query20" + } + ] + }, + "conditionalVisibility": { + "parameterName": "VisibleTab", + "comparison": "isEqualTo", + "value": "tab6" + }, + "name": "tab6" + }, + { + "type": 12, + "content": { + "version": "NotebookGroup/1.0", + "groupType": "editable", + "items": [ + { + "type": 1, + "content": { + "json": "## Internet" + }, + "name": "tab7title" }, { "type": 1, "content": { - "json": "If you are using a route table in the GatewaySubnet, make sure that gateway routes are propagated. Check [this link](https://learn.microsoft.com/azure/vpn-gateway/vpn-gateway-about-vpn-gateway-settings#gwsub) for further information." + "json": "Use Azure Bastion in a subnet /26 or larger. Check [this link](https://learn.microsoft.com/azure/bastion/bastion-faq#subnet) for further information.. [This training](https://learn.microsoft.com/training/modules/intro-to-azure-bastion/) can help to educate yourself on this." }, - "name": "querytext13" + "name": "querytext6" }, { "type": 3, "content": { "version": "KqlItem/1.0", - "query": "resources | where type=='microsoft.network/virtualnetworks' | project id,resourceGroup,name,subnets=properties.subnets | mv-expand subnets | project id,resourceGroup,name,subnetName=tostring(subnets.name),routeTableId=tostring(subnets.properties.routeTable.id) | where subnetName == 'GatewaySubnet' | join kind=leftouter (Resources | where type == 'microsoft.network/routetables' | project routeTableName=name,routeTableId=id, disableBgpRoutePropagation=properties.disableBgpRoutePropagation) on routeTableId | project id,compliant = (disableBgpRoutePropagation == False or isnull(disableBgpRoutePropagation)) | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed", + "query": "resources | where type=='microsoft.network/virtualnetworks' | project id,subnets=properties.subnets | mv-expand subnets | project id, subnetName = subnets.name, subnetPrefix = subnets.properties.addressPrefix | extend subnetPrefixLength = split(subnetPrefix, '/')[1] | where subnetName == 'AzureBastionSubnet' | extend compliant = (subnetPrefixLength <= 26) | distinct id, compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed", "size": 0, "queryType": 1, "resourceType": "microsoft.resourcegraph/resources", @@ -1860,7 +1860,7 @@ ] } }, - "name": "query13" + "name": "query6" } ] }, diff --git a/workbooks/alz_checklist.en_network_workbook_template.json b/workbooks/alz_checklist.en_network_workbook_template.json index 7f317ab77..ad91acf2c 100644 --- a/workbooks/alz_checklist.en_network_workbook_template.json +++ b/workbooks/alz_checklist.en_network_workbook_template.json @@ -41,7 +41,7 @@ "dependsOn": [], "properties": { "displayName": "[parameters('workbookDisplayName')]", - "serializedData": "{\n \"version\": \"Notebook/1.0\",\n \"items\": [\n {\n \"type\": 9,\n \"content\": {\n \"version\": \"KqlParameterItem/1.0\",\n \"parameters\": [\n {\n \"id\": \"497a107e-dde8-433e-b263-35ac8e8f7834\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Subscription\",\n \"type\": 6,\n \"multiSelect\": true,\n \"quote\": \"'\",\n \"delimiter\": \",\",\n \"typeSettings\": {\n \"additionalResourceOptions\": [\n \"value::all\"\n ],\n \"includeAll\": true,\n \"showDefault\": false\n },\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"value\": [\n \"value::all\"\n ]\n },\n {\n \"id\": \"844e4f4e-df51-4e3c-8eaf-0dc78b92c721\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"OnlyFailed\",\n \"label\": \"Only show failed\",\n \"type\": 2,\n \"typeSettings\": {\n \"additionalResourceOptions\": [],\n \"showDefault\": false\n },\n \"jsonData\": \"[\\r\\n { \\\"value\\\":true, \\\"label\\\":\\\"True\\\" },\\r\\n { \\\"value\\\":false, \\\"label\\\":\\\"False\\\", \\\"selected\\\":true }\\r\\n]\"\n }\n ],\n \"style\": \"pills\",\n \"queryType\": 0,\n \"resourceType\": \"microsoft.operationalinsights/workspaces\"\n },\n \"name\": \"WorkbookSelectors\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"If you set \\\"Only show failed\\\" to \\\"Yes\\\", the different queries will only show items that have failed their compliance checks.\",\n \"style\": \"info\"\n },\n \"name\": \"InfoBox\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"## Azure Landing Zone Review - Network\\n\\n---\\n\\nThis workbook has been automatically generated out of the checklists in the [Azure Review Checklists repo](https://github.com/Azure/review-checklists). This repo contains best practices and recommendations around generic Landing Zones as well as specific services such as Azure Virtual Desktop, Azure Kubernetes Service or Azure VMware Solution, to name a few. This repository of best practices is curated by Azure engineers, but open to anybody to contribute.\\n\\nIf you see a problem in the queries that are part of this workbook, please open a Github issue [here](https://github.com/Azure/review-checklists/issues/new).\"\n },\n \"customWidth\": \"100\",\n \"name\": \"MarkdownHeader\"\n },\n {\n \"type\": 11,\n \"content\": {\n \"version\": \"LinkItem/1.0\",\n \"style\": \"tabs\",\n \"links\": [\n {\n \"id\": \"724a6206-8fa8-47bb-8a6f-36ad0b9602f1\",\n \"cellValue\": \"VisibleTab\",\n \"linkTarget\": \"parameter\",\n \"linkLabel\": \"PaaS\",\n \"subTarget\": \"tab0\",\n \"preText\": \"PaaS\",\n \"style\": \"primary\"\n },\n {\n \"id\": \"e35a272b-0003-45e3-9785-dcaa314cfe51\",\n \"cellValue\": \"VisibleTab\",\n \"linkTarget\": \"parameter\",\n \"linkLabel\": \"IP plan\",\n \"subTarget\": \"tab1\",\n \"preText\": \"IP plan\",\n \"style\": \"primary\"\n },\n {\n \"id\": \"ddbef687-4ed9-46bf-b9ae-6179249e4bf8\",\n \"cellValue\": \"VisibleTab\",\n \"linkTarget\": \"parameter\",\n \"linkLabel\": \"Internet\",\n \"subTarget\": \"tab2\",\n \"preText\": \"Internet\",\n \"style\": \"primary\"\n },\n {\n \"id\": \"d7eca0df-b9ff-4125-a232-1f86168676e8\",\n \"cellValue\": \"VisibleTab\",\n \"linkTarget\": \"parameter\",\n \"linkLabel\": \"Virtual WAN\",\n \"subTarget\": \"tab3\",\n \"preText\": \"Virtual WAN\",\n \"style\": \"primary\"\n },\n {\n \"id\": \"ad29c45d-0bf8-4740-aaab-6d2d5095fe66\",\n \"cellValue\": \"VisibleTab\",\n \"linkTarget\": \"parameter\",\n \"linkLabel\": \"Segmentation\",\n \"subTarget\": \"tab4\",\n \"preText\": \"Segmentation\",\n \"style\": \"primary\"\n },\n {\n \"id\": \"582857c2-778c-4bcd-a34e-ebd3f5292e47\",\n \"cellValue\": \"VisibleTab\",\n \"linkTarget\": \"parameter\",\n \"linkLabel\": \"Hub and spoke\",\n \"subTarget\": \"tab5\",\n \"preText\": \"Hub and spoke\",\n \"style\": \"primary\"\n },\n {\n \"id\": \"c61cf934-abcf-4b10-9861-b1b13a1b5a89\",\n \"cellValue\": \"VisibleTab\",\n \"linkTarget\": \"parameter\",\n \"linkLabel\": \"Firewall\",\n \"subTarget\": \"tab6\",\n \"preText\": \"Firewall\",\n \"style\": \"primary\"\n },\n {\n \"id\": \"281a8b23-6cdc-4616-acc5-e84fef3a06f2\",\n \"cellValue\": \"VisibleTab\",\n \"linkTarget\": \"parameter\",\n \"linkLabel\": \"Hybrid\",\n \"subTarget\": \"tab7\",\n \"preText\": \"Hybrid\",\n \"style\": \"primary\"\n }\n ]\n },\n \"name\": \"Tabs\"\n },\n {\n \"type\": 12,\n \"content\": {\n \"version\": \"NotebookGroup/1.0\",\n \"groupType\": \"editable\",\n \"items\": [\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"## PaaS\"\n },\n \"name\": \"tab0title\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"Don't enable virtual network service endpoints by default on all subnets. Check [this link](https://learn.microsoft.com/azure/virtual-network/virtual-network-service-endpoints-overview) for further information.. [This training](https://learn.microsoft.com/learn/paths/implement-network-security/?source=learn) can help to educate yourself on this.\"\n },\n \"name\": \"querytext20\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"resources | where type =~ 'microsoft.network/virtualnetworks' | project id,resourceGroup,name,subnets = properties.subnets | mv-expand subnets | project id = subnets.id, resourceGroup, VNet = name, serviceEndpoints = subnets.properties.serviceEndpoints, compliant = (isnull(subnets.properties.serviceEndpoints) or array_length(subnets.properties.serviceEndpoints) == 0) | order by compliant asc | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed\",\n \"size\": 0,\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"gridSettings\": {\n \"formatters\": [\n {\n \"columnMatch\": \"id\",\n \"formatter\": 0,\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n {\n \"columnMatch\": \"compliant\",\n \"formatter\": 18,\n \"formatOptions\": {\n \"thresholdsOptions\": \"icons\",\n \"thresholdsGrid\": [\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"1\",\n \"representation\": \"success\",\n \"text\": \"Success\"\n },\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"0\",\n \"representation\": \"failed\",\n \"text\": \"Failed\"\n },\n {\n \"operator\": \"Default\",\n \"thresholdValue\": null,\n \"representation\": \"unknown\",\n \"text\": \"Unknown\"\n }\n ]\n }\n }\n ]\n }\n },\n \"name\": \"query20\"\n }\n ]\n },\n \"conditionalVisibility\": {\n \"parameterName\": \"VisibleTab\",\n \"comparison\": \"isEqualTo\",\n \"value\": \"tab0\"\n },\n \"name\": \"tab0\"\n },\n {\n \"type\": 12,\n \"content\": {\n \"version\": \"NotebookGroup/1.0\",\n \"groupType\": \"editable\",\n \"items\": [\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"## IP plan\"\n },\n \"name\": \"tab1title\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"Use IP addresses from the address allocation ranges for private internets (RFC 1918). Check [this link](https://learn.microsoft.com/azure/cloud-adoption-framework/ready/azure-best-practices/plan-for-ip-addressing) for further information.. [This training](https://learn.microsoft.com/learn/paths/architect-network-infrastructure/) can help to educate yourself on this.\"\n },\n \"name\": \"querytext4\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"resources | where type == 'microsoft.network/virtualnetworks' | extend addressSpace = todynamic(properties.addressSpace) | extend addressPrefix = todynamic(properties.addressSpace.addressPrefixes) | mvexpand addressSpace | mvexpand addressPrefix | project name, id, location, resourceGroup, subscriptionId, cidr = addressPrefix | extend compliant = (cidr matches regex @'^(10\\\\.|172\\\\.(1[6-9]|2[0-9]|3[01])\\\\.|192\\\\.168\\\\.)') | project id, compliant, cidr | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed\",\n \"size\": 0,\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"gridSettings\": {\n \"formatters\": [\n {\n \"columnMatch\": \"id\",\n \"formatter\": 0,\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n {\n \"columnMatch\": \"compliant\",\n \"formatter\": 18,\n \"formatOptions\": {\n \"thresholdsOptions\": \"icons\",\n \"thresholdsGrid\": [\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"1\",\n \"representation\": \"success\",\n \"text\": \"Success\"\n },\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"0\",\n \"representation\": \"failed\",\n \"text\": \"Failed\"\n },\n {\n \"operator\": \"Default\",\n \"thresholdValue\": null,\n \"representation\": \"unknown\",\n \"text\": \"Unknown\"\n }\n ]\n }\n }\n ]\n }\n },\n \"name\": \"query4\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"Ensure that IP address space isn't wasted, don't create unnecessarily large virtual networks (for example /16). Check [this link](https://learn.microsoft.com/azure/cloud-adoption-framework/ready/azure-best-practices/plan-for-ip-addressing) for further information.. [This training](https://learn.microsoft.com/learn/paths/architect-network-infrastructure/) can help to educate yourself on this.\"\n },\n \"name\": \"querytext5\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"resources | where type == 'microsoft.network/virtualnetworks' | extend addressSpace = todynamic(properties.addressSpace) | extend addressPrefix = todynamic(properties.addressSpace.addressPrefixes) | mvexpand addressSpace | mvexpand addressPrefix | extend addressMask = split(addressPrefix,'/')[1] | extend compliant = addressMask > 16 | project name, id, subscriptionId, resourceGroup, addressPrefix, compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed\",\n \"size\": 0,\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"gridSettings\": {\n \"formatters\": [\n {\n \"columnMatch\": \"id\",\n \"formatter\": 0,\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n {\n \"columnMatch\": \"compliant\",\n \"formatter\": 18,\n \"formatOptions\": {\n \"thresholdsOptions\": \"icons\",\n \"thresholdsGrid\": [\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"1\",\n \"representation\": \"success\",\n \"text\": \"Success\"\n },\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"0\",\n \"representation\": \"failed\",\n \"text\": \"Failed\"\n },\n {\n \"operator\": \"Default\",\n \"thresholdValue\": null,\n \"representation\": \"unknown\",\n \"text\": \"Unknown\"\n }\n ]\n }\n }\n ]\n }\n },\n \"name\": \"query5\"\n }\n ]\n },\n \"conditionalVisibility\": {\n \"parameterName\": \"VisibleTab\",\n \"comparison\": \"isEqualTo\",\n \"value\": \"tab1\"\n },\n \"name\": \"tab1\"\n },\n {\n \"type\": 12,\n \"content\": {\n \"version\": \"NotebookGroup/1.0\",\n \"groupType\": \"editable\",\n \"items\": [\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"## Internet\"\n },\n \"name\": \"tab2title\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"Use Azure Bastion in a subnet /26 or larger. Check [this link](https://learn.microsoft.com/azure/bastion/bastion-faq#subnet) for further information.\"\n },\n \"name\": \"querytext6\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"resources | where type=='microsoft.network/virtualnetworks' | project id,subnets=properties.subnets | mv-expand subnets | project id, subnetName = subnets.name, subnetPrefix = subnets.properties.addressPrefix | extend subnetPrefixLength = split(subnetPrefix, '/')[1] | where subnetName == 'AzureBastionSubnet' | extend compliant = (subnetPrefixLength <= 26) | distinct id, compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed\",\n \"size\": 0,\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"gridSettings\": {\n \"formatters\": [\n {\n \"columnMatch\": \"id\",\n \"formatter\": 0,\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n {\n \"columnMatch\": \"compliant\",\n \"formatter\": 18,\n \"formatOptions\": {\n \"thresholdsOptions\": \"icons\",\n \"thresholdsGrid\": [\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"1\",\n \"representation\": \"success\",\n \"text\": \"Success\"\n },\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"0\",\n \"representation\": \"failed\",\n \"text\": \"Failed\"\n },\n {\n \"operator\": \"Default\",\n \"thresholdValue\": null,\n \"representation\": \"unknown\",\n \"text\": \"Unknown\"\n }\n ]\n }\n }\n ]\n }\n },\n \"name\": \"query6\"\n }\n ]\n },\n \"conditionalVisibility\": {\n \"parameterName\": \"VisibleTab\",\n \"comparison\": \"isEqualTo\",\n \"value\": \"tab2\"\n },\n \"name\": \"tab2\"\n },\n {\n \"type\": 12,\n \"content\": {\n \"version\": \"NotebookGroup/1.0\",\n \"groupType\": \"editable\",\n \"items\": [\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"## Virtual WAN\"\n },\n \"name\": \"tab3title\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"For outbound Internet traffic protection and filtering, deploy Azure Firewall in secured hubs. Check [this link](https://learn.microsoft.com/azure/virtual-wan/howto-firewall) for further information.. [This training](https://learn.microsoft.com/learn/paths/secure-networking-infrastructure/) can help to educate yourself on this.\"\n },\n \"name\": \"querytext24\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"resources | where type=='microsoft.network/virtualhubs' | extend compliant = isnotnull(properties.azureFirewall.id) | project id, compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed\",\n \"size\": 0,\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"gridSettings\": {\n \"formatters\": [\n {\n \"columnMatch\": \"id\",\n \"formatter\": 0,\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n {\n \"columnMatch\": \"compliant\",\n \"formatter\": 18,\n \"formatOptions\": {\n \"thresholdsOptions\": \"icons\",\n \"thresholdsGrid\": [\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"1\",\n \"representation\": \"success\",\n \"text\": \"Success\"\n },\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"0\",\n \"representation\": \"failed\",\n \"text\": \"Failed\"\n },\n {\n \"operator\": \"Default\",\n \"thresholdValue\": null,\n \"representation\": \"unknown\",\n \"text\": \"Unknown\"\n }\n ]\n }\n }\n ]\n }\n },\n \"name\": \"query24\"\n }\n ]\n },\n \"conditionalVisibility\": {\n \"parameterName\": \"VisibleTab\",\n \"comparison\": \"isEqualTo\",\n \"value\": \"tab3\"\n },\n \"name\": \"tab3\"\n },\n {\n \"type\": 12,\n \"content\": {\n \"version\": \"NotebookGroup/1.0\",\n \"groupType\": \"editable\",\n \"items\": [\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"## Segmentation\"\n },\n \"name\": \"tab4title\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"Use a /26 prefix for your Azure Firewall subnets. Check [this link](https://learn.microsoft.com/azure/firewall/firewall-faq#why-does-azure-firewall-need-a--26-subnet-size) for further information.\"\n },\n \"name\": \"querytext19\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"resources | where type=='microsoft.network/virtualnetworks' | project id,subnets=properties.subnets | mv-expand subnets | project id, subnetName = subnets.name, subnetPrefix = subnets.properties.addressPrefix | extend subnetPrefixLength = split(subnetPrefix, '/')[1] | where subnetName == 'AzureFirewallSubnet' | extend compliant = (subnetPrefixLength == 26) | distinct id, compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed\",\n \"size\": 0,\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"gridSettings\": {\n \"formatters\": [\n {\n \"columnMatch\": \"id\",\n \"formatter\": 0,\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n {\n \"columnMatch\": \"compliant\",\n \"formatter\": 18,\n \"formatOptions\": {\n \"thresholdsOptions\": \"icons\",\n \"thresholdsGrid\": [\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"1\",\n \"representation\": \"success\",\n \"text\": \"Success\"\n },\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"0\",\n \"representation\": \"failed\",\n \"text\": \"Failed\"\n },\n {\n \"operator\": \"Default\",\n \"thresholdValue\": null,\n \"representation\": \"unknown\",\n \"text\": \"Unknown\"\n }\n ]\n }\n }\n ]\n }\n },\n \"name\": \"query19\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"Use at least a /27 prefix for your Gateway subnets. Check [this link](https://learn.microsoft.com/azure/expressroute/expressroute-howto-add-gateway-resource-manager#add-a-gateway) for further information.\"\n },\n \"name\": \"querytext21\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"resources | where type=='microsoft.network/virtualnetworks' | project id,subnets=properties.subnets | mv-expand subnets | project id, subnetName = subnets.name, subnetPrefix = subnets.properties.addressPrefix | extend subnetPrefixLength = split(subnetPrefix, '/')[1] | where subnetName == 'GatewaySubnet' | extend compliant = (subnetPrefixLength <= 27) | distinct id, compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed\",\n \"size\": 0,\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"gridSettings\": {\n \"formatters\": [\n {\n \"columnMatch\": \"id\",\n \"formatter\": 0,\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n {\n \"columnMatch\": \"compliant\",\n \"formatter\": 18,\n \"formatOptions\": {\n \"thresholdsOptions\": \"icons\",\n \"thresholdsGrid\": [\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"1\",\n \"representation\": \"success\",\n \"text\": \"Success\"\n },\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"0\",\n \"representation\": \"failed\",\n \"text\": \"Failed\"\n },\n {\n \"operator\": \"Default\",\n \"thresholdValue\": null,\n \"representation\": \"unknown\",\n \"text\": \"Unknown\"\n }\n ]\n }\n }\n ]\n }\n },\n \"name\": \"query21\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"Don't rely on the NSG inbound default rules using the VirtualNetwork service tag to limit connectivity. Check [this link](https://learn.microsoft.com/azure/virtual-network/service-tags-overview#available-service-tags) for further information.\"\n },\n \"name\": \"querytext22\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"resources | where type=='microsoft.network/networksecuritygroups' | mvexpand properties.securityRules | project id,name,ruleAction=properties_securityRules.properties.access,rulePriority=properties_securityRules.properties.priority,ruleDst=properties_securityRules.properties.destinationAddressPrefix,ruleSrc=properties_securityRules.properties.sourceAddressPrefix,ruleProt=properties_securityRules.properties.protocol,ruleDirection=properties_securityRules.properties.direction,rulePort=properties_securityRules.properties.destinationPortRange | summarize StarDenies=countif(ruleAction=='Deny' and ruleDst=='*' and ruleSrc=='*' and ruleProt=='*' and rulePort=='*') by id,tostring(ruleDirection) | where ruleDirection == 'Inbound' | project id,compliant=(StarDenies>0) | union (resources | where type=='microsoft.network/networksecuritygroups' | where array_length(properties.securityRules)==0 | extend compliant=false | project id,compliant) | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed\",\n \"size\": 0,\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"gridSettings\": {\n \"formatters\": [\n {\n \"columnMatch\": \"id\",\n \"formatter\": 0,\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n {\n \"columnMatch\": \"compliant\",\n \"formatter\": 18,\n \"formatOptions\": {\n \"thresholdsOptions\": \"icons\",\n \"thresholdsGrid\": [\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"1\",\n \"representation\": \"success\",\n \"text\": \"Success\"\n },\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"0\",\n \"representation\": \"failed\",\n \"text\": \"Failed\"\n },\n {\n \"operator\": \"Default\",\n \"thresholdValue\": null,\n \"representation\": \"unknown\",\n \"text\": \"Unknown\"\n }\n ]\n }\n }\n ]\n }\n },\n \"name\": \"query22\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"Do not implement more than 900 NSG rules per NSG, due to the limit of 1000 rules. Check [this link](https://learn.microsoft.com/azure/azure-resource-manager/management/azure-subscription-service-limits) for further information.. [This training](https://learn.microsoft.com/azure/virtual-network/network-security-group-how-it-works) can help to educate yourself on this.\"\n },\n \"name\": \"querytext23\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"resources | where type == 'microsoft.network/networksecuritygroups' | project id, rules = array_length(properties.securityRules) | project id, compliant = (rules < 900) | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed\",\n \"size\": 0,\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"gridSettings\": {\n \"formatters\": [\n {\n \"columnMatch\": \"id\",\n \"formatter\": 0,\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n {\n \"columnMatch\": \"compliant\",\n \"formatter\": 18,\n \"formatOptions\": {\n \"thresholdsOptions\": \"icons\",\n \"thresholdsGrid\": [\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"1\",\n \"representation\": \"success\",\n \"text\": \"Success\"\n },\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"0\",\n \"representation\": \"failed\",\n \"text\": \"Failed\"\n },\n {\n \"operator\": \"Default\",\n \"thresholdValue\": null,\n \"representation\": \"unknown\",\n \"text\": \"Unknown\"\n }\n ]\n }\n }\n ]\n }\n },\n \"name\": \"query23\"\n }\n ]\n },\n \"conditionalVisibility\": {\n \"parameterName\": \"VisibleTab\",\n \"comparison\": \"isEqualTo\",\n \"value\": \"tab4\"\n },\n \"name\": \"tab4\"\n },\n {\n \"type\": 12,\n \"content\": {\n \"version\": \"NotebookGroup/1.0\",\n \"groupType\": \"editable\",\n \"items\": [\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"## Hub and spoke\"\n },\n \"name\": \"tab5title\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"If using Route Server, use a /27 prefix for the Route Server subnet. Check [this link](https://learn.microsoft.com/azure/route-server/quickstart-configure-route-server-portal#create-a-route-server-1) for further information.\"\n },\n \"name\": \"querytext0\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"resources | where type=='microsoft.network/virtualnetworks' | project id,subnets=properties.subnets | mv-expand subnets | project id, subnetName = subnets.name, subnetPrefix = subnets.properties.addressPrefix | extend subnetPrefixLength = split(subnetPrefix, '/')[1] | where subnetName == 'RouteServerSubnet' | extend compliant = (subnetPrefixLength <= 27) | distinct id, compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed\",\n \"size\": 0,\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"gridSettings\": {\n \"formatters\": [\n {\n \"columnMatch\": \"id\",\n \"formatter\": 0,\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n {\n \"columnMatch\": \"compliant\",\n \"formatter\": 18,\n \"formatOptions\": {\n \"thresholdsOptions\": \"icons\",\n \"thresholdsGrid\": [\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"1\",\n \"representation\": \"success\",\n \"text\": \"Success\"\n },\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"0\",\n \"representation\": \"failed\",\n \"text\": \"Failed\"\n },\n {\n \"operator\": \"Default\",\n \"thresholdValue\": null,\n \"representation\": \"unknown\",\n \"text\": \"Unknown\"\n }\n ]\n }\n }\n ]\n }\n },\n \"name\": \"query0\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"If you have more than 400 spoke networks in a region, deploy an additional hub to bypass VNet peering limits (500) and the maximum number of prefixes that can be advertised via ExpressRoute (1000). Check [this link](https://learn.microsoft.com/azure/azure-resource-manager/management/azure-subscription-service-limits?toc=/azure/virtual-network/toc.json#azure-resource-manager-virtual-networking-limits) for further information.\"\n },\n \"name\": \"querytext1\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"resources | where type == 'microsoft.network/virtualnetworks' | mvexpand properties.virtualNetworkPeerings | summarize peeringcount = count() by id | extend compliant = (peeringcount < 450) | distinct id,compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed\",\n \"size\": 0,\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"gridSettings\": {\n \"formatters\": [\n {\n \"columnMatch\": \"id\",\n \"formatter\": 0,\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n {\n \"columnMatch\": \"compliant\",\n \"formatter\": 18,\n \"formatOptions\": {\n \"thresholdsOptions\": \"icons\",\n \"thresholdsGrid\": [\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"1\",\n \"representation\": \"success\",\n \"text\": \"Success\"\n },\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"0\",\n \"representation\": \"failed\",\n \"text\": \"Failed\"\n },\n {\n \"operator\": \"Default\",\n \"thresholdValue\": null,\n \"representation\": \"unknown\",\n \"text\": \"Unknown\"\n }\n ]\n }\n }\n ]\n }\n },\n \"name\": \"query1\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"Limit the number of routes per route table to 400. Check [this link](https://learn.microsoft.com/azure/azure-resource-manager/management/azure-subscription-service-limits?toc=/azure/virtual-network/toc.json#azure-resource-manager-virtual-networking-limits) for further information.\"\n },\n \"name\": \"querytext2\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"resources | where type=='microsoft.network/routetables' | mvexpand properties.routes | summarize routeCount = count() by id | extend compliant = (routeCount < 360) | distinct id,compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed\",\n \"size\": 0,\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"gridSettings\": {\n \"formatters\": [\n {\n \"columnMatch\": \"id\",\n \"formatter\": 0,\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n {\n \"columnMatch\": \"compliant\",\n \"formatter\": 18,\n \"formatOptions\": {\n \"thresholdsOptions\": \"icons\",\n \"thresholdsGrid\": [\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"1\",\n \"representation\": \"success\",\n \"text\": \"Success\"\n },\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"0\",\n \"representation\": \"failed\",\n \"text\": \"Failed\"\n },\n {\n \"operator\": \"Default\",\n \"thresholdValue\": null,\n \"representation\": \"unknown\",\n \"text\": \"Unknown\"\n }\n ]\n }\n }\n ]\n }\n },\n \"name\": \"query2\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"Use the setting 'Allow traffic to remote virtual network' when configuring VNet peerings. Check [this link](https://learn.microsoft.com/azure/virtual-network/virtual-network-manage-peering) for further information.\"\n },\n \"name\": \"querytext3\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"resources | where type == 'microsoft.network/virtualnetworks' | mvexpand properties.virtualNetworkPeerings | project id, peeringName=properties_virtualNetworkPeerings.name, compliant = (properties_virtualNetworkPeerings.properties.allowVirtualNetworkAccess == True) | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed\",\n \"size\": 0,\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"gridSettings\": {\n \"formatters\": [\n {\n \"columnMatch\": \"id\",\n \"formatter\": 0,\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n {\n \"columnMatch\": \"compliant\",\n \"formatter\": 18,\n \"formatOptions\": {\n \"thresholdsOptions\": \"icons\",\n \"thresholdsGrid\": [\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"1\",\n \"representation\": \"success\",\n \"text\": \"Success\"\n },\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"0\",\n \"representation\": \"failed\",\n \"text\": \"Failed\"\n },\n {\n \"operator\": \"Default\",\n \"thresholdValue\": null,\n \"representation\": \"unknown\",\n \"text\": \"Unknown\"\n }\n ]\n }\n }\n ]\n }\n },\n \"name\": \"query3\"\n }\n ]\n },\n \"conditionalVisibility\": {\n \"parameterName\": \"VisibleTab\",\n \"comparison\": \"isEqualTo\",\n \"value\": \"tab5\"\n },\n \"name\": \"tab5\"\n },\n {\n \"type\": 12,\n \"content\": {\n \"version\": \"NotebookGroup/1.0\",\n \"groupType\": \"editable\",\n \"items\": [\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"## Firewall\"\n },\n \"name\": \"tab6title\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"Use application rules to filter outbound traffic on destination host name for supported protocols. Use FQDN-based network rules and Azure Firewall with DNS proxy to filter egress traffic to the Internet over other protocols. Check [this link](https://learn.microsoft.com/azure/firewall/fqdn-filtering-network-rules) for further information.\"\n },\n \"name\": \"querytext14\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"resources | where type=='microsoft.network/firewallpolicies' | extend compliant = (properties.dnsSettings.enableProxy == true) | distinct id,compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed\",\n \"size\": 0,\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"gridSettings\": {\n \"formatters\": [\n {\n \"columnMatch\": \"id\",\n \"formatter\": 0,\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n {\n \"columnMatch\": \"compliant\",\n \"formatter\": 18,\n \"formatOptions\": {\n \"thresholdsOptions\": \"icons\",\n \"thresholdsGrid\": [\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"1\",\n \"representation\": \"success\",\n \"text\": \"Success\"\n },\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"0\",\n \"representation\": \"failed\",\n \"text\": \"Failed\"\n },\n {\n \"operator\": \"Default\",\n \"thresholdValue\": null,\n \"representation\": \"unknown\",\n \"text\": \"Unknown\"\n }\n ]\n }\n }\n ]\n }\n },\n \"name\": \"query14\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"Use Azure Firewall Premium to enable additional security features. Check [this link](https://learn.microsoft.com/azure/firewall/premium-features) for further information.\"\n },\n \"name\": \"querytext15\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"resources | where type=='microsoft.network/firewallpolicies' | extend compliant = (properties.sku.tier == 'Premium') | distinct id,compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed\",\n \"size\": 0,\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"gridSettings\": {\n \"formatters\": [\n {\n \"columnMatch\": \"id\",\n \"formatter\": 0,\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n {\n \"columnMatch\": \"compliant\",\n \"formatter\": 18,\n \"formatOptions\": {\n \"thresholdsOptions\": \"icons\",\n \"thresholdsGrid\": [\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"1\",\n \"representation\": \"success\",\n \"text\": \"Success\"\n },\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"0\",\n \"representation\": \"failed\",\n \"text\": \"Failed\"\n },\n {\n \"operator\": \"Default\",\n \"thresholdValue\": null,\n \"representation\": \"unknown\",\n \"text\": \"Unknown\"\n }\n ]\n }\n }\n ]\n }\n },\n \"name\": \"query15\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"Configure Azure Firewall Threat Intelligence mode to Alert and Deny for additional protection. Check [this link](https://learn.microsoft.com/azure/firewall/premium-features#idps-signature-rules) for further information.\"\n },\n \"name\": \"querytext16\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"resources | where type=='microsoft.network/firewallpolicies' | extend compliant = (properties.threatIntelMode == 'Deny') | distinct id,compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed\",\n \"size\": 0,\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"gridSettings\": {\n \"formatters\": [\n {\n \"columnMatch\": \"id\",\n \"formatter\": 0,\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n {\n \"columnMatch\": \"compliant\",\n \"formatter\": 18,\n \"formatOptions\": {\n \"thresholdsOptions\": \"icons\",\n \"thresholdsGrid\": [\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"1\",\n \"representation\": \"success\",\n \"text\": \"Success\"\n },\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"0\",\n \"representation\": \"failed\",\n \"text\": \"Failed\"\n },\n {\n \"operator\": \"Default\",\n \"thresholdValue\": null,\n \"representation\": \"unknown\",\n \"text\": \"Unknown\"\n }\n ]\n }\n }\n ]\n }\n },\n \"name\": \"query16\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"Configure Azure Firewall IDPS mode to Deny for additional protection. Check [this link](https://learn.microsoft.com/azure/firewall/premium-features#idps) for further information.\"\n },\n \"name\": \"querytext17\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"resources | where type=='microsoft.network/firewallpolicies' | extend compliant = (properties.intrusionDetection.mode == 'Deny') | project id, compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed\",\n \"size\": 0,\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"gridSettings\": {\n \"formatters\": [\n {\n \"columnMatch\": \"id\",\n \"formatter\": 0,\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n {\n \"columnMatch\": \"compliant\",\n \"formatter\": 18,\n \"formatOptions\": {\n \"thresholdsOptions\": \"icons\",\n \"thresholdsGrid\": [\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"1\",\n \"representation\": \"success\",\n \"text\": \"Success\"\n },\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"0\",\n \"representation\": \"failed\",\n \"text\": \"Failed\"\n },\n {\n \"operator\": \"Default\",\n \"thresholdValue\": null,\n \"representation\": \"unknown\",\n \"text\": \"Unknown\"\n }\n ]\n }\n }\n ]\n }\n },\n \"name\": \"query17\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"For subnets in VNets not connected to Virtual WAN, attach a route table so that Internet traffic is redirected to Azure Firewall or a Network Virtual Appliance. Check [this link](https://learn.microsoft.com/azure/virtual-network/virtual-networks-udr-overview) for further information.\"\n },\n \"name\": \"querytext18\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"resources | where type=='microsoft.network/virtualnetworks' | project id,resourceGroup,name,subnets=properties.subnets | mv-expand subnets | project id,name,subnetId=tostring(subnets.id), subnetName=tostring(subnets.name),subnetRT=subnets.properties.routeTable.id | where not (subnetName in ('GatewaySubnet', 'AzureFirewallSubnet', 'RouteServerSubnet', 'AzureBastionSubnet')) | extend hasRT = isnotnull(subnetRT) | distinct id, hasRT, subnetId | join kind=fullouter (resources | where type == 'microsoft.network/virtualnetworks' | mvexpand properties.virtualNetworkPeerings | extend isVWAN=(tolower(split(properties_virtualNetworkPeerings.name, '_')[0]) == 'remotevnettohubpeering') | mv-expand properties.subnets | project id, isVWAN, name, subnetId=tostring(properties_subnets.id), subnetName=tostring(properties_subnets.name) | summarize PeeredToVWAN=max(isVWAN) by id, subnetId | project id, subnetId, isVWANpeer = (PeeredToVWAN == true)) on subnetId | project id=iff(isnotempty(id), id, id1), subnetId=iff(isnotempty(subnetId), subnetId, subnetId1), hasRT, isVWANpeer | extend compliant = (hasRT==true or isVWANpeer==true) | distinct id, subnetId, compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed\",\n \"size\": 0,\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"gridSettings\": {\n \"formatters\": [\n {\n \"columnMatch\": \"id\",\n \"formatter\": 0,\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n {\n \"columnMatch\": \"compliant\",\n \"formatter\": 18,\n \"formatOptions\": {\n \"thresholdsOptions\": \"icons\",\n \"thresholdsGrid\": [\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"1\",\n \"representation\": \"success\",\n \"text\": \"Success\"\n },\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"0\",\n \"representation\": \"failed\",\n \"text\": \"Failed\"\n },\n {\n \"operator\": \"Default\",\n \"thresholdValue\": null,\n \"representation\": \"unknown\",\n \"text\": \"Unknown\"\n }\n ]\n }\n }\n ]\n }\n },\n \"name\": \"query18\"\n }\n ]\n },\n \"conditionalVisibility\": {\n \"parameterName\": \"VisibleTab\",\n \"comparison\": \"isEqualTo\",\n \"value\": \"tab6\"\n },\n \"name\": \"tab6\"\n },\n {\n \"type\": 12,\n \"content\": {\n \"version\": \"NotebookGroup/1.0\",\n \"groupType\": \"editable\",\n \"items\": [\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"## Hybrid\"\n },\n \"name\": \"tab7title\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"Select the right SKU for the ExpressRoute/VPN gateways based on bandwidth and performance requirements. Check [this link](https://learn.microsoft.com/azure/expressroute/expressroute-about-virtual-network-gateways?source=recommendations#gwsku) for further information.. [This training](https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/) can help to educate yourself on this.\"\n },\n \"name\": \"querytext7\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"resources| where type == 'microsoft.network/virtualnetworkgateways'| where properties.gatewayType =~ 'vpn' or properties.gatewayType == 'ExpressRoute'| extend SKUName = properties.sku.name, SKUTier = properties.sku.tier, Type = properties.gatewayType| extend compliant = SKUTier !in ('Basic', 'Standard')| project name, id, subscriptionId, resourceGroup, compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed\",\n \"size\": 0,\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"gridSettings\": {\n \"formatters\": [\n {\n \"columnMatch\": \"id\",\n \"formatter\": 0,\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n {\n \"columnMatch\": \"compliant\",\n \"formatter\": 18,\n \"formatOptions\": {\n \"thresholdsOptions\": \"icons\",\n \"thresholdsGrid\": [\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"1\",\n \"representation\": \"success\",\n \"text\": \"Success\"\n },\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"0\",\n \"representation\": \"failed\",\n \"text\": \"Failed\"\n },\n {\n \"operator\": \"Default\",\n \"thresholdValue\": null,\n \"representation\": \"unknown\",\n \"text\": \"Unknown\"\n }\n ]\n }\n }\n ]\n }\n },\n \"name\": \"query7\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"Ensure that you're using unlimited-data ExpressRoute circuits only if you reach the bandwidth that justifies their cost. Check [this link](https://learn.microsoft.com/azure/expressroute/plan-manage-cost) for further information.\"\n },\n \"name\": \"querytext8\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"resources | where type=='microsoft.network/expressroutecircuits' | extend compliant = (tolower(sku.family) == 'metereddata' or tolower(sku.tier) == 'local') | distinct id,compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed\",\n \"size\": 0,\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"gridSettings\": {\n \"formatters\": [\n {\n \"columnMatch\": \"id\",\n \"formatter\": 0,\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n {\n \"columnMatch\": \"compliant\",\n \"formatter\": 18,\n \"formatOptions\": {\n \"thresholdsOptions\": \"icons\",\n \"thresholdsGrid\": [\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"1\",\n \"representation\": \"success\",\n \"text\": \"Success\"\n },\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"0\",\n \"representation\": \"failed\",\n \"text\": \"Failed\"\n },\n {\n \"operator\": \"Default\",\n \"thresholdValue\": null,\n \"representation\": \"unknown\",\n \"text\": \"Unknown\"\n }\n ]\n }\n }\n ]\n }\n },\n \"name\": \"query8\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"Leverage the Local SKU of ExpressRoute to reduce the cost of your circuits, if your circuit peering location supports your Azure regions for the Local SKU. Check [this link](https://learn.microsoft.com/azure/expressroute/expressroute-faqs#expressroute-local) for further information.\"\n },\n \"name\": \"querytext9\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"resources | where type=='microsoft.network/connections' | where properties.connectionType == 'ExpressRoute' | project id, gwid=tostring(properties.virtualNetworkGateway1.id), circuitid=tostring(properties.peer.id) | join (resources | where type=='microsoft.network/expressroutecircuits' | project circuitid=tostring(id), circuitsku=sku.tier) on circuitid | project id=gwid, compliant = (circuitsku == 'Local') | summarize compliant=max(compliant) by id | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed\",\n \"size\": 0,\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"gridSettings\": {\n \"formatters\": [\n {\n \"columnMatch\": \"id\",\n \"formatter\": 0,\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n {\n \"columnMatch\": \"compliant\",\n \"formatter\": 18,\n \"formatOptions\": {\n \"thresholdsOptions\": \"icons\",\n \"thresholdsGrid\": [\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"1\",\n \"representation\": \"success\",\n \"text\": \"Success\"\n },\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"0\",\n \"representation\": \"failed\",\n \"text\": \"Failed\"\n },\n {\n \"operator\": \"Default\",\n \"thresholdValue\": null,\n \"representation\": \"unknown\",\n \"text\": \"Unknown\"\n }\n ]\n }\n }\n ]\n }\n },\n \"name\": \"query9\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"Deploy a zone-redundant ExpressRoute gateway in the supported Azure regions. Check [this link](https://learn.microsoft.com/azure/expressroute/expressroute-about-virtual-network-gateways) for further information.. [This training](https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/) can help to educate yourself on this.\"\n },\n \"name\": \"querytext10\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"resources| where type == 'microsoft.network/virtualnetworkgateways'| where properties.gatewayType =~ 'vpn' or properties.gatewayType == 'ExpressRoute'| extend SKUName = properties.sku.name, SKUTier = properties.sku.tier, Type = properties.gatewayType| extend compliant = SKUTier contains 'AZ'| project name, id, subscriptionId, resourceGroup, Type, compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed\",\n \"size\": 0,\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"gridSettings\": {\n \"formatters\": [\n {\n \"columnMatch\": \"id\",\n \"formatter\": 0,\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n {\n \"columnMatch\": \"compliant\",\n \"formatter\": 18,\n \"formatOptions\": {\n \"thresholdsOptions\": \"icons\",\n \"thresholdsGrid\": [\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"1\",\n \"representation\": \"success\",\n \"text\": \"Success\"\n },\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"0\",\n \"representation\": \"failed\",\n \"text\": \"Failed\"\n },\n {\n \"operator\": \"Default\",\n \"thresholdValue\": null,\n \"representation\": \"unknown\",\n \"text\": \"Unknown\"\n }\n ]\n }\n }\n ]\n }\n },\n \"name\": \"query10\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"Use zone-redundant VPN gateways to connect branches or remote locations to Azure (where available). Check [this link](https://learn.microsoft.com/azure/vpn-gateway/create-zone-redundant-vnet-gateway) for further information.. [This training](https://learn.microsoft.com/training/modules/intro-to-azure-vpn-gateway/) can help to educate yourself on this.\"\n },\n \"name\": \"querytext11\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"resources | where type=='microsoft.network/virtualnetworkgateways' | where properties.gatewayType == 'Vpn' | extend compliant = (tolower(properties.sku.name) contains 'az') | distinct id, compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed\",\n \"size\": 0,\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"gridSettings\": {\n \"formatters\": [\n {\n \"columnMatch\": \"id\",\n \"formatter\": 0,\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n {\n \"columnMatch\": \"compliant\",\n \"formatter\": 18,\n \"formatOptions\": {\n \"thresholdsOptions\": \"icons\",\n \"thresholdsGrid\": [\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"1\",\n \"representation\": \"success\",\n \"text\": \"Success\"\n },\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"0\",\n \"representation\": \"failed\",\n \"text\": \"Failed\"\n },\n {\n \"operator\": \"Default\",\n \"thresholdValue\": null,\n \"representation\": \"unknown\",\n \"text\": \"Unknown\"\n }\n ]\n }\n }\n ]\n }\n },\n \"name\": \"query11\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"Use ExpressRoute circuits from different peering locations for redundancy. Check [this link](https://learn.microsoft.com/azure/expressroute/designing-for-disaster-recovery-with-expressroute-privatepeering#need-for-redundant-connectivity-solution) for further information.. [This training](https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/) can help to educate yourself on this.\"\n },\n \"name\": \"querytext12\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"resources | where type=='microsoft.network/connections' | where properties.connectionType == 'ExpressRoute' | project cxId=id, gwId=tostring(properties.virtualNetworkGateway1.id), circuitId=tostring(properties.peer.id) | join (resources | where type=='microsoft.network/expressroutecircuits' | project circuitId=tostring(id), circuitLocation=tostring(properties.serviceProviderProperties.peeringLocation)) on circuitId | distinct gwId, circuitLocation | summarize countErLocations=count() by id=gwId | extend compliant = (countErLocations >= 2) | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed\",\n \"size\": 0,\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"gridSettings\": {\n \"formatters\": [\n {\n \"columnMatch\": \"id\",\n \"formatter\": 0,\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n {\n \"columnMatch\": \"compliant\",\n \"formatter\": 18,\n \"formatOptions\": {\n \"thresholdsOptions\": \"icons\",\n \"thresholdsGrid\": [\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"1\",\n \"representation\": \"success\",\n \"text\": \"Success\"\n },\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"0\",\n \"representation\": \"failed\",\n \"text\": \"Failed\"\n },\n {\n \"operator\": \"Default\",\n \"thresholdValue\": null,\n \"representation\": \"unknown\",\n \"text\": \"Unknown\"\n }\n ]\n }\n }\n ]\n }\n },\n \"name\": \"query12\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"If you are using a route table in the GatewaySubnet, make sure that gateway routes are propagated. Check [this link](https://learn.microsoft.com/azure/vpn-gateway/vpn-gateway-about-vpn-gateway-settings#gwsub) for further information.\"\n },\n \"name\": \"querytext13\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"resources | where type=='microsoft.network/virtualnetworks' | project id,resourceGroup,name,subnets=properties.subnets | mv-expand subnets | project id,resourceGroup,name,subnetName=tostring(subnets.name),routeTableId=tostring(subnets.properties.routeTable.id) | where subnetName == 'GatewaySubnet' | join kind=leftouter (Resources | where type == 'microsoft.network/routetables' | project routeTableName=name,routeTableId=id, disableBgpRoutePropagation=properties.disableBgpRoutePropagation) on routeTableId | project id,compliant = (disableBgpRoutePropagation == False or isnull(disableBgpRoutePropagation)) | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed\",\n \"size\": 0,\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"gridSettings\": {\n \"formatters\": [\n {\n \"columnMatch\": \"id\",\n \"formatter\": 0,\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n {\n \"columnMatch\": \"compliant\",\n \"formatter\": 18,\n \"formatOptions\": {\n \"thresholdsOptions\": \"icons\",\n \"thresholdsGrid\": [\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"1\",\n \"representation\": \"success\",\n \"text\": \"Success\"\n },\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"0\",\n \"representation\": \"failed\",\n \"text\": \"Failed\"\n },\n {\n \"operator\": \"Default\",\n \"thresholdValue\": null,\n \"representation\": \"unknown\",\n \"text\": \"Unknown\"\n }\n ]\n }\n }\n ]\n }\n },\n \"name\": \"query13\"\n }\n ]\n },\n \"conditionalVisibility\": {\n \"parameterName\": \"VisibleTab\",\n \"comparison\": \"isEqualTo\",\n \"value\": \"tab7\"\n },\n \"name\": \"tab7\"\n }\n ],\n \"$schema\": \"https://github.com/Microsoft/Application-Insights-Workbooks/blob/master/schema/workbook.json\"\n}", + "serializedData": "{\n \"version\": \"Notebook/1.0\",\n \"items\": [\n {\n \"type\": 9,\n \"content\": {\n \"version\": \"KqlParameterItem/1.0\",\n \"parameters\": [\n {\n \"id\": \"497a107e-dde8-433e-b263-35ac8e8f7834\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Subscription\",\n \"type\": 6,\n \"multiSelect\": true,\n \"quote\": \"'\",\n \"delimiter\": \",\",\n \"typeSettings\": {\n \"additionalResourceOptions\": [\n \"value::all\"\n ],\n \"includeAll\": true,\n \"showDefault\": false\n },\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"value\": [\n \"value::all\"\n ]\n },\n {\n \"id\": \"844e4f4e-df51-4e3c-8eaf-0dc78b92c721\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"OnlyFailed\",\n \"label\": \"Only show failed\",\n \"type\": 2,\n \"typeSettings\": {\n \"additionalResourceOptions\": [],\n \"showDefault\": false\n },\n \"jsonData\": \"[\\r\\n { \\\"value\\\":true, \\\"label\\\":\\\"True\\\" },\\r\\n { \\\"value\\\":false, \\\"label\\\":\\\"False\\\", \\\"selected\\\":true }\\r\\n]\"\n }\n ],\n \"style\": \"pills\",\n \"queryType\": 0,\n \"resourceType\": \"microsoft.operationalinsights/workspaces\"\n },\n \"name\": \"WorkbookSelectors\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"If you set \\\"Only show failed\\\" to \\\"Yes\\\", the different queries will only show items that have failed their compliance checks.\",\n \"style\": \"info\"\n },\n \"name\": \"InfoBox\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"## Azure Landing Zone Review - Network\\n\\n---\\n\\nThis workbook has been automatically generated out of the checklists in the [Azure Review Checklists repo](https://github.com/Azure/review-checklists). This repo contains best practices and recommendations around generic Landing Zones as well as specific services such as Azure Virtual Desktop, Azure Kubernetes Service or Azure VMware Solution, to name a few. This repository of best practices is curated by Azure engineers, but open to anybody to contribute.\\n\\nIf you see a problem in the queries that are part of this workbook, please open a Github issue [here](https://github.com/Azure/review-checklists/issues/new).\"\n },\n \"customWidth\": \"100\",\n \"name\": \"MarkdownHeader\"\n },\n {\n \"type\": 11,\n \"content\": {\n \"version\": \"LinkItem/1.0\",\n \"style\": \"tabs\",\n \"links\": [\n {\n \"id\": \"87a147f8-995c-4a70-a074-7adb8e7edea5\",\n \"cellValue\": \"VisibleTab\",\n \"linkTarget\": \"parameter\",\n \"linkLabel\": \"IP plan\",\n \"subTarget\": \"tab0\",\n \"preText\": \"IP plan\",\n \"style\": \"primary\"\n },\n {\n \"id\": \"8856bd09-4876-45f8-92b7-394da81de578\",\n \"cellValue\": \"VisibleTab\",\n \"linkTarget\": \"parameter\",\n \"linkLabel\": \"Hub and spoke\",\n \"subTarget\": \"tab1\",\n \"preText\": \"Hub and spoke\",\n \"style\": \"primary\"\n },\n {\n \"id\": \"c9767a8e-b7e6-4f0b-beed-3ec653839908\",\n \"cellValue\": \"VisibleTab\",\n \"linkTarget\": \"parameter\",\n \"linkLabel\": \"Segmentation\",\n \"subTarget\": \"tab2\",\n \"preText\": \"Segmentation\",\n \"style\": \"primary\"\n },\n {\n \"id\": \"be0e92d2-cad0-4085-965a-f47e82a6d204\",\n \"cellValue\": \"VisibleTab\",\n \"linkTarget\": \"parameter\",\n \"linkLabel\": \"Virtual WAN\",\n \"subTarget\": \"tab3\",\n \"preText\": \"Virtual WAN\",\n \"style\": \"primary\"\n },\n {\n \"id\": \"8b83300e-51ba-4c2b-bd93-0ec0396c329d\",\n \"cellValue\": \"VisibleTab\",\n \"linkTarget\": \"parameter\",\n \"linkLabel\": \"Hybrid\",\n \"subTarget\": \"tab4\",\n \"preText\": \"Hybrid\",\n \"style\": \"primary\"\n },\n {\n \"id\": \"a93e1629-85aa-4ed9-9c69-7562e844e762\",\n \"cellValue\": \"VisibleTab\",\n \"linkTarget\": \"parameter\",\n \"linkLabel\": \"Firewall\",\n \"subTarget\": \"tab5\",\n \"preText\": \"Firewall\",\n \"style\": \"primary\"\n },\n {\n \"id\": \"cb3b9213-cc5c-430a-a4fe-f0e90fce0aa8\",\n \"cellValue\": \"VisibleTab\",\n \"linkTarget\": \"parameter\",\n \"linkLabel\": \"PaaS\",\n \"subTarget\": \"tab6\",\n \"preText\": \"PaaS\",\n \"style\": \"primary\"\n },\n {\n \"id\": \"9f04eca6-37f9-4ffe-b646-e9fd67e1281d\",\n \"cellValue\": \"VisibleTab\",\n \"linkTarget\": \"parameter\",\n \"linkLabel\": \"Internet\",\n \"subTarget\": \"tab7\",\n \"preText\": \"Internet\",\n \"style\": \"primary\"\n }\n ]\n },\n \"name\": \"Tabs\"\n },\n {\n \"type\": 12,\n \"content\": {\n \"version\": \"NotebookGroup/1.0\",\n \"groupType\": \"editable\",\n \"items\": [\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"## IP plan\"\n },\n \"name\": \"tab0title\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"Use IP addresses from the address allocation ranges for private internets (RFC 1918). Check [this link](https://learn.microsoft.com/azure/cloud-adoption-framework/ready/azure-best-practices/plan-for-ip-addressing) for further information.. [This training](https://learn.microsoft.com/learn/paths/architect-network-infrastructure/) can help to educate yourself on this.\"\n },\n \"name\": \"querytext4\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"resources | where type == 'microsoft.network/virtualnetworks' | extend addressSpace = todynamic(properties.addressSpace) | extend addressPrefix = todynamic(properties.addressSpace.addressPrefixes) | mvexpand addressSpace | mvexpand addressPrefix | project name, id, location, resourceGroup, subscriptionId, cidr = addressPrefix | extend compliant = (cidr matches regex @'^(10\\\\.|172\\\\.(1[6-9]|2[0-9]|3[01])\\\\.|192\\\\.168\\\\.)') | project id, compliant, cidr | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed\",\n \"size\": 0,\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"gridSettings\": {\n \"formatters\": [\n {\n \"columnMatch\": \"id\",\n \"formatter\": 0,\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n {\n \"columnMatch\": \"compliant\",\n \"formatter\": 18,\n \"formatOptions\": {\n \"thresholdsOptions\": \"icons\",\n \"thresholdsGrid\": [\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"1\",\n \"representation\": \"success\",\n \"text\": \"Success\"\n },\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"0\",\n \"representation\": \"failed\",\n \"text\": \"Failed\"\n },\n {\n \"operator\": \"Default\",\n \"thresholdValue\": null,\n \"representation\": \"unknown\",\n \"text\": \"Unknown\"\n }\n ]\n }\n }\n ]\n }\n },\n \"name\": \"query4\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"Ensure that IP address space isn't wasted, don't create unnecessarily large virtual networks (for example /16). Check [this link](https://learn.microsoft.com/azure/cloud-adoption-framework/ready/azure-best-practices/plan-for-ip-addressing) for further information.. [This training](https://learn.microsoft.com/learn/paths/architect-network-infrastructure/) can help to educate yourself on this.\"\n },\n \"name\": \"querytext5\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"resources | where type == 'microsoft.network/virtualnetworks' | extend addressSpace = todynamic(properties.addressSpace) | extend addressPrefix = todynamic(properties.addressSpace.addressPrefixes) | mvexpand addressSpace | mvexpand addressPrefix | extend addressMask = split(addressPrefix,'/')[1] | extend compliant = addressMask > 16 | project name, id, subscriptionId, resourceGroup, addressPrefix, compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed\",\n \"size\": 0,\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"gridSettings\": {\n \"formatters\": [\n {\n \"columnMatch\": \"id\",\n \"formatter\": 0,\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n {\n \"columnMatch\": \"compliant\",\n \"formatter\": 18,\n \"formatOptions\": {\n \"thresholdsOptions\": \"icons\",\n \"thresholdsGrid\": [\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"1\",\n \"representation\": \"success\",\n \"text\": \"Success\"\n },\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"0\",\n \"representation\": \"failed\",\n \"text\": \"Failed\"\n },\n {\n \"operator\": \"Default\",\n \"thresholdValue\": null,\n \"representation\": \"unknown\",\n \"text\": \"Unknown\"\n }\n ]\n }\n }\n ]\n }\n },\n \"name\": \"query5\"\n }\n ]\n },\n \"conditionalVisibility\": {\n \"parameterName\": \"VisibleTab\",\n \"comparison\": \"isEqualTo\",\n \"value\": \"tab0\"\n },\n \"name\": \"tab0\"\n },\n {\n \"type\": 12,\n \"content\": {\n \"version\": \"NotebookGroup/1.0\",\n \"groupType\": \"editable\",\n \"items\": [\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"## Hub and spoke\"\n },\n \"name\": \"tab1title\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"If using Route Server, use a /27 prefix for the Route Server subnet. Check [this link](https://learn.microsoft.com/azure/route-server/quickstart-configure-route-server-portal#create-a-route-server-1) for further information.. [This training](https://learn.microsoft.com/training/modules/intro-to-azure-route-server/) can help to educate yourself on this.\"\n },\n \"name\": \"querytext0\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"resources | where type=='microsoft.network/virtualnetworks' | project id,subnets=properties.subnets | mv-expand subnets | project id, subnetName = subnets.name, subnetPrefix = subnets.properties.addressPrefix | extend subnetPrefixLength = split(subnetPrefix, '/')[1] | where subnetName == 'RouteServerSubnet' | extend compliant = (subnetPrefixLength <= 27) | distinct id, compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed\",\n \"size\": 0,\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"gridSettings\": {\n \"formatters\": [\n {\n \"columnMatch\": \"id\",\n \"formatter\": 0,\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n {\n \"columnMatch\": \"compliant\",\n \"formatter\": 18,\n \"formatOptions\": {\n \"thresholdsOptions\": \"icons\",\n \"thresholdsGrid\": [\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"1\",\n \"representation\": \"success\",\n \"text\": \"Success\"\n },\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"0\",\n \"representation\": \"failed\",\n \"text\": \"Failed\"\n },\n {\n \"operator\": \"Default\",\n \"thresholdValue\": null,\n \"representation\": \"unknown\",\n \"text\": \"Unknown\"\n }\n ]\n }\n }\n ]\n }\n },\n \"name\": \"query0\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"If you have more than 400 spoke networks in a region, deploy an additional hub to bypass VNet peering limits (500) and the maximum number of prefixes that can be advertised via ExpressRoute (1000). Check [this link](https://learn.microsoft.com/azure/azure-resource-manager/management/azure-subscription-service-limits?toc=/azure/virtual-network/toc.json#azure-resource-manager-virtual-networking-limits) for further information.. [This training](https://learn.microsoft.com/training/modules/hub-and-spoke-network-architecture/) can help to educate yourself on this.\"\n },\n \"name\": \"querytext1\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"resources | where type == 'microsoft.network/virtualnetworks' | mvexpand properties.virtualNetworkPeerings | summarize peeringcount = count() by id | extend compliant = (peeringcount < 450) | distinct id,compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed\",\n \"size\": 0,\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"gridSettings\": {\n \"formatters\": [\n {\n \"columnMatch\": \"id\",\n \"formatter\": 0,\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n {\n \"columnMatch\": \"compliant\",\n \"formatter\": 18,\n \"formatOptions\": {\n \"thresholdsOptions\": \"icons\",\n \"thresholdsGrid\": [\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"1\",\n \"representation\": \"success\",\n \"text\": \"Success\"\n },\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"0\",\n \"representation\": \"failed\",\n \"text\": \"Failed\"\n },\n {\n \"operator\": \"Default\",\n \"thresholdValue\": null,\n \"representation\": \"unknown\",\n \"text\": \"Unknown\"\n }\n ]\n }\n }\n ]\n }\n },\n \"name\": \"query1\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"Limit the number of routes per route table to 400. Check [this link](https://learn.microsoft.com/azure/azure-resource-manager/management/azure-subscription-service-limits?toc=/azure/virtual-network/toc.json#azure-resource-manager-virtual-networking-limits) for further information.. [This training](https://learn.microsoft.com/training/modules/hub-and-spoke-network-architecture/) can help to educate yourself on this.\"\n },\n \"name\": \"querytext2\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"resources | where type=='microsoft.network/routetables' | mvexpand properties.routes | summarize routeCount = count() by id | extend compliant = (routeCount < 360) | distinct id,compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed\",\n \"size\": 0,\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"gridSettings\": {\n \"formatters\": [\n {\n \"columnMatch\": \"id\",\n \"formatter\": 0,\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n {\n \"columnMatch\": \"compliant\",\n \"formatter\": 18,\n \"formatOptions\": {\n \"thresholdsOptions\": \"icons\",\n \"thresholdsGrid\": [\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"1\",\n \"representation\": \"success\",\n \"text\": \"Success\"\n },\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"0\",\n \"representation\": \"failed\",\n \"text\": \"Failed\"\n },\n {\n \"operator\": \"Default\",\n \"thresholdValue\": null,\n \"representation\": \"unknown\",\n \"text\": \"Unknown\"\n }\n ]\n }\n }\n ]\n }\n },\n \"name\": \"query2\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"Use the setting 'Allow traffic to remote virtual network' when configuring VNet peerings. Check [this link](https://learn.microsoft.com/azure/virtual-network/virtual-network-manage-peering) for further information.. [This training](https://learn.microsoft.com/training/modules/hub-and-spoke-network-architecture/) can help to educate yourself on this.\"\n },\n \"name\": \"querytext3\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"resources | where type == 'microsoft.network/virtualnetworks' | mvexpand properties.virtualNetworkPeerings | project id, peeringName=properties_virtualNetworkPeerings.name, compliant = (properties_virtualNetworkPeerings.properties.allowVirtualNetworkAccess == True) | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed\",\n \"size\": 0,\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"gridSettings\": {\n \"formatters\": [\n {\n \"columnMatch\": \"id\",\n \"formatter\": 0,\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n {\n \"columnMatch\": \"compliant\",\n \"formatter\": 18,\n \"formatOptions\": {\n \"thresholdsOptions\": \"icons\",\n \"thresholdsGrid\": [\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"1\",\n \"representation\": \"success\",\n \"text\": \"Success\"\n },\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"0\",\n \"representation\": \"failed\",\n \"text\": \"Failed\"\n },\n {\n \"operator\": \"Default\",\n \"thresholdValue\": null,\n \"representation\": \"unknown\",\n \"text\": \"Unknown\"\n }\n ]\n }\n }\n ]\n }\n },\n \"name\": \"query3\"\n }\n ]\n },\n \"conditionalVisibility\": {\n \"parameterName\": \"VisibleTab\",\n \"comparison\": \"isEqualTo\",\n \"value\": \"tab1\"\n },\n \"name\": \"tab1\"\n },\n {\n \"type\": 12,\n \"content\": {\n \"version\": \"NotebookGroup/1.0\",\n \"groupType\": \"editable\",\n \"items\": [\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"## Segmentation\"\n },\n \"name\": \"tab2title\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"Use a /26 prefix for your Azure Firewall subnets. Check [this link](https://learn.microsoft.com/azure/firewall/firewall-faq#why-does-azure-firewall-need-a--26-subnet-size) for further information.. [This training](https://learn.microsoft.com/training/modules/introduction-azure-firewall/) can help to educate yourself on this.\"\n },\n \"name\": \"querytext19\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"resources | where type=='microsoft.network/virtualnetworks' | project id,subnets=properties.subnets | mv-expand subnets | project id, subnetName = subnets.name, subnetPrefix = subnets.properties.addressPrefix | extend subnetPrefixLength = split(subnetPrefix, '/')[1] | where subnetName == 'AzureFirewallSubnet' | extend compliant = (subnetPrefixLength == 26) | distinct id, compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed\",\n \"size\": 0,\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"gridSettings\": {\n \"formatters\": [\n {\n \"columnMatch\": \"id\",\n \"formatter\": 0,\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n {\n \"columnMatch\": \"compliant\",\n \"formatter\": 18,\n \"formatOptions\": {\n \"thresholdsOptions\": \"icons\",\n \"thresholdsGrid\": [\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"1\",\n \"representation\": \"success\",\n \"text\": \"Success\"\n },\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"0\",\n \"representation\": \"failed\",\n \"text\": \"Failed\"\n },\n {\n \"operator\": \"Default\",\n \"thresholdValue\": null,\n \"representation\": \"unknown\",\n \"text\": \"Unknown\"\n }\n ]\n }\n }\n ]\n }\n },\n \"name\": \"query19\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"Use at least a /27 prefix for your Gateway subnets. Check [this link](https://learn.microsoft.com/azure/expressroute/expressroute-howto-add-gateway-resource-manager#add-a-gateway) for further information.\"\n },\n \"name\": \"querytext21\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"resources | where type=='microsoft.network/virtualnetworks' | project id,subnets=properties.subnets | mv-expand subnets | project id, subnetName = subnets.name, subnetPrefix = subnets.properties.addressPrefix | extend subnetPrefixLength = split(subnetPrefix, '/')[1] | where subnetName == 'GatewaySubnet' | extend compliant = (subnetPrefixLength <= 27) | distinct id, compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed\",\n \"size\": 0,\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"gridSettings\": {\n \"formatters\": [\n {\n \"columnMatch\": \"id\",\n \"formatter\": 0,\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n {\n \"columnMatch\": \"compliant\",\n \"formatter\": 18,\n \"formatOptions\": {\n \"thresholdsOptions\": \"icons\",\n \"thresholdsGrid\": [\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"1\",\n \"representation\": \"success\",\n \"text\": \"Success\"\n },\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"0\",\n \"representation\": \"failed\",\n \"text\": \"Failed\"\n },\n {\n \"operator\": \"Default\",\n \"thresholdValue\": null,\n \"representation\": \"unknown\",\n \"text\": \"Unknown\"\n }\n ]\n }\n }\n ]\n }\n },\n \"name\": \"query21\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"Don't rely on the NSG inbound default rules using the VirtualNetwork service tag to limit connectivity. Check [this link](https://learn.microsoft.com/azure/virtual-network/service-tags-overview#available-service-tags) for further information.\"\n },\n \"name\": \"querytext22\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"resources | where type=='microsoft.network/networksecuritygroups' | mvexpand properties.securityRules | project id,name,ruleAction=properties_securityRules.properties.access,rulePriority=properties_securityRules.properties.priority,ruleDst=properties_securityRules.properties.destinationAddressPrefix,ruleSrc=properties_securityRules.properties.sourceAddressPrefix,ruleProt=properties_securityRules.properties.protocol,ruleDirection=properties_securityRules.properties.direction,rulePort=properties_securityRules.properties.destinationPortRange | summarize StarDenies=countif(ruleAction=='Deny' and ruleDst=='*' and ruleSrc=='*' and ruleProt=='*' and rulePort=='*') by id,tostring(ruleDirection) | where ruleDirection == 'Inbound' | project id,compliant=(StarDenies>0) | union (resources | where type=='microsoft.network/networksecuritygroups' | where array_length(properties.securityRules)==0 | extend compliant=false | project id,compliant) | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed\",\n \"size\": 0,\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"gridSettings\": {\n \"formatters\": [\n {\n \"columnMatch\": \"id\",\n \"formatter\": 0,\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n {\n \"columnMatch\": \"compliant\",\n \"formatter\": 18,\n \"formatOptions\": {\n \"thresholdsOptions\": \"icons\",\n \"thresholdsGrid\": [\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"1\",\n \"representation\": \"success\",\n \"text\": \"Success\"\n },\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"0\",\n \"representation\": \"failed\",\n \"text\": \"Failed\"\n },\n {\n \"operator\": \"Default\",\n \"thresholdValue\": null,\n \"representation\": \"unknown\",\n \"text\": \"Unknown\"\n }\n ]\n }\n }\n ]\n }\n },\n \"name\": \"query22\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"Do not implement more than 900 NSG rules per NSG, due to the limit of 1000 rules. Check [this link](https://learn.microsoft.com/azure/azure-resource-manager/management/azure-subscription-service-limits) for further information.. [This training](https://learn.microsoft.com/azure/virtual-network/network-security-group-how-it-works) can help to educate yourself on this.\"\n },\n \"name\": \"querytext23\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"resources | where type == 'microsoft.network/networksecuritygroups' | project id, rules = array_length(properties.securityRules) | project id, compliant = (rules < 900) | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed\",\n \"size\": 0,\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"gridSettings\": {\n \"formatters\": [\n {\n \"columnMatch\": \"id\",\n \"formatter\": 0,\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n {\n \"columnMatch\": \"compliant\",\n \"formatter\": 18,\n \"formatOptions\": {\n \"thresholdsOptions\": \"icons\",\n \"thresholdsGrid\": [\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"1\",\n \"representation\": \"success\",\n \"text\": \"Success\"\n },\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"0\",\n \"representation\": \"failed\",\n \"text\": \"Failed\"\n },\n {\n \"operator\": \"Default\",\n \"thresholdValue\": null,\n \"representation\": \"unknown\",\n \"text\": \"Unknown\"\n }\n ]\n }\n }\n ]\n }\n },\n \"name\": \"query23\"\n }\n ]\n },\n \"conditionalVisibility\": {\n \"parameterName\": \"VisibleTab\",\n \"comparison\": \"isEqualTo\",\n \"value\": \"tab2\"\n },\n \"name\": \"tab2\"\n },\n {\n \"type\": 12,\n \"content\": {\n \"version\": \"NotebookGroup/1.0\",\n \"groupType\": \"editable\",\n \"items\": [\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"## Virtual WAN\"\n },\n \"name\": \"tab3title\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"For outbound Internet traffic protection and filtering, deploy Azure Firewall in secured hubs. Check [this link](https://learn.microsoft.com/azure/virtual-wan/howto-firewall) for further information.. [This training](https://learn.microsoft.com/learn/paths/secure-networking-infrastructure/) can help to educate yourself on this.\"\n },\n \"name\": \"querytext24\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"resources | where type=='microsoft.network/virtualhubs' | extend compliant = isnotnull(properties.azureFirewall.id) | project id, compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed\",\n \"size\": 0,\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"gridSettings\": {\n \"formatters\": [\n {\n \"columnMatch\": \"id\",\n \"formatter\": 0,\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n {\n \"columnMatch\": \"compliant\",\n \"formatter\": 18,\n \"formatOptions\": {\n \"thresholdsOptions\": \"icons\",\n \"thresholdsGrid\": [\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"1\",\n \"representation\": \"success\",\n \"text\": \"Success\"\n },\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"0\",\n \"representation\": \"failed\",\n \"text\": \"Failed\"\n },\n {\n \"operator\": \"Default\",\n \"thresholdValue\": null,\n \"representation\": \"unknown\",\n \"text\": \"Unknown\"\n }\n ]\n }\n }\n ]\n }\n },\n \"name\": \"query24\"\n }\n ]\n },\n \"conditionalVisibility\": {\n \"parameterName\": \"VisibleTab\",\n \"comparison\": \"isEqualTo\",\n \"value\": \"tab3\"\n },\n \"name\": \"tab3\"\n },\n {\n \"type\": 12,\n \"content\": {\n \"version\": \"NotebookGroup/1.0\",\n \"groupType\": \"editable\",\n \"items\": [\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"## Hybrid\"\n },\n \"name\": \"tab4title\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"Select the right SKU for the ExpressRoute/VPN gateways based on bandwidth and performance requirements. Check [this link](https://learn.microsoft.com/azure/expressroute/expressroute-about-virtual-network-gateways?source=recommendations#gwsku) for further information.. [This training](https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/) can help to educate yourself on this.\"\n },\n \"name\": \"querytext7\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"resources| where type == 'microsoft.network/virtualnetworkgateways'| where properties.gatewayType =~ 'vpn' or properties.gatewayType == 'ExpressRoute'| extend SKUName = properties.sku.name, SKUTier = properties.sku.tier, Type = properties.gatewayType| extend compliant = SKUTier !in ('Basic', 'Standard')| project name, id, subscriptionId, resourceGroup, compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed\",\n \"size\": 0,\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"gridSettings\": {\n \"formatters\": [\n {\n \"columnMatch\": \"id\",\n \"formatter\": 0,\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n {\n \"columnMatch\": \"compliant\",\n \"formatter\": 18,\n \"formatOptions\": {\n \"thresholdsOptions\": \"icons\",\n \"thresholdsGrid\": [\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"1\",\n \"representation\": \"success\",\n \"text\": \"Success\"\n },\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"0\",\n \"representation\": \"failed\",\n \"text\": \"Failed\"\n },\n {\n \"operator\": \"Default\",\n \"thresholdValue\": null,\n \"representation\": \"unknown\",\n \"text\": \"Unknown\"\n }\n ]\n }\n }\n ]\n }\n },\n \"name\": \"query7\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"Ensure that you're using unlimited-data ExpressRoute circuits only if you reach the bandwidth that justifies their cost. Check [this link](https://learn.microsoft.com/azure/expressroute/plan-manage-cost) for further information.. [This training](https://learn.microsoft.com/training/modules/design-implement-azure-expressroute/) can help to educate yourself on this.\"\n },\n \"name\": \"querytext8\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"resources | where type=='microsoft.network/expressroutecircuits' | extend compliant = (tolower(sku.family) == 'metereddata' or tolower(sku.tier) == 'local') | distinct id,compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed\",\n \"size\": 0,\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"gridSettings\": {\n \"formatters\": [\n {\n \"columnMatch\": \"id\",\n \"formatter\": 0,\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n {\n \"columnMatch\": \"compliant\",\n \"formatter\": 18,\n \"formatOptions\": {\n \"thresholdsOptions\": \"icons\",\n \"thresholdsGrid\": [\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"1\",\n \"representation\": \"success\",\n \"text\": \"Success\"\n },\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"0\",\n \"representation\": \"failed\",\n \"text\": \"Failed\"\n },\n {\n \"operator\": \"Default\",\n \"thresholdValue\": null,\n \"representation\": \"unknown\",\n \"text\": \"Unknown\"\n }\n ]\n }\n }\n ]\n }\n },\n \"name\": \"query8\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"Leverage the Local SKU of ExpressRoute to reduce the cost of your circuits, if your circuit peering location supports your Azure regions for the Local SKU. Check [this link](https://learn.microsoft.com/azure/expressroute/expressroute-faqs#expressroute-local) for further information.. [This training](https://learn.microsoft.com/training/modules/design-implement-azure-expressroute/) can help to educate yourself on this.\"\n },\n \"name\": \"querytext9\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"resources | where type=='microsoft.network/connections' | where properties.connectionType == 'ExpressRoute' | project id, gwid=tostring(properties.virtualNetworkGateway1.id), circuitid=tostring(properties.peer.id) | join (resources | where type=='microsoft.network/expressroutecircuits' | project circuitid=tostring(id), circuitsku=sku.tier) on circuitid | project id=gwid, compliant = (circuitsku == 'Local') | summarize compliant=max(compliant) by id | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed\",\n \"size\": 0,\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"gridSettings\": {\n \"formatters\": [\n {\n \"columnMatch\": \"id\",\n \"formatter\": 0,\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n {\n \"columnMatch\": \"compliant\",\n \"formatter\": 18,\n \"formatOptions\": {\n \"thresholdsOptions\": \"icons\",\n \"thresholdsGrid\": [\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"1\",\n \"representation\": \"success\",\n \"text\": \"Success\"\n },\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"0\",\n \"representation\": \"failed\",\n \"text\": \"Failed\"\n },\n {\n \"operator\": \"Default\",\n \"thresholdValue\": null,\n \"representation\": \"unknown\",\n \"text\": \"Unknown\"\n }\n ]\n }\n }\n ]\n }\n },\n \"name\": \"query9\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"Deploy a zone-redundant ExpressRoute gateway in the supported Azure regions. Check [this link](https://learn.microsoft.com/azure/expressroute/expressroute-about-virtual-network-gateways) for further information.. [This training](https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/) can help to educate yourself on this.\"\n },\n \"name\": \"querytext10\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"resources| where type == 'microsoft.network/virtualnetworkgateways'| where properties.gatewayType =~ 'vpn' or properties.gatewayType == 'ExpressRoute'| extend SKUName = properties.sku.name, SKUTier = properties.sku.tier, Type = properties.gatewayType| extend compliant = SKUTier contains 'AZ'| project name, id, subscriptionId, resourceGroup, Type, compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed\",\n \"size\": 0,\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"gridSettings\": {\n \"formatters\": [\n {\n \"columnMatch\": \"id\",\n \"formatter\": 0,\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n {\n \"columnMatch\": \"compliant\",\n \"formatter\": 18,\n \"formatOptions\": {\n \"thresholdsOptions\": \"icons\",\n \"thresholdsGrid\": [\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"1\",\n \"representation\": \"success\",\n \"text\": \"Success\"\n },\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"0\",\n \"representation\": \"failed\",\n \"text\": \"Failed\"\n },\n {\n \"operator\": \"Default\",\n \"thresholdValue\": null,\n \"representation\": \"unknown\",\n \"text\": \"Unknown\"\n }\n ]\n }\n }\n ]\n }\n },\n \"name\": \"query10\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"Use zone-redundant VPN gateways to connect branches or remote locations to Azure (where available). Check [this link](https://learn.microsoft.com/azure/vpn-gateway/create-zone-redundant-vnet-gateway) for further information.. [This training](https://learn.microsoft.com/training/modules/intro-to-azure-vpn-gateway/) can help to educate yourself on this.\"\n },\n \"name\": \"querytext11\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"resources | where type=='microsoft.network/virtualnetworkgateways' | where properties.gatewayType == 'Vpn' | extend compliant = (tolower(properties.sku.name) contains 'az') | distinct id, compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed\",\n \"size\": 0,\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"gridSettings\": {\n \"formatters\": [\n {\n \"columnMatch\": \"id\",\n \"formatter\": 0,\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n {\n \"columnMatch\": \"compliant\",\n \"formatter\": 18,\n \"formatOptions\": {\n \"thresholdsOptions\": \"icons\",\n \"thresholdsGrid\": [\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"1\",\n \"representation\": \"success\",\n \"text\": \"Success\"\n },\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"0\",\n \"representation\": \"failed\",\n \"text\": \"Failed\"\n },\n {\n \"operator\": \"Default\",\n \"thresholdValue\": null,\n \"representation\": \"unknown\",\n \"text\": \"Unknown\"\n }\n ]\n }\n }\n ]\n }\n },\n \"name\": \"query11\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"Use ExpressRoute circuits from different peering locations for redundancy. Check [this link](https://learn.microsoft.com/azure/expressroute/designing-for-disaster-recovery-with-expressroute-privatepeering#need-for-redundant-connectivity-solution) for further information.. [This training](https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/) can help to educate yourself on this.\"\n },\n \"name\": \"querytext12\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"resources | where type=='microsoft.network/connections' | where properties.connectionType == 'ExpressRoute' | project cxId=id, gwId=tostring(properties.virtualNetworkGateway1.id), circuitId=tostring(properties.peer.id) | join (resources | where type=='microsoft.network/expressroutecircuits' | project circuitId=tostring(id), circuitLocation=tostring(properties.serviceProviderProperties.peeringLocation)) on circuitId | distinct gwId, circuitLocation | summarize countErLocations=count() by id=gwId | extend compliant = (countErLocations >= 2) | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed\",\n \"size\": 0,\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"gridSettings\": {\n \"formatters\": [\n {\n \"columnMatch\": \"id\",\n \"formatter\": 0,\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n {\n \"columnMatch\": \"compliant\",\n \"formatter\": 18,\n \"formatOptions\": {\n \"thresholdsOptions\": \"icons\",\n \"thresholdsGrid\": [\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"1\",\n \"representation\": \"success\",\n \"text\": \"Success\"\n },\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"0\",\n \"representation\": \"failed\",\n \"text\": \"Failed\"\n },\n {\n \"operator\": \"Default\",\n \"thresholdValue\": null,\n \"representation\": \"unknown\",\n \"text\": \"Unknown\"\n }\n ]\n }\n }\n ]\n }\n },\n \"name\": \"query12\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"If you are using a route table in the GatewaySubnet, make sure that gateway routes are propagated. Check [this link](https://learn.microsoft.com/azure/vpn-gateway/vpn-gateway-about-vpn-gateway-settings#gwsub) for further information.\"\n },\n \"name\": \"querytext13\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"resources | where type=='microsoft.network/virtualnetworks' | project id,resourceGroup,name,subnets=properties.subnets | mv-expand subnets | project id,resourceGroup,name,subnetName=tostring(subnets.name),routeTableId=tostring(subnets.properties.routeTable.id) | where subnetName == 'GatewaySubnet' | join kind=leftouter (Resources | where type == 'microsoft.network/routetables' | project routeTableName=name,routeTableId=id, disableBgpRoutePropagation=properties.disableBgpRoutePropagation) on routeTableId | project id,compliant = (disableBgpRoutePropagation == False or isnull(disableBgpRoutePropagation)) | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed\",\n \"size\": 0,\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"gridSettings\": {\n \"formatters\": [\n {\n \"columnMatch\": \"id\",\n \"formatter\": 0,\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n {\n \"columnMatch\": \"compliant\",\n \"formatter\": 18,\n \"formatOptions\": {\n \"thresholdsOptions\": \"icons\",\n \"thresholdsGrid\": [\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"1\",\n \"representation\": \"success\",\n \"text\": \"Success\"\n },\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"0\",\n \"representation\": \"failed\",\n \"text\": \"Failed\"\n },\n {\n \"operator\": \"Default\",\n \"thresholdValue\": null,\n \"representation\": \"unknown\",\n \"text\": \"Unknown\"\n }\n ]\n }\n }\n ]\n }\n },\n \"name\": \"query13\"\n }\n ]\n },\n \"conditionalVisibility\": {\n \"parameterName\": \"VisibleTab\",\n \"comparison\": \"isEqualTo\",\n \"value\": \"tab4\"\n },\n \"name\": \"tab4\"\n },\n {\n \"type\": 12,\n \"content\": {\n \"version\": \"NotebookGroup/1.0\",\n \"groupType\": \"editable\",\n \"items\": [\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"## Firewall\"\n },\n \"name\": \"tab5title\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"Use application rules to filter outbound traffic on destination host name for supported protocols. Use FQDN-based network rules and Azure Firewall with DNS proxy to filter egress traffic to the Internet over other protocols. Check [this link](https://learn.microsoft.com/azure/firewall/fqdn-filtering-network-rules) for further information.. [This training](https://learn.microsoft.com/learn/paths/secure-networking-infrastructure/) can help to educate yourself on this.\"\n },\n \"name\": \"querytext14\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"resources | where type=='microsoft.network/firewallpolicies' | extend compliant = (properties.dnsSettings.enableProxy == true) | distinct id,compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed\",\n \"size\": 0,\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"gridSettings\": {\n \"formatters\": [\n {\n \"columnMatch\": \"id\",\n \"formatter\": 0,\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n {\n \"columnMatch\": \"compliant\",\n \"formatter\": 18,\n \"formatOptions\": {\n \"thresholdsOptions\": \"icons\",\n \"thresholdsGrid\": [\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"1\",\n \"representation\": \"success\",\n \"text\": \"Success\"\n },\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"0\",\n \"representation\": \"failed\",\n \"text\": \"Failed\"\n },\n {\n \"operator\": \"Default\",\n \"thresholdValue\": null,\n \"representation\": \"unknown\",\n \"text\": \"Unknown\"\n }\n ]\n }\n }\n ]\n }\n },\n \"name\": \"query14\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"Use Azure Firewall Premium to enable additional security features. Check [this link](https://learn.microsoft.com/azure/firewall/premium-features) for further information.. [This training](https://learn.microsoft.com/training/modules/introduction-azure-firewall/) can help to educate yourself on this.\"\n },\n \"name\": \"querytext15\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"resources | where type=='microsoft.network/firewallpolicies' | extend compliant = (properties.sku.tier == 'Premium') | distinct id,compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed\",\n \"size\": 0,\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"gridSettings\": {\n \"formatters\": [\n {\n \"columnMatch\": \"id\",\n \"formatter\": 0,\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n {\n \"columnMatch\": \"compliant\",\n \"formatter\": 18,\n \"formatOptions\": {\n \"thresholdsOptions\": \"icons\",\n \"thresholdsGrid\": [\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"1\",\n \"representation\": \"success\",\n \"text\": \"Success\"\n },\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"0\",\n \"representation\": \"failed\",\n \"text\": \"Failed\"\n },\n {\n \"operator\": \"Default\",\n \"thresholdValue\": null,\n \"representation\": \"unknown\",\n \"text\": \"Unknown\"\n }\n ]\n }\n }\n ]\n }\n },\n \"name\": \"query15\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"Configure Azure Firewall Threat Intelligence mode to Alert and Deny for additional protection. Check [this link](https://learn.microsoft.com/azure/firewall/premium-features#idps-signature-rules) for further information.\"\n },\n \"name\": \"querytext16\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"resources | where type=='microsoft.network/firewallpolicies' | extend compliant = (properties.threatIntelMode == 'Deny') | distinct id,compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed\",\n \"size\": 0,\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"gridSettings\": {\n \"formatters\": [\n {\n \"columnMatch\": \"id\",\n \"formatter\": 0,\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n {\n \"columnMatch\": \"compliant\",\n \"formatter\": 18,\n \"formatOptions\": {\n \"thresholdsOptions\": \"icons\",\n \"thresholdsGrid\": [\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"1\",\n \"representation\": \"success\",\n \"text\": \"Success\"\n },\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"0\",\n \"representation\": \"failed\",\n \"text\": \"Failed\"\n },\n {\n \"operator\": \"Default\",\n \"thresholdValue\": null,\n \"representation\": \"unknown\",\n \"text\": \"Unknown\"\n }\n ]\n }\n }\n ]\n }\n },\n \"name\": \"query16\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"Configure Azure Firewall IDPS mode to Deny for additional protection. Check [this link](https://learn.microsoft.com/azure/firewall/premium-features#idps) for further information.. [This training](https://learn.microsoft.com/training/modules/introduction-azure-firewall/) can help to educate yourself on this.\"\n },\n \"name\": \"querytext17\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"resources | where type=='microsoft.network/firewallpolicies' | extend compliant = (properties.intrusionDetection.mode == 'Deny') | project id, compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed\",\n \"size\": 0,\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"gridSettings\": {\n \"formatters\": [\n {\n \"columnMatch\": \"id\",\n \"formatter\": 0,\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n {\n \"columnMatch\": \"compliant\",\n \"formatter\": 18,\n \"formatOptions\": {\n \"thresholdsOptions\": \"icons\",\n \"thresholdsGrid\": [\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"1\",\n \"representation\": \"success\",\n \"text\": \"Success\"\n },\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"0\",\n \"representation\": \"failed\",\n \"text\": \"Failed\"\n },\n {\n \"operator\": \"Default\",\n \"thresholdValue\": null,\n \"representation\": \"unknown\",\n \"text\": \"Unknown\"\n }\n ]\n }\n }\n ]\n }\n },\n \"name\": \"query17\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"For subnets in VNets not connected to Virtual WAN, attach a route table so that Internet traffic is redirected to Azure Firewall or a Network Virtual Appliance. Check [this link](https://learn.microsoft.com/azure/virtual-network/virtual-networks-udr-overview) for further information.\"\n },\n \"name\": \"querytext18\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"resources | where type=='microsoft.network/virtualnetworks' | project id,resourceGroup,name,subnets=properties.subnets | mv-expand subnets | project id,name,subnetId=tostring(subnets.id), subnetName=tostring(subnets.name),subnetRT=subnets.properties.routeTable.id | where not (subnetName in ('GatewaySubnet', 'AzureFirewallSubnet', 'RouteServerSubnet', 'AzureBastionSubnet')) | extend hasRT = isnotnull(subnetRT) | distinct id, hasRT, subnetId | join kind=fullouter (resources | where type == 'microsoft.network/virtualnetworks' | mvexpand properties.virtualNetworkPeerings | extend isVWAN=(tolower(split(properties_virtualNetworkPeerings.name, '_')[0]) == 'remotevnettohubpeering') | mv-expand properties.subnets | project id, isVWAN, name, subnetId=tostring(properties_subnets.id), subnetName=tostring(properties_subnets.name) | summarize PeeredToVWAN=max(isVWAN) by id, subnetId | project id, subnetId, isVWANpeer = (PeeredToVWAN == true)) on subnetId | project id=iff(isnotempty(id), id, id1), subnetId=iff(isnotempty(subnetId), subnetId, subnetId1), hasRT, isVWANpeer | extend compliant = (hasRT==true or isVWANpeer==true) | distinct id, subnetId, compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed\",\n \"size\": 0,\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"gridSettings\": {\n \"formatters\": [\n {\n \"columnMatch\": \"id\",\n \"formatter\": 0,\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n {\n \"columnMatch\": \"compliant\",\n \"formatter\": 18,\n \"formatOptions\": {\n \"thresholdsOptions\": \"icons\",\n \"thresholdsGrid\": [\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"1\",\n \"representation\": \"success\",\n \"text\": \"Success\"\n },\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"0\",\n \"representation\": \"failed\",\n \"text\": \"Failed\"\n },\n {\n \"operator\": \"Default\",\n \"thresholdValue\": null,\n \"representation\": \"unknown\",\n \"text\": \"Unknown\"\n }\n ]\n }\n }\n ]\n }\n },\n \"name\": \"query18\"\n }\n ]\n },\n \"conditionalVisibility\": {\n \"parameterName\": \"VisibleTab\",\n \"comparison\": \"isEqualTo\",\n \"value\": \"tab5\"\n },\n \"name\": \"tab5\"\n },\n {\n \"type\": 12,\n \"content\": {\n \"version\": \"NotebookGroup/1.0\",\n \"groupType\": \"editable\",\n \"items\": [\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"## PaaS\"\n },\n \"name\": \"tab6title\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"Don't enable virtual network service endpoints by default on all subnets. Check [this link](https://learn.microsoft.com/azure/virtual-network/virtual-network-service-endpoints-overview) for further information.. [This training](https://learn.microsoft.com/learn/paths/implement-network-security/?source=learn) can help to educate yourself on this.\"\n },\n \"name\": \"querytext20\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"resources | where type =~ 'microsoft.network/virtualnetworks' | project id,resourceGroup,name,subnets = properties.subnets | mv-expand subnets | project id = subnets.id, resourceGroup, VNet = name, serviceEndpoints = subnets.properties.serviceEndpoints, compliant = (isnull(subnets.properties.serviceEndpoints) or array_length(subnets.properties.serviceEndpoints) == 0) | order by compliant asc | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed\",\n \"size\": 0,\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"gridSettings\": {\n \"formatters\": [\n {\n \"columnMatch\": \"id\",\n \"formatter\": 0,\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n {\n \"columnMatch\": \"compliant\",\n \"formatter\": 18,\n \"formatOptions\": {\n \"thresholdsOptions\": \"icons\",\n \"thresholdsGrid\": [\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"1\",\n \"representation\": \"success\",\n \"text\": \"Success\"\n },\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"0\",\n \"representation\": \"failed\",\n \"text\": \"Failed\"\n },\n {\n \"operator\": \"Default\",\n \"thresholdValue\": null,\n \"representation\": \"unknown\",\n \"text\": \"Unknown\"\n }\n ]\n }\n }\n ]\n }\n },\n \"name\": \"query20\"\n }\n ]\n },\n \"conditionalVisibility\": {\n \"parameterName\": \"VisibleTab\",\n \"comparison\": \"isEqualTo\",\n \"value\": \"tab6\"\n },\n \"name\": \"tab6\"\n },\n {\n \"type\": 12,\n \"content\": {\n \"version\": \"NotebookGroup/1.0\",\n \"groupType\": \"editable\",\n \"items\": [\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"## Internet\"\n },\n \"name\": \"tab7title\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"Use Azure Bastion in a subnet /26 or larger. Check [this link](https://learn.microsoft.com/azure/bastion/bastion-faq#subnet) for further information.. [This training](https://learn.microsoft.com/training/modules/intro-to-azure-bastion/) can help to educate yourself on this.\"\n },\n \"name\": \"querytext6\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"resources | where type=='microsoft.network/virtualnetworks' | project id,subnets=properties.subnets | mv-expand subnets | project id, subnetName = subnets.name, subnetPrefix = subnets.properties.addressPrefix | extend subnetPrefixLength = split(subnetPrefix, '/')[1] | where subnetName == 'AzureBastionSubnet' | extend compliant = (subnetPrefixLength <= 26) | distinct id, compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed\",\n \"size\": 0,\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"gridSettings\": {\n \"formatters\": [\n {\n \"columnMatch\": \"id\",\n \"formatter\": 0,\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n {\n \"columnMatch\": \"compliant\",\n \"formatter\": 18,\n \"formatOptions\": {\n \"thresholdsOptions\": \"icons\",\n \"thresholdsGrid\": [\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"1\",\n \"representation\": \"success\",\n \"text\": \"Success\"\n },\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"0\",\n \"representation\": \"failed\",\n \"text\": \"Failed\"\n },\n {\n \"operator\": \"Default\",\n \"thresholdValue\": null,\n \"representation\": \"unknown\",\n \"text\": \"Unknown\"\n }\n ]\n }\n }\n ]\n }\n },\n \"name\": \"query6\"\n }\n ]\n },\n \"conditionalVisibility\": {\n \"parameterName\": \"VisibleTab\",\n \"comparison\": \"isEqualTo\",\n \"value\": \"tab7\"\n },\n \"name\": \"tab7\"\n }\n ],\n \"$schema\": \"https://github.com/Microsoft/Application-Insights-Workbooks/blob/master/schema/workbook.json\"\n}", "version": "1.0", "sourceId": "[parameters('workbookSourceId')]", "category": "[parameters('workbookType')]" diff --git a/workbooks/appdelivery_checklist.en_network_counters_workbook.json b/workbooks/appdelivery_checklist.en_network_counters_workbook.json index dbbd1c32f..a7340d013 100644 --- a/workbooks/appdelivery_checklist.en_network_counters_workbook.json +++ b/workbooks/appdelivery_checklist.en_network_counters_workbook.json @@ -413,7 +413,7 @@ "criteriaContext": { "operator": "Default", "resultValType": "expression", - "resultVal": "{Query5Stats:$.Success}+{Query6Stats:$.Success}+{Query7Stats:$.Success}+{Query9Stats:$.Success}" + "resultVal": "{Query1Stats:$.Success}+{Query8Stats:$.Success}" } } ] @@ -432,7 +432,7 @@ "criteriaContext": { "operator": "Default", "resultValType": "expression", - "resultVal": "{Query5Stats:$.Total}+{Query6Stats:$.Total}+{Query7Stats:$.Total}+{Query9Stats:$.Total}" + "resultVal": "{Query1Stats:$.Total}+{Query8Stats:$.Total}" } } ] @@ -527,7 +527,7 @@ "criteriaContext": { "operator": "Default", "resultValType": "expression", - "resultVal": "{Query1Stats:$.Success}+{Query8Stats:$.Success}" + "resultVal": "{Query5Stats:$.Success}+{Query6Stats:$.Success}+{Query7Stats:$.Success}+{Query9Stats:$.Success}" } } ] @@ -546,7 +546,7 @@ "criteriaContext": { "operator": "Default", "resultValType": "expression", - "resultVal": "{Query1Stats:$.Total}+{Query8Stats:$.Total}" + "resultVal": "{Query5Stats:$.Total}+{Query6Stats:$.Total}+{Query7Stats:$.Total}+{Query9Stats:$.Total}" } } ] @@ -584,7 +584,7 @@ "criteriaContext": { "operator": "Default", "resultValType": "expression", - "resultVal": "{Query5Stats:$.Total}+{Query6Stats:$.Total}+{Query7Stats:$.Total}+{Query9Stats:$.Total}+{Query0Stats:$.Total}+{Query2Stats:$.Total}+{Query3Stats:$.Total}+{Query4Stats:$.Total}+{Query10Stats:$.Total}+{Query11Stats:$.Total}+{Query1Stats:$.Total}+{Query8Stats:$.Total}" + "resultVal": "{Query1Stats:$.Total}+{Query8Stats:$.Total}+{Query0Stats:$.Total}+{Query2Stats:$.Total}+{Query3Stats:$.Total}+{Query4Stats:$.Total}+{Query10Stats:$.Total}+{Query11Stats:$.Total}+{Query5Stats:$.Total}+{Query6Stats:$.Total}+{Query7Stats:$.Total}+{Query9Stats:$.Total}" } } ] @@ -603,7 +603,7 @@ "criteriaContext": { "operator": "Default", "resultValType": "expression", - "resultVal": "{Query5Stats:$.Success}+{Query6Stats:$.Success}+{Query7Stats:$.Success}+{Query9Stats:$.Success}+{Query0Stats:$.Success}+{Query2Stats:$.Success}+{Query3Stats:$.Success}+{Query4Stats:$.Success}+{Query10Stats:$.Success}+{Query11Stats:$.Success}+{Query1Stats:$.Success}+{Query8Stats:$.Success}" + "resultVal": "{Query1Stats:$.Success}+{Query8Stats:$.Success}+{Query0Stats:$.Success}+{Query2Stats:$.Success}+{Query3Stats:$.Success}+{Query4Stats:$.Success}+{Query10Stats:$.Success}+{Query11Stats:$.Success}+{Query5Stats:$.Success}+{Query6Stats:$.Success}+{Query7Stats:$.Success}+{Query9Stats:$.Success}" } } ] @@ -677,16 +677,16 @@ "style": "tabs", "links": [ { - "id": "e5ba4fd6-319c-4916-a866-b6e195ab5427", + "id": "8f9328ab-7cc5-4882-bc57-347dd7f12f2d", "cellValue": "VisibleTab", "linkTarget": "parameter", - "linkLabel": "Front Door ({Tab0Success:value}/{Tab0Total:value})", + "linkLabel": "Load Balancer ({Tab0Success:value}/{Tab0Total:value})", "subTarget": "tab0", - "preText": "Front Door", + "preText": "Load Balancer", "style": "primary" }, { - "id": "a1ac9b7d-6f9a-484d-b89c-31d6c1dc2423", + "id": "6765eed7-c503-4466-9eeb-345e61fbadad", "cellValue": "VisibleTab", "linkTarget": "parameter", "linkLabel": "App Gateway ({Tab1Success:value}/{Tab1Total:value})", @@ -695,12 +695,12 @@ "style": "primary" }, { - "id": "9c735b8a-a099-492b-bea4-d05bd6d6735b", + "id": "cb096da5-a7d9-4383-8802-4285449fb49c", "cellValue": "VisibleTab", "linkTarget": "parameter", - "linkLabel": "Load Balancer ({Tab2Success:value}/{Tab2Total:value})", + "linkLabel": "Front Door ({Tab2Success:value}/{Tab2Total:value})", "subTarget": "tab2", - "preText": "Load Balancer", + "preText": "Front Door", "style": "primary" } ] @@ -716,22 +716,22 @@ { "type": 1, "content": { - "json": "## Front Door" + "json": "## Load Balancer" }, "name": "tab0title" }, { "type": 1, "content": { - "json": "Deploy your WAF policy for Front Door in 'Prevention' mode' so that Web Application Firewall takes appropriate action to allow or deny traffic. Check [this link](https://learn.microsoft.com/azure/web-application-firewall/afds/waf-front-door-policy-settings) for further information." + "json": "Ensure you are using the Standard SKU for your Azure Load Balancers. Check [this link](https://learn.microsoft.com/azure/load-balancer/load-balancer-overview) for further information." }, - "name": "querytext5" + "name": "querytext1" }, { "type": 3, "content": { "version": "KqlItem/1.0", - "query": "resources | where type == 'microsoft.network/frontdoorwebapplicationfirewallpolicies' | project policyName=name, policyId=id,policySku=sku.name, links=properties.securityPolicyLinks, enabledState=properties.policySettings.enabledState, mode=properties.policySettings.mode | mvexpand links | extend securityPolicy=links.id | extend securityPolicyParts=split(securityPolicy, '/') | extend profileId=strcat_array(array_slice(securityPolicyParts, 0, -3), '/') | project id=profileId, compliant=((enabledState=='Enabled') and (mode=='Prevention')), enabledState, mode | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed", + "query": "resources | where type == 'microsoft.network/loadbalancers' | project id, compliant=(tolower(sku.name) == 'standard') | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed", "size": 4, "queryType": 1, "resourceType": "microsoft.resourcegraph/resources", @@ -780,20 +780,20 @@ ] } }, - "name": "query5" + "name": "query1" }, { "type": 1, "content": { - "json": "Disable health probes when there is only one origin in an Azure Front Door origin group. Check [this link](https://learn.microsoft.com/azure/frontdoor/best-practices#disable-health-probes-when-theres-only-one-origin-in-an-origin-group) for further information." + "json": "Use Azure NAT Gateway instead of Load Balancer outbound rules for better SNAT scalability. Check [this link](https://learn.microsoft.com/azure/nat-gateway/nat-overview#outbound-connectivity) for further information." }, - "name": "querytext6" + "name": "querytext8" }, { "type": 3, "content": { "version": "KqlItem/1.0", - "query": "cdnresources | where type =~ 'microsoft.cdn/profiles/origingroups/origins' | extend frontDoorId = substring(id, 0, indexof(id, '/origingroups')) | extend originGroupId = substring(id, 0, indexof(id, '/origins')) | join kind=inner (cdnresources | where type =~ 'microsoft.cdn/profiles/origingroups' | extend originGroupName = name | extend hasHealthProbe = isnotnull(properties.healthProbeSettings)) on $left.originGroupId == $right.id | summarize numberOrigins = count() by originGroupId, subscriptionId, frontDoorId, hasHealthProbe, originGroupName | extend compliant = not(numberOrigins == 1 and hasHealthProbe) | project id = frontDoorId, compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed", + "query": "resources | where type=='microsoft.network/loadbalancers' | extend countOutRules=array_length(properties.outboundRules) | extend compliant = (countOutRules == 0) | distinct id,compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed", "size": 4, "queryType": 1, "resourceType": "microsoft.resourcegraph/resources", @@ -842,20 +842,42 @@ ] } }, - "name": "query6" + "name": "query8" + } + ] + }, + "conditionalVisibility": { + "parameterName": "VisibleTab", + "comparison": "isEqualTo", + "value": "tab0" + }, + "name": "tab0" + }, + { + "type": 12, + "content": { + "version": "NotebookGroup/1.0", + "groupType": "editable", + "items": [ + { + "type": 1, + "content": { + "json": "## App Gateway" + }, + "name": "tab1title" }, { "type": 1, "content": { - "json": "Use HEAD health probes with Azure Front Door, to reduce the traffic that Front Door sends to your application. Check [this link](https://learn.microsoft.com/azure/frontdoor/best-practices#use-head-health-probes) for further information." + "json": "Ensure you are using Application Gateway v2 SKU. Check [this link](https://learn.microsoft.com/azure/application-gateway/overview-v2) for further information.. [This training](https://learn.microsoft.com/learn/paths/secure-application-delivery/) can help to educate yourself on this." }, - "name": "querytext7" + "name": "querytext0" }, { "type": 3, "content": { "version": "KqlItem/1.0", - "query": "cdnresources | where type =~ 'microsoft.cdn/profiles/origingroups' | extend frontDoorId = substring(id, 0, indexof(id, '/origingroups/')) | extend compliant = (isnull(properties['healthProbeSettings']['probeRequestType']) or toupper(properties['healthProbeSettings']['probeRequestType']) == 'HEAD') | project compliant, id=frontDoorId | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed", + "query": "resources | where type == 'microsoft.network/applicationgateways' | project id, compliant = properties.sku.name in ('Standard_v2', 'WAF_v2') | project id,compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed", "size": 4, "queryType": 1, "resourceType": "microsoft.resourcegraph/resources", @@ -904,20 +926,20 @@ ] } }, - "name": "query7" + "name": "query0" }, { "type": 1, "content": { - "json": "Use managed TLS certificates with Azure Front Door. Reduce operational cost and risk of outages due to certificate renewals. Check [this link](https://learn.microsoft.com/azure/frontdoor/best-practices#use-managed-tls-certificates) for further information." + "json": "Your Application Gateways v2 should be deployed in subnets with IP prefixes equal or larger than /24. Check [this link](https://learn.microsoft.com/azure/application-gateway/configuration-infrastructure#size-of-the-subnet) for further information.. [This training](https://learn.microsoft.com/learn/paths/secure-application-delivery/) can help to educate yourself on this." }, - "name": "querytext9" + "name": "querytext2" }, { "type": 3, "content": { "version": "KqlItem/1.0", - "query": "cdnresources | where type =~ 'microsoft.cdn/profiles/customdomains' | extend frontDoorId = substring(id, 0, indexof(id, '/customdomains')) | extend compliant = (isnull(properties['tlsSettings']['certificateType']) or tolower(properties['tlsSettings']['certificateType']) =~ 'customercertificate') | project compliant, id = frontDoorId | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed", + "query": "resources | where type=='microsoft.network/applicationgateways' | extend subnetId = tostring(properties.gatewayIPConfigurations[0].properties.subnet.id) | project id, subnetId | join (resources | where type=='microsoft.network/virtualnetworks' | project id,subnets=properties.subnets | mv-expand subnets | mv-expand subnets.properties.addressPrefixes | project id, subnetId = tostring(subnets.id), prefix1 = subnets.properties.addressPrefix, prefix2 = subnets.properties.addressPrefixes | mv-expand prefix2 | extend prefix = iff(isnotnull(prefix1), prefix1, prefix2) | extend subnetPrefixLength = split(prefix, '/')[1])on subnetId | extend compliant = (subnetPrefixLength <= 24 or subnetPrefixLength == 64) | distinct id,compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed", "size": 4, "queryType": 1, "resourceType": "microsoft.resourcegraph/resources", @@ -966,42 +988,20 @@ ] } }, - "name": "query9" - } - ] - }, - "conditionalVisibility": { - "parameterName": "VisibleTab", - "comparison": "isEqualTo", - "value": "tab0" - }, - "name": "tab0" - }, - { - "type": 12, - "content": { - "version": "NotebookGroup/1.0", - "groupType": "editable", - "items": [ - { - "type": 1, - "content": { - "json": "## App Gateway" - }, - "name": "tab1title" + "name": "query2" }, { "type": 1, "content": { - "json": "Ensure you are using Application Gateway v2 SKU. Check [this link](https://learn.microsoft.com/azure/application-gateway/overview-v2) for further information.. [This training](https://learn.microsoft.com/learn/paths/secure-application-delivery/) can help to educate yourself on this." + "json": "Configure autoscaling with a minimum amount of instances of two. Check [this link](https://learn.microsoft.com/azure/application-gateway/application-gateway-autoscaling-zone-redundant) for further information.. [This training](https://learn.microsoft.com/learn/paths/secure-application-delivery/) can help to educate yourself on this." }, - "name": "querytext0" + "name": "querytext3" }, { "type": 3, "content": { "version": "KqlItem/1.0", - "query": "resources | where type == 'microsoft.network/applicationgateways' | project id, compliant = properties.sku.name in ('Standard_v2', 'WAF_v2') | project id,compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed", + "query": "resources | where type =~ 'microsoft.network/applicationGateways' | extend compliant = (isnotnull(properties.autoscaleConfiguration) and properties.autoscaleConfiguration.minCapacity >= 2) | distinct id,compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed", "size": 4, "queryType": 1, "resourceType": "microsoft.resourcegraph/resources", @@ -1050,20 +1050,20 @@ ] } }, - "name": "query0" + "name": "query3" }, { "type": 1, "content": { - "json": "Your Application Gateways v2 should be deployed in subnets with IP prefixes equal or larger than /24. Check [this link](https://learn.microsoft.com/azure/application-gateway/configuration-infrastructure#size-of-the-subnet) for further information.. [This training](https://learn.microsoft.com/learn/paths/secure-application-delivery/) can help to educate yourself on this." + "json": "Deploy Application Gateway across Availability Zones. Check [this link](https://learn.microsoft.com/azure/reliability/migrate-app-gateway-v2) for further information.. [This training](https://learn.microsoft.com/learn/paths/secure-application-delivery/) can help to educate yourself on this." }, - "name": "querytext2" + "name": "querytext4" }, { "type": 3, "content": { "version": "KqlItem/1.0", - "query": "resources | where type=='microsoft.network/applicationgateways' | extend subnetId = tostring(properties.gatewayIPConfigurations[0].properties.subnet.id) | project id, subnetId | join (resources | where type=='microsoft.network/virtualnetworks' | project id,subnets=properties.subnets | mv-expand subnets | mv-expand subnets.properties.addressPrefixes | project id, subnetId = tostring(subnets.id), prefix1 = subnets.properties.addressPrefix, prefix2 = subnets.properties.addressPrefixes | mv-expand prefix2 | extend prefix = iff(isnotnull(prefix1), prefix1, prefix2) | extend subnetPrefixLength = split(prefix, '/')[1])on subnetId | extend compliant = (subnetPrefixLength <= 24 or subnetPrefixLength == 64) | distinct id,compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed", + "query": "resources | where type =~ 'microsoft.network/applicationGateways' | extend compliant = (isnotnull(zones) and array_length(zones) > 1) | distinct id,compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed", "size": 4, "queryType": 1, "resourceType": "microsoft.resourcegraph/resources", @@ -1112,20 +1112,20 @@ ] } }, - "name": "query2" + "name": "query4" }, { "type": 1, "content": { - "json": "Configure autoscaling with a minimum amount of instances of two. Check [this link](https://learn.microsoft.com/azure/application-gateway/application-gateway-autoscaling-zone-redundant) for further information.. [This training](https://learn.microsoft.com/learn/paths/secure-application-delivery/) can help to educate yourself on this." + "json": "Enable the Azure Application Gateway WAF bot protection rule set. The bot rules detect good and bad bots. Check [this link](https://learn.microsoft.com/azure/web-application-firewall/ag/bot-protection) for further information." }, - "name": "querytext3" + "name": "querytext10" }, { "type": 3, "content": { "version": "KqlItem/1.0", - "query": "resources | where type =~ 'microsoft.network/applicationGateways' | extend compliant = (isnotnull(properties.autoscaleConfiguration) and properties.autoscaleConfiguration.minCapacity >= 2) | distinct id,compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed", + "query": "resources | where type == 'microsoft.network/applicationgatewaywebapplicationfirewallpolicies' | mv-expand properties.managedRules.managedRuleSets | project id, rulesettype = properties_managedRules_managedRuleSets.ruleSetType | extend compliant1 = (rulesettype == 'Microsoft_BotManagerRuleSet') | project id, compliant1 | summarize compliant = max(compliant1) by id | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed", "size": 4, "queryType": 1, "resourceType": "microsoft.resourcegraph/resources", @@ -1174,20 +1174,20 @@ ] } }, - "name": "query3" + "name": "query10" }, { "type": 1, "content": { - "json": "Deploy Application Gateway across Availability Zones. Check [this link](https://learn.microsoft.com/azure/reliability/migrate-app-gateway-v2) for further information.. [This training](https://learn.microsoft.com/learn/paths/secure-application-delivery/) can help to educate yourself on this." + "json": "Deploy your WAF policy for Application Gateway in 'Prevention' mode. Check [this link](https://learn.microsoft.com/azure/web-application-firewall/afds/waf-front-door-policy-settings) for further information." }, - "name": "querytext4" + "name": "querytext11" }, { "type": 3, "content": { "version": "KqlItem/1.0", - "query": "resources | where type =~ 'microsoft.network/applicationGateways' | extend compliant = (isnotnull(zones) and array_length(zones) > 1) | distinct id,compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed", + "query": "resources | where type == 'microsoft.network/frontdoorwebapplicationfirewallpolicies' | project policyName=name, policyId=id,policySku=sku.name, links=properties.securityPolicyLinks, enabledState=properties.policySettings.enabledState, mode=properties.policySettings.mode | mvexpand links | extend securityPolicy=links.id | extend securityPolicyParts=split(securityPolicy, '/') | extend profileId=strcat_array(array_slice(securityPolicyParts, 0, -3), '/') | project id=profileId, compliant=((enabledState=='Enabled') and (mode=='Prevention')), enabledState, mode | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed", "size": 4, "queryType": 1, "resourceType": "microsoft.resourcegraph/resources", @@ -1236,20 +1236,42 @@ ] } }, - "name": "query4" + "name": "query11" + } + ] + }, + "conditionalVisibility": { + "parameterName": "VisibleTab", + "comparison": "isEqualTo", + "value": "tab1" + }, + "name": "tab1" + }, + { + "type": 12, + "content": { + "version": "NotebookGroup/1.0", + "groupType": "editable", + "items": [ + { + "type": 1, + "content": { + "json": "## Front Door" + }, + "name": "tab2title" }, { "type": 1, "content": { - "json": "Enable the Azure Application Gateway WAF bot protection rule set. The bot rules detect good and bad bots. Check [this link](https://learn.microsoft.com/azure/web-application-firewall/ag/bot-protection) for further information." + "json": "Deploy your WAF policy for Front Door in 'Prevention' mode' so that Web Application Firewall takes appropriate action to allow or deny traffic. Check [this link](https://learn.microsoft.com/azure/web-application-firewall/afds/waf-front-door-policy-settings) for further information." }, - "name": "querytext10" + "name": "querytext5" }, { "type": 3, "content": { "version": "KqlItem/1.0", - "query": "resources | where type == 'microsoft.network/applicationgatewaywebapplicationfirewallpolicies' | mv-expand properties.managedRules.managedRuleSets | project id, rulesettype = properties_managedRules_managedRuleSets.ruleSetType | extend compliant1 = (rulesettype == 'Microsoft_BotManagerRuleSet') | project id, compliant1 | summarize compliant = max(compliant1) by id | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed", + "query": "resources | where type == 'microsoft.network/frontdoorwebapplicationfirewallpolicies' | project policyName=name, policyId=id,policySku=sku.name, links=properties.securityPolicyLinks, enabledState=properties.policySettings.enabledState, mode=properties.policySettings.mode | mvexpand links | extend securityPolicy=links.id | extend securityPolicyParts=split(securityPolicy, '/') | extend profileId=strcat_array(array_slice(securityPolicyParts, 0, -3), '/') | project id=profileId, compliant=((enabledState=='Enabled') and (mode=='Prevention')), enabledState, mode | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed", "size": 4, "queryType": 1, "resourceType": "microsoft.resourcegraph/resources", @@ -1298,20 +1320,20 @@ ] } }, - "name": "query10" + "name": "query5" }, { "type": 1, "content": { - "json": "Deploy your WAF policy for Application Gateway in 'Prevention' mode. Check [this link](https://learn.microsoft.com/azure/web-application-firewall/afds/waf-front-door-policy-settings) for further information." + "json": "Disable health probes when there is only one origin in an Azure Front Door origin group. Check [this link](https://learn.microsoft.com/azure/frontdoor/best-practices#disable-health-probes-when-theres-only-one-origin-in-an-origin-group) for further information." }, - "name": "querytext11" + "name": "querytext6" }, { "type": 3, "content": { "version": "KqlItem/1.0", - "query": "resources | where type == 'microsoft.network/frontdoorwebapplicationfirewallpolicies' | project policyName=name, policyId=id,policySku=sku.name, links=properties.securityPolicyLinks, enabledState=properties.policySettings.enabledState, mode=properties.policySettings.mode | mvexpand links | extend securityPolicy=links.id | extend securityPolicyParts=split(securityPolicy, '/') | extend profileId=strcat_array(array_slice(securityPolicyParts, 0, -3), '/') | project id=profileId, compliant=((enabledState=='Enabled') and (mode=='Prevention')), enabledState, mode | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed", + "query": "cdnresources | where type =~ 'microsoft.cdn/profiles/origingroups/origins' | extend frontDoorId = substring(id, 0, indexof(id, '/origingroups')) | extend originGroupId = substring(id, 0, indexof(id, '/origins')) | join kind=inner (cdnresources | where type =~ 'microsoft.cdn/profiles/origingroups' | extend originGroupName = name | extend hasHealthProbe = isnotnull(properties.healthProbeSettings)) on $left.originGroupId == $right.id | summarize numberOrigins = count() by originGroupId, subscriptionId, frontDoorId, hasHealthProbe, originGroupName | extend compliant = not(numberOrigins == 1 and hasHealthProbe) | project id = frontDoorId, compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed", "size": 4, "queryType": 1, "resourceType": "microsoft.resourcegraph/resources", @@ -1360,42 +1382,20 @@ ] } }, - "name": "query11" - } - ] - }, - "conditionalVisibility": { - "parameterName": "VisibleTab", - "comparison": "isEqualTo", - "value": "tab1" - }, - "name": "tab1" - }, - { - "type": 12, - "content": { - "version": "NotebookGroup/1.0", - "groupType": "editable", - "items": [ - { - "type": 1, - "content": { - "json": "## Load Balancer" - }, - "name": "tab2title" + "name": "query6" }, { "type": 1, "content": { - "json": "Ensure you are using the Standard SKU for your Azure Load Balancers. Check [this link](https://learn.microsoft.com/azure/load-balancer/load-balancer-overview) for further information." + "json": "Use HEAD health probes with Azure Front Door, to reduce the traffic that Front Door sends to your application. Check [this link](https://learn.microsoft.com/azure/frontdoor/best-practices#use-head-health-probes) for further information." }, - "name": "querytext1" + "name": "querytext7" }, { "type": 3, "content": { "version": "KqlItem/1.0", - "query": "resources | where type == 'microsoft.network/loadbalancers' | project id, compliant=(tolower(sku.name) == 'standard') | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed", + "query": "cdnresources | where type =~ 'microsoft.cdn/profiles/origingroups' | extend frontDoorId = substring(id, 0, indexof(id, '/origingroups/')) | extend compliant = (isnull(properties['healthProbeSettings']['probeRequestType']) or toupper(properties['healthProbeSettings']['probeRequestType']) == 'HEAD') | project compliant, id=frontDoorId | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed", "size": 4, "queryType": 1, "resourceType": "microsoft.resourcegraph/resources", @@ -1444,20 +1444,20 @@ ] } }, - "name": "query1" + "name": "query7" }, { "type": 1, "content": { - "json": "Use Azure NAT Gateway instead of Load Balancer outbound rules for better SNAT scalability. Check [this link](https://learn.microsoft.com/azure/nat-gateway/nat-overview#outbound-connectivity) for further information." + "json": "Use managed TLS certificates with Azure Front Door. Reduce operational cost and risk of outages due to certificate renewals. Check [this link](https://learn.microsoft.com/azure/frontdoor/best-practices#use-managed-tls-certificates) for further information." }, - "name": "querytext8" + "name": "querytext9" }, { "type": 3, "content": { "version": "KqlItem/1.0", - "query": "resources | where type=='microsoft.network/loadbalancers' | extend countOutRules=array_length(properties.outboundRules) | extend compliant = (countOutRules == 0) | distinct id,compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed", + "query": "cdnresources | where type =~ 'microsoft.cdn/profiles/customdomains' | extend frontDoorId = substring(id, 0, indexof(id, '/customdomains')) | extend compliant = (isnull(properties['tlsSettings']['certificateType']) or tolower(properties['tlsSettings']['certificateType']) =~ 'customercertificate') | project compliant, id = frontDoorId | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed", "size": 4, "queryType": 1, "resourceType": "microsoft.resourcegraph/resources", @@ -1506,7 +1506,7 @@ ] } }, - "name": "query8" + "name": "query9" } ] }, diff --git a/workbooks/appdelivery_checklist.en_network_counters_workbook_template.json b/workbooks/appdelivery_checklist.en_network_counters_workbook_template.json index 69e51b27a..cec367efb 100644 --- a/workbooks/appdelivery_checklist.en_network_counters_workbook_template.json +++ b/workbooks/appdelivery_checklist.en_network_counters_workbook_template.json @@ -41,7 +41,7 @@ "dependsOn": [], "properties": { "displayName": "[parameters('workbookDisplayName')]", - "serializedData": "{\n \"version\": \"Notebook/1.0\",\n \"items\": [\n {\n \"type\": 9,\n \"content\": {\n \"version\": \"KqlParameterItem/1.0\",\n \"parameters\": [\n {\n \"id\": \"497a107e-dde8-433e-b263-35ac8e8f7834\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Subscription\",\n \"type\": 6,\n \"multiSelect\": true,\n \"quote\": \"'\",\n \"delimiter\": \",\",\n \"typeSettings\": {\n \"additionalResourceOptions\": [\n \"value::all\"\n ],\n \"includeAll\": true,\n \"showDefault\": false\n },\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"value\": [\n \"value::all\"\n ]\n },\n {\n \"id\": \"844e4f4e-df51-4e3c-8eaf-0dc78b92c721\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"OnlyFailed\",\n \"label\": \"Only show failed\",\n \"type\": 2,\n \"typeSettings\": {\n \"additionalResourceOptions\": [],\n \"showDefault\": false\n },\n \"jsonData\": \"[\\r\\n { \\\"value\\\":true, \\\"label\\\":\\\"True\\\" },\\r\\n { \\\"value\\\":false, \\\"label\\\":\\\"False\\\", \\\"selected\\\":true }\\r\\n]\"\n }\n ],\n \"style\": \"pills\",\n \"queryType\": 0,\n \"resourceType\": \"microsoft.operationalinsights/workspaces\"\n },\n \"name\": \"WorkbookSelectors\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"If you set \\\"Only show failed\\\" to \\\"Yes\\\", the different queries will only show items that have failed their compliance checks.\",\n \"style\": \"info\"\n },\n \"name\": \"InfoBox\"\n },\n {\n \"type\": 9,\n \"content\": {\n \"version\": \"KqlParameterItem/1.0\",\n \"crossComponentResources\": [\n \"value::all\"\n ],\n \"parameters\": [\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query0Stats\",\n \"type\": 1,\n \"query\": \"resources | where type == 'microsoft.network/applicationgateways' | project id, compliant = properties.sku.name in ('Standard_v2', 'WAF_v2') | project id,compliant| summarize Total = count(), Success = countif(compliant==1), Failed = countif(compliant==0) | extend SuccessPercent = iff(Total==0, 100, 100*toint(Success)/toint(Total)) | extend FullyCompliant = iff(SuccessPercent == 100, 'Yes', 'No') | project Query1Stats=tostring(pack_all())\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\"\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query0FullyCompliant\",\n \"type\": 1,\n \"query\": \"{\\\"version\\\":\\\"1.0.0\\\",\\\"content\\\":\\\"{\\\\\\\"value\\\\\\\": \\\\\\\"{Query0Stats:$.FullyCompliant}\\\\\\\"}\\\",\\\"transformers\\\":null}\",\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 8\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query1Stats\",\n \"type\": 1,\n \"query\": \"resources | where type == 'microsoft.network/loadbalancers' | project id, compliant=(tolower(sku.name) == 'standard')| summarize Total = count(), Success = countif(compliant==1), Failed = countif(compliant==0) | extend SuccessPercent = iff(Total==0, 100, 100*toint(Success)/toint(Total)) | extend FullyCompliant = iff(SuccessPercent == 100, 'Yes', 'No') | project Query1Stats=tostring(pack_all())\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\"\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query1FullyCompliant\",\n \"type\": 1,\n \"query\": \"{\\\"version\\\":\\\"1.0.0\\\",\\\"content\\\":\\\"{\\\\\\\"value\\\\\\\": \\\\\\\"{Query1Stats:$.FullyCompliant}\\\\\\\"}\\\",\\\"transformers\\\":null}\",\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 8\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query2Stats\",\n \"type\": 1,\n \"query\": \"resources | where type=='microsoft.network/applicationgateways' | extend subnetId = tostring(properties.gatewayIPConfigurations[0].properties.subnet.id) | project id, subnetId | join (resources | where type=='microsoft.network/virtualnetworks' | project id,subnets=properties.subnets | mv-expand subnets | mv-expand subnets.properties.addressPrefixes | project id, subnetId = tostring(subnets.id), prefix1 = subnets.properties.addressPrefix, prefix2 = subnets.properties.addressPrefixes | mv-expand prefix2 | extend prefix = iff(isnotnull(prefix1), prefix1, prefix2) | extend subnetPrefixLength = split(prefix, '/')[1])on subnetId | extend compliant = (subnetPrefixLength <= 24 or subnetPrefixLength == 64) | distinct id,compliant| summarize Total = count(), Success = countif(compliant==1), Failed = countif(compliant==0) | extend SuccessPercent = iff(Total==0, 100, 100*toint(Success)/toint(Total)) | extend FullyCompliant = iff(SuccessPercent == 100, 'Yes', 'No') | project Query1Stats=tostring(pack_all())\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\"\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query2FullyCompliant\",\n \"type\": 1,\n \"query\": \"{\\\"version\\\":\\\"1.0.0\\\",\\\"content\\\":\\\"{\\\\\\\"value\\\\\\\": \\\\\\\"{Query2Stats:$.FullyCompliant}\\\\\\\"}\\\",\\\"transformers\\\":null}\",\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 8\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query3Stats\",\n \"type\": 1,\n \"query\": \"resources | where type =~ 'microsoft.network/applicationGateways' | extend compliant = (isnotnull(properties.autoscaleConfiguration) and properties.autoscaleConfiguration.minCapacity >= 2) | distinct id,compliant| summarize Total = count(), Success = countif(compliant==1), Failed = countif(compliant==0) | extend SuccessPercent = iff(Total==0, 100, 100*toint(Success)/toint(Total)) | extend FullyCompliant = iff(SuccessPercent == 100, 'Yes', 'No') | project Query1Stats=tostring(pack_all())\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\"\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query3FullyCompliant\",\n \"type\": 1,\n \"query\": \"{\\\"version\\\":\\\"1.0.0\\\",\\\"content\\\":\\\"{\\\\\\\"value\\\\\\\": \\\\\\\"{Query3Stats:$.FullyCompliant}\\\\\\\"}\\\",\\\"transformers\\\":null}\",\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 8\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query4Stats\",\n \"type\": 1,\n \"query\": \"resources | where type =~ 'microsoft.network/applicationGateways' | extend compliant = (isnotnull(zones) and array_length(zones) > 1) | distinct id,compliant| summarize Total = count(), Success = countif(compliant==1), Failed = countif(compliant==0) | extend SuccessPercent = iff(Total==0, 100, 100*toint(Success)/toint(Total)) | extend FullyCompliant = iff(SuccessPercent == 100, 'Yes', 'No') | project Query1Stats=tostring(pack_all())\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\"\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query4FullyCompliant\",\n \"type\": 1,\n \"query\": \"{\\\"version\\\":\\\"1.0.0\\\",\\\"content\\\":\\\"{\\\\\\\"value\\\\\\\": \\\\\\\"{Query4Stats:$.FullyCompliant}\\\\\\\"}\\\",\\\"transformers\\\":null}\",\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 8\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query5Stats\",\n \"type\": 1,\n \"query\": \"resources | where type == 'microsoft.network/frontdoorwebapplicationfirewallpolicies' | project policyName=name, policyId=id,policySku=sku.name, links=properties.securityPolicyLinks, enabledState=properties.policySettings.enabledState, mode=properties.policySettings.mode | mvexpand links | extend securityPolicy=links.id | extend securityPolicyParts=split(securityPolicy, '/') | extend profileId=strcat_array(array_slice(securityPolicyParts, 0, -3), '/') | project id=profileId, compliant=((enabledState=='Enabled') and (mode=='Prevention')), enabledState, mode| summarize Total = count(), Success = countif(compliant==1), Failed = countif(compliant==0) | extend SuccessPercent = iff(Total==0, 100, 100*toint(Success)/toint(Total)) | extend FullyCompliant = iff(SuccessPercent == 100, 'Yes', 'No') | project Query1Stats=tostring(pack_all())\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\"\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query5FullyCompliant\",\n \"type\": 1,\n \"query\": \"{\\\"version\\\":\\\"1.0.0\\\",\\\"content\\\":\\\"{\\\\\\\"value\\\\\\\": \\\\\\\"{Query5Stats:$.FullyCompliant}\\\\\\\"}\\\",\\\"transformers\\\":null}\",\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 8\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query6Stats\",\n \"type\": 1,\n \"query\": \"cdnresources | where type =~ 'microsoft.cdn/profiles/origingroups/origins' | extend frontDoorId = substring(id, 0, indexof(id, '/origingroups')) | extend originGroupId = substring(id, 0, indexof(id, '/origins')) | join kind=inner (cdnresources | where type =~ 'microsoft.cdn/profiles/origingroups' | extend originGroupName = name | extend hasHealthProbe = isnotnull(properties.healthProbeSettings)) on $left.originGroupId == $right.id | summarize numberOrigins = count() by originGroupId, subscriptionId, frontDoorId, hasHealthProbe, originGroupName | extend compliant = not(numberOrigins == 1 and hasHealthProbe) | project id = frontDoorId, compliant| summarize Total = count(), Success = countif(compliant==1), Failed = countif(compliant==0) | extend SuccessPercent = iff(Total==0, 100, 100*toint(Success)/toint(Total)) | extend FullyCompliant = iff(SuccessPercent == 100, 'Yes', 'No') | project Query1Stats=tostring(pack_all())\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\"\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query6FullyCompliant\",\n \"type\": 1,\n \"query\": \"{\\\"version\\\":\\\"1.0.0\\\",\\\"content\\\":\\\"{\\\\\\\"value\\\\\\\": \\\\\\\"{Query6Stats:$.FullyCompliant}\\\\\\\"}\\\",\\\"transformers\\\":null}\",\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 8\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query7Stats\",\n \"type\": 1,\n \"query\": \"cdnresources | where type =~ 'microsoft.cdn/profiles/origingroups' | extend frontDoorId = substring(id, 0, indexof(id, '/origingroups/')) | extend compliant = (isnull(properties['healthProbeSettings']['probeRequestType']) or toupper(properties['healthProbeSettings']['probeRequestType']) == 'HEAD') | project compliant, id=frontDoorId| summarize Total = count(), Success = countif(compliant==1), Failed = countif(compliant==0) | extend SuccessPercent = iff(Total==0, 100, 100*toint(Success)/toint(Total)) | extend FullyCompliant = iff(SuccessPercent == 100, 'Yes', 'No') | project Query1Stats=tostring(pack_all())\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\"\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query7FullyCompliant\",\n \"type\": 1,\n \"query\": \"{\\\"version\\\":\\\"1.0.0\\\",\\\"content\\\":\\\"{\\\\\\\"value\\\\\\\": \\\\\\\"{Query7Stats:$.FullyCompliant}\\\\\\\"}\\\",\\\"transformers\\\":null}\",\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 8\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query8Stats\",\n \"type\": 1,\n \"query\": \"resources | where type=='microsoft.network/loadbalancers' | extend countOutRules=array_length(properties.outboundRules) | extend compliant = (countOutRules == 0) | distinct id,compliant| summarize Total = count(), Success = countif(compliant==1), Failed = countif(compliant==0) | extend SuccessPercent = iff(Total==0, 100, 100*toint(Success)/toint(Total)) | extend FullyCompliant = iff(SuccessPercent == 100, 'Yes', 'No') | project Query1Stats=tostring(pack_all())\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\"\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query8FullyCompliant\",\n \"type\": 1,\n \"query\": \"{\\\"version\\\":\\\"1.0.0\\\",\\\"content\\\":\\\"{\\\\\\\"value\\\\\\\": \\\\\\\"{Query8Stats:$.FullyCompliant}\\\\\\\"}\\\",\\\"transformers\\\":null}\",\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 8\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query9Stats\",\n \"type\": 1,\n \"query\": \"cdnresources | where type =~ 'microsoft.cdn/profiles/customdomains' | extend frontDoorId = substring(id, 0, indexof(id, '/customdomains')) | extend compliant = (isnull(properties['tlsSettings']['certificateType']) or tolower(properties['tlsSettings']['certificateType']) =~ 'customercertificate') | project compliant, id = frontDoorId| summarize Total = count(), Success = countif(compliant==1), Failed = countif(compliant==0) | extend SuccessPercent = iff(Total==0, 100, 100*toint(Success)/toint(Total)) | extend FullyCompliant = iff(SuccessPercent == 100, 'Yes', 'No') | project Query1Stats=tostring(pack_all())\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\"\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query9FullyCompliant\",\n \"type\": 1,\n \"query\": \"{\\\"version\\\":\\\"1.0.0\\\",\\\"content\\\":\\\"{\\\\\\\"value\\\\\\\": \\\\\\\"{Query9Stats:$.FullyCompliant}\\\\\\\"}\\\",\\\"transformers\\\":null}\",\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 8\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query10Stats\",\n \"type\": 1,\n \"query\": \"resources | where type == 'microsoft.network/applicationgatewaywebapplicationfirewallpolicies' | mv-expand properties.managedRules.managedRuleSets | project id, rulesettype = properties_managedRules_managedRuleSets.ruleSetType | extend compliant1 = (rulesettype == 'Microsoft_BotManagerRuleSet') | project id, compliant1 | summarize compliant = max(compliant1) by id| summarize Total = count(), Success = countif(compliant==1), Failed = countif(compliant==0) | extend SuccessPercent = iff(Total==0, 100, 100*toint(Success)/toint(Total)) | extend FullyCompliant = iff(SuccessPercent == 100, 'Yes', 'No') | project Query1Stats=tostring(pack_all())\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\"\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query10FullyCompliant\",\n \"type\": 1,\n \"query\": \"{\\\"version\\\":\\\"1.0.0\\\",\\\"content\\\":\\\"{\\\\\\\"value\\\\\\\": \\\\\\\"{Query10Stats:$.FullyCompliant}\\\\\\\"}\\\",\\\"transformers\\\":null}\",\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 8\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query11Stats\",\n \"type\": 1,\n \"query\": \"resources | where type == 'microsoft.network/frontdoorwebapplicationfirewallpolicies' | project policyName=name, policyId=id,policySku=sku.name, links=properties.securityPolicyLinks, enabledState=properties.policySettings.enabledState, mode=properties.policySettings.mode | mvexpand links | extend securityPolicy=links.id | extend securityPolicyParts=split(securityPolicy, '/') | extend profileId=strcat_array(array_slice(securityPolicyParts, 0, -3), '/') | project id=profileId, compliant=((enabledState=='Enabled') and (mode=='Prevention')), enabledState, mode| summarize Total = count(), Success = countif(compliant==1), Failed = countif(compliant==0) | extend SuccessPercent = iff(Total==0, 100, 100*toint(Success)/toint(Total)) | extend FullyCompliant = iff(SuccessPercent == 100, 'Yes', 'No') | project Query1Stats=tostring(pack_all())\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\"\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query11FullyCompliant\",\n \"type\": 1,\n \"query\": \"{\\\"version\\\":\\\"1.0.0\\\",\\\"content\\\":\\\"{\\\\\\\"value\\\\\\\": \\\\\\\"{Query11Stats:$.FullyCompliant}\\\\\\\"}\\\",\\\"transformers\\\":null}\",\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 8\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Tab0Success\",\n \"type\": 1,\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"criteriaData\": [\n {\n \"criteriaContext\": {\n \"operator\": \"Default\",\n \"resultValType\": \"expression\",\n \"resultVal\": \"{Query5Stats:$.Success}+{Query6Stats:$.Success}+{Query7Stats:$.Success}+{Query9Stats:$.Success}\"\n }\n }\n ]\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Tab0Total\",\n \"type\": 1,\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"criteriaData\": [\n {\n \"criteriaContext\": {\n \"operator\": \"Default\",\n \"resultValType\": \"expression\",\n \"resultVal\": \"{Query5Stats:$.Total}+{Query6Stats:$.Total}+{Query7Stats:$.Total}+{Query9Stats:$.Total}\"\n }\n }\n ]\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Tab0Percent\",\n \"type\": 1,\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"criteriaData\": [\n {\n \"criteriaContext\": {\n \"operator\": \"Default\",\n \"resultValType\": \"expression\",\n \"resultVal\": \"round(100*{Tab0Success}/{Tab0Total})\"\n }\n }\n ]\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Tab1Success\",\n \"type\": 1,\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"criteriaData\": [\n {\n \"criteriaContext\": {\n \"operator\": \"Default\",\n \"resultValType\": \"expression\",\n \"resultVal\": \"{Query0Stats:$.Success}+{Query2Stats:$.Success}+{Query3Stats:$.Success}+{Query4Stats:$.Success}+{Query10Stats:$.Success}+{Query11Stats:$.Success}\"\n }\n }\n ]\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Tab1Total\",\n \"type\": 1,\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"criteriaData\": [\n {\n \"criteriaContext\": {\n \"operator\": \"Default\",\n \"resultValType\": \"expression\",\n \"resultVal\": \"{Query0Stats:$.Total}+{Query2Stats:$.Total}+{Query3Stats:$.Total}+{Query4Stats:$.Total}+{Query10Stats:$.Total}+{Query11Stats:$.Total}\"\n }\n }\n ]\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Tab1Percent\",\n \"type\": 1,\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"criteriaData\": [\n {\n \"criteriaContext\": {\n \"operator\": \"Default\",\n \"resultValType\": \"expression\",\n \"resultVal\": \"round(100*{Tab1Success}/{Tab1Total})\"\n }\n }\n ]\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Tab2Success\",\n \"type\": 1,\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"criteriaData\": [\n {\n \"criteriaContext\": {\n \"operator\": \"Default\",\n \"resultValType\": \"expression\",\n \"resultVal\": \"{Query1Stats:$.Success}+{Query8Stats:$.Success}\"\n }\n }\n ]\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Tab2Total\",\n \"type\": 1,\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"criteriaData\": [\n {\n \"criteriaContext\": {\n \"operator\": \"Default\",\n \"resultValType\": \"expression\",\n \"resultVal\": \"{Query1Stats:$.Total}+{Query8Stats:$.Total}\"\n }\n }\n ]\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Tab2Percent\",\n \"type\": 1,\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"criteriaData\": [\n {\n \"criteriaContext\": {\n \"operator\": \"Default\",\n \"resultValType\": \"expression\",\n \"resultVal\": \"round(100*{Tab2Success}/{Tab2Total})\"\n }\n }\n ]\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"WorkbookTotal\",\n \"type\": 1,\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"criteriaData\": [\n {\n \"criteriaContext\": {\n \"operator\": \"Default\",\n \"resultValType\": \"expression\",\n \"resultVal\": \"{Query5Stats:$.Total}+{Query6Stats:$.Total}+{Query7Stats:$.Total}+{Query9Stats:$.Total}+{Query0Stats:$.Total}+{Query2Stats:$.Total}+{Query3Stats:$.Total}+{Query4Stats:$.Total}+{Query10Stats:$.Total}+{Query11Stats:$.Total}+{Query1Stats:$.Total}+{Query8Stats:$.Total}\"\n }\n }\n ]\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"WorkbookSuccess\",\n \"type\": 1,\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"criteriaData\": [\n {\n \"criteriaContext\": {\n \"operator\": \"Default\",\n \"resultValType\": \"expression\",\n \"resultVal\": \"{Query5Stats:$.Success}+{Query6Stats:$.Success}+{Query7Stats:$.Success}+{Query9Stats:$.Success}+{Query0Stats:$.Success}+{Query2Stats:$.Success}+{Query3Stats:$.Success}+{Query4Stats:$.Success}+{Query10Stats:$.Success}+{Query11Stats:$.Success}+{Query1Stats:$.Success}+{Query8Stats:$.Success}\"\n }\n }\n ]\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"WorkbookPercent\",\n \"type\": 1,\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"criteriaData\": [\n {\n \"criteriaContext\": {\n \"operator\": \"Default\",\n \"resultValType\": \"expression\",\n \"resultVal\": \"round(100*{WorkbookSuccess}/{WorkbookTotal})\"\n }\n }\n ]\n }\n ],\n \"style\": \"pills\",\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\"\n },\n \"name\": \"InvisibleParameters\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"## Azure Application Delivery Networking - Network\\n\\n---\\n\\nThis workbook has been automatically generated out of the checklists in the [Azure Review Checklists repo](https://github.com/Azure/review-checklists). This repo contains best practices and recommendations around generic Landing Zones as well as specific services such as Azure Virtual Desktop, Azure Kubernetes Service or Azure VMware Solution, to name a few. This repository of best practices is curated by Azure engineers, but open to anybody to contribute.\\n\\nIf you see a problem in the queries that are part of this workbook, please open a Github issue [here](https://github.com/Azure/review-checklists/issues/new).\"\n },\n \"customWidth\": \"50\",\n \"name\": \"MarkdownHeader\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"{\\\"version\\\":\\\"1.0.0\\\",\\\"content\\\":\\\"{\\\\\\\"WorkbookPercent\\\\\\\": \\\\\\\"{WorkbookPercent}\\\\\\\", \\\\\\\"SubTitle\\\\\\\": \\\\\\\"Percent of successful checks\\\\\\\"}\\\",\\\"transformers\\\":null}\",\n \"size\": 4,\n \"queryType\": 8,\n \"visualization\": \"tiles\",\n \"tileSettings\": {\n \"titleContent\": {\n \"columnMatch\": \"WorkbookPercent\",\n \"formatter\": 4,\n \"formatOptions\": {\n \"min\": 0,\n \"max\": 100,\n \"palette\": \"redGreen\"\n }\n },\n \"subtitleContent\": {\n \"columnMatch\": \"SubTitle\",\n \"formatter\": 1\n },\n \"showBorder\": true\n }\n },\n \"customWidth\": \"50\",\n \"name\": \"ProgressTile\"\n },\n {\n \"type\": 11,\n \"content\": {\n \"version\": \"LinkItem/1.0\",\n \"style\": \"tabs\",\n \"links\": [\n {\n \"id\": \"e5ba4fd6-319c-4916-a866-b6e195ab5427\",\n \"cellValue\": \"VisibleTab\",\n \"linkTarget\": \"parameter\",\n \"linkLabel\": \"Front Door ({Tab0Success:value}/{Tab0Total:value})\",\n \"subTarget\": \"tab0\",\n \"preText\": \"Front Door\",\n \"style\": \"primary\"\n },\n {\n \"id\": \"a1ac9b7d-6f9a-484d-b89c-31d6c1dc2423\",\n \"cellValue\": \"VisibleTab\",\n \"linkTarget\": \"parameter\",\n \"linkLabel\": \"App Gateway ({Tab1Success:value}/{Tab1Total:value})\",\n \"subTarget\": \"tab1\",\n \"preText\": \"App Gateway\",\n \"style\": \"primary\"\n },\n {\n \"id\": \"9c735b8a-a099-492b-bea4-d05bd6d6735b\",\n \"cellValue\": \"VisibleTab\",\n \"linkTarget\": \"parameter\",\n \"linkLabel\": \"Load Balancer ({Tab2Success:value}/{Tab2Total:value})\",\n \"subTarget\": \"tab2\",\n \"preText\": \"Load Balancer\",\n \"style\": \"primary\"\n }\n ]\n },\n \"name\": \"Tabs\"\n },\n {\n \"type\": 12,\n \"content\": {\n \"version\": \"NotebookGroup/1.0\",\n \"groupType\": \"editable\",\n \"items\": [\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"## Front Door\"\n },\n \"name\": \"tab0title\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"Deploy your WAF policy for Front Door in 'Prevention' mode' so that Web Application Firewall takes appropriate action to allow or deny traffic. Check [this link](https://learn.microsoft.com/azure/web-application-firewall/afds/waf-front-door-policy-settings) for further information.\"\n },\n \"name\": \"querytext5\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"resources | where type == 'microsoft.network/frontdoorwebapplicationfirewallpolicies' | project policyName=name, policyId=id,policySku=sku.name, links=properties.securityPolicyLinks, enabledState=properties.policySettings.enabledState, mode=properties.policySettings.mode | mvexpand links | extend securityPolicy=links.id | extend securityPolicyParts=split(securityPolicy, '/') | extend profileId=strcat_array(array_slice(securityPolicyParts, 0, -3), '/') | project id=profileId, compliant=((enabledState=='Enabled') and (mode=='Prevention')), enabledState, mode | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed\",\n \"size\": 4,\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"gridSettings\": {\n \"formatters\": [\n {\n \"columnMatch\": \"id\",\n \"formatter\": 0,\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n {\n \"columnMatch\": \"compliant\",\n \"formatter\": 18,\n \"formatOptions\": {\n \"thresholdsOptions\": \"icons\",\n \"thresholdsGrid\": [\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"1\",\n \"representation\": \"success\",\n \"text\": \"Success\"\n },\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"0\",\n \"representation\": \"failed\",\n \"text\": \"Failed\"\n },\n {\n \"operator\": \"Default\",\n \"thresholdValue\": null,\n \"representation\": \"unknown\",\n \"text\": \"Unknown\"\n }\n ]\n }\n }\n ]\n }\n },\n \"name\": \"query5\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"Disable health probes when there is only one origin in an Azure Front Door origin group. Check [this link](https://learn.microsoft.com/azure/frontdoor/best-practices#disable-health-probes-when-theres-only-one-origin-in-an-origin-group) for further information.\"\n },\n \"name\": \"querytext6\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"cdnresources | where type =~ 'microsoft.cdn/profiles/origingroups/origins' | extend frontDoorId = substring(id, 0, indexof(id, '/origingroups')) | extend originGroupId = substring(id, 0, indexof(id, '/origins')) | join kind=inner (cdnresources | where type =~ 'microsoft.cdn/profiles/origingroups' | extend originGroupName = name | extend hasHealthProbe = isnotnull(properties.healthProbeSettings)) on $left.originGroupId == $right.id | summarize numberOrigins = count() by originGroupId, subscriptionId, frontDoorId, hasHealthProbe, originGroupName | extend compliant = not(numberOrigins == 1 and hasHealthProbe) | project id = frontDoorId, compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed\",\n \"size\": 4,\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"gridSettings\": {\n \"formatters\": [\n {\n \"columnMatch\": \"id\",\n \"formatter\": 0,\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n {\n \"columnMatch\": \"compliant\",\n \"formatter\": 18,\n \"formatOptions\": {\n \"thresholdsOptions\": \"icons\",\n \"thresholdsGrid\": [\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"1\",\n \"representation\": \"success\",\n \"text\": \"Success\"\n },\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"0\",\n \"representation\": \"failed\",\n \"text\": \"Failed\"\n },\n {\n \"operator\": \"Default\",\n \"thresholdValue\": null,\n \"representation\": \"unknown\",\n \"text\": \"Unknown\"\n }\n ]\n }\n }\n ]\n }\n },\n \"name\": \"query6\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"Use HEAD health probes with Azure Front Door, to reduce the traffic that Front Door sends to your application. Check [this link](https://learn.microsoft.com/azure/frontdoor/best-practices#use-head-health-probes) for further information.\"\n },\n \"name\": \"querytext7\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"cdnresources | where type =~ 'microsoft.cdn/profiles/origingroups' | extend frontDoorId = substring(id, 0, indexof(id, '/origingroups/')) | extend compliant = (isnull(properties['healthProbeSettings']['probeRequestType']) or toupper(properties['healthProbeSettings']['probeRequestType']) == 'HEAD') | project compliant, id=frontDoorId | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed\",\n \"size\": 4,\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"gridSettings\": {\n \"formatters\": [\n {\n \"columnMatch\": \"id\",\n \"formatter\": 0,\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n {\n \"columnMatch\": \"compliant\",\n \"formatter\": 18,\n \"formatOptions\": {\n \"thresholdsOptions\": \"icons\",\n \"thresholdsGrid\": [\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"1\",\n \"representation\": \"success\",\n \"text\": \"Success\"\n },\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"0\",\n \"representation\": \"failed\",\n \"text\": \"Failed\"\n },\n {\n \"operator\": \"Default\",\n \"thresholdValue\": null,\n \"representation\": \"unknown\",\n \"text\": \"Unknown\"\n }\n ]\n }\n }\n ]\n }\n },\n \"name\": \"query7\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"Use managed TLS certificates with Azure Front Door. Reduce operational cost and risk of outages due to certificate renewals. Check [this link](https://learn.microsoft.com/azure/frontdoor/best-practices#use-managed-tls-certificates) for further information.\"\n },\n \"name\": \"querytext9\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"cdnresources | where type =~ 'microsoft.cdn/profiles/customdomains' | extend frontDoorId = substring(id, 0, indexof(id, '/customdomains')) | extend compliant = (isnull(properties['tlsSettings']['certificateType']) or tolower(properties['tlsSettings']['certificateType']) =~ 'customercertificate') | project compliant, id = frontDoorId | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed\",\n \"size\": 4,\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"gridSettings\": {\n \"formatters\": [\n {\n \"columnMatch\": \"id\",\n \"formatter\": 0,\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n {\n \"columnMatch\": \"compliant\",\n \"formatter\": 18,\n \"formatOptions\": {\n \"thresholdsOptions\": \"icons\",\n \"thresholdsGrid\": [\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"1\",\n \"representation\": \"success\",\n \"text\": \"Success\"\n },\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"0\",\n \"representation\": \"failed\",\n \"text\": \"Failed\"\n },\n {\n \"operator\": \"Default\",\n \"thresholdValue\": null,\n \"representation\": \"unknown\",\n \"text\": \"Unknown\"\n }\n ]\n }\n }\n ]\n }\n },\n \"name\": \"query9\"\n }\n ]\n },\n \"conditionalVisibility\": {\n \"parameterName\": \"VisibleTab\",\n \"comparison\": \"isEqualTo\",\n \"value\": \"tab0\"\n },\n \"name\": \"tab0\"\n },\n {\n \"type\": 12,\n \"content\": {\n \"version\": \"NotebookGroup/1.0\",\n \"groupType\": \"editable\",\n \"items\": [\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"## App Gateway\"\n },\n \"name\": \"tab1title\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"Ensure you are using Application Gateway v2 SKU. Check [this link](https://learn.microsoft.com/azure/application-gateway/overview-v2) for further information.. [This training](https://learn.microsoft.com/learn/paths/secure-application-delivery/) can help to educate yourself on this.\"\n },\n \"name\": \"querytext0\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"resources | where type == 'microsoft.network/applicationgateways' | project id, compliant = properties.sku.name in ('Standard_v2', 'WAF_v2') | project id,compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed\",\n \"size\": 4,\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"gridSettings\": {\n \"formatters\": [\n {\n \"columnMatch\": \"id\",\n \"formatter\": 0,\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n {\n \"columnMatch\": \"compliant\",\n \"formatter\": 18,\n \"formatOptions\": {\n \"thresholdsOptions\": \"icons\",\n \"thresholdsGrid\": [\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"1\",\n \"representation\": \"success\",\n \"text\": \"Success\"\n },\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"0\",\n \"representation\": \"failed\",\n \"text\": \"Failed\"\n },\n {\n \"operator\": \"Default\",\n \"thresholdValue\": null,\n \"representation\": \"unknown\",\n \"text\": \"Unknown\"\n }\n ]\n }\n }\n ]\n }\n },\n \"name\": \"query0\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"Your Application Gateways v2 should be deployed in subnets with IP prefixes equal or larger than /24. Check [this link](https://learn.microsoft.com/azure/application-gateway/configuration-infrastructure#size-of-the-subnet) for further information.. [This training](https://learn.microsoft.com/learn/paths/secure-application-delivery/) can help to educate yourself on this.\"\n },\n \"name\": \"querytext2\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"resources | where type=='microsoft.network/applicationgateways' | extend subnetId = tostring(properties.gatewayIPConfigurations[0].properties.subnet.id) | project id, subnetId | join (resources | where type=='microsoft.network/virtualnetworks' | project id,subnets=properties.subnets | mv-expand subnets | mv-expand subnets.properties.addressPrefixes | project id, subnetId = tostring(subnets.id), prefix1 = subnets.properties.addressPrefix, prefix2 = subnets.properties.addressPrefixes | mv-expand prefix2 | extend prefix = iff(isnotnull(prefix1), prefix1, prefix2) | extend subnetPrefixLength = split(prefix, '/')[1])on subnetId | extend compliant = (subnetPrefixLength <= 24 or subnetPrefixLength == 64) | distinct id,compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed\",\n \"size\": 4,\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"gridSettings\": {\n \"formatters\": [\n {\n \"columnMatch\": \"id\",\n \"formatter\": 0,\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n {\n \"columnMatch\": \"compliant\",\n \"formatter\": 18,\n \"formatOptions\": {\n \"thresholdsOptions\": \"icons\",\n \"thresholdsGrid\": [\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"1\",\n \"representation\": \"success\",\n \"text\": \"Success\"\n },\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"0\",\n \"representation\": \"failed\",\n \"text\": \"Failed\"\n },\n {\n \"operator\": \"Default\",\n \"thresholdValue\": null,\n \"representation\": \"unknown\",\n \"text\": \"Unknown\"\n }\n ]\n }\n }\n ]\n }\n },\n \"name\": \"query2\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"Configure autoscaling with a minimum amount of instances of two. Check [this link](https://learn.microsoft.com/azure/application-gateway/application-gateway-autoscaling-zone-redundant) for further information.. [This training](https://learn.microsoft.com/learn/paths/secure-application-delivery/) can help to educate yourself on this.\"\n },\n \"name\": \"querytext3\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"resources | where type =~ 'microsoft.network/applicationGateways' | extend compliant = (isnotnull(properties.autoscaleConfiguration) and properties.autoscaleConfiguration.minCapacity >= 2) | distinct id,compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed\",\n \"size\": 4,\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"gridSettings\": {\n \"formatters\": [\n {\n \"columnMatch\": \"id\",\n \"formatter\": 0,\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n {\n \"columnMatch\": \"compliant\",\n \"formatter\": 18,\n \"formatOptions\": {\n \"thresholdsOptions\": \"icons\",\n \"thresholdsGrid\": [\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"1\",\n \"representation\": \"success\",\n \"text\": \"Success\"\n },\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"0\",\n \"representation\": \"failed\",\n \"text\": \"Failed\"\n },\n {\n \"operator\": \"Default\",\n \"thresholdValue\": null,\n \"representation\": \"unknown\",\n \"text\": \"Unknown\"\n }\n ]\n }\n }\n ]\n }\n },\n \"name\": \"query3\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"Deploy Application Gateway across Availability Zones. Check [this link](https://learn.microsoft.com/azure/reliability/migrate-app-gateway-v2) for further information.. [This training](https://learn.microsoft.com/learn/paths/secure-application-delivery/) can help to educate yourself on this.\"\n },\n \"name\": \"querytext4\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"resources | where type =~ 'microsoft.network/applicationGateways' | extend compliant = (isnotnull(zones) and array_length(zones) > 1) | distinct id,compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed\",\n \"size\": 4,\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"gridSettings\": {\n \"formatters\": [\n {\n \"columnMatch\": \"id\",\n \"formatter\": 0,\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n {\n \"columnMatch\": \"compliant\",\n \"formatter\": 18,\n \"formatOptions\": {\n \"thresholdsOptions\": \"icons\",\n \"thresholdsGrid\": [\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"1\",\n \"representation\": \"success\",\n \"text\": \"Success\"\n },\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"0\",\n \"representation\": \"failed\",\n \"text\": \"Failed\"\n },\n {\n \"operator\": \"Default\",\n \"thresholdValue\": null,\n \"representation\": \"unknown\",\n \"text\": \"Unknown\"\n }\n ]\n }\n }\n ]\n }\n },\n \"name\": \"query4\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"Enable the Azure Application Gateway WAF bot protection rule set. The bot rules detect good and bad bots. Check [this link](https://learn.microsoft.com/azure/web-application-firewall/ag/bot-protection) for further information.\"\n },\n \"name\": \"querytext10\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"resources | where type == 'microsoft.network/applicationgatewaywebapplicationfirewallpolicies' | mv-expand properties.managedRules.managedRuleSets | project id, rulesettype = properties_managedRules_managedRuleSets.ruleSetType | extend compliant1 = (rulesettype == 'Microsoft_BotManagerRuleSet') | project id, compliant1 | summarize compliant = max(compliant1) by id | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed\",\n \"size\": 4,\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"gridSettings\": {\n \"formatters\": [\n {\n \"columnMatch\": \"id\",\n \"formatter\": 0,\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n {\n \"columnMatch\": \"compliant\",\n \"formatter\": 18,\n \"formatOptions\": {\n \"thresholdsOptions\": \"icons\",\n \"thresholdsGrid\": [\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"1\",\n \"representation\": \"success\",\n \"text\": \"Success\"\n },\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"0\",\n \"representation\": \"failed\",\n \"text\": \"Failed\"\n },\n {\n \"operator\": \"Default\",\n \"thresholdValue\": null,\n \"representation\": \"unknown\",\n \"text\": \"Unknown\"\n }\n ]\n }\n }\n ]\n }\n },\n \"name\": \"query10\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"Deploy your WAF policy for Application Gateway in 'Prevention' mode. Check [this link](https://learn.microsoft.com/azure/web-application-firewall/afds/waf-front-door-policy-settings) for further information.\"\n },\n \"name\": \"querytext11\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"resources | where type == 'microsoft.network/frontdoorwebapplicationfirewallpolicies' | project policyName=name, policyId=id,policySku=sku.name, links=properties.securityPolicyLinks, enabledState=properties.policySettings.enabledState, mode=properties.policySettings.mode | mvexpand links | extend securityPolicy=links.id | extend securityPolicyParts=split(securityPolicy, '/') | extend profileId=strcat_array(array_slice(securityPolicyParts, 0, -3), '/') | project id=profileId, compliant=((enabledState=='Enabled') and (mode=='Prevention')), enabledState, mode | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed\",\n \"size\": 4,\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"gridSettings\": {\n \"formatters\": [\n {\n \"columnMatch\": \"id\",\n \"formatter\": 0,\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n {\n \"columnMatch\": \"compliant\",\n \"formatter\": 18,\n \"formatOptions\": {\n \"thresholdsOptions\": \"icons\",\n \"thresholdsGrid\": [\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"1\",\n \"representation\": \"success\",\n \"text\": \"Success\"\n },\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"0\",\n \"representation\": \"failed\",\n \"text\": \"Failed\"\n },\n {\n \"operator\": \"Default\",\n \"thresholdValue\": null,\n \"representation\": \"unknown\",\n \"text\": \"Unknown\"\n }\n ]\n }\n }\n ]\n }\n },\n \"name\": \"query11\"\n }\n ]\n },\n \"conditionalVisibility\": {\n \"parameterName\": \"VisibleTab\",\n \"comparison\": \"isEqualTo\",\n \"value\": \"tab1\"\n },\n \"name\": \"tab1\"\n },\n {\n \"type\": 12,\n \"content\": {\n \"version\": \"NotebookGroup/1.0\",\n \"groupType\": \"editable\",\n \"items\": [\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"## Load Balancer\"\n },\n \"name\": \"tab2title\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"Ensure you are using the Standard SKU for your Azure Load Balancers. Check [this link](https://learn.microsoft.com/azure/load-balancer/load-balancer-overview) for further information.\"\n },\n \"name\": \"querytext1\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"resources | where type == 'microsoft.network/loadbalancers' | project id, compliant=(tolower(sku.name) == 'standard') | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed\",\n \"size\": 4,\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"gridSettings\": {\n \"formatters\": [\n {\n \"columnMatch\": \"id\",\n \"formatter\": 0,\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n {\n \"columnMatch\": \"compliant\",\n \"formatter\": 18,\n \"formatOptions\": {\n \"thresholdsOptions\": \"icons\",\n \"thresholdsGrid\": [\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"1\",\n \"representation\": \"success\",\n \"text\": \"Success\"\n },\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"0\",\n \"representation\": \"failed\",\n \"text\": \"Failed\"\n },\n {\n \"operator\": \"Default\",\n \"thresholdValue\": null,\n \"representation\": \"unknown\",\n \"text\": \"Unknown\"\n }\n ]\n }\n }\n ]\n }\n },\n \"name\": \"query1\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"Use Azure NAT Gateway instead of Load Balancer outbound rules for better SNAT scalability. Check [this link](https://learn.microsoft.com/azure/nat-gateway/nat-overview#outbound-connectivity) for further information.\"\n },\n \"name\": \"querytext8\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"resources | where type=='microsoft.network/loadbalancers' | extend countOutRules=array_length(properties.outboundRules) | extend compliant = (countOutRules == 0) | distinct id,compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed\",\n \"size\": 4,\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"gridSettings\": {\n \"formatters\": [\n {\n \"columnMatch\": \"id\",\n \"formatter\": 0,\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n {\n \"columnMatch\": \"compliant\",\n \"formatter\": 18,\n \"formatOptions\": {\n \"thresholdsOptions\": \"icons\",\n \"thresholdsGrid\": [\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"1\",\n \"representation\": \"success\",\n \"text\": \"Success\"\n },\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"0\",\n \"representation\": \"failed\",\n \"text\": \"Failed\"\n },\n {\n \"operator\": \"Default\",\n \"thresholdValue\": null,\n \"representation\": \"unknown\",\n \"text\": \"Unknown\"\n }\n ]\n }\n }\n ]\n }\n },\n \"name\": \"query8\"\n }\n ]\n },\n \"conditionalVisibility\": {\n \"parameterName\": \"VisibleTab\",\n \"comparison\": \"isEqualTo\",\n \"value\": \"tab2\"\n },\n \"name\": \"tab2\"\n }\n ],\n \"$schema\": \"https://github.com/Microsoft/Application-Insights-Workbooks/blob/master/schema/workbook.json\"\n}", + "serializedData": "{\n \"version\": \"Notebook/1.0\",\n \"items\": [\n {\n \"type\": 9,\n \"content\": {\n \"version\": \"KqlParameterItem/1.0\",\n \"parameters\": [\n {\n \"id\": \"497a107e-dde8-433e-b263-35ac8e8f7834\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Subscription\",\n \"type\": 6,\n \"multiSelect\": true,\n \"quote\": \"'\",\n \"delimiter\": \",\",\n \"typeSettings\": {\n \"additionalResourceOptions\": [\n \"value::all\"\n ],\n \"includeAll\": true,\n \"showDefault\": false\n },\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"value\": [\n \"value::all\"\n ]\n },\n {\n \"id\": \"844e4f4e-df51-4e3c-8eaf-0dc78b92c721\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"OnlyFailed\",\n \"label\": \"Only show failed\",\n \"type\": 2,\n \"typeSettings\": {\n \"additionalResourceOptions\": [],\n \"showDefault\": false\n },\n \"jsonData\": \"[\\r\\n { \\\"value\\\":true, \\\"label\\\":\\\"True\\\" },\\r\\n { \\\"value\\\":false, \\\"label\\\":\\\"False\\\", \\\"selected\\\":true }\\r\\n]\"\n }\n ],\n \"style\": \"pills\",\n \"queryType\": 0,\n \"resourceType\": \"microsoft.operationalinsights/workspaces\"\n },\n \"name\": \"WorkbookSelectors\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"If you set \\\"Only show failed\\\" to \\\"Yes\\\", the different queries will only show items that have failed their compliance checks.\",\n \"style\": \"info\"\n },\n \"name\": \"InfoBox\"\n },\n {\n \"type\": 9,\n \"content\": {\n \"version\": \"KqlParameterItem/1.0\",\n \"crossComponentResources\": [\n \"value::all\"\n ],\n \"parameters\": [\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query0Stats\",\n \"type\": 1,\n \"query\": \"resources | where type == 'microsoft.network/applicationgateways' | project id, compliant = properties.sku.name in ('Standard_v2', 'WAF_v2') | project id,compliant| summarize Total = count(), Success = countif(compliant==1), Failed = countif(compliant==0) | extend SuccessPercent = iff(Total==0, 100, 100*toint(Success)/toint(Total)) | extend FullyCompliant = iff(SuccessPercent == 100, 'Yes', 'No') | project Query1Stats=tostring(pack_all())\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\"\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query0FullyCompliant\",\n \"type\": 1,\n \"query\": \"{\\\"version\\\":\\\"1.0.0\\\",\\\"content\\\":\\\"{\\\\\\\"value\\\\\\\": \\\\\\\"{Query0Stats:$.FullyCompliant}\\\\\\\"}\\\",\\\"transformers\\\":null}\",\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 8\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query1Stats\",\n \"type\": 1,\n \"query\": \"resources | where type == 'microsoft.network/loadbalancers' | project id, compliant=(tolower(sku.name) == 'standard')| summarize Total = count(), Success = countif(compliant==1), Failed = countif(compliant==0) | extend SuccessPercent = iff(Total==0, 100, 100*toint(Success)/toint(Total)) | extend FullyCompliant = iff(SuccessPercent == 100, 'Yes', 'No') | project Query1Stats=tostring(pack_all())\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\"\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query1FullyCompliant\",\n \"type\": 1,\n \"query\": \"{\\\"version\\\":\\\"1.0.0\\\",\\\"content\\\":\\\"{\\\\\\\"value\\\\\\\": \\\\\\\"{Query1Stats:$.FullyCompliant}\\\\\\\"}\\\",\\\"transformers\\\":null}\",\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 8\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query2Stats\",\n \"type\": 1,\n \"query\": \"resources | where type=='microsoft.network/applicationgateways' | extend subnetId = tostring(properties.gatewayIPConfigurations[0].properties.subnet.id) | project id, subnetId | join (resources | where type=='microsoft.network/virtualnetworks' | project id,subnets=properties.subnets | mv-expand subnets | mv-expand subnets.properties.addressPrefixes | project id, subnetId = tostring(subnets.id), prefix1 = subnets.properties.addressPrefix, prefix2 = subnets.properties.addressPrefixes | mv-expand prefix2 | extend prefix = iff(isnotnull(prefix1), prefix1, prefix2) | extend subnetPrefixLength = split(prefix, '/')[1])on subnetId | extend compliant = (subnetPrefixLength <= 24 or subnetPrefixLength == 64) | distinct id,compliant| summarize Total = count(), Success = countif(compliant==1), Failed = countif(compliant==0) | extend SuccessPercent = iff(Total==0, 100, 100*toint(Success)/toint(Total)) | extend FullyCompliant = iff(SuccessPercent == 100, 'Yes', 'No') | project Query1Stats=tostring(pack_all())\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\"\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query2FullyCompliant\",\n \"type\": 1,\n \"query\": \"{\\\"version\\\":\\\"1.0.0\\\",\\\"content\\\":\\\"{\\\\\\\"value\\\\\\\": \\\\\\\"{Query2Stats:$.FullyCompliant}\\\\\\\"}\\\",\\\"transformers\\\":null}\",\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 8\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query3Stats\",\n \"type\": 1,\n \"query\": \"resources | where type =~ 'microsoft.network/applicationGateways' | extend compliant = (isnotnull(properties.autoscaleConfiguration) and properties.autoscaleConfiguration.minCapacity >= 2) | distinct id,compliant| summarize Total = count(), Success = countif(compliant==1), Failed = countif(compliant==0) | extend SuccessPercent = iff(Total==0, 100, 100*toint(Success)/toint(Total)) | extend FullyCompliant = iff(SuccessPercent == 100, 'Yes', 'No') | project Query1Stats=tostring(pack_all())\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\"\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query3FullyCompliant\",\n \"type\": 1,\n \"query\": \"{\\\"version\\\":\\\"1.0.0\\\",\\\"content\\\":\\\"{\\\\\\\"value\\\\\\\": \\\\\\\"{Query3Stats:$.FullyCompliant}\\\\\\\"}\\\",\\\"transformers\\\":null}\",\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 8\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query4Stats\",\n \"type\": 1,\n \"query\": \"resources | where type =~ 'microsoft.network/applicationGateways' | extend compliant = (isnotnull(zones) and array_length(zones) > 1) | distinct id,compliant| summarize Total = count(), Success = countif(compliant==1), Failed = countif(compliant==0) | extend SuccessPercent = iff(Total==0, 100, 100*toint(Success)/toint(Total)) | extend FullyCompliant = iff(SuccessPercent == 100, 'Yes', 'No') | project Query1Stats=tostring(pack_all())\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\"\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query4FullyCompliant\",\n \"type\": 1,\n \"query\": \"{\\\"version\\\":\\\"1.0.0\\\",\\\"content\\\":\\\"{\\\\\\\"value\\\\\\\": \\\\\\\"{Query4Stats:$.FullyCompliant}\\\\\\\"}\\\",\\\"transformers\\\":null}\",\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 8\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query5Stats\",\n \"type\": 1,\n \"query\": \"resources | where type == 'microsoft.network/frontdoorwebapplicationfirewallpolicies' | project policyName=name, policyId=id,policySku=sku.name, links=properties.securityPolicyLinks, enabledState=properties.policySettings.enabledState, mode=properties.policySettings.mode | mvexpand links | extend securityPolicy=links.id | extend securityPolicyParts=split(securityPolicy, '/') | extend profileId=strcat_array(array_slice(securityPolicyParts, 0, -3), '/') | project id=profileId, compliant=((enabledState=='Enabled') and (mode=='Prevention')), enabledState, mode| summarize Total = count(), Success = countif(compliant==1), Failed = countif(compliant==0) | extend SuccessPercent = iff(Total==0, 100, 100*toint(Success)/toint(Total)) | extend FullyCompliant = iff(SuccessPercent == 100, 'Yes', 'No') | project Query1Stats=tostring(pack_all())\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\"\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query5FullyCompliant\",\n \"type\": 1,\n \"query\": \"{\\\"version\\\":\\\"1.0.0\\\",\\\"content\\\":\\\"{\\\\\\\"value\\\\\\\": \\\\\\\"{Query5Stats:$.FullyCompliant}\\\\\\\"}\\\",\\\"transformers\\\":null}\",\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 8\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query6Stats\",\n \"type\": 1,\n \"query\": \"cdnresources | where type =~ 'microsoft.cdn/profiles/origingroups/origins' | extend frontDoorId = substring(id, 0, indexof(id, '/origingroups')) | extend originGroupId = substring(id, 0, indexof(id, '/origins')) | join kind=inner (cdnresources | where type =~ 'microsoft.cdn/profiles/origingroups' | extend originGroupName = name | extend hasHealthProbe = isnotnull(properties.healthProbeSettings)) on $left.originGroupId == $right.id | summarize numberOrigins = count() by originGroupId, subscriptionId, frontDoorId, hasHealthProbe, originGroupName | extend compliant = not(numberOrigins == 1 and hasHealthProbe) | project id = frontDoorId, compliant| summarize Total = count(), Success = countif(compliant==1), Failed = countif(compliant==0) | extend SuccessPercent = iff(Total==0, 100, 100*toint(Success)/toint(Total)) | extend FullyCompliant = iff(SuccessPercent == 100, 'Yes', 'No') | project Query1Stats=tostring(pack_all())\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\"\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query6FullyCompliant\",\n \"type\": 1,\n \"query\": \"{\\\"version\\\":\\\"1.0.0\\\",\\\"content\\\":\\\"{\\\\\\\"value\\\\\\\": \\\\\\\"{Query6Stats:$.FullyCompliant}\\\\\\\"}\\\",\\\"transformers\\\":null}\",\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 8\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query7Stats\",\n \"type\": 1,\n \"query\": \"cdnresources | where type =~ 'microsoft.cdn/profiles/origingroups' | extend frontDoorId = substring(id, 0, indexof(id, '/origingroups/')) | extend compliant = (isnull(properties['healthProbeSettings']['probeRequestType']) or toupper(properties['healthProbeSettings']['probeRequestType']) == 'HEAD') | project compliant, id=frontDoorId| summarize Total = count(), Success = countif(compliant==1), Failed = countif(compliant==0) | extend SuccessPercent = iff(Total==0, 100, 100*toint(Success)/toint(Total)) | extend FullyCompliant = iff(SuccessPercent == 100, 'Yes', 'No') | project Query1Stats=tostring(pack_all())\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\"\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query7FullyCompliant\",\n \"type\": 1,\n \"query\": \"{\\\"version\\\":\\\"1.0.0\\\",\\\"content\\\":\\\"{\\\\\\\"value\\\\\\\": \\\\\\\"{Query7Stats:$.FullyCompliant}\\\\\\\"}\\\",\\\"transformers\\\":null}\",\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 8\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query8Stats\",\n \"type\": 1,\n \"query\": \"resources | where type=='microsoft.network/loadbalancers' | extend countOutRules=array_length(properties.outboundRules) | extend compliant = (countOutRules == 0) | distinct id,compliant| summarize Total = count(), Success = countif(compliant==1), Failed = countif(compliant==0) | extend SuccessPercent = iff(Total==0, 100, 100*toint(Success)/toint(Total)) | extend FullyCompliant = iff(SuccessPercent == 100, 'Yes', 'No') | project Query1Stats=tostring(pack_all())\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\"\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query8FullyCompliant\",\n \"type\": 1,\n \"query\": \"{\\\"version\\\":\\\"1.0.0\\\",\\\"content\\\":\\\"{\\\\\\\"value\\\\\\\": \\\\\\\"{Query8Stats:$.FullyCompliant}\\\\\\\"}\\\",\\\"transformers\\\":null}\",\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 8\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query9Stats\",\n \"type\": 1,\n \"query\": \"cdnresources | where type =~ 'microsoft.cdn/profiles/customdomains' | extend frontDoorId = substring(id, 0, indexof(id, '/customdomains')) | extend compliant = (isnull(properties['tlsSettings']['certificateType']) or tolower(properties['tlsSettings']['certificateType']) =~ 'customercertificate') | project compliant, id = frontDoorId| summarize Total = count(), Success = countif(compliant==1), Failed = countif(compliant==0) | extend SuccessPercent = iff(Total==0, 100, 100*toint(Success)/toint(Total)) | extend FullyCompliant = iff(SuccessPercent == 100, 'Yes', 'No') | project Query1Stats=tostring(pack_all())\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\"\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query9FullyCompliant\",\n \"type\": 1,\n \"query\": \"{\\\"version\\\":\\\"1.0.0\\\",\\\"content\\\":\\\"{\\\\\\\"value\\\\\\\": \\\\\\\"{Query9Stats:$.FullyCompliant}\\\\\\\"}\\\",\\\"transformers\\\":null}\",\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 8\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query10Stats\",\n \"type\": 1,\n \"query\": \"resources | where type == 'microsoft.network/applicationgatewaywebapplicationfirewallpolicies' | mv-expand properties.managedRules.managedRuleSets | project id, rulesettype = properties_managedRules_managedRuleSets.ruleSetType | extend compliant1 = (rulesettype == 'Microsoft_BotManagerRuleSet') | project id, compliant1 | summarize compliant = max(compliant1) by id| summarize Total = count(), Success = countif(compliant==1), Failed = countif(compliant==0) | extend SuccessPercent = iff(Total==0, 100, 100*toint(Success)/toint(Total)) | extend FullyCompliant = iff(SuccessPercent == 100, 'Yes', 'No') | project Query1Stats=tostring(pack_all())\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\"\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query10FullyCompliant\",\n \"type\": 1,\n \"query\": \"{\\\"version\\\":\\\"1.0.0\\\",\\\"content\\\":\\\"{\\\\\\\"value\\\\\\\": \\\\\\\"{Query10Stats:$.FullyCompliant}\\\\\\\"}\\\",\\\"transformers\\\":null}\",\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 8\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query11Stats\",\n \"type\": 1,\n \"query\": \"resources | where type == 'microsoft.network/frontdoorwebapplicationfirewallpolicies' | project policyName=name, policyId=id,policySku=sku.name, links=properties.securityPolicyLinks, enabledState=properties.policySettings.enabledState, mode=properties.policySettings.mode | mvexpand links | extend securityPolicy=links.id | extend securityPolicyParts=split(securityPolicy, '/') | extend profileId=strcat_array(array_slice(securityPolicyParts, 0, -3), '/') | project id=profileId, compliant=((enabledState=='Enabled') and (mode=='Prevention')), enabledState, mode| summarize Total = count(), Success = countif(compliant==1), Failed = countif(compliant==0) | extend SuccessPercent = iff(Total==0, 100, 100*toint(Success)/toint(Total)) | extend FullyCompliant = iff(SuccessPercent == 100, 'Yes', 'No') | project Query1Stats=tostring(pack_all())\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\"\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query11FullyCompliant\",\n \"type\": 1,\n \"query\": \"{\\\"version\\\":\\\"1.0.0\\\",\\\"content\\\":\\\"{\\\\\\\"value\\\\\\\": \\\\\\\"{Query11Stats:$.FullyCompliant}\\\\\\\"}\\\",\\\"transformers\\\":null}\",\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 8\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Tab0Success\",\n \"type\": 1,\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"criteriaData\": [\n {\n \"criteriaContext\": {\n \"operator\": \"Default\",\n \"resultValType\": \"expression\",\n \"resultVal\": \"{Query1Stats:$.Success}+{Query8Stats:$.Success}\"\n }\n }\n ]\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Tab0Total\",\n \"type\": 1,\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"criteriaData\": [\n {\n \"criteriaContext\": {\n \"operator\": \"Default\",\n \"resultValType\": \"expression\",\n \"resultVal\": \"{Query1Stats:$.Total}+{Query8Stats:$.Total}\"\n }\n }\n ]\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Tab0Percent\",\n \"type\": 1,\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"criteriaData\": [\n {\n \"criteriaContext\": {\n \"operator\": \"Default\",\n \"resultValType\": \"expression\",\n \"resultVal\": \"round(100*{Tab0Success}/{Tab0Total})\"\n }\n }\n ]\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Tab1Success\",\n \"type\": 1,\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"criteriaData\": [\n {\n \"criteriaContext\": {\n \"operator\": \"Default\",\n \"resultValType\": \"expression\",\n \"resultVal\": \"{Query0Stats:$.Success}+{Query2Stats:$.Success}+{Query3Stats:$.Success}+{Query4Stats:$.Success}+{Query10Stats:$.Success}+{Query11Stats:$.Success}\"\n }\n }\n ]\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Tab1Total\",\n \"type\": 1,\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"criteriaData\": [\n {\n \"criteriaContext\": {\n \"operator\": \"Default\",\n \"resultValType\": \"expression\",\n \"resultVal\": \"{Query0Stats:$.Total}+{Query2Stats:$.Total}+{Query3Stats:$.Total}+{Query4Stats:$.Total}+{Query10Stats:$.Total}+{Query11Stats:$.Total}\"\n }\n }\n ]\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Tab1Percent\",\n \"type\": 1,\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"criteriaData\": [\n {\n \"criteriaContext\": {\n \"operator\": \"Default\",\n \"resultValType\": \"expression\",\n \"resultVal\": \"round(100*{Tab1Success}/{Tab1Total})\"\n }\n }\n ]\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Tab2Success\",\n \"type\": 1,\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"criteriaData\": [\n {\n \"criteriaContext\": {\n \"operator\": \"Default\",\n \"resultValType\": \"expression\",\n \"resultVal\": \"{Query5Stats:$.Success}+{Query6Stats:$.Success}+{Query7Stats:$.Success}+{Query9Stats:$.Success}\"\n }\n }\n ]\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Tab2Total\",\n \"type\": 1,\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"criteriaData\": [\n {\n \"criteriaContext\": {\n \"operator\": \"Default\",\n \"resultValType\": \"expression\",\n \"resultVal\": \"{Query5Stats:$.Total}+{Query6Stats:$.Total}+{Query7Stats:$.Total}+{Query9Stats:$.Total}\"\n }\n }\n ]\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Tab2Percent\",\n \"type\": 1,\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"criteriaData\": [\n {\n \"criteriaContext\": {\n \"operator\": \"Default\",\n \"resultValType\": \"expression\",\n \"resultVal\": \"round(100*{Tab2Success}/{Tab2Total})\"\n }\n }\n ]\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"WorkbookTotal\",\n \"type\": 1,\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"criteriaData\": [\n {\n \"criteriaContext\": {\n \"operator\": \"Default\",\n \"resultValType\": \"expression\",\n \"resultVal\": \"{Query1Stats:$.Total}+{Query8Stats:$.Total}+{Query0Stats:$.Total}+{Query2Stats:$.Total}+{Query3Stats:$.Total}+{Query4Stats:$.Total}+{Query10Stats:$.Total}+{Query11Stats:$.Total}+{Query5Stats:$.Total}+{Query6Stats:$.Total}+{Query7Stats:$.Total}+{Query9Stats:$.Total}\"\n }\n }\n ]\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"WorkbookSuccess\",\n \"type\": 1,\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"criteriaData\": [\n {\n \"criteriaContext\": {\n \"operator\": \"Default\",\n \"resultValType\": \"expression\",\n \"resultVal\": \"{Query1Stats:$.Success}+{Query8Stats:$.Success}+{Query0Stats:$.Success}+{Query2Stats:$.Success}+{Query3Stats:$.Success}+{Query4Stats:$.Success}+{Query10Stats:$.Success}+{Query11Stats:$.Success}+{Query5Stats:$.Success}+{Query6Stats:$.Success}+{Query7Stats:$.Success}+{Query9Stats:$.Success}\"\n }\n }\n ]\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"WorkbookPercent\",\n \"type\": 1,\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"criteriaData\": [\n {\n \"criteriaContext\": {\n \"operator\": \"Default\",\n \"resultValType\": \"expression\",\n \"resultVal\": \"round(100*{WorkbookSuccess}/{WorkbookTotal})\"\n }\n }\n ]\n }\n ],\n \"style\": \"pills\",\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\"\n },\n \"name\": \"InvisibleParameters\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"## Azure Application Delivery Networking - Network\\n\\n---\\n\\nThis workbook has been automatically generated out of the checklists in the [Azure Review Checklists repo](https://github.com/Azure/review-checklists). This repo contains best practices and recommendations around generic Landing Zones as well as specific services such as Azure Virtual Desktop, Azure Kubernetes Service or Azure VMware Solution, to name a few. This repository of best practices is curated by Azure engineers, but open to anybody to contribute.\\n\\nIf you see a problem in the queries that are part of this workbook, please open a Github issue [here](https://github.com/Azure/review-checklists/issues/new).\"\n },\n \"customWidth\": \"50\",\n \"name\": \"MarkdownHeader\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"{\\\"version\\\":\\\"1.0.0\\\",\\\"content\\\":\\\"{\\\\\\\"WorkbookPercent\\\\\\\": \\\\\\\"{WorkbookPercent}\\\\\\\", \\\\\\\"SubTitle\\\\\\\": \\\\\\\"Percent of successful checks\\\\\\\"}\\\",\\\"transformers\\\":null}\",\n \"size\": 4,\n \"queryType\": 8,\n \"visualization\": \"tiles\",\n \"tileSettings\": {\n \"titleContent\": {\n \"columnMatch\": \"WorkbookPercent\",\n \"formatter\": 4,\n \"formatOptions\": {\n \"min\": 0,\n \"max\": 100,\n \"palette\": \"redGreen\"\n }\n },\n \"subtitleContent\": {\n \"columnMatch\": \"SubTitle\",\n \"formatter\": 1\n },\n \"showBorder\": true\n }\n },\n \"customWidth\": \"50\",\n \"name\": \"ProgressTile\"\n },\n {\n \"type\": 11,\n \"content\": {\n \"version\": \"LinkItem/1.0\",\n \"style\": \"tabs\",\n \"links\": [\n {\n \"id\": \"8f9328ab-7cc5-4882-bc57-347dd7f12f2d\",\n \"cellValue\": \"VisibleTab\",\n \"linkTarget\": \"parameter\",\n \"linkLabel\": \"Load Balancer ({Tab0Success:value}/{Tab0Total:value})\",\n \"subTarget\": \"tab0\",\n \"preText\": \"Load Balancer\",\n \"style\": \"primary\"\n },\n {\n \"id\": \"6765eed7-c503-4466-9eeb-345e61fbadad\",\n \"cellValue\": \"VisibleTab\",\n \"linkTarget\": \"parameter\",\n \"linkLabel\": \"App Gateway ({Tab1Success:value}/{Tab1Total:value})\",\n \"subTarget\": \"tab1\",\n \"preText\": \"App Gateway\",\n \"style\": \"primary\"\n },\n {\n \"id\": \"cb096da5-a7d9-4383-8802-4285449fb49c\",\n \"cellValue\": \"VisibleTab\",\n \"linkTarget\": \"parameter\",\n \"linkLabel\": \"Front Door ({Tab2Success:value}/{Tab2Total:value})\",\n \"subTarget\": \"tab2\",\n \"preText\": \"Front Door\",\n \"style\": \"primary\"\n }\n ]\n },\n \"name\": \"Tabs\"\n },\n {\n \"type\": 12,\n \"content\": {\n \"version\": \"NotebookGroup/1.0\",\n \"groupType\": \"editable\",\n \"items\": [\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"## Load Balancer\"\n },\n \"name\": \"tab0title\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"Ensure you are using the Standard SKU for your Azure Load Balancers. Check [this link](https://learn.microsoft.com/azure/load-balancer/load-balancer-overview) for further information.\"\n },\n \"name\": \"querytext1\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"resources | where type == 'microsoft.network/loadbalancers' | project id, compliant=(tolower(sku.name) == 'standard') | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed\",\n \"size\": 4,\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"gridSettings\": {\n \"formatters\": [\n {\n \"columnMatch\": \"id\",\n \"formatter\": 0,\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n {\n \"columnMatch\": \"compliant\",\n \"formatter\": 18,\n \"formatOptions\": {\n \"thresholdsOptions\": \"icons\",\n \"thresholdsGrid\": [\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"1\",\n \"representation\": \"success\",\n \"text\": \"Success\"\n },\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"0\",\n \"representation\": \"failed\",\n \"text\": \"Failed\"\n },\n {\n \"operator\": \"Default\",\n \"thresholdValue\": null,\n \"representation\": \"unknown\",\n \"text\": \"Unknown\"\n }\n ]\n }\n }\n ]\n }\n },\n \"name\": \"query1\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"Use Azure NAT Gateway instead of Load Balancer outbound rules for better SNAT scalability. Check [this link](https://learn.microsoft.com/azure/nat-gateway/nat-overview#outbound-connectivity) for further information.\"\n },\n \"name\": \"querytext8\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"resources | where type=='microsoft.network/loadbalancers' | extend countOutRules=array_length(properties.outboundRules) | extend compliant = (countOutRules == 0) | distinct id,compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed\",\n \"size\": 4,\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"gridSettings\": {\n \"formatters\": [\n {\n \"columnMatch\": \"id\",\n \"formatter\": 0,\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n {\n \"columnMatch\": \"compliant\",\n \"formatter\": 18,\n \"formatOptions\": {\n \"thresholdsOptions\": \"icons\",\n \"thresholdsGrid\": [\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"1\",\n \"representation\": \"success\",\n \"text\": \"Success\"\n },\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"0\",\n \"representation\": \"failed\",\n \"text\": \"Failed\"\n },\n {\n \"operator\": \"Default\",\n \"thresholdValue\": null,\n \"representation\": \"unknown\",\n \"text\": \"Unknown\"\n }\n ]\n }\n }\n ]\n }\n },\n \"name\": \"query8\"\n }\n ]\n },\n \"conditionalVisibility\": {\n \"parameterName\": \"VisibleTab\",\n \"comparison\": \"isEqualTo\",\n \"value\": \"tab0\"\n },\n \"name\": \"tab0\"\n },\n {\n \"type\": 12,\n \"content\": {\n \"version\": \"NotebookGroup/1.0\",\n \"groupType\": \"editable\",\n \"items\": [\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"## App Gateway\"\n },\n \"name\": \"tab1title\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"Ensure you are using Application Gateway v2 SKU. Check [this link](https://learn.microsoft.com/azure/application-gateway/overview-v2) for further information.. [This training](https://learn.microsoft.com/learn/paths/secure-application-delivery/) can help to educate yourself on this.\"\n },\n \"name\": \"querytext0\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"resources | where type == 'microsoft.network/applicationgateways' | project id, compliant = properties.sku.name in ('Standard_v2', 'WAF_v2') | project id,compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed\",\n \"size\": 4,\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"gridSettings\": {\n \"formatters\": [\n {\n \"columnMatch\": \"id\",\n \"formatter\": 0,\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n {\n \"columnMatch\": \"compliant\",\n \"formatter\": 18,\n \"formatOptions\": {\n \"thresholdsOptions\": \"icons\",\n \"thresholdsGrid\": [\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"1\",\n \"representation\": \"success\",\n \"text\": \"Success\"\n },\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"0\",\n \"representation\": \"failed\",\n \"text\": \"Failed\"\n },\n {\n \"operator\": \"Default\",\n \"thresholdValue\": null,\n \"representation\": \"unknown\",\n \"text\": \"Unknown\"\n }\n ]\n }\n }\n ]\n }\n },\n \"name\": \"query0\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"Your Application Gateways v2 should be deployed in subnets with IP prefixes equal or larger than /24. Check [this link](https://learn.microsoft.com/azure/application-gateway/configuration-infrastructure#size-of-the-subnet) for further information.. [This training](https://learn.microsoft.com/learn/paths/secure-application-delivery/) can help to educate yourself on this.\"\n },\n \"name\": \"querytext2\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"resources | where type=='microsoft.network/applicationgateways' | extend subnetId = tostring(properties.gatewayIPConfigurations[0].properties.subnet.id) | project id, subnetId | join (resources | where type=='microsoft.network/virtualnetworks' | project id,subnets=properties.subnets | mv-expand subnets | mv-expand subnets.properties.addressPrefixes | project id, subnetId = tostring(subnets.id), prefix1 = subnets.properties.addressPrefix, prefix2 = subnets.properties.addressPrefixes | mv-expand prefix2 | extend prefix = iff(isnotnull(prefix1), prefix1, prefix2) | extend subnetPrefixLength = split(prefix, '/')[1])on subnetId | extend compliant = (subnetPrefixLength <= 24 or subnetPrefixLength == 64) | distinct id,compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed\",\n \"size\": 4,\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"gridSettings\": {\n \"formatters\": [\n {\n \"columnMatch\": \"id\",\n \"formatter\": 0,\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n {\n \"columnMatch\": \"compliant\",\n \"formatter\": 18,\n \"formatOptions\": {\n \"thresholdsOptions\": \"icons\",\n \"thresholdsGrid\": [\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"1\",\n \"representation\": \"success\",\n \"text\": \"Success\"\n },\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"0\",\n \"representation\": \"failed\",\n \"text\": \"Failed\"\n },\n {\n \"operator\": \"Default\",\n \"thresholdValue\": null,\n \"representation\": \"unknown\",\n \"text\": \"Unknown\"\n }\n ]\n }\n }\n ]\n }\n },\n \"name\": \"query2\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"Configure autoscaling with a minimum amount of instances of two. Check [this link](https://learn.microsoft.com/azure/application-gateway/application-gateway-autoscaling-zone-redundant) for further information.. [This training](https://learn.microsoft.com/learn/paths/secure-application-delivery/) can help to educate yourself on this.\"\n },\n \"name\": \"querytext3\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"resources | where type =~ 'microsoft.network/applicationGateways' | extend compliant = (isnotnull(properties.autoscaleConfiguration) and properties.autoscaleConfiguration.minCapacity >= 2) | distinct id,compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed\",\n \"size\": 4,\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"gridSettings\": {\n \"formatters\": [\n {\n \"columnMatch\": \"id\",\n \"formatter\": 0,\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n {\n \"columnMatch\": \"compliant\",\n \"formatter\": 18,\n \"formatOptions\": {\n \"thresholdsOptions\": \"icons\",\n \"thresholdsGrid\": [\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"1\",\n \"representation\": \"success\",\n \"text\": \"Success\"\n },\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"0\",\n \"representation\": \"failed\",\n \"text\": \"Failed\"\n },\n {\n \"operator\": \"Default\",\n \"thresholdValue\": null,\n \"representation\": \"unknown\",\n \"text\": \"Unknown\"\n }\n ]\n }\n }\n ]\n }\n },\n \"name\": \"query3\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"Deploy Application Gateway across Availability Zones. Check [this link](https://learn.microsoft.com/azure/reliability/migrate-app-gateway-v2) for further information.. [This training](https://learn.microsoft.com/learn/paths/secure-application-delivery/) can help to educate yourself on this.\"\n },\n \"name\": \"querytext4\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"resources | where type =~ 'microsoft.network/applicationGateways' | extend compliant = (isnotnull(zones) and array_length(zones) > 1) | distinct id,compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed\",\n \"size\": 4,\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"gridSettings\": {\n \"formatters\": [\n {\n \"columnMatch\": \"id\",\n \"formatter\": 0,\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n {\n \"columnMatch\": \"compliant\",\n \"formatter\": 18,\n \"formatOptions\": {\n \"thresholdsOptions\": \"icons\",\n \"thresholdsGrid\": [\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"1\",\n \"representation\": \"success\",\n \"text\": \"Success\"\n },\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"0\",\n \"representation\": \"failed\",\n \"text\": \"Failed\"\n },\n {\n \"operator\": \"Default\",\n \"thresholdValue\": null,\n \"representation\": \"unknown\",\n \"text\": \"Unknown\"\n }\n ]\n }\n }\n ]\n }\n },\n \"name\": \"query4\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"Enable the Azure Application Gateway WAF bot protection rule set. The bot rules detect good and bad bots. Check [this link](https://learn.microsoft.com/azure/web-application-firewall/ag/bot-protection) for further information.\"\n },\n \"name\": \"querytext10\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"resources | where type == 'microsoft.network/applicationgatewaywebapplicationfirewallpolicies' | mv-expand properties.managedRules.managedRuleSets | project id, rulesettype = properties_managedRules_managedRuleSets.ruleSetType | extend compliant1 = (rulesettype == 'Microsoft_BotManagerRuleSet') | project id, compliant1 | summarize compliant = max(compliant1) by id | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed\",\n \"size\": 4,\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"gridSettings\": {\n \"formatters\": [\n {\n \"columnMatch\": \"id\",\n \"formatter\": 0,\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n {\n \"columnMatch\": \"compliant\",\n \"formatter\": 18,\n \"formatOptions\": {\n \"thresholdsOptions\": \"icons\",\n \"thresholdsGrid\": [\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"1\",\n \"representation\": \"success\",\n \"text\": \"Success\"\n },\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"0\",\n \"representation\": \"failed\",\n \"text\": \"Failed\"\n },\n {\n \"operator\": \"Default\",\n \"thresholdValue\": null,\n \"representation\": \"unknown\",\n \"text\": \"Unknown\"\n }\n ]\n }\n }\n ]\n }\n },\n \"name\": \"query10\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"Deploy your WAF policy for Application Gateway in 'Prevention' mode. Check [this link](https://learn.microsoft.com/azure/web-application-firewall/afds/waf-front-door-policy-settings) for further information.\"\n },\n \"name\": \"querytext11\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"resources | where type == 'microsoft.network/frontdoorwebapplicationfirewallpolicies' | project policyName=name, policyId=id,policySku=sku.name, links=properties.securityPolicyLinks, enabledState=properties.policySettings.enabledState, mode=properties.policySettings.mode | mvexpand links | extend securityPolicy=links.id | extend securityPolicyParts=split(securityPolicy, '/') | extend profileId=strcat_array(array_slice(securityPolicyParts, 0, -3), '/') | project id=profileId, compliant=((enabledState=='Enabled') and (mode=='Prevention')), enabledState, mode | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed\",\n \"size\": 4,\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"gridSettings\": {\n \"formatters\": [\n {\n \"columnMatch\": \"id\",\n \"formatter\": 0,\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n {\n \"columnMatch\": \"compliant\",\n \"formatter\": 18,\n \"formatOptions\": {\n \"thresholdsOptions\": \"icons\",\n \"thresholdsGrid\": [\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"1\",\n \"representation\": \"success\",\n \"text\": \"Success\"\n },\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"0\",\n \"representation\": \"failed\",\n \"text\": \"Failed\"\n },\n {\n \"operator\": \"Default\",\n \"thresholdValue\": null,\n \"representation\": \"unknown\",\n \"text\": \"Unknown\"\n }\n ]\n }\n }\n ]\n }\n },\n \"name\": \"query11\"\n }\n ]\n },\n \"conditionalVisibility\": {\n \"parameterName\": \"VisibleTab\",\n \"comparison\": \"isEqualTo\",\n \"value\": \"tab1\"\n },\n \"name\": \"tab1\"\n },\n {\n \"type\": 12,\n \"content\": {\n \"version\": \"NotebookGroup/1.0\",\n \"groupType\": \"editable\",\n \"items\": [\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"## Front Door\"\n },\n \"name\": \"tab2title\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"Deploy your WAF policy for Front Door in 'Prevention' mode' so that Web Application Firewall takes appropriate action to allow or deny traffic. Check [this link](https://learn.microsoft.com/azure/web-application-firewall/afds/waf-front-door-policy-settings) for further information.\"\n },\n \"name\": \"querytext5\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"resources | where type == 'microsoft.network/frontdoorwebapplicationfirewallpolicies' | project policyName=name, policyId=id,policySku=sku.name, links=properties.securityPolicyLinks, enabledState=properties.policySettings.enabledState, mode=properties.policySettings.mode | mvexpand links | extend securityPolicy=links.id | extend securityPolicyParts=split(securityPolicy, '/') | extend profileId=strcat_array(array_slice(securityPolicyParts, 0, -3), '/') | project id=profileId, compliant=((enabledState=='Enabled') and (mode=='Prevention')), enabledState, mode | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed\",\n \"size\": 4,\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"gridSettings\": {\n \"formatters\": [\n {\n \"columnMatch\": \"id\",\n \"formatter\": 0,\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n {\n \"columnMatch\": \"compliant\",\n \"formatter\": 18,\n \"formatOptions\": {\n \"thresholdsOptions\": \"icons\",\n \"thresholdsGrid\": [\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"1\",\n \"representation\": \"success\",\n \"text\": \"Success\"\n },\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"0\",\n \"representation\": \"failed\",\n \"text\": \"Failed\"\n },\n {\n \"operator\": \"Default\",\n \"thresholdValue\": null,\n \"representation\": \"unknown\",\n \"text\": \"Unknown\"\n }\n ]\n }\n }\n ]\n }\n },\n \"name\": \"query5\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"Disable health probes when there is only one origin in an Azure Front Door origin group. Check [this link](https://learn.microsoft.com/azure/frontdoor/best-practices#disable-health-probes-when-theres-only-one-origin-in-an-origin-group) for further information.\"\n },\n \"name\": \"querytext6\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"cdnresources | where type =~ 'microsoft.cdn/profiles/origingroups/origins' | extend frontDoorId = substring(id, 0, indexof(id, '/origingroups')) | extend originGroupId = substring(id, 0, indexof(id, '/origins')) | join kind=inner (cdnresources | where type =~ 'microsoft.cdn/profiles/origingroups' | extend originGroupName = name | extend hasHealthProbe = isnotnull(properties.healthProbeSettings)) on $left.originGroupId == $right.id | summarize numberOrigins = count() by originGroupId, subscriptionId, frontDoorId, hasHealthProbe, originGroupName | extend compliant = not(numberOrigins == 1 and hasHealthProbe) | project id = frontDoorId, compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed\",\n \"size\": 4,\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"gridSettings\": {\n \"formatters\": [\n {\n \"columnMatch\": \"id\",\n \"formatter\": 0,\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n {\n \"columnMatch\": \"compliant\",\n \"formatter\": 18,\n \"formatOptions\": {\n \"thresholdsOptions\": \"icons\",\n \"thresholdsGrid\": [\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"1\",\n \"representation\": \"success\",\n \"text\": \"Success\"\n },\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"0\",\n \"representation\": \"failed\",\n \"text\": \"Failed\"\n },\n {\n \"operator\": \"Default\",\n \"thresholdValue\": null,\n \"representation\": \"unknown\",\n \"text\": \"Unknown\"\n }\n ]\n }\n }\n ]\n }\n },\n \"name\": \"query6\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"Use HEAD health probes with Azure Front Door, to reduce the traffic that Front Door sends to your application. Check [this link](https://learn.microsoft.com/azure/frontdoor/best-practices#use-head-health-probes) for further information.\"\n },\n \"name\": \"querytext7\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"cdnresources | where type =~ 'microsoft.cdn/profiles/origingroups' | extend frontDoorId = substring(id, 0, indexof(id, '/origingroups/')) | extend compliant = (isnull(properties['healthProbeSettings']['probeRequestType']) or toupper(properties['healthProbeSettings']['probeRequestType']) == 'HEAD') | project compliant, id=frontDoorId | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed\",\n \"size\": 4,\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"gridSettings\": {\n \"formatters\": [\n {\n \"columnMatch\": \"id\",\n \"formatter\": 0,\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n {\n \"columnMatch\": \"compliant\",\n \"formatter\": 18,\n \"formatOptions\": {\n \"thresholdsOptions\": \"icons\",\n \"thresholdsGrid\": [\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"1\",\n \"representation\": \"success\",\n \"text\": \"Success\"\n },\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"0\",\n \"representation\": \"failed\",\n \"text\": \"Failed\"\n },\n {\n \"operator\": \"Default\",\n \"thresholdValue\": null,\n \"representation\": \"unknown\",\n \"text\": \"Unknown\"\n }\n ]\n }\n }\n ]\n }\n },\n \"name\": \"query7\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"Use managed TLS certificates with Azure Front Door. Reduce operational cost and risk of outages due to certificate renewals. Check [this link](https://learn.microsoft.com/azure/frontdoor/best-practices#use-managed-tls-certificates) for further information.\"\n },\n \"name\": \"querytext9\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"cdnresources | where type =~ 'microsoft.cdn/profiles/customdomains' | extend frontDoorId = substring(id, 0, indexof(id, '/customdomains')) | extend compliant = (isnull(properties['tlsSettings']['certificateType']) or tolower(properties['tlsSettings']['certificateType']) =~ 'customercertificate') | project compliant, id = frontDoorId | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed\",\n \"size\": 4,\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"gridSettings\": {\n \"formatters\": [\n {\n \"columnMatch\": \"id\",\n \"formatter\": 0,\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n {\n \"columnMatch\": \"compliant\",\n \"formatter\": 18,\n \"formatOptions\": {\n \"thresholdsOptions\": \"icons\",\n \"thresholdsGrid\": [\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"1\",\n \"representation\": \"success\",\n \"text\": \"Success\"\n },\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"0\",\n \"representation\": \"failed\",\n \"text\": \"Failed\"\n },\n {\n \"operator\": \"Default\",\n \"thresholdValue\": null,\n \"representation\": \"unknown\",\n \"text\": \"Unknown\"\n }\n ]\n }\n }\n ]\n }\n },\n \"name\": \"query9\"\n }\n ]\n },\n \"conditionalVisibility\": {\n \"parameterName\": \"VisibleTab\",\n \"comparison\": \"isEqualTo\",\n \"value\": \"tab2\"\n },\n \"name\": \"tab2\"\n }\n ],\n \"$schema\": \"https://github.com/Microsoft/Application-Insights-Workbooks/blob/master/schema/workbook.json\"\n}", "version": "1.0", "sourceId": "[parameters('workbookSourceId')]", "category": "[parameters('workbookType')]" diff --git a/workbooks/appdelivery_checklist.en_network_workbook.json b/workbooks/appdelivery_checklist.en_network_workbook.json index 3c2bd2e4b..06b49bae3 100644 --- a/workbooks/appdelivery_checklist.en_network_workbook.json +++ b/workbooks/appdelivery_checklist.en_network_workbook.json @@ -70,25 +70,25 @@ "style": "tabs", "links": [ { - "id": "eead62f5-2b5b-412f-8ce9-e444104bb64e", + "id": "a03cc5a8-4699-4b0b-98f2-534e39376fc7", "cellValue": "VisibleTab", "linkTarget": "parameter", - "linkLabel": "Front Door", + "linkLabel": "App Gateway", "subTarget": "tab0", - "preText": "Front Door", + "preText": "App Gateway", "style": "primary" }, { - "id": "ce137d79-b47b-45dc-955b-efdcb38cc867", + "id": "51948f2a-8109-4519-b518-9bdbd3677a9b", "cellValue": "VisibleTab", "linkTarget": "parameter", - "linkLabel": "App Gateway", + "linkLabel": "Front Door", "subTarget": "tab1", - "preText": "App Gateway", + "preText": "Front Door", "style": "primary" }, { - "id": "4d025713-e2bd-40da-ad43-4e01514547f8", + "id": "09e97a7d-c2db-4d87-b154-440f1fad8ed7", "cellValue": "VisibleTab", "linkTarget": "parameter", "linkLabel": "Load Balancer", @@ -109,22 +109,22 @@ { "type": 1, "content": { - "json": "## Front Door" + "json": "## App Gateway" }, "name": "tab0title" }, { "type": 1, "content": { - "json": "Deploy your WAF policy for Front Door in 'Prevention' mode' so that Web Application Firewall takes appropriate action to allow or deny traffic. Check [this link](https://learn.microsoft.com/azure/web-application-firewall/afds/waf-front-door-policy-settings) for further information." + "json": "Ensure you are using Application Gateway v2 SKU. Check [this link](https://learn.microsoft.com/azure/application-gateway/overview-v2) for further information.. [This training](https://learn.microsoft.com/learn/paths/secure-application-delivery/) can help to educate yourself on this." }, - "name": "querytext5" + "name": "querytext0" }, { "type": 3, "content": { "version": "KqlItem/1.0", - "query": "resources | where type == 'microsoft.network/frontdoorwebapplicationfirewallpolicies' | project policyName=name, policyId=id,policySku=sku.name, links=properties.securityPolicyLinks, enabledState=properties.policySettings.enabledState, mode=properties.policySettings.mode | mvexpand links | extend securityPolicy=links.id | extend securityPolicyParts=split(securityPolicy, '/') | extend profileId=strcat_array(array_slice(securityPolicyParts, 0, -3), '/') | project id=profileId, compliant=((enabledState=='Enabled') and (mode=='Prevention')), enabledState, mode | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed", + "query": "resources | where type == 'microsoft.network/applicationgateways' | project id, compliant = properties.sku.name in ('Standard_v2', 'WAF_v2') | project id,compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed", "size": 4, "queryType": 1, "resourceType": "microsoft.resourcegraph/resources", @@ -173,20 +173,20 @@ ] } }, - "name": "query5" + "name": "query0" }, { "type": 1, "content": { - "json": "Disable health probes when there is only one origin in an Azure Front Door origin group. Check [this link](https://learn.microsoft.com/azure/frontdoor/best-practices#disable-health-probes-when-theres-only-one-origin-in-an-origin-group) for further information." + "json": "Your Application Gateways v2 should be deployed in subnets with IP prefixes equal or larger than /24. Check [this link](https://learn.microsoft.com/azure/application-gateway/configuration-infrastructure#size-of-the-subnet) for further information.. [This training](https://learn.microsoft.com/learn/paths/secure-application-delivery/) can help to educate yourself on this." }, - "name": "querytext6" + "name": "querytext2" }, { "type": 3, "content": { "version": "KqlItem/1.0", - "query": "cdnresources | where type =~ 'microsoft.cdn/profiles/origingroups/origins' | extend frontDoorId = substring(id, 0, indexof(id, '/origingroups')) | extend originGroupId = substring(id, 0, indexof(id, '/origins')) | join kind=inner (cdnresources | where type =~ 'microsoft.cdn/profiles/origingroups' | extend originGroupName = name | extend hasHealthProbe = isnotnull(properties.healthProbeSettings)) on $left.originGroupId == $right.id | summarize numberOrigins = count() by originGroupId, subscriptionId, frontDoorId, hasHealthProbe, originGroupName | extend compliant = not(numberOrigins == 1 and hasHealthProbe) | project id = frontDoorId, compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed", + "query": "resources | where type=='microsoft.network/applicationgateways' | extend subnetId = tostring(properties.gatewayIPConfigurations[0].properties.subnet.id) | project id, subnetId | join (resources | where type=='microsoft.network/virtualnetworks' | project id,subnets=properties.subnets | mv-expand subnets | mv-expand subnets.properties.addressPrefixes | project id, subnetId = tostring(subnets.id), prefix1 = subnets.properties.addressPrefix, prefix2 = subnets.properties.addressPrefixes | mv-expand prefix2 | extend prefix = iff(isnotnull(prefix1), prefix1, prefix2) | extend subnetPrefixLength = split(prefix, '/')[1])on subnetId | extend compliant = (subnetPrefixLength <= 24 or subnetPrefixLength == 64) | distinct id,compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed", "size": 4, "queryType": 1, "resourceType": "microsoft.resourcegraph/resources", @@ -235,20 +235,20 @@ ] } }, - "name": "query6" + "name": "query2" }, { "type": 1, "content": { - "json": "Use HEAD health probes with Azure Front Door, to reduce the traffic that Front Door sends to your application. Check [this link](https://learn.microsoft.com/azure/frontdoor/best-practices#use-head-health-probes) for further information." + "json": "Configure autoscaling with a minimum amount of instances of two. Check [this link](https://learn.microsoft.com/azure/application-gateway/application-gateway-autoscaling-zone-redundant) for further information.. [This training](https://learn.microsoft.com/learn/paths/secure-application-delivery/) can help to educate yourself on this." }, - "name": "querytext7" + "name": "querytext3" }, { "type": 3, "content": { "version": "KqlItem/1.0", - "query": "cdnresources | where type =~ 'microsoft.cdn/profiles/origingroups' | extend frontDoorId = substring(id, 0, indexof(id, '/origingroups/')) | extend compliant = (isnull(properties['healthProbeSettings']['probeRequestType']) or toupper(properties['healthProbeSettings']['probeRequestType']) == 'HEAD') | project compliant, id=frontDoorId | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed", + "query": "resources | where type =~ 'microsoft.network/applicationGateways' | extend compliant = (isnotnull(properties.autoscaleConfiguration) and properties.autoscaleConfiguration.minCapacity >= 2) | distinct id,compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed", "size": 4, "queryType": 1, "resourceType": "microsoft.resourcegraph/resources", @@ -297,20 +297,20 @@ ] } }, - "name": "query7" + "name": "query3" }, { "type": 1, "content": { - "json": "Use managed TLS certificates with Azure Front Door. Reduce operational cost and risk of outages due to certificate renewals. Check [this link](https://learn.microsoft.com/azure/frontdoor/best-practices#use-managed-tls-certificates) for further information." + "json": "Deploy Application Gateway across Availability Zones. Check [this link](https://learn.microsoft.com/azure/reliability/migrate-app-gateway-v2) for further information.. [This training](https://learn.microsoft.com/learn/paths/secure-application-delivery/) can help to educate yourself on this." }, - "name": "querytext9" + "name": "querytext4" }, { "type": 3, "content": { "version": "KqlItem/1.0", - "query": "cdnresources | where type =~ 'microsoft.cdn/profiles/customdomains' | extend frontDoorId = substring(id, 0, indexof(id, '/customdomains')) | extend compliant = (isnull(properties['tlsSettings']['certificateType']) or tolower(properties['tlsSettings']['certificateType']) =~ 'customercertificate') | project compliant, id = frontDoorId | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed", + "query": "resources | where type =~ 'microsoft.network/applicationGateways' | extend compliant = (isnotnull(zones) and array_length(zones) > 1) | distinct id,compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed", "size": 4, "queryType": 1, "resourceType": "microsoft.resourcegraph/resources", @@ -359,42 +359,20 @@ ] } }, - "name": "query9" - } - ] - }, - "conditionalVisibility": { - "parameterName": "VisibleTab", - "comparison": "isEqualTo", - "value": "tab0" - }, - "name": "tab0" - }, - { - "type": 12, - "content": { - "version": "NotebookGroup/1.0", - "groupType": "editable", - "items": [ - { - "type": 1, - "content": { - "json": "## App Gateway" - }, - "name": "tab1title" + "name": "query4" }, { "type": 1, "content": { - "json": "Ensure you are using Application Gateway v2 SKU. Check [this link](https://learn.microsoft.com/azure/application-gateway/overview-v2) for further information.. [This training](https://learn.microsoft.com/learn/paths/secure-application-delivery/) can help to educate yourself on this." + "json": "Enable the Azure Application Gateway WAF bot protection rule set. The bot rules detect good and bad bots. Check [this link](https://learn.microsoft.com/azure/web-application-firewall/ag/bot-protection) for further information." }, - "name": "querytext0" + "name": "querytext10" }, { "type": 3, "content": { "version": "KqlItem/1.0", - "query": "resources | where type == 'microsoft.network/applicationgateways' | project id, compliant = properties.sku.name in ('Standard_v2', 'WAF_v2') | project id,compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed", + "query": "resources | where type == 'microsoft.network/applicationgatewaywebapplicationfirewallpolicies' | mv-expand properties.managedRules.managedRuleSets | project id, rulesettype = properties_managedRules_managedRuleSets.ruleSetType | extend compliant1 = (rulesettype == 'Microsoft_BotManagerRuleSet') | project id, compliant1 | summarize compliant = max(compliant1) by id | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed", "size": 4, "queryType": 1, "resourceType": "microsoft.resourcegraph/resources", @@ -443,20 +421,20 @@ ] } }, - "name": "query0" + "name": "query10" }, { "type": 1, "content": { - "json": "Your Application Gateways v2 should be deployed in subnets with IP prefixes equal or larger than /24. Check [this link](https://learn.microsoft.com/azure/application-gateway/configuration-infrastructure#size-of-the-subnet) for further information.. [This training](https://learn.microsoft.com/learn/paths/secure-application-delivery/) can help to educate yourself on this." + "json": "Deploy your WAF policy for Application Gateway in 'Prevention' mode. Check [this link](https://learn.microsoft.com/azure/web-application-firewall/afds/waf-front-door-policy-settings) for further information." }, - "name": "querytext2" + "name": "querytext11" }, { "type": 3, "content": { "version": "KqlItem/1.0", - "query": "resources | where type=='microsoft.network/applicationgateways' | extend subnetId = tostring(properties.gatewayIPConfigurations[0].properties.subnet.id) | project id, subnetId | join (resources | where type=='microsoft.network/virtualnetworks' | project id,subnets=properties.subnets | mv-expand subnets | mv-expand subnets.properties.addressPrefixes | project id, subnetId = tostring(subnets.id), prefix1 = subnets.properties.addressPrefix, prefix2 = subnets.properties.addressPrefixes | mv-expand prefix2 | extend prefix = iff(isnotnull(prefix1), prefix1, prefix2) | extend subnetPrefixLength = split(prefix, '/')[1])on subnetId | extend compliant = (subnetPrefixLength <= 24 or subnetPrefixLength == 64) | distinct id,compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed", + "query": "resources | where type == 'microsoft.network/frontdoorwebapplicationfirewallpolicies' | project policyName=name, policyId=id,policySku=sku.name, links=properties.securityPolicyLinks, enabledState=properties.policySettings.enabledState, mode=properties.policySettings.mode | mvexpand links | extend securityPolicy=links.id | extend securityPolicyParts=split(securityPolicy, '/') | extend profileId=strcat_array(array_slice(securityPolicyParts, 0, -3), '/') | project id=profileId, compliant=((enabledState=='Enabled') and (mode=='Prevention')), enabledState, mode | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed", "size": 4, "queryType": 1, "resourceType": "microsoft.resourcegraph/resources", @@ -505,20 +483,42 @@ ] } }, - "name": "query2" + "name": "query11" + } + ] + }, + "conditionalVisibility": { + "parameterName": "VisibleTab", + "comparison": "isEqualTo", + "value": "tab0" + }, + "name": "tab0" + }, + { + "type": 12, + "content": { + "version": "NotebookGroup/1.0", + "groupType": "editable", + "items": [ + { + "type": 1, + "content": { + "json": "## Front Door" + }, + "name": "tab1title" }, { "type": 1, "content": { - "json": "Configure autoscaling with a minimum amount of instances of two. Check [this link](https://learn.microsoft.com/azure/application-gateway/application-gateway-autoscaling-zone-redundant) for further information.. [This training](https://learn.microsoft.com/learn/paths/secure-application-delivery/) can help to educate yourself on this." + "json": "Deploy your WAF policy for Front Door in 'Prevention' mode' so that Web Application Firewall takes appropriate action to allow or deny traffic. Check [this link](https://learn.microsoft.com/azure/web-application-firewall/afds/waf-front-door-policy-settings) for further information." }, - "name": "querytext3" + "name": "querytext5" }, { "type": 3, "content": { "version": "KqlItem/1.0", - "query": "resources | where type =~ 'microsoft.network/applicationGateways' | extend compliant = (isnotnull(properties.autoscaleConfiguration) and properties.autoscaleConfiguration.minCapacity >= 2) | distinct id,compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed", + "query": "resources | where type == 'microsoft.network/frontdoorwebapplicationfirewallpolicies' | project policyName=name, policyId=id,policySku=sku.name, links=properties.securityPolicyLinks, enabledState=properties.policySettings.enabledState, mode=properties.policySettings.mode | mvexpand links | extend securityPolicy=links.id | extend securityPolicyParts=split(securityPolicy, '/') | extend profileId=strcat_array(array_slice(securityPolicyParts, 0, -3), '/') | project id=profileId, compliant=((enabledState=='Enabled') and (mode=='Prevention')), enabledState, mode | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed", "size": 4, "queryType": 1, "resourceType": "microsoft.resourcegraph/resources", @@ -567,20 +567,20 @@ ] } }, - "name": "query3" + "name": "query5" }, { "type": 1, "content": { - "json": "Deploy Application Gateway across Availability Zones. Check [this link](https://learn.microsoft.com/azure/reliability/migrate-app-gateway-v2) for further information.. [This training](https://learn.microsoft.com/learn/paths/secure-application-delivery/) can help to educate yourself on this." + "json": "Disable health probes when there is only one origin in an Azure Front Door origin group. Check [this link](https://learn.microsoft.com/azure/frontdoor/best-practices#disable-health-probes-when-theres-only-one-origin-in-an-origin-group) for further information." }, - "name": "querytext4" + "name": "querytext6" }, { "type": 3, "content": { "version": "KqlItem/1.0", - "query": "resources | where type =~ 'microsoft.network/applicationGateways' | extend compliant = (isnotnull(zones) and array_length(zones) > 1) | distinct id,compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed", + "query": "cdnresources | where type =~ 'microsoft.cdn/profiles/origingroups/origins' | extend frontDoorId = substring(id, 0, indexof(id, '/origingroups')) | extend originGroupId = substring(id, 0, indexof(id, '/origins')) | join kind=inner (cdnresources | where type =~ 'microsoft.cdn/profiles/origingroups' | extend originGroupName = name | extend hasHealthProbe = isnotnull(properties.healthProbeSettings)) on $left.originGroupId == $right.id | summarize numberOrigins = count() by originGroupId, subscriptionId, frontDoorId, hasHealthProbe, originGroupName | extend compliant = not(numberOrigins == 1 and hasHealthProbe) | project id = frontDoorId, compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed", "size": 4, "queryType": 1, "resourceType": "microsoft.resourcegraph/resources", @@ -629,20 +629,20 @@ ] } }, - "name": "query4" + "name": "query6" }, { "type": 1, "content": { - "json": "Enable the Azure Application Gateway WAF bot protection rule set. The bot rules detect good and bad bots. Check [this link](https://learn.microsoft.com/azure/web-application-firewall/ag/bot-protection) for further information." + "json": "Use HEAD health probes with Azure Front Door, to reduce the traffic that Front Door sends to your application. Check [this link](https://learn.microsoft.com/azure/frontdoor/best-practices#use-head-health-probes) for further information." }, - "name": "querytext10" + "name": "querytext7" }, { "type": 3, "content": { "version": "KqlItem/1.0", - "query": "resources | where type == 'microsoft.network/applicationgatewaywebapplicationfirewallpolicies' | mv-expand properties.managedRules.managedRuleSets | project id, rulesettype = properties_managedRules_managedRuleSets.ruleSetType | extend compliant1 = (rulesettype == 'Microsoft_BotManagerRuleSet') | project id, compliant1 | summarize compliant = max(compliant1) by id | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed", + "query": "cdnresources | where type =~ 'microsoft.cdn/profiles/origingroups' | extend frontDoorId = substring(id, 0, indexof(id, '/origingroups/')) | extend compliant = (isnull(properties['healthProbeSettings']['probeRequestType']) or toupper(properties['healthProbeSettings']['probeRequestType']) == 'HEAD') | project compliant, id=frontDoorId | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed", "size": 4, "queryType": 1, "resourceType": "microsoft.resourcegraph/resources", @@ -691,20 +691,20 @@ ] } }, - "name": "query10" + "name": "query7" }, { "type": 1, "content": { - "json": "Deploy your WAF policy for Application Gateway in 'Prevention' mode. Check [this link](https://learn.microsoft.com/azure/web-application-firewall/afds/waf-front-door-policy-settings) for further information." + "json": "Use managed TLS certificates with Azure Front Door. Reduce operational cost and risk of outages due to certificate renewals. Check [this link](https://learn.microsoft.com/azure/frontdoor/best-practices#use-managed-tls-certificates) for further information." }, - "name": "querytext11" + "name": "querytext9" }, { "type": 3, "content": { "version": "KqlItem/1.0", - "query": "resources | where type == 'microsoft.network/frontdoorwebapplicationfirewallpolicies' | project policyName=name, policyId=id,policySku=sku.name, links=properties.securityPolicyLinks, enabledState=properties.policySettings.enabledState, mode=properties.policySettings.mode | mvexpand links | extend securityPolicy=links.id | extend securityPolicyParts=split(securityPolicy, '/') | extend profileId=strcat_array(array_slice(securityPolicyParts, 0, -3), '/') | project id=profileId, compliant=((enabledState=='Enabled') and (mode=='Prevention')), enabledState, mode | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed", + "query": "cdnresources | where type =~ 'microsoft.cdn/profiles/customdomains' | extend frontDoorId = substring(id, 0, indexof(id, '/customdomains')) | extend compliant = (isnull(properties['tlsSettings']['certificateType']) or tolower(properties['tlsSettings']['certificateType']) =~ 'customercertificate') | project compliant, id = frontDoorId | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed", "size": 4, "queryType": 1, "resourceType": "microsoft.resourcegraph/resources", @@ -753,7 +753,7 @@ ] } }, - "name": "query11" + "name": "query9" } ] }, diff --git a/workbooks/appdelivery_checklist.en_network_workbook_template.json b/workbooks/appdelivery_checklist.en_network_workbook_template.json index 7005f647b..298a00e0f 100644 --- a/workbooks/appdelivery_checklist.en_network_workbook_template.json +++ b/workbooks/appdelivery_checklist.en_network_workbook_template.json @@ -41,7 +41,7 @@ "dependsOn": [], "properties": { "displayName": "[parameters('workbookDisplayName')]", - "serializedData": "{\n \"version\": \"Notebook/1.0\",\n \"items\": [\n {\n \"type\": 9,\n \"content\": {\n \"version\": \"KqlParameterItem/1.0\",\n \"parameters\": [\n {\n \"id\": \"497a107e-dde8-433e-b263-35ac8e8f7834\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Subscription\",\n \"type\": 6,\n \"multiSelect\": true,\n \"quote\": \"'\",\n \"delimiter\": \",\",\n \"typeSettings\": {\n \"additionalResourceOptions\": [\n \"value::all\"\n ],\n \"includeAll\": true,\n \"showDefault\": false\n },\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"value\": [\n \"value::all\"\n ]\n },\n {\n \"id\": \"844e4f4e-df51-4e3c-8eaf-0dc78b92c721\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"OnlyFailed\",\n \"label\": \"Only show failed\",\n \"type\": 2,\n \"typeSettings\": {\n \"additionalResourceOptions\": [],\n \"showDefault\": false\n },\n \"jsonData\": \"[\\r\\n { \\\"value\\\":true, \\\"label\\\":\\\"True\\\" },\\r\\n { \\\"value\\\":false, \\\"label\\\":\\\"False\\\", \\\"selected\\\":true }\\r\\n]\"\n }\n ],\n \"style\": \"pills\",\n \"queryType\": 0,\n \"resourceType\": \"microsoft.operationalinsights/workspaces\"\n },\n \"name\": \"WorkbookSelectors\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"If you set \\\"Only show failed\\\" to \\\"Yes\\\", the different queries will only show items that have failed their compliance checks.\",\n \"style\": \"info\"\n },\n \"name\": \"InfoBox\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"## Azure Application Delivery Networking - Network\\n\\n---\\n\\nThis workbook has been automatically generated out of the checklists in the [Azure Review Checklists repo](https://github.com/Azure/review-checklists). This repo contains best practices and recommendations around generic Landing Zones as well as specific services such as Azure Virtual Desktop, Azure Kubernetes Service or Azure VMware Solution, to name a few. This repository of best practices is curated by Azure engineers, but open to anybody to contribute.\\n\\nIf you see a problem in the queries that are part of this workbook, please open a Github issue [here](https://github.com/Azure/review-checklists/issues/new).\"\n },\n \"customWidth\": \"100\",\n \"name\": \"MarkdownHeader\"\n },\n {\n \"type\": 11,\n \"content\": {\n \"version\": \"LinkItem/1.0\",\n \"style\": \"tabs\",\n \"links\": [\n {\n \"id\": \"eead62f5-2b5b-412f-8ce9-e444104bb64e\",\n \"cellValue\": \"VisibleTab\",\n \"linkTarget\": \"parameter\",\n \"linkLabel\": \"Front Door\",\n \"subTarget\": \"tab0\",\n \"preText\": \"Front Door\",\n \"style\": \"primary\"\n },\n {\n \"id\": \"ce137d79-b47b-45dc-955b-efdcb38cc867\",\n \"cellValue\": \"VisibleTab\",\n \"linkTarget\": \"parameter\",\n \"linkLabel\": \"App Gateway\",\n \"subTarget\": \"tab1\",\n \"preText\": \"App Gateway\",\n \"style\": \"primary\"\n },\n {\n \"id\": \"4d025713-e2bd-40da-ad43-4e01514547f8\",\n \"cellValue\": \"VisibleTab\",\n \"linkTarget\": \"parameter\",\n \"linkLabel\": \"Load Balancer\",\n \"subTarget\": \"tab2\",\n \"preText\": \"Load Balancer\",\n \"style\": \"primary\"\n }\n ]\n },\n \"name\": \"Tabs\"\n },\n {\n \"type\": 12,\n \"content\": {\n \"version\": \"NotebookGroup/1.0\",\n \"groupType\": \"editable\",\n \"items\": [\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"## Front Door\"\n },\n \"name\": \"tab0title\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"Deploy your WAF policy for Front Door in 'Prevention' mode' so that Web Application Firewall takes appropriate action to allow or deny traffic. Check [this link](https://learn.microsoft.com/azure/web-application-firewall/afds/waf-front-door-policy-settings) for further information.\"\n },\n \"name\": \"querytext5\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"resources | where type == 'microsoft.network/frontdoorwebapplicationfirewallpolicies' | project policyName=name, policyId=id,policySku=sku.name, links=properties.securityPolicyLinks, enabledState=properties.policySettings.enabledState, mode=properties.policySettings.mode | mvexpand links | extend securityPolicy=links.id | extend securityPolicyParts=split(securityPolicy, '/') | extend profileId=strcat_array(array_slice(securityPolicyParts, 0, -3), '/') | project id=profileId, compliant=((enabledState=='Enabled') and (mode=='Prevention')), enabledState, mode | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed\",\n \"size\": 4,\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"gridSettings\": {\n \"formatters\": [\n {\n \"columnMatch\": \"id\",\n \"formatter\": 0,\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n {\n \"columnMatch\": \"compliant\",\n \"formatter\": 18,\n \"formatOptions\": {\n \"thresholdsOptions\": \"icons\",\n \"thresholdsGrid\": [\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"1\",\n \"representation\": \"success\",\n \"text\": \"Success\"\n },\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"0\",\n \"representation\": \"failed\",\n \"text\": \"Failed\"\n },\n {\n \"operator\": \"Default\",\n \"thresholdValue\": null,\n \"representation\": \"unknown\",\n \"text\": \"Unknown\"\n }\n ]\n }\n }\n ]\n }\n },\n \"name\": \"query5\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"Disable health probes when there is only one origin in an Azure Front Door origin group. Check [this link](https://learn.microsoft.com/azure/frontdoor/best-practices#disable-health-probes-when-theres-only-one-origin-in-an-origin-group) for further information.\"\n },\n \"name\": \"querytext6\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"cdnresources | where type =~ 'microsoft.cdn/profiles/origingroups/origins' | extend frontDoorId = substring(id, 0, indexof(id, '/origingroups')) | extend originGroupId = substring(id, 0, indexof(id, '/origins')) | join kind=inner (cdnresources | where type =~ 'microsoft.cdn/profiles/origingroups' | extend originGroupName = name | extend hasHealthProbe = isnotnull(properties.healthProbeSettings)) on $left.originGroupId == $right.id | summarize numberOrigins = count() by originGroupId, subscriptionId, frontDoorId, hasHealthProbe, originGroupName | extend compliant = not(numberOrigins == 1 and hasHealthProbe) | project id = frontDoorId, compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed\",\n \"size\": 4,\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"gridSettings\": {\n \"formatters\": [\n {\n \"columnMatch\": \"id\",\n \"formatter\": 0,\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n {\n \"columnMatch\": \"compliant\",\n \"formatter\": 18,\n \"formatOptions\": {\n \"thresholdsOptions\": \"icons\",\n \"thresholdsGrid\": [\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"1\",\n \"representation\": \"success\",\n \"text\": \"Success\"\n },\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"0\",\n \"representation\": \"failed\",\n \"text\": \"Failed\"\n },\n {\n \"operator\": \"Default\",\n \"thresholdValue\": null,\n \"representation\": \"unknown\",\n \"text\": \"Unknown\"\n }\n ]\n }\n }\n ]\n }\n },\n \"name\": \"query6\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"Use HEAD health probes with Azure Front Door, to reduce the traffic that Front Door sends to your application. Check [this link](https://learn.microsoft.com/azure/frontdoor/best-practices#use-head-health-probes) for further information.\"\n },\n \"name\": \"querytext7\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"cdnresources | where type =~ 'microsoft.cdn/profiles/origingroups' | extend frontDoorId = substring(id, 0, indexof(id, '/origingroups/')) | extend compliant = (isnull(properties['healthProbeSettings']['probeRequestType']) or toupper(properties['healthProbeSettings']['probeRequestType']) == 'HEAD') | project compliant, id=frontDoorId | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed\",\n \"size\": 4,\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"gridSettings\": {\n \"formatters\": [\n {\n \"columnMatch\": \"id\",\n \"formatter\": 0,\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n {\n \"columnMatch\": \"compliant\",\n \"formatter\": 18,\n \"formatOptions\": {\n \"thresholdsOptions\": \"icons\",\n \"thresholdsGrid\": [\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"1\",\n \"representation\": \"success\",\n \"text\": \"Success\"\n },\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"0\",\n \"representation\": \"failed\",\n \"text\": \"Failed\"\n },\n {\n \"operator\": \"Default\",\n \"thresholdValue\": null,\n \"representation\": \"unknown\",\n \"text\": \"Unknown\"\n }\n ]\n }\n }\n ]\n }\n },\n \"name\": \"query7\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"Use managed TLS certificates with Azure Front Door. Reduce operational cost and risk of outages due to certificate renewals. Check [this link](https://learn.microsoft.com/azure/frontdoor/best-practices#use-managed-tls-certificates) for further information.\"\n },\n \"name\": \"querytext9\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"cdnresources | where type =~ 'microsoft.cdn/profiles/customdomains' | extend frontDoorId = substring(id, 0, indexof(id, '/customdomains')) | extend compliant = (isnull(properties['tlsSettings']['certificateType']) or tolower(properties['tlsSettings']['certificateType']) =~ 'customercertificate') | project compliant, id = frontDoorId | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed\",\n \"size\": 4,\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"gridSettings\": {\n \"formatters\": [\n {\n \"columnMatch\": \"id\",\n \"formatter\": 0,\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n {\n \"columnMatch\": \"compliant\",\n \"formatter\": 18,\n \"formatOptions\": {\n \"thresholdsOptions\": \"icons\",\n \"thresholdsGrid\": [\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"1\",\n \"representation\": \"success\",\n \"text\": \"Success\"\n },\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"0\",\n \"representation\": \"failed\",\n \"text\": \"Failed\"\n },\n {\n \"operator\": \"Default\",\n \"thresholdValue\": null,\n \"representation\": \"unknown\",\n \"text\": \"Unknown\"\n }\n ]\n }\n }\n ]\n }\n },\n \"name\": \"query9\"\n }\n ]\n },\n \"conditionalVisibility\": {\n \"parameterName\": \"VisibleTab\",\n \"comparison\": \"isEqualTo\",\n \"value\": \"tab0\"\n },\n \"name\": \"tab0\"\n },\n {\n \"type\": 12,\n \"content\": {\n \"version\": \"NotebookGroup/1.0\",\n \"groupType\": \"editable\",\n \"items\": [\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"## App Gateway\"\n },\n \"name\": \"tab1title\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"Ensure you are using Application Gateway v2 SKU. Check [this link](https://learn.microsoft.com/azure/application-gateway/overview-v2) for further information.. [This training](https://learn.microsoft.com/learn/paths/secure-application-delivery/) can help to educate yourself on this.\"\n },\n \"name\": \"querytext0\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"resources | where type == 'microsoft.network/applicationgateways' | project id, compliant = properties.sku.name in ('Standard_v2', 'WAF_v2') | project id,compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed\",\n \"size\": 4,\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"gridSettings\": {\n \"formatters\": [\n {\n \"columnMatch\": \"id\",\n \"formatter\": 0,\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n {\n \"columnMatch\": \"compliant\",\n \"formatter\": 18,\n \"formatOptions\": {\n \"thresholdsOptions\": \"icons\",\n \"thresholdsGrid\": [\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"1\",\n \"representation\": \"success\",\n \"text\": \"Success\"\n },\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"0\",\n \"representation\": \"failed\",\n \"text\": \"Failed\"\n },\n {\n \"operator\": \"Default\",\n \"thresholdValue\": null,\n \"representation\": \"unknown\",\n \"text\": \"Unknown\"\n }\n ]\n }\n }\n ]\n }\n },\n \"name\": \"query0\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"Your Application Gateways v2 should be deployed in subnets with IP prefixes equal or larger than /24. Check [this link](https://learn.microsoft.com/azure/application-gateway/configuration-infrastructure#size-of-the-subnet) for further information.. [This training](https://learn.microsoft.com/learn/paths/secure-application-delivery/) can help to educate yourself on this.\"\n },\n \"name\": \"querytext2\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"resources | where type=='microsoft.network/applicationgateways' | extend subnetId = tostring(properties.gatewayIPConfigurations[0].properties.subnet.id) | project id, subnetId | join (resources | where type=='microsoft.network/virtualnetworks' | project id,subnets=properties.subnets | mv-expand subnets | mv-expand subnets.properties.addressPrefixes | project id, subnetId = tostring(subnets.id), prefix1 = subnets.properties.addressPrefix, prefix2 = subnets.properties.addressPrefixes | mv-expand prefix2 | extend prefix = iff(isnotnull(prefix1), prefix1, prefix2) | extend subnetPrefixLength = split(prefix, '/')[1])on subnetId | extend compliant = (subnetPrefixLength <= 24 or subnetPrefixLength == 64) | distinct id,compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed\",\n \"size\": 4,\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"gridSettings\": {\n \"formatters\": [\n {\n \"columnMatch\": \"id\",\n \"formatter\": 0,\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n {\n \"columnMatch\": \"compliant\",\n \"formatter\": 18,\n \"formatOptions\": {\n \"thresholdsOptions\": \"icons\",\n \"thresholdsGrid\": [\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"1\",\n \"representation\": \"success\",\n \"text\": \"Success\"\n },\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"0\",\n \"representation\": \"failed\",\n \"text\": \"Failed\"\n },\n {\n \"operator\": \"Default\",\n \"thresholdValue\": null,\n \"representation\": \"unknown\",\n \"text\": \"Unknown\"\n }\n ]\n }\n }\n ]\n }\n },\n \"name\": \"query2\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"Configure autoscaling with a minimum amount of instances of two. Check [this link](https://learn.microsoft.com/azure/application-gateway/application-gateway-autoscaling-zone-redundant) for further information.. [This training](https://learn.microsoft.com/learn/paths/secure-application-delivery/) can help to educate yourself on this.\"\n },\n \"name\": \"querytext3\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"resources | where type =~ 'microsoft.network/applicationGateways' | extend compliant = (isnotnull(properties.autoscaleConfiguration) and properties.autoscaleConfiguration.minCapacity >= 2) | distinct id,compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed\",\n \"size\": 4,\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"gridSettings\": {\n \"formatters\": [\n {\n \"columnMatch\": \"id\",\n \"formatter\": 0,\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n {\n \"columnMatch\": \"compliant\",\n \"formatter\": 18,\n \"formatOptions\": {\n \"thresholdsOptions\": \"icons\",\n \"thresholdsGrid\": [\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"1\",\n \"representation\": \"success\",\n \"text\": \"Success\"\n },\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"0\",\n \"representation\": \"failed\",\n \"text\": \"Failed\"\n },\n {\n \"operator\": \"Default\",\n \"thresholdValue\": null,\n \"representation\": \"unknown\",\n \"text\": \"Unknown\"\n }\n ]\n }\n }\n ]\n }\n },\n \"name\": \"query3\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"Deploy Application Gateway across Availability Zones. Check [this link](https://learn.microsoft.com/azure/reliability/migrate-app-gateway-v2) for further information.. [This training](https://learn.microsoft.com/learn/paths/secure-application-delivery/) can help to educate yourself on this.\"\n },\n \"name\": \"querytext4\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"resources | where type =~ 'microsoft.network/applicationGateways' | extend compliant = (isnotnull(zones) and array_length(zones) > 1) | distinct id,compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed\",\n \"size\": 4,\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"gridSettings\": {\n \"formatters\": [\n {\n \"columnMatch\": \"id\",\n \"formatter\": 0,\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n {\n \"columnMatch\": \"compliant\",\n \"formatter\": 18,\n \"formatOptions\": {\n \"thresholdsOptions\": \"icons\",\n \"thresholdsGrid\": [\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"1\",\n \"representation\": \"success\",\n \"text\": \"Success\"\n },\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"0\",\n \"representation\": \"failed\",\n \"text\": \"Failed\"\n },\n {\n \"operator\": \"Default\",\n \"thresholdValue\": null,\n \"representation\": \"unknown\",\n \"text\": \"Unknown\"\n }\n ]\n }\n }\n ]\n }\n },\n \"name\": \"query4\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"Enable the Azure Application Gateway WAF bot protection rule set. The bot rules detect good and bad bots. Check [this link](https://learn.microsoft.com/azure/web-application-firewall/ag/bot-protection) for further information.\"\n },\n \"name\": \"querytext10\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"resources | where type == 'microsoft.network/applicationgatewaywebapplicationfirewallpolicies' | mv-expand properties.managedRules.managedRuleSets | project id, rulesettype = properties_managedRules_managedRuleSets.ruleSetType | extend compliant1 = (rulesettype == 'Microsoft_BotManagerRuleSet') | project id, compliant1 | summarize compliant = max(compliant1) by id | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed\",\n \"size\": 4,\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"gridSettings\": {\n \"formatters\": [\n {\n \"columnMatch\": \"id\",\n \"formatter\": 0,\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n {\n \"columnMatch\": \"compliant\",\n \"formatter\": 18,\n \"formatOptions\": {\n \"thresholdsOptions\": \"icons\",\n \"thresholdsGrid\": [\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"1\",\n \"representation\": \"success\",\n \"text\": \"Success\"\n },\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"0\",\n \"representation\": \"failed\",\n \"text\": \"Failed\"\n },\n {\n \"operator\": \"Default\",\n \"thresholdValue\": null,\n \"representation\": \"unknown\",\n \"text\": \"Unknown\"\n }\n ]\n }\n }\n ]\n }\n },\n \"name\": \"query10\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"Deploy your WAF policy for Application Gateway in 'Prevention' mode. Check [this link](https://learn.microsoft.com/azure/web-application-firewall/afds/waf-front-door-policy-settings) for further information.\"\n },\n \"name\": \"querytext11\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"resources | where type == 'microsoft.network/frontdoorwebapplicationfirewallpolicies' | project policyName=name, policyId=id,policySku=sku.name, links=properties.securityPolicyLinks, enabledState=properties.policySettings.enabledState, mode=properties.policySettings.mode | mvexpand links | extend securityPolicy=links.id | extend securityPolicyParts=split(securityPolicy, '/') | extend profileId=strcat_array(array_slice(securityPolicyParts, 0, -3), '/') | project id=profileId, compliant=((enabledState=='Enabled') and (mode=='Prevention')), enabledState, mode | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed\",\n \"size\": 4,\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"gridSettings\": {\n \"formatters\": [\n {\n \"columnMatch\": \"id\",\n \"formatter\": 0,\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n {\n \"columnMatch\": \"compliant\",\n \"formatter\": 18,\n \"formatOptions\": {\n \"thresholdsOptions\": \"icons\",\n \"thresholdsGrid\": [\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"1\",\n \"representation\": \"success\",\n \"text\": \"Success\"\n },\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"0\",\n \"representation\": \"failed\",\n \"text\": \"Failed\"\n },\n {\n \"operator\": \"Default\",\n \"thresholdValue\": null,\n \"representation\": \"unknown\",\n \"text\": \"Unknown\"\n }\n ]\n }\n }\n ]\n }\n },\n \"name\": \"query11\"\n }\n ]\n },\n \"conditionalVisibility\": {\n \"parameterName\": \"VisibleTab\",\n \"comparison\": \"isEqualTo\",\n \"value\": \"tab1\"\n },\n \"name\": \"tab1\"\n },\n {\n \"type\": 12,\n \"content\": {\n \"version\": \"NotebookGroup/1.0\",\n \"groupType\": \"editable\",\n \"items\": [\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"## Load Balancer\"\n },\n \"name\": \"tab2title\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"Ensure you are using the Standard SKU for your Azure Load Balancers. Check [this link](https://learn.microsoft.com/azure/load-balancer/load-balancer-overview) for further information.\"\n },\n \"name\": \"querytext1\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"resources | where type == 'microsoft.network/loadbalancers' | project id, compliant=(tolower(sku.name) == 'standard') | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed\",\n \"size\": 4,\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"gridSettings\": {\n \"formatters\": [\n {\n \"columnMatch\": \"id\",\n \"formatter\": 0,\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n {\n \"columnMatch\": \"compliant\",\n \"formatter\": 18,\n \"formatOptions\": {\n \"thresholdsOptions\": \"icons\",\n \"thresholdsGrid\": [\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"1\",\n \"representation\": \"success\",\n \"text\": \"Success\"\n },\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"0\",\n \"representation\": \"failed\",\n \"text\": \"Failed\"\n },\n {\n \"operator\": \"Default\",\n \"thresholdValue\": null,\n \"representation\": \"unknown\",\n \"text\": \"Unknown\"\n }\n ]\n }\n }\n ]\n }\n },\n \"name\": \"query1\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"Use Azure NAT Gateway instead of Load Balancer outbound rules for better SNAT scalability. Check [this link](https://learn.microsoft.com/azure/nat-gateway/nat-overview#outbound-connectivity) for further information.\"\n },\n \"name\": \"querytext8\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"resources | where type=='microsoft.network/loadbalancers' | extend countOutRules=array_length(properties.outboundRules) | extend compliant = (countOutRules == 0) | distinct id,compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed\",\n \"size\": 4,\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"gridSettings\": {\n \"formatters\": [\n {\n \"columnMatch\": \"id\",\n \"formatter\": 0,\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n {\n \"columnMatch\": \"compliant\",\n \"formatter\": 18,\n \"formatOptions\": {\n \"thresholdsOptions\": \"icons\",\n \"thresholdsGrid\": [\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"1\",\n \"representation\": \"success\",\n \"text\": \"Success\"\n },\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"0\",\n \"representation\": \"failed\",\n \"text\": \"Failed\"\n },\n {\n \"operator\": \"Default\",\n \"thresholdValue\": null,\n \"representation\": \"unknown\",\n \"text\": \"Unknown\"\n }\n ]\n }\n }\n ]\n }\n },\n \"name\": \"query8\"\n }\n ]\n },\n \"conditionalVisibility\": {\n \"parameterName\": \"VisibleTab\",\n \"comparison\": \"isEqualTo\",\n \"value\": \"tab2\"\n },\n \"name\": \"tab2\"\n }\n ],\n \"$schema\": \"https://github.com/Microsoft/Application-Insights-Workbooks/blob/master/schema/workbook.json\"\n}", + "serializedData": "{\n \"version\": \"Notebook/1.0\",\n \"items\": [\n {\n \"type\": 9,\n \"content\": {\n \"version\": \"KqlParameterItem/1.0\",\n \"parameters\": [\n {\n \"id\": \"497a107e-dde8-433e-b263-35ac8e8f7834\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Subscription\",\n \"type\": 6,\n \"multiSelect\": true,\n \"quote\": \"'\",\n \"delimiter\": \",\",\n \"typeSettings\": {\n \"additionalResourceOptions\": [\n \"value::all\"\n ],\n \"includeAll\": true,\n \"showDefault\": false\n },\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"value\": [\n \"value::all\"\n ]\n },\n {\n \"id\": \"844e4f4e-df51-4e3c-8eaf-0dc78b92c721\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"OnlyFailed\",\n \"label\": \"Only show failed\",\n \"type\": 2,\n \"typeSettings\": {\n \"additionalResourceOptions\": [],\n \"showDefault\": false\n },\n \"jsonData\": \"[\\r\\n { \\\"value\\\":true, \\\"label\\\":\\\"True\\\" },\\r\\n { \\\"value\\\":false, \\\"label\\\":\\\"False\\\", \\\"selected\\\":true }\\r\\n]\"\n }\n ],\n \"style\": \"pills\",\n \"queryType\": 0,\n \"resourceType\": \"microsoft.operationalinsights/workspaces\"\n },\n \"name\": \"WorkbookSelectors\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"If you set \\\"Only show failed\\\" to \\\"Yes\\\", the different queries will only show items that have failed their compliance checks.\",\n \"style\": \"info\"\n },\n \"name\": \"InfoBox\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"## Azure Application Delivery Networking - Network\\n\\n---\\n\\nThis workbook has been automatically generated out of the checklists in the [Azure Review Checklists repo](https://github.com/Azure/review-checklists). This repo contains best practices and recommendations around generic Landing Zones as well as specific services such as Azure Virtual Desktop, Azure Kubernetes Service or Azure VMware Solution, to name a few. This repository of best practices is curated by Azure engineers, but open to anybody to contribute.\\n\\nIf you see a problem in the queries that are part of this workbook, please open a Github issue [here](https://github.com/Azure/review-checklists/issues/new).\"\n },\n \"customWidth\": \"100\",\n \"name\": \"MarkdownHeader\"\n },\n {\n \"type\": 11,\n \"content\": {\n \"version\": \"LinkItem/1.0\",\n \"style\": \"tabs\",\n \"links\": [\n {\n \"id\": \"a03cc5a8-4699-4b0b-98f2-534e39376fc7\",\n \"cellValue\": \"VisibleTab\",\n \"linkTarget\": \"parameter\",\n \"linkLabel\": \"App Gateway\",\n \"subTarget\": \"tab0\",\n \"preText\": \"App Gateway\",\n \"style\": \"primary\"\n },\n {\n \"id\": \"51948f2a-8109-4519-b518-9bdbd3677a9b\",\n \"cellValue\": \"VisibleTab\",\n \"linkTarget\": \"parameter\",\n \"linkLabel\": \"Front Door\",\n \"subTarget\": \"tab1\",\n \"preText\": \"Front Door\",\n \"style\": \"primary\"\n },\n {\n \"id\": \"09e97a7d-c2db-4d87-b154-440f1fad8ed7\",\n \"cellValue\": \"VisibleTab\",\n \"linkTarget\": \"parameter\",\n \"linkLabel\": \"Load Balancer\",\n \"subTarget\": \"tab2\",\n \"preText\": \"Load Balancer\",\n \"style\": \"primary\"\n }\n ]\n },\n \"name\": \"Tabs\"\n },\n {\n \"type\": 12,\n \"content\": {\n \"version\": \"NotebookGroup/1.0\",\n \"groupType\": \"editable\",\n \"items\": [\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"## App Gateway\"\n },\n \"name\": \"tab0title\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"Ensure you are using Application Gateway v2 SKU. Check [this link](https://learn.microsoft.com/azure/application-gateway/overview-v2) for further information.. [This training](https://learn.microsoft.com/learn/paths/secure-application-delivery/) can help to educate yourself on this.\"\n },\n \"name\": \"querytext0\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"resources | where type == 'microsoft.network/applicationgateways' | project id, compliant = properties.sku.name in ('Standard_v2', 'WAF_v2') | project id,compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed\",\n \"size\": 4,\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"gridSettings\": {\n \"formatters\": [\n {\n \"columnMatch\": \"id\",\n \"formatter\": 0,\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n {\n \"columnMatch\": \"compliant\",\n \"formatter\": 18,\n \"formatOptions\": {\n \"thresholdsOptions\": \"icons\",\n \"thresholdsGrid\": [\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"1\",\n \"representation\": \"success\",\n \"text\": \"Success\"\n },\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"0\",\n \"representation\": \"failed\",\n \"text\": \"Failed\"\n },\n {\n \"operator\": \"Default\",\n \"thresholdValue\": null,\n \"representation\": \"unknown\",\n \"text\": \"Unknown\"\n }\n ]\n }\n }\n ]\n }\n },\n \"name\": \"query0\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"Your Application Gateways v2 should be deployed in subnets with IP prefixes equal or larger than /24. Check [this link](https://learn.microsoft.com/azure/application-gateway/configuration-infrastructure#size-of-the-subnet) for further information.. [This training](https://learn.microsoft.com/learn/paths/secure-application-delivery/) can help to educate yourself on this.\"\n },\n \"name\": \"querytext2\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"resources | where type=='microsoft.network/applicationgateways' | extend subnetId = tostring(properties.gatewayIPConfigurations[0].properties.subnet.id) | project id, subnetId | join (resources | where type=='microsoft.network/virtualnetworks' | project id,subnets=properties.subnets | mv-expand subnets | mv-expand subnets.properties.addressPrefixes | project id, subnetId = tostring(subnets.id), prefix1 = subnets.properties.addressPrefix, prefix2 = subnets.properties.addressPrefixes | mv-expand prefix2 | extend prefix = iff(isnotnull(prefix1), prefix1, prefix2) | extend subnetPrefixLength = split(prefix, '/')[1])on subnetId | extend compliant = (subnetPrefixLength <= 24 or subnetPrefixLength == 64) | distinct id,compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed\",\n \"size\": 4,\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"gridSettings\": {\n \"formatters\": [\n {\n \"columnMatch\": \"id\",\n \"formatter\": 0,\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n {\n \"columnMatch\": \"compliant\",\n \"formatter\": 18,\n \"formatOptions\": {\n \"thresholdsOptions\": \"icons\",\n \"thresholdsGrid\": [\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"1\",\n \"representation\": \"success\",\n \"text\": \"Success\"\n },\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"0\",\n \"representation\": \"failed\",\n \"text\": \"Failed\"\n },\n {\n \"operator\": \"Default\",\n \"thresholdValue\": null,\n \"representation\": \"unknown\",\n \"text\": \"Unknown\"\n }\n ]\n }\n }\n ]\n }\n },\n \"name\": \"query2\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"Configure autoscaling with a minimum amount of instances of two. Check [this link](https://learn.microsoft.com/azure/application-gateway/application-gateway-autoscaling-zone-redundant) for further information.. [This training](https://learn.microsoft.com/learn/paths/secure-application-delivery/) can help to educate yourself on this.\"\n },\n \"name\": \"querytext3\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"resources | where type =~ 'microsoft.network/applicationGateways' | extend compliant = (isnotnull(properties.autoscaleConfiguration) and properties.autoscaleConfiguration.minCapacity >= 2) | distinct id,compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed\",\n \"size\": 4,\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"gridSettings\": {\n \"formatters\": [\n {\n \"columnMatch\": \"id\",\n \"formatter\": 0,\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n {\n \"columnMatch\": \"compliant\",\n \"formatter\": 18,\n \"formatOptions\": {\n \"thresholdsOptions\": \"icons\",\n \"thresholdsGrid\": [\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"1\",\n \"representation\": \"success\",\n \"text\": \"Success\"\n },\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"0\",\n \"representation\": \"failed\",\n \"text\": \"Failed\"\n },\n {\n \"operator\": \"Default\",\n \"thresholdValue\": null,\n \"representation\": \"unknown\",\n \"text\": \"Unknown\"\n }\n ]\n }\n }\n ]\n }\n },\n \"name\": \"query3\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"Deploy Application Gateway across Availability Zones. Check [this link](https://learn.microsoft.com/azure/reliability/migrate-app-gateway-v2) for further information.. [This training](https://learn.microsoft.com/learn/paths/secure-application-delivery/) can help to educate yourself on this.\"\n },\n \"name\": \"querytext4\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"resources | where type =~ 'microsoft.network/applicationGateways' | extend compliant = (isnotnull(zones) and array_length(zones) > 1) | distinct id,compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed\",\n \"size\": 4,\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"gridSettings\": {\n \"formatters\": [\n {\n \"columnMatch\": \"id\",\n \"formatter\": 0,\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n {\n \"columnMatch\": \"compliant\",\n \"formatter\": 18,\n \"formatOptions\": {\n \"thresholdsOptions\": \"icons\",\n \"thresholdsGrid\": [\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"1\",\n \"representation\": \"success\",\n \"text\": \"Success\"\n },\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"0\",\n \"representation\": \"failed\",\n \"text\": \"Failed\"\n },\n {\n \"operator\": \"Default\",\n \"thresholdValue\": null,\n \"representation\": \"unknown\",\n \"text\": \"Unknown\"\n }\n ]\n }\n }\n ]\n }\n },\n \"name\": \"query4\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"Enable the Azure Application Gateway WAF bot protection rule set. The bot rules detect good and bad bots. Check [this link](https://learn.microsoft.com/azure/web-application-firewall/ag/bot-protection) for further information.\"\n },\n \"name\": \"querytext10\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"resources | where type == 'microsoft.network/applicationgatewaywebapplicationfirewallpolicies' | mv-expand properties.managedRules.managedRuleSets | project id, rulesettype = properties_managedRules_managedRuleSets.ruleSetType | extend compliant1 = (rulesettype == 'Microsoft_BotManagerRuleSet') | project id, compliant1 | summarize compliant = max(compliant1) by id | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed\",\n \"size\": 4,\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"gridSettings\": {\n \"formatters\": [\n {\n \"columnMatch\": \"id\",\n \"formatter\": 0,\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n {\n \"columnMatch\": \"compliant\",\n \"formatter\": 18,\n \"formatOptions\": {\n \"thresholdsOptions\": \"icons\",\n \"thresholdsGrid\": [\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"1\",\n \"representation\": \"success\",\n \"text\": \"Success\"\n },\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"0\",\n \"representation\": \"failed\",\n \"text\": \"Failed\"\n },\n {\n \"operator\": \"Default\",\n \"thresholdValue\": null,\n \"representation\": \"unknown\",\n \"text\": \"Unknown\"\n }\n ]\n }\n }\n ]\n }\n },\n \"name\": \"query10\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"Deploy your WAF policy for Application Gateway in 'Prevention' mode. Check [this link](https://learn.microsoft.com/azure/web-application-firewall/afds/waf-front-door-policy-settings) for further information.\"\n },\n \"name\": \"querytext11\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"resources | where type == 'microsoft.network/frontdoorwebapplicationfirewallpolicies' | project policyName=name, policyId=id,policySku=sku.name, links=properties.securityPolicyLinks, enabledState=properties.policySettings.enabledState, mode=properties.policySettings.mode | mvexpand links | extend securityPolicy=links.id | extend securityPolicyParts=split(securityPolicy, '/') | extend profileId=strcat_array(array_slice(securityPolicyParts, 0, -3), '/') | project id=profileId, compliant=((enabledState=='Enabled') and (mode=='Prevention')), enabledState, mode | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed\",\n \"size\": 4,\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"gridSettings\": {\n \"formatters\": [\n {\n \"columnMatch\": \"id\",\n \"formatter\": 0,\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n {\n \"columnMatch\": \"compliant\",\n \"formatter\": 18,\n \"formatOptions\": {\n \"thresholdsOptions\": \"icons\",\n \"thresholdsGrid\": [\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"1\",\n \"representation\": \"success\",\n \"text\": \"Success\"\n },\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"0\",\n \"representation\": \"failed\",\n \"text\": \"Failed\"\n },\n {\n \"operator\": \"Default\",\n \"thresholdValue\": null,\n \"representation\": \"unknown\",\n \"text\": \"Unknown\"\n }\n ]\n }\n }\n ]\n }\n },\n \"name\": \"query11\"\n }\n ]\n },\n \"conditionalVisibility\": {\n \"parameterName\": \"VisibleTab\",\n \"comparison\": \"isEqualTo\",\n \"value\": \"tab0\"\n },\n \"name\": \"tab0\"\n },\n {\n \"type\": 12,\n \"content\": {\n \"version\": \"NotebookGroup/1.0\",\n \"groupType\": \"editable\",\n \"items\": [\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"## Front Door\"\n },\n \"name\": \"tab1title\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"Deploy your WAF policy for Front Door in 'Prevention' mode' so that Web Application Firewall takes appropriate action to allow or deny traffic. Check [this link](https://learn.microsoft.com/azure/web-application-firewall/afds/waf-front-door-policy-settings) for further information.\"\n },\n \"name\": \"querytext5\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"resources | where type == 'microsoft.network/frontdoorwebapplicationfirewallpolicies' | project policyName=name, policyId=id,policySku=sku.name, links=properties.securityPolicyLinks, enabledState=properties.policySettings.enabledState, mode=properties.policySettings.mode | mvexpand links | extend securityPolicy=links.id | extend securityPolicyParts=split(securityPolicy, '/') | extend profileId=strcat_array(array_slice(securityPolicyParts, 0, -3), '/') | project id=profileId, compliant=((enabledState=='Enabled') and (mode=='Prevention')), enabledState, mode | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed\",\n \"size\": 4,\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"gridSettings\": {\n \"formatters\": [\n {\n \"columnMatch\": \"id\",\n \"formatter\": 0,\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n {\n \"columnMatch\": \"compliant\",\n \"formatter\": 18,\n \"formatOptions\": {\n \"thresholdsOptions\": \"icons\",\n \"thresholdsGrid\": [\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"1\",\n \"representation\": \"success\",\n \"text\": \"Success\"\n },\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"0\",\n \"representation\": \"failed\",\n \"text\": \"Failed\"\n },\n {\n \"operator\": \"Default\",\n \"thresholdValue\": null,\n \"representation\": \"unknown\",\n \"text\": \"Unknown\"\n }\n ]\n }\n }\n ]\n }\n },\n \"name\": \"query5\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"Disable health probes when there is only one origin in an Azure Front Door origin group. Check [this link](https://learn.microsoft.com/azure/frontdoor/best-practices#disable-health-probes-when-theres-only-one-origin-in-an-origin-group) for further information.\"\n },\n \"name\": \"querytext6\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"cdnresources | where type =~ 'microsoft.cdn/profiles/origingroups/origins' | extend frontDoorId = substring(id, 0, indexof(id, '/origingroups')) | extend originGroupId = substring(id, 0, indexof(id, '/origins')) | join kind=inner (cdnresources | where type =~ 'microsoft.cdn/profiles/origingroups' | extend originGroupName = name | extend hasHealthProbe = isnotnull(properties.healthProbeSettings)) on $left.originGroupId == $right.id | summarize numberOrigins = count() by originGroupId, subscriptionId, frontDoorId, hasHealthProbe, originGroupName | extend compliant = not(numberOrigins == 1 and hasHealthProbe) | project id = frontDoorId, compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed\",\n \"size\": 4,\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"gridSettings\": {\n \"formatters\": [\n {\n \"columnMatch\": \"id\",\n \"formatter\": 0,\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n {\n \"columnMatch\": \"compliant\",\n \"formatter\": 18,\n \"formatOptions\": {\n \"thresholdsOptions\": \"icons\",\n \"thresholdsGrid\": [\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"1\",\n \"representation\": \"success\",\n \"text\": \"Success\"\n },\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"0\",\n \"representation\": \"failed\",\n \"text\": \"Failed\"\n },\n {\n \"operator\": \"Default\",\n \"thresholdValue\": null,\n \"representation\": \"unknown\",\n \"text\": \"Unknown\"\n }\n ]\n }\n }\n ]\n }\n },\n \"name\": \"query6\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"Use HEAD health probes with Azure Front Door, to reduce the traffic that Front Door sends to your application. Check [this link](https://learn.microsoft.com/azure/frontdoor/best-practices#use-head-health-probes) for further information.\"\n },\n \"name\": \"querytext7\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"cdnresources | where type =~ 'microsoft.cdn/profiles/origingroups' | extend frontDoorId = substring(id, 0, indexof(id, '/origingroups/')) | extend compliant = (isnull(properties['healthProbeSettings']['probeRequestType']) or toupper(properties['healthProbeSettings']['probeRequestType']) == 'HEAD') | project compliant, id=frontDoorId | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed\",\n \"size\": 4,\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"gridSettings\": {\n \"formatters\": [\n {\n \"columnMatch\": \"id\",\n \"formatter\": 0,\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n {\n \"columnMatch\": \"compliant\",\n \"formatter\": 18,\n \"formatOptions\": {\n \"thresholdsOptions\": \"icons\",\n \"thresholdsGrid\": [\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"1\",\n \"representation\": \"success\",\n \"text\": \"Success\"\n },\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"0\",\n \"representation\": \"failed\",\n \"text\": \"Failed\"\n },\n {\n \"operator\": \"Default\",\n \"thresholdValue\": null,\n \"representation\": \"unknown\",\n \"text\": \"Unknown\"\n }\n ]\n }\n }\n ]\n }\n },\n \"name\": \"query7\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"Use managed TLS certificates with Azure Front Door. Reduce operational cost and risk of outages due to certificate renewals. Check [this link](https://learn.microsoft.com/azure/frontdoor/best-practices#use-managed-tls-certificates) for further information.\"\n },\n \"name\": \"querytext9\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"cdnresources | where type =~ 'microsoft.cdn/profiles/customdomains' | extend frontDoorId = substring(id, 0, indexof(id, '/customdomains')) | extend compliant = (isnull(properties['tlsSettings']['certificateType']) or tolower(properties['tlsSettings']['certificateType']) =~ 'customercertificate') | project compliant, id = frontDoorId | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed\",\n \"size\": 4,\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"gridSettings\": {\n \"formatters\": [\n {\n \"columnMatch\": \"id\",\n \"formatter\": 0,\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n {\n \"columnMatch\": \"compliant\",\n \"formatter\": 18,\n \"formatOptions\": {\n \"thresholdsOptions\": \"icons\",\n \"thresholdsGrid\": [\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"1\",\n \"representation\": \"success\",\n \"text\": \"Success\"\n },\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"0\",\n \"representation\": \"failed\",\n \"text\": \"Failed\"\n },\n {\n \"operator\": \"Default\",\n \"thresholdValue\": null,\n \"representation\": \"unknown\",\n \"text\": \"Unknown\"\n }\n ]\n }\n }\n ]\n }\n },\n \"name\": \"query9\"\n }\n ]\n },\n \"conditionalVisibility\": {\n \"parameterName\": \"VisibleTab\",\n \"comparison\": \"isEqualTo\",\n \"value\": \"tab1\"\n },\n \"name\": \"tab1\"\n },\n {\n \"type\": 12,\n \"content\": {\n \"version\": \"NotebookGroup/1.0\",\n \"groupType\": \"editable\",\n \"items\": [\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"## Load Balancer\"\n },\n \"name\": \"tab2title\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"Ensure you are using the Standard SKU for your Azure Load Balancers. Check [this link](https://learn.microsoft.com/azure/load-balancer/load-balancer-overview) for further information.\"\n },\n \"name\": \"querytext1\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"resources | where type == 'microsoft.network/loadbalancers' | project id, compliant=(tolower(sku.name) == 'standard') | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed\",\n \"size\": 4,\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"gridSettings\": {\n \"formatters\": [\n {\n \"columnMatch\": \"id\",\n \"formatter\": 0,\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n {\n \"columnMatch\": \"compliant\",\n \"formatter\": 18,\n \"formatOptions\": {\n \"thresholdsOptions\": \"icons\",\n \"thresholdsGrid\": [\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"1\",\n \"representation\": \"success\",\n \"text\": \"Success\"\n },\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"0\",\n \"representation\": \"failed\",\n \"text\": \"Failed\"\n },\n {\n \"operator\": \"Default\",\n \"thresholdValue\": null,\n \"representation\": \"unknown\",\n \"text\": \"Unknown\"\n }\n ]\n }\n }\n ]\n }\n },\n \"name\": \"query1\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"Use Azure NAT Gateway instead of Load Balancer outbound rules for better SNAT scalability. Check [this link](https://learn.microsoft.com/azure/nat-gateway/nat-overview#outbound-connectivity) for further information.\"\n },\n \"name\": \"querytext8\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"resources | where type=='microsoft.network/loadbalancers' | extend countOutRules=array_length(properties.outboundRules) | extend compliant = (countOutRules == 0) | distinct id,compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed\",\n \"size\": 4,\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"gridSettings\": {\n \"formatters\": [\n {\n \"columnMatch\": \"id\",\n \"formatter\": 0,\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n {\n \"columnMatch\": \"compliant\",\n \"formatter\": 18,\n \"formatOptions\": {\n \"thresholdsOptions\": \"icons\",\n \"thresholdsGrid\": [\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"1\",\n \"representation\": \"success\",\n \"text\": \"Success\"\n },\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"0\",\n \"representation\": \"failed\",\n \"text\": \"Failed\"\n },\n {\n \"operator\": \"Default\",\n \"thresholdValue\": null,\n \"representation\": \"unknown\",\n \"text\": \"Unknown\"\n }\n ]\n }\n }\n ]\n }\n },\n \"name\": \"query8\"\n }\n ]\n },\n \"conditionalVisibility\": {\n \"parameterName\": \"VisibleTab\",\n \"comparison\": \"isEqualTo\",\n \"value\": \"tab2\"\n },\n \"name\": \"tab2\"\n }\n ],\n \"$schema\": \"https://github.com/Microsoft/Application-Insights-Workbooks/blob/master/schema/workbook.json\"\n}", "version": "1.0", "sourceId": "[parameters('workbookSourceId')]", "category": "[parameters('workbookType')]" diff --git a/workbooks/azure_storage_checklist.en_counters_workbook.json b/workbooks/azure_storage_checklist.en_counters_workbook.json new file mode 100644 index 000000000..25180504b --- /dev/null +++ b/workbooks/azure_storage_checklist.en_counters_workbook.json @@ -0,0 +1,536 @@ +{ + "version": "Notebook/1.0", + "items": [ + { + "type": 9, + "content": { + "version": "KqlParameterItem/1.0", + "parameters": [ + { + "id": "497a107e-dde8-433e-b263-35ac8e8f7834", + "version": "KqlParameterItem/1.0", + "name": "Subscription", + "type": 6, + "multiSelect": true, + "quote": "'", + "delimiter": ",", + "typeSettings": { + "additionalResourceOptions": [ + "value::all" + ], + "includeAll": true, + "showDefault": false + }, + "timeContext": { + "durationMs": 86400000 + }, + "value": [ + "value::all" + ] + }, + { + "id": "844e4f4e-df51-4e3c-8eaf-0dc78b92c721", + "version": "KqlParameterItem/1.0", + "name": "OnlyFailed", + "label": "Only show failed", + "type": 2, + "typeSettings": { + "additionalResourceOptions": [], + "showDefault": false + }, + "jsonData": "[\r\n { \"value\":true, \"label\":\"True\" },\r\n { \"value\":false, \"label\":\"False\", \"selected\":true }\r\n]" + } + ], + "style": "pills", + "queryType": 0, + "resourceType": "microsoft.operationalinsights/workspaces" + }, + "name": "WorkbookSelectors" + }, + { + "type": 1, + "content": { + "json": "If you set \"Only show failed\" to \"Yes\", the different queries will only show items that have failed their compliance checks.", + "style": "info" + }, + "name": "InfoBox" + }, + { + "type": 9, + "content": { + "version": "KqlParameterItem/1.0", + "crossComponentResources": [ + "value::all" + ], + "parameters": [ + { + "id": "daf05c62-1d5b-4325-b241-d7ee468f23eb", + "version": "KqlParameterItem/1.0", + "name": "Query0Stats", + "type": 1, + "query": "resources | where type == 'microsoft.storage/storageaccounts' | extend compliant = (isnull(properties.minimumTlsVersion) == false and properties.minimumTlsVersion in ('TLS1_2', 'TLS1_3')) | distinct id, compliant| summarize Total = count(), Success = countif(compliant==1), Failed = countif(compliant==0) | extend SuccessPercent = iff(Total==0, 100, 100*toint(Success)/toint(Total)) | extend FullyCompliant = iff(SuccessPercent == 100, 'Yes', 'No') | project Query1Stats=tostring(pack_all())", + "crossComponentResources": [ + "{Subscription}" + ], + "isHiddenWhenLocked": true, + "timeContext": { + "durationMs": 86400000 + }, + "queryType": 1, + "resourceType": "microsoft.resourcegraph/resources" + }, + { + "id": "daf05c62-1d5b-4325-b241-d7ee468f23eb", + "version": "KqlParameterItem/1.0", + "name": "Query0FullyCompliant", + "type": 1, + "query": "{\"version\":\"1.0.0\",\"content\":\"{\\\"value\\\": \\\"{Query0Stats:$.FullyCompliant}\\\"}\",\"transformers\":null}", + "isHiddenWhenLocked": true, + "timeContext": { + "durationMs": 86400000 + }, + "queryType": 8 + }, + { + "id": "daf05c62-1d5b-4325-b241-d7ee468f23eb", + "version": "KqlParameterItem/1.0", + "name": "Query1Stats", + "type": 1, + "query": "resources | where type == 'microsoft.storage/storageaccounts' | extend allowSharedKeyAccess = tostring(properties.allowSharedKeyAccess) | extend compliant = (isnotempty(allowSharedKeyAccess) and allowSharedKeyAccess == 'false') | distinct id, compliant| summarize Total = count(), Success = countif(compliant==1), Failed = countif(compliant==0) | extend SuccessPercent = iff(Total==0, 100, 100*toint(Success)/toint(Total)) | extend FullyCompliant = iff(SuccessPercent == 100, 'Yes', 'No') | project Query1Stats=tostring(pack_all())", + "crossComponentResources": [ + "{Subscription}" + ], + "isHiddenWhenLocked": true, + "timeContext": { + "durationMs": 86400000 + }, + "queryType": 1, + "resourceType": "microsoft.resourcegraph/resources" + }, + { + "id": "daf05c62-1d5b-4325-b241-d7ee468f23eb", + "version": "KqlParameterItem/1.0", + "name": "Query1FullyCompliant", + "type": 1, + "query": "{\"version\":\"1.0.0\",\"content\":\"{\\\"value\\\": \\\"{Query1Stats:$.FullyCompliant}\\\"}\",\"transformers\":null}", + "isHiddenWhenLocked": true, + "timeContext": { + "durationMs": 86400000 + }, + "queryType": 8 + }, + { + "id": "daf05c62-1d5b-4325-b241-d7ee468f23eb", + "version": "KqlParameterItem/1.0", + "name": "Query2Stats", + "type": 1, + "query": "resources | where type == 'microsoft.storage/storageaccounts' | extend compliant = (properties.allowBlobPublicAccess == 'false') | distinct id, compliant| summarize Total = count(), Success = countif(compliant==1), Failed = countif(compliant==0) | extend SuccessPercent = iff(Total==0, 100, 100*toint(Success)/toint(Total)) | extend FullyCompliant = iff(SuccessPercent == 100, 'Yes', 'No') | project Query1Stats=tostring(pack_all())", + "crossComponentResources": [ + "{Subscription}" + ], + "isHiddenWhenLocked": true, + "timeContext": { + "durationMs": 86400000 + }, + "queryType": 1, + "resourceType": "microsoft.resourcegraph/resources" + }, + { + "id": "daf05c62-1d5b-4325-b241-d7ee468f23eb", + "version": "KqlParameterItem/1.0", + "name": "Query2FullyCompliant", + "type": 1, + "query": "{\"version\":\"1.0.0\",\"content\":\"{\\\"value\\\": \\\"{Query2Stats:$.FullyCompliant}\\\"}\",\"transformers\":null}", + "isHiddenWhenLocked": true, + "timeContext": { + "durationMs": 86400000 + }, + "queryType": 8 + }, + { + "id": "daf05c62-1d5b-4325-b241-d7ee468f23eb", + "version": "KqlParameterItem/1.0", + "name": "Tab0Success", + "type": 1, + "isHiddenWhenLocked": true, + "timeContext": { + "durationMs": 86400000 + }, + "criteriaData": [ + { + "criteriaContext": { + "operator": "Default", + "resultValType": "expression", + "resultVal": "{Query0Stats:$.Success}+{Query1Stats:$.Success}+{Query2Stats:$.Success}" + } + } + ] + }, + { + "id": "daf05c62-1d5b-4325-b241-d7ee468f23eb", + "version": "KqlParameterItem/1.0", + "name": "Tab0Total", + "type": 1, + "isHiddenWhenLocked": true, + "timeContext": { + "durationMs": 86400000 + }, + "criteriaData": [ + { + "criteriaContext": { + "operator": "Default", + "resultValType": "expression", + "resultVal": "{Query0Stats:$.Total}+{Query1Stats:$.Total}+{Query2Stats:$.Total}" + } + } + ] + }, + { + "id": "daf05c62-1d5b-4325-b241-d7ee468f23eb", + "version": "KqlParameterItem/1.0", + "name": "Tab0Percent", + "type": 1, + "isHiddenWhenLocked": true, + "timeContext": { + "durationMs": 86400000 + }, + "criteriaData": [ + { + "criteriaContext": { + "operator": "Default", + "resultValType": "expression", + "resultVal": "round(100*{Tab0Success}/{Tab0Total})" + } + } + ] + }, + { + "id": "daf05c62-1d5b-4325-b241-d7ee468f23eb", + "version": "KqlParameterItem/1.0", + "name": "WorkbookTotal", + "type": 1, + "isHiddenWhenLocked": true, + "timeContext": { + "durationMs": 86400000 + }, + "criteriaData": [ + { + "criteriaContext": { + "operator": "Default", + "resultValType": "expression", + "resultVal": "{Query0Stats:$.Total}+{Query1Stats:$.Total}+{Query2Stats:$.Total}" + } + } + ] + }, + { + "id": "daf05c62-1d5b-4325-b241-d7ee468f23eb", + "version": "KqlParameterItem/1.0", + "name": "WorkbookSuccess", + "type": 1, + "isHiddenWhenLocked": true, + "timeContext": { + "durationMs": 86400000 + }, + "criteriaData": [ + { + "criteriaContext": { + "operator": "Default", + "resultValType": "expression", + "resultVal": "{Query0Stats:$.Success}+{Query1Stats:$.Success}+{Query2Stats:$.Success}" + } + } + ] + }, + { + "id": "daf05c62-1d5b-4325-b241-d7ee468f23eb", + "version": "KqlParameterItem/1.0", + "name": "WorkbookPercent", + "type": 1, + "isHiddenWhenLocked": true, + "timeContext": { + "durationMs": 86400000 + }, + "criteriaData": [ + { + "criteriaContext": { + "operator": "Default", + "resultValType": "expression", + "resultVal": "round(100*{WorkbookSuccess}/{WorkbookTotal})" + } + } + ] + } + ], + "style": "pills", + "queryType": 1, + "resourceType": "microsoft.resourcegraph/resources" + }, + "name": "InvisibleParameters" + }, + { + "type": 1, + "content": { + "json": "## Azure Storage Review Checklist\n\n---\n\nThis workbook has been automatically generated out of the checklists in the [Azure Review Checklists repo](https://github.com/Azure/review-checklists). This repo contains best practices and recommendations around generic Landing Zones as well as specific services such as Azure Virtual Desktop, Azure Kubernetes Service or Azure VMware Solution, to name a few. This repository of best practices is curated by Azure engineers, but open to anybody to contribute.\n\nIf you see a problem in the queries that are part of this workbook, please open a Github issue [here](https://github.com/Azure/review-checklists/issues/new)." + }, + "customWidth": "50", + "name": "MarkdownHeader" + }, + { + "type": 3, + "content": { + "version": "KqlItem/1.0", + "query": "{\"version\":\"1.0.0\",\"content\":\"{\\\"WorkbookPercent\\\": \\\"{WorkbookPercent}\\\", \\\"SubTitle\\\": \\\"Percent of successful checks\\\"}\",\"transformers\":null}", + "size": 4, + "queryType": 8, + "visualization": "tiles", + "tileSettings": { + "titleContent": { + "columnMatch": "WorkbookPercent", + "formatter": 4, + "formatOptions": { + "min": 0, + "max": 100, + "palette": "redGreen" + } + }, + "subtitleContent": { + "columnMatch": "SubTitle", + "formatter": 1 + }, + "showBorder": true + } + }, + "customWidth": "50", + "name": "ProgressTile" + }, + { + "type": 11, + "content": { + "version": "LinkItem/1.0", + "style": "tabs", + "links": [ + { + "id": "5e966a67-2168-4f58-b32e-e3e4c1249f78", + "cellValue": "VisibleTab", + "linkTarget": "parameter", + "linkLabel": "Security ({Tab0Success:value}/{Tab0Total:value})", + "subTarget": "tab0", + "preText": "Security", + "style": "primary" + } + ] + }, + "name": "Tabs" + }, + { + "type": 12, + "content": { + "version": "NotebookGroup/1.0", + "groupType": "editable", + "items": [ + { + "type": 1, + "content": { + "json": "## Security" + }, + "name": "tab0title" + }, + { + "type": 1, + "content": { + "json": "Enforce the latest TLS version for a storage account. Check [this link](https://learn.microsoft.com/azure/storage/common/transport-layer-security-configure-minimum-version) for further information." + }, + "name": "querytext0" + }, + { + "type": 3, + "content": { + "version": "KqlItem/1.0", + "query": "resources | where type == 'microsoft.storage/storageaccounts' | extend compliant = (isnull(properties.minimumTlsVersion) == false and properties.minimumTlsVersion in ('TLS1_2', 'TLS1_3')) | distinct id, compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed", + "size": 0, + "queryType": 1, + "resourceType": "microsoft.resourcegraph/resources", + "crossComponentResources": [ + "{Subscription}" + ], + "gridSettings": { + "formatters": [ + { + "columnMatch": "id", + "formatter": 0, + "numberFormat": { + "unit": 0, + "options": { + "style": "decimal" + } + } + }, + { + "columnMatch": "compliant", + "formatter": 18, + "formatOptions": { + "thresholdsOptions": "icons", + "thresholdsGrid": [ + { + "operator": "==", + "thresholdValue": "1", + "representation": "success", + "text": "Success" + }, + { + "operator": "==", + "thresholdValue": "0", + "representation": "failed", + "text": "Failed" + }, + { + "operator": "Default", + "thresholdValue": null, + "representation": "unknown", + "text": "Unknown" + } + ] + } + } + ] + } + }, + "name": "query0" + }, + { + "type": 1, + "content": { + "json": "Consider disabling storage account keys, so that only Microsoft Entra ID access (and user delegation SAS) is supported. Check [this link](https://learn.microsoft.com/rest/api/storageservices/authorize-with-shared-key) for further information." + }, + "name": "querytext1" + }, + { + "type": 3, + "content": { + "version": "KqlItem/1.0", + "query": "resources | where type == 'microsoft.storage/storageaccounts' | extend allowSharedKeyAccess = tostring(properties.allowSharedKeyAccess) | extend compliant = (isnotempty(allowSharedKeyAccess) and allowSharedKeyAccess == 'false') | distinct id, compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed", + "size": 0, + "queryType": 1, + "resourceType": "microsoft.resourcegraph/resources", + "crossComponentResources": [ + "{Subscription}" + ], + "gridSettings": { + "formatters": [ + { + "columnMatch": "id", + "formatter": 0, + "numberFormat": { + "unit": 0, + "options": { + "style": "decimal" + } + } + }, + { + "columnMatch": "compliant", + "formatter": 18, + "formatOptions": { + "thresholdsOptions": "icons", + "thresholdsGrid": [ + { + "operator": "==", + "thresholdValue": "1", + "representation": "success", + "text": "Success" + }, + { + "operator": "==", + "thresholdValue": "0", + "representation": "failed", + "text": "Failed" + }, + { + "operator": "Default", + "thresholdValue": null, + "representation": "unknown", + "text": "Unknown" + } + ] + } + } + ] + } + }, + "name": "query1" + }, + { + "type": 1, + "content": { + "json": "Consider whether public blob anonymous access is needed, or whether it can be disabled for certain storage accounts. Check [this link](https://learn.microsoft.com/azure/storage/blobs/anonymous-read-access-configure?tabs=portal#allow-or-disallow-public-read-access-for-a-storage-account) for further information." + }, + "name": "querytext2" + }, + { + "type": 3, + "content": { + "version": "KqlItem/1.0", + "query": "resources | where type == 'microsoft.storage/storageaccounts' | extend compliant = (properties.allowBlobPublicAccess == 'false') | distinct id, compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed", + "size": 0, + "queryType": 1, + "resourceType": "microsoft.resourcegraph/resources", + "crossComponentResources": [ + "{Subscription}" + ], + "gridSettings": { + "formatters": [ + { + "columnMatch": "id", + "formatter": 0, + "numberFormat": { + "unit": 0, + "options": { + "style": "decimal" + } + } + }, + { + "columnMatch": "compliant", + "formatter": 18, + "formatOptions": { + "thresholdsOptions": "icons", + "thresholdsGrid": [ + { + "operator": "==", + "thresholdValue": "1", + "representation": "success", + "text": "Success" + }, + { + "operator": "==", + "thresholdValue": "0", + "representation": "failed", + "text": "Failed" + }, + { + "operator": "Default", + "thresholdValue": null, + "representation": "unknown", + "text": "Unknown" + } + ] + } + } + ] + } + }, + "name": "query2" + } + ] + }, + "conditionalVisibility": { + "parameterName": "VisibleTab", + "comparison": "isEqualTo", + "value": "tab0" + }, + "name": "tab0" + } + ], + "$schema": "https://github.com/Microsoft/Application-Insights-Workbooks/blob/master/schema/workbook.json" +} \ No newline at end of file diff --git a/workbooks/azure_storage_checklist.en_counters_workbook_template.json b/workbooks/azure_storage_checklist.en_counters_workbook_template.json new file mode 100644 index 000000000..d7617ccf9 --- /dev/null +++ b/workbooks/azure_storage_checklist.en_counters_workbook_template.json @@ -0,0 +1,57 @@ +{ + "$schema": "http://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#", + "contentVersion": "1.0.0.0", + "parameters": { + "workbookDisplayName": { + "type": "string", + "defaultValue": "Azure Storage Review Checklist", + "metadata": { + "description": "The friendly name for the workbook that is used in the Gallery or Saved List. Needs to be unique in the scope of the resource group and source" + } + }, + "workbookType": { + "type": "string", + "defaultValue": "workbook", + "metadata": { + "description": "The gallery that the workbook will be shown under. Supported values include workbook, `tsg`, Azure Monitor, etc." + } + }, + "workbookSourceId": { + "type": "string", + "defaultValue": "Azure Monitor", + "metadata": { + "description": "The id of resource instance to which the workbook will be associated" + } + }, + "workbookId": { + "type": "string", + "defaultValue": "[newGuid()]", + "metadata": { + "description": "The unique guid for this workbook instance" + } + } + }, + "resources": [ + { + "name": "[parameters('workbookId')]", + "type": "Microsoft.Insights/workbooks", + "location": "[resourceGroup().location]", + "kind": "shared", + "apiVersion": "2018-06-17-preview", + "dependsOn": [], + "properties": { + "displayName": "[parameters('workbookDisplayName')]", + "serializedData": "{\n \"version\": \"Notebook/1.0\",\n \"items\": [\n {\n \"type\": 9,\n \"content\": {\n \"version\": \"KqlParameterItem/1.0\",\n \"parameters\": [\n {\n \"id\": \"497a107e-dde8-433e-b263-35ac8e8f7834\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Subscription\",\n \"type\": 6,\n \"multiSelect\": true,\n \"quote\": \"'\",\n \"delimiter\": \",\",\n \"typeSettings\": {\n \"additionalResourceOptions\": [\n \"value::all\"\n ],\n \"includeAll\": true,\n \"showDefault\": false\n },\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"value\": [\n \"value::all\"\n ]\n },\n {\n \"id\": \"844e4f4e-df51-4e3c-8eaf-0dc78b92c721\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"OnlyFailed\",\n \"label\": \"Only show failed\",\n \"type\": 2,\n \"typeSettings\": {\n \"additionalResourceOptions\": [],\n \"showDefault\": false\n },\n \"jsonData\": \"[\\r\\n { \\\"value\\\":true, \\\"label\\\":\\\"True\\\" },\\r\\n { \\\"value\\\":false, \\\"label\\\":\\\"False\\\", \\\"selected\\\":true }\\r\\n]\"\n }\n ],\n \"style\": \"pills\",\n \"queryType\": 0,\n \"resourceType\": \"microsoft.operationalinsights/workspaces\"\n },\n \"name\": \"WorkbookSelectors\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"If you set \\\"Only show failed\\\" to \\\"Yes\\\", the different queries will only show items that have failed their compliance checks.\",\n \"style\": \"info\"\n },\n \"name\": \"InfoBox\"\n },\n {\n \"type\": 9,\n \"content\": {\n \"version\": \"KqlParameterItem/1.0\",\n \"crossComponentResources\": [\n \"value::all\"\n ],\n \"parameters\": [\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query0Stats\",\n \"type\": 1,\n \"query\": \"resources | where type == 'microsoft.storage/storageaccounts' | extend compliant = (isnull(properties.minimumTlsVersion) == false and properties.minimumTlsVersion in ('TLS1_2', 'TLS1_3')) | distinct id, compliant| summarize Total = count(), Success = countif(compliant==1), Failed = countif(compliant==0) | extend SuccessPercent = iff(Total==0, 100, 100*toint(Success)/toint(Total)) | extend FullyCompliant = iff(SuccessPercent == 100, 'Yes', 'No') | project Query1Stats=tostring(pack_all())\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\"\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query0FullyCompliant\",\n \"type\": 1,\n \"query\": \"{\\\"version\\\":\\\"1.0.0\\\",\\\"content\\\":\\\"{\\\\\\\"value\\\\\\\": \\\\\\\"{Query0Stats:$.FullyCompliant}\\\\\\\"}\\\",\\\"transformers\\\":null}\",\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 8\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query1Stats\",\n \"type\": 1,\n \"query\": \"resources | where type == 'microsoft.storage/storageaccounts' | extend allowSharedKeyAccess = tostring(properties.allowSharedKeyAccess) | extend compliant = (isnotempty(allowSharedKeyAccess) and allowSharedKeyAccess == 'false') | distinct id, compliant| summarize Total = count(), Success = countif(compliant==1), Failed = countif(compliant==0) | extend SuccessPercent = iff(Total==0, 100, 100*toint(Success)/toint(Total)) | extend FullyCompliant = iff(SuccessPercent == 100, 'Yes', 'No') | project Query1Stats=tostring(pack_all())\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\"\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query1FullyCompliant\",\n \"type\": 1,\n \"query\": \"{\\\"version\\\":\\\"1.0.0\\\",\\\"content\\\":\\\"{\\\\\\\"value\\\\\\\": \\\\\\\"{Query1Stats:$.FullyCompliant}\\\\\\\"}\\\",\\\"transformers\\\":null}\",\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 8\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query2Stats\",\n \"type\": 1,\n \"query\": \"resources | where type == 'microsoft.storage/storageaccounts' | extend compliant = (properties.allowBlobPublicAccess == 'false') | distinct id, compliant| summarize Total = count(), Success = countif(compliant==1), Failed = countif(compliant==0) | extend SuccessPercent = iff(Total==0, 100, 100*toint(Success)/toint(Total)) | extend FullyCompliant = iff(SuccessPercent == 100, 'Yes', 'No') | project Query1Stats=tostring(pack_all())\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\"\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Query2FullyCompliant\",\n \"type\": 1,\n \"query\": \"{\\\"version\\\":\\\"1.0.0\\\",\\\"content\\\":\\\"{\\\\\\\"value\\\\\\\": \\\\\\\"{Query2Stats:$.FullyCompliant}\\\\\\\"}\\\",\\\"transformers\\\":null}\",\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"queryType\": 8\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Tab0Success\",\n \"type\": 1,\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"criteriaData\": [\n {\n \"criteriaContext\": {\n \"operator\": \"Default\",\n \"resultValType\": \"expression\",\n \"resultVal\": \"{Query0Stats:$.Success}+{Query1Stats:$.Success}+{Query2Stats:$.Success}\"\n }\n }\n ]\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Tab0Total\",\n \"type\": 1,\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"criteriaData\": [\n {\n \"criteriaContext\": {\n \"operator\": \"Default\",\n \"resultValType\": \"expression\",\n \"resultVal\": \"{Query0Stats:$.Total}+{Query1Stats:$.Total}+{Query2Stats:$.Total}\"\n }\n }\n ]\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Tab0Percent\",\n \"type\": 1,\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"criteriaData\": [\n {\n \"criteriaContext\": {\n \"operator\": \"Default\",\n \"resultValType\": \"expression\",\n \"resultVal\": \"round(100*{Tab0Success}/{Tab0Total})\"\n }\n }\n ]\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"WorkbookTotal\",\n \"type\": 1,\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"criteriaData\": [\n {\n \"criteriaContext\": {\n \"operator\": \"Default\",\n \"resultValType\": \"expression\",\n \"resultVal\": \"{Query0Stats:$.Total}+{Query1Stats:$.Total}+{Query2Stats:$.Total}\"\n }\n }\n ]\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"WorkbookSuccess\",\n \"type\": 1,\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"criteriaData\": [\n {\n \"criteriaContext\": {\n \"operator\": \"Default\",\n \"resultValType\": \"expression\",\n \"resultVal\": \"{Query0Stats:$.Success}+{Query1Stats:$.Success}+{Query2Stats:$.Success}\"\n }\n }\n ]\n },\n {\n \"id\": \"daf05c62-1d5b-4325-b241-d7ee468f23eb\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"WorkbookPercent\",\n \"type\": 1,\n \"isHiddenWhenLocked\": true,\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"criteriaData\": [\n {\n \"criteriaContext\": {\n \"operator\": \"Default\",\n \"resultValType\": \"expression\",\n \"resultVal\": \"round(100*{WorkbookSuccess}/{WorkbookTotal})\"\n }\n }\n ]\n }\n ],\n \"style\": \"pills\",\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\"\n },\n \"name\": \"InvisibleParameters\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"## Azure Storage Review Checklist\\n\\n---\\n\\nThis workbook has been automatically generated out of the checklists in the [Azure Review Checklists repo](https://github.com/Azure/review-checklists). This repo contains best practices and recommendations around generic Landing Zones as well as specific services such as Azure Virtual Desktop, Azure Kubernetes Service or Azure VMware Solution, to name a few. This repository of best practices is curated by Azure engineers, but open to anybody to contribute.\\n\\nIf you see a problem in the queries that are part of this workbook, please open a Github issue [here](https://github.com/Azure/review-checklists/issues/new).\"\n },\n \"customWidth\": \"50\",\n \"name\": \"MarkdownHeader\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"{\\\"version\\\":\\\"1.0.0\\\",\\\"content\\\":\\\"{\\\\\\\"WorkbookPercent\\\\\\\": \\\\\\\"{WorkbookPercent}\\\\\\\", \\\\\\\"SubTitle\\\\\\\": \\\\\\\"Percent of successful checks\\\\\\\"}\\\",\\\"transformers\\\":null}\",\n \"size\": 4,\n \"queryType\": 8,\n \"visualization\": \"tiles\",\n \"tileSettings\": {\n \"titleContent\": {\n \"columnMatch\": \"WorkbookPercent\",\n \"formatter\": 4,\n \"formatOptions\": {\n \"min\": 0,\n \"max\": 100,\n \"palette\": \"redGreen\"\n }\n },\n \"subtitleContent\": {\n \"columnMatch\": \"SubTitle\",\n \"formatter\": 1\n },\n \"showBorder\": true\n }\n },\n \"customWidth\": \"50\",\n \"name\": \"ProgressTile\"\n },\n {\n \"type\": 11,\n \"content\": {\n \"version\": \"LinkItem/1.0\",\n \"style\": \"tabs\",\n \"links\": [\n {\n \"id\": \"5e966a67-2168-4f58-b32e-e3e4c1249f78\",\n \"cellValue\": \"VisibleTab\",\n \"linkTarget\": \"parameter\",\n \"linkLabel\": \"Security ({Tab0Success:value}/{Tab0Total:value})\",\n \"subTarget\": \"tab0\",\n \"preText\": \"Security\",\n \"style\": \"primary\"\n }\n ]\n },\n \"name\": \"Tabs\"\n },\n {\n \"type\": 12,\n \"content\": {\n \"version\": \"NotebookGroup/1.0\",\n \"groupType\": \"editable\",\n \"items\": [\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"## Security\"\n },\n \"name\": \"tab0title\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"Enforce the latest TLS version for a storage account. Check [this link](https://learn.microsoft.com/azure/storage/common/transport-layer-security-configure-minimum-version) for further information.\"\n },\n \"name\": \"querytext0\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"resources | where type == 'microsoft.storage/storageaccounts' | extend compliant = (isnull(properties.minimumTlsVersion) == false and properties.minimumTlsVersion in ('TLS1_2', 'TLS1_3')) | distinct id, compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed\",\n \"size\": 0,\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"gridSettings\": {\n \"formatters\": [\n {\n \"columnMatch\": \"id\",\n \"formatter\": 0,\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n {\n \"columnMatch\": \"compliant\",\n \"formatter\": 18,\n \"formatOptions\": {\n \"thresholdsOptions\": \"icons\",\n \"thresholdsGrid\": [\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"1\",\n \"representation\": \"success\",\n \"text\": \"Success\"\n },\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"0\",\n \"representation\": \"failed\",\n \"text\": \"Failed\"\n },\n {\n \"operator\": \"Default\",\n \"thresholdValue\": null,\n \"representation\": \"unknown\",\n \"text\": \"Unknown\"\n }\n ]\n }\n }\n ]\n }\n },\n \"name\": \"query0\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"Consider disabling storage account keys, so that only Microsoft Entra ID access (and user delegation SAS) is supported. Check [this link](https://learn.microsoft.com/rest/api/storageservices/authorize-with-shared-key) for further information.\"\n },\n \"name\": \"querytext1\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"resources | where type == 'microsoft.storage/storageaccounts' | extend allowSharedKeyAccess = tostring(properties.allowSharedKeyAccess) | extend compliant = (isnotempty(allowSharedKeyAccess) and allowSharedKeyAccess == 'false') | distinct id, compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed\",\n \"size\": 0,\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"gridSettings\": {\n \"formatters\": [\n {\n \"columnMatch\": \"id\",\n \"formatter\": 0,\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n {\n \"columnMatch\": \"compliant\",\n \"formatter\": 18,\n \"formatOptions\": {\n \"thresholdsOptions\": \"icons\",\n \"thresholdsGrid\": [\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"1\",\n \"representation\": \"success\",\n \"text\": \"Success\"\n },\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"0\",\n \"representation\": \"failed\",\n \"text\": \"Failed\"\n },\n {\n \"operator\": \"Default\",\n \"thresholdValue\": null,\n \"representation\": \"unknown\",\n \"text\": \"Unknown\"\n }\n ]\n }\n }\n ]\n }\n },\n \"name\": \"query1\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"Consider whether public blob anonymous access is needed, or whether it can be disabled for certain storage accounts. Check [this link](https://learn.microsoft.com/azure/storage/blobs/anonymous-read-access-configure?tabs=portal#allow-or-disallow-public-read-access-for-a-storage-account) for further information.\"\n },\n \"name\": \"querytext2\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"resources | where type == 'microsoft.storage/storageaccounts' | extend compliant = (properties.allowBlobPublicAccess == 'false') | distinct id, compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed\",\n \"size\": 0,\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"gridSettings\": {\n \"formatters\": [\n {\n \"columnMatch\": \"id\",\n \"formatter\": 0,\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n {\n \"columnMatch\": \"compliant\",\n \"formatter\": 18,\n \"formatOptions\": {\n \"thresholdsOptions\": \"icons\",\n \"thresholdsGrid\": [\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"1\",\n \"representation\": \"success\",\n \"text\": \"Success\"\n },\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"0\",\n \"representation\": \"failed\",\n \"text\": \"Failed\"\n },\n {\n \"operator\": \"Default\",\n \"thresholdValue\": null,\n \"representation\": \"unknown\",\n \"text\": \"Unknown\"\n }\n ]\n }\n }\n ]\n }\n },\n \"name\": \"query2\"\n }\n ]\n },\n \"conditionalVisibility\": {\n \"parameterName\": \"VisibleTab\",\n \"comparison\": \"isEqualTo\",\n \"value\": \"tab0\"\n },\n \"name\": \"tab0\"\n }\n ],\n \"$schema\": \"https://github.com/Microsoft/Application-Insights-Workbooks/blob/master/schema/workbook.json\"\n}", + "version": "1.0", + "sourceId": "[parameters('workbookSourceId')]", + "category": "[parameters('workbookType')]" + } + } + ], + "outputs": { + "workbookId": { + "type": "string", + "value": "[resourceId( 'Microsoft.Insights/workbooks', parameters('workbookId'))]" + } + } +} \ No newline at end of file diff --git a/workbooks/azure_storage_checklist.en_workbook.json b/workbooks/azure_storage_checklist.en_workbook.json new file mode 100644 index 000000000..301d081aa --- /dev/null +++ b/workbooks/azure_storage_checklist.en_workbook.json @@ -0,0 +1,295 @@ +{ + "version": "Notebook/1.0", + "items": [ + { + "type": 9, + "content": { + "version": "KqlParameterItem/1.0", + "parameters": [ + { + "id": "497a107e-dde8-433e-b263-35ac8e8f7834", + "version": "KqlParameterItem/1.0", + "name": "Subscription", + "type": 6, + "multiSelect": true, + "quote": "'", + "delimiter": ",", + "typeSettings": { + "additionalResourceOptions": [ + "value::all" + ], + "includeAll": true, + "showDefault": false + }, + "timeContext": { + "durationMs": 86400000 + }, + "value": [ + "value::all" + ] + }, + { + "id": "844e4f4e-df51-4e3c-8eaf-0dc78b92c721", + "version": "KqlParameterItem/1.0", + "name": "OnlyFailed", + "label": "Only show failed", + "type": 2, + "typeSettings": { + "additionalResourceOptions": [], + "showDefault": false + }, + "jsonData": "[\r\n { \"value\":true, \"label\":\"True\" },\r\n { \"value\":false, \"label\":\"False\", \"selected\":true }\r\n]" + } + ], + "style": "pills", + "queryType": 0, + "resourceType": "microsoft.operationalinsights/workspaces" + }, + "name": "WorkbookSelectors" + }, + { + "type": 1, + "content": { + "json": "If you set \"Only show failed\" to \"Yes\", the different queries will only show items that have failed their compliance checks.", + "style": "info" + }, + "name": "InfoBox" + }, + { + "type": 1, + "content": { + "json": "## Azure Storage Review Checklist\n\n---\n\nThis workbook has been automatically generated out of the checklists in the [Azure Review Checklists repo](https://github.com/Azure/review-checklists). This repo contains best practices and recommendations around generic Landing Zones as well as specific services such as Azure Virtual Desktop, Azure Kubernetes Service or Azure VMware Solution, to name a few. This repository of best practices is curated by Azure engineers, but open to anybody to contribute.\n\nIf you see a problem in the queries that are part of this workbook, please open a Github issue [here](https://github.com/Azure/review-checklists/issues/new)." + }, + "customWidth": "100", + "name": "MarkdownHeader" + }, + { + "type": 11, + "content": { + "version": "LinkItem/1.0", + "style": "tabs", + "links": [ + { + "id": "96368cbd-901b-4d5b-99ae-0aff2aa05fc0", + "cellValue": "VisibleTab", + "linkTarget": "parameter", + "linkLabel": "Security", + "subTarget": "tab0", + "preText": "Security", + "style": "primary" + } + ] + }, + "name": "Tabs" + }, + { + "type": 12, + "content": { + "version": "NotebookGroup/1.0", + "groupType": "editable", + "items": [ + { + "type": 1, + "content": { + "json": "## Security" + }, + "name": "tab0title" + }, + { + "type": 1, + "content": { + "json": "Enforce the latest TLS version for a storage account. Check [this link](https://learn.microsoft.com/azure/storage/common/transport-layer-security-configure-minimum-version) for further information." + }, + "name": "querytext0" + }, + { + "type": 3, + "content": { + "version": "KqlItem/1.0", + "query": "resources | where type == 'microsoft.storage/storageaccounts' | extend compliant = (isnull(properties.minimumTlsVersion) == false and properties.minimumTlsVersion in ('TLS1_2', 'TLS1_3')) | distinct id, compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed", + "size": 0, + "queryType": 1, + "resourceType": "microsoft.resourcegraph/resources", + "crossComponentResources": [ + "{Subscription}" + ], + "gridSettings": { + "formatters": [ + { + "columnMatch": "id", + "formatter": 0, + "numberFormat": { + "unit": 0, + "options": { + "style": "decimal" + } + } + }, + { + "columnMatch": "compliant", + "formatter": 18, + "formatOptions": { + "thresholdsOptions": "icons", + "thresholdsGrid": [ + { + "operator": "==", + "thresholdValue": "1", + "representation": "success", + "text": "Success" + }, + { + "operator": "==", + "thresholdValue": "0", + "representation": "failed", + "text": "Failed" + }, + { + "operator": "Default", + "thresholdValue": null, + "representation": "unknown", + "text": "Unknown" + } + ] + } + } + ] + } + }, + "name": "query0" + }, + { + "type": 1, + "content": { + "json": "Consider disabling storage account keys, so that only Microsoft Entra ID access (and user delegation SAS) is supported. Check [this link](https://learn.microsoft.com/rest/api/storageservices/authorize-with-shared-key) for further information." + }, + "name": "querytext1" + }, + { + "type": 3, + "content": { + "version": "KqlItem/1.0", + "query": "resources | where type == 'microsoft.storage/storageaccounts' | extend allowSharedKeyAccess = tostring(properties.allowSharedKeyAccess) | extend compliant = (isnotempty(allowSharedKeyAccess) and allowSharedKeyAccess == 'false') | distinct id, compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed", + "size": 0, + "queryType": 1, + "resourceType": "microsoft.resourcegraph/resources", + "crossComponentResources": [ + "{Subscription}" + ], + "gridSettings": { + "formatters": [ + { + "columnMatch": "id", + "formatter": 0, + "numberFormat": { + "unit": 0, + "options": { + "style": "decimal" + } + } + }, + { + "columnMatch": "compliant", + "formatter": 18, + "formatOptions": { + "thresholdsOptions": "icons", + "thresholdsGrid": [ + { + "operator": "==", + "thresholdValue": "1", + "representation": "success", + "text": "Success" + }, + { + "operator": "==", + "thresholdValue": "0", + "representation": "failed", + "text": "Failed" + }, + { + "operator": "Default", + "thresholdValue": null, + "representation": "unknown", + "text": "Unknown" + } + ] + } + } + ] + } + }, + "name": "query1" + }, + { + "type": 1, + "content": { + "json": "Consider whether public blob anonymous access is needed, or whether it can be disabled for certain storage accounts. Check [this link](https://learn.microsoft.com/azure/storage/blobs/anonymous-read-access-configure?tabs=portal#allow-or-disallow-public-read-access-for-a-storage-account) for further information." + }, + "name": "querytext2" + }, + { + "type": 3, + "content": { + "version": "KqlItem/1.0", + "query": "resources | where type == 'microsoft.storage/storageaccounts' | extend compliant = (properties.allowBlobPublicAccess == 'false') | distinct id, compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed", + "size": 0, + "queryType": 1, + "resourceType": "microsoft.resourcegraph/resources", + "crossComponentResources": [ + "{Subscription}" + ], + "gridSettings": { + "formatters": [ + { + "columnMatch": "id", + "formatter": 0, + "numberFormat": { + "unit": 0, + "options": { + "style": "decimal" + } + } + }, + { + "columnMatch": "compliant", + "formatter": 18, + "formatOptions": { + "thresholdsOptions": "icons", + "thresholdsGrid": [ + { + "operator": "==", + "thresholdValue": "1", + "representation": "success", + "text": "Success" + }, + { + "operator": "==", + "thresholdValue": "0", + "representation": "failed", + "text": "Failed" + }, + { + "operator": "Default", + "thresholdValue": null, + "representation": "unknown", + "text": "Unknown" + } + ] + } + } + ] + } + }, + "name": "query2" + } + ] + }, + "conditionalVisibility": { + "parameterName": "VisibleTab", + "comparison": "isEqualTo", + "value": "tab0" + }, + "name": "tab0" + } + ], + "$schema": "https://github.com/Microsoft/Application-Insights-Workbooks/blob/master/schema/workbook.json" +} \ No newline at end of file diff --git a/workbooks/azure_storage_checklist.en_workbook_template.json b/workbooks/azure_storage_checklist.en_workbook_template.json new file mode 100644 index 000000000..181bff32d --- /dev/null +++ b/workbooks/azure_storage_checklist.en_workbook_template.json @@ -0,0 +1,57 @@ +{ + "$schema": "http://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#", + "contentVersion": "1.0.0.0", + "parameters": { + "workbookDisplayName": { + "type": "string", + "defaultValue": "Azure Storage Review Checklist", + "metadata": { + "description": "The friendly name for the workbook that is used in the Gallery or Saved List. Needs to be unique in the scope of the resource group and source" + } + }, + "workbookType": { + "type": "string", + "defaultValue": "workbook", + "metadata": { + "description": "The gallery that the workbook will be shown under. Supported values include workbook, `tsg`, Azure Monitor, etc." + } + }, + "workbookSourceId": { + "type": "string", + "defaultValue": "Azure Monitor", + "metadata": { + "description": "The id of resource instance to which the workbook will be associated" + } + }, + "workbookId": { + "type": "string", + "defaultValue": "[newGuid()]", + "metadata": { + "description": "The unique guid for this workbook instance" + } + } + }, + "resources": [ + { + "name": "[parameters('workbookId')]", + "type": "Microsoft.Insights/workbooks", + "location": "[resourceGroup().location]", + "kind": "shared", + "apiVersion": "2018-06-17-preview", + "dependsOn": [], + "properties": { + "displayName": "[parameters('workbookDisplayName')]", + "serializedData": "{\n \"version\": \"Notebook/1.0\",\n \"items\": [\n {\n \"type\": 9,\n \"content\": {\n \"version\": \"KqlParameterItem/1.0\",\n \"parameters\": [\n {\n \"id\": \"497a107e-dde8-433e-b263-35ac8e8f7834\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"Subscription\",\n \"type\": 6,\n \"multiSelect\": true,\n \"quote\": \"'\",\n \"delimiter\": \",\",\n \"typeSettings\": {\n \"additionalResourceOptions\": [\n \"value::all\"\n ],\n \"includeAll\": true,\n \"showDefault\": false\n },\n \"timeContext\": {\n \"durationMs\": 86400000\n },\n \"value\": [\n \"value::all\"\n ]\n },\n {\n \"id\": \"844e4f4e-df51-4e3c-8eaf-0dc78b92c721\",\n \"version\": \"KqlParameterItem/1.0\",\n \"name\": \"OnlyFailed\",\n \"label\": \"Only show failed\",\n \"type\": 2,\n \"typeSettings\": {\n \"additionalResourceOptions\": [],\n \"showDefault\": false\n },\n \"jsonData\": \"[\\r\\n { \\\"value\\\":true, \\\"label\\\":\\\"True\\\" },\\r\\n { \\\"value\\\":false, \\\"label\\\":\\\"False\\\", \\\"selected\\\":true }\\r\\n]\"\n }\n ],\n \"style\": \"pills\",\n \"queryType\": 0,\n \"resourceType\": \"microsoft.operationalinsights/workspaces\"\n },\n \"name\": \"WorkbookSelectors\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"If you set \\\"Only show failed\\\" to \\\"Yes\\\", the different queries will only show items that have failed their compliance checks.\",\n \"style\": \"info\"\n },\n \"name\": \"InfoBox\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"## Azure Storage Review Checklist\\n\\n---\\n\\nThis workbook has been automatically generated out of the checklists in the [Azure Review Checklists repo](https://github.com/Azure/review-checklists). This repo contains best practices and recommendations around generic Landing Zones as well as specific services such as Azure Virtual Desktop, Azure Kubernetes Service or Azure VMware Solution, to name a few. This repository of best practices is curated by Azure engineers, but open to anybody to contribute.\\n\\nIf you see a problem in the queries that are part of this workbook, please open a Github issue [here](https://github.com/Azure/review-checklists/issues/new).\"\n },\n \"customWidth\": \"100\",\n \"name\": \"MarkdownHeader\"\n },\n {\n \"type\": 11,\n \"content\": {\n \"version\": \"LinkItem/1.0\",\n \"style\": \"tabs\",\n \"links\": [\n {\n \"id\": \"96368cbd-901b-4d5b-99ae-0aff2aa05fc0\",\n \"cellValue\": \"VisibleTab\",\n \"linkTarget\": \"parameter\",\n \"linkLabel\": \"Security\",\n \"subTarget\": \"tab0\",\n \"preText\": \"Security\",\n \"style\": \"primary\"\n }\n ]\n },\n \"name\": \"Tabs\"\n },\n {\n \"type\": 12,\n \"content\": {\n \"version\": \"NotebookGroup/1.0\",\n \"groupType\": \"editable\",\n \"items\": [\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"## Security\"\n },\n \"name\": \"tab0title\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"Enforce the latest TLS version for a storage account. Check [this link](https://learn.microsoft.com/azure/storage/common/transport-layer-security-configure-minimum-version) for further information.\"\n },\n \"name\": \"querytext0\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"resources | where type == 'microsoft.storage/storageaccounts' | extend compliant = (isnull(properties.minimumTlsVersion) == false and properties.minimumTlsVersion in ('TLS1_2', 'TLS1_3')) | distinct id, compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed\",\n \"size\": 0,\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"gridSettings\": {\n \"formatters\": [\n {\n \"columnMatch\": \"id\",\n \"formatter\": 0,\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n {\n \"columnMatch\": \"compliant\",\n \"formatter\": 18,\n \"formatOptions\": {\n \"thresholdsOptions\": \"icons\",\n \"thresholdsGrid\": [\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"1\",\n \"representation\": \"success\",\n \"text\": \"Success\"\n },\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"0\",\n \"representation\": \"failed\",\n \"text\": \"Failed\"\n },\n {\n \"operator\": \"Default\",\n \"thresholdValue\": null,\n \"representation\": \"unknown\",\n \"text\": \"Unknown\"\n }\n ]\n }\n }\n ]\n }\n },\n \"name\": \"query0\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"Consider disabling storage account keys, so that only Microsoft Entra ID access (and user delegation SAS) is supported. Check [this link](https://learn.microsoft.com/rest/api/storageservices/authorize-with-shared-key) for further information.\"\n },\n \"name\": \"querytext1\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"resources | where type == 'microsoft.storage/storageaccounts' | extend allowSharedKeyAccess = tostring(properties.allowSharedKeyAccess) | extend compliant = (isnotempty(allowSharedKeyAccess) and allowSharedKeyAccess == 'false') | distinct id, compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed\",\n \"size\": 0,\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"gridSettings\": {\n \"formatters\": [\n {\n \"columnMatch\": \"id\",\n \"formatter\": 0,\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n {\n \"columnMatch\": \"compliant\",\n \"formatter\": 18,\n \"formatOptions\": {\n \"thresholdsOptions\": \"icons\",\n \"thresholdsGrid\": [\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"1\",\n \"representation\": \"success\",\n \"text\": \"Success\"\n },\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"0\",\n \"representation\": \"failed\",\n \"text\": \"Failed\"\n },\n {\n \"operator\": \"Default\",\n \"thresholdValue\": null,\n \"representation\": \"unknown\",\n \"text\": \"Unknown\"\n }\n ]\n }\n }\n ]\n }\n },\n \"name\": \"query1\"\n },\n {\n \"type\": 1,\n \"content\": {\n \"json\": \"Consider whether public blob anonymous access is needed, or whether it can be disabled for certain storage accounts. Check [this link](https://learn.microsoft.com/azure/storage/blobs/anonymous-read-access-configure?tabs=portal#allow-or-disallow-public-read-access-for-a-storage-account) for further information.\"\n },\n \"name\": \"querytext2\"\n },\n {\n \"type\": 3,\n \"content\": {\n \"version\": \"KqlItem/1.0\",\n \"query\": \"resources | where type == 'microsoft.storage/storageaccounts' | extend compliant = (properties.allowBlobPublicAccess == 'false') | distinct id, compliant | extend onlyFailed = {OnlyFailed:label} | where compliant == 0 or not (onlyFailed == 1) | project-away onlyFailed\",\n \"size\": 0,\n \"queryType\": 1,\n \"resourceType\": \"microsoft.resourcegraph/resources\",\n \"crossComponentResources\": [\n \"{Subscription}\"\n ],\n \"gridSettings\": {\n \"formatters\": [\n {\n \"columnMatch\": \"id\",\n \"formatter\": 0,\n \"numberFormat\": {\n \"unit\": 0,\n \"options\": {\n \"style\": \"decimal\"\n }\n }\n },\n {\n \"columnMatch\": \"compliant\",\n \"formatter\": 18,\n \"formatOptions\": {\n \"thresholdsOptions\": \"icons\",\n \"thresholdsGrid\": [\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"1\",\n \"representation\": \"success\",\n \"text\": \"Success\"\n },\n {\n \"operator\": \"==\",\n \"thresholdValue\": \"0\",\n \"representation\": \"failed\",\n \"text\": \"Failed\"\n },\n {\n \"operator\": \"Default\",\n \"thresholdValue\": null,\n \"representation\": \"unknown\",\n \"text\": \"Unknown\"\n }\n ]\n }\n }\n ]\n }\n },\n \"name\": \"query2\"\n }\n ]\n },\n \"conditionalVisibility\": {\n \"parameterName\": \"VisibleTab\",\n \"comparison\": \"isEqualTo\",\n \"value\": \"tab0\"\n },\n \"name\": \"tab0\"\n }\n ],\n \"$schema\": \"https://github.com/Microsoft/Application-Insights-Workbooks/blob/master/schema/workbook.json\"\n}", + "version": "1.0", + "sourceId": "[parameters('workbookSourceId')]", + "category": "[parameters('workbookType')]" + } + } + ], + "outputs": { + "workbookId": { + "type": "string", + "value": "[resourceId( 'Microsoft.Insights/workbooks', parameters('workbookId'))]" + } + } +} \ No newline at end of file